From ded4219509a21c62ba9721fb0d5cc49cf544fb3c Mon Sep 17 00:00:00 2001 From: Matthew Zikherman Date: Wed, 17 Jan 2018 14:43:26 -0500 Subject: [PATCH] Add resolveNode param which allows data to be used for edges, not just nodes --- src/connection/__tests__/arrayconnection.js | 47 +++++++++++++++++++++ src/connection/arrayconnection.js | 17 +++++--- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/connection/__tests__/arrayconnection.js b/src/connection/__tests__/arrayconnection.js index edd108f..dc6c67d 100644 --- a/src/connection/__tests__/arrayconnection.js +++ b/src/connection/__tests__/arrayconnection.js @@ -868,6 +868,53 @@ describe('connectionFromArraySlice()', () => { } }); }); + + it('can populate edges and resolve nodes from the array', () => { + const letterEdgeData = [ + { + letter: 'A', + isFirst: true, + }, + { + letter: 'B', + isFirst: false, + } + ]; + + const c = connectionFromArraySlice( + letterEdgeData, + { + first: 2, + }, + { + sliceStart: 0, + arrayLength: 2, + resolveNode: ({ letter }) => letter, + } + ); + return expect(c).to.deep.equal({ + edges: [ + { + isFirst: true, + node: 'A', + letter: 'A', + cursor: 'YXJyYXljb25uZWN0aW9uOjA=', + }, + { + isFirst: false, + node: 'B', + letter: 'B', + cursor: 'YXJyYXljb25uZWN0aW9uOjE=', + }, + ], + pageInfo: { + startCursor: 'YXJyYXljb25uZWN0aW9uOjA=', + endCursor: 'YXJyYXljb25uZWN0aW9uOjE=', + hasPreviousPage: false, + hasNextPage: false, + } + }); + }); }); describe('connectionFromPromisedArraySlice()', () => { diff --git a/src/connection/arrayconnection.js b/src/connection/arrayconnection.js index 2ec1056..912eb34 100644 --- a/src/connection/arrayconnection.js +++ b/src/connection/arrayconnection.js @@ -68,7 +68,7 @@ export function connectionFromArraySlice( meta: ArraySliceMetaInfo ): Connection { const { after, before, first, last } = args; - const { sliceStart, arrayLength } = meta; + const { sliceStart, arrayLength, resolveNode } = meta; const sliceEnd = sliceStart + arraySlice.length; const beforeOffset = getOffsetWithDefault(before, arrayLength); const afterOffset = getOffsetWithDefault(after, -1); @@ -110,10 +110,17 @@ export function connectionFromArraySlice( arraySlice.length - (sliceEnd - endOffset) ); - const edges = slice.map((value, index) => ({ - cursor: offsetToCursor(startOffset + index), - node: value, - })); + const edges = slice.map((value, index) => { + const newEdge = { + cursor: offsetToCursor(startOffset + index), + node: resolveNode ? resolveNode(value) : value, + }; + + if (resolveNode) { + return { ...newEdge, ...value }; + } + return newEdge; + }); const firstEdge = edges[0]; const lastEdge = edges[edges.length - 1];