@graphql-box/connection-resolver 0.1.4 → 0.1.8

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.
Files changed (36) hide show
  1. package/lib/browser/index.js.map +1 -1
  2. package/lib/browser/production.analysis.txt +18 -18
  3. package/lib/main/__testUtils__/generateCursorCache.js +2 -1
  4. package/lib/main/__testUtils__/generateCursorCache.js.map +1 -1
  5. package/lib/main/helpers/requestAndCachePages.js +2 -1
  6. package/lib/main/helpers/requestAndCachePages.js.map +1 -1
  7. package/lib/main/helpers/resolveConnection.js +2 -1
  8. package/lib/main/helpers/resolveConnection.js.map +1 -1
  9. package/lib/main/main/index.js +2 -1
  10. package/lib/main/main/index.js.map +1 -1
  11. package/lib/module/__testUtils__/generateCursorCache.js +2 -1
  12. package/lib/module/__testUtils__/generateCursorCache.js.map +1 -1
  13. package/lib/module/helpers/requestAndCachePages.js +5 -2
  14. package/lib/module/helpers/requestAndCachePages.js.map +1 -1
  15. package/lib/module/helpers/resolveConnection.js +5 -2
  16. package/lib/module/helpers/resolveConnection.js.map +1 -1
  17. package/lib/module/main/index.js +5 -2
  18. package/lib/module/main/index.js.map +1 -1
  19. package/lib/types/__testUtils__/generateCursorCache.d.ts.map +1 -1
  20. package/lib/types/defs/index.d.ts +15 -15
  21. package/lib/types/defs/index.d.ts.map +1 -1
  22. package/lib/types/helpers/requestAndCachePages.d.ts +7 -7
  23. package/lib/types/helpers/requestAndCachePages.d.ts.map +1 -1
  24. package/lib/types/helpers/resolveConnection.d.ts +7 -7
  25. package/lib/types/helpers/resolveConnection.d.ts.map +1 -1
  26. package/lib/types/main/index.d.ts +3 -3
  27. package/lib/types/main/index.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/__testUtils__/generateCursorCache.ts +1 -0
  30. package/src/defs/index.ts +31 -23
  31. package/src/helpers/requestAndCachePages.ts +8 -6
  32. package/src/helpers/resolveConnection.ts +16 -7
  33. package/src/helpers/retrieveCachedConnection.test.ts +32 -32
  34. package/src/helpers/validateCursor.test.ts +1 -0
  35. package/src/main/index.test.ts +9 -6
  36. package/src/main/index.ts +15 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/main/index.ts"],"names":["isCursorSupplied","requestAndCachePages","resolveConnection","validateCursor","cursorCache","createMakeCursors","createResourceResolver","getters","resolver","result","resultsPerPage","source","args","context","info","makeGroupCursor","makeIDCursor","resourceResolver","groupCursor","cursorError","edges","errors","nodes","pageInfo","hasNextPage","hasPreviousPage","totalCount","has","e"],"mappings":";AAEA,OAAOA,gBAAP,MAA6B,6BAA7B;AACA,OAAOC,oBAAP,MAAiC,iCAAjC;AACA,OAAOC,iBAAP,MAA8B,8BAA9B;AACA,OAAOC,cAAP,MAA2B,2BAA3B;AAEA,gBAAe,CAAC;AACdC,EAAAA,WADc;AAEdC,EAAAA,iBAFc;AAGdC,EAAAA,sBAHc;AAIdC,EAAAA,OAJc;AAKdC,EAAAA,QAAQ,GAAGC,MAAM,IAAIA,MALP;AAMdC,EAAAA;AANc,CAAD,KAOsB,OACnCC,MADmC,EAEnCC,IAFmC,EAGnCC,OAHmC,EAInCC,IAJmC,KAKX;AACxB,MAAI;AACF,UAAM;AAAEC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAAoCX,iBAAiB,CAACM,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA3D;AACA,UAAMG,gBAAgB,GAAGX,sBAAsB,CAACK,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA/C;AACA,UAAMI,WAAW,GAAGH,eAAe,EAAnC;;AAEA,QAAIf,gBAAgB,CAACY,IAAD,CAApB,EAA4B;AAC1B,YAAMO,WAAW,GAAG,MAAMhB,cAAc,CAACS,IAAD,EAAOE,IAAP,EAAa;AACnDV,QAAAA,WADmD;AAEnDc,QAAAA,WAFmD;AAGnDR,QAAAA;AAHmD,OAAb,CAAxC;;AAMA,UAAIS,WAAJ,EAAiB;AACf,eAAOX,QAAQ,CAAC;AACdY,UAAAA,KAAK,EAAE,EADO;AAEdC,UAAAA,MAAM,EAAE,CAACF,WAAD,CAFM;AAGdG,UAAAA,KAAK,EAAE,EAHO;AAIdC,UAAAA,QAAQ,EAAE;AACRC,YAAAA,WAAW,EAAE,KADL;AAERC,YAAAA,eAAe,EAAE;AAFT,WAJI;AAQdC,UAAAA,UAAU,EAAE;AARE,SAAD,CAAf;AAUD;;AAED,aAAOlB,QAAQ,CACb,MAAMN,iBAAiB,CAACU,IAAD,EAAO;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAP,CADV,CAAf;AAUD;;AAED,QAAI,MAAMN,WAAW,CAACuB,GAAZ,CAAiB,GAAET,WAAY,WAA/B,CAAV,EAAsD;AACpD,aAAOV,QAAQ,CACb,MAAMN,iBAAiB,CAACU,IAAD,EAAO;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAP,CADV,CAAf;AAUD;;AAED,UAAMT,oBAAoB,CAAC,CAAC,CAAD,CAAD,EAAM;AAC9BG,MAAAA,WAD8B;AAE9BG,MAAAA,OAF8B;AAG9BW,MAAAA,WAH8B;AAI9BF,MAAAA,YAJ8B;AAK9BC,MAAAA;AAL8B,KAAN,CAA1B;AAQA,WAAOT,QAAQ,CACb,MAAMN,iBAAiB,CAACU,IAAD,EAAO;AAC5BR,MAAAA,WAD4B;AAE5BG,MAAAA,OAF4B;AAG5BW,MAAAA,WAH4B;AAI5BF,MAAAA,YAJ4B;AAK5BC,MAAAA,gBAL4B;AAM5BP,MAAAA;AAN4B,KAAP,CADV,CAAf;AAUD,GApED,CAoEE,OAAOkB,CAAP,EAAU;AACV,UAAMA,CAAN;AACD;AACF,CApFD","sourcesContent":["import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nexport default ({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions) => async (\n source: PlainObject,\n args: PlainObject & ConnectionInputOptions,\n context: PlainObject,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../src/main/index.ts"],"names":["isCursorSupplied","requestAndCachePages","resolveConnection","validateCursor","main","cursorCache","createMakeCursors","createResourceResolver","getters","resolver","result","resultsPerPage","source","args","context","info","makeGroupCursor","makeIDCursor","resourceResolver","groupCursor","cursorError","edges","errors","nodes","pageInfo","hasNextPage","hasPreviousPage","totalCount","has","e"],"mappings":";AAEA,OAAOA,gBAAP,MAA6B,6BAA7B;AACA,OAAOC,oBAAP,MAAiC,iCAAjC;AACA,OAAOC,iBAAP,MAA8B,8BAA9B;AACA,OAAOC,cAAP,MAA2B,2BAA3B;;AAEA,MAAMC,IAAI,GAAG,CAMX;AACAC,EAAAA,WADA;AAEAC,EAAAA,iBAFA;AAGAC,EAAAA,sBAHA;AAIAC,EAAAA,OAJA;AAKAC,EAAAA,QAAQ,GAAGC,MAAM,IAAIA,MALrB;AAMAC,EAAAA;AANA,CANW,KAamE,OAC9EC,MAD8E,EAE9EC,IAF8E,EAG9EC,OAH8E,EAI9EC,IAJ8E,KAKtD;AACxB,MAAI;AACF,UAAM;AAAEC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAAoCX,iBAAiB,CAACM,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA3D;AACA,UAAMG,gBAAgB,GAAGX,sBAAsB,CAACK,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA/C;AACA,UAAMI,WAAW,GAAGH,eAAe,EAAnC;;AAEA,QAAIhB,gBAAgB,CAACa,IAAD,CAApB,EAA4B;AAC1B,YAAMO,WAAW,GAAG,MAAMjB,cAAc,CAACU,IAAD,EAAOE,IAAP,EAAa;AACnDV,QAAAA,WADmD;AAEnDc,QAAAA,WAFmD;AAGnDR,QAAAA;AAHmD,OAAb,CAAxC;;AAMA,UAAIS,WAAJ,EAAiB;AACf,eAAOX,QAAQ,CAAC;AACdY,UAAAA,KAAK,EAAE,EADO;AAEdC,UAAAA,MAAM,EAAE,CAACF,WAAD,CAFM;AAGdG,UAAAA,KAAK,EAAE,EAHO;AAIdC,UAAAA,QAAQ,EAAE;AACRC,YAAAA,WAAW,EAAE,KADL;AAERC,YAAAA,eAAe,EAAE;AAFT,WAJI;AAQdC,UAAAA,UAAU,EAAE;AARE,SAAD,CAAf;AAUD;;AAED,aAAOlB,QAAQ,CACb,MAAMP,iBAAiB,CAACW,IAAD,EAAO;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAP,CADV,CAAf;AAUD;;AAED,QAAI,MAAMN,WAAW,CAACuB,GAAZ,CAAiB,GAAET,WAAY,WAA/B,CAAV,EAAsD;AACpD,aAAOV,QAAQ,CACb,MAAMP,iBAAiB,CAACW,IAAD,EAAO;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAP,CADV,CAAf;AAUD;;AAED,UAAMV,oBAAoB,CAAyB,CAAC,CAAD,CAAzB,EAA8B;AACtDI,MAAAA,WADsD;AAEtDG,MAAAA,OAFsD;AAGtDW,MAAAA,WAHsD;AAItDF,MAAAA,YAJsD;AAKtDC,MAAAA;AALsD,KAA9B,CAA1B;AAQA,WAAOT,QAAQ,CACb,MAAMP,iBAAiB,CAACW,IAAD,EAAO;AAC5BR,MAAAA,WAD4B;AAE5BG,MAAAA,OAF4B;AAG5BW,MAAAA,WAH4B;AAI5BF,MAAAA,YAJ4B;AAK5BC,MAAAA,gBAL4B;AAM5BP,MAAAA;AAN4B,KAAP,CADV,CAAf;AAUD,GApED,CAoEE,OAAOkB,CAAP,EAAU;AACV,UAAMA,CAAN;AACD;AACF,CA1FD;;AA4FA,eAAezB,IAAf","sourcesContent":["import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, Node, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nconst main = <\n Source extends PlainObject | undefined,\n Args extends PlainObject,\n Ctx extends PlainObject,\n Resource extends PlainObject,\n ResourceNode extends Node\n>({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) => async (\n source: Source,\n args: Args & ConnectionInputOptions,\n context: Ctx,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages<Resource, ResourceNode>([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n\nexport default main;\n"],"file":"index.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateCursorCache.d.ts","sourceRoot":"","sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,oBAAY,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;0FAE0F,MAAM;AAAlG,wBAwCE"}
1
+ {"version":3,"file":"generateCursorCache.d.ts","sourceRoot":"","sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,oBAAY,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;0FAE0F,MAAM;AAAlG,wBAyCE"}
@@ -4,7 +4,7 @@ export declare type PlainObject = {
4
4
  [key: string]: any;
5
5
  };
6
6
  export declare type Node = PlainObject & {
7
- id: string;
7
+ id: string | number;
8
8
  };
9
9
  export declare type Direction = "backward" | "forward";
10
10
  export declare type CursorCacheEntry = {
@@ -42,28 +42,28 @@ export declare type Connection = {
42
42
  pageInfo: PageInfo;
43
43
  totalCount: number;
44
44
  };
45
- export interface ResourceResponse extends Response {
46
- data?: PlainObject;
45
+ export interface ResourceResponse<Resource extends PlainObject> extends Response {
46
+ data?: Resource;
47
47
  errors?: Error[];
48
48
  }
49
- export declare type ResourceResolver = (args: {
49
+ export declare type ResourceResolver<Resource extends PlainObject> = (args: {
50
50
  page: number;
51
- }) => Promise<ResourceResponse>;
52
- export declare type CreateResourceResolver<Src = PlainObject, Args = PlainObject, Cxt = PlainObject> = (source: PlainObject & Src, args: PlainObject & Args, context: PlainObject & Cxt, info: GraphQLResolveInfo) => ResourceResolver;
53
- export interface Getters {
54
- nodes: (obj: PlainObject) => Node[];
55
- page: (obj: PlainObject) => number;
56
- totalPages: (obj: PlainObject) => number;
57
- totalResults: (obj: PlainObject) => number;
51
+ }) => Promise<ResourceResponse<Resource>>;
52
+ export declare type CreateResourceResolver<Source extends PlainObject | undefined, Args extends PlainObject, Ctx extends PlainObject, Resource extends PlainObject> = (source: Source, args: Args, context: Ctx, info: GraphQLResolveInfo) => ResourceResolver<Resource>;
53
+ export interface Getters<Resource extends PlainObject, ResourceNode extends Node> {
54
+ nodes: (obj: Resource) => ResourceNode[];
55
+ page: (obj: Resource) => number;
56
+ totalPages: (obj: Resource) => number;
57
+ totalResults: (obj: Resource) => number;
58
58
  }
59
- export interface ConnectionResolverUserOptions {
60
- createMakeCursors: (source: PlainObject, args: PlainObject, context: PlainObject, info: GraphQLResolveInfo) => {
59
+ export interface ConnectionResolverUserOptions<Source extends PlainObject | undefined, Args extends PlainObject, Ctx extends PlainObject, Resource extends PlainObject, ResourceNode extends Node> {
60
+ createMakeCursors: (source: Source, args: Args, context: Ctx, info: GraphQLResolveInfo) => {
61
61
  makeGroupCursor: () => string;
62
62
  makeIDCursor: (id: string | number) => string;
63
63
  };
64
- createResourceResolver: CreateResourceResolver;
64
+ createResourceResolver: CreateResourceResolver<Source, Args, Ctx, Resource>;
65
65
  cursorCache: Cachemap;
66
- getters: Getters;
66
+ getters: Getters<Resource, ResourceNode>;
67
67
  resolver?: (args: Connection) => Connection;
68
68
  resultsPerPage: number;
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/defs/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/defs/index.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,21 @@
1
1
  import Cachemap from "@cachemap/core";
2
- import { Getters, ResourceResolver } from "../defs";
3
- export declare type Context = {
2
+ import { Getters, Node, PlainObject, ResourceResolver } from "../defs";
3
+ export declare type Context<Resource extends PlainObject, ResourceNode extends Node> = {
4
4
  cursorCache: Cachemap;
5
- getters: Getters;
5
+ getters: Getters<Resource, ResourceNode>;
6
6
  groupCursor: string;
7
7
  makeIDCursor: (id: string | number) => string;
8
- resourceResolver: ResourceResolver;
8
+ resourceResolver: ResourceResolver<Resource>;
9
9
  };
10
- declare const _default: (pages: number[], { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context) => Promise<{
10
+ declare const requestAndCachePages: <Resource extends PlainObject, ResourceNode extends Node>(pages: number[], { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context<Resource, ResourceNode>) => Promise<{
11
11
  cachedEdges: {
12
12
  edges: {
13
- node: import("../defs").Node;
13
+ node: Node;
14
14
  cursor: string;
15
15
  }[];
16
16
  pageNumber: number;
17
17
  }[];
18
18
  errors: Error[];
19
19
  }>;
20
- export default _default;
20
+ export default requestAndCachePages;
21
21
  //# sourceMappingURL=requestAndCachePages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"requestAndCachePages.d.ts","sourceRoot":"","sources":["../../../src/helpers/requestAndCachePages.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIpD,oBAAY,OAAO,GAAG;IACpB,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;gCAGO,MAAM,EAAE,yEACwD,OAAO;;;;;;;;;;AAFhF,wBAoCE"}
1
+ {"version":3,"file":"requestAndCachePages.d.ts","sourceRoot":"","sources":["../../../src/helpers/requestAndCachePages.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIvE,oBAAY,OAAO,CAAC,QAAQ,SAAS,WAAW,EAAE,YAAY,SAAS,IAAI,IAAI;IAC7E,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;CAC9C,CAAC;AAEF,QAAA,MAAM,oBAAoB,mEACjB,MAAM,EAAE;;;;;;;;;EAmChB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -1,17 +1,17 @@
1
1
  import Cachemap from "@cachemap/core";
2
- import { ConnectionInputOptions, Getters, PlainObject, ResourceResolver } from "../defs";
3
- export declare type Context = {
2
+ import { ConnectionInputOptions, Getters, Node, PlainObject, ResourceResolver } from "../defs";
3
+ export declare type Context<Resource extends PlainObject, ResourceNode extends Node> = {
4
4
  cursorCache: Cachemap;
5
- getters: Getters;
5
+ getters: Getters<Resource, ResourceNode>;
6
6
  groupCursor: string;
7
7
  makeIDCursor: (id: string | number) => string;
8
- resourceResolver: ResourceResolver;
8
+ resourceResolver: ResourceResolver<Resource>;
9
9
  resultsPerPage: number;
10
10
  };
11
- declare const _default: (args: PlainObject & ConnectionInputOptions, { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context) => Promise<{
11
+ declare const resolveConnection: <Resource extends PlainObject, ResourceNode extends Node>(args: PlainObject & ConnectionInputOptions, { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage, }: Context<Resource, ResourceNode>) => Promise<{
12
12
  edges: import("../defs").Edge[];
13
13
  errors: Error[];
14
- nodes: import("../defs").Node[];
14
+ nodes: Node[];
15
15
  pageInfo: {
16
16
  endCursor: string;
17
17
  hasNextPage: boolean;
@@ -20,5 +20,5 @@ declare const _default: (args: PlainObject & ConnectionInputOptions, { cursorCac
20
20
  };
21
21
  totalCount: number;
22
22
  }>;
23
- export default _default;
23
+ export default resolveConnection;
24
24
  //# sourceMappingURL=resolveConnection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveConnection.d.ts","sourceRoot":"","sources":["../../../src/helpers/resolveConnection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AASzF,oBAAY,OAAO,GAAG;IACpB,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;+BAGM,WAAW,GAAG,sBAAsB,yFAC6C,OAAO;;;;;;;;;;;;AAFhG,wBA8DE"}
1
+ {"version":3,"file":"resolveConnection.d.ts","sourceRoot":"","sources":["../../../src/helpers/resolveConnection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAS/F,oBAAY,OAAO,CAAC,QAAQ,SAAS,WAAW,EAAE,YAAY,SAAS,IAAI,IAAI;IAC7E,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,iBAAiB,kEACf,WAAW,GAAG,sBAAsB;;;;;;;;;;;EAoE3C,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { GraphQLResolveInfo } from "graphql";
2
- import { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, PlainObject } from "../defs";
3
- declare const _default: ({ cursorCache, createMakeCursors, createResourceResolver, getters, resolver, resultsPerPage, }: ConnectionResolverUserOptions) => (source: PlainObject, args: PlainObject & ConnectionInputOptions, context: PlainObject, info: GraphQLResolveInfo) => Promise<Connection>;
4
- export default _default;
2
+ import { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, Node, PlainObject } from "../defs";
3
+ declare const main: <Source extends PlainObject | undefined, Args extends PlainObject, Ctx extends PlainObject, Resource extends PlainObject, ResourceNode extends Node>({ cursorCache, createMakeCursors, createResourceResolver, getters, resolver, resultsPerPage, }: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) => (source: Source, args: Args & ConnectionInputOptions, context: Ctx, info: GraphQLResolveInfo) => Promise<Connection>;
4
+ export default main;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;yHAatG,6BAA6B,cACtB,WAAW,QACb,WAAW,GAAG,sBAAsB,WACjC,WAAW,QACd,kBAAkB,KACvB,OAAO,CAAC,UAAU,CAAC;AAZtB,wBAoFE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM/G,QAAA,MAAM,IAAI,8YAiBF,kBAAkB,KACvB,OAAO,CAAC,UAAU,CAwEpB,CAAC;AAEF,eAAe,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-box/connection-resolver",
3
- "version": "0.1.4",
3
+ "version": "0.1.8",
4
4
  "description": "The GraphQL Box connection manager module.",
5
5
  "keywords": [
6
6
  "graphql-box",
@@ -16,6 +16,7 @@ export default async ({ group, pageRanges = [], resultsPerPage, totalPages, tota
16
16
  const cursorCache = new Cachemap({
17
17
  name: "cursorCache",
18
18
  store: map(),
19
+ type: "someType",
19
20
  });
20
21
 
21
22
  const headers = new Headers({ "Cache-Control": "max-age=60" });
package/src/defs/index.ts CHANGED
@@ -5,7 +5,7 @@ export type PlainObject = {
5
5
  [key: string]: any;
6
6
  };
7
7
 
8
- export type Node = PlainObject & { id: string };
8
+ export type Node = PlainObject & { id: string | number };
9
9
 
10
10
  export type Direction = "backward" | "forward";
11
11
 
@@ -51,40 +51,48 @@ export type Connection = {
51
51
  totalCount: number;
52
52
  };
53
53
 
54
- export interface ResourceResponse extends Response {
55
- data?: PlainObject;
54
+ export interface ResourceResponse<Resource extends PlainObject> extends Response {
55
+ data?: Resource;
56
56
  errors?: Error[];
57
57
  }
58
58
 
59
- export type ResourceResolver = (args: { page: number }) => Promise<ResourceResponse>;
60
-
61
- export type CreateResourceResolver<Src = PlainObject, Args = PlainObject, Cxt = PlainObject> = (
62
- source: PlainObject & Src,
63
- args: PlainObject & Args,
64
- context: PlainObject & Cxt,
65
- info: GraphQLResolveInfo,
66
- ) => ResourceResolver;
67
-
68
- export interface Getters {
69
- nodes: (obj: PlainObject) => Node[];
70
- page: (obj: PlainObject) => number;
71
- totalPages: (obj: PlainObject) => number;
72
- totalResults: (obj: PlainObject) => number;
59
+ export type ResourceResolver<Resource extends PlainObject> = (args: {
60
+ page: number;
61
+ }) => Promise<ResourceResponse<Resource>>;
62
+
63
+ export type CreateResourceResolver<
64
+ Source extends PlainObject | undefined,
65
+ Args extends PlainObject,
66
+ Ctx extends PlainObject,
67
+ Resource extends PlainObject
68
+ > = (source: Source, args: Args, context: Ctx, info: GraphQLResolveInfo) => ResourceResolver<Resource>;
69
+
70
+ export interface Getters<Resource extends PlainObject, ResourceNode extends Node> {
71
+ nodes: (obj: Resource) => ResourceNode[];
72
+ page: (obj: Resource) => number;
73
+ totalPages: (obj: Resource) => number;
74
+ totalResults: (obj: Resource) => number;
73
75
  }
74
76
 
75
- export interface ConnectionResolverUserOptions {
77
+ export interface ConnectionResolverUserOptions<
78
+ Source extends PlainObject | undefined,
79
+ Args extends PlainObject,
80
+ Ctx extends PlainObject,
81
+ Resource extends PlainObject,
82
+ ResourceNode extends Node
83
+ > {
76
84
  createMakeCursors: (
77
- source: PlainObject,
78
- args: PlainObject,
79
- context: PlainObject,
85
+ source: Source,
86
+ args: Args,
87
+ context: Ctx,
80
88
  info: GraphQLResolveInfo,
81
89
  ) => {
82
90
  makeGroupCursor: () => string;
83
91
  makeIDCursor: (id: string | number) => string;
84
92
  };
85
- createResourceResolver: CreateResourceResolver;
93
+ createResourceResolver: CreateResourceResolver<Source, Args, Ctx, Resource>;
86
94
  cursorCache: Cachemap;
87
- getters: Getters;
95
+ getters: Getters<Resource, ResourceNode>;
88
96
  resolver?: (args: Connection) => Connection;
89
97
  resultsPerPage: number;
90
98
  }
@@ -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
- export default async (
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, PlainObject, 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
- export default async (
20
+ const resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(
21
21
  args: PlainObject & ConnectionInputOptions,
22
- { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context,
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);
@@ -8,6 +8,7 @@ describe("validateCursor", () => {
8
8
  cursorCache: new Cachemap({
9
9
  name: "GRAPHQL_BOX_CONNECTION_RESOLVER",
10
10
  store: map(),
11
+ type: "CONNECTION_RESOLVER",
11
12
  }),
12
13
  groupCursor: "abcdefg",
13
14
  resultsPerPage: 10,
@@ -5,7 +5,7 @@ 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 { Getters, PlainObject } from "../defs";
8
+ import { PlainObject } from "../defs";
9
9
  import removeConnectionInputOptions from "../helpers/removeConnectionInputOptions";
10
10
 
11
11
  describe("connectionResolver", () => {
@@ -14,11 +14,11 @@ describe("connectionResolver", () => {
14
14
  makeIDCursor: (id: string | number) => encode(`${id}::${JSON.stringify(removeConnectionInputOptions(args))}`),
15
15
  });
16
16
 
17
- const getters: 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;
@@ -35,6 +35,7 @@ describe("connectionResolver", () => {
35
35
  cursorCache: new Cachemap({
36
36
  name: "GRAPHQL_BOX_CONNECTION_RESOLVER",
37
37
  store: map(),
38
+ type: "CONNECTION_RESOLVER",
38
39
  }),
39
40
  getters,
40
41
  resultsPerPage,
@@ -213,6 +214,7 @@ describe("connectionResolver", () => {
213
214
  const cursorCache = new Cachemap({
214
215
  name: "cursorCache",
215
216
  store: map(),
217
+ type: "someType",
216
218
  });
217
219
 
218
220
  const connectionResolver = makeConnectionResolver({
@@ -322,6 +324,7 @@ describe("connectionResolver", () => {
322
324
  const cursorCache = new Cachemap({
323
325
  name: "cursorCache",
324
326
  store: map(),
327
+ type: "someType",
325
328
  });
326
329
 
327
330
  const connectionResolver = makeConnectionResolver({