@generazioneai/genquery 0.12.1 → 0.13.1

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 (83) hide show
  1. package/README.md +41 -48
  2. package/dist/adapters/base.d.ts +9 -10
  3. package/dist/adapters/base.d.ts.map +1 -1
  4. package/dist/adapters/prisma/create.d.ts +2 -2
  5. package/dist/adapters/prisma/create.js +2 -2
  6. package/dist/engine.d.ts +9 -11
  7. package/dist/engine.d.ts.map +1 -1
  8. package/dist/engine.js +1 -1
  9. package/dist/engine.js.map +1 -1
  10. package/dist/parsed.d.ts +1 -1
  11. package/dist/schema.d.ts +2 -3
  12. package/dist/schema.d.ts.map +1 -1
  13. package/dist/schema.js.map +1 -1
  14. package/package.json +5 -25
  15. package/spec.md +2 -2
  16. package/dist/adapters/typeorm/adapter.d.ts +0 -42
  17. package/dist/adapters/typeorm/adapter.d.ts.map +0 -1
  18. package/dist/adapters/typeorm/adapter.js +0 -135
  19. package/dist/adapters/typeorm/adapter.js.map +0 -1
  20. package/dist/adapters/typeorm/aliases.d.ts +0 -25
  21. package/dist/adapters/typeorm/aliases.d.ts.map +0 -1
  22. package/dist/adapters/typeorm/aliases.js +0 -47
  23. package/dist/adapters/typeorm/aliases.js.map +0 -1
  24. package/dist/adapters/typeorm/create.d.ts +0 -29
  25. package/dist/adapters/typeorm/create.d.ts.map +0 -1
  26. package/dist/adapters/typeorm/create.js +0 -29
  27. package/dist/adapters/typeorm/create.js.map +0 -1
  28. package/dist/adapters/typeorm/escape.d.ts +0 -5
  29. package/dist/adapters/typeorm/escape.d.ts.map +0 -1
  30. package/dist/adapters/typeorm/escape.js +0 -13
  31. package/dist/adapters/typeorm/escape.js.map +0 -1
  32. package/dist/adapters/typeorm/index.d.ts +0 -4
  33. package/dist/adapters/typeorm/index.d.ts.map +0 -1
  34. package/dist/adapters/typeorm/index.js +0 -10
  35. package/dist/adapters/typeorm/index.js.map +0 -1
  36. package/dist/adapters/typeorm/joins.d.ts +0 -29
  37. package/dist/adapters/typeorm/joins.d.ts.map +0 -1
  38. package/dist/adapters/typeorm/joins.js +0 -91
  39. package/dist/adapters/typeorm/joins.js.map +0 -1
  40. package/dist/adapters/typeorm/params.d.ts +0 -8
  41. package/dist/adapters/typeorm/params.d.ts.map +0 -1
  42. package/dist/adapters/typeorm/params.js +0 -15
  43. package/dist/adapters/typeorm/params.js.map +0 -1
  44. package/dist/adapters/typeorm/schema-from-typeorm.d.ts +0 -50
  45. package/dist/adapters/typeorm/schema-from-typeorm.d.ts.map +0 -1
  46. package/dist/adapters/typeorm/schema-from-typeorm.js +0 -197
  47. package/dist/adapters/typeorm/schema-from-typeorm.js.map +0 -1
  48. package/dist/adapters/typeorm/where.d.ts +0 -26
  49. package/dist/adapters/typeorm/where.d.ts.map +0 -1
  50. package/dist/adapters/typeorm/where.js +0 -315
  51. package/dist/adapters/typeorm/where.js.map +0 -1
  52. package/dist/paginate/cursor.d.ts +0 -18
  53. package/dist/paginate/cursor.d.ts.map +0 -1
  54. package/dist/paginate/cursor.js +0 -53
  55. package/dist/paginate/cursor.js.map +0 -1
  56. package/dist/paginate/in-memory.d.ts +0 -13
  57. package/dist/paginate/in-memory.d.ts.map +0 -1
  58. package/dist/paginate/in-memory.js +0 -21
  59. package/dist/paginate/in-memory.js.map +0 -1
  60. package/dist/paginate/index.d.ts +0 -27
  61. package/dist/paginate/index.d.ts.map +0 -1
  62. package/dist/paginate/index.js +0 -33
  63. package/dist/paginate/index.js.map +0 -1
  64. package/dist/paginate/model.d.ts +0 -16
  65. package/dist/paginate/model.d.ts.map +0 -1
  66. package/dist/paginate/model.js +0 -3
  67. package/dist/paginate/model.js.map +0 -1
  68. package/dist/paginate/offset.d.ts +0 -25
  69. package/dist/paginate/offset.d.ts.map +0 -1
  70. package/dist/paginate/offset.js +0 -74
  71. package/dist/paginate/offset.js.map +0 -1
  72. package/dist/paginate/pagination.d.ts +0 -18
  73. package/dist/paginate/pagination.d.ts.map +0 -1
  74. package/dist/paginate/pagination.js +0 -47
  75. package/dist/paginate/pagination.js.map +0 -1
  76. package/dist/paginate/transform.d.ts +0 -15
  77. package/dist/paginate/transform.d.ts.map +0 -1
  78. package/dist/paginate/transform.js +0 -43
  79. package/dist/paginate/transform.js.map +0 -1
  80. package/dist/paginate/types.d.ts +0 -93
  81. package/dist/paginate/types.d.ts.map +0 -1
  82. package/dist/paginate/types.js +0 -10
  83. package/dist/paginate/types.js.map +0 -1
