@danceroutine/tango-orm 1.6.0 → 1.8.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/dist/InternalDialect-ClSaUNso.js +10 -0
- package/dist/InternalDialect-ClSaUNso.js.map +1 -0
- package/dist/PostgresAdapter-CXKdKBG-.js +4 -0
- package/dist/PostgresAdapter-DySFW6vy.js +128 -0
- package/dist/PostgresAdapter-DySFW6vy.js.map +1 -0
- package/dist/{SqliteClient-CjOK9-ki.js → SqliteAdapter-CDdOjRmW.js} +57 -3
- package/dist/SqliteAdapter-CDdOjRmW.js.map +1 -0
- package/dist/SqliteAdapter-mjtXuVTg.js +4 -0
- package/dist/connection/adapters/Adapter.d.ts +32 -1
- package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +5 -6
- package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +4 -6
- package/dist/connection/adapters/index.d.ts +1 -1
- package/dist/connection/index.d.ts +1 -1
- package/dist/connection/index.js +4 -5
- package/dist/{connection-B_K2ZAf7.js → connection-Dmhgx31M.js} +5 -7
- package/dist/{connection-B_K2ZAf7.js.map → connection-Dmhgx31M.js.map} +1 -1
- package/dist/{defaultRuntime-BPK9kWEW.js → defaultRuntime-DzqBQ9Hb.js} +63 -16
- package/dist/defaultRuntime-DzqBQ9Hb.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +11 -12
- package/dist/manager/ManagerLike.d.ts +19 -0
- package/dist/manager/ModelManager.d.ts +45 -2
- package/dist/manager/index.d.ts +6 -0
- package/dist/manager/index.js +8 -7
- package/dist/manager/internal/MutationCompiler.d.ts +14 -6
- package/dist/manager/relations/ManyToManyRelatedManager.d.ts +147 -0
- package/dist/manager/relations/ManyToManyRelatedQuerySet.d.ts +62 -0
- package/dist/manager/relations/MaterializedModelRecord.d.ts +28 -0
- package/dist/manager/relations/index.d.ts +9 -0
- package/dist/manager/relations/internal/ThroughTableManager.d.ts +79 -0
- package/dist/manager-DrDTiCAz.js +24 -0
- package/dist/manager-DrDTiCAz.js.map +1 -0
- package/dist/query/ModelQuerySet.d.ts +20 -0
- package/dist/query/QBuilder.d.ts +3 -3
- package/dist/query/QuerySet.d.ts +58 -18
- package/dist/query/compiler/QueryCompiler.d.ts +13 -4
- package/dist/query/domain/CompiledQuery.d.ts +169 -2
- package/dist/query/domain/FilterInput.d.ts +1 -1
- package/dist/query/domain/FilterKey.d.ts +4 -2
- package/dist/query/domain/QNode.d.ts +4 -4
- package/dist/query/domain/QuerySetState.d.ts +3 -3
- package/dist/query/domain/RelationMeta.d.ts +9 -0
- package/dist/query/domain/RelationTyping.d.ts +47 -0
- package/dist/query/domain/TableMetaFactory.d.ts +1 -14
- package/dist/query/domain/index.d.ts +1 -1
- package/dist/query/domain/internal/InternalPrefetchQueryKind.d.ts +20 -0
- package/dist/query/index.d.ts +1 -0
- package/dist/query/index.js +3 -2
- package/dist/query/internal/isQNodeLike.d.ts +3 -0
- package/dist/query/planning/QueryPlanner.d.ts +1 -1
- package/dist/{query-C6So1r6H.js → query-DUZnBFhf.js} +474 -156
- package/dist/query-DUZnBFhf.js.map +1 -0
- package/dist/registerModelObjects-DxlBfuUN.js +797 -0
- package/dist/registerModelObjects-DxlBfuUN.js.map +1 -0
- package/dist/runtime/TangoRuntime.d.ts +9 -0
- package/dist/runtime/index.d.ts +3 -2
- package/dist/runtime/index.js +7 -6
- package/dist/runtime/internal/SqliteDBClientProvider.d.ts +3 -0
- package/dist/{runtime-ByXbpVBS.js → runtime-1H88J3nN.js} +3 -3
- package/dist/runtime-1H88J3nN.js.map +1 -0
- package/dist/transaction/index.js +5 -4
- package/dist/{transaction-Cs0Z9tbW.js → transaction-ZhfDf-f8.js} +2 -2
- package/dist/{transaction-Cs0Z9tbW.js.map → transaction-ZhfDf-f8.js.map} +1 -1
- package/dist/validation/SQLValidationEngine.d.ts +22 -5
- package/dist/validation/SqlValidationPlan.d.ts +5 -4
- package/dist/validation/internal/InternalSqlValidationPlanKind.d.ts +25 -0
- package/dist/validation/internal/InternalValidatedFilterDescriptorKind.d.ts +4 -0
- package/package.json +6 -6
- package/dist/PostgresAdapter-BFdo_nIt.js +0 -4
- package/dist/PostgresAdapter-CMiEpHya.js +0 -49
- package/dist/PostgresAdapter-CMiEpHya.js.map +0 -1
- package/dist/PostgresClient-BQJZfEOT.js +0 -68
- package/dist/PostgresClient-BQJZfEOT.js.map +0 -1
- package/dist/SqliteAdapter-A-P9zUhP.js +0 -4
- package/dist/SqliteAdapter-CeqhyrPC.js +0 -44
- package/dist/SqliteAdapter-CeqhyrPC.js.map +0 -1
- package/dist/SqliteClient-CjOK9-ki.js.map +0 -1
- package/dist/defaultRuntime-BPK9kWEW.js.map +0 -1
- package/dist/manager-C6oJ2tAF.js +0 -13
- package/dist/manager-C6oJ2tAF.js.map +0 -1
- package/dist/query-C6So1r6H.js.map +0 -1
- package/dist/registerModelObjects-BKMpfc4Z.js +0 -263
- package/dist/registerModelObjects-BKMpfc4Z.js.map +0 -1
- package/dist/runtime-ByXbpVBS.js.map +0 -1
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
import { OrmSqlSafetyAdapter, QuerySet, TableMetaFactory } from "./query-C6So1r6H.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
|
-
query() {
|
|
100
|
-
return new QuerySet(this.queryExecutor, {});
|
|
101
|
-
}
|
|
102
|
-
async findById(id) {
|
|
103
|
-
const filter = { [this.meta.pk]: id };
|
|
104
|
-
return this.query().filter(filter).fetchOne();
|
|
105
|
-
}
|
|
106
|
-
async getOrThrow(id) {
|
|
107
|
-
const result = await this.findById(id);
|
|
108
|
-
if (!result) throw new NotFoundError(`${this.model.metadata.name} with ${this.meta.pk}=${String(id)} not found`);
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
async create(input) {
|
|
112
|
-
const prepared = await this.runBeforeCreate(input);
|
|
113
|
-
const preparedKeys = Object.keys(prepared);
|
|
114
|
-
if (preparedKeys.length === 0) throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);
|
|
115
|
-
const validatedPlan = sqlSafetyAdapter.validate({
|
|
116
|
-
kind: "insert",
|
|
117
|
-
meta: this.meta,
|
|
118
|
-
writeKeys: preparedKeys
|
|
119
|
-
});
|
|
120
|
-
const compiled = this.mutationCompiler.compileInsert(validatedPlan, preparedKeys.map((key) => prepared[key]));
|
|
121
|
-
const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
|
|
122
|
-
const created = result.rows[0];
|
|
123
|
-
await this.model.hooks?.afterCreate?.({
|
|
124
|
-
record: created,
|
|
125
|
-
model: this.model,
|
|
126
|
-
manager: this,
|
|
127
|
-
transaction: this.getHookTransaction()
|
|
128
|
-
});
|
|
129
|
-
return created;
|
|
130
|
-
}
|
|
131
|
-
async update(id, patch) {
|
|
132
|
-
const current = await this.getOrThrow(id);
|
|
133
|
-
const prepared = await this.runBeforeUpdate(id, patch, current);
|
|
134
|
-
const preparedKeys = Object.keys(prepared);
|
|
135
|
-
if (preparedKeys.length === 0) throw new Error(`Cannot update ${this.model.metadata.name} without any values.`);
|
|
136
|
-
const validatedPlan = sqlSafetyAdapter.validate({
|
|
137
|
-
kind: "update",
|
|
138
|
-
meta: this.meta,
|
|
139
|
-
writeKeys: preparedKeys
|
|
140
|
-
});
|
|
141
|
-
const compiled = this.mutationCompiler.compileUpdate(validatedPlan, preparedKeys.map((key) => prepared[key]), id);
|
|
142
|
-
const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
|
|
143
|
-
const updated = result.rows[0];
|
|
144
|
-
await this.model.hooks?.afterUpdate?.({
|
|
145
|
-
id,
|
|
146
|
-
patch: prepared,
|
|
147
|
-
previous: current,
|
|
148
|
-
record: updated,
|
|
149
|
-
model: this.model,
|
|
150
|
-
manager: this,
|
|
151
|
-
transaction: this.getHookTransaction()
|
|
152
|
-
});
|
|
153
|
-
return updated;
|
|
154
|
-
}
|
|
155
|
-
async delete(id) {
|
|
156
|
-
const current = await this.getOrThrow(id);
|
|
157
|
-
await this.model.hooks?.beforeDelete?.({
|
|
158
|
-
id,
|
|
159
|
-
current,
|
|
160
|
-
model: this.model,
|
|
161
|
-
manager: this,
|
|
162
|
-
transaction: this.getHookTransaction()
|
|
163
|
-
});
|
|
164
|
-
const validatedPlan = sqlSafetyAdapter.validate({
|
|
165
|
-
kind: "delete",
|
|
166
|
-
meta: this.meta
|
|
167
|
-
});
|
|
168
|
-
const compiled = this.mutationCompiler.compileDelete(validatedPlan, id);
|
|
169
|
-
await this.queryExecutor.client.query(compiled.sql, compiled.params);
|
|
170
|
-
await this.model.hooks?.afterDelete?.({
|
|
171
|
-
id,
|
|
172
|
-
previous: current,
|
|
173
|
-
model: this.model,
|
|
174
|
-
manager: this,
|
|
175
|
-
transaction: this.getHookTransaction()
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
async bulkCreate(inputs) {
|
|
179
|
-
if (inputs.length === 0) return [];
|
|
180
|
-
const perRowPrepared = await Promise.all(inputs.map((input) => this.runBeforeCreate(input)));
|
|
181
|
-
const batchPrepared = await this.model.hooks?.beforeBulkCreate?.({
|
|
182
|
-
rows: perRowPrepared,
|
|
183
|
-
model: this.model,
|
|
184
|
-
manager: this,
|
|
185
|
-
transaction: this.getHookTransaction()
|
|
186
|
-
}) ?? perRowPrepared;
|
|
187
|
-
const preparedKeys = Object.keys(batchPrepared[0] ?? {});
|
|
188
|
-
if (preparedKeys.length === 0) throw new Error(`Cannot create ${this.model.metadata.name} without any values.`);
|
|
189
|
-
const validatedPlan = sqlSafetyAdapter.validate({
|
|
190
|
-
kind: "insert",
|
|
191
|
-
meta: this.meta,
|
|
192
|
-
writeKeys: preparedKeys
|
|
193
|
-
});
|
|
194
|
-
const valueRows = batchPrepared.map((input) => preparedKeys.map((key) => input[key]));
|
|
195
|
-
const compiled = this.mutationCompiler.compileBulkInsert(validatedPlan, valueRows);
|
|
196
|
-
const result = await this.queryExecutor.client.query(compiled.sql, compiled.params);
|
|
197
|
-
await Promise.all(result.rows.map((record) => this.model.hooks?.afterCreate?.({
|
|
198
|
-
record,
|
|
199
|
-
model: this.model,
|
|
200
|
-
manager: this,
|
|
201
|
-
transaction: this.getHookTransaction()
|
|
202
|
-
})));
|
|
203
|
-
await this.model.hooks?.afterBulkCreate?.({
|
|
204
|
-
records: result.rows,
|
|
205
|
-
model: this.model,
|
|
206
|
-
manager: this,
|
|
207
|
-
transaction: this.getHookTransaction()
|
|
208
|
-
});
|
|
209
|
-
return result.rows;
|
|
210
|
-
}
|
|
211
|
-
async runBeforeCreate(data) {
|
|
212
|
-
return await this.model.hooks?.beforeCreate?.({
|
|
213
|
-
data,
|
|
214
|
-
model: this.model,
|
|
215
|
-
manager: this,
|
|
216
|
-
transaction: this.getHookTransaction()
|
|
217
|
-
}) ?? data;
|
|
218
|
-
}
|
|
219
|
-
async runBeforeUpdate(id, patch, current) {
|
|
220
|
-
return await this.model.hooks?.beforeUpdate?.({
|
|
221
|
-
id,
|
|
222
|
-
patch,
|
|
223
|
-
current,
|
|
224
|
-
model: this.model,
|
|
225
|
-
manager: this,
|
|
226
|
-
transaction: this.getHookTransaction()
|
|
227
|
-
}) ?? patch;
|
|
228
|
-
}
|
|
229
|
-
getHookTransaction() {
|
|
230
|
-
return TransactionEngine.forRuntime(this.runtime).getActiveTransaction();
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
//#endregion
|
|
235
|
-
//#region src/manager/registerModelObjects.ts
|
|
236
|
-
const managerCache = new WeakMap();
|
|
237
|
-
let hasRegisteredModelObjects = false;
|
|
238
|
-
function defineObjectsProperty(model) {
|
|
239
|
-
Object.defineProperty(model, "objects", {
|
|
240
|
-
configurable: true,
|
|
241
|
-
enumerable: true,
|
|
242
|
-
get() {
|
|
243
|
-
const runtime = getTangoRuntime();
|
|
244
|
-
const cached = managerCache.get(model);
|
|
245
|
-
if (cached && cached.runtime === runtime) return cached.manager;
|
|
246
|
-
const manager = new ModelManager(model, runtime);
|
|
247
|
-
managerCache.set(model, {
|
|
248
|
-
runtime,
|
|
249
|
-
manager
|
|
250
|
-
});
|
|
251
|
-
return manager;
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
function registerModelObjects() {
|
|
256
|
-
if (hasRegisteredModelObjects) return;
|
|
257
|
-
registerModelAugmentor(defineObjectsProperty);
|
|
258
|
-
hasRegisteredModelObjects = true;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
//#endregion
|
|
262
|
-
export { ModelManager, registerModelObjects };
|
|
263
|
-
//# sourceMappingURL=registerModelObjects-BKMpfc4Z.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registerModelObjects-BKMpfc4Z.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","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 { 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';\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 query(): QuerySet<TModelRow, TModelRow, TSourceModel> {\n return new QuerySetClass<TModelRow, TModelRow, TSourceModel>(this.queryExecutor, {});\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"}
|