@danceroutine/tango-orm 1.2.0 → 1.4.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/PostgresAdapter-BFdo_nIt.js +4 -0
- package/dist/{PostgresAdapter-C9a1XJRx.js → PostgresAdapter-CMiEpHya.js} +4 -52
- package/dist/PostgresAdapter-CMiEpHya.js.map +1 -0
- package/dist/PostgresClient-BQJZfEOT.js +68 -0
- package/dist/PostgresClient-BQJZfEOT.js.map +1 -0
- package/dist/SqliteAdapter-A-P9zUhP.js +4 -0
- package/dist/SqliteAdapter-CeqhyrPC.js +44 -0
- package/dist/SqliteAdapter-CeqhyrPC.js.map +1 -0
- package/dist/{SqliteAdapter-Dp6VRXmz.js → SqliteClient-CjOK9-ki.js} +20 -41
- package/dist/SqliteClient-CjOK9-ki.js.map +1 -0
- package/dist/connection/clients/DBClient.d.ts +6 -0
- package/dist/connection/clients/dialects/PostgresClient.d.ts +21 -5
- package/dist/connection/clients/dialects/SqliteClient.d.ts +13 -1
- package/dist/connection/index.js +5 -3
- package/dist/{connection-CVvycXus.js → connection-B_K2ZAf7.js} +7 -5
- package/dist/{connection-CVvycXus.js.map → connection-B_K2ZAf7.js.map} +1 -1
- package/dist/defaultRuntime-BPK9kWEW.js +447 -0
- package/dist/defaultRuntime-BPK9kWEW.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +12 -9
- package/dist/manager/ManagerLike.d.ts +8 -8
- package/dist/manager/ModelManager.d.ts +15 -13
- package/dist/manager/index.js +6 -6
- package/dist/manager/internal/RuntimeBoundClient.d.ts +5 -1
- package/dist/{manager-CKUy1CIt.js → manager-C6oJ2tAF.js} +2 -2
- package/dist/{manager-CKUy1CIt.js.map → manager-C6oJ2tAF.js.map} +1 -1
- package/dist/query/QuerySet.d.ts +45 -30
- package/dist/query/compiler/QueryCompiler.d.ts +11 -1
- package/dist/query/domain/CompiledQuery.d.ts +21 -0
- package/dist/query/domain/RelationMeta.d.ts +3 -3
- package/dist/query/domain/RelationTyping.d.ts +74 -0
- package/dist/query/domain/index.d.ts +2 -0
- package/dist/query/index.js +1 -1
- package/dist/{query-BKt2nKIt.js → query-CWZ1cfjo.js} +221 -28
- package/dist/query-CWZ1cfjo.js.map +1 -0
- package/dist/{registerModelObjects-vsX6GzCN.js → registerModelObjects-Bva_f-Qh.js} +34 -134
- package/dist/registerModelObjects-Bva_f-Qh.js.map +1 -0
- package/dist/runtime/TangoRuntime.d.ts +17 -4
- package/dist/runtime/index.d.ts +3 -3
- package/dist/runtime/index.js +6 -6
- package/dist/runtime/internal/DBClientProvider.d.ts +12 -0
- package/dist/runtime/internal/PostgresDBClientProvider.d.ts +12 -0
- package/dist/runtime/internal/SqliteDBClientProvider.d.ts +16 -0
- package/dist/runtime/internal/createDBClientProvider.d.ts +5 -0
- package/dist/{runtime-BUpil272.js → runtime-ByXbpVBS.js} +3 -2
- package/dist/runtime-ByXbpVBS.js.map +1 -0
- package/dist/transaction/AtomicTransaction.d.ts +32 -0
- package/dist/transaction/UnitOfWork.d.ts +3 -0
- package/dist/transaction/atomic.d.ts +2 -0
- package/dist/transaction/index.d.ts +2 -0
- package/dist/transaction/index.js +5 -2
- package/dist/transaction/internal/context/AsyncLocalTransactionEngine.d.ts +21 -0
- package/dist/transaction/internal/context/CallbackRecord.d.ts +5 -0
- package/dist/transaction/internal/context/FrameBoundTransaction.d.ts +20 -0
- package/dist/transaction/internal/context/FrameTransactionHandle.d.ts +4 -0
- package/dist/transaction/internal/context/TransactionEngine.d.ts +16 -0
- package/dist/transaction/internal/context/TransactionFrame.d.ts +7 -0
- package/dist/transaction/internal/context/TransactionState.d.ts +10 -0
- package/dist/transaction/internal/context/index.d.ts +1 -0
- package/dist/{transaction-DooTMuAl.js → transaction-Cs0Z9tbW.js} +15 -3
- package/dist/transaction-Cs0Z9tbW.js.map +1 -0
- package/dist/validation/SQLValidationEngine.d.ts +3 -3
- package/package.json +6 -6
- package/dist/PostgresAdapter-C9a1XJRx.js.map +0 -1
- package/dist/PostgresAdapter-CBc1u8eT.js +0 -3
- package/dist/SqliteAdapter-BJKNxCvS.js +0 -3
- package/dist/SqliteAdapter-Dp6VRXmz.js.map +0 -1
- package/dist/query-BKt2nKIt.js.map +0 -1
- package/dist/registerModelObjects-vsX6GzCN.js.map +0 -1
- package/dist/runtime-BUpil272.js.map +0 -1
- package/dist/transaction-DooTMuAl.js.map +0 -1
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { PostgresClient } from "./PostgresClient-BQJZfEOT.js";
|
|
2
|
+
import { SqliteClient } from "./SqliteClient-CjOK9-ki.js";
|
|
3
|
+
import pg from "pg";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { getLogger } from "@danceroutine/tango-core";
|
|
6
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
|
+
import { loadConfig, loadConfigFromProjectRoot } from "@danceroutine/tango-config";
|
|
8
|
+
|
|
9
|
+
//#region src/transaction/internal/context/FrameBoundTransaction.ts
|
|
10
|
+
var FrameBoundTransaction = class {
|
|
11
|
+
active = true;
|
|
12
|
+
constructor(engine, state, frame) {
|
|
13
|
+
this.engine = engine;
|
|
14
|
+
this.state = state;
|
|
15
|
+
this.frame = frame;
|
|
16
|
+
}
|
|
17
|
+
onCommit(callback, options = {}) {
|
|
18
|
+
if (!this.active) throw new Error("Cannot register an on-commit callback on an inactive transaction frame.");
|
|
19
|
+
this.frame.callbacks.push({
|
|
20
|
+
order: this.state.nextCallbackOrder++,
|
|
21
|
+
callback,
|
|
22
|
+
robust: options.robust ?? false
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async savepoint(work, options = {}) {
|
|
26
|
+
if (!this.active) throw new Error("Cannot open a savepoint from an inactive transaction frame.");
|
|
27
|
+
return this.engine.runSavepoint(this.state, work, options);
|
|
28
|
+
}
|
|
29
|
+
deactivate() {
|
|
30
|
+
this.active = false;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/transaction/internal/context/AsyncLocalTransactionEngine.ts
|
|
36
|
+
var AsyncLocalTransactionEngine = class {
|
|
37
|
+
logger = getLogger("tango.orm.transaction");
|
|
38
|
+
storage = new AsyncLocalStorage();
|
|
39
|
+
assertNoActiveAtomicTransaction() {
|
|
40
|
+
if (this.storage.getStore()) throw new Error("UnitOfWork is unsupported inside transaction.atomic(...).");
|
|
41
|
+
}
|
|
42
|
+
getActiveTransaction(runtime) {
|
|
43
|
+
const state = this.storage.getStore();
|
|
44
|
+
if (!state || state.runtime !== runtime) return undefined;
|
|
45
|
+
return state.frames.at(-1)?.facade;
|
|
46
|
+
}
|
|
47
|
+
getActiveLease(runtime) {
|
|
48
|
+
const state = this.storage.getStore();
|
|
49
|
+
if (!state || state.runtime !== runtime) return undefined;
|
|
50
|
+
return state.lease;
|
|
51
|
+
}
|
|
52
|
+
async atomic(runtime, work) {
|
|
53
|
+
const existing = this.storage.getStore();
|
|
54
|
+
if (existing) {
|
|
55
|
+
if (existing.runtime !== runtime) throw new Error("Cannot open a transaction for one Tango runtime while another runtime transaction is active.");
|
|
56
|
+
return this.runNested(existing, work);
|
|
57
|
+
}
|
|
58
|
+
const lease = await runtime.leaseTransactionClient();
|
|
59
|
+
const state = {
|
|
60
|
+
runtime,
|
|
61
|
+
lease,
|
|
62
|
+
frames: [],
|
|
63
|
+
nextCallbackOrder: 0,
|
|
64
|
+
nextSavepointId: 0
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
return await this.storage.run(state, async () => {
|
|
68
|
+
await lease.client.begin();
|
|
69
|
+
const frame = this.pushFrame(state);
|
|
70
|
+
try {
|
|
71
|
+
const result = await work(frame.facade);
|
|
72
|
+
await lease.client.commit();
|
|
73
|
+
const root = this.popFrame(state);
|
|
74
|
+
root.facade.deactivate();
|
|
75
|
+
await this.runCommittedCallbacks(root.callbacks);
|
|
76
|
+
return result;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
await this.rollbackOuter(state, error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
} finally {
|
|
83
|
+
this.deactivateAllFrames(state);
|
|
84
|
+
await lease.release();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async runSavepoint(state, work, options) {
|
|
88
|
+
try {
|
|
89
|
+
const value = await this.runNested(state, work);
|
|
90
|
+
if (options.throwOnError) return value;
|
|
91
|
+
return {
|
|
92
|
+
ok: true,
|
|
93
|
+
value
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (options.throwOnError) throw error;
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
error
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async runNested(state, work) {
|
|
104
|
+
const savepointName = `tango_sp_${state.nextSavepointId++}`;
|
|
105
|
+
await state.lease.client.createSavepoint(savepointName);
|
|
106
|
+
const frame = this.pushFrame(state, savepointName);
|
|
107
|
+
try {
|
|
108
|
+
const result = await work(frame.facade);
|
|
109
|
+
await state.lease.client.releaseSavepoint(savepointName);
|
|
110
|
+
const completed = this.popFrame(state);
|
|
111
|
+
completed.facade.deactivate();
|
|
112
|
+
const parent = state.frames.at(-1);
|
|
113
|
+
if (!parent) throw new Error("Nested transaction frame completed without a parent frame.");
|
|
114
|
+
parent.callbacks.push(...completed.callbacks);
|
|
115
|
+
parent.callbacks.sort((left, right) => left.order - right.order);
|
|
116
|
+
return result;
|
|
117
|
+
} catch (error) {
|
|
118
|
+
try {
|
|
119
|
+
await state.lease.client.rollbackToSavepoint(savepointName);
|
|
120
|
+
} catch (rollbackError) {
|
|
121
|
+
throw this.attachCause(rollbackError, error);
|
|
122
|
+
} finally {
|
|
123
|
+
const discarded = this.popFrame(state);
|
|
124
|
+
discarded.facade.deactivate();
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
pushFrame(state, savepointName) {
|
|
130
|
+
const frame = {};
|
|
131
|
+
const facade = new FrameBoundTransaction(this, state, frame);
|
|
132
|
+
frame.callbacks = [];
|
|
133
|
+
frame.facade = facade;
|
|
134
|
+
frame.savepointName = savepointName;
|
|
135
|
+
state.frames.push(frame);
|
|
136
|
+
return frame;
|
|
137
|
+
}
|
|
138
|
+
popFrame(state) {
|
|
139
|
+
const frame = state.frames.pop();
|
|
140
|
+
if (!frame) throw new Error("Transaction frame stack underflow.");
|
|
141
|
+
return frame;
|
|
142
|
+
}
|
|
143
|
+
async rollbackOuter(state, error) {
|
|
144
|
+
try {
|
|
145
|
+
await state.lease.client.rollback();
|
|
146
|
+
} catch (rollbackError) {
|
|
147
|
+
throw this.attachCause(rollbackError, error);
|
|
148
|
+
} finally {
|
|
149
|
+
while (state.frames.length > 0) {
|
|
150
|
+
const frame = this.popFrame(state);
|
|
151
|
+
frame.facade.deactivate();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async runCommittedCallbacks(callbacks) {
|
|
156
|
+
for (const record of callbacks) try {
|
|
157
|
+
await record.callback();
|
|
158
|
+
} catch (error) {
|
|
159
|
+
if (!record.robust) throw error;
|
|
160
|
+
try {
|
|
161
|
+
this.logger.error("Post-commit callback failed.", error);
|
|
162
|
+
} catch {}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
deactivateAllFrames(state) {
|
|
166
|
+
state.frames.length = 0;
|
|
167
|
+
}
|
|
168
|
+
attachCause(error, cause) {
|
|
169
|
+
if (!this.isErrorValue(error)) return error;
|
|
170
|
+
if ("cause" in error && error.cause !== undefined) return error;
|
|
171
|
+
try {
|
|
172
|
+
return new Error(error.message, { cause });
|
|
173
|
+
} catch {
|
|
174
|
+
return error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
isErrorValue(value) {
|
|
178
|
+
return typeof value === "object" && value !== null && typeof value.message === "string" && typeof value.name === "string";
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
//#endregion
|
|
183
|
+
//#region src/transaction/internal/context/TransactionEngine.ts
|
|
184
|
+
var TransactionEngine = class TransactionEngine {
|
|
185
|
+
static engine = new AsyncLocalTransactionEngine();
|
|
186
|
+
constructor(runtime) {
|
|
187
|
+
this.runtime = runtime;
|
|
188
|
+
}
|
|
189
|
+
static forRuntime(runtime) {
|
|
190
|
+
return new TransactionEngine(runtime);
|
|
191
|
+
}
|
|
192
|
+
static assertNoActiveAtomicTransaction() {
|
|
193
|
+
this.engine.assertNoActiveAtomicTransaction();
|
|
194
|
+
}
|
|
195
|
+
getActiveTransaction() {
|
|
196
|
+
return TransactionEngine.engine.getActiveTransaction(this.runtime);
|
|
197
|
+
}
|
|
198
|
+
getActiveLease() {
|
|
199
|
+
return TransactionEngine.engine.getActiveLease(this.runtime);
|
|
200
|
+
}
|
|
201
|
+
async atomic(work) {
|
|
202
|
+
return TransactionEngine.engine.atomic(this.runtime, work);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/manager/internal/RuntimeBoundClient.ts
|
|
208
|
+
var RuntimeBoundClient = class {
|
|
209
|
+
constructor(runtime) {
|
|
210
|
+
this.runtime = runtime;
|
|
211
|
+
}
|
|
212
|
+
async query(sql, params) {
|
|
213
|
+
const lease = TransactionEngine.forRuntime(this.runtime).getActiveLease();
|
|
214
|
+
if (lease) return lease.client.query(sql, params);
|
|
215
|
+
const runtimeWithQuery = this.runtime;
|
|
216
|
+
if (typeof runtimeWithQuery.query === "function") return runtimeWithQuery.query(sql, params);
|
|
217
|
+
const client = await this.runtime.getClient();
|
|
218
|
+
return client.query(sql, params);
|
|
219
|
+
}
|
|
220
|
+
async begin() {
|
|
221
|
+
throw new Error("Runtime-bound clients do not support manual begin(). Use transaction.atomic(...) instead.");
|
|
222
|
+
}
|
|
223
|
+
async commit() {
|
|
224
|
+
throw new Error("Runtime-bound clients do not support manual commit(). Use transaction.atomic(...) instead.");
|
|
225
|
+
}
|
|
226
|
+
async rollback() {
|
|
227
|
+
throw new Error("Runtime-bound clients do not support manual rollback(). Use transaction.atomic(...) instead.");
|
|
228
|
+
}
|
|
229
|
+
async createSavepoint(_name) {
|
|
230
|
+
throw new Error("Runtime-bound clients do not support manual savepoints. Use transaction.atomic(...) or tx.savepoint(...) instead.");
|
|
231
|
+
}
|
|
232
|
+
async releaseSavepoint(_name) {
|
|
233
|
+
throw new Error("Runtime-bound clients do not support manual savepoint release. Use transaction.atomic(...) or tx.savepoint(...) instead.");
|
|
234
|
+
}
|
|
235
|
+
async rollbackToSavepoint(_name) {
|
|
236
|
+
throw new Error("Runtime-bound clients do not support manual savepoint rollback. Use transaction.atomic(...) or tx.savepoint(...) instead.");
|
|
237
|
+
}
|
|
238
|
+
async close() {
|
|
239
|
+
throw new Error("Runtime-bound clients do not support manual close(). Use TangoRuntime.reset() instead.");
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
//#endregion
|
|
244
|
+
//#region src/runtime/internal/PostgresDBClientProvider.ts
|
|
245
|
+
const { Pool } = pg;
|
|
246
|
+
var PostgresDBClientProvider = class {
|
|
247
|
+
pool;
|
|
248
|
+
activeLeaseCount = 0;
|
|
249
|
+
constructor(config) {
|
|
250
|
+
this.pool = new Pool({
|
|
251
|
+
connectionString: config.url,
|
|
252
|
+
host: config.host,
|
|
253
|
+
port: config.port,
|
|
254
|
+
database: config.database,
|
|
255
|
+
user: config.user,
|
|
256
|
+
password: config.password,
|
|
257
|
+
max: config.maxConnections || 10
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
async query(sql, params) {
|
|
261
|
+
const result = await this.pool.query(sql, params);
|
|
262
|
+
return { rows: result.rows };
|
|
263
|
+
}
|
|
264
|
+
async leaseTransactionClient() {
|
|
265
|
+
const client = await this.pool.connect();
|
|
266
|
+
this.activeLeaseCount += 1;
|
|
267
|
+
let released = false;
|
|
268
|
+
return {
|
|
269
|
+
client: new PostgresClient(client),
|
|
270
|
+
release: async () => {
|
|
271
|
+
if (released) return;
|
|
272
|
+
released = true;
|
|
273
|
+
this.activeLeaseCount -= 1;
|
|
274
|
+
client.release();
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
async reset() {
|
|
279
|
+
if (this.activeLeaseCount > 0) throw new Error("Cannot reset Tango runtime while transaction leases are still active.");
|
|
280
|
+
await this.pool.end();
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
//#endregion
|
|
285
|
+
//#region src/runtime/internal/SqliteDBClientProvider.ts
|
|
286
|
+
var SqliteDBClientProvider = class {
|
|
287
|
+
filename;
|
|
288
|
+
Database;
|
|
289
|
+
autocommitClient;
|
|
290
|
+
activeLeaseCount = 0;
|
|
291
|
+
constructor(config = {}) {
|
|
292
|
+
this.Database = this.getDatabaseCtor();
|
|
293
|
+
this.filename = typeof config.filename === "string" && config.filename.length > 0 ? config.filename : ":memory:";
|
|
294
|
+
this.autocommitClient = this.openClient(this.filename);
|
|
295
|
+
}
|
|
296
|
+
async query(sql, params) {
|
|
297
|
+
return this.autocommitClient.query(sql, params);
|
|
298
|
+
}
|
|
299
|
+
async leaseTransactionClient() {
|
|
300
|
+
if (this.filename === ":memory:") throw new Error("transaction.atomic(...) requires a file-backed SQLite database. :memory: is unsupported.");
|
|
301
|
+
const client = this.openClient(this.filename);
|
|
302
|
+
this.activeLeaseCount += 1;
|
|
303
|
+
let released = false;
|
|
304
|
+
return {
|
|
305
|
+
client,
|
|
306
|
+
release: async () => {
|
|
307
|
+
if (released) return;
|
|
308
|
+
released = true;
|
|
309
|
+
this.activeLeaseCount -= 1;
|
|
310
|
+
await client.close();
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async reset() {
|
|
315
|
+
if (this.activeLeaseCount > 0) throw new Error("Cannot reset Tango runtime while transaction leases are still active.");
|
|
316
|
+
await this.autocommitClient.close();
|
|
317
|
+
}
|
|
318
|
+
openClient(filename) {
|
|
319
|
+
const db = new this.Database(filename);
|
|
320
|
+
db.pragma("journal_mode = WAL");
|
|
321
|
+
db.pragma("foreign_keys = ON");
|
|
322
|
+
db.pragma("busy_timeout = 5000");
|
|
323
|
+
return new SqliteClient(db);
|
|
324
|
+
}
|
|
325
|
+
getDatabaseCtor() {
|
|
326
|
+
const require = createRequire(import.meta.url);
|
|
327
|
+
const moduleValue = require("better-sqlite3");
|
|
328
|
+
if (typeof moduleValue === "function") return moduleValue;
|
|
329
|
+
const defaultExport = moduleValue.default;
|
|
330
|
+
if (typeof defaultExport === "function") return defaultExport;
|
|
331
|
+
throw new TypeError("Failed to load better-sqlite3 constructor.");
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
//#endregion
|
|
336
|
+
//#region src/runtime/internal/createDBClientProvider.ts
|
|
337
|
+
function createDBClientProvider(config) {
|
|
338
|
+
switch (config.adapter) {
|
|
339
|
+
case "postgres": return new PostgresDBClientProvider(config);
|
|
340
|
+
case "sqlite": return new SqliteDBClientProvider(config);
|
|
341
|
+
default: throw new Error(`Unsupported adapter for Tango runtime provider: ${config.adapter}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
//#endregion
|
|
346
|
+
//#region src/runtime/TangoRuntime.ts
|
|
347
|
+
var TangoRuntime = class TangoRuntime {
|
|
348
|
+
static BRAND = "tango.orm.runtime";
|
|
349
|
+
__tangoBrand = TangoRuntime.BRAND;
|
|
350
|
+
loadedConfig;
|
|
351
|
+
providerPromise = null;
|
|
352
|
+
runtimeClientPromise = null;
|
|
353
|
+
constructor(loadLoadedConfig) {
|
|
354
|
+
this.loadedConfig = loadLoadedConfig();
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Narrow an unknown value to `TangoRuntime`.
|
|
358
|
+
*/
|
|
359
|
+
static isTangoRuntime(value) {
|
|
360
|
+
return typeof value === "object" && value !== null && value.__tangoBrand === TangoRuntime.BRAND;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Return the loaded Tango config snapshot for the active environment.
|
|
364
|
+
*/
|
|
365
|
+
getConfig() {
|
|
366
|
+
return this.loadedConfig;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Return the configured SQL dialect for the current runtime.
|
|
370
|
+
*/
|
|
371
|
+
getDialect() {
|
|
372
|
+
return this.loadedConfig.current.db.adapter;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Return the runtime-bound DB client facade used by manager-backed code.
|
|
376
|
+
*/
|
|
377
|
+
async getClient() {
|
|
378
|
+
if (!this.runtimeClientPromise) this.runtimeClientPromise = Promise.resolve(new RuntimeBoundClient(this));
|
|
379
|
+
return this.runtimeClientPromise;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Execute SQL through the autocommit path owned by this runtime.
|
|
383
|
+
*/
|
|
384
|
+
async query(sql, params) {
|
|
385
|
+
const provider = await this.getProvider();
|
|
386
|
+
return provider.query(sql, params);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Lease a transaction-scoped client for `transaction.atomic(...)`.
|
|
390
|
+
*/
|
|
391
|
+
async leaseTransactionClient() {
|
|
392
|
+
const provider = await this.getProvider();
|
|
393
|
+
return provider.leaseTransactionClient();
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Close and clear the cached runtime resources so tests can start fresh.
|
|
397
|
+
*/
|
|
398
|
+
async reset() {
|
|
399
|
+
if (!this.providerPromise) {
|
|
400
|
+
this.runtimeClientPromise = null;
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const provider = await this.providerPromise;
|
|
404
|
+
this.providerPromise = null;
|
|
405
|
+
this.runtimeClientPromise = null;
|
|
406
|
+
await provider.reset();
|
|
407
|
+
}
|
|
408
|
+
async getProvider() {
|
|
409
|
+
if (!this.providerPromise) {
|
|
410
|
+
const db = this.loadedConfig.current.db;
|
|
411
|
+
this.providerPromise = Promise.resolve(createDBClientProvider({
|
|
412
|
+
adapter: db.adapter,
|
|
413
|
+
url: db.url,
|
|
414
|
+
host: db.host,
|
|
415
|
+
port: db.port,
|
|
416
|
+
database: db.database,
|
|
417
|
+
user: db.user,
|
|
418
|
+
password: db.password,
|
|
419
|
+
filename: db.filename,
|
|
420
|
+
maxConnections: db.maxConnections
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
return this.providerPromise;
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
//#endregion
|
|
428
|
+
//#region src/runtime/defaultRuntime.ts
|
|
429
|
+
let defaultRuntime = null;
|
|
430
|
+
function initializeTangoRuntime(fromFile) {
|
|
431
|
+
defaultRuntime = new TangoRuntime(() => loadConfig(fromFile));
|
|
432
|
+
return defaultRuntime;
|
|
433
|
+
}
|
|
434
|
+
function getTangoRuntime() {
|
|
435
|
+
if (!defaultRuntime) defaultRuntime = new TangoRuntime(() => loadConfigFromProjectRoot());
|
|
436
|
+
return defaultRuntime;
|
|
437
|
+
}
|
|
438
|
+
async function resetTangoRuntime() {
|
|
439
|
+
if (!defaultRuntime) return;
|
|
440
|
+
const runtime = defaultRuntime;
|
|
441
|
+
defaultRuntime = null;
|
|
442
|
+
await runtime.reset();
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
//#endregion
|
|
446
|
+
export { RuntimeBoundClient, TangoRuntime, TransactionEngine, getTangoRuntime, initializeTangoRuntime, resetTangoRuntime };
|
|
447
|
+
//# sourceMappingURL=defaultRuntime-BPK9kWEW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultRuntime-BPK9kWEW.js","names":["engine: AsyncLocalTransactionEngine","state: TransactionState","frame: TransactionFrame","callback: () => void","options: OnCommitOptions","work: (tx: AtomicTransaction) => Promise<T> | T","options: SavepointOptions","runtime: TangoRuntime","work: (tx: AtomicTransaction) => Promise<T> | T","state: TransactionState","options: SavepointOptions","savepointName?: string","error: unknown","callbacks: readonly CallbackRecord[]","cause: unknown","value: unknown","runtime: TangoRuntime","work: (tx: AtomicTransaction) => Promise<T> | T","runtime: TangoRuntime","sql: string","params?: readonly unknown[]","_name: string","config: AdapterConfig","sql: string","params?: readonly unknown[]","config: AdapterConfig","sql: string","params?: readonly unknown[]","filename: string","config: AdapterConfig & { adapter: string }","loadLoadedConfig: () => LoadedConfig","value: unknown","sql: string","params?: readonly unknown[]","defaultRuntime: TangoRuntime | null","fromFile: () => unknown"],"sources":["../src/transaction/internal/context/FrameBoundTransaction.ts","../src/transaction/internal/context/AsyncLocalTransactionEngine.ts","../src/transaction/internal/context/TransactionEngine.ts","../src/manager/internal/RuntimeBoundClient.ts","../src/runtime/internal/PostgresDBClientProvider.ts","../src/runtime/internal/SqliteDBClientProvider.ts","../src/runtime/internal/createDBClientProvider.ts","../src/runtime/TangoRuntime.ts","../src/runtime/defaultRuntime.ts"],"sourcesContent":["import type { AtomicTransaction, OnCommitOptions, SavepointOptions, SavepointResult } from '../../AtomicTransaction';\nimport type { AsyncLocalTransactionEngine } from './AsyncLocalTransactionEngine';\nimport type { TransactionFrame } from './TransactionFrame';\nimport type { TransactionState } from './TransactionState';\n\nexport class FrameBoundTransaction implements AtomicTransaction {\n private active = true;\n\n constructor(\n private readonly engine: AsyncLocalTransactionEngine,\n private readonly state: TransactionState,\n private readonly frame: TransactionFrame\n ) {}\n\n onCommit(callback: () => void, options: OnCommitOptions = {}): void {\n if (!this.active) {\n throw new Error('Cannot register an on-commit callback on an inactive transaction frame.');\n }\n\n this.frame.callbacks.push({\n order: this.state.nextCallbackOrder++,\n callback,\n robust: options.robust ?? false,\n });\n }\n\n savepoint<T>(work: (tx: AtomicTransaction) => Promise<T> | T): Promise<SavepointResult<T>>;\n savepoint<T>(\n work: (tx: AtomicTransaction) => Promise<T> | T,\n options: { throwOnError: false }\n ): Promise<SavepointResult<T>>;\n savepoint<T>(work: (tx: AtomicTransaction) => Promise<T> | T, options: { throwOnError: true }): Promise<T>;\n async savepoint<T>(\n work: (tx: AtomicTransaction) => Promise<T> | T,\n options: SavepointOptions = {}\n ): Promise<T | SavepointResult<T>> {\n if (!this.active) {\n throw new Error('Cannot open a savepoint from an inactive transaction frame.');\n }\n\n return this.engine.runSavepoint(this.state, work, options);\n }\n\n deactivate(): void {\n this.active = false;\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { getLogger } from '@danceroutine/tango-core';\nimport type { TangoRuntime } from '../../../runtime/TangoRuntime';\nimport type { TransactionClientLease } from '../../../runtime/internal/DBClientProvider';\nimport type { AtomicTransaction, SavepointOptions, SavepointResult } from '../../AtomicTransaction';\nimport type { CallbackRecord } from './CallbackRecord';\nimport { FrameBoundTransaction } from './FrameBoundTransaction';\nimport type { TransactionFrame } from './TransactionFrame';\nimport type { TransactionState } from './TransactionState';\n\nexport class AsyncLocalTransactionEngine {\n private readonly logger = getLogger('tango.orm.transaction');\n private readonly storage = new AsyncLocalStorage<TransactionState>();\n\n assertNoActiveAtomicTransaction(): void {\n if (this.storage.getStore()) {\n throw new Error('UnitOfWork is unsupported inside transaction.atomic(...).');\n }\n }\n\n getActiveTransaction(runtime: TangoRuntime): AtomicTransaction | undefined {\n const state = this.storage.getStore();\n if (!state || state.runtime !== runtime) {\n return undefined;\n }\n\n return state.frames.at(-1)?.facade;\n }\n\n getActiveLease(runtime: TangoRuntime): TransactionClientLease | undefined {\n const state = this.storage.getStore();\n if (!state || state.runtime !== runtime) {\n return undefined;\n }\n\n return state.lease;\n }\n\n async atomic<T>(runtime: TangoRuntime, work: (tx: AtomicTransaction) => Promise<T> | T): Promise<T> {\n const existing = this.storage.getStore();\n if (existing) {\n if (existing.runtime !== runtime) {\n throw new Error(\n 'Cannot open a transaction for one Tango runtime while another runtime transaction is active.'\n );\n }\n\n return this.runNested(existing, work);\n }\n\n const lease = await runtime.leaseTransactionClient();\n const state: TransactionState = {\n runtime,\n lease,\n frames: [],\n nextCallbackOrder: 0,\n nextSavepointId: 0,\n };\n\n try {\n return await this.storage.run(state, async () => {\n await lease.client.begin();\n const frame = this.pushFrame(state);\n\n try {\n const result = await work(frame.facade);\n await lease.client.commit();\n const root = this.popFrame(state);\n root.facade.deactivate();\n await this.runCommittedCallbacks(root.callbacks);\n return result;\n } catch (error) {\n await this.rollbackOuter(state, error);\n throw error;\n }\n });\n } finally {\n this.deactivateAllFrames(state);\n await lease.release();\n }\n }\n\n async runSavepoint<T>(\n state: TransactionState,\n work: (tx: AtomicTransaction) => Promise<T> | T,\n options: SavepointOptions\n ): Promise<T | SavepointResult<T>> {\n try {\n const value = await this.runNested(state, work);\n if (options.throwOnError) {\n return value;\n }\n\n return {\n ok: true,\n value,\n };\n } catch (error) {\n if (options.throwOnError) {\n throw error;\n }\n\n return {\n ok: false,\n error,\n };\n }\n }\n\n private async runNested<T>(state: TransactionState, work: (tx: AtomicTransaction) => Promise<T> | T): Promise<T> {\n const savepointName = `tango_sp_${state.nextSavepointId++}`;\n await state.lease.client.createSavepoint(savepointName);\n const frame = this.pushFrame(state, savepointName);\n\n try {\n const result = await work(frame.facade);\n await state.lease.client.releaseSavepoint(savepointName);\n const completed = this.popFrame(state);\n completed.facade.deactivate();\n const parent = state.frames.at(-1);\n if (!parent) {\n throw new Error('Nested transaction frame completed without a parent frame.');\n }\n\n parent.callbacks.push(...completed.callbacks);\n parent.callbacks.sort((left, right) => left.order - right.order);\n return result;\n } catch (error) {\n try {\n await state.lease.client.rollbackToSavepoint(savepointName);\n } catch (rollbackError) {\n throw this.attachCause(rollbackError, error);\n } finally {\n const discarded = this.popFrame(state);\n discarded.facade.deactivate();\n }\n\n throw error;\n }\n }\n\n private pushFrame(state: TransactionState, savepointName?: string): TransactionFrame {\n const frame = {} as TransactionFrame;\n const facade = new FrameBoundTransaction(this, state, frame);\n frame.callbacks = [];\n frame.facade = facade;\n frame.savepointName = savepointName;\n state.frames.push(frame);\n return frame;\n }\n\n private popFrame(state: TransactionState): TransactionFrame {\n const frame = state.frames.pop();\n if (!frame) {\n throw new Error('Transaction frame stack underflow.');\n }\n\n return frame;\n }\n\n private async rollbackOuter(state: TransactionState, error: unknown): Promise<void> {\n try {\n await state.lease.client.rollback();\n } catch (rollbackError) {\n throw this.attachCause(rollbackError, error);\n } finally {\n while (state.frames.length > 0) {\n const frame = this.popFrame(state);\n frame.facade.deactivate();\n }\n }\n }\n\n private async runCommittedCallbacks(callbacks: readonly CallbackRecord[]): Promise<void> {\n for (const record of callbacks) {\n try {\n await record.callback();\n } catch (error) {\n if (!record.robust) {\n throw error;\n }\n\n try {\n this.logger.error('Post-commit callback failed.', error);\n } catch {\n // A logging backend failure cannot change the already-committed outcome.\n }\n }\n }\n }\n\n private deactivateAllFrames(state: TransactionState): void {\n state.frames.length = 0;\n }\n\n private attachCause(error: unknown, cause: unknown): unknown {\n if (!this.isErrorValue(error)) {\n return error;\n }\n\n if ('cause' in error && error.cause !== undefined) {\n return error;\n }\n\n try {\n return new Error(error.message, { cause });\n } catch {\n return error;\n }\n }\n\n private isErrorValue(value: unknown): value is Error {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { message?: unknown }).message === 'string' &&\n typeof (value as { name?: unknown }).name === 'string'\n );\n }\n}\n","import type { TangoRuntime } from '../../../runtime/TangoRuntime';\nimport type { TransactionClientLease } from '../../../runtime/internal/DBClientProvider';\nimport type { AtomicTransaction } from '../../AtomicTransaction';\nimport { AsyncLocalTransactionEngine } from './AsyncLocalTransactionEngine';\n\n/**\n * Runtime-bound transaction facade used by internal ORM/runtime components.\n */\nexport class TransactionEngine {\n private static readonly engine = new AsyncLocalTransactionEngine();\n\n private constructor(private readonly runtime: TangoRuntime) {}\n\n static forRuntime(runtime: TangoRuntime): TransactionEngine {\n return new TransactionEngine(runtime);\n }\n\n static assertNoActiveAtomicTransaction(): void {\n this.engine.assertNoActiveAtomicTransaction();\n }\n\n getActiveTransaction(): AtomicTransaction | undefined {\n return TransactionEngine.engine.getActiveTransaction(this.runtime);\n }\n\n getActiveLease(): TransactionClientLease | undefined {\n return TransactionEngine.engine.getActiveLease(this.runtime);\n }\n\n async atomic<T>(work: (tx: AtomicTransaction) => Promise<T> | T): Promise<T> {\n return TransactionEngine.engine.atomic(this.runtime, work);\n }\n}\n","import type { DBClient } from '../../connection/index';\nimport type { TangoRuntime } from '../../runtime/index';\nimport { TransactionEngine } from '../../transaction/internal/context';\n\n/**\n * DB client proxy that resolves either the active transaction lease or the\n * runtime autocommit path lazily.\n */\nexport class RuntimeBoundClient implements DBClient {\n constructor(private readonly runtime: TangoRuntime) {}\n\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n const lease = TransactionEngine.forRuntime(this.runtime).getActiveLease();\n if (lease) {\n return lease.client.query<T>(sql, params);\n }\n\n const runtimeWithQuery = this.runtime as TangoRuntime & {\n query?: <TResult = unknown>(sql: string, params?: readonly unknown[]) => Promise<{ rows: TResult[] }>;\n };\n if (typeof runtimeWithQuery.query === 'function') {\n return runtimeWithQuery.query<T>(sql, params);\n }\n\n const client = await this.runtime.getClient();\n return client.query<T>(sql, params);\n }\n\n async begin(): Promise<void> {\n throw new Error('Runtime-bound clients do not support manual begin(). Use transaction.atomic(...) instead.');\n }\n\n async commit(): Promise<void> {\n throw new Error('Runtime-bound clients do not support manual commit(). Use transaction.atomic(...) instead.');\n }\n\n async rollback(): Promise<void> {\n throw new Error('Runtime-bound clients do not support manual rollback(). Use transaction.atomic(...) instead.');\n }\n\n async createSavepoint(_name: string): Promise<void> {\n throw new Error(\n 'Runtime-bound clients do not support manual savepoints. Use transaction.atomic(...) or tx.savepoint(...) instead.'\n );\n }\n\n async releaseSavepoint(_name: string): Promise<void> {\n throw new Error(\n 'Runtime-bound clients do not support manual savepoint release. Use transaction.atomic(...) or tx.savepoint(...) instead.'\n );\n }\n\n async rollbackToSavepoint(_name: string): Promise<void> {\n throw new Error(\n 'Runtime-bound clients do not support manual savepoint rollback. Use transaction.atomic(...) or tx.savepoint(...) instead.'\n );\n }\n\n async close(): Promise<void> {\n throw new Error('Runtime-bound clients do not support manual close(). Use TangoRuntime.reset() instead.');\n }\n}\n","import pg from 'pg';\nimport type { AdapterConfig } from '../../connection/adapters/Adapter';\nimport { PostgresClient } from '../../connection/clients/dialects/PostgresClient';\nimport type { DBClientProvider, TransactionClientLease } from './DBClientProvider';\n\nconst { Pool } = pg;\n\nexport class PostgresDBClientProvider implements DBClientProvider {\n private readonly pool: pg.Pool;\n private activeLeaseCount = 0;\n\n constructor(config: AdapterConfig) {\n this.pool = new Pool({\n connectionString: config.url,\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n max: config.maxConnections || 10,\n });\n }\n\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n const result = await this.pool.query(sql, params as unknown[]);\n return { rows: result.rows as T[] };\n }\n\n async leaseTransactionClient(): Promise<TransactionClientLease> {\n const client = await this.pool.connect();\n this.activeLeaseCount += 1;\n let released = false;\n\n return {\n client: new PostgresClient(client),\n release: async () => {\n if (released) {\n return;\n }\n\n released = true;\n this.activeLeaseCount -= 1;\n client.release();\n },\n };\n }\n\n async reset(): Promise<void> {\n if (this.activeLeaseCount > 0) {\n throw new Error('Cannot reset Tango runtime while transaction leases are still active.');\n }\n\n await this.pool.end();\n }\n}\n","import { createRequire } from 'node:module';\nimport type { Database as BetterSqliteDatabase } from 'better-sqlite3';\nimport type { AdapterConfig } from '../../connection/adapters/Adapter';\nimport { SqliteClient } from '../../connection/clients/dialects/SqliteClient';\nimport type { DBClientProvider, TransactionClientLease } from './DBClientProvider';\n\ntype BetterSqliteCtor = new (filename: string, options?: unknown) => BetterSqliteDatabase;\n\nexport class SqliteDBClientProvider implements DBClientProvider {\n private readonly filename: string;\n private readonly Database: BetterSqliteCtor;\n private readonly autocommitClient: SqliteClient;\n private activeLeaseCount = 0;\n\n constructor(config: AdapterConfig = {}) {\n this.Database = this.getDatabaseCtor();\n this.filename =\n typeof config.filename === 'string' && config.filename.length > 0 ? config.filename : ':memory:';\n this.autocommitClient = this.openClient(this.filename);\n }\n\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n return this.autocommitClient.query<T>(sql, params);\n }\n\n async leaseTransactionClient(): Promise<TransactionClientLease> {\n if (this.filename === ':memory:') {\n throw new Error('transaction.atomic(...) requires a file-backed SQLite database. :memory: is unsupported.');\n }\n\n const client = this.openClient(this.filename);\n this.activeLeaseCount += 1;\n let released = false;\n\n return {\n client,\n release: async () => {\n if (released) {\n return;\n }\n\n released = true;\n this.activeLeaseCount -= 1;\n await client.close();\n },\n };\n }\n\n async reset(): Promise<void> {\n if (this.activeLeaseCount > 0) {\n throw new Error('Cannot reset Tango runtime while transaction leases are still active.');\n }\n\n await this.autocommitClient.close();\n }\n\n private openClient(filename: string): SqliteClient {\n const db = new this.Database(filename);\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n db.pragma('busy_timeout = 5000');\n return new SqliteClient(db);\n }\n\n private getDatabaseCtor(): BetterSqliteCtor {\n const require = createRequire(import.meta.url);\n const moduleValue = require('better-sqlite3') as unknown;\n if (typeof moduleValue === 'function') {\n return moduleValue as BetterSqliteCtor;\n }\n\n const defaultExport = (moduleValue as { default?: unknown }).default;\n if (typeof defaultExport === 'function') {\n return defaultExport as BetterSqliteCtor;\n }\n\n throw new TypeError('Failed to load better-sqlite3 constructor.');\n }\n}\n","import type { AdapterConfig } from '../../connection/adapters/Adapter';\nimport type { DBClientProvider } from './DBClientProvider';\nimport { PostgresDBClientProvider } from './PostgresDBClientProvider';\nimport { SqliteDBClientProvider } from './SqliteDBClientProvider';\n\nexport function createDBClientProvider(config: AdapterConfig & { adapter: string }): DBClientProvider {\n switch (config.adapter) {\n case 'postgres':\n return new PostgresDBClientProvider(config);\n case 'sqlite':\n return new SqliteDBClientProvider(config);\n default:\n throw new Error(`Unsupported adapter for Tango runtime provider: ${config.adapter}`);\n }\n}\n","import type { LoadedConfig } from '@danceroutine/tango-config';\nimport type { DBClient } from '../connection/index';\nimport type { Dialect } from '../query/domain/index';\nimport { RuntimeBoundClient } from '../manager/internal/RuntimeBoundClient';\nimport type { DBClientProvider, TransactionClientLease } from './internal/DBClientProvider';\nimport { createDBClientProvider } from './internal/createDBClientProvider';\n\n/**\n * Framework-owned database runtime that resolves Tango config and lazily\n * creates the shared connection provider used by manager-backed models.\n */\nexport class TangoRuntime {\n static readonly BRAND = 'tango.orm.runtime' as const;\n readonly __tangoBrand: typeof TangoRuntime.BRAND = TangoRuntime.BRAND;\n private readonly loadedConfig: LoadedConfig;\n private providerPromise: Promise<DBClientProvider> | null = null;\n private runtimeClientPromise: Promise<DBClient> | null = null;\n\n constructor(loadLoadedConfig: () => LoadedConfig) {\n this.loadedConfig = loadLoadedConfig();\n }\n\n /**\n * Narrow an unknown value to `TangoRuntime`.\n */\n static isTangoRuntime(value: unknown): value is TangoRuntime {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === TangoRuntime.BRAND\n );\n }\n\n /**\n * Return the loaded Tango config snapshot for the active environment.\n */\n getConfig(): LoadedConfig {\n return this.loadedConfig;\n }\n\n /**\n * Return the configured SQL dialect for the current runtime.\n */\n getDialect(): Dialect {\n return this.loadedConfig.current.db.adapter;\n }\n\n /**\n * Return the runtime-bound DB client facade used by manager-backed code.\n */\n async getClient(): Promise<DBClient> {\n if (!this.runtimeClientPromise) {\n this.runtimeClientPromise = Promise.resolve(new RuntimeBoundClient(this));\n }\n\n return this.runtimeClientPromise;\n }\n\n /**\n * Execute SQL through the autocommit path owned by this runtime.\n */\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n const provider = await this.getProvider();\n return provider.query<T>(sql, params);\n }\n\n /**\n * Lease a transaction-scoped client for `transaction.atomic(...)`.\n */\n async leaseTransactionClient(): Promise<TransactionClientLease> {\n const provider = await this.getProvider();\n return provider.leaseTransactionClient();\n }\n\n /**\n * Close and clear the cached runtime resources so tests can start fresh.\n */\n async reset(): Promise<void> {\n if (!this.providerPromise) {\n this.runtimeClientPromise = null;\n return;\n }\n\n const provider = await this.providerPromise;\n this.providerPromise = null;\n this.runtimeClientPromise = null;\n await provider.reset();\n }\n\n private async getProvider(): Promise<DBClientProvider> {\n if (!this.providerPromise) {\n const db = this.loadedConfig.current.db;\n this.providerPromise = Promise.resolve(\n createDBClientProvider({\n adapter: db.adapter,\n url: db.url,\n host: db.host,\n port: db.port,\n database: db.database,\n user: db.user,\n password: db.password,\n filename: db.filename,\n maxConnections: db.maxConnections,\n })\n );\n }\n\n return this.providerPromise;\n }\n}\n","import { loadConfig, loadConfigFromProjectRoot } from '@danceroutine/tango-config';\nimport { TangoRuntime } from './TangoRuntime';\n\nlet defaultRuntime: TangoRuntime | null = null;\n\n/**\n * Initialize the process-default Tango runtime from a Tango config loader.\n */\nexport function initializeTangoRuntime(fromFile: () => unknown): TangoRuntime {\n defaultRuntime = new TangoRuntime(() => loadConfig(fromFile));\n return defaultRuntime;\n}\n\n/**\n * Return the process-default Tango runtime, lazily loading Tango config on first access.\n */\nexport function getTangoRuntime(): TangoRuntime {\n if (!defaultRuntime) {\n defaultRuntime = new TangoRuntime(() => loadConfigFromProjectRoot());\n }\n\n return defaultRuntime;\n}\n\n/**\n * Reset the process-default Tango runtime and release any cached client.\n */\nexport async function resetTangoRuntime(): Promise<void> {\n if (!defaultRuntime) {\n return;\n }\n\n const runtime = defaultRuntime;\n defaultRuntime = null;\n await runtime.reset();\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,4 +18,5 @@ export { Q, QBuilder, QueryCompiler, QuerySet } from './query/index';
|
|
|
18
18
|
export type { QueryExecutor } from './query/index';
|
|
19
19
|
export type { CompiledQuery, Dialect, Direction, FilterInput, FilterKey, FilterValue, LookupType, OrderSpec, OrderToken, QNode, QueryResult, QuerySetState, RelationMeta, TableMeta, WhereClause, } from './query/domain/index';
|
|
20
20
|
export { getTangoRuntime, initializeTangoRuntime, resetTangoRuntime, TangoRuntime } from './runtime/index';
|
|
21
|
-
export { UnitOfWork } from './transaction/index';
|
|
21
|
+
export { atomic, UnitOfWork } from './transaction/index';
|
|
22
|
+
export type { AtomicTransaction, OnCommitOptions, SavepointOptions, SavepointResult } from './transaction/index';
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import "./PostgresClient-BQJZfEOT.js";
|
|
2
|
+
import { PostgresAdapter } from "./PostgresAdapter-CMiEpHya.js";
|
|
3
|
+
import "./SqliteClient-CjOK9-ki.js";
|
|
4
|
+
import { SqliteAdapter } from "./SqliteAdapter-CeqhyrPC.js";
|
|
5
|
+
import { AdapterRegistry, connectDB, connection_exports, getDefaultAdapterRegistry } from "./connection-B_K2ZAf7.js";
|
|
6
|
+
import { QBuilder, QueryCompiler, QuerySet, query_exports } from "./query-CWZ1cfjo.js";
|
|
7
|
+
import { TangoRuntime, getTangoRuntime, initializeTangoRuntime, resetTangoRuntime } from "./defaultRuntime-BPK9kWEW.js";
|
|
8
|
+
import { ModelManager } from "./registerModelObjects-Bva_f-Qh.js";
|
|
9
|
+
import { manager_exports } from "./manager-C6oJ2tAF.js";
|
|
10
|
+
import { runtime_exports } from "./runtime-ByXbpVBS.js";
|
|
11
|
+
import { UnitOfWork, atomic, transaction_exports } from "./transaction-Cs0Z9tbW.js";
|
|
9
12
|
|
|
10
|
-
export { AdapterRegistry, ModelManager, PostgresAdapter, QBuilder as Q, QBuilder, QueryCompiler, QuerySet, SqliteAdapter, TangoRuntime, UnitOfWork, connectDB, connection_exports as connection, getDefaultAdapterRegistry, getTangoRuntime, initializeTangoRuntime, manager_exports as manager, query_exports as query, resetTangoRuntime, runtime_exports as runtime, transaction_exports as transaction };
|
|
13
|
+
export { AdapterRegistry, ModelManager, PostgresAdapter, QBuilder as Q, QBuilder, QueryCompiler, QuerySet, SqliteAdapter, TangoRuntime, UnitOfWork, atomic, connectDB, connection_exports as connection, getDefaultAdapterRegistry, getTangoRuntime, initializeTangoRuntime, manager_exports as manager, query_exports as query, resetTangoRuntime, runtime_exports as runtime, transaction_exports as transaction };
|
|
@@ -3,13 +3,13 @@ import type { TableMeta } from '../query/domain/index';
|
|
|
3
3
|
/**
|
|
4
4
|
* Public manager contract consumed by Tango resources and applications.
|
|
5
5
|
*/
|
|
6
|
-
export interface ManagerLike<
|
|
6
|
+
export interface ManagerLike<TModelRow extends Record<string, unknown>, TSourceModel = unknown> {
|
|
7
7
|
readonly meta: TableMeta;
|
|
8
|
-
query(): QuerySet<
|
|
9
|
-
findById(id:
|
|
10
|
-
getOrThrow(id:
|
|
11
|
-
create(input: Partial<
|
|
12
|
-
update(id:
|
|
13
|
-
delete(id:
|
|
14
|
-
bulkCreate(inputs: Partial<
|
|
8
|
+
query(): QuerySet<TModelRow, TModelRow, TSourceModel>;
|
|
9
|
+
findById(id: TModelRow[keyof TModelRow]): Promise<TModelRow | null>;
|
|
10
|
+
getOrThrow(id: TModelRow[keyof TModelRow]): Promise<TModelRow>;
|
|
11
|
+
create(input: Partial<TModelRow>): Promise<TModelRow>;
|
|
12
|
+
update(id: TModelRow[keyof TModelRow], patch: Partial<TModelRow>): Promise<TModelRow>;
|
|
13
|
+
delete(id: TModelRow[keyof TModelRow]): Promise<void>;
|
|
14
|
+
bulkCreate(inputs: Partial<TModelRow>[]): Promise<TModelRow[]>;
|
|
15
15
|
}
|
|
@@ -8,7 +8,7 @@ type FieldLike = {
|
|
|
8
8
|
type: string;
|
|
9
9
|
primaryKey?: boolean;
|
|
10
10
|
};
|
|
11
|
-
type ModelLike<
|
|
11
|
+
type ModelLike<TModelRow extends Record<string, unknown>> = {
|
|
12
12
|
metadata: {
|
|
13
13
|
key?: string;
|
|
14
14
|
name: string;
|
|
@@ -16,14 +16,14 @@ type ModelLike<T extends Record<string, unknown>> = {
|
|
|
16
16
|
fields: FieldLike[];
|
|
17
17
|
};
|
|
18
18
|
schema: {
|
|
19
|
-
parse(input: unknown):
|
|
19
|
+
parse(input: unknown): TModelRow;
|
|
20
20
|
};
|
|
21
|
-
hooks?: ModelWriteHooks<
|
|
21
|
+
hooks?: ModelWriteHooks<TModelRow>;
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* Model-backed data access API exposed as `Model.objects`.
|
|
25
25
|
*/
|
|
26
|
-
export declare class ModelManager<
|
|
26
|
+
export declare class ModelManager<TModelRow extends Record<string, unknown>, TSourceModel = unknown> implements ManagerLike<TModelRow, TSourceModel> {
|
|
27
27
|
static readonly BRAND: "tango.orm.model_manager";
|
|
28
28
|
readonly __tangoBrand: typeof ModelManager.BRAND;
|
|
29
29
|
private readonly queryExecutor;
|
|
@@ -31,21 +31,23 @@ export declare class ModelManager<T extends Record<string, unknown>> implements
|
|
|
31
31
|
private readonly model;
|
|
32
32
|
private readonly client;
|
|
33
33
|
private readonly dialect;
|
|
34
|
-
|
|
34
|
+
private readonly runtime;
|
|
35
|
+
constructor(model: ModelLike<TModelRow>, runtime: TangoRuntime);
|
|
35
36
|
get meta(): TableMeta;
|
|
36
37
|
/**
|
|
37
38
|
* Narrow an unknown value to `ModelManager`.
|
|
38
39
|
*/
|
|
39
|
-
static isModelManager<
|
|
40
|
+
static isModelManager<TModelRow extends Record<string, unknown>>(value: unknown): value is ModelManager<TModelRow>;
|
|
40
41
|
private static createTableMeta;
|
|
41
|
-
query(): QuerySet<
|
|
42
|
-
findById(id:
|
|
43
|
-
getOrThrow(id:
|
|
44
|
-
create(input: Partial<
|
|
45
|
-
update(id:
|
|
46
|
-
delete(id:
|
|
47
|
-
bulkCreate(inputs: Partial<
|
|
42
|
+
query(): QuerySet<TModelRow, TModelRow, TSourceModel>;
|
|
43
|
+
findById(id: TModelRow[keyof TModelRow]): Promise<TModelRow | null>;
|
|
44
|
+
getOrThrow(id: TModelRow[keyof TModelRow]): Promise<TModelRow>;
|
|
45
|
+
create(input: Partial<TModelRow>): Promise<TModelRow>;
|
|
46
|
+
update(id: TModelRow[keyof TModelRow], patch: Partial<TModelRow>): Promise<TModelRow>;
|
|
47
|
+
delete(id: TModelRow[keyof TModelRow]): Promise<void>;
|
|
48
|
+
bulkCreate(inputs: Partial<TModelRow>[]): Promise<TModelRow[]>;
|
|
48
49
|
private runBeforeCreate;
|
|
49
50
|
private runBeforeUpdate;
|
|
51
|
+
private getHookTransaction;
|
|
50
52
|
}
|
|
51
53
|
export {};
|
package/dist/manager/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "../
|
|
3
|
-
import "../
|
|
4
|
-
import
|
|
5
|
-
import "../
|
|
6
|
-
import "../manager-
|
|
1
|
+
import "../PostgresClient-BQJZfEOT.js";
|
|
2
|
+
import "../SqliteClient-CjOK9-ki.js";
|
|
3
|
+
import "../query-CWZ1cfjo.js";
|
|
4
|
+
import "../defaultRuntime-BPK9kWEW.js";
|
|
5
|
+
import { ModelManager, registerModelObjects } from "../registerModelObjects-Bva_f-Qh.js";
|
|
6
|
+
import "../manager-C6oJ2tAF.js";
|
|
7
7
|
|
|
8
8
|
export { ModelManager, registerModelObjects };
|