joist-graphql-resolver-utils 2.2.0-next.9 → 2.3.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.
@@ -0,0 +1,33 @@
1
+ import { type Entity, type MaybeAbstractEntityConstructor } from "joist-core";
2
+ import { type ContextWithEm, type PaginationFilter } from "./paginationUtils";
3
+ type CursorArgs<T extends Entity, F extends object = PaginationFilter<T>> = {
4
+ filter?: F | null;
5
+ first?: number | null;
6
+ after?: string | null;
7
+ last?: number | null;
8
+ before?: string | null;
9
+ };
10
+ /** Returns a cursor connection shape for a generated query resolver. */
11
+ export declare function paginateCursor<T extends Entity, F extends object = PaginationFilter<T>>(ctx: ContextWithEm, type: MaybeAbstractEntityConstructor<T>, args: CursorArgs<T, F>): Promise<{
12
+ edges: {
13
+ node: T;
14
+ cursor: string;
15
+ }[];
16
+ nodes: T[];
17
+ pageInfo: CursorPageInfo<T>;
18
+ }>;
19
+ /** Lazily computes cursor page fields. */
20
+ export declare class CursorPageInfo<T extends Entity = Entity> {
21
+ #private;
22
+ constructor(ctx: ContextWithEm, type: MaybeAbstractEntityConstructor<T>, filter: PaginationFilter<T>, edges: {
23
+ node: T;
24
+ cursor: string;
25
+ }[]);
26
+ get startCursor(): string | undefined;
27
+ get endCursor(): string | undefined;
28
+ get hasNextPage(): Promise<boolean>;
29
+ get hasPreviousPage(): Promise<boolean>;
30
+ get totalCount(): Promise<number>;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=cursorPagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorPagination.d.ts","sourceRoot":"","sources":["../src/cursorPagination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,8BAA8B,EAEpC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,aAAa,EAAgB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5F,KAAK,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI;IAC1E,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,wEAAwE;AACxE,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAC3F,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,8BAA8B,CAAC,CAAC,CAAC,EACvC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,CAa5F;AAED,0CAA0C;AAC1C,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;;gBAUjD,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,8BAA8B,CAAC,CAAC,CAAC,EACvC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;IAQtC,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAElC;IAED,IAAI,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtC;IAED,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhC;CAQF"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CursorPageInfo = void 0;
4
+ exports.paginateCursor = paginateCursor;
5
+ const paginationUtils_1 = require("./paginationUtils");
6
+ /** Returns a cursor connection shape for a generated query resolver. */
7
+ async function paginateCursor(ctx, type, args) {
8
+ const limit = args.first ?? args.last ?? paginationUtils_1.defaultLimit;
9
+ const baseFilter = (args.filter ?? {});
10
+ const filter = withCursorFilter(baseFilter, args);
11
+ const orderBy = { id: args.last ? "DESC" : "ASC" };
12
+ const nodes = await ctx.em.findGql(type, filter, { limit, orderBy });
13
+ const orderedNodes = args.last ? [...nodes].reverse() : nodes;
14
+ const edges = orderedNodes.map((node) => ({ node, cursor: encodeCursor(String(node.id)) }));
15
+ return {
16
+ edges,
17
+ nodes: orderedNodes,
18
+ pageInfo: new CursorPageInfo(ctx, type, baseFilter, edges),
19
+ };
20
+ }
21
+ /** Lazily computes cursor page fields. */
22
+ class CursorPageInfo {
23
+ #ctx;
24
+ #edges;
25
+ #filter;
26
+ #hasNextPagePromise;
27
+ #hasPreviousPagePromise;
28
+ #totalCountPromise;
29
+ #type;
30
+ constructor(ctx, type, filter, edges) {
31
+ this.#ctx = ctx;
32
+ this.#type = type;
33
+ this.#filter = filter;
34
+ this.#edges = edges;
35
+ }
36
+ get startCursor() {
37
+ return this.#edges[0]?.cursor;
38
+ }
39
+ get endCursor() {
40
+ return this.#edges[this.#edges.length - 1]?.cursor;
41
+ }
42
+ get hasNextPage() {
43
+ return (this.#hasNextPagePromise ??= this.#countPastCursor("after", this.endCursor));
44
+ }
45
+ get hasPreviousPage() {
46
+ return (this.#hasPreviousPagePromise ??= this.#countPastCursor("before", this.startCursor));
47
+ }
48
+ get totalCount() {
49
+ return (this.#totalCountPromise ??= this.#ctx.em.findCount(this.#type, this.#filter));
50
+ }
51
+ /** Counts rows past a cursor only when the field is requested. */
52
+ async #countPastCursor(direction, cursor) {
53
+ if (!cursor)
54
+ return false;
55
+ const filter = withCursorFilter(this.#filter, { [direction]: cursor });
56
+ return (await this.#ctx.em.findCount(this.#type, filter)) > 0;
57
+ }
58
+ }
59
+ exports.CursorPageInfo = CursorPageInfo;
60
+ /** Adds cursor bounds to a filter. */
61
+ function withCursorFilter(filter, args) {
62
+ const cursor = args.after ?? args.before;
63
+ if (!cursor)
64
+ return filter;
65
+ const op = args.after ? "gt" : "lt";
66
+ return { ...filter, id: { [op]: decodeCursor(cursor) } };
67
+ }
68
+ /** Encodes an entity id as an opaque cursor. */
69
+ function encodeCursor(id) {
70
+ return Buffer.from(id).toString("base64");
71
+ }
72
+ /** Decodes an opaque cursor back into an entity id. */
73
+ function decodeCursor(cursor) {
74
+ return Buffer.from(cursor, "base64").toString("utf8");
75
+ }
76
+ //# sourceMappingURL=cursorPagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorPagination.js","sourceRoot":"","sources":["../src/cursorPagination.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Collection, Entity, EntityMetadata, IdOf, MaybeAbstractEntityConstructor, Property, ReactiveGetter, ReadOnlyCollection, Reference } from "joist-core";
2
2
  import { Resolver } from "./context";
3
- type GraphQLPrimitive = string | Date | boolean | number | null | undefined;
3
+ type GraphQLPrimitive = string | Date | boolean | number | bigint | null | undefined;
4
4
  /**
5
5
  * Maps properties like `Entity.firstName: string` to field resolver functions like `firstName(): Promise<string>`.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"entityResolver.d.ts","sourceRoot":"","sources":["../src/entityResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entityResolver.d.ts","sourceRoot":"","sources":["../src/entityResolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hint.d.ts","sourceRoot":"","sources":["../src/hint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE9D,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EACpD,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,kBAAkB,GACvB,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAazB;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,gBAAgB,GAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAgCrB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,SAAS,CAO1F"}
1
+ {"version":3,"file":"hint.d.ts","sourceRoot":"","sources":["../src/hint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE9D,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EACpD,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,kBAAkB,GACvB,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAazB;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,gBAAgB,GAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkCrB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,SAAS,CAO1F"}
package/build/hint.js CHANGED
@@ -24,6 +24,9 @@ function selectionSetToObject(info, meta, gqlType, selectionSet) {
24
24
  const result = {};
25
25
  for (const selection of selectionSet.selections) {
26
26
  if (selection.kind === "Field") {
27
+ // If there are arguments, defer to the field resolver to apply them.
28
+ if (selection.arguments && selection.arguments.length > 0)
29
+ continue;
27
30
  const fieldName = selection.name.value;
28
31
  const field = gqlType.getFields()[fieldName];
29
32
  // This might be __typename, which is a meta field
package/build/hint.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hint.js","sourceRoot":"","sources":["../src/hint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hint.js","sourceRoot":"","sources":["../src/hint.ts"],"names":[],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
+ export { CursorPageInfo, paginateCursor } from "./cursorPagination";
1
2
  export { entityResolver } from "./entityResolver";
2
3
  export { convertInfoToLoadHint } from "./hint";
4
+ export { LimitPageInfo, paginateLimit } from "./limitPagination";
3
5
  export { saveEntities, saveEntity } from "./saveEntity";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/build/index.js CHANGED
@@ -1,10 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.saveEntity = exports.saveEntities = exports.convertInfoToLoadHint = exports.entityResolver = void 0;
3
+ exports.saveEntity = exports.saveEntities = exports.paginateLimit = exports.LimitPageInfo = exports.convertInfoToLoadHint = exports.entityResolver = exports.paginateCursor = exports.CursorPageInfo = void 0;
4
+ var cursorPagination_1 = require("./cursorPagination");
5
+ Object.defineProperty(exports, "CursorPageInfo", { enumerable: true, get: function () { return cursorPagination_1.CursorPageInfo; } });
6
+ Object.defineProperty(exports, "paginateCursor", { enumerable: true, get: function () { return cursorPagination_1.paginateCursor; } });
4
7
  var entityResolver_1 = require("./entityResolver");
5
8
  Object.defineProperty(exports, "entityResolver", { enumerable: true, get: function () { return entityResolver_1.entityResolver; } });
6
9
  var hint_1 = require("./hint");
7
10
  Object.defineProperty(exports, "convertInfoToLoadHint", { enumerable: true, get: function () { return hint_1.convertInfoToLoadHint; } });
11
+ var limitPagination_1 = require("./limitPagination");
12
+ Object.defineProperty(exports, "LimitPageInfo", { enumerable: true, get: function () { return limitPagination_1.LimitPageInfo; } });
13
+ Object.defineProperty(exports, "paginateLimit", { enumerable: true, get: function () { return limitPagination_1.paginateLimit; } });
8
14
  var saveEntity_1 = require("./saveEntity");
9
15
  Object.defineProperty(exports, "saveEntities", { enumerable: true, get: function () { return saveEntity_1.saveEntities; } });
10
16
  Object.defineProperty(exports, "saveEntity", { enumerable: true, get: function () { return saveEntity_1.saveEntity; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,+BAA+C;AAAtC,6GAAA,qBAAqB,OAAA;AAC9B,2CAAwD;AAA/C,0GAAA,YAAY,OAAA;AAAE,wGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAoE;AAA3D,kHAAA,cAAc,OAAA;AAAE,kHAAA,cAAc,OAAA;AACvC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,+BAA+C;AAAtC,6GAAA,qBAAqB,OAAA;AAC9B,qDAAiE;AAAxD,gHAAA,aAAa,OAAA;AAAE,gHAAA,aAAa,OAAA;AACrC,2CAAwD;AAA/C,0GAAA,YAAY,OAAA;AAAE,wGAAA,UAAU,OAAA"}
@@ -0,0 +1,28 @@
1
+ import { type Entity, type MaybeAbstractEntityConstructor } from "joist-core";
2
+ import { type ContextWithEm, type PaginationFilter } from "./paginationUtils";
3
+ type LimitArgs<T extends Entity, F extends object = PaginationFilter<T>> = {
4
+ filter?: F | null;
5
+ limit?: number | null;
6
+ offset?: number | null;
7
+ };
8
+ type Page = {
9
+ offset: number;
10
+ limit: number;
11
+ };
12
+ /** Returns a limit/offset page shape for a generated query resolver. */
13
+ export declare function paginateLimit<T extends Entity, F extends object = PaginationFilter<T>>(ctx: ContextWithEm, type: MaybeAbstractEntityConstructor<T>, args: LimitArgs<T, F>): Promise<{
14
+ entities: T[];
15
+ pageInfo: LimitPageInfo<T>;
16
+ }>;
17
+ /** Lazily computes limit/offset page fields. */
18
+ export declare class LimitPageInfo<T extends Entity = Entity> {
19
+ #private;
20
+ constructor(ctx: ContextWithEm, type: MaybeAbstractEntityConstructor<T>, filter: PaginationFilter<T>, page: Page);
21
+ get hasNextPage(): Promise<boolean>;
22
+ get hasPreviousPage(): boolean;
23
+ get totalCount(): Promise<number>;
24
+ get nextPage(): Promise<number | undefined>;
25
+ get currentPage(): number;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=limitPagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limitPagination.d.ts","sourceRoot":"","sources":["../src/limitPagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,KAAK,aAAa,EAAgB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5F,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI;IACzE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AACF,KAAK,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,wEAAwE;AACxE,wBAAsB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAC1F,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,8BAA8B,CAAC,CAAC,CAAC,EACvC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GACpB,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,CAMxD;AAED,gDAAgD;AAChD,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;;gBAOtC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI;IAOhH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAElC;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE1C;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;CAcF"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LimitPageInfo = void 0;
4
+ exports.paginateLimit = paginateLimit;
5
+ const paginationUtils_1 = require("./paginationUtils");
6
+ /** Returns a limit/offset page shape for a generated query resolver. */
7
+ async function paginateLimit(ctx, type, args) {
8
+ const limit = args.limit ?? paginationUtils_1.defaultLimit;
9
+ const offset = args.offset ?? 0;
10
+ const filter = (args.filter ?? {});
11
+ const entities = await ctx.em.findGql(type, filter, { limit, offset });
12
+ return { entities, pageInfo: new LimitPageInfo(ctx, type, filter, { limit, offset }) };
13
+ }
14
+ /** Lazily computes limit/offset page fields. */
15
+ class LimitPageInfo {
16
+ #ctx;
17
+ #filter;
18
+ #page;
19
+ #totalCountPromise;
20
+ #type;
21
+ constructor(ctx, type, filter, page) {
22
+ this.#ctx = ctx;
23
+ this.#type = type;
24
+ this.#filter = filter;
25
+ this.#page = page;
26
+ }
27
+ get hasNextPage() {
28
+ return this.#hasNextPage();
29
+ }
30
+ get hasPreviousPage() {
31
+ return this.#page.offset > 0;
32
+ }
33
+ get totalCount() {
34
+ return (this.#totalCountPromise ??= this.#ctx.em.findCount(this.#type, this.#filter));
35
+ }
36
+ get nextPage() {
37
+ return this.#nextPage();
38
+ }
39
+ get currentPage() {
40
+ return Math.floor(this.#page.offset / this.#page.limit) + 1;
41
+ }
42
+ /** Returns whether another page exists after this page. */
43
+ async #hasNextPage() {
44
+ const total = await this.totalCount;
45
+ const { offset, limit } = this.#page;
46
+ return offset + limit < total;
47
+ }
48
+ /** Returns the next limit/offset page if there is one. */
49
+ async #nextPage() {
50
+ if (!(await this.hasNextPage))
51
+ return undefined;
52
+ return this.currentPage + 1;
53
+ }
54
+ }
55
+ exports.LimitPageInfo = LimitPageInfo;
56
+ //# sourceMappingURL=limitPagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limitPagination.js","sourceRoot":"","sources":["../src/limitPagination.ts"],"names":[],"mappings":";;;AAWA,sCAUC;AApBD,uDAA4F;AAS5F,wEAAwE;AACjE,KAAK,UAAU,aAAa,CACjC,GAAkB,EAClB,IAAuC,EACvC,IAAqB;IAErB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,8BAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAwB,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,gDAAgD;AAChD,MAAa,aAAa;IACxB,IAAI,CAAgB;IACpB,OAAO,CAAsB;IAC7B,KAAK,CAAO;IACZ,kBAAkB,CAA8B;IAChD,KAAK,CAAoC;IAEzC,YAAY,GAAkB,EAAE,IAAuC,EAAE,MAA2B,EAAE,IAAU;QAC9G,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,CAAC,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,YAAY;QAChB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACrC,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF;AA9CD,sCA8CC"}
@@ -0,0 +1,7 @@
1
+ import { type Entity, type EntityManager, type GraphQLFilterWithAlias } from "joist-core";
2
+ export type ContextWithEm = {
3
+ em: EntityManager;
4
+ };
5
+ export type PaginationFilter<T extends Entity> = GraphQLFilterWithAlias<T>;
6
+ export declare const defaultLimit = 100;
7
+ //# sourceMappingURL=paginationUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../src/paginationUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,aAAa,CAAA;CAAE,CAAC;AAClD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC;AAE3E,eAAO,MAAM,YAAY,MAAM,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultLimit = void 0;
4
+ exports.defaultLimit = 100;
5
+ //# sourceMappingURL=paginationUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginationUtils.js","sourceRoot":"","sources":["../src/paginationUtils.ts"],"names":[],"mappings":";;;AAKa,QAAA,YAAY,GAAG,GAAG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "joist-graphql-resolver-utils",
3
- "version": "2.2.0-next.9",
3
+ "version": "2.3.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,6 +10,10 @@
10
10
  "main": "build/index.js",
11
11
  "exports": {
12
12
  ".": "./build/index.js",
13
+ "./index.js": {
14
+ "types": "./build/index.d.ts",
15
+ "default": "./build/index.js"
16
+ },
13
17
  "./tests": "./build/tests.js"
14
18
  },
15
19
  "types": "build/index.d.ts",
@@ -20,21 +24,21 @@
20
24
  "build"
21
25
  ],
22
26
  "peerDependencies": {
23
- "joist-core": "2.2.0-next.9",
24
- "joist-test-utils": "2.2.0-next.9"
27
+ "joist-core": "2.3.0",
28
+ "joist-test-utils": "2.3.0"
25
29
  },
26
30
  "dependencies": {
27
- "graphql": "^16.14.0"
31
+ "graphql": "^16.14.2"
28
32
  },
29
33
  "devDependencies": {
30
- "@swc/core": "^1.15.33",
34
+ "@swc/core": "^1.15.43",
31
35
  "@swc/jest": "^0.2.39",
32
36
  "@types/jest": "^30.0.0",
33
- "@types/node": "^24.12.4",
37
+ "@types/node": "^26.0.1",
34
38
  "jest": "30.4.2",
35
- "prettier": "^3.8.3",
39
+ "prettier": "^3.8.4",
36
40
  "prettier-plugin-organize-imports": "^4.3.0",
37
41
  "tsconfig-paths": "^4.2.0",
38
- "typescript": "5.9.3"
42
+ "typescript": "6.0.3"
39
43
  }
40
44
  }