@generazioneai/genquery 0.1.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.
- package/LICENSE +28 -0
- package/README.md +218 -0
- package/dist/adapters/base.d.ts +32 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +3 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/typeorm/adapter.d.ts +35 -0
- package/dist/adapters/typeorm/adapter.d.ts.map +1 -0
- package/dist/adapters/typeorm/adapter.js +111 -0
- package/dist/adapters/typeorm/adapter.js.map +1 -0
- package/dist/adapters/typeorm/aliases.d.ts +25 -0
- package/dist/adapters/typeorm/aliases.d.ts.map +1 -0
- package/dist/adapters/typeorm/aliases.js +47 -0
- package/dist/adapters/typeorm/aliases.js.map +1 -0
- package/dist/adapters/typeorm/create.d.ts +29 -0
- package/dist/adapters/typeorm/create.d.ts.map +1 -0
- package/dist/adapters/typeorm/create.js +29 -0
- package/dist/adapters/typeorm/create.js.map +1 -0
- package/dist/adapters/typeorm/escape.d.ts +5 -0
- package/dist/adapters/typeorm/escape.d.ts.map +1 -0
- package/dist/adapters/typeorm/escape.js +13 -0
- package/dist/adapters/typeorm/escape.js.map +1 -0
- package/dist/adapters/typeorm/index.d.ts +4 -0
- package/dist/adapters/typeorm/index.d.ts.map +1 -0
- package/dist/adapters/typeorm/index.js +10 -0
- package/dist/adapters/typeorm/index.js.map +1 -0
- package/dist/adapters/typeorm/joins.d.ts +29 -0
- package/dist/adapters/typeorm/joins.d.ts.map +1 -0
- package/dist/adapters/typeorm/joins.js +91 -0
- package/dist/adapters/typeorm/joins.js.map +1 -0
- package/dist/adapters/typeorm/params.d.ts +8 -0
- package/dist/adapters/typeorm/params.d.ts.map +1 -0
- package/dist/adapters/typeorm/params.js +15 -0
- package/dist/adapters/typeorm/params.js.map +1 -0
- package/dist/adapters/typeorm/schema-from-typeorm.d.ts +50 -0
- package/dist/adapters/typeorm/schema-from-typeorm.d.ts.map +1 -0
- package/dist/adapters/typeorm/schema-from-typeorm.js +170 -0
- package/dist/adapters/typeorm/schema-from-typeorm.js.map +1 -0
- package/dist/adapters/typeorm/where.d.ts +26 -0
- package/dist/adapters/typeorm/where.d.ts.map +1 -0
- package/dist/adapters/typeorm/where.js +297 -0
- package/dist/adapters/typeorm/where.js.map +1 -0
- package/dist/datetime.d.ts +4 -0
- package/dist/datetime.d.ts.map +1 -0
- package/dist/datetime.js +86 -0
- package/dist/datetime.js.map +1 -0
- package/dist/engine.d.ts +52 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +52 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/parsed.d.ts +127 -0
- package/dist/parsed.d.ts.map +1 -0
- package/dist/parsed.js +8 -0
- package/dist/parsed.js.map +1 -0
- package/dist/parser.d.ts +5 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +404 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema.d.ts +57 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +36 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +180 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +70 -0
- package/spec.md +221 -0
|
@@ -0,0 +1,297 @@
|
|
|
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
|
+
const like = search.caseSensitive ? "LIKE" : "ILIKE";
|
|
13
|
+
switch (search.mode) {
|
|
14
|
+
case "exact": {
|
|
15
|
+
const p = params.next();
|
|
16
|
+
if (search.contained) {
|
|
17
|
+
return {
|
|
18
|
+
sql: `${col} ${like} :${p}`,
|
|
19
|
+
params: { [p]: `%${(0, escape_1.escapeLike)(search.value)}%` },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (search.caseSensitive) {
|
|
23
|
+
return {
|
|
24
|
+
sql: `${col} = :${p}`,
|
|
25
|
+
params: { [p]: search.value },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Case-insensitive equality via ILIKE on the escaped literal (no wildcards).
|
|
29
|
+
return {
|
|
30
|
+
sql: `${col} ILIKE :${p}`,
|
|
31
|
+
params: { [p]: (0, escape_1.escapeLike)(search.value) },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
case "nativeregex": {
|
|
35
|
+
const p = params.next();
|
|
36
|
+
const op = search.caseSensitive ? "~" : "~*";
|
|
37
|
+
return {
|
|
38
|
+
sql: `${col} ${op} :${p}`,
|
|
39
|
+
params: { [p]: search.value },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
case "splitword": {
|
|
43
|
+
const words = (0, escape_1.splitWords)(search.value);
|
|
44
|
+
if (words.length === 0) {
|
|
45
|
+
return { sql: "1=1", params: {} };
|
|
46
|
+
}
|
|
47
|
+
const parts = [];
|
|
48
|
+
const out = {};
|
|
49
|
+
for (const w of words) {
|
|
50
|
+
const p = params.next();
|
|
51
|
+
const pattern = search.contained
|
|
52
|
+
? `%${(0, escape_1.escapeLike)(w)}%`
|
|
53
|
+
: (0, escape_1.escapeLike)(w);
|
|
54
|
+
parts.push(`${col} ${like} :${p}`);
|
|
55
|
+
out[p] = pattern;
|
|
56
|
+
}
|
|
57
|
+
return { sql: `(${parts.join(" OR ")})`, params: out };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildNumber(alias, field, search, params) {
|
|
62
|
+
const col = qualify(alias, field);
|
|
63
|
+
const p = params.next();
|
|
64
|
+
const op = search.op === "==" ? "=" : search.op;
|
|
65
|
+
return { sql: `${col} ${op} :${p}`, params: { [p]: search.value } };
|
|
66
|
+
}
|
|
67
|
+
function buildDate(alias, field, search, params) {
|
|
68
|
+
const col = qualify(alias, field);
|
|
69
|
+
if (search.kind === "exact") {
|
|
70
|
+
const p = params.next();
|
|
71
|
+
return { sql: `${col} = :${p}`, params: { [p]: search.value } };
|
|
72
|
+
}
|
|
73
|
+
// range
|
|
74
|
+
const clauses = [];
|
|
75
|
+
const out = {};
|
|
76
|
+
if (search.after) {
|
|
77
|
+
const p = params.next();
|
|
78
|
+
clauses.push(`${col} > :${p}`);
|
|
79
|
+
out[p] = search.after;
|
|
80
|
+
}
|
|
81
|
+
if (search.before) {
|
|
82
|
+
const p = params.next();
|
|
83
|
+
clauses.push(`${col} < :${p}`);
|
|
84
|
+
out[p] = search.before;
|
|
85
|
+
}
|
|
86
|
+
return { sql: clauses.join(" AND "), params: out };
|
|
87
|
+
}
|
|
88
|
+
function buildLeaf(cond, ctx) {
|
|
89
|
+
switch (cond.kind) {
|
|
90
|
+
case "string":
|
|
91
|
+
return buildString(ctx.currentAlias, cond.field, cond.search, ctx.params);
|
|
92
|
+
case "number":
|
|
93
|
+
return buildNumber(ctx.currentAlias, cond.field, cond.search, ctx.params);
|
|
94
|
+
case "bool": {
|
|
95
|
+
const p = ctx.params.next();
|
|
96
|
+
return {
|
|
97
|
+
sql: `${qualify(ctx.currentAlias, cond.field)} = :${p}`,
|
|
98
|
+
params: { [p]: cond.search.value },
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
case "date":
|
|
102
|
+
return buildDate(ctx.currentAlias, cond.field, cond.search, ctx.params);
|
|
103
|
+
case "enum": {
|
|
104
|
+
const p = ctx.params.next();
|
|
105
|
+
return {
|
|
106
|
+
sql: `${qualify(ctx.currentAlias, cond.field)} = :${p}`,
|
|
107
|
+
params: { [p]: cond.search.value },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
case "null": {
|
|
111
|
+
const col = qualify(ctx.currentAlias, cond.field);
|
|
112
|
+
return {
|
|
113
|
+
sql: `${col} IS ${cond.check.isNull ? "" : "NOT "}NULL`,
|
|
114
|
+
params: {},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
case "empty": {
|
|
118
|
+
const col = qualify(ctx.currentAlias, cond.field);
|
|
119
|
+
const sql = cond.check.isEmpty
|
|
120
|
+
? `(${col} IS NULL OR ${col} = '')`
|
|
121
|
+
: `(${col} IS NOT NULL AND ${col} <> '')`;
|
|
122
|
+
return { sql, params: {} };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function joinPath(parent, child) {
|
|
127
|
+
return parent ? `${parent}.${child}` : child;
|
|
128
|
+
}
|
|
129
|
+
function applyCondition(qb, cond, ctx, isFirst) {
|
|
130
|
+
if (cond.kind === "relation") {
|
|
131
|
+
if (cond.op === "some") {
|
|
132
|
+
const path = joinPath(ctx.currentPath, cond.field);
|
|
133
|
+
const relAlias = ctx.aliases.get(path);
|
|
134
|
+
if (!relAlias) {
|
|
135
|
+
throw new Error(`genquery/typeorm: missing join for relation path '${path}'`);
|
|
136
|
+
}
|
|
137
|
+
const subCtx = {
|
|
138
|
+
...ctx,
|
|
139
|
+
currentAlias: relAlias,
|
|
140
|
+
currentPath: path,
|
|
141
|
+
currentEntity: cond.targetEntity,
|
|
142
|
+
};
|
|
143
|
+
const brackets = new typeorm_1.Brackets((sub) => applySearchByInside(sub, cond.nested, subCtx));
|
|
144
|
+
if (isFirst)
|
|
145
|
+
qb.where(brackets);
|
|
146
|
+
else
|
|
147
|
+
qb.andWhere(brackets);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// every / none → EXISTS / NOT EXISTS subquery
|
|
151
|
+
const fragment = buildExistsSubquery(cond, ctx);
|
|
152
|
+
Object.assign(ctx.paramBag, fragment.params);
|
|
153
|
+
if (isFirst)
|
|
154
|
+
qb.where(fragment.sql, fragment.params);
|
|
155
|
+
else
|
|
156
|
+
qb.andWhere(fragment.sql, fragment.params);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const fragment = buildLeaf(cond, ctx);
|
|
160
|
+
Object.assign(ctx.paramBag, fragment.params);
|
|
161
|
+
if (isFirst)
|
|
162
|
+
qb.where(fragment.sql, fragment.params);
|
|
163
|
+
else
|
|
164
|
+
qb.andWhere(fragment.sql, fragment.params);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Build a `[NOT] EXISTS (SELECT 1 FROM target WHERE ...)` fragment for
|
|
168
|
+
* `every` / `none` relation conditions. Resolves FK columns through TypeORM's
|
|
169
|
+
* own EntityMetadata so we don't reinvent relation introspection.
|
|
170
|
+
*
|
|
171
|
+
* Restrictions (Phase 1):
|
|
172
|
+
* - One-to-many and many-to-one (and one-to-one) relations are supported.
|
|
173
|
+
* - Many-to-many goes through a junction table and isn't supported here yet.
|
|
174
|
+
* - The nested `searchBy` must contain only leaf conditions and OR — nested
|
|
175
|
+
* relation filters inside `every`/`none` are not yet supported.
|
|
176
|
+
*/
|
|
177
|
+
function buildExistsSubquery(cond, ctx) {
|
|
178
|
+
const parentMeta = ctx.connection.getMetadata(ctx.currentEntity);
|
|
179
|
+
const relMeta = parentMeta.relations.find((r) => r.propertyName === cond.field);
|
|
180
|
+
if (!relMeta) {
|
|
181
|
+
throw new Error(`genquery/typeorm: no TypeORM relation metadata for '${ctx.currentEntity}.${cond.field}'`);
|
|
182
|
+
}
|
|
183
|
+
if (relMeta.isManyToMany) {
|
|
184
|
+
throw new errors_1.QueryValidationError(`Relation '${cond.field}' is many-to-many; '${cond.op}' filtering isn't supported yet for M2M relations`, cond.field);
|
|
185
|
+
}
|
|
186
|
+
const targetMeta = relMeta.inverseEntityMetadata;
|
|
187
|
+
const targetTable = targetMeta.tableName;
|
|
188
|
+
const subAlias = `${ctx.currentAlias}__${cond.field}__sub`;
|
|
189
|
+
// Determine the join condition between parent alias and the subquery alias.
|
|
190
|
+
let joinSql;
|
|
191
|
+
if (relMeta.joinColumns.length > 0) {
|
|
192
|
+
// Owning side (many-to-one / owning one-to-one): FK column lives on the
|
|
193
|
+
// parent table, references target's referenced column.
|
|
194
|
+
const fk = relMeta.joinColumns[0];
|
|
195
|
+
const parentCol = fk.databaseName;
|
|
196
|
+
const targetCol = fk.referencedColumn?.databaseName
|
|
197
|
+
?? targetMeta.primaryColumns[0].databaseName;
|
|
198
|
+
joinSql = `"${subAlias}"."${targetCol}" = "${ctx.currentAlias}"."${parentCol}"`;
|
|
199
|
+
}
|
|
200
|
+
else if (relMeta.inverseRelation) {
|
|
201
|
+
// Inverse side (one-to-many / inverse one-to-one): FK lives on the target.
|
|
202
|
+
const fk = relMeta.inverseRelation.joinColumns[0];
|
|
203
|
+
if (!fk) {
|
|
204
|
+
throw new Error(`genquery/typeorm: cannot resolve foreign key for relation '${cond.field}'`);
|
|
205
|
+
}
|
|
206
|
+
const targetFk = fk.databaseName;
|
|
207
|
+
const parentPk = fk.referencedColumn?.databaseName
|
|
208
|
+
?? parentMeta.primaryColumns[0].databaseName;
|
|
209
|
+
joinSql = `"${subAlias}"."${targetFk}" = "${ctx.currentAlias}"."${parentPk}"`;
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
throw new Error(`genquery/typeorm: cannot resolve join columns for relation '${cond.field}'`);
|
|
213
|
+
}
|
|
214
|
+
const subCtx = {
|
|
215
|
+
...ctx,
|
|
216
|
+
currentAlias: subAlias,
|
|
217
|
+
currentPath: joinPath(ctx.currentPath, cond.field),
|
|
218
|
+
currentEntity: cond.targetEntity,
|
|
219
|
+
};
|
|
220
|
+
const nestedFrag = buildSearchByFragment(cond.nested, subCtx);
|
|
221
|
+
let whereContent = joinSql;
|
|
222
|
+
if (nestedFrag.sql) {
|
|
223
|
+
const inner = cond.op === "every" ? `NOT (${nestedFrag.sql})` : nestedFrag.sql;
|
|
224
|
+
whereContent = `${joinSql} AND ${inner}`;
|
|
225
|
+
}
|
|
226
|
+
else if (cond.op === "every") {
|
|
227
|
+
// every(no conditions) ≡ "no related rows that violate nothing", i.e. true.
|
|
228
|
+
// Special-case: no WHERE on the nested side means `every` is trivially
|
|
229
|
+
// satisfied (no row can violate an empty predicate).
|
|
230
|
+
return { sql: "1=1", params: {} };
|
|
231
|
+
}
|
|
232
|
+
const exists = cond.op === "some" ? "EXISTS" : "NOT EXISTS";
|
|
233
|
+
const sql = `${exists} (SELECT 1 FROM "${targetTable}" "${subAlias}" WHERE ${whereContent})`;
|
|
234
|
+
return { sql, params: nestedFrag.params };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Build a SQL fragment representing an entire ParsedSearchBy (conditions
|
|
238
|
+
* AND-ed together, with the OR group AND-ed in). Used inside EXISTS
|
|
239
|
+
* subqueries where we need raw SQL rather than a builder mutation.
|
|
240
|
+
*
|
|
241
|
+
* Throws if a nested relation appears — those need their own EXISTS subquery
|
|
242
|
+
* with metadata resolution, which Phase 1 doesn't support inside every/none.
|
|
243
|
+
*/
|
|
244
|
+
function buildSearchByFragment(searchBy, ctx) {
|
|
245
|
+
const andParts = [];
|
|
246
|
+
const params = {};
|
|
247
|
+
for (const cond of searchBy.conditions) {
|
|
248
|
+
if (cond.kind === "relation") {
|
|
249
|
+
throw new errors_1.QueryValidationError(`Nested relation filter '${cond.field}' inside 'every'/'none' is not supported in this version`, joinPath(ctx.currentPath, cond.field));
|
|
250
|
+
}
|
|
251
|
+
const frag = buildLeaf(cond, ctx);
|
|
252
|
+
andParts.push(frag.sql);
|
|
253
|
+
Object.assign(params, frag.params);
|
|
254
|
+
}
|
|
255
|
+
if (searchBy.or.length > 0) {
|
|
256
|
+
const orParts = [];
|
|
257
|
+
for (const sub of searchBy.or) {
|
|
258
|
+
const subFrag = buildSearchByFragment(sub, ctx);
|
|
259
|
+
if (subFrag.sql)
|
|
260
|
+
orParts.push(`(${subFrag.sql})`);
|
|
261
|
+
Object.assign(params, subFrag.params);
|
|
262
|
+
}
|
|
263
|
+
if (orParts.length > 0)
|
|
264
|
+
andParts.push(`(${orParts.join(" OR ")})`);
|
|
265
|
+
}
|
|
266
|
+
return { sql: andParts.join(" AND "), params };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Apply a `ParsedSearchBy` inside a TypeORM `Brackets` callback. Caller is
|
|
270
|
+
* responsible for wrapping with `qb.andWhere(new Brackets(b => applySearchByInside(b, ..., ctx)))`.
|
|
271
|
+
*/
|
|
272
|
+
function applySearchByInside(qb, searchBy, ctx) {
|
|
273
|
+
let first = true;
|
|
274
|
+
for (const cond of searchBy.conditions) {
|
|
275
|
+
applyCondition(qb, cond, ctx, first);
|
|
276
|
+
first = false;
|
|
277
|
+
}
|
|
278
|
+
if (searchBy.or.length > 0) {
|
|
279
|
+
const orBrackets = new typeorm_1.Brackets((orQb) => {
|
|
280
|
+
let orFirst = true;
|
|
281
|
+
for (const sub of searchBy.or) {
|
|
282
|
+
const sub_brackets = new typeorm_1.Brackets((b) => applySearchByInside(b, sub, ctx));
|
|
283
|
+
if (orFirst)
|
|
284
|
+
orQb.where(sub_brackets);
|
|
285
|
+
else
|
|
286
|
+
orQb.orWhere(sub_brackets);
|
|
287
|
+
orFirst = false;
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
if (first)
|
|
291
|
+
qb.where(orBrackets);
|
|
292
|
+
else
|
|
293
|
+
qb.andWhere(orBrackets);
|
|
294
|
+
first = false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=where.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/where.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.d.ts","sourceRoot":"","sources":["../src/datetime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,SAAS,CAAC;AA4BlE,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAuDtE;AAkBD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAErD"}
|
package/dist/datetime.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDateTime = parseDateTime;
|
|
4
|
+
exports.looksLikeDateTime = looksLikeDateTime;
|
|
5
|
+
const errors_1 = require("./errors");
|
|
6
|
+
const ISO_OFFSET_RE = /^(Z|[+-]\d{2}(:?\d{2})?(:?:\d{2})?)$/;
|
|
7
|
+
function normalizeOffset(offset, path) {
|
|
8
|
+
if (offset === "Z")
|
|
9
|
+
return "Z";
|
|
10
|
+
if (!ISO_OFFSET_RE.test(offset)) {
|
|
11
|
+
throw new errors_1.QueryValidationError(`Invalid offset '${offset}' (expected 'Z' or '±HH:MM' / '±HHMM' / '±HH')`, path);
|
|
12
|
+
}
|
|
13
|
+
// Ensure leading sign
|
|
14
|
+
if (!offset.startsWith("+") && !offset.startsWith("-")) {
|
|
15
|
+
offset = "+" + offset;
|
|
16
|
+
}
|
|
17
|
+
// Expand "+HH" -> "+HH:00" and "+HHMM" -> "+HH:MM"
|
|
18
|
+
const sign = offset[0];
|
|
19
|
+
const rest = offset.slice(1).replace(":", "");
|
|
20
|
+
if (rest.length === 2)
|
|
21
|
+
return `${sign}${rest}:00`;
|
|
22
|
+
if (rest.length === 4)
|
|
23
|
+
return `${sign}${rest.slice(0, 2)}:${rest.slice(2)}`;
|
|
24
|
+
return offset;
|
|
25
|
+
}
|
|
26
|
+
function pad(n, len = 2) {
|
|
27
|
+
return String(n).padStart(len, "0");
|
|
28
|
+
}
|
|
29
|
+
function parseDateTime(input, path) {
|
|
30
|
+
if (typeof input === "string") {
|
|
31
|
+
const d = new Date(input);
|
|
32
|
+
if (Number.isNaN(d.getTime())) {
|
|
33
|
+
throw new errors_1.QueryValidationError(`Invalid ISO 8601 datetime '${input}'`, path);
|
|
34
|
+
}
|
|
35
|
+
return d;
|
|
36
|
+
}
|
|
37
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
38
|
+
throw new errors_1.QueryValidationError(`Expected ISO string or datetime object`, path);
|
|
39
|
+
}
|
|
40
|
+
const obj = input;
|
|
41
|
+
const year = obj.year ?? 1970;
|
|
42
|
+
const month = obj.month ?? 1;
|
|
43
|
+
const day = obj.day ?? 1;
|
|
44
|
+
const hours = obj.hours ?? 0;
|
|
45
|
+
const minutes = obj.minutes ?? 0;
|
|
46
|
+
const seconds = obj.seconds ?? 0;
|
|
47
|
+
const offset = normalizeOffset(obj.offset ?? "Z", `${path}.offset`);
|
|
48
|
+
for (const [k, v] of Object.entries({
|
|
49
|
+
year,
|
|
50
|
+
month,
|
|
51
|
+
day,
|
|
52
|
+
hours,
|
|
53
|
+
minutes,
|
|
54
|
+
seconds,
|
|
55
|
+
})) {
|
|
56
|
+
if (typeof v !== "number" || !Number.isFinite(v) || !Number.isInteger(v)) {
|
|
57
|
+
throw new errors_1.QueryValidationError(`'${k}' must be an integer (got ${JSON.stringify(v)})`, path);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const iso = `${pad(year, 4)}-${pad(month)}-${pad(day)}T${pad(hours)}:${pad(minutes)}:${pad(seconds)}${offset}`;
|
|
61
|
+
const d = new Date(iso);
|
|
62
|
+
if (Number.isNaN(d.getTime())) {
|
|
63
|
+
throw new errors_1.QueryValidationError(`Invalid datetime components (built '${iso}')`, path);
|
|
64
|
+
}
|
|
65
|
+
return d;
|
|
66
|
+
}
|
|
67
|
+
function isDateTimeObject(v) {
|
|
68
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
69
|
+
return false;
|
|
70
|
+
const keys = new Set([
|
|
71
|
+
"year",
|
|
72
|
+
"month",
|
|
73
|
+
"day",
|
|
74
|
+
"hours",
|
|
75
|
+
"minutes",
|
|
76
|
+
"seconds",
|
|
77
|
+
"offset",
|
|
78
|
+
]);
|
|
79
|
+
// Treat as datetime object only if every key belongs to the set.
|
|
80
|
+
// (Otherwise it might be a `{before, after}` range.)
|
|
81
|
+
return Object.keys(v).every((k) => keys.has(k));
|
|
82
|
+
}
|
|
83
|
+
function looksLikeDateTime(v) {
|
|
84
|
+
return typeof v === "string" || isDateTimeObject(v);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=datetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../src/datetime.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Adapter } from "./adapters/base";
|
|
2
|
+
import type { ParsedQuery } from "./parsed";
|
|
3
|
+
import type { Schema } from "./schema";
|
|
4
|
+
import type { GenQueryInput } from "./types";
|
|
5
|
+
export interface GenQueryEngineOptions<TTarget, TResult> {
|
|
6
|
+
adapter: Adapter<TTarget, TResult>;
|
|
7
|
+
}
|
|
8
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
9
|
+
/** True for TypeORM's wide ObjectLiteral default — treat as "unspecified". */
|
|
10
|
+
type IsLooseRecord<T> = IsAny<T> extends true ? true : [T] extends [Record<string, any>] ? [Record<string, any>] extends [T] ? true : false : false;
|
|
11
|
+
/**
|
|
12
|
+
* Inspect the target's structural shape. If it looks like a TypeORM
|
|
13
|
+
* `SelectQueryBuilder<T>` (has `getMany(): Promise<T[]>`), pull out T.
|
|
14
|
+
* Falls back to `unknown` (loose mode) for any other adapter target.
|
|
15
|
+
*/
|
|
16
|
+
type InferEntityFromTarget<X> = X extends {
|
|
17
|
+
getMany(): Promise<infer A>;
|
|
18
|
+
} ? A extends (infer T)[] ? IsLooseRecord<T> extends true ? unknown : T : unknown : unknown;
|
|
19
|
+
/**
|
|
20
|
+
* Combines parsing + an adapter into a single entry point. The engine is
|
|
21
|
+
* generic over the adapter so the signature of `run` matches the chosen
|
|
22
|
+
* backend (e.g. `SelectQueryBuilder<T>` in/out for TypeORM).
|
|
23
|
+
*
|
|
24
|
+
* The schema is read from the adapter — there is one source of truth.
|
|
25
|
+
*/
|
|
26
|
+
export declare class GenQueryEngine<TTarget, TResult> {
|
|
27
|
+
readonly schema: Schema;
|
|
28
|
+
readonly adapter: Adapter<TTarget, TResult>;
|
|
29
|
+
constructor(options: GenQueryEngineOptions<TTarget, TResult>);
|
|
30
|
+
/**
|
|
31
|
+
* Parse only — useful when you want to inspect / cache the parsed form.
|
|
32
|
+
*
|
|
33
|
+
* Pass an entity class as the generic parameter to get autocomplete on
|
|
34
|
+
* fields / relations (e.g. `engine.parse<User>(input, "User")`).
|
|
35
|
+
*/
|
|
36
|
+
parse<T = unknown>(input: GenQueryInput<T>, rootEntity: string): ParsedQuery;
|
|
37
|
+
/**
|
|
38
|
+
* Parse and apply.
|
|
39
|
+
*
|
|
40
|
+
* The entity type is inferred from the `target` argument when it has a
|
|
41
|
+
* recognizable shape (e.g. a TypeORM `SelectQueryBuilder<User>`). When the
|
|
42
|
+
* adapter implements `getRootEntity`, the `rootEntity` string is optional —
|
|
43
|
+
* the engine asks the adapter to derive it from the target. Pass an explicit
|
|
44
|
+
* `rootEntity` to override (or when the adapter can't introspect).
|
|
45
|
+
*/
|
|
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. */
|
|
49
|
+
runParsed(parsed: ParsedQuery, target: TTarget): TResult;
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GenQueryEngine = void 0;
|
|
4
|
+
const parser_1 = require("./parser");
|
|
5
|
+
/**
|
|
6
|
+
* Combines parsing + an adapter into a single entry point. The engine is
|
|
7
|
+
* generic over the adapter so the signature of `run` matches the chosen
|
|
8
|
+
* backend (e.g. `SelectQueryBuilder<T>` in/out for TypeORM).
|
|
9
|
+
*
|
|
10
|
+
* The schema is read from the adapter — there is one source of truth.
|
|
11
|
+
*/
|
|
12
|
+
class GenQueryEngine {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.adapter = options.adapter;
|
|
15
|
+
this.schema = options.adapter.schema;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse only — useful when you want to inspect / cache the parsed form.
|
|
19
|
+
*
|
|
20
|
+
* Pass an entity class as the generic parameter to get autocomplete on
|
|
21
|
+
* fields / relations (e.g. `engine.parse<User>(input, "User")`).
|
|
22
|
+
*/
|
|
23
|
+
parse(input, rootEntity) {
|
|
24
|
+
return (0, parser_1.parseQuery)(input, this.schema, rootEntity);
|
|
25
|
+
}
|
|
26
|
+
run(input, arg2, arg3) {
|
|
27
|
+
let rootEntity;
|
|
28
|
+
let target;
|
|
29
|
+
if (typeof arg2 === "string") {
|
|
30
|
+
rootEntity = arg2;
|
|
31
|
+
target = arg3;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
target = arg2;
|
|
35
|
+
const derived = this.adapter.getRootEntity?.(target);
|
|
36
|
+
if (!derived) {
|
|
37
|
+
throw new Error("GenQueryEngine.run: rootEntity not provided and the adapter " +
|
|
38
|
+
`('${this.adapter.name}') could not derive it from the target. ` +
|
|
39
|
+
"Pass rootEntity explicitly: engine.run(input, rootEntity, target).");
|
|
40
|
+
}
|
|
41
|
+
rootEntity = derived;
|
|
42
|
+
}
|
|
43
|
+
const parsed = (0, parser_1.parseQuery)(input, this.schema, rootEntity);
|
|
44
|
+
return this.adapter.apply(target, parsed);
|
|
45
|
+
}
|
|
46
|
+
/** Apply a previously parsed query. */
|
|
47
|
+
runParsed(parsed, target) {
|
|
48
|
+
return this.adapter.apply(target, parsed);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.GenQueryEngine = GenQueryEngine;
|
|
52
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when the input query is structurally invalid or refers to unknown
|
|
3
|
+
* fields/relations.
|
|
4
|
+
*/
|
|
5
|
+
export declare class QueryValidationError extends Error {
|
|
6
|
+
/** Dot-path to the offending location inside the input query. */
|
|
7
|
+
readonly path: string;
|
|
8
|
+
constructor(message: string, path: string);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAK1C"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryValidationError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Thrown when the input query is structurally invalid or refers to unknown
|
|
6
|
+
* fields/relations.
|
|
7
|
+
*/
|
|
8
|
+
class QueryValidationError extends Error {
|
|
9
|
+
constructor(message, path) {
|
|
10
|
+
super(`${message} (at ${path || "<root>"})`);
|
|
11
|
+
this.name = "QueryValidationError";
|
|
12
|
+
this.path = path;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.QueryValidationError = QueryValidationError;
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,oBAAqB,SAAQ,KAAK;IAI7C,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,GAAG,OAAO,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AATD,oDASC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./parsed";
|
|
3
|
+
export * from "./schema";
|
|
4
|
+
export * from "./errors";
|
|
5
|
+
export { parseQuery } from "./parser";
|
|
6
|
+
export { GenQueryEngine, type GenQueryEngineOptions } from "./engine";
|
|
7
|
+
export type { Adapter } from "./adapters/base";
|
|
8
|
+
export { parseDateTime } from "./datetime";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.parseDateTime = exports.GenQueryEngine = exports.parseQuery = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
__exportStar(require("./parsed"), exports);
|
|
20
|
+
__exportStar(require("./schema"), exports);
|
|
21
|
+
__exportStar(require("./errors"), exports);
|
|
22
|
+
var parser_1 = require("./parser");
|
|
23
|
+
Object.defineProperty(exports, "parseQuery", { enumerable: true, get: function () { return parser_1.parseQuery; } });
|
|
24
|
+
var engine_1 = require("./engine");
|
|
25
|
+
Object.defineProperty(exports, "GenQueryEngine", { enumerable: true, get: function () { return engine_1.GenQueryEngine; } });
|
|
26
|
+
var datetime_1 = require("./datetime");
|
|
27
|
+
Object.defineProperty(exports, "parseDateTime", { enumerable: true, get: function () { return datetime_1.parseDateTime; } });
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAsE;AAA7D,wGAAA,cAAc,OAAA;AAEvB,uCAA2C;AAAlC,yGAAA,aAAa,OAAA"}
|