Skip to content

Commit f6e11c7

Browse files
committed
Add resolveNode param which allows data to be used for edges, not just nodes
1 parent a09e906 commit f6e11c7

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

src/connection/__tests__/arrayconnection.js

+47
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,53 @@ describe('connectionFromArraySlice()', () => {
868868
}
869869
});
870870
});
871+
872+
it('can populate edges and resolve nodes from the array', () => {
873+
const letterEdgeData = [
874+
{
875+
letter: 'A',
876+
isFirst: true,
877+
},
878+
{
879+
letter: 'B',
880+
isFirst: false,
881+
}
882+
];
883+
884+
const c = connectionFromArraySlice(
885+
letterEdgeData,
886+
{
887+
first: 2,
888+
},
889+
{
890+
sliceStart: 0,
891+
arrayLength: 2,
892+
resolveNode: ({ letter }) => letter,
893+
}
894+
);
895+
return expect(c).to.deep.equal({
896+
edges: [
897+
{
898+
isFirst: true,
899+
node: 'A',
900+
letter: 'A',
901+
cursor: 'YXJyYXljb25uZWN0aW9uOjA=',
902+
},
903+
{
904+
isFirst: false,
905+
node: 'B',
906+
letter: 'B',
907+
cursor: 'YXJyYXljb25uZWN0aW9uOjE=',
908+
},
909+
],
910+
pageInfo: {
911+
startCursor: 'YXJyYXljb25uZWN0aW9uOjA=',
912+
endCursor: 'YXJyYXljb25uZWN0aW9uOjE=',
913+
hasPreviousPage: false,
914+
hasNextPage: false,
915+
}
916+
});
917+
});
871918
});
872919

873920
describe('connectionFromPromisedArraySlice()', () => {

src/connection/arrayconnection.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
type ArraySliceMetaInfo = {
2222
sliceStart: number;
2323
arrayLength: number;
24+
resolveNode?: (edge: any) => {};
2425
};
2526

2627
/**
@@ -68,7 +69,7 @@ export function connectionFromArraySlice<T>(
6869
meta: ArraySliceMetaInfo
6970
): Connection<T> {
7071
const { after, before, first, last } = args;
71-
const { sliceStart, arrayLength } = meta;
72+
const { sliceStart, arrayLength, resolveNode } = meta;
7273
const sliceEnd = sliceStart + arraySlice.length;
7374
const beforeOffset = getOffsetWithDefault(before, arrayLength);
7475
const afterOffset = getOffsetWithDefault(after, -1);
@@ -110,10 +111,17 @@ export function connectionFromArraySlice<T>(
110111
arraySlice.length - (sliceEnd - endOffset)
111112
);
112113

113-
const edges = slice.map((value, index) => ({
114-
cursor: offsetToCursor(startOffset + index),
115-
node: value,
116-
}));
114+
const edges = slice.map((value, index) => {
115+
const newEdge = {
116+
cursor: offsetToCursor(startOffset + index),
117+
node: resolveNode ? resolveNode(value) : value,
118+
};
119+
120+
if (resolveNode) {
121+
return { ...newEdge, ...value };
122+
}
123+
return newEdge;
124+
});
117125

118126
const firstEdge = edges[0];
119127
const lastEdge = edges[edges.length - 1];

0 commit comments

Comments
 (0)