@danceroutine/tango-orm 1.7.0 → 1.8.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 (82) hide show
  1. package/dist/InternalDialect-ClSaUNso.js +10 -0
  2. package/dist/InternalDialect-ClSaUNso.js.map +1 -0
  3. package/dist/PostgresAdapter-CXKdKBG-.js +4 -0
  4. package/dist/PostgresAdapter-DySFW6vy.js +128 -0
  5. package/dist/PostgresAdapter-DySFW6vy.js.map +1 -0
  6. package/dist/{SqliteClient-CjOK9-ki.js → SqliteAdapter-CDdOjRmW.js} +57 -3
  7. package/dist/SqliteAdapter-CDdOjRmW.js.map +1 -0
  8. package/dist/SqliteAdapter-mjtXuVTg.js +4 -0
  9. package/dist/connection/adapters/Adapter.d.ts +32 -1
  10. package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +5 -6
  11. package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +4 -6
  12. package/dist/connection/adapters/index.d.ts +1 -1
  13. package/dist/connection/index.d.ts +1 -1
  14. package/dist/connection/index.js +4 -5
  15. package/dist/{connection-B_K2ZAf7.js → connection-Dmhgx31M.js} +5 -7
  16. package/dist/{connection-B_K2ZAf7.js.map → connection-Dmhgx31M.js.map} +1 -1
  17. package/dist/{defaultRuntime-BPK9kWEW.js → defaultRuntime-DzqBQ9Hb.js} +63 -16
  18. package/dist/defaultRuntime-DzqBQ9Hb.js.map +1 -0
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.js +11 -12
  21. package/dist/manager/ModelManager.d.ts +25 -5
  22. package/dist/manager/index.d.ts +6 -0
  23. package/dist/manager/index.js +8 -7
  24. package/dist/manager/internal/MutationCompiler.d.ts +14 -6
  25. package/dist/manager/relations/ManyToManyRelatedManager.d.ts +147 -0
  26. package/dist/manager/relations/ManyToManyRelatedQuerySet.d.ts +62 -0
  27. package/dist/manager/relations/MaterializedModelRecord.d.ts +28 -0
  28. package/dist/manager/relations/index.d.ts +9 -0
  29. package/dist/manager/relations/internal/ThroughTableManager.d.ts +79 -0
  30. package/dist/manager-DrDTiCAz.js +24 -0
  31. package/dist/manager-DrDTiCAz.js.map +1 -0
  32. package/dist/query/ModelQuerySet.d.ts +20 -0
  33. package/dist/query/QBuilder.d.ts +3 -3
  34. package/dist/query/QuerySet.d.ts +49 -21
  35. package/dist/query/compiler/QueryCompiler.d.ts +13 -4
  36. package/dist/query/domain/CompiledQuery.d.ts +169 -2
  37. package/dist/query/domain/FilterInput.d.ts +1 -1
  38. package/dist/query/domain/FilterKey.d.ts +4 -2
  39. package/dist/query/domain/QNode.d.ts +4 -4
  40. package/dist/query/domain/QuerySetState.d.ts +3 -3
  41. package/dist/query/domain/RelationMeta.d.ts +9 -0
  42. package/dist/query/domain/RelationTyping.d.ts +47 -0
  43. package/dist/query/domain/TableMetaFactory.d.ts +1 -14
  44. package/dist/query/domain/index.d.ts +1 -1
  45. package/dist/query/domain/internal/InternalPrefetchQueryKind.d.ts +20 -0
  46. package/dist/query/index.d.ts +1 -0
  47. package/dist/query/index.js +3 -2
  48. package/dist/query/planning/QueryPlanner.d.ts +1 -1
  49. package/dist/{query-FZJoSCg4.js → query-DUZnBFhf.js} +425 -166
  50. package/dist/query-DUZnBFhf.js.map +1 -0
  51. package/dist/registerModelObjects-DxlBfuUN.js +797 -0
  52. package/dist/registerModelObjects-DxlBfuUN.js.map +1 -0
  53. package/dist/runtime/TangoRuntime.d.ts +9 -0
  54. package/dist/runtime/index.d.ts +3 -2
  55. package/dist/runtime/index.js +7 -6
  56. package/dist/runtime/internal/SqliteDBClientProvider.d.ts +3 -0
  57. package/dist/{runtime-ByXbpVBS.js → runtime-1H88J3nN.js} +3 -3
  58. package/dist/runtime-1H88J3nN.js.map +1 -0
  59. package/dist/transaction/index.js +5 -4
  60. package/dist/{transaction-Cs0Z9tbW.js → transaction-ZhfDf-f8.js} +2 -2
  61. package/dist/{transaction-Cs0Z9tbW.js.map → transaction-ZhfDf-f8.js.map} +1 -1
  62. package/dist/validation/SQLValidationEngine.d.ts +22 -5
  63. package/dist/validation/SqlValidationPlan.d.ts +5 -4
  64. package/dist/validation/internal/InternalSqlValidationPlanKind.d.ts +25 -0
  65. package/dist/validation/internal/InternalValidatedFilterDescriptorKind.d.ts +4 -0
  66. package/package.json +6 -6
  67. package/dist/PostgresAdapter-BFdo_nIt.js +0 -4
  68. package/dist/PostgresAdapter-CMiEpHya.js +0 -49
  69. package/dist/PostgresAdapter-CMiEpHya.js.map +0 -1
  70. package/dist/PostgresClient-BQJZfEOT.js +0 -68
  71. package/dist/PostgresClient-BQJZfEOT.js.map +0 -1
  72. package/dist/SqliteAdapter-A-P9zUhP.js +0 -4
  73. package/dist/SqliteAdapter-CeqhyrPC.js +0 -44
  74. package/dist/SqliteAdapter-CeqhyrPC.js.map +0 -1
  75. package/dist/SqliteClient-CjOK9-ki.js.map +0 -1
  76. package/dist/defaultRuntime-BPK9kWEW.js.map +0 -1
  77. package/dist/manager-C6oJ2tAF.js +0 -13
  78. package/dist/manager-C6oJ2tAF.js.map +0 -1
  79. package/dist/query-FZJoSCg4.js.map +0 -1
  80. package/dist/registerModelObjects-C-1RbUHS.js +0 -385
  81. package/dist/registerModelObjects-C-1RbUHS.js.map +0 -1
  82. package/dist/runtime-ByXbpVBS.js.map +0 -1
