Skip to content

Commit fa978fb

Browse files
arrayConnection: return all elements if cursors are on the outside (#348)
1 parent c5670c6 commit fa978fb

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

src/connection/__tests__/arrayConnection-test.js

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { describe, it } from 'mocha';
22
import { expect } from 'chai';
33

44
import {
5+
offsetToCursor,
56
connectionFromArray,
67
connectionFromArraySlice,
78
connectionFromPromisedArray,
@@ -289,19 +290,29 @@ describe('connectionFromArray()', () => {
289290
});
290291

291292
it('returns all elements if cursors are on the outside', () => {
292-
const c = connectionFromArray(arrayABCDE, {
293-
before: 'YXJyYXljb25uZWN0aW9uOjY=' /* offsetToCursor(6) */,
294-
after: 'YXJyYXljb25uZWN0aW9uOi0x' /* offsetToCursor(-1) */,
295-
});
296-
expect(c).to.deep.equal({
293+
const allEdges = {
297294
edges: [edgeA, edgeB, edgeC, edgeD, edgeE],
298295
pageInfo: {
299296
startCursor: cursorA,
300297
endCursor: cursorE,
301298
hasPreviousPage: false,
302299
hasNextPage: false,
303300
},
304-
});
301+
};
302+
303+
expect(
304+
connectionFromArray(arrayABCDE, { before: offsetToCursor(6) }),
305+
).to.deep.equal(allEdges);
306+
expect(
307+
connectionFromArray(arrayABCDE, { before: offsetToCursor(-1) }),
308+
).to.deep.equal(allEdges);
309+
310+
expect(
311+
connectionFromArray(arrayABCDE, { after: offsetToCursor(6) }),
312+
).to.deep.equal(allEdges);
313+
expect(
314+
connectionFromArray(arrayABCDE, { after: offsetToCursor(-1) }),
315+
).to.deep.equal(allEdges);
305316
});
306317

307318
it('returns no elements if cursors cross', () => {

src/connection/arrayConnection.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,20 @@ export function connectionFromArraySlice<T>(
5454
const { after, before, first, last } = args;
5555
const { sliceStart, arrayLength } = meta;
5656
const sliceEnd = sliceStart + arraySlice.length;
57-
const beforeOffset = getOffsetWithDefault(before, arrayLength);
57+
58+
let startOffset = Math.max(sliceStart, 0);
59+
let endOffset = Math.min(sliceEnd, arrayLength);
60+
5861
const afterOffset = getOffsetWithDefault(after, -1);
62+
if (0 <= afterOffset && afterOffset < arrayLength) {
63+
startOffset = Math.max(startOffset, afterOffset + 1);
64+
}
65+
66+
const beforeOffset = getOffsetWithDefault(before, endOffset);
67+
if (0 <= beforeOffset && beforeOffset < arrayLength) {
68+
endOffset = Math.min(endOffset, beforeOffset);
69+
}
5970

60-
let startOffset = Math.max(sliceStart - 1, afterOffset, -1) + 1;
61-
let endOffset = Math.min(sliceEnd, beforeOffset, arrayLength);
6271
if (typeof first === 'number') {
6372
if (first < 0) {
6473
throw new Error('Argument "first" must be a non-negative integer');
@@ -76,8 +85,8 @@ export function connectionFromArraySlice<T>(
7685

7786
// If supplied slice is too large, trim it down before mapping over it.
7887
const slice = arraySlice.slice(
79-
Math.max(startOffset - sliceStart, 0),
80-
arraySlice.length - (sliceEnd - endOffset),
88+
startOffset - sliceStart,
89+
endOffset - sliceStart,
8190
);
8291

8392
const edges = slice.map((value, index) => ({

0 commit comments

Comments
 (0)