@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.
Files changed (76) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +218 -0
  3. package/dist/adapters/base.d.ts +32 -0
  4. package/dist/adapters/base.d.ts.map +1 -0
  5. package/dist/adapters/base.js +3 -0
  6. package/dist/adapters/base.js.map +1 -0
  7. package/dist/adapters/typeorm/adapter.d.ts +35 -0
  8. package/dist/adapters/typeorm/adapter.d.ts.map +1 -0
  9. package/dist/adapters/typeorm/adapter.js +111 -0
  10. package/dist/adapters/typeorm/adapter.js.map +1 -0
  11. package/dist/adapters/typeorm/aliases.d.ts +25 -0
  12. package/dist/adapters/typeorm/aliases.d.ts.map +1 -0
  13. package/dist/adapters/typeorm/aliases.js +47 -0
  14. package/dist/adapters/typeorm/aliases.js.map +1 -0
  15. package/dist/adapters/typeorm/create.d.ts +29 -0
  16. package/dist/adapters/typeorm/create.d.ts.map +1 -0
  17. package/dist/adapters/typeorm/create.js +29 -0
  18. package/dist/adapters/typeorm/create.js.map +1 -0
  19. package/dist/adapters/typeorm/escape.d.ts +5 -0
  20. package/dist/adapters/typeorm/escape.d.ts.map +1 -0
  21. package/dist/adapters/typeorm/escape.js +13 -0
  22. package/dist/adapters/typeorm/escape.js.map +1 -0
  23. package/dist/adapters/typeorm/index.d.ts +4 -0
  24. package/dist/adapters/typeorm/index.d.ts.map +1 -0
  25. package/dist/adapters/typeorm/index.js +10 -0
  26. package/dist/adapters/typeorm/index.js.map +1 -0
  27. package/dist/adapters/typeorm/joins.d.ts +29 -0
  28. package/dist/adapters/typeorm/joins.d.ts.map +1 -0
  29. package/dist/adapters/typeorm/joins.js +91 -0
  30. package/dist/adapters/typeorm/joins.js.map +1 -0
  31. package/dist/adapters/typeorm/params.d.ts +8 -0
  32. package/dist/adapters/typeorm/params.d.ts.map +1 -0
  33. package/dist/adapters/typeorm/params.js +15 -0
  34. package/dist/adapters/typeorm/params.js.map +1 -0
  35. package/dist/adapters/typeorm/schema-from-typeorm.d.ts +50 -0
  36. package/dist/adapters/typeorm/schema-from-typeorm.d.ts.map +1 -0
  37. package/dist/adapters/typeorm/schema-from-typeorm.js +170 -0
  38. package/dist/adapters/typeorm/schema-from-typeorm.js.map +1 -0
  39. package/dist/adapters/typeorm/where.d.ts +26 -0
  40. package/dist/adapters/typeorm/where.d.ts.map +1 -0
  41. package/dist/adapters/typeorm/where.js +297 -0
  42. package/dist/adapters/typeorm/where.js.map +1 -0
  43. package/dist/datetime.d.ts +4 -0
  44. package/dist/datetime.d.ts.map +1 -0
  45. package/dist/datetime.js +86 -0
  46. package/dist/datetime.js.map +1 -0
  47. package/dist/engine.d.ts +52 -0
  48. package/dist/engine.d.ts.map +1 -0
  49. package/dist/engine.js +52 -0
  50. package/dist/engine.js.map +1 -0
  51. package/dist/errors.d.ts +10 -0
  52. package/dist/errors.d.ts.map +1 -0
  53. package/dist/errors.js +16 -0
  54. package/dist/errors.js.map +1 -0
  55. package/dist/index.d.ts +9 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +28 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/parsed.d.ts +127 -0
  60. package/dist/parsed.d.ts.map +1 -0
  61. package/dist/parsed.js +8 -0
  62. package/dist/parsed.js.map +1 -0
  63. package/dist/parser.d.ts +5 -0
  64. package/dist/parser.d.ts.map +1 -0
  65. package/dist/parser.js +404 -0
  66. package/dist/parser.js.map +1 -0
  67. package/dist/schema.d.ts +57 -0
  68. package/dist/schema.d.ts.map +1 -0
  69. package/dist/schema.js +36 -0
  70. package/dist/schema.js.map +1 -0
  71. package/dist/types.d.ts +180 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +15 -0
  74. package/dist/types.js.map +1 -0
  75. package/package.json +70 -0
  76. package/spec.md +221 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/index.ts"],"names":[],"mappings":";;;AAAA,qCAAuE;AAA9D,yGAAA,cAAc,OAAA;AACvB,6DAG+B;AAF7B,wHAAA,iBAAiB,OAAA;AAGnB,mCAGkB;AAFhB,6GAAA,mBAAmB,OAAA"}
