@generazioneai/genquery 0.1.0 → 0.2.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.
Files changed (52) hide show
  1. package/README.md +21 -10
  2. package/dist/adapters/base.d.ts +10 -1
  3. package/dist/adapters/base.d.ts.map +1 -1
  4. package/dist/adapters/prisma/adapter.d.ts +40 -0
  5. package/dist/adapters/prisma/adapter.d.ts.map +1 -0
  6. package/dist/adapters/prisma/adapter.js +92 -0
  7. package/dist/adapters/prisma/adapter.js.map +1 -0
  8. package/dist/adapters/prisma/create.d.ts +28 -0
  9. package/dist/adapters/prisma/create.d.ts.map +1 -0
  10. package/dist/adapters/prisma/create.js +28 -0
  11. package/dist/adapters/prisma/create.js.map +1 -0
  12. package/dist/adapters/prisma/index.d.ts +5 -0
  13. package/dist/adapters/prisma/index.d.ts.map +1 -0
  14. package/dist/adapters/prisma/index.js +10 -0
  15. package/dist/adapters/prisma/index.js.map +1 -0
  16. package/dist/adapters/prisma/schema-from-prisma.d.ts +43 -0
  17. package/dist/adapters/prisma/schema-from-prisma.d.ts.map +1 -0
  18. package/dist/adapters/prisma/schema-from-prisma.js +128 -0
  19. package/dist/adapters/prisma/schema-from-prisma.js.map +1 -0
  20. package/dist/adapters/prisma/select.d.ts +18 -0
  21. package/dist/adapters/prisma/select.d.ts.map +1 -0
  22. package/dist/adapters/prisma/select.js +94 -0
  23. package/dist/adapters/prisma/select.js.map +1 -0
  24. package/dist/adapters/prisma/types.d.ts +79 -0
  25. package/dist/adapters/prisma/types.d.ts.map +1 -0
  26. package/dist/adapters/prisma/types.js +10 -0
  27. package/dist/adapters/prisma/types.js.map +1 -0
  28. package/dist/adapters/prisma/where.d.ts +13 -0
  29. package/dist/adapters/prisma/where.d.ts.map +1 -0
  30. package/dist/adapters/prisma/where.js +169 -0
  31. package/dist/adapters/prisma/where.js.map +1 -0
  32. package/dist/adapters/typeorm/adapter.d.ts +8 -1
  33. package/dist/adapters/typeorm/adapter.d.ts.map +1 -1
  34. package/dist/adapters/typeorm/adapter.js +24 -0
  35. package/dist/adapters/typeorm/adapter.js.map +1 -1
  36. package/dist/engine.d.ts +21 -7
  37. package/dist/engine.d.ts.map +1 -1
  38. package/dist/engine.js +11 -3
  39. package/dist/engine.js.map +1 -1
  40. package/dist/parsed.d.ts +21 -0
  41. package/dist/parsed.d.ts.map +1 -1
  42. package/dist/parser.d.ts.map +1 -1
  43. package/dist/parser.js +21 -8
  44. package/dist/parser.js.map +1 -1
  45. package/dist/tests/prisma-adapter.test.d.ts +2 -0
  46. package/dist/tests/prisma-adapter.test.d.ts.map +1 -0
  47. package/dist/tests/prisma-adapter.test.js +351 -0
  48. package/dist/tests/prisma-adapter.test.js.map +1 -0
  49. package/dist/types.d.ts +4 -0
  50. package/dist/types.d.ts.map +1 -1
  51. package/package.json +14 -5
  52. package/spec.md +11 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Structural types for the Prisma adapter. Defined here so the package can