@@ -1,197 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.schemaFromTypeORM = schemaFromTypeORM;
4
- /**
5
- * Build a genquery `Schema` from an initialized TypeORM `DataSource`.
6
- *
7
- * The DataSource must be initialized (`await dataSource.initialize()`) before
8
- * calling this function; otherwise `entityMetadatas` will be empty.
9
- *
10
- * const dataSource = new DataSource({ ... });
11
- * await dataSource.initialize();
12
- * const schema = schemaFromTypeORM(dataSource);
13
- * const adapter = new TypeORMAdapter(schema);
14
- * const engine = new GenQueryEngine({ schema, adapter });
15
- *
16
- * Restrict to specific entities:
17
- *
18
- * const schema = schemaFromTypeORM(dataSource, { entities: [User, Post] });
19
- *
20
- * Override a column type that isn't auto-detected:
21
- *
22
- * const schema = schemaFromTypeORM(dataSource, {
23
- * overrides: { User: { preferences: "string" } },
24
- * });
25
- */
26
- function schemaFromTypeORM(dataSource, options = {}) {
27
- const all = dataSource.entityMetadatas;
28
- const filter = options.entities;
29
- const selected = filter
30
- ? all.filter((m) => filter.some((t) => typeof t === "string" ? t === m.name : t === m.target))
31
- : all;
32
- const entities = {};
33
- for (const meta of selected) {
34
- entities[meta.name] = buildEntity(meta, options);
35
- }
36
- return { entities };
37
- }
38
- function buildEntity(meta, options) {
39
- const fields = {};
40
- const overrides = options.overrides?.[meta.name] ?? {};
41
- const keyColumns = collectKeyColumnNames(meta);
42
- for (const col of meta.columns) {
43
- const explicit = overrides[col.propertyName];
44
- if (explicit) {
45
- fields[col.propertyName] = { type: explicit, nullable: col.isNullable };
46
- continue;
47
- }
48
- // Enum columns: extract values so the parser can validate the allowlist.
49
- if (isStringEnumColumn(col)) {
50
- fields[col.propertyName] = {
51
- type: "enum",
52
- values: col.enum.slice(),
53
- nullable: col.isNullable,
54
- };
55
- continue;
56
- }
57
- // Key-like columns (primary keys, foreign keys, uuid-typed columns) are
58
- // always matched by exact equality — never with LIKE/ILIKE, which fails
59
- // outright on Postgres `uuid`.
60
- if (keyColumns.has(col.propertyName) || isUuidColumn(col)) {
61
- fields[col.propertyName] = { type: "id", nullable: col.isNullable };
62
- continue;
63
- }
64
- const fieldType = mapColumnType(col, meta.name, options);
65
- if (!fieldType)
66
- continue;
67
- fields[col.propertyName] = { type: fieldType, nullable: col.isNullable };
68
- }
69
- // Add any overrides that didn't correspond to a real column (e.g. virtual fields).
70
- for (const [name, type] of Object.entries(overrides)) {
71
- if (!fields[name])
72
- fields[name] = { type };
73
- }
74
- const relations = {};
75
- for (const rel of meta.relations) {
76
- relations[rel.propertyName] = {
77
- target: rel.inverseEntityMetadata.name,
78
- kind: rel.isOneToOne || rel.isManyToOne ? "one" : "many",
79
- };
80
- }
81
- const definition = {
82
- name: meta.name,
83
- fields,
84
- };
85
- if (Object.keys(relations).length > 0)
86
- definition.relations = relations;
87
- const pk = meta.primaryColumns[0]?.propertyName;
88
- if (pk)
89
- definition.primaryKey = pk;
90
- return definition;
91
- }
92
- function isStringEnumColumn(col) {
93
- if (!Array.isArray(col.enum) || col.enum.length === 0)
94
- return false;
95
- return col.enum.every((v) => typeof v === "string");
96
- }
97
- function isUuidColumn(col) {
98
- const t = col.type;
99
- return typeof t === "string" && t.toLowerCase() === "uuid";
100
- }
101
- function collectKeyColumnNames(meta) {
102
- const names = new Set();
103
- for (const pk of meta.primaryColumns) {
104
- names.add(pk.propertyName);
105
- }
106
- for (const rel of meta.relations) {
107
- for (const jc of rel.joinColumns) {
108
- // `propertyName` here is the FK property on the parent entity
109
- // (e.g. `companyId`), not the related entity's id field.
110
- if (jc.propertyName)
111
- names.add(jc.propertyName);
112
- }
113
- }
114
- return names;
115
- }
116
- function mapColumnType(col, entityName, options) {
117
- const t = col.type;
118
- if (typeof t === "function") {
119
- if (t === String)
120
- return "string";
121
- if (t === Number)
122
- return "number";
123
- if (t === Boolean)
124
- return "boolean";
125
- if (t === Date)
126
- return "date";
127
- }
128
- else if (typeof t === "string") {
129
- const norm = t.toLowerCase();
130
- if (STRING_TYPES.has(norm))
131
- return "string";
132
- if (NUMBER_TYPES.has(norm))
133
- return "number";
134
- if (BOOLEAN_TYPES.has(norm))
135
- return "boolean";
136
- if (DATE_TYPES.has(norm) || norm.startsWith("timestamp"))
137
- return "date";
138
- // "enum" / "simple-enum" columns are handled earlier via isStringEnumColumn.
139
- // If we reach this point, the values weren't strings — let the fallback decide.
140
- }
141
- return options.fallback?.(entityName, col.propertyName, t);
142
- }
143
- const STRING_TYPES = new Set([
144
- "string",
145
- "varchar",
146
- "varchar2",
147
- "char",
148
- "character",
149
- "character varying",
150
- "text",
151
- "tinytext",
152
- "mediumtext",
153
- "longtext",
154
- "ntext",
155
- "uuid",
156
- "citext",
157
- "nvarchar",
158
- "nvarchar2",
159
- "nchar",
160
- ]);
161
- const NUMBER_TYPES = new Set([
162
- "int",
163
- "int2",
164
- "int4",
165
- "int8",
166
- "integer",
167
- "tinyint",
168
- "smallint",
169
- "mediumint",
170
- "bigint",
171
- "decimal",
172
- "numeric",
173
- "real",
174
- "float",
175
- "float4",
176
- "float8",
177
- "double",
178
- "double precision",
179
- "money",
180
- "smallmoney",
181
- "year",
182
- ]);
183
- const BOOLEAN_TYPES = new Set(["bool", "boolean"]);
184
- const DATE_TYPES = new Set([
185
- "date",
186
- "datetime",
187
- "datetime2",
188
- "datetimeoffset",
189
- "smalldatetime",
190
- "time",
191
- "timetz",
192
- "time with time zone",
193
- "time without time zone",
194
- "timestamp with time zone",
195
- "timestamp without time zone",
196
- ]);
197
- //# sourceMappingURL=schema-from-typeorm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-from-typeorm.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/schema-from-typeorm.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { type DataSource, type WhereExpressionBuilder } from "typeorm";
2
- import type { ParsedSearchBy } from "../../parsed";
3
- import type { Schema } from "../../schema";
4
- import type { AliasRegistry } from "./aliases";
5
- import type { ParamCounter } from "./params";
6
- export interface WhereCtx {
7
- schema: Schema;
8
- aliases: AliasRegistry;
9
- params: ParamCounter;
10
- /** Bag of parameters collected for the outer QueryBuilder. */
11
- paramBag: Record<string, unknown>;
12
- /** Alias of the entity at the current scope. */
13
- currentAlias: string;
14
- /** Logical path from root, used to look up nested relation aliases. */
15
- currentPath: string;
16
- /** Entity name (as known to TypeORM metadata) at the current scope. */
17
- currentEntity: string;
18
- /** TypeORM DataSource / Connection — used to resolve relation metadata for every/none subqueries. */
19
- connection: DataSource;
20
- }
21
- /**
22
- * Apply a `ParsedSearchBy` inside a TypeORM `Brackets` callback. Caller is
23
- * responsible for wrapping with `qb.andWhere(new Brackets(b => applySearchByInside(b, ..., ctx)))`.
24
- */
25
- export declare function applySearchByInside(qb: WhereExpressionBuilder, searchBy: ParsedSearchBy, ctx: WhereCtx): void;
26
- //# sourceMappingURL=where.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/where.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjF,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,qGAAqG;IACrG,UAAU,EAAE,UAAU,CAAC;CACxB;AAoVD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,sBAAsB,EAC1B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,QAAQ,GACZ,IAAI,CAsBN"}
@@ -1,315 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applySearchByInside = applySearchByInside;
4
- const typeorm_1 = require("typeorm");
5
- const errors_1 = require("../../errors");
6
- const escape_1 = require("./escape");
7
- function qualify(alias, field) {
8
- return `"${alias}"."${field}"`;
9
- }
10
- function buildString(alias, field, search, params) {
11
- const col = qualify(alias, field);
12
- // Cast to text so LIKE / ILIKE / regex operators work on non-text columns
13
- // (notably Postgres `uuid`, which has no `~~*` / `~*` operator). No-op for
14
- // text-like columns.
15
- const textCol = `${col}::text`;
16
- const like = search.caseSensitive ? "LIKE" : "ILIKE";
17
- switch (search.mode) {
18
- case "exact": {
19
- const p = params.next();
20
- if (search.contained) {
21
- return {
22
- sql: `${textCol} ${like} :${p}`,
23
- params: { [p]: `%${(0, escape_1.escapeLike)(search.value)}%` },
24
- };
25
- }
26
- if (search.caseSensitive) {
27
- return {
28
- sql: `${col} = :${p}`,
29
- params: { [p]: search.value },
30
- };
31
- }
32
- // Case-insensitive equality via ILIKE on the escaped literal (no wildcards).
33
- return {
34
- sql: `${textCol} ILIKE :${p}`,
35
- params: { [p]: (0, escape_1.escapeLike)(search.value) },
36
- };
37
- }
38
- case "nativeregex": {
39
- const p = params.next();
40
- const op = search.caseSensitive ? "~" : "~*";
41
- return {
42
- sql: `${textCol} ${op} :${p}`,
43
- params: { [p]: search.value },
44
- };
45
- }
46
- case "splitword": {
47
- const words = (0, escape_1.splitWords)(search.value);
48
- if (words.length === 0) {
49
- return { sql: "1=1", params: {} };
50
- }
51
- const parts = [];
52
- const out = {};
53
- for (const w of words) {
54
- const p = params.next();
55
- const pattern = search.contained
56
- ? `%${(0, escape_1.escapeLike)(w)}%`
57
- : (0, escape_1.escapeLike)(w);
58
- parts.push(`${textCol} ${like} :${p}`);
59
- out[p] = pattern;
60
- }
61
- return { sql: `(${parts.join(" OR ")})`, params: out };
62
- }
63
- }
64
- }
65
- function buildNumber(alias, field, search, params) {
66
- const col = qualify(alias, field);
67
- const p = params.next();
68
- const op = search.op === "==" ? "=" : search.op;
69
- return { sql: `${col} ${op} :${p}`, params: { [p]: search.value } };
70
- }
71
- function buildDate(alias, field, search, params) {
72
- const col = qualify(alias, field);
73
- if (search.kind === "exact") {
74
- const p = params.next();
75
- return { sql: `${col} = :${p}`, params: { [p]: search.value } };
76
- }
77
- // range
78
- const clauses = [];
79
- const out = {};
80
- if (search.after) {
81
- const p = params.next();
82
- clauses.push(`${col} > :${p}`);
83
- out[p] = search.after;
84
- }
85
- if (search.before) {
86
- const p = params.next();
87
- clauses.push(`${col} < :${p}`);
88
- out[p] = search.before;
89
- }
90
- return { sql: clauses.join(" AND "), params: out };
91
- }
92
- function buildLeaf(cond, ctx) {
93
- switch (cond.kind) {
94
- case "string":
95
- return buildString(ctx.currentAlias, cond.field, cond.search, ctx.params);
96
- case "number":
97
- return buildNumber(ctx.currentAlias, cond.field, cond.search, ctx.params);
98
- case "bool": {
99
- const p = ctx.params.next();
100
- return {
101
- sql: `${qualify(ctx.currentAlias, cond.field)} = :${p}`,
102
- params: { [p]: cond.search.value },
103
- };
104
- }
105
- case "date":
106
- return buildDate(ctx.currentAlias, cond.field, cond.search, ctx.params);
107
- case "enum": {
108
- const p = ctx.params.next();
109
- return {
110
- sql: `${qualify(ctx.currentAlias, cond.field)} = :${p}`,
111
- params: { [p]: cond.search.value },
112
- };
113
- }
114
- case "id": {
115
- const p = ctx.params.next();
116
- return {
117
- sql: `${qualify(ctx.currentAlias, cond.field)} = :${p}`,
118
- params: { [p]: cond.search.value },
119
- };
120
- }
121
- case "in": {
122
- const p = ctx.params.next();
123
- return {
124
- sql: `${qualify(ctx.currentAlias, cond.field)} IN (:...${p})`,
125
- params: { [p]: cond.values },
126
- };
127
- }
128
- case "null": {
129
- const col = qualify(ctx.currentAlias, cond.field);
130
- return {
131
- sql: `${col} IS ${cond.check.isNull ? "" : "NOT "}NULL`,
132
- params: {},
133
- };
134
- }
135
- case "empty": {
136
- const col = qualify(ctx.currentAlias, cond.field);
137
- const sql = cond.check.isEmpty
138
- ? `(${col} IS NULL OR ${col} = '')`
139
- : `(${col} IS NOT NULL AND ${col} <> '')`;
140
- return { sql, params: {} };
141
- }
142
- }
143
- }
144
- function joinPath(parent, child) {
145
- return parent ? `${parent}.${child}` : child;
146
- }
147
- function applyCondition(qb, cond, ctx, isFirst) {
148
- if (cond.kind === "relation") {
149
- if (cond.op === "some") {
150
- const path = joinPath(ctx.currentPath, cond.field);
151
- const relAlias = ctx.aliases.get(path);
152
- if (!relAlias) {
153
- throw new Error(`genquery/typeorm: missing join for relation path '${path}'`);
154
- }
155
- const subCtx = {
156
- ...ctx,
157
- currentAlias: relAlias,
158
- currentPath: path,
159
- currentEntity: cond.targetEntity,
160
- };
161
- const brackets = new typeorm_1.Brackets((sub) => applySearchByInside(sub, cond.nested, subCtx));
162
- if (isFirst)
163
- qb.where(brackets);
164
- else
165
- qb.andWhere(brackets);
166
- return;
167
- }
168
- // every / none → EXISTS / NOT EXISTS subquery
169
- const fragment = buildExistsSubquery(cond, ctx);
170
- Object.assign(ctx.paramBag, fragment.params);
171
- if (isFirst)
172
- qb.where(fragment.sql, fragment.params);
173
- else
174
- qb.andWhere(fragment.sql, fragment.params);
175
- return;
176
- }
177
- const fragment = buildLeaf(cond, ctx);
178
- Object.assign(ctx.paramBag, fragment.params);
179
- if (isFirst)
180
- qb.where(fragment.sql, fragment.params);
181
- else
182
- qb.andWhere(fragment.sql, fragment.params);
183
- }
184
- /**
185
- * Build a `[NOT] EXISTS (SELECT 1 FROM target WHERE ...)` fragment for
186
- * `every` / `none` relation conditions. Resolves FK columns through TypeORM's
187
- * own EntityMetadata so we don't reinvent relation introspection.
188
- *
189
- * Restrictions (Phase 1):
190
- * - One-to-many and many-to-one (and one-to-one) relations are supported.
191
- * - Many-to-many goes through a junction table and isn't supported here yet.
192
- * - The nested `searchBy` must contain only leaf conditions and OR — nested
193
- * relation filters inside `every`/`none` are not yet supported.
194
- */
195
- function buildExistsSubquery(cond, ctx) {
196
- const parentMeta = ctx.connection.getMetadata(ctx.currentEntity);
197
- const relMeta = parentMeta.relations.find((r) => r.propertyName === cond.field);
198
- if (!relMeta) {
199
- throw new Error(`genquery/typeorm: no TypeORM relation metadata for '${ctx.currentEntity}.${cond.field}'`);
200
- }
201
- if (relMeta.isManyToMany) {
202
- throw new errors_1.QueryValidationError(`Relation '${cond.field}' is many-to-many; '${cond.op}' filtering isn't supported yet for M2M relations`, cond.field);
203
- }
204
- const targetMeta = relMeta.inverseEntityMetadata;
205
- const targetTable = targetMeta.tableName;
206
- const subAlias = `${ctx.currentAlias}__${cond.field}__sub`;
207
- // Determine the join condition between parent alias and the subquery alias.
208
- let joinSql;
209
- if (relMeta.joinColumns.length > 0) {
210
- // Owning side (many-to-one / owning one-to-one): FK column lives on the
211
- // parent table, references target's referenced column.
212
- const fk = relMeta.joinColumns[0];
213
- const parentCol = fk.databaseName;
214
- const targetCol = fk.referencedColumn?.databaseName
215
- ?? targetMeta.primaryColumns[0].databaseName;
216
- joinSql = `"${subAlias}"."${targetCol}" = "${ctx.currentAlias}"."${parentCol}"`;
217
- }
218
- else if (relMeta.inverseRelation) {
219
- // Inverse side (one-to-many / inverse one-to-one): FK lives on the target.
220
- const fk = relMeta.inverseRelation.joinColumns[0];
221
- if (!fk) {
222
- throw new Error(`genquery/typeorm: cannot resolve foreign key for relation '${cond.field}'`);
223
- }
224
- const targetFk = fk.databaseName;
225
- const parentPk = fk.referencedColumn?.databaseName
226
- ?? parentMeta.primaryColumns[0].databaseName;
227
- joinSql = `"${subAlias}"."${targetFk}" = "${ctx.currentAlias}"."${parentPk}"`;
228
- }
229
- else {
230
- throw new Error(`genquery/typeorm: cannot resolve join columns for relation '${cond.field}'`);
231
- }
232
- const subCtx = {
233
- ...ctx,
234
- currentAlias: subAlias,
235
- currentPath: joinPath(ctx.currentPath, cond.field),
236
- currentEntity: cond.targetEntity,
237
- };
238
- const nestedFrag = buildSearchByFragment(cond.nested, subCtx);
239
- let whereContent = joinSql;
240
- if (nestedFrag.sql) {
241
- const inner = cond.op === "every" ? `NOT (${nestedFrag.sql})` : nestedFrag.sql;
242
- whereContent = `${joinSql} AND ${inner}`;
243
- }
244
- else if (cond.op === "every") {
245
- // every(no conditions) ≡ "no related rows that violate nothing", i.e. true.
246
- // Special-case: no WHERE on the nested side means `every` is trivially
247
- // satisfied (no row can violate an empty predicate).
248
- return { sql: "1=1", params: {} };
249
- }
250
- const exists = cond.op === "some" ? "EXISTS" : "NOT EXISTS";
251
- const sql = `${exists} (SELECT 1 FROM "${targetTable}" "${subAlias}" WHERE ${whereContent})`;
252
- return { sql, params: nestedFrag.params };
253
- }
254
- /**
255
- * Build a SQL fragment representing an entire ParsedSearchBy (conditions
256
- * AND-ed together, with the OR group AND-ed in). Used inside EXISTS
257
- * subqueries where we need raw SQL rather than a builder mutation.
258
- *
259
- * Throws if a nested relation appears — those need their own EXISTS subquery
260
- * with metadata resolution, which Phase 1 doesn't support inside every/none.
261
- */
262
- function buildSearchByFragment(searchBy, ctx) {
263
- const andParts = [];
264
- const params = {};
265
- for (const cond of searchBy.conditions) {
266
- if (cond.kind === "relation") {
267
- throw new errors_1.QueryValidationError(`Nested relation filter '${cond.field}' inside 'every'/'none' is not supported in this version`, joinPath(ctx.currentPath, cond.field));
268
- }
269
- const frag = buildLeaf(cond, ctx);
270
- andParts.push(frag.sql);
271
- Object.assign(params, frag.params);
272
- }
273
- if (searchBy.or.length > 0) {
274
- const orParts = [];
275
- for (const sub of searchBy.or) {
276
- const subFrag = buildSearchByFragment(sub, ctx);
277
- if (subFrag.sql)
278
- orParts.push(`(${subFrag.sql})`);
279
- Object.assign(params, subFrag.params);
280
- }
281
- if (orParts.length > 0)
282
- andParts.push(`(${orParts.join(" OR ")})`);
283
- }
284
- return { sql: andParts.join(" AND "), params };
285
- }
286
- /**
287
- * Apply a `ParsedSearchBy` inside a TypeORM `Brackets` callback. Caller is
288
- * responsible for wrapping with `qb.andWhere(new Brackets(b => applySearchByInside(b, ..., ctx)))`.
289
- */
290
- function applySearchByInside(qb, searchBy, ctx) {
291
- let first = true;
292
- for (const cond of searchBy.conditions) {
293
- applyCondition(qb, cond, ctx, first);
294
- first = false;
295
- }
296
- if (searchBy.or.length > 0) {
297
- const orBrackets = new typeorm_1.Brackets((orQb) => {
298
- let orFirst = true;
299
- for (const sub of searchBy.or) {
300
- const sub_brackets = new typeorm_1.Brackets((b) => applySearchByInside(b, sub, ctx));
301
- if (orFirst)
302
- orQb.where(sub_brackets);
303
- else
304
- orQb.orWhere(sub_brackets);
305
- orFirst = false;
306
- }
307
- });
308
- if (first)
309
- qb.where(orBrackets);
310
- else
311
- qb.andWhere(orBrackets);
312
- first = false;
313
- }
314
- }
315
- //# sourceMappingURL=where.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/where.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { PrismaModelDelegate } from "./model";
2
- import type { CursorPaginateOptions, CursorPaginatedResult } from "./types";
3
- /**
4
- * Cursor-paginate a Prisma model — O(1) deep pagination (no growing OFFSET),
5
- * the efficient choice for infinite-scroll / large datasets.
6
- *
7
- * let res = await paginateCursor(prisma.post, { where }, { perPage: 20 });
8
- * // next page:
9
- * res = await paginateCursor(prisma.post, { where }, { perPage: 20, cursor: res.meta.nextCursor });
10
- *
11
- * `cursorField` must be unique & sequential (default `"id"`). The field is
12
- * appended to the caller's `orderBy` so ordering is deterministic. No COUNT is
13
- * ever issued. `direction: "backward"` sorts the cursor field descending.
14
- *
15
- * The `model` may be an authz-scoped delegate; scoping is preserved.
16
- */
17
- export declare function paginateCursor<T = any>(model: PrismaModelDelegate, args?: Record<string, any>, options?: CursorPaginateOptions<T>): Promise<CursorPaginatedResult<T>>;
18
- //# sourceMappingURL=cursor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/paginate/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG5E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,GAAG,EAC1C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC9B,OAAO,GAAE,qBAAqB,CAAC,CAAC,CAAM,GACrC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAqCnC"}
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paginateCursor = paginateCursor;
4
- const transform_1 = require("./transform");
5
- /**
6
- * Cursor-paginate a Prisma model — O(1) deep pagination (no growing OFFSET),
7
- * the efficient choice for infinite-scroll / large datasets.
8
- *
9
- * let res = await paginateCursor(prisma.post, { where }, { perPage: 20 });
10
- * // next page:
11
- * res = await paginateCursor(prisma.post, { where }, { perPage: 20, cursor: res.meta.nextCursor });
12
- *
13
- * `cursorField` must be unique & sequential (default `"id"`). The field is
14
- * appended to the caller's `orderBy` so ordering is deterministic. No COUNT is
15
- * ever issued. `direction: "backward"` sorts the cursor field descending.
16
- *
17
- * The `model` may be an authz-scoped delegate; scoping is preserved.
18
- */
19
- async function paginateCursor(model, args = {}, options = {}) {
20
- const perPage = Number(options.perPage) || 10;
21
- const field = options.cursorField ?? "id";
22
- const dir = options.direction === "backward" ? "desc" : "asc";
23
- const baseOrder = args.orderBy
24
- ? Array.isArray(args.orderBy)
25
- ? args.orderBy
26
- : [args.orderBy]
27
- : [];
28
- const findArgs = {
29
- ...args,
30
- orderBy: [...baseOrder, { [field]: dir }],
31
- take: perPage + 1,
32
- };
33
- const hasCursor = options.cursor !== undefined && options.cursor !== null;
34
- if (hasCursor) {
35
- findArgs.cursor = { [field]: options.cursor };
36
- findArgs.skip = 1; // skip the cursor row itself
37
- }
38
- const rows = await model.findMany(findArgs);
39
- const hasNext = rows.length > perPage;
40
- const pageRows = hasNext ? rows.slice(0, perPage) : rows;
41
- const last = pageRows[pageRows.length - 1];
42
- return {
43
- data: (0, transform_1.applyTransform)(pageRows, options),
44
- meta: {
45
- perPage,
46
- nextCursor: hasNext && last ? String(last[field]) : null,
47
- prevCursor: hasCursor ? String(options.cursor) : null,
48
- hasNext,
49
- hasPrev: hasCursor,
50
- },
51
- };
52
- }
53
- //# sourceMappingURL=cursor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/paginate/cursor.ts"],"names":[],"mappings":";;AAkBA,wCAyCC;AAzDD,2CAA6C;AAE7C;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,OAA4B,EAAE,EAC9B,UAAoC,EAAE;IAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO;QAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,QAAQ,GAAwB;QACpC,GAAG,IAAI;QACP,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACzC,IAAI,EAAE,OAAO,GAAG,CAAC;KAClB,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;IAC1E,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,6BAA6B;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,IAAA,0BAAc,EAAI,QAAQ,EAAE,OAAO,CAAC;QAC1C,IAAI,EAAE;YACJ,OAAO;YACP,UAAU,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACrD,OAAO;YACP,OAAO,EAAE,SAAS;SACnB;KACF,CAAC;AACJ,CAAC"}