@graphql-box/connection-resolver 5.0.1 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -702
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1 -699
- package/dist/esm/index.mjs.map +1 -1
- package/dist/production.analysis.txt +314 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
package/dist/cjs/index.cjs
CHANGED
@@ -1,703 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
var lodashEs = require('lodash-es');
|
4
|
-
require('core-js/modules/es.array.push.js');
|
5
|
-
var graphql = require('graphql');
|
6
|
-
|
7
|
-
const connectionInputOptions = new Set(['after', 'before', 'first', 'last']);
|
8
|
-
const removeConnectionInputOptions = args => lodashEs.pickBy(args, (_value, key) => !connectionInputOptions.has(key));
|
9
|
-
|
10
|
-
const isCursorSupplied = ({
|
11
|
-
after,
|
12
|
-
before
|
13
|
-
}) => !!(after ?? before);
|
14
|
-
|
15
|
-
const cacheCursors = async (cursorCache, {
|
16
|
-
edges,
|
17
|
-
group,
|
18
|
-
headers,
|
19
|
-
page,
|
20
|
-
totalPages,
|
21
|
-
totalResults
|
22
|
-
}) => {
|
23
|
-
const cacheControl = headers.get('cache-control');
|
24
|
-
const options = cacheControl ? {
|
25
|
-
cacheHeaders: {
|
26
|
-
cacheControl
|
27
|
-
}
|
28
|
-
} : undefined;
|
29
|
-
await Promise.all(edges.map(async ({
|
30
|
-
cursor,
|
31
|
-
node
|
32
|
-
}, index) => cursorCache.set(cursor, {
|
33
|
-
group,
|
34
|
-
index,
|
35
|
-
node,
|
36
|
-
page
|
37
|
-
}, options)));
|
38
|
-
await cursorCache.set(`${group}-metadata`, {
|
39
|
-
totalPages,
|
40
|
-
totalResults
|
41
|
-
}, options);
|
42
|
-
};
|
43
|
-
|
44
|
-
const makeEdges = (nodes, makeCursor) => nodes.map(node => ({
|
45
|
-
cursor: makeCursor(node),
|
46
|
-
node
|
47
|
-
}));
|
48
|
-
|
49
|
-
const requestAndCachePages = async (pages, {
|
50
|
-
cursorCache,
|
51
|
-
getters,
|
52
|
-
groupCursor,
|
53
|
-
makeIDCursor,
|
54
|
-
resourceResolver
|
55
|
-
}) => {
|
56
|
-
const errors = [];
|
57
|
-
const cachedEdges = await Promise.all(pages.map(async page => {
|
58
|
-
const {
|
59
|
-
data: pageResultData,
|
60
|
-
errors: pageResultErrors,
|
61
|
-
headers: pageResultHeaders
|
62
|
-
} = await resourceResolver({
|
63
|
-
page
|
64
|
-
});
|
65
|
-
if (pageResultData && !pageResultErrors?.length) {
|
66
|
-
const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));
|
67
|
-
await cacheCursors(cursorCache, {
|
68
|
-
edges,
|
69
|
-
group: groupCursor,
|
70
|
-
headers: pageResultHeaders,
|
71
|
-
page,
|
72
|
-
totalPages: getters.totalPages(pageResultData),
|
73
|
-
totalResults: getters.totalResults(pageResultData)
|
74
|
-
});
|
75
|
-
return {
|
76
|
-
edges,
|
77
|
-
pageNumber: page
|
78
|
-
};
|
79
|
-
}
|
80
|
-
if (pageResultErrors?.length) {
|
81
|
-
errors.push(...pageResultErrors);
|
82
|
-
}
|
83
|
-
return {
|
84
|
-
edges: [],
|
85
|
-
pageNumber: page
|
86
|
-
};
|
87
|
-
}));
|
88
|
-
return {
|
89
|
-
cachedEdges,
|
90
|
-
errors
|
91
|
-
};
|
92
|
-
};
|
93
|
-
|
94
|
-
const extractEdges = cachedEdges => cachedEdges.reduce((edges, cachedEdge) => [...edges, ...cachedEdge.edges], []);
|
95
|
-
|
96
|
-
const extractNodes = edges => edges.map(edge => edge.node);
|
97
|
-
|
98
|
-
const getCurrentPageStartIndex = ({
|
99
|
-
pageIndex,
|
100
|
-
startIndex
|
101
|
-
}) => pageIndex === 0 ? startIndex.relative : 0;
|
102
|
-
const getCurrentPageEndIndex = ({
|
103
|
-
endIndex,
|
104
|
-
pageIndex,
|
105
|
-
resultsPerPage,
|
106
|
-
totalCachedPages
|
107
|
-
}) => pageIndex === totalCachedPages - 1 ? endIndex.relative : resultsPerPage - 1;
|
108
|
-
|
109
|
-
const getInRangeCachedEdges = (cachedEdgesByPage, {
|
110
|
-
endIndex,
|
111
|
-
resultsPerPage,
|
112
|
-
startIndex
|
113
|
-
}) => {
|
114
|
-
return cachedEdgesByPage.reduce((inRange, cachedEdgesPage, index) => {
|
115
|
-
const currentPageStartIndex = getCurrentPageStartIndex({
|
116
|
-
pageIndex: index,
|
117
|
-
startIndex
|
118
|
-
});
|
119
|
-
const currentPageEndIndex = getCurrentPageEndIndex({
|
120
|
-
endIndex,
|
121
|
-
pageIndex: index,
|
122
|
-
resultsPerPage,
|
123
|
-
totalCachedPages: cachedEdgesByPage.length
|
124
|
-
});
|
125
|
-
const cachedEdges = cachedEdgesPage.edges.slice(currentPageStartIndex, currentPageEndIndex + 1);
|
126
|
-
inRange.push({
|
127
|
-
edges: cachedEdges,
|
128
|
-
pageNumber: cachedEdgesPage.pageNumber
|
129
|
-
});
|
130
|
-
return inRange;
|
131
|
-
}, []);
|
132
|
-
};
|
133
|
-
|
134
|
-
const getStartCursor = edges => edges[0]?.cursor;
|
135
|
-
const getEndCursor = edges => {
|
136
|
-
const lastEdge = edges[edges.length - 1];
|
137
|
-
return lastEdge?.cursor;
|
138
|
-
};
|
139
|
-
|
140
|
-
const mergeCachedEdges = (cachedEdges, missingCachedEdges) => cachedEdges.reduce((mergedCachedEdges, cachedEdge) => {
|
141
|
-
if (cachedEdge.edges.length === 0) {
|
142
|
-
const missingCachedEdge = missingCachedEdges.find(missing => missing.pageNumber === cachedEdge.pageNumber);
|
143
|
-
if (missingCachedEdge) {
|
144
|
-
return [...mergedCachedEdges, missingCachedEdge];
|
145
|
-
}
|
146
|
-
}
|
147
|
-
return [...mergedCachedEdges, cachedEdge];
|
148
|
-
}, []);
|
149
|
-
|
150
|
-
const getDirection = last => last ? 'backward' : 'forward';
|
151
|
-
|
152
|
-
const isLastPage = ({
|
153
|
-
page,
|
154
|
-
totalPages
|
155
|
-
}) => page === totalPages;
|
156
|
-
|
157
|
-
const getStartPageNumber = (args, {
|
158
|
-
page,
|
159
|
-
resultsPerPage,
|
160
|
-
startIndex
|
161
|
-
}) => {
|
162
|
-
if (getDirection(args.last) === 'forward' || startIndex.absolute >= 0) {
|
163
|
-
return page;
|
164
|
-
}
|
165
|
-
const startPageNumber = page - Math.ceil(Math.abs(startIndex.absolute) / resultsPerPage);
|
166
|
-
return startPageNumber <= 1 ? 1 : startPageNumber;
|
167
|
-
};
|
168
|
-
const getEndPageNumber = (args, {
|
169
|
-
endIndex,
|
170
|
-
metadata: {
|
171
|
-
totalPages
|
172
|
-
},
|
173
|
-
page,
|
174
|
-
resultsPerPage
|
175
|
-
}) => {
|
176
|
-
const indexesPerPage = resultsPerPage - 1;
|
177
|
-
if (getDirection(args.last) === 'backward' || isLastPage({
|
178
|
-
page,
|
179
|
-
totalPages
|
180
|
-
}) || endIndex.absolute <= indexesPerPage) {
|
181
|
-
return page;
|
182
|
-
}
|
183
|
-
const endPageNumber = page + Math.ceil((endIndex.absolute - indexesPerPage) / resultsPerPage);
|
184
|
-
return endPageNumber >= totalPages ? totalPages : endPageNumber;
|
185
|
-
};
|
186
|
-
|
187
|
-
const getPageNumbersToRequest = (args, {
|
188
|
-
endIndex,
|
189
|
-
entry: {
|
190
|
-
page
|
191
|
-
},
|
192
|
-
metadata,
|
193
|
-
resultsPerPage,
|
194
|
-
startIndex
|
195
|
-
}) => {
|
196
|
-
const startPageNumber = getStartPageNumber(args, {
|
197
|
-
page,
|
198
|
-
resultsPerPage,
|
199
|
-
startIndex
|
200
|
-
});
|
201
|
-
const endPageNumber = getEndPageNumber(args, {
|
202
|
-
endIndex,
|
203
|
-
metadata,
|
204
|
-
page,
|
205
|
-
resultsPerPage
|
206
|
-
});
|
207
|
-
if (startPageNumber === endPageNumber) {
|
208
|
-
return [page];
|
209
|
-
}
|
210
|
-
return [...lodashEs.range(startPageNumber, endPageNumber), endPageNumber];
|
211
|
-
};
|
212
|
-
|
213
|
-
const getPagesMissingFromCache = cachedEdgesByPage => {
|
214
|
-
return cachedEdgesByPage.reduce((missing, cachedEdgesPage) => {
|
215
|
-
if (cachedEdgesPage.edges.length === 0) {
|
216
|
-
missing.push(cachedEdgesPage.pageNumber);
|
217
|
-
}
|
218
|
-
return missing;
|
219
|
-
}, []);
|
220
|
-
};
|
221
|
-
|
222
|
-
const getCount = ({
|
223
|
-
first,
|
224
|
-
last
|
225
|
-
}) => first ?? last;
|
226
|
-
|
227
|
-
const getResultsOnLastPage = ({
|
228
|
-
resultsPerPage,
|
229
|
-
totalResults
|
230
|
-
}) => {
|
231
|
-
const remainder = totalResults % resultsPerPage;
|
232
|
-
return remainder === 0 ? resultsPerPage : remainder;
|
233
|
-
};
|
234
|
-
|
235
|
-
const getIndexesOnLastPage = ({
|
236
|
-
resultsPerPage,
|
237
|
-
totalResults
|
238
|
-
}) => getResultsOnLastPage({
|
239
|
-
resultsPerPage,
|
240
|
-
totalResults
|
241
|
-
}) - 1;
|
242
|
-
|
243
|
-
const isFirstPage = page => page === 1;
|
244
|
-
|
245
|
-
const getStartIndex = (args, {
|
246
|
-
entry: {
|
247
|
-
index,
|
248
|
-
page
|
249
|
-
},
|
250
|
-
resultsPerPage
|
251
|
-
}) => {
|
252
|
-
const count = getCount(args);
|
253
|
-
return getDirection(args.last) === 'forward' ? {
|
254
|
-
absolute: index + 1,
|
255
|
-
relative: index + 1
|
256
|
-
} : isFirstPage(page) && index - count < 0 ? {
|
257
|
-
absolute: 0,
|
258
|
-
relative: 0
|
259
|
-
} : (() => {
|
260
|
-
const absoluteStartIndex = index - count;
|
261
|
-
if (absoluteStartIndex >= 0) {
|
262
|
-
return {
|
263
|
-
absolute: absoluteStartIndex,
|
264
|
-
relative: absoluteStartIndex
|
265
|
-
};
|
266
|
-
}
|
267
|
-
const indexesRemainingAfterLastPage = Math.abs(absoluteStartIndex);
|
268
|
-
const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;
|
269
|
-
const remainder = indexesRemainingAfterLastPage % resultsPerPage;
|
270
|
-
const relativeStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;
|
271
|
-
return {
|
272
|
-
absolute: absoluteStartIndex,
|
273
|
-
relative: relativeStartIndex
|
274
|
-
};
|
275
|
-
})();
|
276
|
-
};
|
277
|
-
const getEndIndex = (args, {
|
278
|
-
entry: {
|
279
|
-
index,
|
280
|
-
page
|
281
|
-
},
|
282
|
-
metadata: {
|
283
|
-
totalPages,
|
284
|
-
totalResults
|
285
|
-
},
|
286
|
-
resultsPerPage
|
287
|
-
}) => {
|
288
|
-
const count = getCount(args);
|
289
|
-
const indexesOnLastPage = getIndexesOnLastPage({
|
290
|
-
resultsPerPage,
|
291
|
-
totalResults
|
292
|
-
});
|
293
|
-
return getDirection(args.last) === 'backward' ? {
|
294
|
-
absolute: index - 1,
|
295
|
-
relative: index - 1
|
296
|
-
} : isLastPage({
|
297
|
-
page,
|
298
|
-
totalPages
|
299
|
-
}) && index + count > indexesOnLastPage ? {
|
300
|
-
absolute: indexesOnLastPage,
|
301
|
-
relative: indexesOnLastPage
|
302
|
-
} : (() => {
|
303
|
-
const absoluteEndIndex = index + count;
|
304
|
-
const indexesPerPage = resultsPerPage - 1;
|
305
|
-
if (absoluteEndIndex <= indexesPerPage) {
|
306
|
-
return {
|
307
|
-
absolute: absoluteEndIndex,
|
308
|
-
relative: absoluteEndIndex
|
309
|
-
};
|
310
|
-
}
|
311
|
-
const indexesRemainingAfterFirstPage = absoluteEndIndex - indexesPerPage;
|
312
|
-
const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;
|
313
|
-
const remainder = indexesRemainingAfterFirstPage % resultsPerPage;
|
314
|
-
const relativeEndIndex = remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;
|
315
|
-
return {
|
316
|
-
absolute: absoluteEndIndex,
|
317
|
-
relative: relativeEndIndex
|
318
|
-
};
|
319
|
-
})();
|
320
|
-
};
|
321
|
-
|
322
|
-
const hasPreviousPage = ({
|
323
|
-
cachedEdgesByPage,
|
324
|
-
startIndex
|
325
|
-
}) => lodashEs.isNumber(cachedEdgesByPage[0]?.pageNumber) && cachedEdgesByPage[0]?.pageNumber !== 1 || startIndex.relative > 0;
|
326
|
-
const hasNextPage = ({
|
327
|
-
cachedEdgesByPage,
|
328
|
-
endIndex,
|
329
|
-
metadata: {
|
330
|
-
totalPages,
|
331
|
-
totalResults
|
332
|
-
},
|
333
|
-
resultsPerPage
|
334
|
-
}) => lodashEs.isNumber(cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber) && cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber !== totalPages || endIndex.relative < getIndexesOnLastPage({
|
335
|
-
resultsPerPage,
|
336
|
-
totalResults
|
337
|
-
});
|
338
|
-
|
339
|
-
const retrieveCachedEdgesByPage = async (cursorCache, {
|
340
|
-
groupCursor,
|
341
|
-
pageNumber
|
342
|
-
}) => {
|
343
|
-
const {
|
344
|
-
entries,
|
345
|
-
metadata
|
346
|
-
} = await cursorCache.export({
|
347
|
-
filterByValue: [{
|
348
|
-
comparator: pageNumber,
|
349
|
-
keyChain: 'page'
|
350
|
-
}, {
|
351
|
-
comparator: groupCursor,
|
352
|
-
keyChain: 'group'
|
353
|
-
}]
|
354
|
-
});
|
355
|
-
return {
|
356
|
-
edges: entries.reduce((cached, [key, {
|
357
|
-
index,
|
358
|
-
node
|
359
|
-
}]) => {
|
360
|
-
if (metadata[index]?.cacheability.checkTTL()) {
|
361
|
-
cached[index] = {
|
362
|
-
cursor: key,
|
363
|
-
node
|
364
|
-
};
|
365
|
-
}
|
366
|
-
return cached;
|
367
|
-
}, []),
|
368
|
-
pageNumber
|
369
|
-
};
|
370
|
-
};
|
371
|
-
|
372
|
-
const getCursor = ({
|
373
|
-
after,
|
374
|
-
before
|
375
|
-
}) => before ?? after;
|
376
|
-
|
377
|
-
const makeEntry = (args, {
|
378
|
-
metadata: {
|
379
|
-
totalPages,
|
380
|
-
totalResults
|
381
|
-
},
|
382
|
-
resultsPerPage
|
383
|
-
}) => {
|
384
|
-
if (getDirection(args.last) === 'backward') {
|
385
|
-
return {
|
386
|
-
index: getIndexesOnLastPage({
|
387
|
-
resultsPerPage,
|
388
|
-
totalResults
|
389
|
-
}) + 1,
|
390
|
-
page: totalPages
|
391
|
-
};
|
392
|
-
}
|
393
|
-
return {
|
394
|
-
index: -1,
|
395
|
-
page: 1
|
396
|
-
};
|
397
|
-
};
|
398
|
-
|
399
|
-
const retrieveEntry = async (args, metadata, {
|
400
|
-
cursorCache,
|
401
|
-
resultsPerPage
|
402
|
-
}) => {
|
403
|
-
const cursor = getCursor(args);
|
404
|
-
if (cursor) {
|
405
|
-
const cursorCacheEntry = await cursorCache.get(cursor);
|
406
|
-
if (cursorCacheEntry) {
|
407
|
-
return cursorCacheEntry;
|
408
|
-
}
|
409
|
-
}
|
410
|
-
return makeEntry(args, {
|
411
|
-
metadata,
|
412
|
-
resultsPerPage
|
413
|
-
});
|
414
|
-
};
|
415
|
-
|
416
|
-
const retrieveCachedConnection = async (args, {
|
417
|
-
cursorCache,
|
418
|
-
groupCursor,
|
419
|
-
resultsPerPage
|
420
|
-
}) => {
|
421
|
-
const metadata = await cursorCache.get(`${groupCursor}-metadata`);
|
422
|
-
const entry = await retrieveEntry(args, metadata, {
|
423
|
-
cursorCache,
|
424
|
-
resultsPerPage
|
425
|
-
});
|
426
|
-
const startIndex = getStartIndex(args, {
|
427
|
-
entry,
|
428
|
-
resultsPerPage
|
429
|
-
});
|
430
|
-
const endIndex = getEndIndex(args, {
|
431
|
-
entry,
|
432
|
-
metadata,
|
433
|
-
resultsPerPage
|
434
|
-
});
|
435
|
-
const promises = [];
|
436
|
-
const pageNumbersToRequest = getPageNumbersToRequest(args, {
|
437
|
-
endIndex,
|
438
|
-
entry,
|
439
|
-
metadata,
|
440
|
-
resultsPerPage,
|
441
|
-
startIndex
|
442
|
-
});
|
443
|
-
for (const pageNumber of pageNumbersToRequest) {
|
444
|
-
promises.push(retrieveCachedEdgesByPage(cursorCache, {
|
445
|
-
groupCursor,
|
446
|
-
pageNumber
|
447
|
-
}));
|
448
|
-
}
|
449
|
-
const cachedEdgesByPage = await Promise.all(promises);
|
450
|
-
const missingPages = getPagesMissingFromCache(cachedEdgesByPage);
|
451
|
-
return {
|
452
|
-
cachedEdges: missingPages.length === 0 ? getInRangeCachedEdges(cachedEdgesByPage, {
|
453
|
-
endIndex,
|
454
|
-
resultsPerPage,
|
455
|
-
startIndex
|
456
|
-
}) : cachedEdgesByPage,
|
457
|
-
hasNextPage: hasNextPage({
|
458
|
-
cachedEdgesByPage,
|
459
|
-
endIndex,
|
460
|
-
metadata,
|
461
|
-
resultsPerPage
|
462
|
-
}),
|
463
|
-
hasPreviousPage: hasPreviousPage({
|
464
|
-
cachedEdgesByPage,
|
465
|
-
startIndex
|
466
|
-
}),
|
467
|
-
indexes: {
|
468
|
-
end: endIndex,
|
469
|
-
start: startIndex
|
470
|
-
},
|
471
|
-
missingPages,
|
472
|
-
totalResults: metadata.totalResults
|
473
|
-
};
|
474
|
-
};
|
475
|
-
|
476
|
-
const resolveConnection = async (args, {
|
477
|
-
cursorCache,
|
478
|
-
getters,
|
479
|
-
groupCursor,
|
480
|
-
makeIDCursor,
|
481
|
-
resourceResolver,
|
482
|
-
resultsPerPage
|
483
|
-
}) => {
|
484
|
-
const {
|
485
|
-
cachedEdges,
|
486
|
-
hasNextPage,
|
487
|
-
hasPreviousPage,
|
488
|
-
indexes,
|
489
|
-
missingPages,
|
490
|
-
totalResults
|
491
|
-
} = await retrieveCachedConnection(args, {
|
492
|
-
cursorCache,
|
493
|
-
groupCursor,
|
494
|
-
resultsPerPage
|
495
|
-
});
|
496
|
-
if (missingPages.length === 0) {
|
497
|
-
const edges = extractEdges(cachedEdges);
|
498
|
-
return {
|
499
|
-
edges,
|
500
|
-
errors: [],
|
501
|
-
nodes: extractNodes(edges),
|
502
|
-
pageInfo: {
|
503
|
-
endCursor: getEndCursor(edges),
|
504
|
-
hasNextPage,
|
505
|
-
hasPreviousPage,
|
506
|
-
startCursor: getStartCursor(edges)
|
507
|
-
},
|
508
|
-
totalCount: totalResults
|
509
|
-
};
|
510
|
-
}
|
511
|
-
const {
|
512
|
-
cachedEdges: missingCachedEdges,
|
513
|
-
errors
|
514
|
-
} = await requestAndCachePages(missingPages, {
|
515
|
-
cursorCache,
|
516
|
-
getters,
|
517
|
-
groupCursor,
|
518
|
-
makeIDCursor,
|
519
|
-
resourceResolver
|
520
|
-
});
|
521
|
-
const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {
|
522
|
-
endIndex: indexes.end,
|
523
|
-
resultsPerPage,
|
524
|
-
startIndex: indexes.start
|
525
|
-
});
|
526
|
-
const edges = extractEdges(mergedCachedEdges);
|
527
|
-
return {
|
528
|
-
edges,
|
529
|
-
errors,
|
530
|
-
nodes: extractNodes(edges),
|
531
|
-
pageInfo: {
|
532
|
-
endCursor: getEndCursor(edges),
|
533
|
-
hasNextPage,
|
534
|
-
hasPreviousPage,
|
535
|
-
startCursor: getStartCursor(edges)
|
536
|
-
},
|
537
|
-
totalCount: totalResults
|
538
|
-
};
|
539
|
-
};
|
540
|
-
|
541
|
-
const isCursorFirst = ({
|
542
|
-
direction,
|
543
|
-
entry: {
|
544
|
-
index,
|
545
|
-
page
|
546
|
-
}
|
547
|
-
}) => direction === 'backward' && page === 1 && index === 0;
|
548
|
-
|
549
|
-
const isCursorLast = ({
|
550
|
-
direction,
|
551
|
-
entry: {
|
552
|
-
index,
|
553
|
-
page
|
554
|
-
},
|
555
|
-
resultsPerPage,
|
556
|
-
totalPages,
|
557
|
-
totalResults
|
558
|
-
}) => direction === 'forward' && page === totalPages && index === getIndexesOnLastPage({
|
559
|
-
resultsPerPage,
|
560
|
-
totalResults
|
561
|
-
});
|
562
|
-
|
563
|
-
const validateCursor = async ({
|
564
|
-
after,
|
565
|
-
before,
|
566
|
-
first,
|
567
|
-
last
|
568
|
-
}, {
|
569
|
-
fieldNodes
|
570
|
-
}, {
|
571
|
-
cursorCache,
|
572
|
-
groupCursor,
|
573
|
-
resultsPerPage
|
574
|
-
}) => {
|
575
|
-
if (after && !first && !last) {
|
576
|
-
return new graphql.GraphQLError('Invalid connection argument combination. `after` must be used in combination with `first`.', {
|
577
|
-
nodes: fieldNodes
|
578
|
-
});
|
579
|
-
}
|
580
|
-
if (after && last) {
|
581
|
-
return new graphql.GraphQLError('Invalid connection argument combination. `after` cannot be used in combination with `last`.', {
|
582
|
-
nodes: fieldNodes
|
583
|
-
});
|
584
|
-
}
|
585
|
-
if (before && !last && !first) {
|
586
|
-
return new graphql.GraphQLError('Invalid connection argument combination. `before` must be used in combination with `last`.', {
|
587
|
-
nodes: fieldNodes
|
588
|
-
});
|
589
|
-
}
|
590
|
-
if (before && first) {
|
591
|
-
return new graphql.GraphQLError('Invalid connection argument combination. `before` cannot be used in combination with `first`.', {
|
592
|
-
nodes: fieldNodes
|
593
|
-
});
|
594
|
-
}
|
595
|
-
const metadata = await cursorCache.get(`${groupCursor}-metadata`);
|
596
|
-
if (!metadata) {
|
597
|
-
return new graphql.GraphQLError('Curser cannot be supplied without previously being provided.', {
|
598
|
-
nodes: fieldNodes
|
599
|
-
});
|
600
|
-
}
|
601
|
-
const cursor = getCursor({
|
602
|
-
after,
|
603
|
-
before
|
604
|
-
});
|
605
|
-
const entry = await cursorCache.get(cursor);
|
606
|
-
if (!entry) {
|
607
|
-
return new graphql.GraphQLError(`The cursor ${cursor} could not be found.`, {
|
608
|
-
nodes: fieldNodes
|
609
|
-
});
|
610
|
-
}
|
611
|
-
const direction = getDirection(last);
|
612
|
-
if (isCursorLast({
|
613
|
-
direction,
|
614
|
-
entry,
|
615
|
-
resultsPerPage,
|
616
|
-
...metadata
|
617
|
-
})) {
|
618
|
-
return new graphql.GraphQLError(`The cursor ${cursor} is the last, you cannot go forward any further.`, {
|
619
|
-
nodes: fieldNodes
|
620
|
-
});
|
621
|
-
}
|
622
|
-
if (isCursorFirst({
|
623
|
-
direction,
|
624
|
-
entry
|
625
|
-
})) {
|
626
|
-
return new graphql.GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, {
|
627
|
-
nodes: fieldNodes
|
628
|
-
});
|
629
|
-
}
|
630
|
-
return;
|
631
|
-
};
|
632
|
-
|
633
|
-
const makeConnectionResolver = ({
|
634
|
-
createMakeCursors,
|
635
|
-
createResourceResolver,
|
636
|
-
cursorCache,
|
637
|
-
getters,
|
638
|
-
resolver = result => result,
|
639
|
-
resultsPerPage
|
640
|
-
}) => async (source, args, context, info) => {
|
641
|
-
const {
|
642
|
-
makeGroupCursor,
|
643
|
-
makeIDCursor
|
644
|
-
} = createMakeCursors(source, args, context, info);
|
645
|
-
const resourceResolver = createResourceResolver(source, args, context, info);
|
646
|
-
const groupCursor = makeGroupCursor();
|
647
|
-
if (isCursorSupplied(args)) {
|
648
|
-
const cursorError = await validateCursor(args, info, {
|
649
|
-
cursorCache,
|
650
|
-
groupCursor,
|
651
|
-
resultsPerPage
|
652
|
-
});
|
653
|
-
if (cursorError) {
|
654
|
-
return resolver({
|
655
|
-
edges: [],
|
656
|
-
errors: [cursorError],
|
657
|
-
nodes: [],
|
658
|
-
pageInfo: {
|
659
|
-
hasNextPage: false,
|
660
|
-
hasPreviousPage: false
|
661
|
-
},
|
662
|
-
totalCount: 0
|
663
|
-
});
|
664
|
-
}
|
665
|
-
return resolver(await resolveConnection(args, {
|
666
|
-
cursorCache,
|
667
|
-
getters,
|
668
|
-
groupCursor,
|
669
|
-
makeIDCursor,
|
670
|
-
resourceResolver,
|
671
|
-
resultsPerPage
|
672
|
-
}));
|
673
|
-
}
|
674
|
-
if (await cursorCache.has(`${groupCursor}-metadata`)) {
|
675
|
-
return resolver(await resolveConnection(args, {
|
676
|
-
cursorCache,
|
677
|
-
getters,
|
678
|
-
groupCursor,
|
679
|
-
makeIDCursor,
|
680
|
-
resourceResolver,
|
681
|
-
resultsPerPage
|
682
|
-
}));
|
683
|
-
}
|
684
|
-
await requestAndCachePages([1], {
|
685
|
-
cursorCache,
|
686
|
-
getters,
|
687
|
-
groupCursor,
|
688
|
-
makeIDCursor,
|
689
|
-
resourceResolver
|
690
|
-
});
|
691
|
-
return resolver(await resolveConnection(args, {
|
692
|
-
cursorCache,
|
693
|
-
getters,
|
694
|
-
groupCursor,
|
695
|
-
makeIDCursor,
|
696
|
-
resourceResolver,
|
697
|
-
resultsPerPage
|
698
|
-
}));
|
699
|
-
};
|
700
|
-
|
701
|
-
exports.makeConnectionResolver = makeConnectionResolver;
|
702
|
-
exports.removeConnectionInputOptions = removeConnectionInputOptions;
|
1
|
+
"use strict";var e=require("lodash-es");require("core-js/modules/es.array.push.js");var r=require("graphql");const t=new Set(["after","before","first","last"]),a=async(e,{cursorCache:r,getters:t,groupCursor:a,makeIDCursor:s,resourceResolver:o})=>{const n=[],u=await Promise.all(e.map((async e=>{const{data:u,errors:g,headers:l}=await o({page:e});if(u&&!g?.length){const o=(c=t.nodes(u),d=e=>s(e.id),c.map((e=>({cursor:d(e),node:e}))));return await(async(e,{edges:r,group:t,headers:a,page:s,totalPages:o,totalResults:n})=>{const u=a.get("cache-control"),g=u?{cacheHeaders:{cacheControl:u}}:void 0;await Promise.all(r.map((async({cursor:r,node:a},o)=>e.set(r,{group:t,index:o,node:a,page:s},g)))),await e.set(`${t}-metadata`,{totalPages:o,totalResults:n},g)})(r,{edges:o,group:a,headers:l,page:e,totalPages:t.totalPages(u),totalResults:t.totalResults(u)}),{edges:o,pageNumber:e}}var c,d;return g?.length&&n.push(...g),{edges:[],pageNumber:e}})));return{cachedEdges:u,errors:n}},s=e=>e.reduce(((e,r)=>[...e,...r.edges]),[]),o=e=>e.map((e=>e.node)),n=(e,{endIndex:r,resultsPerPage:t,startIndex:a})=>e.reduce(((s,o,n)=>{const u=(({pageIndex:e,startIndex:r})=>0===e?r.relative:0)({pageIndex:n,startIndex:a}),g=(({endIndex:e,pageIndex:r,resultsPerPage:t,totalCachedPages:a})=>r===a-1?e.relative:t-1)({endIndex:r,pageIndex:n,resultsPerPage:t,totalCachedPages:e.length}),l=o.edges.slice(u,g+1);return s.push({edges:l,pageNumber:o.pageNumber}),s}),[]),u=e=>e[0]?.cursor,g=e=>{const r=e[e.length-1];return r?.cursor},l=e=>e?"backward":"forward",c=({page:e,totalPages:r})=>e===r,d=(r,{endIndex:t,entry:{page:a},metadata:s,resultsPerPage:o,startIndex:n})=>{const u=((e,{page:r,resultsPerPage:t,startIndex:a})=>{if("forward"===l(e.last)||a.absolute>=0)return r;const s=r-Math.ceil(Math.abs(a.absolute)/t);return s<=1?1:s})(r,{page:a,resultsPerPage:o,startIndex:n}),g=((e,{endIndex:r,metadata:{totalPages:t},page:a,resultsPerPage:s})=>{const o=s-1;if("backward"===l(e.last)||c({page:a,totalPages:t})||r.absolute<=o)return a;const n=a+Math.ceil((r.absolute-o)/s);return n>=t?t:n})(r,{endIndex:t,metadata:s,page:a,resultsPerPage:o});return u===g?[a]:[...e.range(u,g),g]},i=({first:e,last:r})=>e??r,P=({resultsPerPage:e,totalResults:r})=>(({resultsPerPage:e,totalResults:r})=>{const t=r%e;return 0===t?e:t})({resultsPerPage:e,totalResults:r})-1,p=({cachedEdgesByPage:r,startIndex:t})=>e.isNumber(r[0]?.pageNumber)&&1!==r[0]?.pageNumber||t.relative>0,h=({cachedEdgesByPage:r,endIndex:t,metadata:{totalPages:a,totalResults:s},resultsPerPage:o})=>e.isNumber(r[r.length-1]?.pageNumber)&&r[r.length-1]?.pageNumber!==a||t.relative<P({resultsPerPage:o,totalResults:s}),m=async(e,{groupCursor:r,pageNumber:t})=>{const{entries:a,metadata:s}=await e.export({filterByValue:[{comparator:t,keyChain:"page"},{comparator:r,keyChain:"group"}]});return{edges:a.reduce(((e,[r,{index:t,node:a}])=>(s[t]?.cacheability.checkTTL()&&(e[t]={cursor:r,node:a}),e)),[]),pageNumber:t}},b=({after:e,before:r})=>r??e,f=async(e,r,{cursorCache:t,resultsPerPage:a})=>{const s=b(e);if(s){const e=await t.get(s);if(e)return e}return((e,{metadata:{totalPages:r,totalResults:t},resultsPerPage:a})=>"backward"===l(e.last)?{index:P({resultsPerPage:a,totalResults:t})+1,page:r}:{index:-1,page:1})(e,{metadata:r,resultsPerPage:a})},C=async(e,{cursorCache:r,groupCursor:t,resultsPerPage:a})=>{const s=await r.get(`${t}-metadata`),o=await f(e,s,{cursorCache:r,resultsPerPage:a}),u=((e,{entry:{index:r,page:t},resultsPerPage:a})=>{const s=i(e);return"forward"===l(e.last)?{absolute:r+1,relative:r+1}:(e=>1===e)(t)&&r-s<0?{absolute:0,relative:0}:(()=>{const e=r-s;if(e>=0)return{absolute:e,relative:e};const o=Math.abs(e),n=o%a;return{absolute:e,relative:0===n||t-(o/a+1)<0?0:a-n}})()})(e,{entry:o,resultsPerPage:a}),g=((e,{entry:{index:r,page:t},metadata:{totalPages:a,totalResults:s},resultsPerPage:o})=>{const n=i(e),u=P({resultsPerPage:o,totalResults:s});return"backward"===l(e.last)?{absolute:r-1,relative:r-1}:c({page:t,totalPages:a})&&r+n>u?{absolute:u,relative:u}:(()=>{const e=r+n,s=o-1;if(e<=s)return{absolute:e,relative:e};const g=e-s,l=g%o;return{absolute:e,relative:0===l?s:t+g/o>a?u:l-1}})()})(e,{entry:o,metadata:s,resultsPerPage:a}),b=[],C=d(e,{endIndex:g,entry:o,metadata:s,resultsPerPage:a,startIndex:u});for(const e of C)b.push(m(r,{groupCursor:t,pageNumber:e}));const w=await Promise.all(b),x=(e=>e.reduce(((e,r)=>(0===r.edges.length&&e.push(r.pageNumber),e)),[]))(w);return{cachedEdges:0===x.length?n(w,{endIndex:g,resultsPerPage:a,startIndex:u}):w,hasNextPage:h({cachedEdgesByPage:w,endIndex:g,metadata:s,resultsPerPage:a}),hasPreviousPage:p({cachedEdgesByPage:w,startIndex:u}),indexes:{end:g,start:u},missingPages:x,totalResults:s.totalResults}},w=async(e,{cursorCache:r,getters:t,groupCursor:l,makeIDCursor:c,resourceResolver:d,resultsPerPage:i})=>{const{cachedEdges:P,hasNextPage:p,hasPreviousPage:h,indexes:m,missingPages:b,totalResults:f}=await C(e,{cursorCache:r,groupCursor:l,resultsPerPage:i});if(0===b.length){const e=s(P);return{edges:e,errors:[],nodes:o(e),pageInfo:{endCursor:g(e),hasNextPage:p,hasPreviousPage:h,startCursor:u(e)},totalCount:f}}const{cachedEdges:w,errors:x}=await a(b,{cursorCache:r,getters:t,groupCursor:l,makeIDCursor:c,resourceResolver:d}),I=n(((e,r)=>e.reduce(((e,t)=>{if(0===t.edges.length){const a=r.find((e=>e.pageNumber===t.pageNumber));if(a)return[...e,a]}return[...e,t]}),[]))(P,w),{endIndex:m.end,resultsPerPage:i,startIndex:m.start}),v=s(I);return{edges:v,errors:x,nodes:o(v),pageInfo:{endCursor:g(v),hasNextPage:p,hasPreviousPage:h,startCursor:u(v)},totalCount:f}},x=async({after:e,before:t,first:a,last:s},{fieldNodes:o},{cursorCache:n,groupCursor:u,resultsPerPage:g})=>{if(e&&!a&&!s)return new r.GraphQLError("Invalid connection argument combination. `after` must be used in combination with `first`.",{nodes:o});if(e&&s)return new r.GraphQLError("Invalid connection argument combination. `after` cannot be used in combination with `last`.",{nodes:o});if(t&&!s&&!a)return new r.GraphQLError("Invalid connection argument combination. `before` must be used in combination with `last`.",{nodes:o});if(t&&a)return new r.GraphQLError("Invalid connection argument combination. `before` cannot be used in combination with `first`.",{nodes:o});const c=await n.get(`${u}-metadata`);if(!c)return new r.GraphQLError("Curser cannot be supplied without previously being provided.",{nodes:o});const d=b({after:e,before:t}),i=await n.get(d);if(!i)return new r.GraphQLError(`The cursor ${d} could not be found.`,{nodes:o});const p=l(s);return(({direction:e,entry:{index:r,page:t},resultsPerPage:a,totalPages:s,totalResults:o})=>"forward"===e&&t===s&&r===P({resultsPerPage:a,totalResults:o}))({direction:p,entry:i,resultsPerPage:g,...c})?new r.GraphQLError(`The cursor ${d} is the last, you cannot go forward any further.`,{nodes:o}):(({direction:e,entry:{index:r,page:t}})=>"backward"===e&&1===t&&0===r)({direction:p,entry:i})?new r.GraphQLError(`The cursor ${d} is the first, you cannot go backward any further.`,{nodes:o}):void 0};exports.makeConnectionResolver=({createMakeCursors:e,createResourceResolver:r,cursorCache:t,getters:s,resolver:o=(e=>e),resultsPerPage:n})=>async(u,g,l,c)=>{const{makeGroupCursor:d,makeIDCursor:i}=e(u,g,l,c),P=r(u,g,l,c),p=d();if((({after:e,before:r})=>!!(e??r))(g)){const e=await x(g,c,{cursorCache:t,groupCursor:p,resultsPerPage:n});return o(e?{edges:[],errors:[e],nodes:[],pageInfo:{hasNextPage:!1,hasPreviousPage:!1},totalCount:0}:await w(g,{cursorCache:t,getters:s,groupCursor:p,makeIDCursor:i,resourceResolver:P,resultsPerPage:n}))}return await t.has(`${p}-metadata`)||await a([1],{cursorCache:t,getters:s,groupCursor:p,makeIDCursor:i,resourceResolver:P}),o(await w(g,{cursorCache:t,getters:s,groupCursor:p,makeIDCursor:i,resourceResolver:P,resultsPerPage:n}))},exports.removeConnectionInputOptions=r=>e.pickBy(r,((e,r)=>!t.has(r)));
|
703
2
|
//# sourceMappingURL=index.cjs.map
|