@@ -1,385 +0,0 @@
1
- import { InternalQNodeType, OrmSqlSafetyAdapter, QuerySet, TableMetaFactory, isQNodeLike } from "./query-FZJoSCg4.js";
2
- import { RuntimeBoundClient, TransactionEngine, getTangoRuntime } from "./defaultRuntime-BPK9kWEW.js";
3
- import { NotFoundError } from "@danceroutine/tango-core";
4
- import { registerModelAugmentor } from "@danceroutine/tango-schema";
5
-
6
- //#region src/manager/internal/MutationCompiler.ts
7
- var MutationCompiler = class {
8
- constructor(dialect) {
9
- this.dialect = dialect;
10
- }
11
- compileInsert(plan, values) {
12
- return {
13
- sql: `INSERT INTO ${plan.meta.table} (${plan.writeKeys.join(", ")}) VALUES (${this.buildValuePlaceholders(plan.writeKeys.length)}) RETURNING *`,
14
- params: values
15
- };
16
- }
17
- compileUpdate(plan, values, id) {
18
- const sets = plan.writeKeys.map((key, index) => `${key} = ${this.placeholder(index + 1)}`).join(", ");
19
- const whereParam = this.placeholder(plan.writeKeys.length + 1);
20
- return {
21
- sql: `UPDATE ${plan.meta.table} SET ${sets} WHERE ${plan.meta.pk} = ${whereParam} RETURNING *`,
22
- params: [...values, id]
23
- };
24
- }
25
- compileDelete(plan, id) {
26
- return {
27
- sql: `DELETE FROM ${plan.meta.table} WHERE ${plan.meta.pk} = ${this.placeholder(1)}`,
28
- params: [id]
29
- };
30
- }
31
- compileBulkInsert(plan, valueRows) {
32
- const columnCount = plan.writeKeys.length;
33
- const placeholders = valueRows.map((_row, rowIndex) => {
34
- const offset = rowIndex * columnCount;
35
- return `(${plan.writeKeys.map((_, colIndex) => this.placeholder(offset + colIndex + 1)).join(", ")})`;
36
- }).join(", ");
37
- return {
38
- sql: `INSERT INTO ${plan.meta.table} (${plan.writeKeys.join(", ")}) VALUES ${placeholders} RETURNING *`,
39
- params: valueRows.flat()
40
- };
41
- }
42
- buildValuePlaceholders(count) {
43
- return Array.from({ length: count }, (_value, index) => this.placeholder(index + 1)).join(", ");
44
- }
45
- placeholder(index) {
46
- return this.dialect === "postgres" ? `$${index}` : "?";
47
- }
48
- };
49
-
50
- //#endregion
51
- //#region src/manager/ModelManager.ts
52
- const sqlSafetyAdapter = new OrmSqlSafetyAdapter();
53
- var ModelManager = class ModelManager {
54
- static BRAND = "tango.orm.model_manager";
55
- __tangoBrand = ModelManager.BRAND;
56
- queryExecutor;
57
- mutationCompiler;
58
- model;
59
- client;
60
- dialect;
61
- runtime;
62
- constructor(model, runtime) {
63
- this.model = model;
64
- this.runtime = runtime;
65
- this.client = new RuntimeBoundClient(runtime);
66
- this.dialect = runtime.getDialect();
67
- this.mutationCompiler = new MutationCompiler(this.dialect);
68
- this.queryExecutor = {
69
- get meta() {
70
- return ModelManager.createTableMeta(model);
71
- },
72
- client: this.client,
73
- dialect: this.dialect,
74
- run: async (compiled) => {
75
- const result = await this.client.query(compiled.sql, compiled.params);
76
- return result.rows;
77
- }
78
- };
79
- }
80
- get meta() {
81
- return ModelManager.createTableMeta(this.model);
82
- }
83
- /**
84
- * Narrow an unknown value to `ModelManager`.
85
- */
86
- static isModelManager(value) {
87
- return typeof value === "object" && value !== null && value.__tangoBrand === ModelManager.BRAND;
88
- }
89
- static createTableMeta(model) {
90
- const rawMeta = TableMetaFactory.create(model);
91
- const validatedMeta = sqlSafetyAdapter.validate({
92
- kind: "insert",
93
- meta: rawMeta,
94
- writeKeys: Object.keys(rawMeta.columns)
95
- }).meta;
96
- if (rawMeta.relations) validatedMeta.relations = rawMeta.relations;
97
- return validatedMeta;
98
- }
99
- static mergeCreatePayloadFromWhere(modelName, pkColumn, where, defaults) {
100
- const hasDefaultsArg = defaults !== undefined;
101
- const providedDefaults = defaults !== undefined ? { ...defaults } : undefined;
102
- if (isQNodeLike(where)) {
103
- if (!hasDefaultsArg) throw new Error(`Cannot create ${modelName} from Q filters without defaults.`);
104
- if (!providedDefaults || Object.keys(providedDefaults).length === 0) throw new Error(`Cannot create ${modelName} from Q filters without defaults.`);
105
- const fromQ = ModelManager.collectPlainFieldsFromQNode(modelName, where);
106
- const merged$1 = {
107
- ...fromQ,
108
- ...providedDefaults
109
- };
110
- const keys$1 = Object.keys(merged$1).filter((key) => merged$1[key] !== undefined);
111
- const nonPkKeys$1 = keys$1.filter((key) => key !== pkColumn);
112
- if (nonPkKeys$1.length === 0) throw new Error(`Cannot create ${modelName} without any values.`);
113
- return merged$1;
114
- }
115
- const atom = where;
116
- const entries = Object.entries(atom);
117
- const plainEntries = entries.filter(([key]) => !String(key).includes("__"));
118
- const lookupOnly = entries.length > 0 && plainEntries.length === 0;
119
- const fromAtom = plainEntries.length > 0 ? Object.fromEntries(plainEntries) : undefined;
120
- const mergeBase = {
121
- ...fromAtom,
122
- ...providedDefaults
123
- };
124
- if (lookupOnly && ModelManager.countNonPkValues(mergeBase) === 0) throw new Error(`Cannot create ${modelName} from lookup-only filters without defaults.`);
125
- const cleanedAtom = plainEntries.length > 0 ? Object.fromEntries(plainEntries) : {};
126
- const merged = {
127
- ...cleanedAtom,
128
- ...mergeBase
129
- };
130
- const keys = Object.keys(merged).filter((key) => merged[key] !== undefined);
131
- const nonPkKeys = keys.filter((key) => key !== pkColumn);
132
- if (nonPkKeys.length === 0) throw new Error(`Cannot create ${modelName} without any values.`);
133
- return merged;
134
- }
135
- static countNonPkValues(payload) {
136
- return Object.entries(payload).filter(([, value]) => value !== undefined).length;
137
- }
138
- static collectPlainFieldsFromQNode(modelName, node) {
139
- switch (node.kind) {
140
- case InternalQNodeType.ATOM: {
141
- const atom = node.where;
142
- return ModelManager.omitLookupKeysFromAtom(atom);
143
- }
144
- case InternalQNodeType.AND: {
145
- const partials = (node.nodes ?? []).map((child) => ModelManager.collectPlainFieldsFromQNode(modelName, child));
146
- return ModelManager.mergeCompatiblePartials(partials);
147
- }
148
- case InternalQNodeType.OR: {
149
- const partials = (node.nodes ?? []).map((child) => ModelManager.collectPlainFieldsFromQNode(modelName, child));
150
- const nonEmpty = partials.filter((p) => Object.keys(p).length > 0);
151
- if (nonEmpty.length > 1) throw new Error(`Cannot derive a create payload from ${modelName} OR filters with multiple predicates. Supply defaults that fully describe the insert.`);
152
- return nonEmpty.length === 1 ? nonEmpty[0] : {};
153
- }
154
- case InternalQNodeType.NOT: return {};
155
- }
156
- }
157
- static omitLookupKeysFromAtom(atom) {
158
- const entries = Object.entries(atom).filter(([key]) => !String(key).includes("__"));
159
- return Object.fromEntries(entries);
160
- }
161
- static mergeCompatiblePartials(partials) {
162
- const merged = {};
163
- for (const partial of partials) for (const [key, value] of Object.entries(partial)) {
164
- const existing = merged[key];
165
- if (existing !== undefined && existing !== value) throw new Error(`Conflicting values for '${key}' while deriving create payload from Q filters.`);
166
- merged[key] = value;
167
- }
168
- return merged;
169
- }
170
- query() {
171
- return new QuerySet(this.queryExecutor, {});
172
- }
173
- all() {
174
- return this.query();
175
- }
176
- async getOrCreate(args) {
177
- try {
178
- const record$1 = await this.query().get(args.where);
179
- return {
180
- record: record$1,
181
- created: false
182
- };
183
- } catch (error) {
184
- if (!NotFoundError.isNotFoundError(error)) throw error;
185
- }
186
- const merged = ModelManager.mergeCreatePayloadFromWhere(this.model.metadata.name, this.meta.pk, args.where, args.defaults);
187
- const record = await this.create(merged);
188
- return {
189
- record,
190
- created: true
191
- };
192
- }
193
- async updateOrCreate(args) {
194
- let existing = null;
195
- try {
196
- existing = await this.query().get(args.where);
197
- } catch (error) {
198
- if (!NotFoundError.isNotFoundError(error)) throw error;
199
- }
200
- if (!existing) {
201
- const merged = ModelManager.mergeCreatePayloadFromWhere(this.model.metadata.name, this.meta.pk, args.where, args.defaults);
202
- const record$1 = await this.create(merged);
203
- return {
204
- record: record$1,
205
- created: true,
206
- updated: false
207
- };
208
- }
209
- const patch = args.update ?? args.defaults ?? {};
210
- const patchKeys = Object.keys(patch);
211
- if (patchKeys.length === 0) return {
212
- record: existing,
213
- created: false,
214
- updated: false
215
- };
216
- const id = existing[this.meta.pk];
217
- const record = await this.update(id, patch);
218
- return {
219
- record,
220
- created: false,
221
- updated: true
222
- };
223
- }
224
- async findById(id) {
225
- const filter = { [this.meta.pk]: id };
226
- return this.query().filter(filter).fetchOne();
227
- }
228
- async getOrThrow(id) {
229
- const result = await this.findById(id);
230
- if (!result) throw new NotFoundError(`${this.model.metadata.name} with ${this.meta.pk}=${String(id)} not found`);
231
- return result;
232
- }
233
- async create(input) {
234
- const prepared = await this.runBeforeCreate(input);
235
- const preparedKeys = Object.keys(prepared);
236
- if (preparedKeys.length === 0) throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);
237
- const validatedPlan = sqlSafetyAdapter.validate({
238
- kind: "insert",
239
- meta: this.meta,
240
- writeKeys: preparedKeys
241
- });
242
- const compiled = this.mutationCompiler.compileInsert(validatedPlan, preparedKeys.map((key) => prepared[key]));
243
- const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
244
- const created = result.rows[0];
245
- await this.model.hooks?.afterCreate?.({
246
- record: created,
247
- model: this.model,
248
- manager: this,
249
- transaction: this.getHookTransaction()
250
- });
251
- return created;
252
- }
253
- async update(id, patch) {
254
- const current = await this.getOrThrow(id);
255
- const prepared = await this.runBeforeUpdate(id, patch, current);
256
- const preparedKeys = Object.keys(prepared);
257
- if (preparedKeys.length === 0) throw new Error(`Cannot update ${this.model.metadata.name} without any values.`);
258
- const validatedPlan = sqlSafetyAdapter.validate({
259
- kind: "update",
260
- meta: this.meta,
261
- writeKeys: preparedKeys
262
- });
263
- const compiled = this.mutationCompiler.compileUpdate(validatedPlan, preparedKeys.map((key) => prepared[key]), id);
264
- const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
265
- const updated = result.rows[0];
266
- await this.model.hooks?.afterUpdate?.({
267
- id,
268
- patch: prepared,
269
- previous: current,
270
- record: updated,
271
- model: this.model,
272
- manager: this,
273
- transaction: this.getHookTransaction()
274
- });
275
- return updated;
276
- }
277
- async delete(id) {
278
- const current = await this.getOrThrow(id);
279
- await this.model.hooks?.beforeDelete?.({
280
- id,
281
- current,
282
- model: this.model,
283
- manager: this,
284
- transaction: this.getHookTransaction()
285
- });
286
- const validatedPlan = sqlSafetyAdapter.validate({
287
- kind: "delete",
288
- meta: this.meta
289
- });
290
- const compiled = this.mutationCompiler.compileDelete(validatedPlan, id);
291
- await this.queryExecutor.client.query(compiled.sql, compiled.params);
292
- await this.model.hooks?.afterDelete?.({
293
- id,
294
- previous: current,
295
- model: this.model,
296
- manager: this,
297
- transaction: this.getHookTransaction()
298
- });
299
- }
300
- async bulkCreate(inputs) {
301
- if (inputs.length === 0) return [];
302
- const perRowPrepared = await Promise.all(inputs.map((input) => this.runBeforeCreate(input)));
303
- const batchPrepared = await this.model.hooks?.beforeBulkCreate?.({
304
- rows: perRowPrepared,
305
- model: this.model,
306
- manager: this,
307
- transaction: this.getHookTransaction()
308
- }) ?? perRowPrepared;
309
- const preparedKeys = Object.keys(batchPrepared[0] ?? {});
310
- if (preparedKeys.length === 0) throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);
311
- const validatedPlan = sqlSafetyAdapter.validate({
312
- kind: "insert",
313
- meta: this.meta,
314
- writeKeys: preparedKeys
315
- });
316
- const valueRows = batchPrepared.map((input) => preparedKeys.map((key) => input[key]));
317
- const compiled = this.mutationCompiler.compileBulkInsert(validatedPlan, valueRows);
318
- const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
319
- await Promise.all(result.rows.map((record) => this.model.hooks?.afterCreate?.({
320
- record,
321
- model: this.model,
322
- manager: this,
323
- transaction: this.getHookTransaction()
324
- })));
325
- await this.model.hooks?.afterBulkCreate?.({
326
- records: result.rows,
327
- model: this.model,
328
- manager: this,
329
- transaction: this.getHookTransaction()
330
- });
331
- return result.rows;
332
- }
333
- async runBeforeCreate(data) {
334
- return await this.model.hooks?.beforeCreate?.({
335
- data,
336
- model: this.model,
337
- manager: this,
338
- transaction: this.getHookTransaction()
339
- }) ?? data;
340
- }
341
- async runBeforeUpdate(id, patch, current) {
342
- return await this.model.hooks?.beforeUpdate?.({
343
- id,
344
- patch,
345
- current,
346
- model: this.model,
347
- manager: this,
348
- transaction: this.getHookTransaction()
349
- }) ?? patch;
350
- }
351
- getHookTransaction() {
352
- return TransactionEngine.forRuntime(this.runtime).getActiveTransaction();
353
- }
354
- };
355
-
356
- //#endregion
357
- //#region src/manager/registerModelObjects.ts
358
- const managerCache = new WeakMap();
359
- let hasRegisteredModelObjects = false;
360
- function defineObjectsProperty(model) {
361
- Object.defineProperty(model, "objects", {
362
- configurable: true,
363
- enumerable: true,
364
- get() {
365
- const runtime = getTangoRuntime();
366
- const cached = managerCache.get(model);
367
- if (cached && cached.runtime === runtime) return cached.manager;
368
- const manager = new ModelManager(model, runtime);
369
- managerCache.set(model, {
370
- runtime,
371
- manager
372
- });
373
- return manager;
374
- }
375
- });
376
- }
377
- function registerModelObjects() {
378
- if (hasRegisteredModelObjects) return;
379
- registerModelAugmentor(defineObjectsProperty);
380
- hasRegisteredModelObjects = true;
381
- }
382
-
383
- //#endregion
384
- export { ModelManager, registerModelObjects };
385
- //# sourceMappingURL=registerModelObjects-C-1RbUHS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registerModelObjects-C-1RbUHS.js","names":["dialect: Dialect","plan: ValidatedInsertSqlPlan","values: readonly unknown[]","plan: ValidatedUpdateSqlPlan","id: unknown","plan: ValidatedDeleteSqlPlan","valueRows: ReadonlyArray<ReadonlyArray<unknown>>","count: number","index: number","model: ModelLike<TModelRow>","runtime: TangoRuntime","value: unknown","modelName: string","pkColumn: string","where: FilterInput<TModelRow> | QNode<TModelRow>","defaults?: Partial<TModelRow>","payload: Partial<TModelRow>","node: QNode<TModelRow>","atom: FilterInput<TModelRow>","partials: Array<Partial<TModelRow>>","merged: Partial<TModelRow>","args: {\n where: FilterInput<TModelRow> | QNode<TModelRow>;\n defaults?: Partial<TModelRow>;\n }","args: {\n where: FilterInput<TModelRow> | QNode<TModelRow>;\n defaults?: Partial<TModelRow>;\n update?: Partial<TModelRow>;\n }","existing: TModelRow | null","id: TModelRow[keyof TModelRow]","input: Partial<TModelRow>","patch: Partial<TModelRow>","inputs: Partial<TModelRow>[]","batchPrepared: Partial<TModelRow>[]","data: Partial<TModelRow>","current: TModelRow","model: SchemaModel<TSchema, TKey>"],"sources":["../src/manager/internal/MutationCompiler.ts","../src/manager/ModelManager.ts","../src/manager/registerModelObjects.ts"],"sourcesContent":["import type { CompiledQuery, Dialect } from '../../query/domain/index';\nimport type {\n ValidatedDeleteSqlPlan,\n ValidatedInsertSqlPlan,\n ValidatedUpdateSqlPlan,\n} from '../../validation/SQLValidationEngine';\n\n/**\n * Internal compiler for manager-owned INSERT/UPDATE/DELETE statements.\n */\nexport class MutationCompiler {\n constructor(private readonly dialect: Dialect) {}\n\n compileInsert(plan: ValidatedInsertSqlPlan, values: readonly unknown[]): CompiledQuery {\n return {\n sql: `INSERT INTO ${plan.meta.table} (${plan.writeKeys.join(', ')}) VALUES (${this.buildValuePlaceholders(plan.writeKeys.length)}) RETURNING *`,\n params: values,\n };\n }\n\n compileUpdate(plan: ValidatedUpdateSqlPlan, values: readonly unknown[], id: unknown): CompiledQuery {\n const sets = plan.writeKeys.map((key, index) => `${key} = ${this.placeholder(index + 1)}`).join(', ');\n const whereParam = this.placeholder(plan.writeKeys.length + 1);\n\n return {\n sql: `UPDATE ${plan.meta.table} SET ${sets} WHERE ${plan.meta.pk} = ${whereParam} RETURNING *`,\n params: [...values, id],\n };\n }\n\n compileDelete(plan: ValidatedDeleteSqlPlan, id: unknown): CompiledQuery {\n return {\n sql: `DELETE FROM ${plan.meta.table} WHERE ${plan.meta.pk} = ${this.placeholder(1)}`,\n params: [id],\n };\n }\n\n compileBulkInsert(plan: ValidatedInsertSqlPlan, valueRows: ReadonlyArray<ReadonlyArray<unknown>>): CompiledQuery {\n const columnCount = plan.writeKeys.length;\n const placeholders = valueRows\n .map((_row, rowIndex) => {\n const offset = rowIndex * columnCount;\n return `(${plan.writeKeys.map((_, colIndex) => this.placeholder(offset + colIndex + 1)).join(', ')})`;\n })\n .join(', ');\n\n return {\n sql: `INSERT INTO ${plan.meta.table} (${plan.writeKeys.join(', ')}) VALUES ${placeholders} RETURNING *`,\n params: valueRows.flat(),\n };\n }\n\n private buildValuePlaceholders(count: number): string {\n return Array.from({ length: count }, (_value, index) => this.placeholder(index + 1)).join(', ');\n }\n\n private placeholder(index: number): string {\n return this.dialect === 'postgres' ? `$${index}` : '?';\n }\n}\n","import { NotFoundError } from '@danceroutine/tango-core';\nimport type { QNode } from '../query/domain/QNode';\nimport { InternalQNodeType } from '../query/domain/internal/InternalQNodeType';\nimport type { ModelWriteHooks } from '@danceroutine/tango-schema';\nimport type { Model as SchemaModel } from '@danceroutine/tango-schema/domain';\nimport type { FilterInput, TableMeta } from '../query/domain/index';\nimport { TableMetaFactory } from '../query/domain/TableMetaFactory';\nimport type { QuerySet } from '../query/index';\nimport { QuerySet as QuerySetClass } from '../query/index';\nimport type { Dialect, QueryExecutor } from '../query/index';\nimport type { TangoRuntime } from '../runtime/TangoRuntime';\nimport { OrmSqlSafetyAdapter } from '../validation';\nimport { TransactionEngine } from '../transaction/internal/context';\nimport type { ManagerLike } from './ManagerLike';\nimport { MutationCompiler } from './internal/MutationCompiler';\nimport { RuntimeBoundClient } from './internal/RuntimeBoundClient';\nimport { isQNodeLike } from '../query/internal/isQNodeLike';\n\nconst sqlSafetyAdapter = new OrmSqlSafetyAdapter();\n\ntype ModelMetadataLike = Omit<SchemaModel['metadata'], 'key' | 'namespace' | 'fields'> & {\n key?: string;\n namespace?: string;\n fields: Array<{\n name: string;\n type: string;\n primaryKey?: boolean;\n }>;\n};\n\ntype ModelLike<TModelRow extends Record<string, unknown>> = {\n metadata: ModelMetadataLike;\n schema: {\n parse(input: unknown): TModelRow;\n };\n hooks?: ModelWriteHooks<TModelRow>;\n};\n\n/**\n * Model-backed data access API exposed as `Model.objects`.\n */\nexport class ModelManager<TModelRow extends Record<string, unknown>, TSourceModel = unknown>\n implements ManagerLike<TModelRow, TSourceModel>\n{\n static readonly BRAND = 'tango.orm.model_manager' as const;\n readonly __tangoBrand: typeof ModelManager.BRAND = ModelManager.BRAND;\n private readonly queryExecutor: QueryExecutor<TModelRow>;\n private readonly mutationCompiler: MutationCompiler;\n private readonly model: ModelLike<TModelRow>;\n private readonly client: RuntimeBoundClient;\n private readonly dialect: Dialect;\n private readonly runtime: TangoRuntime;\n\n constructor(model: ModelLike<TModelRow>, runtime: TangoRuntime) {\n this.model = model;\n this.runtime = runtime;\n this.client = new RuntimeBoundClient(runtime);\n this.dialect = runtime.getDialect() as Dialect;\n this.mutationCompiler = new MutationCompiler(this.dialect);\n this.queryExecutor = {\n get meta() {\n return ModelManager.createTableMeta(model);\n },\n client: this.client,\n dialect: this.dialect,\n run: async (compiled) => {\n const result = await this.client.query<TModelRow>(compiled.sql, compiled.params);\n return result.rows;\n },\n };\n }\n\n get meta(): TableMeta {\n return ModelManager.createTableMeta(this.model);\n }\n\n /**\n * Narrow an unknown value to `ModelManager`.\n */\n static isModelManager<TModelRow extends Record<string, unknown>>(value: unknown): value is ModelManager<TModelRow> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === ModelManager.BRAND\n );\n }\n\n private static createTableMeta<TModelRow extends Record<string, unknown>>(model: ModelLike<TModelRow>): TableMeta {\n const rawMeta = TableMetaFactory.create(model);\n const validatedMeta = sqlSafetyAdapter.validate({\n kind: 'insert',\n meta: rawMeta,\n writeKeys: Object.keys(rawMeta.columns),\n }).meta;\n\n if (rawMeta.relations) {\n validatedMeta.relations = rawMeta.relations;\n }\n\n return validatedMeta;\n }\n\n private static mergeCreatePayloadFromWhere<TModelRow extends Record<string, unknown>>(\n modelName: string,\n pkColumn: string,\n where: FilterInput<TModelRow> | QNode<TModelRow>,\n defaults?: Partial<TModelRow>\n ): Partial<TModelRow> {\n const hasDefaultsArg = defaults !== undefined;\n const providedDefaults = defaults !== undefined ? ({ ...defaults } as Partial<TModelRow>) : undefined;\n\n if (isQNodeLike(where)) {\n if (!hasDefaultsArg) {\n throw new Error(`Cannot create ${modelName} from Q filters without defaults.`);\n }\n if (!providedDefaults || Object.keys(providedDefaults).length === 0) {\n throw new Error(`Cannot create ${modelName} from Q filters without defaults.`);\n }\n const fromQ = ModelManager.collectPlainFieldsFromQNode(modelName, where);\n const merged = { ...fromQ, ...providedDefaults };\n const keys = Object.keys(merged).filter((key) => merged[key as keyof TModelRow] !== undefined);\n const nonPkKeys = keys.filter((key) => key !== pkColumn);\n if (nonPkKeys.length === 0) {\n throw new Error(`Cannot create ${modelName} without any values.`);\n }\n return merged;\n }\n\n const atom = where as FilterInput<TModelRow>;\n const entries = Object.entries(atom as Record<string, unknown>);\n const plainEntries = entries.filter(([key]) => !String(key).includes('__'));\n const lookupOnly = entries.length > 0 && plainEntries.length === 0;\n\n const fromAtom = plainEntries.length > 0 ? (Object.fromEntries(plainEntries) as Partial<TModelRow>) : undefined;\n const mergeBase = { ...fromAtom, ...providedDefaults };\n\n if (lookupOnly && ModelManager.countNonPkValues(mergeBase) === 0) {\n throw new Error(`Cannot create ${modelName} from lookup-only filters without defaults.`);\n }\n\n const cleanedAtom =\n plainEntries.length > 0\n ? (Object.fromEntries(plainEntries) as Partial<TModelRow>)\n : ({} as Partial<TModelRow>);\n const merged = { ...cleanedAtom, ...mergeBase };\n const keys = Object.keys(merged).filter((key) => merged[key as keyof TModelRow] !== undefined);\n const nonPkKeys = keys.filter((key) => key !== pkColumn);\n if (nonPkKeys.length === 0) {\n throw new Error(`Cannot create ${modelName} without any values.`);\n }\n return merged;\n }\n\n private static countNonPkValues<TModelRow extends Record<string, unknown>>(payload: Partial<TModelRow>): number {\n return Object.entries(payload as Record<string, unknown>).filter(([, value]) => value !== undefined).length;\n }\n\n private static collectPlainFieldsFromQNode<TModelRow extends Record<string, unknown>>(\n modelName: string,\n node: QNode<TModelRow>\n ): Partial<TModelRow> {\n switch (node.kind) {\n case InternalQNodeType.ATOM: {\n const atom = node.where as FilterInput<TModelRow>;\n return ModelManager.omitLookupKeysFromAtom(atom);\n }\n case InternalQNodeType.AND: {\n const partials = (node.nodes ?? []).map((child) =>\n ModelManager.collectPlainFieldsFromQNode(modelName, child)\n );\n return ModelManager.mergeCompatiblePartials(partials);\n }\n case InternalQNodeType.OR: {\n const partials = (node.nodes ?? []).map((child) =>\n ModelManager.collectPlainFieldsFromQNode(modelName, child)\n );\n const nonEmpty = partials.filter((p) => Object.keys(p as Record<string, unknown>).length > 0);\n if (nonEmpty.length > 1) {\n throw new Error(\n `Cannot derive a create payload from ${modelName} OR filters with multiple predicates. Supply defaults that fully describe the insert.`\n );\n }\n return nonEmpty.length === 1 ? nonEmpty[0]! : {};\n }\n case InternalQNodeType.NOT:\n return {};\n }\n }\n\n private static omitLookupKeysFromAtom<TModelRow extends Record<string, unknown>>(\n atom: FilterInput<TModelRow>\n ): Partial<TModelRow> {\n const entries = Object.entries(atom as Record<string, unknown>).filter(([key]) => !String(key).includes('__'));\n return Object.fromEntries(entries) as Partial<TModelRow>;\n }\n\n private static mergeCompatiblePartials<TModelRow extends Record<string, unknown>>(\n partials: Array<Partial<TModelRow>>\n ): Partial<TModelRow> {\n const merged: Partial<TModelRow> = {};\n for (const partial of partials) {\n for (const [key, value] of Object.entries(partial as Record<string, unknown>)) {\n const existing = merged[key as keyof TModelRow];\n if (existing !== undefined && existing !== value) {\n throw new Error(`Conflicting values for '${key}' while deriving create payload from Q filters.`);\n }\n (merged as Record<string, unknown>)[key] = value;\n }\n }\n return merged;\n }\n\n query(): QuerySet<TModelRow, TModelRow, TSourceModel> {\n return new QuerySetClass<TModelRow, TModelRow, TSourceModel>(this.queryExecutor, {});\n }\n\n all(): QuerySet<TModelRow, TModelRow, TSourceModel> {\n return this.query();\n }\n\n async getOrCreate(args: {\n where: FilterInput<TModelRow> | QNode<TModelRow>;\n defaults?: Partial<TModelRow>;\n }): Promise<{ record: TModelRow; created: boolean }> {\n try {\n const record = await this.query().get(args.where);\n return { record, created: false };\n } catch (error) {\n if (!NotFoundError.isNotFoundError(error)) {\n throw error;\n }\n }\n const merged = ModelManager.mergeCreatePayloadFromWhere(\n this.model.metadata.name,\n this.meta.pk,\n args.where,\n args.defaults\n );\n const record = await this.create(merged);\n return { record, created: true };\n }\n\n async updateOrCreate(args: {\n where: FilterInput<TModelRow> | QNode<TModelRow>;\n defaults?: Partial<TModelRow>;\n update?: Partial<TModelRow>;\n }): Promise<{ record: TModelRow; created: boolean; updated: boolean }> {\n let existing: TModelRow | null = null;\n try {\n existing = await this.query().get(args.where);\n } catch (error) {\n if (!NotFoundError.isNotFoundError(error)) {\n throw error;\n }\n }\n\n if (!existing) {\n const merged = ModelManager.mergeCreatePayloadFromWhere(\n this.model.metadata.name,\n this.meta.pk,\n args.where,\n args.defaults\n );\n const record = await this.create(merged);\n return { record, created: true, updated: false };\n }\n\n const patch = args.update ?? args.defaults ?? {};\n const patchKeys = Object.keys(patch);\n if (patchKeys.length === 0) {\n return { record: existing, created: false, updated: false };\n }\n\n const id = existing[this.meta.pk as keyof TModelRow] as TModelRow[keyof TModelRow];\n const record = await this.update(id, patch);\n return { record, created: false, updated: true };\n }\n\n async findById(id: TModelRow[keyof TModelRow]): Promise<TModelRow | null> {\n const filter = { [this.meta.pk]: id } as unknown as FilterInput<TModelRow>;\n return this.query().filter(filter).fetchOne();\n }\n\n async getOrThrow(id: TModelRow[keyof TModelRow]): Promise<TModelRow> {\n const result = await this.findById(id);\n if (!result) {\n throw new NotFoundError(`${this.model.metadata.name} with ${this.meta.pk}=${String(id)} not found`);\n }\n return result;\n }\n\n async create(input: Partial<TModelRow>): Promise<TModelRow> {\n const prepared = await this.runBeforeCreate(input);\n const preparedKeys = Object.keys(prepared);\n if (preparedKeys.length === 0) {\n throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);\n }\n\n const validatedPlan = sqlSafetyAdapter.validate({\n kind: 'insert',\n meta: this.meta,\n writeKeys: preparedKeys,\n });\n const compiled = this.mutationCompiler.compileInsert(\n validatedPlan,\n preparedKeys.map((key) => prepared[key as keyof TModelRow])\n );\n const result = await this.queryExecutor.client.query<TModelRow>(compiled.sql, compiled.params);\n const created = result.rows[0]!;\n await this.model.hooks?.afterCreate?.({\n record: created,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n });\n return created;\n }\n\n async update(id: TModelRow[keyof TModelRow], patch: Partial<TModelRow>): Promise<TModelRow> {\n const current = await this.getOrThrow(id);\n const prepared = await this.runBeforeUpdate(id, patch, current);\n const preparedKeys = Object.keys(prepared);\n if (preparedKeys.length === 0) {\n throw new Error(`Cannot update ${this.model.metadata.name} without any values.`);\n }\n\n const validatedPlan = sqlSafetyAdapter.validate({\n kind: 'update',\n meta: this.meta,\n writeKeys: preparedKeys,\n });\n const compiled = this.mutationCompiler.compileUpdate(\n validatedPlan,\n preparedKeys.map((key) => prepared[key as keyof TModelRow]),\n id\n );\n const result = await this.queryExecutor.client.query<TModelRow>(compiled.sql, compiled.params);\n const updated = result.rows[0]!;\n await this.model.hooks?.afterUpdate?.({\n id,\n patch: prepared,\n previous: current,\n record: updated,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n });\n return updated;\n }\n\n async delete(id: TModelRow[keyof TModelRow]): Promise<void> {\n const current = await this.getOrThrow(id);\n await this.model.hooks?.beforeDelete?.({\n id,\n current,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n });\n const validatedPlan = sqlSafetyAdapter.validate({\n kind: 'delete',\n meta: this.meta,\n });\n const compiled = this.mutationCompiler.compileDelete(validatedPlan, id);\n await this.queryExecutor.client.query(compiled.sql, compiled.params);\n await this.model.hooks?.afterDelete?.({\n id,\n previous: current,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n });\n }\n\n async bulkCreate(inputs: Partial<TModelRow>[]): Promise<TModelRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n\n const perRowPrepared = await Promise.all(inputs.map((input) => this.runBeforeCreate(input)));\n const batchPrepared: Partial<TModelRow>[] =\n (await this.model.hooks?.beforeBulkCreate?.({\n rows: perRowPrepared,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n })) ?? perRowPrepared;\n const preparedKeys = Object.keys(batchPrepared[0] ?? {});\n if (preparedKeys.length === 0) {\n throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);\n }\n\n const validatedPlan = sqlSafetyAdapter.validate({\n kind: 'insert',\n meta: this.meta,\n writeKeys: preparedKeys,\n });\n const valueRows = batchPrepared.map((input) => preparedKeys.map((key) => input[key as keyof TModelRow]));\n const compiled = this.mutationCompiler.compileBulkInsert(validatedPlan, valueRows);\n const result = await this.queryExecutor.client.query<TModelRow>(compiled.sql, compiled.params);\n await Promise.all(\n result.rows.map((record) =>\n this.model.hooks?.afterCreate?.({\n record,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n })\n )\n );\n await this.model.hooks?.afterBulkCreate?.({\n records: result.rows,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n });\n return result.rows;\n }\n\n private async runBeforeCreate(data: Partial<TModelRow>): Promise<Partial<TModelRow>> {\n return (\n (await this.model.hooks?.beforeCreate?.({\n data,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n })) ?? data\n );\n }\n\n private async runBeforeUpdate(\n id: TModelRow[keyof TModelRow],\n patch: Partial<TModelRow>,\n current: TModelRow\n ): Promise<Partial<TModelRow>> {\n return (\n (await this.model.hooks?.beforeUpdate?.({\n id,\n patch,\n current,\n model: this.model,\n manager: this,\n transaction: this.getHookTransaction(),\n })) ?? patch\n );\n }\n\n private getHookTransaction() {\n return TransactionEngine.forRuntime(this.runtime).getActiveTransaction();\n }\n}\n","import type { z } from 'zod';\nimport type { Model as SchemaModel, PersistedModelOutput } from '@danceroutine/tango-schema/domain';\nimport { registerModelAugmentor } from '@danceroutine/tango-schema';\nimport { ModelManager } from './ModelManager';\nimport type { TangoRuntime } from '../runtime/TangoRuntime';\nimport { getTangoRuntime } from '../runtime/defaultRuntime';\n\nconst managerCache = new WeakMap<object, { runtime: TangoRuntime; manager: ModelManager<Record<string, unknown>> }>();\nlet hasRegisteredModelObjects = false;\n\ntype AugmentableSchemaModel<TSchema extends z.ZodObject<z.ZodRawShape>> = Pick<\n SchemaModel<TSchema>,\n 'metadata' | 'hooks'\n> & {\n schema: {\n parse(input: unknown): PersistedModelOutput<TSchema>;\n };\n};\n\nfunction defineObjectsProperty<TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string>(\n model: SchemaModel<TSchema, TKey>\n): void {\n Object.defineProperty(model, 'objects', {\n configurable: true,\n enumerable: true,\n get() {\n const runtime = getTangoRuntime();\n const cached = managerCache.get(model);\n if (cached && cached.runtime === runtime) {\n return cached.manager;\n }\n\n const manager = new ModelManager<PersistedModelOutput<TSchema>, SchemaModel<TSchema, TKey>>(\n model as unknown as AugmentableSchemaModel<TSchema>,\n runtime\n );\n managerCache.set(model, {\n runtime,\n manager: manager as ModelManager<Record<string, unknown>>,\n });\n return manager;\n },\n });\n}\n\n/**\n * Install the schema model augmentor that exposes `Model.objects`.\n * This registration is idempotent so multiple Tango entrypoints can safely call it.\n */\nexport function registerModelObjects(): void {\n if (hasRegisteredModelObjects) {\n return;\n }\n\n registerModelAugmentor(defineObjectsProperty);\n hasRegisteredModelObjects = true;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-ByXbpVBS.js","names":[],"sources":["../src/runtime/index.ts"],"sourcesContent":["import type { z } from 'zod';\nimport type { ModelManager } from '../manager/ModelManager';\nimport type { Model, PersistedModelOutput } from '@danceroutine/tango-schema/domain';\nimport { registerModelObjects } from '../manager/registerModelObjects';\n\n/**\n * Domain boundary barrel: centralizes Tango runtime ownership APIs.\n */\n\ndeclare global {\n interface TangoSchemaModelAugmentations<\n TSchema extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n TKey extends string = string,\n > {\n readonly objects: ModelManager<PersistedModelOutput<TSchema>, Model<TSchema, TKey>>;\n }\n}\n\nregisterModelObjects();\n\nexport { registerModelObjects } from '../manager/registerModelObjects';\nexport { TangoRuntime } from './TangoRuntime';\nexport { getTangoRuntime, initializeTangoRuntime, resetTangoRuntime } from './defaultRuntime';\n"],"mappings":";;;;;;;;;;;;;AAkBA,sBAAsB"}