3
+ * compile without `@prisma/client` installed (it's an optional peerDep).
4
+ *
5
+ * The runtime shapes match Prisma's actual API surface — the adapter feeds
6
+ * delegate methods directly with the produced args.
7
+ */
8
+ /**
9
+ * Subset of a Prisma model delegate (e.g. `prisma.user`). Only the methods
10
+ * the adapter calls are typed; the real delegate has many more.
11
+ */
12
+ export interface PrismaModelDelegate {
13
+ findMany(args?: PrismaFindManyArgs): Promise<unknown[]>;
14
+ findFirst(args?: PrismaFindManyArgs): Promise<unknown | null>;
15
+ count(args?: {
16
+ where?: PrismaWhere;
17
+ }): Promise<number>;
18
+ }
19
+ /** Recursive Prisma `where` filter. */
20
+ export interface PrismaWhere {
21
+ AND?: PrismaWhere[];
22
+ OR?: PrismaWhere[];
23
+ NOT?: PrismaWhere | PrismaWhere[];
24
+ [field: string]: unknown;
25
+ }
26
+ /** Args object passed to `findMany` / `findFirst`. */
27
+ export interface PrismaFindManyArgs {
28
+ where?: PrismaWhere;
29
+ orderBy?: Record<string, "asc" | "desc"> | Array<Record<string, "asc" | "desc">>;
30
+ skip?: number;
31
+ take?: number;
32
+ select?: PrismaSelect;
33
+ include?: PrismaInclude;
34
+ }
35
+ export interface PrismaSelect {
36
+ [field: string]: boolean | {
37
+ select?: PrismaSelect;
38
+ include?: PrismaInclude;
39
+ };
40
+ }
41
+ export interface PrismaInclude {
42
+ [relation: string]: boolean | {
43
+ select?: PrismaSelect;
44
+ include?: PrismaInclude;
45
+ };
46
+ }
47
+ export interface PrismaDatamodel {
48
+ models: readonly PrismaModelDef[];
49
+ enums: readonly PrismaEnumDef[];
50
+ }
51
+ export interface PrismaModelDef {
52
+ name: string;
53
+ fields: readonly PrismaFieldDef[];
54
+ primaryKey?: {
55
+ fields: readonly string[];
56
+ } | null;
57
+ }
58
+ export interface PrismaFieldDef {
59
+ name: string;
60
+ kind: "scalar" | "object" | "enum" | "unsupported";
61
+ /**
62
+ * For `scalar`: the scalar type name (`String`, `Int`, `Boolean`, `DateTime`,
63
+ * `Float`, `Decimal`, `BigInt`, ...). For `object`: the related model name.
64
+ * For `enum`: the enum name.
65
+ */
66
+ type: string;
67
+ isList: boolean;
68
+ isRequired: boolean;
69
+ isId?: boolean;
70
+ isUnique?: boolean;
71
+ relationName?: string;
72
+ }
73
+ export interface PrismaEnumDef {
74
+ name: string;
75
+ values: readonly {
76
+ name: string;
77
+ }[];
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/prisma/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,SAAS,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxD;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC;IACpB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IAClC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG;QAAE,MAAM,CAAC,EAAE,YAAY,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC;CAC/E;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG;QAAE,MAAM,CAAC,EAAE,YAAY,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC;CAClF;AAOD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;IACnD;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Structural types for the Prisma adapter. Defined here so the package can
4
+ * compile without `@prisma/client` installed (it's an optional peerDep).
5
+ *
6
+ * The runtime shapes match Prisma's actual API surface — the adapter feeds
7
+ * delegate methods directly with the produced args.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/prisma/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -0,0 +1,13 @@
1
+ import type { ParsedSearchBy } from "../../parsed";
2
+ import { type Schema } from "../../schema";
3
+ import type { PrismaWhere } from "./types";
4
+ /**
5
+ * Build a Prisma `where` filter from a parsed searchBy. Conditions AND
6
+ * together; the `or` array becomes a Prisma `OR` clause AND-ed with the
7
+ * conditions.
8
+ *
9
+ * `nativeregex` is rejected — Prisma has no portable regex operator in `where`
10
+ * (postgres supports it via `$queryRaw` only). Use `exact` or `splitword`.
11
+ */
12
+ export declare function buildWhere(searchBy: ParsedSearchBy, schema: Schema, rootEntity: string): PrismaWhere;
13
+ //# sourceMappingURL=where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/adapters/prisma/where.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,cAAc,CAAC;AACtB,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAU3C;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW,CAMb"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildWhere = buildWhere;
4
+ const errors_1 = require("../../errors");
5
+ const schema_1 = require("../../schema");
6
+ /**
7
+ * Build a Prisma `where` filter from a parsed searchBy. Conditions AND
8
+ * together; the `or` array becomes a Prisma `OR` clause AND-ed with the
9
+ * conditions.
10
+ *
11
+ * `nativeregex` is rejected — Prisma has no portable regex operator in `where`
12
+ * (postgres supports it via `$queryRaw` only). Use `exact` or `splitword`.
13
+ */
14
+ function buildWhere(searchBy, schema, rootEntity) {
15
+ return buildSearchBy(searchBy, {
16
+ schema,
17
+ currentEntity: rootEntity,
18
+ path: "searchBy",
19
+ });
20
+ }
21
+ function buildSearchBy(searchBy, ctx) {
22
+ const ands = [];
23
+ for (const cond of searchBy.conditions) {
24
+ const w = buildCondition(cond, ctx);
25
+ if (w !== undefined)
26
+ ands.push(w);
27
+ }
28
+ const ors = searchBy.or
29
+ .map((sub) => buildSearchBy(sub, ctx))
30
+ .filter((w) => Object.keys(w).length > 0);
31
+ if (ands.length === 1 && ors.length === 0)
32
+ return ands[0];
33
+ if (ands.length === 0 && ors.length === 0)
34
+ return {};
35
+ const out = {};
36
+ if (ands.length > 0)
37
+ out.AND = ands;
38
+ if (ors.length > 0)
39
+ out.OR = ors;
40
+ return out;
41
+ }
42
+ function buildCondition(cond, ctx) {
43
+ switch (cond.kind) {
44
+ case "string": {
45
+ const filter = buildStringFilter(cond.search, `${ctx.path}.${cond.field}`);
46
+ if (filter === undefined)
47
+ return undefined;
48
+ if (isMultiWordOr(filter)) {
49
+ // Multi-word splitword: distribute the field onto each branch.
50
+ return {
51
+ OR: filter.OR.map((leaf) => ({
52
+ [cond.field]: leaf,
53
+ })),
54
+ };
55
+ }
56
+ return { [cond.field]: filter };
57
+ }
58
+ case "number":
59
+ return { [cond.field]: buildNumberFilter(cond.search) };
60
+ case "bool":
61
+ return { [cond.field]: cond.search.value };
62
+ case "date":
63
+ return { [cond.field]: buildDateFilter(cond.search) };
64
+ case "enum":
65
+ return { [cond.field]: cond.search.value };
66
+ case "null":
67
+ return {
68
+ [cond.field]: cond.check.isNull ? null : { not: null },
69
+ };
70
+ case "empty":
71
+ return cond.check.isEmpty
72
+ ? { OR: [{ [cond.field]: null }, { [cond.field]: "" }] }
73
+ : {
74
+ AND: [
75
+ { [cond.field]: { not: null } },
76
+ { [cond.field]: { not: "" } },
77
+ ],
78
+ };
79
+ case "relation":
80
+ return buildRelation(cond, ctx);
81
+ }
82
+ }
83
+ function isMultiWordOr(f) {
84
+ return typeof f === "object" && Array.isArray(f.OR);
85
+ }
86
+ function buildStringFilter(search, path) {
87
+ if (search.mode === "nativeregex") {
88
+ throw new errors_1.QueryValidationError("String search mode 'nativeregex' is not supported by the Prisma adapter. " +
89
+ "Use 'exact' or 'splitword'.", path);
90
+ }
91
+ if (search.mode === "splitword") {
92
+ const words = splitWords(search.value);
93
+ if (words.length === 0)
94
+ return undefined;
95
+ if (words.length === 1) {
96
+ return singleWordFilter(words[0], search.contained, search.caseSensitive);
97
+ }
98
+ const branches = words.map((w) => {
99
+ const leaf = singleWordFilter(w, search.contained, search.caseSensitive);
100
+ return typeof leaf === "string" ? { equals: leaf } : leaf;
101
+ });
102
+ return { OR: branches };
103
+ }
104
+ // exact
105
+ return singleWordFilter(search.value, search.contained, search.caseSensitive);
106
+ }
107
+ function singleWordFilter(value, contained, caseSensitive) {
108
+ const mode = caseSensitive ? {} : { mode: "insensitive" };
109
+ if (contained)
110
+ return { contains: value, ...mode };
111
+ if (caseSensitive)
112
+ return value; // shorthand: `{ field: "x" }` ≡ `{ equals: "x" }`
113
+ return { equals: value, ...mode };
114
+ }
115
+ function splitWords(s) {
116
+ return s.split(/\s+/).filter((w) => w.length > 0);
117
+ }
118
+ function buildNumberFilter(search) {
119
+ switch (search.op) {
120
+ case "==":
121
+ return { equals: search.value };
122
+ case ">":
123
+ return { gt: search.value };
124
+ case "<":
125
+ return { lt: search.value };
126
+ case ">=":
127
+ return { gte: search.value };
128
+ case "<=":
129
+ return { lte: search.value };
130
+ }
131
+ }
132
+ function buildDateFilter(search) {
133
+ if (search.kind === "exact")
134
+ return { equals: search.value };
135
+ const out = {};
136
+ if (search.after)
137
+ out.gt = search.after;
138
+ if (search.before)
139
+ out.lt = search.before;
140
+ return out;
141
+ }
142
+ function buildRelation(cond, ctx) {
143
+ const relDef = (0, schema_1.getRelation)(ctx.schema, ctx.currentEntity, cond.field);
144
+ // `relDef` must exist — the parser only emits relation conditions for known
145
+ // relations. If it doesn't, the schema diverged from what was parsed.
146
+ if (!relDef) {
147
+ throw new Error(`genquery/prisma: missing relation '${cond.field}' on '${ctx.currentEntity}'`);
148
+ }
149
+ const targetEntity = (0, schema_1.getEntity)(ctx.schema, cond.targetEntity);
150
+ const isMany = (relDef.kind ?? "many") === "many";
151
+ const nestedCtx = {
152
+ schema: ctx.schema,
153
+ currentEntity: targetEntity.name,
154
+ path: `${ctx.path}.${cond.field}.${cond.op}`,
155
+ };
156
+ const nested = buildSearchBy(cond.nested, nestedCtx);
157
+ if (isMany) {
158
+ return { [cond.field]: { [cond.op]: nested } };
159
+ }
160
+ // To-one relation: Prisma uses `is` / `isNot`. Map:
161
+ // some/every → is (existence + match; vacuous-truth differs from many's
162
+ // `every`, documented as a known approximation)
163
+ // none → isNot
164
+ if (cond.op === "none") {
165
+ return { [cond.field]: { isNot: nested } };
166
+ }
167
+ return { [cond.field]: { is: nested } };
168
+ }
169
+ //# sourceMappingURL=where.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/adapters/prisma/where.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type ObjectLiteral, type SelectQueryBuilder } from "typeorm";
2
- import type { ParsedQuery } from "../../parsed";
2
+ import type { PaginatedResult, ParsedQuery } from "../../parsed";
3
3
  import { type Schema } from "../../schema";
4
4
  import type { Adapter } from "../base";
5
5
  export interface TypeORMAdapterOptions {
@@ -28,6 +28,13 @@ export declare class TypeORMAdapter implements Adapter<SelectQueryBuilder<Object
28
28
  */
29
29
  getRootEntity(qb: SelectQueryBuilder<ObjectLiteral>): string | undefined;
30
30
  apply<T extends ObjectLiteral>(qb: SelectQueryBuilder<T>, query: ParsedQuery): SelectQueryBuilder<T>;
31
+ /**
32
+ * Apply the parsed query to `qb`, run it, and return `{ data, current?,
33
+ * total? }` shaped by `pagination.showNumber` / `pagination.showTotal`
34
+ * (both default to true). Uses `getManyAndCount` when a total is needed,
35
+ * `getMany` otherwise. This is what `engine.run` invokes for TypeORM.
36
+ */
37
+ execute<T extends ObjectLiteral>(qb: SelectQueryBuilder<T>, query: ParsedQuery): Promise<PaginatedResult<T>>;
31
38
  private applyRootSelect;
32
39
  private applyJoin;
33
40
  private applyPagination;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAEL,KAAK,MAAM,EAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMvC,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,qBAAa,cACX,YACE,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;aAK7D,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,QAAQ,CAAC,IAAI,aAAa;gBAGR,MAAM,EAAE,MAAM,EACb,OAAO,GAAE,qBAA0B;IAGtD;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS;IAIxE,KAAK,CAAC,CAAC,SAAS,aAAa,EAC3B,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,WAAW,GACjB,kBAAkB,CAAC,CAAC,CAAC;IA8CxB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,eAAe;CAWxB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAgB,MAAM,cAAc,CAAC;AAC/E,OAAO,EAEL,KAAK,MAAM,EAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMvC,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,qBAAa,cACX,YACE,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;aAK7D,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,QAAQ,CAAC,IAAI,aAAa;gBAGR,MAAM,EAAE,MAAM,EACb,OAAO,GAAE,qBAA0B;IAGtD;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS;IAIxE,KAAK,CAAC,CAAC,SAAS,aAAa,EAC3B,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,WAAW,GACjB,kBAAkB,CAAC,CAAC,CAAC;IA8CxB;;;;;OAKG;IACG,OAAO,CAAC,CAAC,SAAS,aAAa,EACnC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAkB9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,eAAe;CAWxB"}
@@ -65,6 +65,30 @@ class TypeORMAdapter {
65
65
  this.applyPagination(qb, query.pagination);
66
66
  return qb;
67
67
  }
68
+ /**
69
+ * Apply the parsed query to `qb`, run it, and return `{ data, current?,
70
+ * total? }` shaped by `pagination.showNumber` / `pagination.showTotal`
71
+ * (both default to true). Uses `getManyAndCount` when a total is needed,
72
+ * `getMany` otherwise. This is what `engine.run` invokes for TypeORM.
73
+ */
74
+ async execute(qb, query) {
75
+ this.apply(qb, query);
76
+ const { showNumber, showTotal } = query.pagination;
77
+ let data;
78
+ let total;
79
+ if (showTotal) {
80
+ [data, total] = await qb.getManyAndCount();
81
+ }
82
+ else {
83
+ data = await qb.getMany();
84
+ }
85
+ const result = { data };
86
+ if (showNumber)
87
+ result.current = data.length;
88
+ if (showTotal)
89
+ result.total = total;
90
+ return result;
91
+ }
68
92
  applyRootSelect(qb, entity, select, rootAlias) {
69
93
  if (select.kind === "all")
70
94
  return; // default behaviour
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/adapter.ts"],"names":[],"mappings":"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"}
package/dist/engine.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Adapter } from "./adapters/base";
2
- import type { ParsedQuery } from "./parsed";
2
+ import type { PaginatedResult, ParsedQuery } from "./parsed";
3
3
  import type { Schema } from "./schema";
4
4
  import type { GenQueryInput } from "./types";
5
5
  export interface GenQueryEngineOptions<TTarget, TResult> {
@@ -9,12 +9,15 @@ type IsAny<T> = 0 extends 1 & T ? true : false;
9
9
  /** True for TypeORM's wide ObjectLiteral default — treat as "unspecified". */
10
10
  type IsLooseRecord<T> = IsAny<T> extends true ? true : [T] extends [Record<string, any>] ? [Record<string, any>] extends [T] ? true : false : false;
11
11
  /**
12
- * Inspect the target's structural shape. If it looks like a TypeORM
13
- * `SelectQueryBuilder<T>` (has `getMany(): Promise<T[]>`), pull out T.
12
+ * Inspect the target's structural shape and pull out the entity type:
13
+ * - TypeORM `SelectQueryBuilder<T>` exposes `getMany(): Promise<T[]>`.
14
+ * - Prisma model delegate exposes `findMany(args?): Promise<T[]>`.
14
15
  * Falls back to `unknown` (loose mode) for any other adapter target.
15
16
  */
16
17
  type InferEntityFromTarget<X> = X extends {
17
18
  getMany(): Promise<infer A>;
19
+ } ? A extends (infer T)[] ? IsLooseRecord<T> extends true ? unknown : T : unknown : X extends {
20
+ findMany(args?: any): Promise<infer A>;
18
21
  } ? A extends (infer T)[] ? IsLooseRecord<T> extends true ? unknown : T : unknown : unknown;
19
22
  /**
20
23
  * Combines parsing + an adapter into a single entry point. The engine is
@@ -35,7 +38,14 @@ export declare class GenQueryEngine<TTarget, TResult> {
35
38
  */
36
39
  parse<T = unknown>(input: GenQueryInput<T>, rootEntity: string): ParsedQuery;
37
40
  /**
38
- * Parse and apply.
41
+ * Parse, apply, and execute the query against `target`. Returns
42
+ * `{ data, current?, total? }` shaped by `pagination.showNumber` /
43
+ * `pagination.showTotal` (both default to `true`).
44
+ *
45
+ * Requires the adapter to implement `execute` (the TypeORM adapter does).
46
+ * Pure args-builder adapters (Prisma, etc.) should use `parse` +
47
+ * `runParsed` instead — `runParsed` is sync and returns the adapter's raw
48
+ * `TResult` (the args object or query builder) without executing.
39
49
  *
40
50
  * The entity type is inferred from the `target` argument when it has a
41
51
  * recognizable shape (e.g. a TypeORM `SelectQueryBuilder<User>`). When the
@@ -43,9 +53,13 @@ export declare class GenQueryEngine<TTarget, TResult> {
43
53
  * the engine asks the adapter to derive it from the target. Pass an explicit
44
54
  * `rootEntity` to override (or when the adapter can't introspect).
45
55
  */
46
- run<X extends TTarget>(input: GenQueryInput<InferEntityFromTarget<X>>, target: X): TResult;
47
- run<X extends TTarget>(input: GenQueryInput<InferEntityFromTarget<X>>, rootEntity: string, target: X): TResult;
48
- /** Apply a previously parsed query. */
56
+ run<X extends TTarget>(input: GenQueryInput<InferEntityFromTarget<X>>, target: X): Promise<PaginatedResult<InferEntityFromTarget<X>>>;
57
+ run<X extends TTarget>(input: GenQueryInput<InferEntityFromTarget<X>>, rootEntity: string, target: X): Promise<PaginatedResult<InferEntityFromTarget<X>>>;
58
+ /**
59
+ * Apply a previously parsed query and return the adapter's raw target
60
+ * (mutated query builder, args object, …) without executing. Use this when
61
+ * you want full control over how the query is run.
62
+ */
49
63
  runParsed(parsed: ParsedQuery, target: TTarget): TResult;
50
64
  }
51
65
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,qBAAqB,CAAC,OAAO,EAAE,OAAO;IACrD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE/C,8EAA8E;AAC9E,KAAK,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GACzC,IAAI,GACJ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC/B,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAC/B,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEZ;;;;GAIG;AACH,KAAK,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS;IACxC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7B,GACG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACnB,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,OAAO,GACP,CAAC,GACH,OAAO,GACT,OAAO,CAAC;AAEZ;;;;;;GAMG;AACH,qBAAa,cAAc,CAAC,OAAO,EAAE,OAAO;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEhC,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC;IAK5D;;;;;OAKG;IACH,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAI5E;;;;;;;;OAQG;IACH,GAAG,CAAC,CAAC,SAAS,OAAO,EACnB,KAAK,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC9C,MAAM,EAAE,CAAC,GACR,OAAO;IACV,GAAG,CAAC,CAAC,SAAS,OAAO,EACnB,KAAK,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC9C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,GACR,OAAO;IA2BV,uCAAuC;IACvC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;CAGzD"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,qBAAqB,CAAC,OAAO,EAAE,OAAO;IACrD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE/C,8EAA8E;AAC9E,KAAK,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GACzC,IAAI,GACJ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC/B,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAC/B,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEZ;;;;;GAKG;AACH,KAAK,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS;IACxC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7B,GACG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACnB,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,OAAO,GACP,CAAC,GACH,OAAO,GACT,CAAC,SAAS;IACN,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CACxC,GACD,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACnB,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,OAAO,GACP,CAAC,GACH,OAAO,GACT,OAAO,CAAC;AAEd;;;;;;GAMG;AACH,qBAAa,cAAc,CAAC,OAAO,EAAE,OAAO;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEhC,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC;IAK5D;;;;;OAKG;IACH,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAI5E;;;;;;;;;;;;;;;OAeG;IACH,GAAG,CAAC,CAAC,SAAS,OAAO,EACnB,KAAK,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC9C,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,CAAC,SAAS,OAAO,EACnB,KAAK,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC9C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IAiCrD;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;CAGzD"}
package/dist/engine.js CHANGED
@@ -23,7 +23,11 @@ class GenQueryEngine {
23
23
  parse(input, rootEntity) {
24
24
  return (0, parser_1.parseQuery)(input, this.schema, rootEntity);
25
25
  }
26
- run(input, arg2, arg3) {
26
+ async run(input, arg2, arg3) {
27
+ if (!this.adapter.execute) {
28
+ throw new Error(`GenQueryEngine.run: adapter '${this.adapter.name}' does not implement execute(). ` +
29
+ "Use engine.parse + engine.runParsed instead.");
30
+ }
27
31
  let rootEntity;
28
32
  let target;
29
33
  if (typeof arg2 === "string") {
@@ -41,9 +45,13 @@ class GenQueryEngine {
41
45
  rootEntity = derived;
42
46
  }
43
47
  const parsed = (0, parser_1.parseQuery)(input, this.schema, rootEntity);
44
- return this.adapter.apply(target, parsed);
48
+ return this.adapter.execute(target, parsed);
45
49
  }
46
- /** Apply a previously parsed query. */
50
+ /**
51
+ * Apply a previously parsed query and return the adapter's raw target
52
+ * (mutated query builder, args object, …) without executing. Use this when
53
+ * you want full control over how the query is run.
54
+ */
47
55
  runParsed(parsed, target) {
48
56
  return this.adapter.apply(target, parsed);
49
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":";;;AACA,qCAAsC;AAqCtC;;;;;;GAMG;AACH,MAAa,cAAc;IAIzB,YAAY,OAAgD;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAc,KAAuB,EAAE,UAAkB;QAC5D,OAAO,IAAA,mBAAU,EAAC,KAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAoBD,GAAG,CACD,KAAoB,EACpB,IAAsB,EACtB,IAAc;QAEd,IAAI,UAAkB,CAAC;QACvB,IAAI,MAAe,CAAC;QACpB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM,GAAG,IAAe,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,8DAA8D;oBAC5D,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,0CAA0C;oBAChE,oEAAoE,CACvE,CAAC;YACJ,CAAC;YACD,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAC,MAAmB,EAAE,MAAe;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;CACF;AAnED,wCAmEC"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":";;;AACA,qCAAsC;AA8CtC;;;;;;GAMG;AACH,MAAa,cAAc;IAIzB,YAAY,OAAgD;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAc,KAAuB,EAAE,UAAkB;QAC5D,OAAO,IAAA,mBAAU,EAAC,KAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IA2BD,KAAK,CAAC,GAAG,CACP,KAAoB,EACpB,IAAsB,EACtB,IAAc;QAEd,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,OAAO,CAAC,IAAI,kCAAkC;gBACjF,8CAA8C,CACjD,CAAC;QACJ,CAAC;QACD,IAAI,UAAkB,CAAC;QACvB,IAAI,MAAe,CAAC;QACpB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM,GAAG,IAAe,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,8DAA8D;oBAC5D,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,0CAA0C;oBAChE,oEAAoE,CACvE,CAAC;YACJ,CAAC;YACD,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAmB,EAAE,MAAe;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;CACF;AApFD,wCAoFC"}
package/dist/parsed.d.ts CHANGED
@@ -109,13 +109,34 @@ export type ParsedInclude = {
109
109
  };
110
110
  export type ParsedPagination = {
111
111
  kind: "all";
112
+ showNumber: boolean;
113
+ showTotal: boolean;
112
114
  } | {
113
115
  kind: "first";
116
+ showNumber: boolean;
117
+ showTotal: boolean;
114
118
  } | {
115
119
  kind: "page";
116
120
  page: number;
117
121
  perPage: number;
122
+ showNumber: boolean;
123
+ showTotal: boolean;
118
124
  };
125
+ /**
126
+ * Shape returned by `engine.run` on executable adapters (e.g. TypeORM).
127
+ * `current` / `total` are populated according to `pagination.showNumber` /
128
+ * `pagination.showTotal` on the parsed query (both default to `true`).
129
+ */
130
+ export interface PaginatedResult<T> {
131
+ data: T[];
132
+ /** Rows in this page. Present when `pagination.showNumber` is true. */
133
+ current?: number;
134
+ /**
135
+ * Rows matching the query without pagination. Present when
136
+ * `pagination.showTotal` is true. Sourced from `getManyAndCount`.
137
+ */
138
+ total?: number;
139
+ }
119
140
  export interface ParsedQuery {
120
141
  rootEntity: string;
121
142
  orderBy?: ParsedOrderBy;
@@ -1 +1 @@
1
- {"version":3,"file":"parsed.d.ts","sourceRoot":"","sources":["../src/parsed.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GACzD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEN,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC;;;OAGG;IACH,EAAE,EAAE,cAAc,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,gBAAgB,CAAC;CAC9B"}
1
+ {"version":3,"file":"parsed.d.ts","sourceRoot":"","sources":["../src/parsed.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,aAAa,EAMd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAUV,WAAW,EAIZ,MAAM,UAAU,CAAC;AA+hBlB,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW,CAwCb"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,aAAa,EAMd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAUV,WAAW,EAIZ,MAAM,UAAU,CAAC;AAqjBlB,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW,CAwCb"}
package/dist/parser.js CHANGED
@@ -347,16 +347,27 @@ function parseInclude(raw, entity, schema, path) {
347
347
  }
348
348
  return { kind: "map", relations };
349
349
  }
350
+ function parseShowFlag(raw, key, path) {
351
+ if (raw === undefined)
352
+ return true;
353
+ if (typeof raw !== "boolean") {
354
+ throw new errors_1.QueryValidationError(`pagination.${key} must be a boolean`, `${path}.${key}`);
355
+ }
356
+ return raw;
357
+ }
350
358
  function parsePagination(raw, path) {
351
- if (raw === "all")
352
- return { kind: "all" };
353
- if (raw === "first")
354
- return { kind: "first" };
359
+ if (raw === "all") {
360
+ return { kind: "all", showNumber: true, showTotal: true };
361
+ }
362
+ if (raw === "first") {
363
+ return { kind: "first", showNumber: true, showTotal: true };
364
+ }
355
365
  if (!isPlainObject(raw)) {
356
366
  throw new errors_1.QueryValidationError("pagination must be 'all', 'first', or an object", path);
357
367
  }
358
- const pageRaw = raw.page;
359
- const perPageRaw = raw.perPage;
368
+ const obj = raw;
369
+ const pageRaw = obj.page;
370
+ const perPageRaw = obj.perPage;
360
371
  const page = pageRaw === undefined ? 0 : Number(pageRaw);
361
372
  const perPage = perPageRaw === undefined ? 20 : Number(perPageRaw);
362
373
  if (!Number.isInteger(page) || page < 0) {
@@ -365,7 +376,9 @@ function parsePagination(raw, path) {
365
376
  if (!Number.isInteger(perPage) || perPage <= 0) {
366
377
  throw new errors_1.QueryValidationError("pagination.perPage must be a positive integer", `${path}.perPage`);
367
378
  }
368
- return { kind: "page", page, perPage };
379
+ const showNumber = parseShowFlag(obj.showNumber, "showNumber", path);
380
+ const showTotal = parseShowFlag(obj.showTotal, "showTotal", path);
381
+ return { kind: "page", page, perPage, showNumber, showTotal };
369
382
  }
370
383
  // Avoid leaning on a circular type import in parseLeafCondition's signature.
371
384
  // (The helper above is intentionally typed loosely; this re-export is the
@@ -382,7 +395,7 @@ function parseQuery(input, schema, rootEntity) {
382
395
  rootEntity,
383
396
  include: { kind: "none" },
384
397
  select: { kind: "all" },
385
- pagination: { kind: "all" },
398
+ pagination: { kind: "all", showNumber: true, showTotal: true },
386
399
  };
387
400
  if (input.orderBy !== undefined) {
388
401
  parsed.orderBy = parseOrderBy(input.orderBy, entity, "orderBy");