@graphql-box/connection-resolver 0.1.3 → 0.1.7
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/lib/browser/index.js +1 -1
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/production.analysis.txt +29 -29
- package/lib/main/__testUtils__/generateCursorCache.js +2 -1
- package/lib/main/__testUtils__/generateCursorCache.js.map +1 -1
- package/lib/main/helpers/isCursorSupplied.js.map +1 -1
- package/lib/main/helpers/requestAndCachePages.js +2 -1
- package/lib/main/helpers/requestAndCachePages.js.map +1 -1
- package/lib/main/helpers/resolveConnection.js +2 -1
- package/lib/main/helpers/resolveConnection.js.map +1 -1
- package/lib/main/main/index.js +3 -2
- package/lib/main/main/index.js.map +1 -1
- package/lib/module/__testUtils__/generateCursorCache.js +2 -1
- package/lib/module/__testUtils__/generateCursorCache.js.map +1 -1
- package/lib/module/helpers/isCursorSupplied.js.map +1 -1
- package/lib/module/helpers/requestAndCachePages.js +5 -2
- package/lib/module/helpers/requestAndCachePages.js.map +1 -1
- package/lib/module/helpers/resolveConnection.js +5 -2
- package/lib/module/helpers/resolveConnection.js.map +1 -1
- package/lib/module/main/index.js +6 -3
- package/lib/module/main/index.js.map +1 -1
- package/lib/types/__testUtils__/generateCursorCache.d.ts.map +1 -1
- package/lib/types/defs/index.d.ts +25 -22
- package/lib/types/defs/index.d.ts.map +1 -1
- package/lib/types/helpers/extractNodes.d.ts +1 -1
- package/lib/types/helpers/isCursorSupplied.d.ts +2 -2
- package/lib/types/helpers/isCursorSupplied.d.ts.map +1 -1
- package/lib/types/helpers/requestAndCachePages.d.ts +7 -7
- package/lib/types/helpers/requestAndCachePages.d.ts.map +1 -1
- package/lib/types/helpers/resolveConnection.d.ts +7 -7
- package/lib/types/helpers/resolveConnection.d.ts.map +1 -1
- package/lib/types/main/index.d.ts +3 -3
- package/lib/types/main/index.d.ts.map +1 -1
- package/package-lock.json +18 -0
- package/package.json +1 -1
- package/src/__testUtils__/generateCursorCache.ts +1 -0
- package/src/defs/index.ts +43 -31
- package/src/helpers/getPageNumbersToRequest.test.ts +2 -2
- package/src/helpers/getStartAndEndIndexes.test.ts +10 -10
- package/src/helpers/isCursorSupplied.ts +2 -2
- package/src/helpers/requestAndCachePages.ts +8 -6
- package/src/helpers/resolveConnection.ts +17 -8
- package/src/helpers/retrieveCachedConnection.test.ts +32 -32
- package/src/helpers/validateCursor.test.ts +1 -0
- package/src/main/index.test.ts +37 -59
- package/src/main/index.ts +16 -8
@@ -11,7 +11,7 @@ describe("getPageNumbersToRequest", () => {
|
|
11
11
|
entry: {
|
12
12
|
group: "group",
|
13
13
|
index: 2,
|
14
|
-
node: {},
|
14
|
+
node: { id: "123" },
|
15
15
|
page: 2,
|
16
16
|
},
|
17
17
|
metadata: {
|
@@ -35,7 +35,7 @@ describe("getPageNumbersToRequest", () => {
|
|
35
35
|
entry: {
|
36
36
|
group: "group",
|
37
37
|
index: 3,
|
38
|
-
node: {},
|
38
|
+
node: { id: "123" },
|
39
39
|
page: 4,
|
40
40
|
},
|
41
41
|
metadata: {
|
@@ -11,7 +11,7 @@ describe("getStartIndex", () => {
|
|
11
11
|
entry: {
|
12
12
|
group: "qwerty",
|
13
13
|
index: 5,
|
14
|
-
node: {},
|
14
|
+
node: { id: "123" },
|
15
15
|
page: 3,
|
16
16
|
},
|
17
17
|
metadata: {
|
@@ -35,7 +35,7 @@ describe("getStartIndex", () => {
|
|
35
35
|
entry: {
|
36
36
|
group: "qwerty",
|
37
37
|
index: 3,
|
38
|
-
node: {},
|
38
|
+
node: { id: "123" },
|
39
39
|
page: 1,
|
40
40
|
},
|
41
41
|
metadata: {
|
@@ -58,7 +58,7 @@ describe("getStartIndex", () => {
|
|
58
58
|
entry: {
|
59
59
|
group: "qwerty",
|
60
60
|
index: 4,
|
61
|
-
node: {},
|
61
|
+
node: { id: "123" },
|
62
62
|
page: 1,
|
63
63
|
},
|
64
64
|
metadata: {
|
@@ -82,7 +82,7 @@ describe("getStartIndex", () => {
|
|
82
82
|
entry: {
|
83
83
|
group: "qwerty",
|
84
84
|
index: 7,
|
85
|
-
node: {},
|
85
|
+
node: { id: "123" },
|
86
86
|
page: 3,
|
87
87
|
},
|
88
88
|
metadata: {
|
@@ -105,7 +105,7 @@ describe("getStartIndex", () => {
|
|
105
105
|
entry: {
|
106
106
|
group: "qwerty",
|
107
107
|
index: 4,
|
108
|
-
node: {},
|
108
|
+
node: { id: "123" },
|
109
109
|
page: 3,
|
110
110
|
},
|
111
111
|
metadata: {
|
@@ -132,7 +132,7 @@ describe("getEndIndex", () => {
|
|
132
132
|
entry: {
|
133
133
|
group: "qwerty",
|
134
134
|
index: 5,
|
135
|
-
node: {},
|
135
|
+
node: { id: "123" },
|
136
136
|
page: 3,
|
137
137
|
},
|
138
138
|
metadata: {
|
@@ -156,7 +156,7 @@ describe("getEndIndex", () => {
|
|
156
156
|
entry: {
|
157
157
|
group: "qwerty",
|
158
158
|
index: 2,
|
159
|
-
node: {},
|
159
|
+
node: { id: "123" },
|
160
160
|
page: 6,
|
161
161
|
},
|
162
162
|
metadata: {
|
@@ -179,7 +179,7 @@ describe("getEndIndex", () => {
|
|
179
179
|
entry: {
|
180
180
|
group: "qwerty",
|
181
181
|
index: 2,
|
182
|
-
node: {},
|
182
|
+
node: { id: "123" },
|
183
183
|
page: 6,
|
184
184
|
},
|
185
185
|
metadata: {
|
@@ -203,7 +203,7 @@ describe("getEndIndex", () => {
|
|
203
203
|
entry: {
|
204
204
|
group: "qwerty",
|
205
205
|
index: 2,
|
206
|
-
node: {},
|
206
|
+
node: { id: "123" },
|
207
207
|
page: 4,
|
208
208
|
},
|
209
209
|
metadata: {
|
@@ -226,7 +226,7 @@ describe("getEndIndex", () => {
|
|
226
226
|
entry: {
|
227
227
|
group: "qwerty",
|
228
228
|
index: 2,
|
229
|
-
node: {},
|
229
|
+
node: { id: "123" },
|
230
230
|
page: 4,
|
231
231
|
},
|
232
232
|
metadata: {
|
@@ -1,3 +1,3 @@
|
|
1
|
-
import { ConnectionInputOptions } from "../defs";
|
1
|
+
import { ConnectionInputOptions, PlainObject } from "../defs";
|
2
2
|
|
3
|
-
export default ({ after, before }:
|
3
|
+
export default ({ after, before }: PlainObject & ConnectionInputOptions) => !!(after || before);
|
@@ -1,19 +1,19 @@
|
|
1
1
|
import Cachemap from "@cachemap/core";
|
2
|
-
import { Getters, ResourceResolver } from "../defs";
|
2
|
+
import { Getters, Node, PlainObject, ResourceResolver } from "../defs";
|
3
3
|
import cacheCursors from "./cacheCursors";
|
4
4
|
import makeEdges from "./makeEdges";
|
5
5
|
|
6
|
-
export type Context = {
|
6
|
+
export type Context<Resource extends PlainObject, ResourceNode extends Node> = {
|
7
7
|
cursorCache: Cachemap;
|
8
|
-
getters: Getters
|
8
|
+
getters: Getters<Resource, ResourceNode>;
|
9
9
|
groupCursor: string;
|
10
10
|
makeIDCursor: (id: string | number) => string;
|
11
|
-
resourceResolver: ResourceResolver
|
11
|
+
resourceResolver: ResourceResolver<Resource>;
|
12
12
|
};
|
13
13
|
|
14
|
-
|
14
|
+
const requestAndCachePages = async <Resource extends PlainObject, ResourceNode extends Node>(
|
15
15
|
pages: number[],
|
16
|
-
{ cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context,
|
16
|
+
{ cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context<Resource, ResourceNode>,
|
17
17
|
) => {
|
18
18
|
const errors: Error[] = [];
|
19
19
|
|
@@ -48,3 +48,5 @@ export default async (
|
|
48
48
|
|
49
49
|
return { cachedEdges, errors };
|
50
50
|
};
|
51
|
+
|
52
|
+
export default requestAndCachePages;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import Cachemap from "@cachemap/core";
|
2
|
-
import { ConnectionInputOptions, Getters, ResourceResolver } from "../defs";
|
2
|
+
import { ConnectionInputOptions, Getters, Node, PlainObject, ResourceResolver } from "../defs";
|
3
3
|
import extractEdges from "./extractEdges";
|
4
4
|
import extractNodes from "./extractNodes";
|
5
5
|
import getInRangeCachedEdges from "./getInRangeCachedEdges";
|
@@ -8,18 +8,25 @@ import mergeCachedEdges from "./mergeCachedEdges";
|
|
8
8
|
import requestAndCachePages from "./requestAndCachePages";
|
9
9
|
import retrieveCachedConnection from "./retrieveCachedConnection";
|
10
10
|
|
11
|
-
export type Context = {
|
11
|
+
export type Context<Resource extends PlainObject, ResourceNode extends Node> = {
|
12
12
|
cursorCache: Cachemap;
|
13
|
-
getters: Getters
|
13
|
+
getters: Getters<Resource, ResourceNode>;
|
14
14
|
groupCursor: string;
|
15
15
|
makeIDCursor: (id: string | number) => string;
|
16
|
-
resourceResolver: ResourceResolver
|
16
|
+
resourceResolver: ResourceResolver<Resource>;
|
17
17
|
resultsPerPage: number;
|
18
18
|
};
|
19
19
|
|
20
|
-
|
21
|
-
args:
|
22
|
-
{
|
20
|
+
const resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(
|
21
|
+
args: PlainObject & ConnectionInputOptions,
|
22
|
+
{
|
23
|
+
cursorCache,
|
24
|
+
getters,
|
25
|
+
groupCursor,
|
26
|
+
makeIDCursor,
|
27
|
+
resourceResolver,
|
28
|
+
resultsPerPage,
|
29
|
+
}: Context<Resource, ResourceNode>,
|
23
30
|
) => {
|
24
31
|
const {
|
25
32
|
cachedEdges,
|
@@ -51,7 +58,7 @@ export default async (
|
|
51
58
|
};
|
52
59
|
}
|
53
60
|
|
54
|
-
const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages(missingPages, {
|
61
|
+
const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages<Resource, ResourceNode>(missingPages, {
|
55
62
|
cursorCache,
|
56
63
|
getters,
|
57
64
|
groupCursor,
|
@@ -80,3 +87,5 @@ export default async (
|
|
80
87
|
totalCount: totalResults,
|
81
88
|
};
|
82
89
|
};
|
90
|
+
|
91
|
+
export default resolveConnection;
|
@@ -30,8 +30,8 @@ describe("retrieveCachedConnection", () => {
|
|
30
30
|
|
31
31
|
const edges = extractEdges(cachedEdges);
|
32
32
|
expect(edges.length).toBe(5);
|
33
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::1");
|
34
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("5::1");
|
33
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::1");
|
34
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("5::1");
|
35
35
|
expect(hasPreviousPage).toBe(true);
|
36
36
|
expect(hasNextPage).toBe(true);
|
37
37
|
expect(missingPages.length).toBe(0);
|
@@ -59,8 +59,8 @@ describe("retrieveCachedConnection", () => {
|
|
59
59
|
|
60
60
|
const edges = extractEdges(cachedEdges);
|
61
61
|
expect(edges.length).toBe(15);
|
62
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("6::1");
|
63
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("0::3");
|
62
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("6::1");
|
63
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("0::3");
|
64
64
|
expect(hasPreviousPage).toBe(true);
|
65
65
|
expect(hasNextPage).toBe(true);
|
66
66
|
expect(missingPages.length).toBe(0);
|
@@ -88,8 +88,8 @@ describe("retrieveCachedConnection", () => {
|
|
88
88
|
|
89
89
|
const edges = extractEdges(cachedEdges);
|
90
90
|
expect(edges.length).toBe(9);
|
91
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::10");
|
92
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::10");
|
91
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::10");
|
92
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::10");
|
93
93
|
expect(hasPreviousPage).toBe(true);
|
94
94
|
expect(hasNextPage).toBe(false);
|
95
95
|
expect(missingPages.length).toBe(0);
|
@@ -118,8 +118,8 @@ describe("retrieveCachedConnection", () => {
|
|
118
118
|
|
119
119
|
const edges = extractEdges(cachedEdges);
|
120
120
|
expect(edges.length).toBe(29);
|
121
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::8");
|
122
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::10");
|
121
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::8");
|
122
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::10");
|
123
123
|
expect(hasPreviousPage).toBe(true);
|
124
124
|
expect(hasNextPage).toBe(false);
|
125
125
|
expect(missingPages.length).toBe(0);
|
@@ -147,8 +147,8 @@ describe("retrieveCachedConnection", () => {
|
|
147
147
|
|
148
148
|
const edges = extractEdges(cachedEdges);
|
149
149
|
expect(edges.length).toBe(25);
|
150
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::8");
|
151
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("5::10");
|
150
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::8");
|
151
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("5::10");
|
152
152
|
expect(hasPreviousPage).toBe(true);
|
153
153
|
expect(hasNextPage).toBe(false);
|
154
154
|
expect(missingPages.length).toBe(0);
|
@@ -178,8 +178,8 @@ describe("retrieveCachedConnection", () => {
|
|
178
178
|
|
179
179
|
const edges = extractEdges(cachedEdges);
|
180
180
|
expect(edges.length).toBe(25);
|
181
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::8");
|
182
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("5::10");
|
181
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::8");
|
182
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("5::10");
|
183
183
|
expect(hasPreviousPage).toBe(true);
|
184
184
|
expect(hasNextPage).toBe(true);
|
185
185
|
expect(missingPages.length).toBe(0);
|
@@ -207,8 +207,8 @@ describe("retrieveCachedConnection", () => {
|
|
207
207
|
|
208
208
|
const edges = extractEdges(cachedEdges);
|
209
209
|
expect(edges.length).toBe(25);
|
210
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("1::8");
|
211
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("5::10");
|
210
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("1::8");
|
211
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("5::10");
|
212
212
|
expect(hasPreviousPage).toBe(true);
|
213
213
|
expect(hasNextPage).toBe(false);
|
214
214
|
expect(missingPages.length).toBe(0);
|
@@ -238,8 +238,8 @@ describe("retrieveCachedConnection", () => {
|
|
238
238
|
|
239
239
|
const edges = extractEdges(cachedEdges);
|
240
240
|
expect(edges.length).toBe(20);
|
241
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::8");
|
242
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::10");
|
241
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::8");
|
242
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::10");
|
243
243
|
expect(hasPreviousPage).toBe(true);
|
244
244
|
expect(hasNextPage).toBe(false);
|
245
245
|
expect(missingPages.length).toBe(1);
|
@@ -268,8 +268,8 @@ describe("retrieveCachedConnection", () => {
|
|
268
268
|
|
269
269
|
const edges = extractEdges(cachedEdges);
|
270
270
|
expect(edges.length).toBe(20);
|
271
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::8");
|
272
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::10");
|
271
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::8");
|
272
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::10");
|
273
273
|
expect(hasPreviousPage).toBe(true);
|
274
274
|
expect(hasNextPage).toBe(true);
|
275
275
|
expect(missingPages.length).toBe(1);
|
@@ -301,8 +301,8 @@ describe("retrieveCachedConnection", () => {
|
|
301
301
|
|
302
302
|
const edges = extractEdges(cachedEdges);
|
303
303
|
expect(edges.length).toBe(5);
|
304
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("4::10");
|
305
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("8::10");
|
304
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("4::10");
|
305
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("8::10");
|
306
306
|
expect(hasPreviousPage).toBe(true);
|
307
307
|
expect(hasNextPage).toBe(true);
|
308
308
|
expect(missingPages.length).toBe(0);
|
@@ -330,8 +330,8 @@ describe("retrieveCachedConnection", () => {
|
|
330
330
|
|
331
331
|
const edges = extractEdges(cachedEdges);
|
332
332
|
expect(edges.length).toBe(15);
|
333
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("4::9");
|
334
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("8::10");
|
333
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("4::9");
|
334
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("8::10");
|
335
335
|
expect(hasPreviousPage).toBe(true);
|
336
336
|
expect(hasNextPage).toBe(true);
|
337
337
|
expect(missingPages.length).toBe(0);
|
@@ -359,8 +359,8 @@ describe("retrieveCachedConnection", () => {
|
|
359
359
|
|
360
360
|
const edges = extractEdges(cachedEdges);
|
361
361
|
expect(edges.length).toBe(9);
|
362
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::1");
|
363
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("8::1");
|
362
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::1");
|
363
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("8::1");
|
364
364
|
expect(hasPreviousPage).toBe(false);
|
365
365
|
expect(hasNextPage).toBe(true);
|
366
366
|
expect(missingPages.length).toBe(0);
|
@@ -388,8 +388,8 @@ describe("retrieveCachedConnection", () => {
|
|
388
388
|
|
389
389
|
const edges = extractEdges(cachedEdges);
|
390
390
|
expect(edges.length).toBe(27);
|
391
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::1");
|
392
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("6::3");
|
391
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::1");
|
392
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("6::3");
|
393
393
|
expect(hasPreviousPage).toBe(false);
|
394
394
|
expect(hasNextPage).toBe(true);
|
395
395
|
expect(missingPages.length).toBe(0);
|
@@ -417,8 +417,8 @@ describe("retrieveCachedConnection", () => {
|
|
417
417
|
|
418
418
|
const edges = extractEdges(cachedEdges);
|
419
419
|
expect(edges.length).toBe(25);
|
420
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("2::1");
|
421
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("6::3");
|
420
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("2::1");
|
421
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("6::3");
|
422
422
|
expect(hasPreviousPage).toBe(true);
|
423
423
|
expect(hasNextPage).toBe(true);
|
424
424
|
expect(missingPages.length).toBe(0);
|
@@ -447,8 +447,8 @@ describe("retrieveCachedConnection", () => {
|
|
447
447
|
|
448
448
|
const edges = extractEdges(cachedEdges);
|
449
449
|
expect(edges.length).toBe(20);
|
450
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::1");
|
451
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::3");
|
450
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::1");
|
451
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::3");
|
452
452
|
expect(hasPreviousPage).toBe(false);
|
453
453
|
expect(hasNextPage).toBe(true);
|
454
454
|
expect(missingPages.length).toBe(1);
|
@@ -477,8 +477,8 @@ describe("retrieveCachedConnection", () => {
|
|
477
477
|
|
478
478
|
const edges = extractEdges(cachedEdges);
|
479
479
|
expect(edges.length).toBe(20);
|
480
|
-
expect(decode(edges[0].node.id.split("::")[0])).toBe("0::1");
|
481
|
-
expect(decode(edges[edges.length - 1].node.id.split("::")[0])).toBe("9::3");
|
480
|
+
expect(decode((edges[0].node.id as string).split("::")[0])).toBe("0::1");
|
481
|
+
expect(decode((edges[edges.length - 1].node.id as string).split("::")[0])).toBe("9::3");
|
482
482
|
expect(hasPreviousPage).toBe(true);
|
483
483
|
expect(hasNextPage).toBe(true);
|
484
484
|
expect(missingPages.length).toBe(1);
|
package/src/main/index.test.ts
CHANGED
@@ -5,31 +5,27 @@ import { encode } from "js-base64";
|
|
5
5
|
import makeConnectionResolver from ".";
|
6
6
|
import generateCursorCache from "../__testUtils__/generateCursorCache";
|
7
7
|
import generatePageResponse from "../__testUtils__/generatePageResponse";
|
8
|
-
import {
|
8
|
+
import { PlainObject } from "../defs";
|
9
9
|
import removeConnectionInputOptions from "../helpers/removeConnectionInputOptions";
|
10
10
|
|
11
11
|
describe("connectionResolver", () => {
|
12
|
-
const createMakeCursors = (_source:
|
12
|
+
const createMakeCursors = (_source: PlainObject, args: PlainObject) => ({
|
13
13
|
makeGroupCursor: () => encode(JSON.stringify(removeConnectionInputOptions(args))),
|
14
14
|
makeIDCursor: (id: string | number) => encode(`${id}::${JSON.stringify(removeConnectionInputOptions(args))}`),
|
15
15
|
});
|
16
16
|
|
17
|
-
const getters
|
18
|
-
nodes: ({ results }) => results,
|
19
|
-
page: ({ page }) => page,
|
20
|
-
totalPages: ({ totalPages }) => totalPages,
|
21
|
-
totalResults: ({ totalResults }) => totalResults,
|
17
|
+
const getters = {
|
18
|
+
nodes: ({ results }: PlainObject) => results,
|
19
|
+
page: ({ page }: PlainObject) => page,
|
20
|
+
totalPages: ({ totalPages }: PlainObject) => totalPages,
|
21
|
+
totalResults: ({ totalResults }: PlainObject) => totalResults,
|
22
22
|
};
|
23
23
|
|
24
24
|
const resultsPerPage = 10;
|
25
25
|
|
26
26
|
describe("when a cursor is supplied", () => {
|
27
27
|
test("when the cursor is invalid", async () => {
|
28
|
-
const createResourceResolver = (
|
29
|
-
_obj: Record<string, any>,
|
30
|
-
args: Record<string, any>,
|
31
|
-
{ restClient }: Record<string, any>,
|
32
|
-
) => {
|
28
|
+
const createResourceResolver = (_obj: PlainObject, args: PlainObject, { restClient }: PlainObject) => {
|
33
29
|
return async ({ page }: { page: number }) => restClient({ ...removeConnectionInputOptions(args), page });
|
34
30
|
};
|
35
31
|
|
@@ -39,9 +35,9 @@ describe("connectionResolver", () => {
|
|
39
35
|
cursorCache: new Cachemap({
|
40
36
|
name: "GRAPHQL_BOX_CONNECTION_RESOLVER",
|
41
37
|
store: map(),
|
38
|
+
type: "CONNECTION_RESOLVER",
|
42
39
|
}),
|
43
40
|
getters,
|
44
|
-
resolver: result => result,
|
45
41
|
resultsPerPage,
|
46
42
|
});
|
47
43
|
|
@@ -57,11 +53,7 @@ describe("connectionResolver", () => {
|
|
57
53
|
});
|
58
54
|
|
59
55
|
test("when there are NO missing pages in the cache", async () => {
|
60
|
-
const createResourceResolver = (
|
61
|
-
_obj: Record<string, any>,
|
62
|
-
args: Record<string, any>,
|
63
|
-
{ restClient }: Record<string, any>,
|
64
|
-
) => {
|
56
|
+
const createResourceResolver = (_obj: PlainObject, args: PlainObject, { restClient }: PlainObject) => {
|
65
57
|
return async ({ page }: { page: number }) => restClient({ ...removeConnectionInputOptions(args), page });
|
66
58
|
};
|
67
59
|
|
@@ -79,8 +71,7 @@ describe("connectionResolver", () => {
|
|
79
71
|
createMakeCursors,
|
80
72
|
createResourceResolver,
|
81
73
|
cursorCache,
|
82
|
-
getters
|
83
|
-
resolver: result => result,
|
74
|
+
getters,
|
84
75
|
resultsPerPage,
|
85
76
|
});
|
86
77
|
|
@@ -99,9 +90,9 @@ describe("connectionResolver", () => {
|
|
99
90
|
const mock = jest.fn().mockImplementation(page => pageResponse(page));
|
100
91
|
|
101
92
|
const createResourceResolver = (
|
102
|
-
_obj:
|
103
|
-
_args:
|
104
|
-
_context:
|
93
|
+
_obj: PlainObject,
|
94
|
+
_args: PlainObject,
|
95
|
+
_context: PlainObject,
|
105
96
|
_info: GraphQLResolveInfo,
|
106
97
|
) => async ({ page }: { page: number }) => mock(page);
|
107
98
|
|
@@ -119,8 +110,7 @@ describe("connectionResolver", () => {
|
|
119
110
|
createMakeCursors,
|
120
111
|
createResourceResolver,
|
121
112
|
cursorCache,
|
122
|
-
getters
|
123
|
-
resolver: result => result,
|
113
|
+
getters,
|
124
114
|
resultsPerPage,
|
125
115
|
});
|
126
116
|
|
@@ -139,11 +129,7 @@ describe("connectionResolver", () => {
|
|
139
129
|
|
140
130
|
describe("when the first [X] number are requested", () => {
|
141
131
|
test("when there is a fresh cache and there are NO missing pages in the cache", async () => {
|
142
|
-
const createResourceResolver = (
|
143
|
-
_obj: Record<string, any>,
|
144
|
-
args: Record<string, any>,
|
145
|
-
{ restClient }: Record<string, any>,
|
146
|
-
) => {
|
132
|
+
const createResourceResolver = (_obj: PlainObject, args: PlainObject, { restClient }: PlainObject) => {
|
147
133
|
return async ({ page }: { page: number }) => restClient({ ...removeConnectionInputOptions(args), page });
|
148
134
|
};
|
149
135
|
|
@@ -161,8 +147,7 @@ describe("connectionResolver", () => {
|
|
161
147
|
createMakeCursors,
|
162
148
|
createResourceResolver,
|
163
149
|
cursorCache,
|
164
|
-
getters
|
165
|
-
resolver: result => result,
|
150
|
+
getters,
|
166
151
|
resultsPerPage,
|
167
152
|
});
|
168
153
|
|
@@ -180,9 +165,9 @@ describe("connectionResolver", () => {
|
|
180
165
|
const mock = jest.fn().mockImplementation(page => pageResponse(page));
|
181
166
|
|
182
167
|
const createResourceResolver = (
|
183
|
-
_obj:
|
184
|
-
_args:
|
185
|
-
_context:
|
168
|
+
_obj: PlainObject,
|
169
|
+
_args: PlainObject,
|
170
|
+
_context: PlainObject,
|
186
171
|
_info: GraphQLResolveInfo,
|
187
172
|
) => async ({ page }: { page: number }) => mock(page);
|
188
173
|
|
@@ -200,8 +185,7 @@ describe("connectionResolver", () => {
|
|
200
185
|
createMakeCursors,
|
201
186
|
createResourceResolver,
|
202
187
|
cursorCache,
|
203
|
-
getters
|
204
|
-
resolver: result => result,
|
188
|
+
getters,
|
205
189
|
resultsPerPage,
|
206
190
|
});
|
207
191
|
|
@@ -221,23 +205,23 @@ describe("connectionResolver", () => {
|
|
221
205
|
const mock = jest.fn().mockImplementation(page => pageResponse(page));
|
222
206
|
|
223
207
|
const createResourceResolver = (
|
224
|
-
_obj:
|
225
|
-
_args:
|
226
|
-
_context:
|
208
|
+
_obj: PlainObject,
|
209
|
+
_args: PlainObject,
|
210
|
+
_context: PlainObject,
|
227
211
|
_info: GraphQLResolveInfo,
|
228
212
|
) => async ({ page }: { page: number }) => mock(page);
|
229
213
|
|
230
214
|
const cursorCache = new Cachemap({
|
231
215
|
name: "cursorCache",
|
232
216
|
store: map(),
|
217
|
+
type: "someType",
|
233
218
|
});
|
234
219
|
|
235
220
|
const connectionResolver = makeConnectionResolver({
|
236
221
|
createMakeCursors,
|
237
222
|
createResourceResolver,
|
238
223
|
cursorCache,
|
239
|
-
getters
|
240
|
-
resolver: result => result,
|
224
|
+
getters,
|
241
225
|
resultsPerPage,
|
242
226
|
});
|
243
227
|
|
@@ -255,11 +239,7 @@ describe("connectionResolver", () => {
|
|
255
239
|
|
256
240
|
describe("when the last [X] number are requested", () => {
|
257
241
|
test("when there is a fresh cache and there are NO missing pages in the cache", async () => {
|
258
|
-
const createResourceResolver = (
|
259
|
-
_obj: Record<string, any>,
|
260
|
-
args: Record<string, any>,
|
261
|
-
{ restClient }: Record<string, any>,
|
262
|
-
) => {
|
242
|
+
const createResourceResolver = (_obj: PlainObject, args: PlainObject, { restClient }: PlainObject) => {
|
263
243
|
return async ({ page }: { page: number }) => restClient({ ...removeConnectionInputOptions(args), page });
|
264
244
|
};
|
265
245
|
|
@@ -277,8 +257,7 @@ describe("connectionResolver", () => {
|
|
277
257
|
createMakeCursors,
|
278
258
|
createResourceResolver,
|
279
259
|
cursorCache,
|
280
|
-
getters
|
281
|
-
resolver: result => result,
|
260
|
+
getters,
|
282
261
|
resultsPerPage,
|
283
262
|
});
|
284
263
|
|
@@ -296,9 +275,9 @@ describe("connectionResolver", () => {
|
|
296
275
|
const mock = jest.fn().mockImplementation(page => pageResponse(page));
|
297
276
|
|
298
277
|
const createResourceResolver = (
|
299
|
-
_obj:
|
300
|
-
_args:
|
301
|
-
_context:
|
278
|
+
_obj: PlainObject,
|
279
|
+
_args: PlainObject,
|
280
|
+
_context: PlainObject,
|
302
281
|
_info: GraphQLResolveInfo,
|
303
282
|
) => async ({ page }: { page: number }) => mock(page);
|
304
283
|
|
@@ -316,8 +295,7 @@ describe("connectionResolver", () => {
|
|
316
295
|
createMakeCursors,
|
317
296
|
createResourceResolver,
|
318
297
|
cursorCache,
|
319
|
-
getters
|
320
|
-
resolver: result => result,
|
298
|
+
getters,
|
321
299
|
resultsPerPage,
|
322
300
|
});
|
323
301
|
|
@@ -337,23 +315,23 @@ describe("connectionResolver", () => {
|
|
337
315
|
const mock = jest.fn().mockImplementation(page => pageResponse(page));
|
338
316
|
|
339
317
|
const createResourceResolver = (
|
340
|
-
_obj:
|
341
|
-
_args:
|
342
|
-
_context:
|
318
|
+
_obj: PlainObject,
|
319
|
+
_args: PlainObject,
|
320
|
+
_context: PlainObject,
|
343
321
|
_info: GraphQLResolveInfo,
|
344
322
|
) => async ({ page }: { page: number }) => mock(page);
|
345
323
|
|
346
324
|
const cursorCache = new Cachemap({
|
347
325
|
name: "cursorCache",
|
348
326
|
store: map(),
|
327
|
+
type: "someType",
|
349
328
|
});
|
350
329
|
|
351
330
|
const connectionResolver = makeConnectionResolver({
|
352
331
|
createMakeCursors,
|
353
332
|
createResourceResolver,
|
354
333
|
cursorCache,
|
355
|
-
getters
|
356
|
-
resolver: result => result,
|
334
|
+
getters,
|
357
335
|
resultsPerPage,
|
358
336
|
});
|
359
337
|
|
package/src/main/index.ts
CHANGED
@@ -1,21 +1,27 @@
|
|
1
1
|
import { GraphQLResolveInfo } from "graphql";
|
2
|
-
import { Connection, ConnectionInputOptions, ConnectionResolverUserOptions } from "../defs";
|
2
|
+
import { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, Node, PlainObject } from "../defs";
|
3
3
|
import isCursorSupplied from "../helpers/isCursorSupplied";
|
4
4
|
import requestAndCachePages from "../helpers/requestAndCachePages";
|
5
5
|
import resolveConnection from "../helpers/resolveConnection";
|
6
6
|
import validateCursor from "../helpers/validateCursor";
|
7
7
|
|
8
|
-
|
8
|
+
const main = <
|
9
|
+
Source extends PlainObject,
|
10
|
+
Args extends PlainObject,
|
11
|
+
Ctx extends PlainObject,
|
12
|
+
Resource extends PlainObject,
|
13
|
+
ResourceNode extends Node
|
14
|
+
>({
|
9
15
|
cursorCache,
|
10
16
|
createMakeCursors,
|
11
17
|
createResourceResolver,
|
12
18
|
getters,
|
13
|
-
resolver,
|
19
|
+
resolver = result => result,
|
14
20
|
resultsPerPage,
|
15
|
-
}: ConnectionResolverUserOptions) => async (
|
16
|
-
source:
|
17
|
-
args:
|
18
|
-
context:
|
21
|
+
}: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) => async (
|
22
|
+
source: Source,
|
23
|
+
args: Args & ConnectionInputOptions,
|
24
|
+
context: Ctx,
|
19
25
|
info: GraphQLResolveInfo,
|
20
26
|
): Promise<Connection> => {
|
21
27
|
try {
|
@@ -68,7 +74,7 @@ export default ({
|
|
68
74
|
);
|
69
75
|
}
|
70
76
|
|
71
|
-
await requestAndCachePages([1], {
|
77
|
+
await requestAndCachePages<Resource, ResourceNode>([1], {
|
72
78
|
cursorCache,
|
73
79
|
getters,
|
74
80
|
groupCursor,
|
@@ -90,3 +96,5 @@ export default ({
|
|
90
96
|
throw e;
|
91
97
|
}
|
92
98
|
};
|
99
|
+
|
100
|
+
export default main;
|