@@ -0,0 +1,29 @@
1
+ import type { ParsedQuery } from "../../parsed";
2
+ import { type Schema } from "../../schema";
3
+ import type { AliasRegistry } from "./aliases";
4
+ export type JoinPlan = {
5
+ /** Dot-joined relation chain from the root entity, e.g. "posts.comments". */
6
+ path: string;
7
+ /** Property path on the parent alias, e.g. "rootAlias.posts". */
8
+ propertyPath: string;
9
+ /** Generated alias used by the query builder for this relation. */
10
+ alias: string;
11
+ /** Entity name of the joined target. */
12
+ targetEntity: string;
13
+ /** Selection strategy. */
14
+ selection: {
15
+ kind: "none";
16
+ } | {
17
+ kind: "all";
18
+ } | {
19
+ kind: "fields";
20
+ fields: string[];
21
+ };
22
+ };
23
+ /**
24
+ * Walks the parsed query and produces an ordered list of joins. Parent joins
25
+ * always come before their descendants so the QueryBuilder can resolve the
26
+ * source alias.
27
+ */
28
+ export declare function planJoins(query: ParsedQuery, schema: Schema, aliases: AliasRegistry): JoinPlan[];
29
+ //# sourceMappingURL=joins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joins.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/joins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,WAAW,EAAkB,MAAM,cAAc,CAAC;AAC/E,OAAO,EACL,KAAK,MAAM,EAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG;IACrB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,SAAS,EACL;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,GACf;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,QAAQ,EAAE,CA6DZ"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.planJoins = planJoins;
4
+ const schema_1 = require("../../schema");
5
+ /**
6
+ * Walks the parsed query and produces an ordered list of joins. Parent joins
7
+ * always come before their descendants so the QueryBuilder can resolve the
8
+ * source alias.
9
+ */
10
+ function planJoins(query, schema, aliases) {
11
+ const plans = [];
12
+ const byPath = new Map();
13
+ const upsert = (path, propertyPath, targetEntity, selection) => {
14
+ const existing = byPath.get(path);
15
+ if (existing) {
16
+ // Selection upgrade rules: explicit selections win over "none".
17
+ if (existing.selection.kind === "none" && selection.kind !== "none") {
18
+ existing.selection = selection;
19
+ }
20
+ else if (existing.selection.kind === "fields" &&
21
+ selection.kind === "all") {
22
+ existing.selection = selection;
23
+ }
24
+ else if (existing.selection.kind === "fields" &&
25
+ selection.kind === "fields") {
26
+ const set = new Set([
27
+ ...existing.selection.fields,
28
+ ...selection.fields,
29
+ ]);
30
+ existing.selection = { kind: "fields", fields: [...set] };
31
+ }
32
+ return existing;
33
+ }
34
+ const alias = aliases.register(path);
35
+ const plan = {
36
+ path,
37
+ propertyPath,
38
+ alias,
39
+ targetEntity,
40
+ selection,
41
+ };
42
+ byPath.set(path, plan);
43
+ plans.push(plan);
44
+ return plan;
45
+ };
46
+ // 1. Includes (single level per spec).
47
+ applyIncludeJoins(query.include, query.rootEntity, schema, aliases, upsert);
48
+ // 2. SearchBy relation joins (recursive).
49
+ if (query.searchBy) {
50
+ walkSearchBy(query.searchBy, query.rootEntity, schema, aliases.root(), "", upsert);
51
+ }
52
+ return plans;
53
+ }
54
+ function applyIncludeJoins(include, rootEntity, schema, aliases, upsert) {
55
+ const entity = (0, schema_1.getEntity)(schema, rootEntity);
56
+ const rootAlias = aliases.root();
57
+ if (include.kind === "none")
58
+ return;
59
+ if (include.kind === "all") {
60
+ for (const [relName, relDef] of Object.entries(entity.relations ?? {})) {
61
+ upsert(relName, `${rootAlias}.${relName}`, relDef.target, { kind: "all" });
62
+ }
63
+ return;
64
+ }
65
+ for (const [relName, spec] of Object.entries(include.relations)) {
66
+ const relDef = (0, schema_1.getRelation)(schema, rootEntity, relName);
67
+ if (!relDef)
68
+ continue;
69
+ const selection = spec.kind === "all"
70
+ ? { kind: "all" }
71
+ : { kind: "fields", fields: spec.fields };
72
+ upsert(relName, `${rootAlias}.${relName}`, relDef.target, selection);
73
+ }
74
+ }
75
+ function walkSearchBy(searchBy, currentEntity, schema, parentAlias, parentPath, upsert) {
76
+ for (const cond of searchBy.conditions) {
77
+ if (cond.kind !== "relation")
78
+ continue;
79
+ // `every` / `none` are translated to EXISTS subqueries by the WHERE
80
+ // builder — no top-level join needed (and the join would be wrong).
81
+ if (cond.op !== "some")
82
+ continue;
83
+ const path = parentPath ? `${parentPath}.${cond.field}` : cond.field;
84
+ const plan = upsert(path, `${parentAlias}.${cond.field}`, cond.targetEntity, { kind: "none" });
85
+ walkSearchBy(cond.nested, cond.targetEntity, schema, plan.alias, path, upsert);
86
+ }
87
+ for (const sub of searchBy.or) {
88
+ walkSearchBy(sub, currentEntity, schema, parentAlias, parentPath, upsert);
89
+ }
90
+ }
91
+ //# sourceMappingURL=joins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joins.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/joins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Generates unique parameter names for a TypeORM query builder. */
2
+ export declare class ParamCounter {
3
+ private prefix;
4
+ private n;
5
+ constructor(prefix?: string);
6
+ next(): string;
7
+ }
8
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/params.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,qBAAa,YAAY;IAEX,OAAO,CAAC,MAAM;IAD1B,OAAO,CAAC,CAAC,CAAK;gBACM,MAAM,SAAO;IAEjC,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParamCounter = void 0;
4
+ /** Generates unique parameter names for a TypeORM query builder. */
5
+ class ParamCounter {
6
+ constructor(prefix = "gq") {
7
+ this.prefix = prefix;
8
+ this.n = 0;
9
+ }
10
+ next() {
11
+ return `${this.prefix}_${this.n++}`;
12
+ }
13
+ }
14
+ exports.ParamCounter = ParamCounter;
15
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/params.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AACpE,MAAa,YAAY;IAEvB,YAAoB,SAAS,IAAI;QAAb,WAAM,GAAN,MAAM,CAAO;QADzB,MAAC,GAAG,CAAC,CAAC;IACsB,CAAC;IAErC,IAAI;QACF,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;IACtC,CAAC;CACF;AAPD,oCAOC"}
@@ -0,0 +1,50 @@
1
+ import type { DataSource } from "typeorm";
2
+ import type { FieldType, Schema } from "../../schema";
3
+ /** FieldTypes that don't require additional metadata (excludes `"enum"`). */
4
+ type ScalarFieldType = Exclude<FieldType, "enum">;
5
+ export interface SchemaFromTypeORMOptions {
6
+ /**
7
+ * Restrict to specific entities. Accepts entity classes or entity names.
8
+ * Defaults to all entities registered on the DataSource.
9
+ */
10
+ entities?: Array<Function | string>;
11
+ /**
12
+ * Per-entity, per-field type overrides. Use this to map custom column types
13
+ * (e.g. `jsonb`, custom transformers) to a genquery FieldType, or to add
14
+ * fields that don't correspond to a TypeORM column.
15
+ *
16
+ * overrides: { User: { metadata: "string", legacyAge: "number" } }
17
+ */
18
+ overrides?: Record<string, Record<string, ScalarFieldType>>;
19
+ /**
20
+ * Called when a column type is not recognized by the default mapping.
21
+ * Return a FieldType to include the column, or `undefined` to skip it.
22
+ * Defaults to skipping unknown types.
23
+ */
24
+ fallback?: (entityName: string, propertyName: string, columnType: unknown) => ScalarFieldType | undefined;
25
+ }
26
+ /**
27
+ * Build a genquery `Schema` from an initialized TypeORM `DataSource`.
28
+ *
29
+ * The DataSource must be initialized (`await dataSource.initialize()`) before
30
+ * calling this function; otherwise `entityMetadatas` will be empty.
31
+ *
32
+ * const dataSource = new DataSource({ ... });
33
+ * await dataSource.initialize();
34
+ * const schema = schemaFromTypeORM(dataSource);
35
+ * const adapter = new TypeORMAdapter(schema);
36
+ * const engine = new GenQueryEngine({ schema, adapter });
37
+ *
38
+ * Restrict to specific entities:
39
+ *
40
+ * const schema = schemaFromTypeORM(dataSource, { entities: [User, Post] });
41
+ *
42
+ * Override a column type that isn't auto-detected:
43
+ *
44
+ * const schema = schemaFromTypeORM(dataSource, {
45
+ * overrides: { User: { preferences: "string" } },
46
+ * });
47
+ */
48
+ export declare function schemaFromTypeORM(dataSource: DataSource, options?: SchemaFromTypeORMOptions): Schema;
49
+ export {};
50
+ //# sourceMappingURL=schema-from-typeorm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-from-typeorm.d.ts","sourceRoot":"","sources":["../../../src/adapters/typeorm/schema-from-typeorm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAGV,SAAS,EAET,MAAM,EACP,MAAM,cAAc,CAAC;AAEtB,6EAA6E;AAC7E,KAAK,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IACpC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CACT,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,KAChB,eAAe,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAgBR"}
@@ -0,0 +1,170 @@
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
+ for (const col of meta.columns) {
42
+ const explicit = overrides[col.propertyName];
43
+ if (explicit) {
44
+ fields[col.propertyName] = { type: explicit, nullable: col.isNullable };
45
+ continue;
46
+ }
47
+ // Enum columns: extract values so the parser can validate the allowlist.
48
+ if (isStringEnumColumn(col)) {
49
+ fields[col.propertyName] = {
50
+ type: "enum",
51
+ values: col.enum.slice(),
52
+ nullable: col.isNullable,
53
+ };
54
+ continue;
55
+ }
56
+ const fieldType = mapColumnType(col, meta.name, options);
57
+ if (!fieldType)
58
+ continue;
59
+ fields[col.propertyName] = { type: fieldType, nullable: col.isNullable };
60
+ }
61
+ // Add any overrides that didn't correspond to a real column (e.g. virtual fields).
62
+ for (const [name, type] of Object.entries(overrides)) {
63
+ if (!fields[name])
64
+ fields[name] = { type };
65
+ }
66
+ const relations = {};
67
+ for (const rel of meta.relations) {
68
+ relations[rel.propertyName] = {
69
+ target: rel.inverseEntityMetadata.name,
70
+ kind: rel.isOneToOne || rel.isManyToOne ? "one" : "many",
71
+ };
72
+ }
73
+ const definition = {
74
+ name: meta.name,
75
+ fields,
76
+ };
77
+ if (Object.keys(relations).length > 0)
78
+ definition.relations = relations;
79
+ const pk = meta.primaryColumns[0]?.propertyName;
80
+ if (pk)
81
+ definition.primaryKey = pk;
82
+ return definition;
83
+ }
84
+ function isStringEnumColumn(col) {
85
+ if (!Array.isArray(col.enum) || col.enum.length === 0)
86
+ return false;
87
+ return col.enum.every((v) => typeof v === "string");
88
+ }
89
+ function mapColumnType(col, entityName, options) {
90
+ const t = col.type;
91
+ if (typeof t === "function") {
92
+ if (t === String)
93
+ return "string";
94
+ if (t === Number)
95
+ return "number";
96
+ if (t === Boolean)
97
+ return "boolean";
98
+ if (t === Date)
99
+ return "date";
100
+ }
101
+ else if (typeof t === "string") {
102
+ const norm = t.toLowerCase();
103
+ if (STRING_TYPES.has(norm))
104
+ return "string";
105
+ if (NUMBER_TYPES.has(norm))
106
+ return "number";
107
+ if (BOOLEAN_TYPES.has(norm))
108
+ return "boolean";
109
+ if (DATE_TYPES.has(norm) || norm.startsWith("timestamp"))
110
+ return "date";
111
+ // "enum" / "simple-enum" columns are handled earlier via isStringEnumColumn.
112
+ // If we reach this point, the values weren't strings — let the fallback decide.
113
+ }
114
+ return options.fallback?.(entityName, col.propertyName, t);
115
+ }
116
+ const STRING_TYPES = new Set([
117
+ "string",
118
+ "varchar",
119
+ "varchar2",
120
+ "char",
121
+ "character",
122
+ "character varying",
123
+ "text",
124
+ "tinytext",
125
+ "mediumtext",
126
+ "longtext",
127
+ "ntext",
128
+ "uuid",
129
+ "citext",
130
+ "nvarchar",
131
+ "nvarchar2",
132
+ "nchar",
133
+ ]);
134
+ const NUMBER_TYPES = new Set([
135
+ "int",
136
+ "int2",
137
+ "int4",
138
+ "int8",
139
+ "integer",
140
+ "tinyint",
141
+ "smallint",
142
+ "mediumint",
143
+ "bigint",
144
+ "decimal",
145
+ "numeric",
146
+ "real",
147
+ "float",
148
+ "float4",
149
+ "float8",
150
+ "double",
151
+ "double precision",
152
+ "money",
153
+ "smallmoney",
154
+ "year",
155
+ ]);
156
+ const BOOLEAN_TYPES = new Set(["bool", "boolean"]);
157
+ const DATE_TYPES = new Set([
158
+ "date",
159
+ "datetime",
160
+ "datetime2",
161
+ "datetimeoffset",
162
+ "smalldatetime",
163
+ "time",
164
+ "timetz",
165
+ "time with time zone",
166
+ "time without time zone",
167
+ "timestamp with time zone",
168
+ "timestamp without time zone",
169
+ ]);
170
+ //# sourceMappingURL=schema-from-typeorm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-from-typeorm.js","sourceRoot":"","sources":["../../../src/adapters/typeorm/schema-from-typeorm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
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
@@ -0,0 +1 @@
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;AAkUD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,sBAAsB,EAC1B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,QAAQ,GACZ,IAAI,CAsBN"}