@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,68 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/connection/clients/dialects/PostgresClient.ts
|
|
3
|
-
var PostgresClient = class PostgresClient {
|
|
4
|
-
static BRAND = "tango.orm.postgres_client";
|
|
5
|
-
__tangoBrand = PostgresClient.BRAND;
|
|
6
|
-
constructor(client) {
|
|
7
|
-
this.client = client;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Narrow an unknown value to `PostgresClient`.
|
|
11
|
-
*/
|
|
12
|
-
static isPostgresClient(value) {
|
|
13
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === PostgresClient.BRAND;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Execute a SQL statement with optional bound parameters.
|
|
17
|
-
*/
|
|
18
|
-
async query(sql, params) {
|
|
19
|
-
const result = await this.client.query(sql, params);
|
|
20
|
-
return { rows: result.rows };
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Begin a database transaction.
|
|
24
|
-
*/
|
|
25
|
-
async begin() {
|
|
26
|
-
await this.client.query("BEGIN");
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Commit the active transaction.
|
|
30
|
-
*/
|
|
31
|
-
async commit() {
|
|
32
|
-
await this.client.query("COMMIT");
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Roll back the active transaction.
|
|
36
|
-
*/
|
|
37
|
-
async rollback() {
|
|
38
|
-
await this.client.query("ROLLBACK");
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Create a savepoint inside the active transaction.
|
|
42
|
-
*/
|
|
43
|
-
async createSavepoint(name) {
|
|
44
|
-
await this.client.query(`SAVEPOINT ${name}`);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Release a previously-created savepoint.
|
|
48
|
-
*/
|
|
49
|
-
async releaseSavepoint(name) {
|
|
50
|
-
await this.client.query(`RELEASE SAVEPOINT ${name}`);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Roll back the active transaction to a savepoint.
|
|
54
|
-
*/
|
|
55
|
-
async rollbackToSavepoint(name) {
|
|
56
|
-
await this.client.query(`ROLLBACK TO SAVEPOINT ${name}`);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Release the leased PostgreSQL client back to its owning pool.
|
|
60
|
-
*/
|
|
61
|
-
async close() {
|
|
62
|
-
this.client.release();
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
//#endregion
|
|
67
|
-
export { PostgresClient };
|
|
68
|
-
//# sourceMappingURL=PostgresClient-BQJZfEOT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresClient-BQJZfEOT.js","names":["client: PostgresPoolClientLike","value: unknown","sql: string","params?: readonly unknown[]","name: string"],"sources":["../src/connection/clients/dialects/PostgresClient.ts"],"sourcesContent":["import type { DBClient } from '../DBClient';\n\nexport interface PostgresPoolClientLike {\n query(sql: string, params?: readonly unknown[]): Promise<{ rows: unknown[] }>;\n release(): void;\n}\n\n/**\n * Transaction-capable client backed by a PostgreSQL pool client.\n */\nexport class PostgresClient implements DBClient {\n static readonly BRAND = 'tango.orm.postgres_client' as const;\n readonly __tangoBrand: typeof PostgresClient.BRAND = PostgresClient.BRAND;\n\n constructor(private client: PostgresPoolClientLike) {}\n\n /**\n * Narrow an unknown value to `PostgresClient`.\n */\n static isPostgresClient(value: unknown): value is PostgresClient {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === PostgresClient.BRAND\n );\n }\n\n /**\n * Execute a SQL statement with optional bound parameters.\n */\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n const result = await this.client.query(sql, params as unknown[]);\n return { rows: result.rows as T[] };\n }\n\n /**\n * Begin a database transaction.\n */\n async begin(): Promise<void> {\n await this.client.query('BEGIN');\n }\n\n /**\n * Commit the active transaction.\n */\n async commit(): Promise<void> {\n await this.client.query('COMMIT');\n }\n\n /**\n * Roll back the active transaction.\n */\n async rollback(): Promise<void> {\n await this.client.query('ROLLBACK');\n }\n\n /**\n * Create a savepoint inside the active transaction.\n */\n async createSavepoint(name: string): Promise<void> {\n await this.client.query(`SAVEPOINT ${name}`);\n }\n\n /**\n * Release a previously-created savepoint.\n */\n async releaseSavepoint(name: string): Promise<void> {\n await this.client.query(`RELEASE SAVEPOINT ${name}`);\n }\n\n /**\n * Roll back the active transaction to a savepoint.\n */\n async rollbackToSavepoint(name: string): Promise<void> {\n await this.client.query(`ROLLBACK TO SAVEPOINT ${name}`);\n }\n\n /**\n * Release the leased PostgreSQL client back to its owning pool.\n */\n async close(): Promise<void> {\n this.client.release();\n }\n}\n"],"mappings":";;IAUa,iBAAN,MAAM,eAAmC;CAC5C,OAAgB,QAAQ;CACxB,eAAqD,eAAe;CAEpE,YAAoBA,QAAgC;AAAA,OAAhC,SAAA;CAAkC;;;;CAKtD,OAAO,iBAAiBC,OAAyC;AAC7D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,eAAe;CAE7E;;;;CAKD,MAAM,MAAmBC,KAAaC,QAAqD;EACvF,MAAM,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,OAAoB;AAChE,SAAO,EAAE,MAAM,OAAO,KAAa;CACtC;;;;CAKD,MAAM,QAAuB;AACzB,QAAM,KAAK,OAAO,MAAM,QAAQ;CACnC;;;;CAKD,MAAM,SAAwB;AAC1B,QAAM,KAAK,OAAO,MAAM,SAAS;CACpC;;;;CAKD,MAAM,WAA0B;AAC5B,QAAM,KAAK,OAAO,MAAM,WAAW;CACtC;;;;CAKD,MAAM,gBAAgBC,MAA6B;AAC/C,QAAM,KAAK,OAAO,OAAO,YAAY,KAAK,EAAE;CAC/C;;;;CAKD,MAAM,iBAAiBA,MAA6B;AAChD,QAAM,KAAK,OAAO,OAAO,oBAAoB,KAAK,EAAE;CACvD;;;;CAKD,MAAM,oBAAoBA,MAA6B;AACnD,QAAM,KAAK,OAAO,OAAO,wBAAwB,KAAK,EAAE;CAC3D;;;;CAKD,MAAM,QAAuB;AACzB,OAAK,OAAO,SAAS;CACxB;AACJ"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { SqliteClient } from "./SqliteClient-CjOK9-ki.js";
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
|
-
|
|
4
|
-
//#region src/connection/adapters/dialects/SqliteAdapter.ts
|
|
5
|
-
var SqliteAdapter = class SqliteAdapter {
|
|
6
|
-
static BRAND = "tango.orm.sqlite_adapter";
|
|
7
|
-
__tangoBrand = SqliteAdapter.BRAND;
|
|
8
|
-
name = "sqlite";
|
|
9
|
-
features = {
|
|
10
|
-
transactionalDDL: true,
|
|
11
|
-
concurrentIndex: false,
|
|
12
|
-
validateForeignKeys: false
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Narrow an unknown value to `SqliteAdapter`.
|
|
16
|
-
*/
|
|
17
|
-
static isSqliteAdapter(value) {
|
|
18
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === SqliteAdapter.BRAND;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Open a SQLite database and apply baseline pragmas for durability/safety.
|
|
22
|
-
*/
|
|
23
|
-
async connect(config = {}) {
|
|
24
|
-
const Database = this.getDatabaseCtor();
|
|
25
|
-
const filename = typeof config.filename === "string" && config.filename.length > 0 ? config.filename : ":memory:";
|
|
26
|
-
const db = new Database(filename);
|
|
27
|
-
db.pragma("journal_mode = WAL");
|
|
28
|
-
db.pragma("foreign_keys = ON");
|
|
29
|
-
db.pragma("busy_timeout = 5000");
|
|
30
|
-
return new SqliteClient(db);
|
|
31
|
-
}
|
|
32
|
-
getDatabaseCtor() {
|
|
33
|
-
const require = createRequire(import.meta.url);
|
|
34
|
-
const moduleValue = require("better-sqlite3");
|
|
35
|
-
if (typeof moduleValue === "function") return moduleValue;
|
|
36
|
-
const defaultExport = moduleValue.default;
|
|
37
|
-
if (typeof defaultExport === "function") return defaultExport;
|
|
38
|
-
throw new TypeError("Failed to load better-sqlite3 constructor.");
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
//#endregion
|
|
43
|
-
export { SqliteAdapter };
|
|
44
|
-
//# sourceMappingURL=SqliteAdapter-CeqhyrPC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteAdapter-CeqhyrPC.js","names":["value: unknown","config: AdapterConfig"],"sources":["../src/connection/adapters/dialects/SqliteAdapter.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport type { Database as BetterSqliteDatabase } from 'better-sqlite3';\nimport type { Adapter, AdapterConfig } from '../Adapter';\nimport type { DBClient } from '../../clients/DBClient';\nimport { SqliteClient } from '../../clients/dialects/SqliteClient';\n\ntype BetterSqliteCtor = new (filename: string, options?: unknown) => BetterSqliteDatabase;\n\n/**\n * SQLite adapter that creates a `better-sqlite3` backed `DBClient`.\n */\nexport class SqliteAdapter implements Adapter {\n static readonly BRAND = 'tango.orm.sqlite_adapter' as const;\n readonly __tangoBrand: typeof SqliteAdapter.BRAND = SqliteAdapter.BRAND;\n readonly name = 'sqlite';\n readonly features = {\n transactionalDDL: true,\n concurrentIndex: false,\n validateForeignKeys: false,\n };\n\n /**\n * Narrow an unknown value to `SqliteAdapter`.\n */\n static isSqliteAdapter(value: unknown): value is SqliteAdapter {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === SqliteAdapter.BRAND\n );\n }\n\n /**\n * Open a SQLite database and apply baseline pragmas for durability/safety.\n */\n async connect(config: AdapterConfig = {}): Promise<DBClient> {\n const Database = this.getDatabaseCtor();\n const filename =\n typeof config.filename === 'string' && config.filename.length > 0 ? config.filename : ':memory:';\n const db = new Database(filename);\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n db.pragma('busy_timeout = 5000');\n\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"],"mappings":";;;;IAWa,gBAAN,MAAM,cAAiC;CAC1C,OAAgB,QAAQ;CACxB,eAAoD,cAAc;CAClE,OAAgB;CAChB,WAAoB;EAChB,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;CACxB;;;;CAKD,OAAO,gBAAgBA,OAAwC;AAC3D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,cAAc;CAE5E;;;;CAKD,MAAM,QAAQC,SAAwB,CAAE,GAAqB;EACzD,MAAM,WAAW,KAAK,iBAAiB;EACvC,MAAM,kBACK,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,IAAI,OAAO,WAAW;EAC1F,MAAM,KAAK,IAAI,SAAS;AACxB,KAAG,OAAO,qBAAqB;AAC/B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,sBAAsB;AAEhC,SAAO,IAAI,aAAa;CAC3B;CAED,kBAA4C;EACxC,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;EAC9C,MAAM,cAAc,QAAQ,iBAAiB;AAC7C,aAAW,gBAAgB,WACvB,QAAO;EAGX,MAAM,gBAAiB,YAAsC;AAC7D,aAAW,kBAAkB,WACzB,QAAO;AAGX,QAAM,IAAI,UAAU;CACvB;AACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient-CjOK9-ki.js","names":["db: Database.Database","value: unknown","sql: string","params?: readonly unknown[]","name: string"],"sources":["../src/connection/clients/dialects/SqliteClient.ts"],"sourcesContent":["import type Database from 'better-sqlite3';\nimport type { DBClient } from '../DBClient';\n\n/**\n * Transaction-capable client backed by a synchronous `better-sqlite3` handle.\n */\nexport class SqliteClient implements DBClient {\n static readonly BRAND = 'tango.orm.sqlite_client' as const;\n readonly __tangoBrand: typeof SqliteClient.BRAND = SqliteClient.BRAND;\n private inTransaction = false;\n\n constructor(private db: Database.Database) {}\n\n /**\n * Narrow an unknown value to `SqliteClient`.\n */\n static isSqliteClient(value: unknown): value is SqliteClient {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === SqliteClient.BRAND\n );\n }\n\n /**\n * Execute a SQL statement with optional parameters.\n *\n * `SELECT`/`PRAGMA` statements return row data; write statements return\n * an empty row list.\n */\n async query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{ rows: T[] }> {\n const stmt = this.db.prepare(sql);\n const isPragmaWrite = /^\\s*PRAGMA\\b/i.test(sql) && /=/.test(sql);\n\n const normalizedParams = params?.map((param) => this.normalizeParam(param));\n\n if (!isPragmaWrite && stmt.reader) {\n const rows = normalizedParams ? stmt.all(...(normalizedParams as unknown[])) : stmt.all();\n return { rows: rows as T[] };\n }\n\n if (normalizedParams) {\n stmt.run(...(normalizedParams as unknown[]));\n } else {\n stmt.run();\n }\n return { rows: [] };\n }\n\n /**\n * Begin a transaction if one is not already active.\n */\n async begin(): Promise<void> {\n if (!this.inTransaction) {\n this.db.prepare('BEGIN').run();\n this.inTransaction = true;\n }\n }\n\n /**\n * Commit the active transaction.\n */\n async commit(): Promise<void> {\n if (this.inTransaction) {\n this.db.prepare('COMMIT').run();\n this.inTransaction = false;\n }\n }\n\n /**\n * Roll back the active transaction.\n */\n async rollback(): Promise<void> {\n if (this.inTransaction) {\n this.db.prepare('ROLLBACK').run();\n this.inTransaction = false;\n }\n }\n\n /**\n * Create a savepoint inside the active transaction.\n */\n async createSavepoint(name: string): Promise<void> {\n this.db.prepare(`SAVEPOINT ${name}`).run();\n }\n\n /**\n * Release a previously-created savepoint.\n */\n async releaseSavepoint(name: string): Promise<void> {\n this.db.prepare(`RELEASE SAVEPOINT ${name}`).run();\n }\n\n /**\n * Roll back the active transaction to a savepoint.\n */\n async rollbackToSavepoint(name: string): Promise<void> {\n this.db.prepare(`ROLLBACK TO SAVEPOINT ${name}`).run();\n }\n\n /**\n * Close the underlying SQLite handle.\n */\n async close(): Promise<void> {\n this.db.close();\n }\n\n private normalizeParam(value: unknown): unknown {\n if (isDateValue(value)) {\n return value.toISOString();\n }\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return value;\n }\n}\n\nfunction isDateValue(value: unknown): value is Date {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { getTime?: unknown }).getTime === 'function' &&\n typeof (value as { toISOString?: unknown }).toISOString === 'function'\n );\n}\n"],"mappings":";;IAMa,eAAN,MAAM,aAAiC;CAC1C,OAAgB,QAAQ;CACxB,eAAmD,aAAa;CAChE,gBAAwB;CAExB,YAAoBA,IAAuB;AAAA,OAAvB,KAAA;CAAyB;;;;CAK7C,OAAO,eAAeC,OAAuC;AACzD,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,aAAa;CAE3E;;;;;;;CAQD,MAAM,MAAmBC,KAAaC,QAAqD;EACvF,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI;EACjC,MAAM,gBAAgB,gBAAgB,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;EAEhE,MAAM,mBAAmB,QAAQ,IAAI,CAAC,UAAU,KAAK,eAAe,MAAM,CAAC;AAE3E,OAAK,iBAAiB,KAAK,QAAQ;GAC/B,MAAM,OAAO,mBAAmB,KAAK,IAAI,GAAI,iBAA+B,GAAG,KAAK,KAAK;AACzF,UAAO,EAAQ,KAAa;EAC/B;AAED,MAAI,iBACA,MAAK,IAAI,GAAI,iBAA+B;IAE5C,MAAK,KAAK;AAEd,SAAO,EAAE,MAAM,CAAE,EAAE;CACtB;;;;CAKD,MAAM,QAAuB;AACzB,OAAK,KAAK,eAAe;AACrB,QAAK,GAAG,QAAQ,QAAQ,CAAC,KAAK;AAC9B,QAAK,gBAAgB;EACxB;CACJ;;;;CAKD,MAAM,SAAwB;AAC1B,MAAI,KAAK,eAAe;AACpB,QAAK,GAAG,QAAQ,SAAS,CAAC,KAAK;AAC/B,QAAK,gBAAgB;EACxB;CACJ;;;;CAKD,MAAM,WAA0B;AAC5B,MAAI,KAAK,eAAe;AACpB,QAAK,GAAG,QAAQ,WAAW,CAAC,KAAK;AACjC,QAAK,gBAAgB;EACxB;CACJ;;;;CAKD,MAAM,gBAAgBC,MAA6B;AAC/C,OAAK,GAAG,SAAS,YAAY,KAAK,EAAE,CAAC,KAAK;CAC7C;;;;CAKD,MAAM,iBAAiBA,MAA6B;AAChD,OAAK,GAAG,SAAS,oBAAoB,KAAK,EAAE,CAAC,KAAK;CACrD;;;;CAKD,MAAM,oBAAoBA,MAA6B;AACnD,OAAK,GAAG,SAAS,wBAAwB,KAAK,EAAE,CAAC,KAAK;CACzD;;;;CAKD,MAAM,QAAuB;AACzB,OAAK,GAAG,OAAO;CAClB;CAED,eAAuBH,OAAyB;AAC5C,MAAI,YAAY,MAAM,CAClB,QAAO,MAAM,aAAa;AAE9B,aAAW,UAAU,UACjB,QAAO,QAAQ,IAAI;AAEvB,SAAO;CACV;AACJ;AAED,SAAS,YAAYA,OAA+B;AAChD,eACW,UAAU,YACjB,UAAU,eACF,MAAgC,YAAY,qBAC5C,MAAoC,gBAAgB;AAEnE"}
|
|
@@ -1 +0,0 @@
|
|
|
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":";;;;;;;;;IAKa,wBAAN,MAAyD;CAC5D,SAAiB;CAEjB,YACqBA,QACAC,OACAC,OACnB;AAAA,OAHmB,SAAA;AAAA,OACA,QAAA;AAAA,OACA,QAAA;CACjB;CAEJ,SAASC,UAAsBC,UAA2B,CAAE,GAAQ;AAChE,OAAK,KAAK,OACN,OAAM,IAAI,MAAM;AAGpB,OAAK,MAAM,UAAU,KAAK;GACtB,OAAO,KAAK,MAAM;GAClB;GACA,QAAQ,QAAQ,UAAU;EAC7B,EAAC;CACL;CAQD,MAAM,UACFC,MACAC,UAA4B,CAAE,GACC;AAC/B,OAAK,KAAK,OACN,OAAM,IAAI,MAAM;AAGpB,SAAO,KAAK,OAAO,aAAa,KAAK,OAAO,MAAM,QAAQ;CAC7D;CAED,aAAmB;AACf,OAAK,SAAS;CACjB;AACJ;;;;ICpCY,8BAAN,MAAkC;CACrC,SAA0B,UAAU,wBAAwB;CAC5D,UAA2B,IAAI;CAE/B,kCAAwC;AACpC,MAAI,KAAK,QAAQ,UAAU,CACvB,OAAM,IAAI,MAAM;CAEvB;CAED,qBAAqBC,SAAsD;EACvE,MAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,OAAK,SAAS,MAAM,YAAY,QAC5B,QAAO;AAGX,SAAO,MAAM,OAAO,GAAA,GAAM,EAAE;CAC/B;CAED,eAAeA,SAA2D;EACtE,MAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,OAAK,SAAS,MAAM,YAAY,QAC5B,QAAO;AAGX,SAAO,MAAM;CAChB;CAED,MAAM,OAAUA,SAAuBC,MAA6D;EAChG,MAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,MAAI,UAAU;AACV,OAAI,SAAS,YAAY,QACrB,OAAM,IAAI,MACN;AAIR,UAAO,KAAK,UAAU,UAAU,KAAK;EACxC;EAED,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;EACpD,MAAMC,QAA0B;GAC5B;GACA;GACA,QAAQ,CAAE;GACV,mBAAmB;GACnB,iBAAiB;EACpB;AAED,MAAI;AACA,UAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,YAAY;AAC7C,UAAM,MAAM,OAAO,OAAO;IAC1B,MAAM,QAAQ,KAAK,UAAU,MAAM;AAEnC,QAAI;KACA,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO;AACvC,WAAM,MAAM,OAAO,QAAQ;KAC3B,MAAM,OAAO,KAAK,SAAS,MAAM;AACjC,UAAK,OAAO,YAAY;AACxB,WAAM,KAAK,sBAAsB,KAAK,UAAU;AAChD,YAAO;IACV,SAAQ,OAAO;AACZ,WAAM,KAAK,cAAc,OAAO,MAAM;AACtC,WAAM;IACT;GACJ,EAAC;EACL,UAAS;AACN,QAAK,oBAAoB,MAAM;AAC/B,SAAM,MAAM,SAAS;EACxB;CACJ;CAED,MAAM,aACFA,OACAD,MACAE,SAC+B;AAC/B,MAAI;GACA,MAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,KAAK;AAC/C,OAAI,QAAQ,aACR,QAAO;AAGX,UAAO;IACH,IAAI;IACJ;GACH;EACJ,SAAQ,OAAO;AACZ,OAAI,QAAQ,aACR,OAAM;AAGV,UAAO;IACH,IAAI;IACJ;GACH;EACJ;CACJ;CAED,MAAc,UAAaD,OAAyBD,MAA6D;EAC7G,MAAM,iBAAiB,WAAW,MAAM,kBAAkB;AAC1D,QAAM,MAAM,MAAM,OAAO,gBAAgB,cAAc;EACvD,MAAM,QAAQ,KAAK,UAAU,OAAO,cAAc;AAElD,MAAI;GACA,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO;AACvC,SAAM,MAAM,MAAM,OAAO,iBAAiB,cAAc;GACxD,MAAM,YAAY,KAAK,SAAS,MAAM;AACtC,aAAU,OAAO,YAAY;GAC7B,MAAM,SAAS,MAAM,OAAO,GAAA,GAAM;AAClC,QAAK,OACD,OAAM,IAAI,MAAM;AAGpB,UAAO,UAAU,KAAK,GAAG,UAAU,UAAU;AAC7C,UAAO,UAAU,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,MAAM;AAChE,UAAO;EACV,SAAQ,OAAO;AACZ,OAAI;AACA,UAAM,MAAM,MAAM,OAAO,oBAAoB,cAAc;GAC9D,SAAQ,eAAe;AACpB,UAAM,KAAK,YAAY,eAAe,MAAM;GAC/C,UAAS;IACN,MAAM,YAAY,KAAK,SAAS,MAAM;AACtC,cAAU,OAAO,YAAY;GAChC;AAED,SAAM;EACT;CACJ;CAED,UAAkBC,OAAyBE,eAA0C;EACjF,MAAM,QAAQ,CAAE;EAChB,MAAM,SAAS,IAAI,sBAAsB,MAAM,OAAO;AACtD,QAAM,YAAY,CAAE;AACpB,QAAM,SAAS;AACf,QAAM,gBAAgB;AACtB,QAAM,OAAO,KAAK,MAAM;AACxB,SAAO;CACV;CAED,SAAiBF,OAA2C;EACxD,MAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,OAAK,MACD,OAAM,IAAI,MAAM;AAGpB,SAAO;CACV;CAED,MAAc,cAAcA,OAAyBG,OAA+B;AAChF,MAAI;AACA,SAAM,MAAM,MAAM,OAAO,UAAU;EACtC,SAAQ,eAAe;AACpB,SAAM,KAAK,YAAY,eAAe,MAAM;EAC/C,UAAS;AACN,UAAO,MAAM,OAAO,SAAS,GAAG;IAC5B,MAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,UAAM,OAAO,YAAY;GAC5B;EACJ;CACJ;CAED,MAAc,sBAAsBC,WAAqD;AACrF,OAAK,MAAM,UAAU,UACjB,KAAI;AACA,SAAM,OAAO,UAAU;EAC1B,SAAQ,OAAO;AACZ,QAAK,OAAO,OACR,OAAM;AAGV,OAAI;AACA,SAAK,OAAO,MAAM,gCAAgC,MAAM;GAC3D,QAAO,CAEP;EACJ;CAER;CAED,oBAA4BJ,OAA+B;AACvD,QAAM,OAAO,SAAS;CACzB;CAED,YAAoBG,OAAgBE,OAAyB;AACzD,OAAK,KAAK,aAAa,MAAM,CACzB,QAAO;AAGX,MAAI,WAAW,SAAS,MAAM,UAAU,UACpC,QAAO;AAGX,MAAI;AACA,UAAO,IAAI,MAAM,MAAM,SAAS,EAAE,MAAO;EAC5C,QAAO;AACJ,UAAO;EACV;CACJ;CAED,aAAqBC,OAAgC;AACjD,gBACW,UAAU,YACjB,UAAU,eACF,MAAgC,YAAY,mBAC5C,MAA6B,SAAS;CAErD;AACJ;;;;ICnNY,oBAAN,MAAM,kBAAkB;CAC3B,OAAwB,SAAS,IAAI;CAErC,YAAqCC,SAAuB;AAAA,OAAvB,UAAA;CAAyB;CAE9D,OAAO,WAAWA,SAA0C;AACxD,SAAO,IAAI,kBAAkB;CAChC;CAED,OAAO,kCAAwC;AAC3C,OAAK,OAAO,iCAAiC;CAChD;CAED,uBAAsD;AAClD,SAAO,kBAAkB,OAAO,qBAAqB,KAAK,QAAQ;CACrE;CAED,iBAAqD;AACjD,SAAO,kBAAkB,OAAO,eAAe,KAAK,QAAQ;CAC/D;CAED,MAAM,OAAUC,MAA6D;AACzE,SAAO,kBAAkB,OAAO,OAAO,KAAK,SAAS,KAAK;CAC7D;AACJ;;;;ICxBY,qBAAN,MAA6C;CAChD,YAA6BC,SAAuB;AAAA,OAAvB,UAAA;CAAyB;CAEtD,MAAM,MAAmBC,KAAaC,QAAqD;EACvF,MAAM,QAAQ,kBAAkB,WAAW,KAAK,QAAQ,CAAC,gBAAgB;AACzE,MAAI,MACA,QAAO,MAAM,OAAO,MAAS,KAAK,OAAO;EAG7C,MAAM,mBAAmB,KAAK;AAG9B,aAAW,iBAAiB,UAAU,WAClC,QAAO,iBAAiB,MAAS,KAAK,OAAO;EAGjD,MAAM,SAAS,MAAM,KAAK,QAAQ,WAAW;AAC7C,SAAO,OAAO,MAAS,KAAK,OAAO;CACtC;CAED,MAAM,QAAuB;AACzB,QAAM,IAAI,MAAM;CACnB;CAED,MAAM,SAAwB;AAC1B,QAAM,IAAI,MAAM;CACnB;CAED,MAAM,WAA0B;AAC5B,QAAM,IAAI,MAAM;CACnB;CAED,MAAM,gBAAgBC,OAA8B;AAChD,QAAM,IAAI,MACN;CAEP;CAED,MAAM,iBAAiBA,OAA8B;AACjD,QAAM,IAAI,MACN;CAEP;CAED,MAAM,oBAAoBA,OAA8B;AACpD,QAAM,IAAI,MACN;CAEP;CAED,MAAM,QAAuB;AACzB,QAAM,IAAI,MAAM;CACnB;AACJ;;;;ACxDD,MAAM,EAAE,MAAM,GAAG;IAEJ,2BAAN,MAA2D;CAC9D;CACA,mBAA2B;CAE3B,YAAYC,QAAuB;AAC/B,OAAK,OAAO,IAAI,KAAK;GACjB,kBAAkB,OAAO;GACzB,MAAM,OAAO;GACb,MAAM,OAAO;GACb,UAAU,OAAO;GACjB,MAAM,OAAO;GACb,UAAU,OAAO;GACjB,KAAK,OAAO,kBAAkB;EACjC;CACJ;CAED,MAAM,MAAmBC,KAAaC,QAAqD;EACvF,MAAM,SAAS,MAAM,KAAK,KAAK,MAAM,KAAK,OAAoB;AAC9D,SAAO,EAAE,MAAM,OAAO,KAAa;CACtC;CAED,MAAM,yBAA0D;EAC5D,MAAM,SAAS,MAAM,KAAK,KAAK,SAAS;AACxC,OAAK,oBAAoB;EACzB,IAAI,WAAW;AAEf,SAAO;GACH,QAAQ,IAAI,eAAe;GAC3B,SAAS,YAAY;AACjB,QAAI,SACA;AAGJ,eAAW;AACX,SAAK,oBAAoB;AACzB,WAAO,SAAS;GACnB;EACJ;CACJ;CAED,MAAM,QAAuB;AACzB,MAAI,KAAK,mBAAmB,EACxB,OAAM,IAAI,MAAM;AAGpB,QAAM,KAAK,KAAK,KAAK;CACxB;AACJ;;;;IC9CY,yBAAN,MAAyD;CAC5D;CACA;CACA;CACA,mBAA2B;CAE3B,YAAYC,SAAwB,CAAE,GAAE;AACpC,OAAK,WAAW,KAAK,iBAAiB;AACtC,OAAK,kBACM,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,IAAI,OAAO,WAAW;AAC1F,OAAK,mBAAmB,KAAK,WAAW,KAAK,SAAS;CACzD;CAED,MAAM,MAAmBC,KAAaC,QAAqD;AACvF,SAAO,KAAK,iBAAiB,MAAS,KAAK,OAAO;CACrD;CAED,MAAM,yBAA0D;AAC5D,MAAI,KAAK,aAAa,WAClB,OAAM,IAAI,MAAM;EAGpB,MAAM,SAAS,KAAK,WAAW,KAAK,SAAS;AAC7C,OAAK,oBAAoB;EACzB,IAAI,WAAW;AAEf,SAAO;GACH;GACA,SAAS,YAAY;AACjB,QAAI,SACA;AAGJ,eAAW;AACX,SAAK,oBAAoB;AACzB,UAAM,OAAO,OAAO;GACvB;EACJ;CACJ;CAED,MAAM,QAAuB;AACzB,MAAI,KAAK,mBAAmB,EACxB,OAAM,IAAI,MAAM;AAGpB,QAAM,KAAK,iBAAiB,OAAO;CACtC;CAED,WAAmBC,UAAgC;EAC/C,MAAM,KAAK,IAAI,KAAK,SAAS;AAC7B,KAAG,OAAO,qBAAqB;AAC/B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,sBAAsB;AAChC,SAAO,IAAI,aAAa;CAC3B;CAED,kBAA4C;EACxC,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;EAC9C,MAAM,cAAc,QAAQ,iBAAiB;AAC7C,aAAW,gBAAgB,WACvB,QAAO;EAGX,MAAM,gBAAiB,YAAsC;AAC7D,aAAW,kBAAkB,WACzB,QAAO;AAGX,QAAM,IAAI,UAAU;CACvB;AACJ;;;;ACzEM,SAAS,uBAAuBC,QAA+D;AAClG,SAAQ,OAAO,SAAf;AACI,OAAK,WACD,QAAO,IAAI,yBAAyB;AACxC,OAAK,SACD,QAAO,IAAI,uBAAuB;AACtC,UACI,OAAM,IAAI,OAAO,kDAAkD,OAAO,QAAQ;CACzF;AACJ;;;;ICHY,eAAN,MAAM,aAAa;CACtB,OAAgB,QAAQ;CACxB,eAAmD,aAAa;CAChE;CACA,kBAA4D;CAC5D,uBAAyD;CAEzD,YAAYC,kBAAsC;AAC9C,OAAK,eAAe,kBAAkB;CACzC;;;;CAKD,OAAO,eAAeC,OAAuC;AACzD,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,aAAa;CAE3E;;;;CAKD,YAA0B;AACtB,SAAO,KAAK;CACf;;;;CAKD,aAAsB;AAClB,SAAO,KAAK,aAAa,QAAQ,GAAG;CACvC;;;;CAKD,MAAM,YAA+B;AACjC,OAAK,KAAK,qBACN,MAAK,uBAAuB,QAAQ,QAAQ,IAAI,mBAAmB,MAAM;AAG7E,SAAO,KAAK;CACf;;;;CAKD,MAAM,MAAmBC,KAAaC,QAAqD;EACvF,MAAM,WAAW,MAAM,KAAK,aAAa;AACzC,SAAO,SAAS,MAAS,KAAK,OAAO;CACxC;;;;CAKD,MAAM,yBAA0D;EAC5D,MAAM,WAAW,MAAM,KAAK,aAAa;AACzC,SAAO,SAAS,wBAAwB;CAC3C;;;;CAKD,MAAM,QAAuB;AACzB,OAAK,KAAK,iBAAiB;AACvB,QAAK,uBAAuB;AAC5B;EACH;EAED,MAAM,WAAW,MAAM,KAAK;AAC5B,OAAK,kBAAkB;AACvB,OAAK,uBAAuB;AAC5B,QAAM,SAAS,OAAO;CACzB;CAED,MAAc,cAAyC;AACnD,OAAK,KAAK,iBAAiB;GACvB,MAAM,KAAK,KAAK,aAAa,QAAQ;AACrC,QAAK,kBAAkB,QAAQ,QAC3B,uBAAuB;IACnB,SAAS,GAAG;IACZ,KAAK,GAAG;IACR,MAAM,GAAG;IACT,MAAM,GAAG;IACT,UAAU,GAAG;IACb,MAAM,GAAG;IACT,UAAU,GAAG;IACb,UAAU,GAAG;IACb,gBAAgB,GAAG;GACtB,EAAC,CACL;EACJ;AAED,SAAO,KAAK;CACf;AACJ;;;;AC1GD,IAAIC,iBAAsC;AAKnC,SAAS,uBAAuBC,UAAuC;AAC1E,kBAAiB,IAAI,aAAa,MAAM,WAAW,SAAS;AAC5D,QAAO;AACV;AAKM,SAAS,kBAAgC;AAC5C,MAAK,eACD,kBAAiB,IAAI,aAAa,MAAM,2BAA2B;AAGvE,QAAO;AACV;AAKM,eAAe,oBAAmC;AACrD,MAAK,eACD;CAGJ,MAAM,UAAU;AAChB,kBAAiB;AACjB,OAAM,QAAQ,OAAO;AACxB"}
|
package/dist/manager-C6oJ2tAF.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { __export } from "./chunk-DLY2FNSh.js";
|
|
2
|
-
import { ModelManager, registerModelObjects } from "./registerModelObjects-BKMpfc4Z.js";
|
|
3
|
-
|
|
4
|
-
//#region src/manager/index.ts
|
|
5
|
-
var manager_exports = {};
|
|
6
|
-
__export(manager_exports, {
|
|
7
|
-
ModelManager: () => ModelManager,
|
|
8
|
-
registerModelObjects: () => registerModelObjects
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
//#endregion
|
|
12
|
-
export { manager_exports };
|
|
13
|
-
//# sourceMappingURL=manager-C6oJ2tAF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager-C6oJ2tAF.js","names":[],"sources":["../src/manager/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes manager-first ORM APIs.\n */\nexport type { ManagerLike } from './ManagerLike';\nexport { ModelManager } from './ModelManager';\nexport { registerModelObjects } from './registerModelObjects';\n"],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-C6So1r6H.js","names":["model: TableMetaModel","owner: ModelRegistry | undefined","cache: Map<string, TableMeta>","tableMeta: TableMeta","capabilities: RelationMeta['capabilities']","engine: SqlSafetyEngine","plan: SqlValidationPlan","meta: TableMeta","relationNames: readonly string[]","validatedMeta: ValidatedTableMeta","meta: ValidatedTableMeta","relationName: string","relations: TableMeta['relations']","rawKey: string","field: string","meta: TableMeta","value: unknown","state: QuerySetState<T>","rootChildren: Map<string, TraversalTrieNode>","relationPath: string","mode: RequestedMode","children: Map<string, TraversalTrieNode>","joinNodes: QueryHydrationPlanNode[]","prefetchNodes: QueryHydrationPlanNode[]","plannedNode: QueryHydrationPlanNode","meta: TableMeta","dialect: Dialect","value: unknown","state: QuerySetState<T>","whereParts: string[]","params: unknown[]","joinCollection: JoinCollection","hiddenRootAliases: string[]","compiledHydrationPlan: CompiledHydrationPlanRoot | undefined","node: CompiledHydrationNode","sourceValues: readonly (string | number)[]","node: QueryHydrationPlanNode","context: {\n rootTable: string;\n ownerMeta: TableMeta;\n ownerAlias: string;\n collectRootJoins: boolean;\n rootSelectedFields?: readonly string[];\n hiddenRootAliases: string[];\n joinCollection: JoinCollection;\n }","joinDescriptor: CompiledJoinHydrationDescriptor | undefined","ownerMeta: TableMeta","relationName: string","nodes: readonly CompiledHydrationNode[]","table: string","ownerAlias: string","ownerColumns: Record<string, string>","collection: JoinCollection","alias: string","relationPath: string","column: string","sourceKey: string","node: QNode<T>","paramIndex: number","filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>","where: FilterInput<T>","nodes: QNode<T>[]","col: string","lookup: LookupType","filterKeys: Set<string>","items: readonly T[]","value: unknown","callbackfn: (value: T, index: number, array: readonly T[]) => U","thisArg?: unknown","index: number","value: unknown","node: FilterInput<T> | QNode<T>","input: FilterInput<T> | QNode<T>","executor: QueryExecutor<TModel>","state: QuerySetState<TModel>","value: unknown","q: FilterInput<TModel> | QNode<TModel>","wrapped: QNode<TModel>","n: number","fields: readonly (keyof TModel)[]","shape?:\n | QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>\n | QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>","results: Array<HydratedQueryResult<TBaseResult, THydrated> | Out>","rows: readonly HydratedQueryResult<TBaseResult, THydrated>[]","rows: Record<string, unknown>[]","compiled: CompiledQuery","owner: Record<string, unknown>","rawRow: Record<string, unknown>","nodes: readonly CompiledHydrationNode[]","canonicalEntities: Map<string, Map<string | number, Record<string, unknown>>>","queuedJoinPrefetchOwners?: Map<CompiledHydrationNode, Set<Record<string, unknown>>>","target: Record<string, unknown>","node: CompiledHydrationNode","owners: readonly Record<string, unknown>[]","compiler: QueryCompiler","accessor: string","row: Record<string, unknown>","prefetch: TargetColumnMetadata","normalized: Record<string, unknown> | null","columnType: string | undefined","row: TRow","columns: readonly string[]","normalized: TRow | null"],"sources":["../src/query/domain/internal/InternalRelationKind.ts","../src/query/domain/TableMetaFactory.ts","../src/query/domain/RelationMeta.ts","../src/query/domain/internal/InternalDialect.ts","../src/query/domain/internal/InternalQNodeType.ts","../src/query/domain/internal/InternalLookupType.ts","../src/validation/OrmSqlSafetyAdapter.ts","../src/query/domain/RelationTyping.ts","../src/query/planning/QueryPlanner.ts","../src/query/compiler/QueryCompiler.ts","../src/query/compiler/index.ts","../src/query/domain/QueryResult.ts","../src/query/domain/index.ts","../src/query/domain/internal/InternalDirection.ts","../src/query/QBuilder.ts","../src/query/QuerySet.ts","../src/query/index.ts"],"sourcesContent":["export const InternalRelationKind = {\n HAS_MANY: 'hasMany',\n BELONGS_TO: 'belongsTo',\n HAS_ONE: 'hasOne',\n MANY_TO_MANY: 'manyToMany',\n} as const;\n","import { ModelRegistry } from '@danceroutine/tango-schema';\nimport type { Model as SchemaModel } from '@danceroutine/tango-schema/domain';\nimport type { TableMeta } from './TableMeta';\nimport type { RelationMeta } from './RelationMeta';\nimport { InternalRelationKind } from './internal/InternalRelationKind';\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 TableMetaModel = {\n metadata: ModelMetadataLike;\n};\n\n/**\n * Build registry-backed recursive table metadata for query planning and\n * hydration execution.\n */\nexport class TableMetaFactory {\n static create(model: TableMetaModel): TableMeta {\n const owner = model.metadata.key ? ModelRegistry.getOwner(model) : undefined;\n const cache = new Map<string, TableMeta>();\n return TableMetaFactory.createWithCache(model, owner, cache);\n }\n\n private static createWithCache(\n model: TableMetaModel,\n owner: ModelRegistry | undefined,\n cache: Map<string, TableMeta>\n ): TableMeta {\n if (model.metadata.key) {\n const cached = cache.get(model.metadata.key);\n if (cached) {\n return cached;\n }\n }\n\n const pkField = model.metadata.fields.find((field) => field.primaryKey);\n if (!pkField) {\n throw new Error(`Model '${model.metadata.name}' cannot attach a manager without a primary key field.`);\n }\n\n const tableMeta: TableMeta = {\n modelKey: model.metadata.key,\n table: model.metadata.table,\n pk: pkField.name,\n columns: Object.fromEntries(model.metadata.fields.map((field) => [field.name, field.type])),\n };\n\n if (model.metadata.key) {\n cache.set(model.metadata.key, tableMeta);\n }\n\n if (!model.metadata.key || !owner) {\n return tableMeta;\n }\n\n const relations = owner.getResolvedRelationGraph().byModel.get(model.metadata.key);\n if (!relations || relations.size === 0) {\n return tableMeta;\n }\n\n tableMeta.relations = Object.fromEntries(\n Array.from(relations.entries())\n .filter(([, relation]) => relation.capabilities.queryable && relation.capabilities.hydratable)\n .map(([name, relation]) => {\n const targetModel = owner.getByKey(relation.targetModelKey)!;\n const targetMeta = TableMetaFactory.createWithCache(targetModel, owner, cache);\n const { queryable, hydratable } = relation.capabilities;\n const isSingleRelation =\n relation.kind === InternalRelationKind.BELONGS_TO ||\n relation.kind === InternalRelationKind.HAS_ONE;\n const sourceKey =\n relation.kind === InternalRelationKind.BELONGS_TO\n ? relation.localFieldName\n : relation.targetFieldName;\n const targetKey =\n relation.kind === InternalRelationKind.BELONGS_TO\n ? relation.targetFieldName\n : relation.localFieldName;\n const targetColumns = Object.fromEntries(\n targetModel.metadata.fields.map((field) => [field.name, field.type])\n );\n const capabilities: RelationMeta['capabilities'] = {\n queryable,\n hydratable,\n joinable: isSingleRelation && queryable && hydratable,\n prefetchable: queryable && hydratable,\n };\n\n return [\n name,\n {\n edgeId: relation.edgeId,\n sourceModelKey: relation.sourceModelKey,\n targetModelKey: relation.targetModelKey,\n kind: relation.kind as RelationMeta['kind'],\n cardinality: isSingleRelation ? 'single' : 'many',\n capabilities,\n table: targetModel.metadata.table,\n sourceKey: sourceKey as string,\n targetKey: targetKey as string,\n targetPrimaryKey: targetMeta.pk,\n targetColumns,\n alias: relation.alias,\n targetMeta,\n } satisfies RelationMeta,\n ];\n })\n );\n\n return tableMeta;\n }\n}\n","import type { InternalRelationKind } from './internal/InternalRelationKind';\nimport type { RelationHydrationCardinality } from './RelationTyping';\nimport type { TableMeta } from './TableMeta';\n\nexport type RelationKind = (typeof InternalRelationKind)[keyof typeof InternalRelationKind];\nexport const InternalRelationHydrationLoadMode = {\n JOIN: 'join',\n PREFETCH: 'prefetch',\n} as const;\n\nexport type RelationHydrationLoadMode =\n (typeof InternalRelationHydrationLoadMode)[keyof typeof InternalRelationHydrationLoadMode];\n\nexport interface RelationHydrationCapabilities {\n queryable: boolean;\n hydratable: boolean;\n joinable: boolean;\n prefetchable: boolean;\n}\n\n/**\n * Runtime relation metadata consumed by validation, planning, compilation, and\n * hydration.\n */\nexport interface RelationMeta {\n /** Stable edge identity from the resolved relation graph. */\n edgeId: string;\n /** Model key that owns the public relation name. */\n sourceModelKey: string;\n /** Model key reached by traversing this relation. */\n targetModelKey: string;\n /** Public relation kind such as belongsTo or hasMany. */\n kind: RelationKind;\n /** Hydration cardinality used by eager-loading APIs. */\n cardinality: RelationHydrationCardinality;\n /** Capability flags distilled from the resolved relation graph. */\n capabilities: RelationHydrationCapabilities;\n /** Physical table storing the target model rows. */\n table: string;\n /** Owner-side column used to attach or query related rows. */\n sourceKey: string;\n /** Target-side column matched against the source key. */\n targetKey: string;\n /** Primary key column for the target model. */\n targetPrimaryKey: string;\n /** Target model columns and their storage types. */\n targetColumns: Record<string, string>;\n /** Deterministic alias base used by join compilation. */\n alias: string;\n /** Recursive target metadata used for nested planning. */\n targetMeta?: TableMeta;\n}\n","export const InternalDialect = {\n POSTGRES: 'postgres',\n SQLITE: 'sqlite',\n} as const;\n","export const InternalQNodeType = {\n ATOM: 'atom',\n AND: 'and',\n OR: 'or',\n NOT: 'not',\n} as const;\n","export const InternalLookupType = {\n EXACT: 'exact',\n LT: 'lt',\n LTE: 'lte',\n GT: 'gt',\n GTE: 'gte',\n IN: 'in',\n ISNULL: 'isnull',\n CONTAINS: 'contains',\n ICONTAINS: 'icontains',\n STARTSWITH: 'startswith',\n ISTARTSWITH: 'istartswith',\n ENDSWITH: 'endswith',\n IENDSWITH: 'iendswith',\n} as const;\n","import { SqlSafetyEngine, type SqlIdentifierRequest } from '@danceroutine/tango-core';\nimport type { LookupType } from '../query/domain/LookupType';\nimport type { TableMeta } from '../query/domain/TableMeta';\nimport { InternalLookupType } from '../query/domain/internal/InternalLookupType';\nimport type {\n SQLValidationEngine,\n ValidatedDeleteSqlPlan,\n ValidatedFilterDescriptor,\n ValidatedInsertSqlPlan,\n ValidatedRelationMeta,\n ValidatedTableMeta,\n ValidatedSelectSqlPlan,\n ValidatedSqlPlan,\n ValidatedUpdateSqlPlan,\n} from './SQLValidationEngine';\nimport type {\n DeleteSqlValidationPlan,\n InsertSqlValidationPlan,\n SelectSqlValidationPlan,\n SqlValidationPlan,\n UpdateSqlValidationPlan,\n} from './SqlValidationPlan';\n\nconst ALLOWED_LOOKUPS = Object.values(InternalLookupType) as readonly string[];\n\n/**\n * ORM-local adapter that translates query validation plans into the\n * shared Tango SQL safety engine.\n */\nexport class OrmSqlSafetyAdapter implements SQLValidationEngine {\n static readonly BRAND = 'tango.orm.orm_sql_safety_adapter' as const;\n readonly __tangoBrand: typeof OrmSqlSafetyAdapter.BRAND = OrmSqlSafetyAdapter.BRAND;\n\n constructor(private readonly engine: SqlSafetyEngine = new SqlSafetyEngine()) {}\n\n validate(plan: SelectSqlValidationPlan): ValidatedSelectSqlPlan;\n validate(plan: InsertSqlValidationPlan): ValidatedInsertSqlPlan;\n validate(plan: UpdateSqlValidationPlan): ValidatedUpdateSqlPlan;\n validate(plan: DeleteSqlValidationPlan): ValidatedDeleteSqlPlan;\n validate(plan: SqlValidationPlan): ValidatedSqlPlan {\n switch (plan.kind) {\n case 'select': {\n const meta = this.validateTableMeta(plan.meta, plan.relationNames ?? []);\n return {\n kind: 'select',\n meta,\n selectFields: Object.fromEntries(\n (plan.selectFields ?? []).map((field) => [\n field,\n `${meta.table}.${this.resolveColumn(meta, field)}`,\n ])\n ),\n filterKeys: Object.fromEntries(\n (plan.filterKeys ?? []).map((rawKey) => [rawKey, this.validateFilterKey(meta, rawKey)])\n ),\n orderFields: Object.fromEntries(\n (plan.orderFields ?? []).map((field) => [\n field,\n `${meta.table}.${this.resolveColumn(meta, field)}`,\n ])\n ),\n relations: Object.fromEntries(\n (plan.relationNames ?? []).map((relationName) => [\n relationName,\n this.resolveRelation(meta, relationName),\n ])\n ),\n };\n }\n case 'insert': {\n const meta = this.validateTableMeta(plan.meta);\n return {\n kind: 'insert',\n meta,\n writeKeys: plan.writeKeys.map((key) => this.resolveColumn(meta, key)),\n };\n }\n case 'update': {\n const meta = this.validateTableMeta(plan.meta);\n return {\n kind: 'update',\n meta,\n writeKeys: plan.writeKeys.map((key) => this.resolveColumn(meta, key)),\n };\n }\n case 'delete': {\n return {\n kind: 'delete',\n meta: this.validateTableMeta(plan.meta),\n };\n }\n }\n }\n\n private validateTableMeta(meta: TableMeta, relationNames: readonly string[] = []): ValidatedTableMeta {\n const columnNames = Object.keys(meta.columns);\n const validated = this.engine.validate({\n identifiers: [\n { key: 'table', role: 'table', value: meta.table },\n { key: 'pk', role: 'primaryKey', value: meta.pk, allowlist: columnNames },\n ...columnNames.map<SqlIdentifierRequest>((column) => ({\n key: `column:${column}`,\n role: 'column',\n value: column,\n })),\n ],\n });\n\n const validatedMeta: ValidatedTableMeta = {\n table: validated.identifiers.table!.value,\n pk: validated.identifiers.pk!.value,\n columns: Object.fromEntries(\n columnNames.map((column) => [validated.identifiers[`column:${column}`]!.value, meta.columns[column]!])\n ),\n };\n\n if (!(validatedMeta.pk in validatedMeta.columns)) {\n throw new Error(`Unknown column '${validatedMeta.pk}' for table '${validatedMeta.table}'.`);\n }\n\n if (relationNames.length > 0) {\n validatedMeta.relations = Object.fromEntries(\n relationNames.map((relationName) => [\n relationName,\n this.validateRelationMeta(validatedMeta, relationName, meta.relations),\n ])\n );\n }\n\n return validatedMeta;\n }\n\n private validateRelationMeta(\n meta: ValidatedTableMeta,\n relationName: string,\n relations: TableMeta['relations']\n ): ValidatedRelationMeta {\n const relation = relations?.[relationName];\n if (!relation) {\n throw new Error(`Unknown relation '${relationName}' for table '${meta.table}'.`);\n }\n if (!(relation.targetKey in relation.targetColumns)) {\n throw new Error(`Unknown relation target key '${relation.targetKey}' for relation '${relationName}'.`);\n }\n\n const validated = this.engine.validate({\n identifiers: [\n { key: 'table', role: 'relationTable', value: relation.table },\n { key: 'alias', role: 'alias', value: relation.alias },\n { key: 'targetKey', role: 'relationTargetPrimaryKey', value: relation.targetKey },\n ...Object.keys(relation.targetColumns).map<SqlIdentifierRequest>((column) => ({\n key: `targetColumn:${column}`,\n role: 'column',\n value: column,\n })),\n ],\n });\n\n return {\n ...relation,\n table: validated.identifiers.table!.value,\n alias: validated.identifiers.alias!.value,\n sourceKey: this.resolveColumn(meta, relation.sourceKey),\n targetKey: validated.identifiers.targetKey!.value,\n targetColumns: Object.fromEntries(\n Object.keys(relation.targetColumns).map((column) => [\n validated.identifiers[`targetColumn:${column}`]!.value,\n relation.targetColumns[column]!,\n ])\n ),\n };\n }\n\n private validateFilterKey(meta: ValidatedTableMeta, rawKey: string): ValidatedFilterDescriptor {\n const segments = rawKey.split('__');\n if (segments.length > 2) {\n throw new Error(`Invalid SQL lookup key: '${rawKey}'.`);\n }\n\n const field = segments[0]!;\n const lookup = (segments[1] ?? InternalLookupType.EXACT) as LookupType;\n const validated = this.engine.validate({\n lookupTokens: [{ key: rawKey, lookup, allowed: ALLOWED_LOOKUPS }],\n });\n\n return {\n rawKey,\n field,\n lookup: validated.lookupTokens[rawKey]!.lookup as LookupType,\n qualifiedColumn: `${meta.table}.${this.resolveColumn(meta, field)}`,\n };\n }\n\n private resolveColumn(meta: ValidatedTableMeta, field: string): string {\n if (!(field in meta.columns)) {\n throw new Error(`Unknown column '${field}' for table '${meta.table}'.`);\n }\n\n return field;\n }\n\n private resolveRelation(meta: ValidatedTableMeta, relationName: string): ValidatedRelationMeta {\n const relation = meta.relations?.[relationName];\n if (!relation) {\n throw new Error(`Unknown relation '${relationName}' for table '${meta.table}'.`);\n }\n\n return relation;\n }\n}\n","import type { z } from 'zod';\nimport type { Model, PersistedModelOutput } from '@danceroutine/tango-schema/domain';\nimport type {\n DecoratedFieldKind,\n InternalDecoratedFieldKind,\n RelationDecoratedSchema,\n} from '@danceroutine/tango-schema/model';\n\nexport const InternalRelationHydrationCardinality = {\n SINGLE: 'single',\n MANY: 'many',\n} as const;\n\nexport type RelationHydrationCardinality =\n (typeof InternalRelationHydrationCardinality)[keyof typeof InternalRelationHydrationCardinality];\nexport type SingleRelationHydrationCardinality = typeof InternalRelationHydrationCardinality.SINGLE;\nexport type ManyRelationHydrationCardinality = typeof InternalRelationHydrationCardinality.MANY;\n\nexport type HydratedQueryResult<TBase extends Record<string, unknown>, THydrated extends Record<string, unknown>> =\n // No relation hydration requested: keep the base projection exactly as-is.\n [keyof THydrated] extends [never] ? TBase : Omit<TBase, keyof THydrated> & THydrated;\n\ndeclare global {\n // oxlint-disable-next-line no-empty-object-type\n interface TangoGeneratedRelationRegistry {}\n}\n\n// A model's own schema is the only source TypeScript can inspect without codegen or an ambient registry.\n// These helpers progressively peel that schema apart into field definitions and persisted row shapes.\n// \"AnyModel\" is a structural upper bound for model values when the exact schema/key is not important.\ntype AnyModel = Model<z.ZodObject<z.ZodRawShape>, string>;\n// If the caller gave us a Tango Model type, infer the Zod schema type stored inside it.\ntype ModelSchema<TModel> =\n TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string> ? TSchema : never;\n// If we have a Zod object schema, infer its raw object shape so we can inspect individual fields.\ntype ModelShape<TModel> = ModelSchema<TModel> extends z.ZodObject<infer TShape> ? TShape : never;\n// Convert the inferred model schema back into the persisted row shape applications receive from the ORM.\ntype ModelRow<TModel> =\n TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string>\n ? PersistedModelOutput<TSchema>\n : never;\n\n// Relation typing only works when model keys remain literal. Once a model key widens to plain string,\n// TypeScript can no longer prove that one relation target matches another model.\n// This conditional rejects widened strings while accepting literal keys such as \"blog/User\".\ntype IsLiteralString<TValue> = TValue extends string ? (string extends TValue ? false : true) : false;\n// A model has strict relation typing only when its model key is still a literal type.\ntype HasStrictModelKey<TModel> =\n TModel extends Model<z.ZodObject<z.ZodRawShape>, infer TKey> ? IsLiteralString<TKey> : false;\n\n// Extract the literal model key from a Tango Model type. The generated\n// relation registry is indexed by these stable ids.\ntype ModelKey<TModel> = TModel extends Model<z.ZodObject<z.ZodRawShape>, infer TKey extends string> ? TKey : never;\n\n// Merge one-hydration-per-path object fragments into one final hydrated map.\ntype UnionToIntersection<TValue> = (TValue extends unknown ? (value: TValue) => void : never) extends (\n value: infer TIntersection\n) => void\n ? TIntersection\n : never;\n\ntype JoinPathSegments<TSegments extends readonly string[]> = TSegments extends readonly [\n infer THead extends string,\n ...infer TRest extends string[],\n]\n ? TRest['length'] extends 0\n ? THead\n : `${THead}__${JoinPathSegments<TRest>}`\n : never;\n\n// Split a Django-style path into tuple segments so recursive conditional types\n// can walk one relation hop at a time.\ntype SplitPath<TPath extends string> = TPath extends `${infer THead}__${infer TRest}`\n ? [THead, ...SplitPath<TRest>]\n : [TPath];\n\ntype TailTuple<TTuple extends readonly unknown[]> = TTuple extends readonly [unknown, ...infer TRest] ? TRest : [];\n// Generated typing allows four recursive revisits before it falls back to\n// weaker typing. Runtime traversal can still go deeper than this budget.\ntype DefaultGeneratedCycleBudget = readonly [1, 1, 1, 1];\ntype GeneratedRelationRegistry = TangoGeneratedRelationRegistry;\ntype GeneratedRelationKeys<TSourceModel> = Extract<keyof GeneratedRelations<TSourceModel>, string>;\n\n// Only read from the ambient generated registry when the caller supplied a\n// model whose key remains a literal type.\ntype GeneratedRelations<TSourceModel> =\n HasStrictModelKey<TSourceModel> extends true\n ? ModelKey<TSourceModel> extends keyof GeneratedRelationRegistry\n ? GeneratedRelationRegistry[ModelKey<TSourceModel>]\n : // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {}\n : // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {};\n\ntype NextSeenModels<TSeen extends readonly string[], TTargetModel> =\n ModelKey<TTargetModel> extends string ? [...TSeen, ModelKey<TTargetModel>] : TSeen;\n\n// Revisiting a model is allowed while the cycle budget still has entries.\ntype CanTraverseGeneratedTarget<\n TTargetModel,\n TSeen extends readonly string[],\n TCycleBudget extends readonly unknown[],\n> = ModelKey<TTargetModel> extends TSeen[number] ? (TCycleBudget extends [] ? false : true) : true;\n\n// Only consume budget when the next edge revisits a model already on the path.\ntype NextGeneratedCycleBudget<TTargetModel, TSeen extends readonly string[], TCycleBudget extends readonly unknown[]> =\n ModelKey<TTargetModel> extends TSeen[number] ? TailTuple<TCycleBudget> : TCycleBudget;\n\ntype GeneratedCardinalityIncludesMany<TCardinality extends RelationHydrationCardinality> =\n TCardinality extends typeof InternalRelationHydrationCardinality.MANY ? true : false;\n\nexport type GeneratedSelectRelatedPathKeys<\n TSourceModel,\n TSeen extends readonly string[] = [ModelKey<TSourceModel>],\n TCycleBudget extends readonly unknown[] = DefaultGeneratedCycleBudget,\n> = {\n [TKey in GeneratedRelationKeys<TSourceModel>]: GeneratedRelations<TSourceModel>[TKey] extends {\n target: infer TTarget extends AnyModel;\n cardinality: typeof InternalRelationHydrationCardinality.SINGLE;\n }\n ?\n | TKey\n | (CanTraverseGeneratedTarget<TTarget, TSeen, TCycleBudget> extends true\n ? `${TKey}__${GeneratedSelectRelatedPathKeys<\n TTarget,\n NextSeenModels<TSeen, TTarget>,\n NextGeneratedCycleBudget<TTarget, TSeen, TCycleBudget>\n >}`\n : never)\n : never;\n}[GeneratedRelationKeys<TSourceModel>];\n\nexport type GeneratedPrefetchRelatedPathKeys<\n TSourceModel,\n THasMany extends boolean = false,\n TSeen extends readonly string[] = [ModelKey<TSourceModel>],\n TCycleBudget extends readonly unknown[] = DefaultGeneratedCycleBudget,\n> = {\n [TKey in GeneratedRelationKeys<TSourceModel>]: GeneratedRelations<TSourceModel>[TKey] extends {\n target: infer TTarget extends AnyModel;\n cardinality: infer TCardinality extends RelationHydrationCardinality;\n }\n ?\n | (THasMany extends true\n ? TKey\n : GeneratedCardinalityIncludesMany<TCardinality> extends true\n ? TKey\n : never)\n | (CanTraverseGeneratedTarget<TTarget, TSeen, TCycleBudget> extends true\n ? `${TKey}__${GeneratedPrefetchRelatedPathKeys<\n TTarget,\n THasMany extends true ? true : GeneratedCardinalityIncludesMany<TCardinality>,\n NextSeenModels<TSeen, TTarget>,\n NextGeneratedCycleBudget<TTarget, TSeen, TCycleBudget>\n >}`\n : never)\n : never;\n}[GeneratedRelationKeys<TSourceModel>];\n\n// Hydrated target values recurse through the remaining path suffix, so a path\n// like `posts__author` becomes `{ posts: Array<{ author: ... }> }`.\ntype GeneratedHydratedTarget<TDescriptor, TPath extends string | never> = TDescriptor extends {\n target: infer TTarget extends AnyModel;\n}\n ? [TPath] extends [never]\n ? ModelRow<TTarget>\n : HydratedQueryResult<ModelRow<TTarget>, GeneratedHydratedRelationMap<TTarget, TPath>>\n : never;\n\ntype GeneratedHydratedValue<TDescriptor, TPath extends string | never> = TDescriptor extends {\n cardinality: infer TCardinality extends RelationHydrationCardinality;\n}\n ? TCardinality extends typeof InternalRelationHydrationCardinality.SINGLE\n ? GeneratedHydratedTarget<TDescriptor, TPath> | null\n : GeneratedHydratedTarget<TDescriptor, TPath>[]\n : never;\n\n// Turn one path string into the object fragment it contributes before all path\n// fragments are merged into the final hydrated relation map.\ntype GeneratedHydrationForPath<TSourceModel, TPath extends string> =\n SplitPath<TPath> extends [infer THead extends string, ...infer TRest extends string[]]\n ? THead extends GeneratedRelationKeys<TSourceModel>\n ? {\n [TKey in THead]: GeneratedHydratedValue<\n GeneratedRelations<TSourceModel>[THead],\n JoinPathSegments<TRest>\n >;\n }\n : // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {}\n : // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {};\n\nexport type GeneratedHydratedRelationMap<TSourceModel, TPaths extends string | never> = ([TPaths] extends [never]\n ? Record<never, never>\n : UnionToIntersection<TPaths extends string ? GeneratedHydrationForPath<TSourceModel, TPaths> : never>) &\n Record<never, never>;\n\nexport type HasStrictRelationTyping<TSourceModel> = HasStrictModelKey<TSourceModel>;\n\n// Reverse relation typing compares the literal model key carried by the target field against the source model key.\ntype ModelKeysMatch<TCandidate, TExpected> =\n TCandidate extends Model<z.ZodObject<z.ZodRawShape>, infer TCandidateKey>\n ? // The candidate relation target is a Tango model. Now check whether the expected source is also a model.\n TExpected extends Model<z.ZodObject<z.ZodRawShape>, infer TExpectedKey>\n ? // Both sides must keep literal keys, otherwise a plain string could accidentally match anything.\n IsLiteralString<TCandidateKey> extends true\n ? IsLiteralString<TExpectedKey> extends true\n ? // Tuple wrapping avoids distributive conditional behavior and compares the keys as whole values.\n [TCandidateKey] extends [TExpectedKey]\n ? true\n : false\n : false\n : false\n : false\n : false;\n\n// Keep this in sync with RelationDescriptorNormalizer.deriveNamingHint(...), which currently recognizes\n// camelCase \"Id\" and snake_case \"_id\" suffixes but does not treat lowercase \"id\" as a relation suffix.\ntype FieldNamingHint<TKey extends string> = TKey extends `${infer TBase}Id`\n ? // Convert authorId -> author for relation names when the decorator did not configure name explicitly.\n TBase\n : TKey extends `${infer TBase}_id`\n ? // Convert author_id -> author for snake_case field names.\n TBase\n : // Otherwise the field key is already the best available relation-name hint.\n TKey;\n\n// Prefer an explicitly configured forward relation name. Fall back to the field-name heuristic.\ntype RelationName<TKey extends string, TName> = TName extends string ? TName : FieldNamingHint<TKey>;\n// Reverse relations cannot be inferred without an explicit relatedName, so missing names become never.\ntype RelatedName<TName> = TName extends string ? TName : never;\n\n// Relation decorators brand their Zod field with type-only metadata. The next group extracts that metadata:\n// relation target, configured forward name, configured reverse name, and relation kind.\ntype RelationTarget<TField> =\n TField extends RelationDecoratedSchema<\n z.ZodTypeAny,\n DecoratedFieldKind,\n infer TTarget,\n string | undefined,\n string | undefined\n >\n ? // infer TTarget captures the typed model target carried by direct refs, callbacks, or t.modelRef<TModel>(...).\n TTarget\n : never;\n\ntype RelationConfiguredName<TField> =\n TField extends RelationDecoratedSchema<z.ZodTypeAny, DecoratedFieldKind, AnyModel, infer TName, string | undefined>\n ? // infer TName captures config.name when the decorator call used a literal string.\n TName\n : undefined;\n\ntype RelationConfiguredRelatedName<TField> =\n TField extends RelationDecoratedSchema<\n z.ZodTypeAny,\n DecoratedFieldKind,\n AnyModel,\n string | undefined,\n infer TRelatedName\n >\n ? // infer TRelatedName captures config.relatedName when the decorator call used a literal string.\n TRelatedName\n : undefined;\n\ntype RelationKindOf<TField> =\n TField extends RelationDecoratedSchema<z.ZodTypeAny, infer TKind, AnyModel, string | undefined, string | undefined>\n ? // infer TKind tells us whether the field was branded by foreignKey, oneToOne, or manyToMany.\n TKind\n : never;\n\n// Forward relations live on the source model's own schema. A foreign key and a one-to-one field are both\n// single-valued from the source model's point of view, so both hydrate through selectRelated(...).\nexport type ForwardSingleRelations<TSourceModel> =\n HasStrictModelKey<TSourceModel> extends true\n ? // Strict source model: inspect its own schema and emit only fields that are forward single relations.\n {\n [TKey in keyof ModelShape<TSourceModel> as TKey extends string\n ? // Non-relation fields have no decorator brand and therefore map to never.\n [RelationKindOf<ModelShape<TSourceModel>[TKey]>] extends [never]\n ? never\n : // foreignKey and oneToOne are both single-valued when loaded from the source model.\n RelationKindOf<ModelShape<TSourceModel>[TKey]> extends\n | typeof InternalDecoratedFieldKind.FOREIGN_KEY\n | typeof InternalDecoratedFieldKind.ONE_TO_ONE\n ? // The relation must carry a typed model target; plain string refs cannot hydrate a typed result.\n RelationTarget<ModelShape<TSourceModel>[TKey]> extends AnyModel\n ? // The mapped-type key is the public relation name accepted by selectRelated(...).\n RelationName<TKey, RelationConfiguredName<ModelShape<TSourceModel>[TKey]>>\n : never\n : never\n : never]: {\n kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;\n target: RelationTarget<ModelShape<TSourceModel>[TKey]>;\n };\n }\n : // Weak source model: allow runtime strings but do not add precise hydrated result properties.\n Record<string, { kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY; target: AnyModel }>;\n\n// A reverse single relation is only visible when the caller supplies the target model generic. We inspect that\n// target model for a one-to-one field pointing back to the source model and use its relatedName.\nexport type ReverseSingleRelations<TSourceModel, TTargetModel> =\n HasStrictModelKey<TSourceModel> extends true\n ? // Reverse typing needs both the current source model and the away/target model to keep literal keys.\n HasStrictModelKey<TTargetModel> extends true\n ? {\n [TKey in keyof ModelShape<TTargetModel> as [RelationKindOf<ModelShape<TTargetModel>[TKey]>] extends [\n never,\n ]\n ? // Ignore ordinary fields on the away model.\n never\n : // Only oneToOne creates a single-valued reverse relation.\n RelationKindOf<\n ModelShape<TTargetModel>[TKey]\n > extends typeof InternalDecoratedFieldKind.ONE_TO_ONE\n ? // The away model's oneToOne target must point back at the current source model.\n ModelKeysMatch<RelationTarget<ModelShape<TTargetModel>[TKey]>, TSourceModel> extends true\n ? // The reverse call-site key is the away field's configured relatedName.\n RelatedName<RelationConfiguredRelatedName<ModelShape<TTargetModel>[TKey]>>\n : never\n : never]: {\n kind: typeof InternalDecoratedFieldKind.ONE_TO_ONE;\n target: TTargetModel;\n };\n }\n : // A widened target model cannot prove reverse relation names.\n // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {}\n : // Weak source model: allow runtime strings but do not add precise hydrated result properties.\n Record<string, { kind: typeof InternalDecoratedFieldKind.ONE_TO_ONE; target: AnyModel }>;\n\n// A reverse collection relation follows the same target-model inspection path, but only foreign keys produce hasMany.\nexport type ReverseCollectionRelations<TSourceModel, TTargetModel> =\n HasStrictModelKey<TSourceModel> extends true\n ? // Reverse collection typing also needs both model keys to remain literal.\n HasStrictModelKey<TTargetModel> extends true\n ? {\n [TKey in keyof ModelShape<TTargetModel> as [RelationKindOf<ModelShape<TTargetModel>[TKey]>] extends [\n never,\n ]\n ? // Ignore ordinary fields on the away model.\n never\n : // A foreign key on the away model creates a hasMany collection from the source model.\n RelationKindOf<\n ModelShape<TTargetModel>[TKey]\n > extends typeof InternalDecoratedFieldKind.FOREIGN_KEY\n ? // The away model's foreign key must point back at the current source model.\n ModelKeysMatch<RelationTarget<ModelShape<TTargetModel>[TKey]>, TSourceModel> extends true\n ? // The reverse call-site key is the away field's configured relatedName.\n RelatedName<RelationConfiguredRelatedName<ModelShape<TTargetModel>[TKey]>>\n : never\n : never]: {\n kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;\n target: TTargetModel;\n };\n }\n : // A widened target model cannot prove reverse relation names.\n // oxlint-disable-next-line typescript/ban-types, typescript/no-empty-object-type\n {}\n : // Weak source model: allow runtime strings but do not add precise hydrated result properties.\n Record<string, { kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY; target: AnyModel }>;\n\nexport type SelectRelatedRelations<TSourceModel, TTargetModel> = [TTargetModel] extends [undefined]\n ? // No target generic: selectRelated(...) can only use forward relations from the source schema.\n ForwardSingleRelations<TSourceModel>\n : // Target generic supplied: include reverse hasOne relations discovered on that target model.\n ForwardSingleRelations<TSourceModel> & ReverseSingleRelations<TSourceModel, TTargetModel>;\n\n// prefetchRelated(...) only loads collection relations in this pass, so it only accepts reverse hasMany metadata.\nexport type PrefetchRelatedRelations<TSourceModel, TTargetModel> = ReverseCollectionRelations<\n TSourceModel,\n TTargetModel\n>;\n\n// QuerySet method parameters need a string union of accepted relation names.\nexport type RelationKeys<TRelations> = Extract<keyof TRelations, string>;\n\n// Convert a selected relation-key union into the result object that fetch(...) exposes.\nexport type HydratedRelationMap<TRelations, TKeys extends string, TCardinality extends RelationHydrationCardinality> = {\n [TKey in TKeys]: TKey extends keyof TRelations\n ? // The relation map value carries the target model; infer that target so we can derive its row type.\n TRelations[TKey] extends { target: infer TTarget }\n ? // Single-valued relation hydration returns the target model or null when the join finds no row.\n TCardinality extends typeof InternalRelationHydrationCardinality.SINGLE\n ? ModelRow<TTarget> | null\n : // Collection relation hydration returns zero or more target model rows.\n ModelRow<TTarget>[]\n : never\n : never;\n};\n\nexport type MaybeHydratedRelationMap<\n TSourceModel,\n TRelations,\n TKeys extends string,\n TCardinality extends RelationHydrationCardinality,\n> =\n HasStrictModelKey<TSourceModel> extends true\n ? // Strict source model: materialize the requested hydrated relation properties into the fetched result type.\n HydratedRelationMap<TRelations, TKeys, TCardinality>\n : // Weak source model: preserve runtime support, but avoid pretending we know the hydrated result shape.\n Record<never, never>;\n","import type { QuerySetState } from '../domain/QuerySetState';\nimport type { TableMeta } from '../domain/TableMeta';\nimport { InternalRelationHydrationLoadMode, type RelationMeta } from '../domain/RelationMeta';\nimport { InternalRelationHydrationCardinality } from '../domain/RelationTyping';\nimport type { QueryHydrationPlanNode, QueryHydrationPlanRoot } from './domain/QueryHydrationPlan';\nimport { InternalRelationKind } from '../domain/internal/InternalRelationKind';\n\ntype RequestedMode = 'select' | 'prefetch';\n\ntype TraversalTrieNode = {\n segment: string;\n relationEdge: RelationMeta;\n relationPath: string;\n targetMeta: TableMeta;\n provenance: Set<string>;\n children: Map<string, TraversalTrieNode>;\n};\n\n/**\n * Parse, validate, normalize, and plan recursive relation hydration paths.\n */\nexport class QueryPlanner {\n static readonly BRAND = 'tango.orm.query_planner' as const;\n readonly __tangoBrand: typeof QueryPlanner.BRAND = QueryPlanner.BRAND;\n\n constructor(private readonly meta: TableMeta) {}\n\n static isQueryPlanner(value: unknown): value is QueryPlanner {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QueryPlanner.BRAND\n );\n }\n\n plan<T>(state: QuerySetState<T>): QueryHydrationPlanRoot {\n const requestedPaths = Array.from(new Set([...(state.selectRelated ?? []), ...(state.prefetchRelated ?? [])]));\n if (requestedPaths.length === 0) {\n return {\n joinNodes: [],\n prefetchNodes: [],\n requestedPaths: [],\n };\n }\n\n const rootChildren = new Map<string, TraversalTrieNode>();\n for (const relationPath of new Set(state.selectRelated ?? [])) {\n this.addPath(rootChildren, relationPath, 'select');\n }\n for (const relationPath of new Set(state.prefetchRelated ?? [])) {\n this.addPath(rootChildren, relationPath, 'prefetch');\n }\n\n const { joinNodes, prefetchNodes } = this.buildPlannedChildren(rootChildren);\n return {\n joinNodes,\n prefetchNodes,\n requestedPaths,\n };\n }\n\n private addPath(rootChildren: Map<string, TraversalTrieNode>, relationPath: string, mode: RequestedMode): void {\n const segments = relationPath.split('__').filter(Boolean);\n if (segments.length === 0) {\n throw new Error(`Invalid empty relation path '${relationPath}'.`);\n }\n\n let currentMeta = this.meta;\n let currentChildren = rootChildren;\n let builtPath = '';\n let containsCollection = false;\n\n for (const segment of segments) {\n const relation = currentMeta.relations?.[segment];\n if (!relation) {\n throw new Error(`Unknown relation path '${relationPath}' for table '${currentMeta.table}'.`);\n }\n if (segment in currentMeta.columns && relation.sourceKey !== segment) {\n throw new Error(\n `Relation path '${relationPath}' collides with an existing field on table '${currentMeta.table}'.`\n );\n }\n if (relation.kind === InternalRelationKind.MANY_TO_MANY) {\n throw new Error(`Relation path '${relationPath}' uses unsupported many-to-many hydration.`);\n }\n if (!relation.capabilities.queryable || !relation.capabilities.hydratable) {\n throw new Error(`Relation path '${relationPath}' cannot be hydrated.`);\n }\n\n if (mode === 'select') {\n if (\n relation.cardinality !== InternalRelationHydrationCardinality.SINGLE ||\n !relation.capabilities.joinable\n ) {\n throw new Error(`Relation path '${relationPath}' cannot be loaded with selectRelated(...).`);\n }\n } else if (relation.cardinality === InternalRelationHydrationCardinality.MANY) {\n if (!relation.capabilities.prefetchable) {\n throw new Error(`Relation path '${relationPath}' cannot be loaded with prefetchRelated(...).`);\n }\n containsCollection = true;\n } else if (!relation.capabilities.joinable) {\n throw new Error(`Relation path '${relationPath}' cannot be loaded with prefetchRelated(...).`);\n }\n\n const targetMeta = relation.targetMeta;\n if (!targetMeta) {\n throw new Error(`Relation path '${relationPath}' is missing target metadata.`);\n }\n\n builtPath = builtPath.length > 0 ? `${builtPath}__${segment}` : segment;\n const existing = currentChildren.get(segment);\n const nextNode =\n existing ??\n ({\n segment,\n relationEdge: relation,\n relationPath: builtPath,\n targetMeta,\n provenance: new Set<string>(),\n children: new Map<string, TraversalTrieNode>(),\n } satisfies TraversalTrieNode);\n nextNode.provenance.add(relationPath);\n currentChildren.set(segment, nextNode);\n currentChildren = nextNode.children;\n currentMeta = targetMeta;\n }\n\n if (mode === 'prefetch' && !containsCollection) {\n throw new Error(`Relation path '${relationPath}' cannot be loaded with prefetchRelated(...).`);\n }\n }\n\n private buildPlannedChildren(children: Map<string, TraversalTrieNode>): {\n joinNodes: QueryHydrationPlanNode[];\n prefetchNodes: QueryHydrationPlanNode[];\n } {\n const joinNodes: QueryHydrationPlanNode[] = [];\n const prefetchNodes: QueryHydrationPlanNode[] = [];\n\n for (const child of children.values()) {\n const { joinNodes: joinChildren, prefetchNodes: prefetchChildren } = this.buildPlannedChildren(\n child.children\n );\n const plannedNode: QueryHydrationPlanNode = {\n nodeId: child.relationPath,\n relationName: child.segment,\n relationPath: child.relationPath,\n ownerModelKey: child.relationEdge.sourceModelKey,\n relationEdge: child.relationEdge,\n targetModelKey: child.relationEdge.targetModelKey,\n loadMode:\n child.relationEdge.cardinality === InternalRelationHydrationCardinality.SINGLE\n ? InternalRelationHydrationLoadMode.JOIN\n : InternalRelationHydrationLoadMode.PREFETCH,\n cardinality: child.relationEdge.cardinality,\n provenance: [...child.provenance],\n joinChildren,\n prefetchChildren,\n };\n\n if (plannedNode.loadMode === InternalRelationHydrationLoadMode.JOIN) {\n joinNodes.push(plannedNode);\n } else {\n prefetchNodes.push(plannedNode);\n }\n }\n\n return { joinNodes, prefetchNodes };\n }\n}\n","import { isError } from '@danceroutine/tango-core';\nimport type { LookupType } from '../domain/LookupType';\nimport type { QuerySetState } from '../domain/QuerySetState';\nimport type { TableMeta } from '../domain/TableMeta';\nimport type { QNode } from '../domain/QNode';\nimport type {\n CompiledHydrationNode,\n CompiledHydrationPlanRoot,\n CompiledJoinHydrationDescriptor,\n CompiledPrefetchQuery,\n CompiledQuery,\n} from '../domain/CompiledQuery';\nimport type { WhereClause } from '../domain/WhereClause';\nimport type { FilterInput } from '../domain/FilterInput';\nimport type { Dialect } from '../domain/Dialect';\nimport { InternalRelationHydrationLoadMode } from '../domain/RelationMeta';\nimport { InternalDialect } from '../domain/internal/InternalDialect';\nimport { InternalQNodeType } from '../domain/internal/InternalQNodeType';\nimport { InternalLookupType } from '../domain/internal/InternalLookupType';\nimport { OrmSqlSafetyAdapter } from '../../validation';\nimport { QueryPlanner } from '../planning';\nimport type { QueryHydrationPlanNode } from '../planning';\n\nconst sqlSafetyAdapter = new OrmSqlSafetyAdapter();\n\ntype JoinCollection = {\n selects: string[];\n joins: string[];\n};\n\n/**\n * Compiles immutable `QuerySet` state into parameterized SQL and recursive\n * hydration execution artifacts.\n */\nexport class QueryCompiler {\n static readonly BRAND = 'tango.orm.query_compiler' as const;\n readonly __tangoBrand: typeof QueryCompiler.BRAND = QueryCompiler.BRAND;\n\n constructor(\n private meta: TableMeta,\n private dialect: Dialect = InternalDialect.POSTGRES\n ) {}\n\n static isQueryCompiler(value: unknown): value is QueryCompiler {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QueryCompiler.BRAND\n );\n }\n\n compile<T>(state: QuerySetState<T>): CompiledQuery {\n const hydrationPlan = new QueryPlanner(this.meta).plan(state);\n const validatedPlan = sqlSafetyAdapter.validate({\n kind: 'select',\n meta: this.meta,\n selectFields: state.select?.map(String),\n filterKeys: this.collectStateFilterKeys(state),\n orderFields: state.order?.map((order) => String(order.by)),\n relationNames: [],\n });\n const table = validatedPlan.meta.table;\n const whereParts: string[] = [];\n const params: unknown[] = [];\n\n if (state.q) {\n const result = this.compileQNode(state.q, params.length + 1, validatedPlan.filterKeys);\n if (result.sql) {\n whereParts.push(result.sql);\n params.push(...result.params);\n }\n }\n\n state.excludes?.forEach((exclude) => {\n const result = this.compileQNode(\n { kind: InternalQNodeType.NOT, node: exclude },\n params.length + 1,\n validatedPlan.filterKeys\n );\n if (result.sql) {\n whereParts.push(result.sql);\n params.push(...result.params);\n }\n });\n\n const baseSelects = state.select?.length\n ? state.select.map((field) => validatedPlan.selectFields[String(field)]!)\n : [`${table}.*`];\n const joinCollection: JoinCollection = { selects: [], joins: [] };\n const hiddenRootAliases: string[] = [];\n\n const compiledJoinNodes = hydrationPlan.joinNodes.map((node) =>\n this.compileHydrationNode(node, {\n rootTable: table,\n ownerMeta: this.meta,\n ownerAlias: table,\n collectRootJoins: true,\n rootSelectedFields: state.select?.map(String) ?? undefined,\n hiddenRootAliases,\n joinCollection,\n })\n );\n const compiledPrefetchNodes = hydrationPlan.prefetchNodes.map((node) =>\n this.compileHydrationNode(node, {\n rootTable: table,\n ownerMeta: this.meta,\n ownerAlias: table,\n collectRootJoins: false,\n rootSelectedFields: state.select?.map(String) ?? undefined,\n hiddenRootAliases,\n joinCollection,\n })\n );\n\n const select = [\n ...baseSelects,\n ...joinCollection.selects,\n ...this.buildRootHiddenSelects(compiledPrefetchNodes, table),\n ].join(', ');\n const whereSQL = whereParts.length ? ` WHERE ${whereParts.join(' AND ')}` : '';\n const orderSQL = ` ORDER BY ${\n state.order?.length\n ? state.order\n .map((order) => `${validatedPlan.orderFields[String(order.by)]!} ${order.dir.toUpperCase()}`)\n .join(', ')\n : `${table}.${validatedPlan.meta.pk} ASC`\n }`;\n const limitSQL = state.limit ? ` LIMIT ${state.limit}` : '';\n const offsetSQL = state.offset ? ` OFFSET ${state.offset}` : '';\n const sql = `SELECT ${select} FROM ${table}${joinCollection.joins.length ? ` ${joinCollection.joins.join(' ')}` : ''}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`;\n\n const compiledHydrationPlan: CompiledHydrationPlanRoot | undefined =\n compiledJoinNodes.length > 0 || compiledPrefetchNodes.length > 0\n ? {\n requestedPaths: hydrationPlan.requestedPaths,\n hiddenRootAliases: [...new Set(hiddenRootAliases)],\n joinNodes: compiledJoinNodes,\n prefetchNodes: compiledPrefetchNodes,\n }\n : undefined;\n\n return {\n sql,\n params,\n hydrationPlan: compiledHydrationPlan,\n };\n }\n\n compilePrefetch(node: CompiledHydrationNode, sourceValues: readonly (string | number)[]): CompiledPrefetchQuery {\n const placeholders =\n this.dialect === InternalDialect.POSTGRES\n ? sourceValues.map((_, index) => `$${index + 1}`).join(', ')\n : sourceValues.map(() => '?').join(', ');\n const validatedTarget = this.validatePrefetchTarget(node);\n const baseAlias = this.buildPrefetchBaseAlias(node.relationPath);\n const joinCollection: JoinCollection = { selects: [], joins: [] };\n\n for (const joinChild of node.joinChildren) {\n this.collectNestedJoinSql(joinChild, baseAlias, validatedTarget.columns, joinCollection);\n }\n\n const baseSelects = Object.keys(validatedTarget.columns).map((column) => `${baseAlias}.${column} AS ${column}`);\n return {\n sql: `SELECT ${[...baseSelects, ...joinCollection.selects].join(', ')} FROM ${validatedTarget.table} ${baseAlias}${joinCollection.joins.length ? ` ${joinCollection.joins.join(' ')}` : ''} WHERE ${baseAlias}.${validatedTarget.targetKey} IN (${placeholders}) ORDER BY ${baseAlias}.${validatedTarget.targetKey} ASC, ${baseAlias}.${validatedTarget.primaryKey} ASC`,\n params: sourceValues,\n targetKey: validatedTarget.targetKey,\n targetColumns: validatedTarget.columns,\n };\n }\n\n private compileHydrationNode(\n node: QueryHydrationPlanNode,\n context: {\n rootTable: string;\n ownerMeta: TableMeta;\n ownerAlias: string;\n collectRootJoins: boolean;\n rootSelectedFields?: readonly string[];\n hiddenRootAliases: string[];\n joinCollection: JoinCollection;\n }\n ): CompiledHydrationNode {\n const validatedRelation = this.validateHydrationRelation(context.ownerMeta, node.relationName);\n const targetColumns = validatedRelation.targetColumns;\n const targetMeta = node.relationEdge.targetMeta;\n if (!targetMeta) {\n throw new Error(`Relation path '${node.relationPath}' is missing target metadata.`);\n }\n const compiledJoinChildren = node.joinChildren.map((child) =>\n this.compileHydrationNode(child, {\n ...context,\n ownerMeta: targetMeta,\n ownerAlias: this.buildJoinAlias(node.relationPath),\n collectRootJoins: context.collectRootJoins,\n })\n );\n const compiledPrefetchChildren = node.prefetchChildren.map((child) =>\n this.compileHydrationNode(child, {\n ...context,\n ownerMeta: targetMeta,\n ownerAlias: this.buildJoinAlias(node.relationPath),\n collectRootJoins: false,\n })\n );\n\n let joinDescriptor: CompiledJoinHydrationDescriptor | undefined;\n if (node.loadMode === InternalRelationHydrationLoadMode.JOIN) {\n joinDescriptor = {\n alias: this.buildJoinAlias(node.relationPath),\n columns: Object.fromEntries(\n Object.keys(targetColumns).map((column) => [\n column,\n this.buildHydrationColumnAlias(node.relationPath, column),\n ])\n ),\n };\n\n if (context.collectRootJoins) {\n context.joinCollection.joins.push(\n `LEFT JOIN ${validatedRelation.table} ${joinDescriptor.alias} ON ${joinDescriptor.alias}.${validatedRelation.targetKey} = ${context.ownerAlias}.${validatedRelation.sourceKey}`\n );\n context.joinCollection.selects.push(\n ...Object.entries(joinDescriptor.columns).map(\n ([column, alias]) => `${joinDescriptor!.alias}.${column} AS ${alias}`\n )\n );\n }\n }\n\n const ownerSourceAccessor =\n node.loadMode === InternalRelationHydrationLoadMode.PREFETCH &&\n context.collectRootJoins === false &&\n context.ownerAlias === context.rootTable &&\n context.rootSelectedFields?.length &&\n !context.rootSelectedFields.includes(validatedRelation.sourceKey)\n ? this.buildPrefetchSourceAlias(node.relationPath, validatedRelation.sourceKey)\n : validatedRelation.sourceKey;\n\n if (\n node.loadMode === InternalRelationHydrationLoadMode.PREFETCH &&\n ownerSourceAccessor !== validatedRelation.sourceKey\n ) {\n context.hiddenRootAliases.push(ownerSourceAccessor);\n }\n\n return {\n nodeId: node.nodeId,\n relationName: node.relationName,\n relationPath: node.relationPath,\n ownerModelKey: node.ownerModelKey,\n targetModelKey: node.targetModelKey,\n loadMode: node.loadMode,\n cardinality: node.cardinality,\n sourceKey: validatedRelation.sourceKey,\n ownerSourceAccessor,\n targetKey: validatedRelation.targetKey,\n targetTable: validatedRelation.table,\n targetPrimaryKey: node.relationEdge.targetPrimaryKey,\n targetColumns,\n provenance: node.provenance,\n joinChildren: compiledJoinChildren,\n prefetchChildren: compiledPrefetchChildren,\n join: joinDescriptor,\n };\n }\n\n private validateHydrationRelation(\n ownerMeta: TableMeta,\n relationName: string\n ): NonNullable<TableMeta['relations']>[string] {\n return sqlSafetyAdapter.validate({\n kind: 'select',\n meta: ownerMeta,\n relationNames: [relationName],\n }).relations[relationName]!;\n }\n\n private buildRootHiddenSelects(nodes: readonly CompiledHydrationNode[], table: string): string[] {\n return nodes.flatMap((node) => {\n const select =\n node.ownerSourceAccessor !== node.sourceKey\n ? [`${table}.${node.sourceKey} AS ${node.ownerSourceAccessor}`]\n : [];\n return [...select, ...this.buildRootHiddenSelects(node.prefetchChildren, table)];\n });\n }\n\n private validatePrefetchTarget(node: CompiledHydrationNode): {\n table: string;\n primaryKey: string;\n targetKey: string;\n columns: Record<string, string>;\n } {\n try {\n const validated = sqlSafetyAdapter.validate({\n kind: 'select',\n meta: {\n table: node.targetTable,\n pk: node.targetPrimaryKey,\n columns: node.targetColumns,\n },\n filterKeys: [node.targetKey],\n });\n\n return {\n table: validated.meta.table,\n primaryKey: validated.meta.pk,\n targetKey: validated.filterKeys[node.targetKey]!.field,\n columns: validated.meta.columns,\n };\n } catch (error) {\n const message = isError(error) ? error.message : String(error);\n throw new Error(`Compiled prefetch query failed validation: ${message}`, { cause: error });\n }\n }\n\n private collectNestedJoinSql(\n node: CompiledHydrationNode,\n ownerAlias: string,\n ownerColumns: Record<string, string>,\n collection: JoinCollection\n ): void {\n if (!node.join) {\n return;\n }\n\n const validatedTarget = this.validatePrefetchJoinTarget(node, ownerColumns);\n const validatedJoinAlias = this.validateInternalAlias(node.join.alias);\n const validatedJoinColumns = Object.fromEntries(\n Object.entries(node.join.columns).map(([column, alias]) => {\n if (!(column in validatedTarget.columns)) {\n throw new Error(\n `Compiled prefetch query failed validation: unknown nested join column '${column}'.`\n );\n }\n return [column, this.validateInternalAlias(alias)];\n })\n );\n\n collection.joins.push(\n `LEFT JOIN ${validatedTarget.table} ${validatedJoinAlias} ON ${validatedJoinAlias}.${validatedTarget.targetKey} = ${ownerAlias}.${node.sourceKey}`\n );\n collection.selects.push(\n ...Object.entries(validatedJoinColumns).map(\n ([column, alias]) => `${validatedJoinAlias}.${column} AS ${alias}`\n )\n );\n\n for (const child of node.joinChildren) {\n this.collectNestedJoinSql(child, validatedJoinAlias, validatedTarget.columns, collection);\n }\n }\n\n private validatePrefetchJoinTarget(\n node: CompiledHydrationNode,\n ownerColumns: Record<string, string>\n ): {\n table: string;\n primaryKey: string;\n targetKey: string;\n columns: Record<string, string>;\n } {\n if (!(node.sourceKey in ownerColumns)) {\n throw new Error(\n `Compiled prefetch query failed validation: unknown owner column '${node.sourceKey}' for nested join.`\n );\n }\n\n return this.validatePrefetchTarget(node);\n }\n\n private validateInternalAlias(alias: string): string {\n if (!/^__tango_[A-Za-z0-9_]+$/.test(alias)) {\n throw new Error(`Compiled prefetch query failed validation: invalid internal alias '${alias}'.`);\n }\n\n return alias;\n }\n\n private buildJoinAlias(relationPath: string): string {\n return this.assertInternalAliasDoesNotCollide(`__tango_join_${this.sanitizeRelationPath(relationPath)}`);\n }\n\n private buildPrefetchBaseAlias(relationPath: string): string {\n return this.assertInternalAliasDoesNotCollide(\n `__tango_prefetch_base_${this.sanitizeRelationPath(relationPath)}`\n );\n }\n\n private buildHydrationColumnAlias(relationPath: string, column: string): string {\n return this.assertInternalAliasDoesNotCollide(\n `__tango_hydrate_${this.sanitizeRelationPath(relationPath)}_${column}`\n );\n }\n\n private buildPrefetchSourceAlias(relationPath: string, sourceKey: string): string {\n return this.assertInternalAliasDoesNotCollide(\n `__tango_prefetch_${this.sanitizeRelationPath(relationPath)}_${sourceKey}`\n );\n }\n\n private sanitizeRelationPath(relationPath: string): string {\n return relationPath.replace(/[^a-zA-Z0-9]+/g, '_');\n }\n\n private assertInternalAliasDoesNotCollide(alias: string): string {\n if (alias in this.meta.columns) {\n throw new Error(`Internal query alias '${alias}' collides with a field on table '${this.meta.table}'.`);\n }\n return alias;\n }\n\n private compileQNode<T>(\n node: QNode<T>,\n paramIndex: number,\n filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>\n ): WhereClause {\n switch (node.kind) {\n case InternalQNodeType.ATOM:\n return this.compileAtom(node.where || {}, paramIndex, filterKeys);\n case InternalQNodeType.AND:\n return this.compileAnd(node.nodes || [], paramIndex, filterKeys);\n case InternalQNodeType.OR:\n return this.compileOr(node.nodes || [], paramIndex, filterKeys);\n case InternalQNodeType.NOT:\n return this.compileNot(node.node!, paramIndex, filterKeys);\n default:\n return { sql: '', params: [] };\n }\n }\n\n private compileAtom<T>(\n where: FilterInput<T>,\n paramIndex: number,\n filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>\n ): WhereClause {\n const entries = Object.entries(where).filter(([, value]) => value !== undefined);\n\n const { parts, params } = entries.reduce<{ parts: string[]; params: unknown[] }>(\n (accumulator, [key, value]) => {\n const descriptor = filterKeys[String(key)]!;\n const idx = paramIndex + accumulator.params.length;\n const clause = this.lookupToSQL(descriptor.qualifiedColumn, descriptor.lookup, value, idx);\n accumulator.parts.push(clause.sql);\n accumulator.params.push(...clause.params);\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' AND ')})` : '',\n params,\n };\n }\n\n private compileAnd<T>(\n nodes: QNode<T>[],\n paramIndex: number,\n filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>\n ): WhereClause {\n const { parts, params } = nodes.reduce<{ parts: string[]; params: unknown[] }>(\n (accumulator, node) => {\n const result = this.compileQNode(node, paramIndex + accumulator.params.length, filterKeys);\n if (result.sql) {\n accumulator.parts.push(result.sql);\n accumulator.params.push(...result.params);\n }\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' AND ')})` : '',\n params,\n };\n }\n\n private compileOr<T>(\n nodes: QNode<T>[],\n paramIndex: number,\n filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>\n ): WhereClause {\n const { parts, params } = nodes.reduce<{ parts: string[]; params: unknown[] }>(\n (accumulator, node) => {\n const result = this.compileQNode(node, paramIndex + accumulator.params.length, filterKeys);\n if (result.sql) {\n accumulator.parts.push(result.sql);\n accumulator.params.push(...result.params);\n }\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' OR ')})` : '',\n params,\n };\n }\n\n private compileNot<T>(\n node: QNode<T>,\n paramIndex: number,\n filterKeys: Record<string, { lookup: LookupType; qualifiedColumn: string }>\n ): WhereClause {\n const result = this.compileQNode(node, paramIndex, filterKeys);\n if (!result.sql) {\n return { sql: '', params: [] };\n }\n\n return {\n sql: `(NOT ${result.sql})`,\n params: result.params,\n };\n }\n\n private lookupToSQL(col: string, lookup: LookupType, value: unknown, paramIndex: number): WhereClause {\n const placeholder = this.dialect === InternalDialect.POSTGRES ? `$${paramIndex}` : '?';\n const normalized = this.normalizeParam(value);\n\n switch (lookup) {\n case InternalLookupType.EXACT:\n if (value === null) {\n return { sql: `${col} IS NULL`, params: [] };\n }\n return { sql: `${col} = ${placeholder}`, params: [normalized] };\n case InternalLookupType.LT:\n return { sql: `${col} < ${placeholder}`, params: [normalized] };\n case InternalLookupType.LTE:\n return { sql: `${col} <= ${placeholder}`, params: [normalized] };\n case InternalLookupType.GT:\n return { sql: `${col} > ${placeholder}`, params: [normalized] };\n case InternalLookupType.GTE:\n return { sql: `${col} >= ${placeholder}`, params: [normalized] };\n case InternalLookupType.IN: {\n const entries = (Array.isArray(value) ? value : [value]).map((entry) => this.normalizeParam(entry));\n if (entries.length === 0) {\n return { sql: '1=0', params: [] };\n }\n const placeholders =\n this.dialect === InternalDialect.POSTGRES\n ? entries.map((_, index) => `$${paramIndex + index}`).join(', ')\n : entries.map(() => '?').join(', ');\n return { sql: `${col} IN (${placeholders})`, params: entries };\n }\n case InternalLookupType.ISNULL:\n return { sql: value ? `${col} IS NULL` : `${col} IS NOT NULL`, params: [] };\n case InternalLookupType.CONTAINS:\n return { sql: `${col} LIKE ${placeholder}`, params: [`%${value}%`] };\n case InternalLookupType.ICONTAINS: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`%${String(value).toLowerCase()}%`] };\n }\n case InternalLookupType.STARTSWITH:\n return { sql: `${col} LIKE ${placeholder}`, params: [`${value}%`] };\n case InternalLookupType.ISTARTSWITH: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`${String(value).toLowerCase()}%`] };\n }\n case InternalLookupType.ENDSWITH:\n return { sql: `${col} LIKE ${placeholder}`, params: [`%${value}`] };\n case InternalLookupType.IENDSWITH: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`%${String(value).toLowerCase()}`] };\n }\n default:\n throw new Error(`Unknown lookup: ${lookup}`);\n }\n }\n\n private normalizeParam(value: unknown): unknown {\n if (this.dialect === InternalDialect.SQLITE && typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return value;\n }\n\n private collectStateFilterKeys<T>(state: QuerySetState<T>): string[] {\n const filterKeys = new Set<string>();\n if (state.q) {\n this.collectNodeFilterKeys(state.q, filterKeys);\n }\n\n state.excludes?.forEach((exclude) => this.collectNodeFilterKeys(exclude, filterKeys));\n return [...filterKeys];\n }\n\n private collectNodeFilterKeys<T>(node: QNode<T>, filterKeys: Set<string>): void {\n Object.keys(node.where ?? {}).forEach((key) => filterKeys.add(key));\n node.nodes?.forEach((child) => this.collectNodeFilterKeys(child, filterKeys));\n if (node.node) {\n this.collectNodeFilterKeys(node.node, filterKeys);\n }\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { QueryCompiler } from './QueryCompiler';\n","import { getLogger } from '@danceroutine/tango-core';\n\nlet didWarnDeprecatedResults = false;\n\n/**\n * Values materialized by {@link QuerySet.fetch}, iterable like an array plus `length`, `map`, `at`, and `toArray`.\n *\n * Prefer iteration or `items` over the deprecated `results` getter, which warns once per process when accessed.\n */\nexport class QueryResult<T> implements Iterable<T> {\n static readonly BRAND = 'tango.orm.query_result' as const;\n readonly __tangoBrand: typeof QueryResult.BRAND = QueryResult.BRAND;\n\n readonly items: readonly T[];\n\n constructor(items: readonly T[]) {\n this.items = items;\n }\n\n /**\n * Runtime narrowing for values that may be a plain array or a `QueryResult` instance.\n */\n static isQueryResult<T>(value: unknown): value is QueryResult<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QueryResult.BRAND\n );\n }\n\n /**\n * Sync iteration over materialized rows.\n */\n [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n /** Number of materialized rows. */\n get length(): number {\n return this.items.length;\n }\n\n /** Same as `Array#map` on the materialized rows. */\n map<U>(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: unknown): U[] {\n return this.items.map(callbackfn, thisArg);\n }\n\n /** Indexed read with support for negative indices, like `Array#at`. */\n at(index: number): T | undefined {\n return this.items.at(index);\n }\n\n /** Returns a shallow copy of the materialized rows as a plain array. */\n toArray(): T[] {\n return [...this.items];\n }\n\n /**\n * @deprecated Use iteration, `length`, `map`, or `toArray()` instead.\n */\n get results(): readonly T[] {\n if (!didWarnDeprecatedResults) {\n didWarnDeprecatedResults = true;\n getLogger('tango.orm.query_result').warn(\n '`QueryResult.results` is deprecated. Use iteration, `length`, `map`, or `toArray()` instead.'\n );\n }\n return this.items;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport type { CompiledQuery } from './CompiledQuery';\nexport type { Dialect } from './Dialect';\nexport type { Direction } from './Direction';\nexport type { FilterInput } from './FilterInput';\nexport type { FilterKey } from './FilterKey';\nexport type { FilterValue } from './FilterValue';\nexport type { LookupType } from './LookupType';\nexport type { OrderSpec } from './OrderSpec';\nexport type { OrderToken } from './OrderToken';\nexport type { QNode } from './QNode';\nexport { QueryResult } from './QueryResult';\nexport type { QuerySetState } from './QuerySetState';\nexport type { RelationMeta } from './RelationMeta';\nexport type {\n ForwardSingleRelations,\n GeneratedHydratedRelationMap,\n GeneratedPrefetchRelatedPathKeys,\n GeneratedSelectRelatedPathKeys,\n HydratedQueryResult,\n HydratedRelationMap,\n ManyRelationHydrationCardinality,\n MaybeHydratedRelationMap,\n PrefetchRelatedRelations,\n RelationKeys,\n RelationHydrationCardinality,\n ReverseCollectionRelations,\n ReverseSingleRelations,\n SelectRelatedRelations,\n SingleRelationHydrationCardinality,\n} from './RelationTyping';\nexport { InternalRelationHydrationCardinality } from './RelationTyping';\nexport type { TableMeta } from './TableMeta';\nexport { TableMetaFactory } from './TableMetaFactory';\nexport type { WhereClause } from './WhereClause';\n","export const InternalDirection = {\n ASC: 'asc',\n DESC: 'desc',\n} as const;\n","import type { QNode } from './domain/QNode';\nimport type { FilterInput } from './domain/FilterInput';\nimport { InternalQNodeType } from './domain/internal/InternalQNodeType';\n\n/**\n * Static builder for composing boolean query expressions.\n *\n * This mirrors Django's `Q(...)` composition patterns and is intended\n * for ergonomic construction of nested `AND`/`OR`/`NOT` trees.\n */\nexport class QBuilder {\n static readonly BRAND = 'tango.orm.q_builder' as const;\n readonly __tangoBrand: typeof QBuilder.BRAND = QBuilder.BRAND;\n\n /**\n * Narrow an unknown value to `QBuilder`.\n */\n static isQBuilder(value: unknown): value is QBuilder {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QBuilder.BRAND\n );\n }\n\n /**\n * Combine multiple filter fragments using logical `AND`.\n */\n static and<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T> {\n return {\n kind: InternalQNodeType.AND,\n nodes: nodes.map(QBuilder.wrapNode),\n };\n }\n\n /**\n * Combine multiple filter fragments using logical `OR`.\n */\n static or<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T> {\n return {\n kind: InternalQNodeType.OR,\n nodes: nodes.map(QBuilder.wrapNode),\n };\n }\n\n /**\n * Negate a filter fragment using logical `NOT`.\n */\n static not<T>(node: FilterInput<T> | QNode<T>): QNode<T> {\n return {\n kind: InternalQNodeType.NOT,\n node: QBuilder.wrapNode(node),\n };\n }\n\n private static wrapNode<T>(input: FilterInput<T> | QNode<T>): QNode<T> {\n if ((input as QNode<T>).kind) {\n return input as QNode<T>;\n }\n return {\n kind: InternalQNodeType.ATOM,\n where: input as FilterInput<T>,\n };\n }\n}\n","import type { DBClient } from '../connection/clients/DBClient';\nimport type { Dialect } from './domain/Dialect';\nimport type { QuerySetState } from './domain/QuerySetState';\nimport type { TableMeta } from './domain/TableMeta';\nimport type { QNode } from './domain/QNode';\nimport type { OrderToken } from './domain/OrderToken';\nimport type { FilterInput } from './domain/FilterInput';\nimport type { CompiledQuery } from './domain/CompiledQuery';\nimport type { CompiledHydrationNode } from './domain/CompiledQuery';\nimport { QueryResult } from './domain/QueryResult';\nimport type {\n GeneratedHydratedRelationMap,\n GeneratedPrefetchRelatedPathKeys,\n GeneratedSelectRelatedPathKeys,\n HydratedQueryResult,\n ManyRelationHydrationCardinality,\n MaybeHydratedRelationMap,\n PrefetchRelatedRelations,\n RelationKeys,\n SelectRelatedRelations,\n SingleRelationHydrationCardinality,\n} from './domain/RelationTyping';\nimport { InternalRelationHydrationCardinality } from './domain/RelationTyping';\nimport { InternalQNodeType } from './domain/internal/InternalQNodeType';\nimport { InternalDirection } from './domain/internal/InternalDirection';\nimport { InternalDialect } from './domain/internal/InternalDialect';\nimport { QBuilder as Q } from './QBuilder';\nimport { QueryCompiler } from './compiler';\n\n/**\n * Query execution seam consumed by `QuerySet`.\n *\n * Application code usually reaches this through `Model.objects` or testing\n * fixtures rather than implementing it directly.\n *\n * @template TModel - The model row type returned by the database client\n */\nexport interface QueryExecutor<TModel> {\n meta: TableMeta;\n client: DBClient;\n dialect: Dialect;\n run(compiled: CompiledQuery): Promise<TModel[]>;\n}\n\ntype QueryShapeFunction<TInput, TOutput> = (row: TInput) => TOutput;\n\ntype QueryShapeParser<TInput, TOutput> = {\n parse: (row: TInput) => TOutput;\n};\n\ntype QueryShape<TInput> = QueryShapeFunction<TInput, unknown> | QueryShapeParser<TInput, unknown>;\n\ntype QueryShapeOutput<TInput, TShape> =\n TShape extends QueryShapeFunction<TInput, infer TOutput>\n ? TOutput\n : TShape extends QueryShapeParser<TInput, infer TOutput>\n ? TOutput\n : never;\n\ntype TargetColumnMetadata = {\n targetColumns: Record<string, string>;\n};\n\ntype ProjectedResult<\n TModel extends Record<string, unknown>,\n TKeys extends readonly (keyof TModel)[],\n> = number extends TKeys['length'] ? TModel : [TKeys[number]] extends [never] ? TModel : Pick<TModel, TKeys[number]>;\n\n/**\n * Django-inspired query builder for constructing and executing database queries.\n * Provides a fluent API for filtering, ordering, pagination, projection, and\n * nested relation hydration.\n *\n * Refinements such as `filter`, `orderBy`, `select`, and relation loaders build\n * query state only. SQL runs when you call an evaluation method (`fetch`,\n * `fetchOne`, `count`, `exists`, or `for await` over this queryset). After the\n * first row-returning evaluation, this queryset instance reuses its cached\n * materialized result on later `fetch()` or async-iteration calls.\n *\n * @template TModel - The full model row type used for query composition\n * @template TBaseResult - The selected base-row shape returned by execution methods\n * @template TSourceModel - The source Tango model used for typed relation metadata\n * @template THydrated - Relation properties accumulated by eager-loading calls\n *\n * @example\n * ```typescript\n * const users = await TodoModel.objects\n * .query()\n * .filter({ active: true })\n * .filter(Q.or({ role: 'admin' }, { role: 'moderator' }))\n * .orderBy('-createdAt')\n * .limit(10)\n * .fetch();\n * ```\n */\nexport class QuerySet<\n TModel extends Record<string, unknown>,\n TBaseResult extends Record<string, unknown> = TModel,\n TSourceModel = unknown,\n THydrated extends Record<string, unknown> = Record<never, never>,\n> implements AsyncIterable<HydratedQueryResult<TBaseResult, THydrated>>\n{\n static readonly BRAND = 'tango.orm.query_set' as const;\n readonly __tangoBrand: typeof QuerySet.BRAND = QuerySet.BRAND;\n private evaluationCache?: Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated>>>;\n\n constructor(\n private executor: QueryExecutor<TModel>,\n private state: QuerySetState<TModel> = {}\n ) {}\n\n /**\n * Narrow an unknown value to `QuerySet`.\n */\n static isQuerySet<TModel extends Record<string, unknown>, TResult extends Record<string, unknown> = TModel>(\n value: unknown\n ): value is QuerySet<TModel, TResult> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QuerySet.BRAND\n );\n }\n\n /**\n * Add a filter expression to the query.\n *\n * Multiple `filter()` calls are composed with `AND`.\n */\n filter(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel, TBaseResult, TSourceModel, THydrated> {\n const wrapped: QNode<TModel> = (q as QNode<TModel>).kind\n ? (q as QNode<TModel>)\n : { kind: InternalQNodeType.ATOM, where: q as FilterInput<TModel> };\n const merged = this.state.q ? Q.and(this.state.q, wrapped) : wrapped;\n return new QuerySet(this.executor, { ...this.state, q: merged });\n }\n\n /**\n * Add an exclusion expression to the query.\n *\n * Exclusions are translated to `NOT (...)` predicates.\n */\n exclude(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel, TBaseResult, TSourceModel, THydrated> {\n const wrapped: QNode<TModel> = (q as QNode<TModel>).kind\n ? (q as QNode<TModel>)\n : { kind: InternalQNodeType.ATOM, where: q as FilterInput<TModel> };\n const excludes = [...(this.state.excludes ?? []), wrapped];\n return new QuerySet(this.executor, { ...this.state, excludes });\n }\n\n /**\n * Apply ordering tokens such as `'name'` or `'-createdAt'`.\n */\n orderBy(...tokens: OrderToken<TModel>[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated> {\n const order = tokens.map((t) => {\n const str = String(t);\n if (str.startsWith('-')) {\n return { by: str.slice(1) as keyof TModel, dir: InternalDirection.DESC };\n }\n return { by: t as keyof TModel, dir: InternalDirection.ASC };\n });\n return new QuerySet(this.executor, { ...this.state, order });\n }\n\n /**\n * Limit the maximum number of rows returned.\n */\n limit(n: number): QuerySet<TModel, TBaseResult, TSourceModel, THydrated> {\n return new QuerySet(this.executor, { ...this.state, limit: n });\n }\n\n /**\n * Skip the first `n` rows.\n */\n offset(n: number): QuerySet<TModel, TBaseResult, TSourceModel, THydrated> {\n return new QuerySet(this.executor, { ...this.state, offset: n });\n }\n\n /**\n * Restrict selected fields and narrow the fetched row type when the\n * selected keys are known precisely at the call site.\n *\n * Empty selections reset back to the full model row, and repeated\n * `select(...)` calls replace the previous projection rather than\n * intersecting it.\n */\n select<const TKeys extends readonly (keyof TModel)[]>(\n fields: TKeys\n ): QuerySet<TModel, ProjectedResult<TModel, TKeys>, TSourceModel, THydrated>;\n select(\n fields: readonly (keyof TModel)[]\n ): QuerySet<TModel, ProjectedResult<TModel, readonly (keyof TModel)[]>, TSourceModel, THydrated>;\n select(\n fields: readonly (keyof TModel)[]\n ): QuerySet<TModel, ProjectedResult<TModel, readonly (keyof TModel)[]>, TSourceModel, THydrated> {\n return new QuerySet(this.executor, { ...this.state, select: [...fields] as (keyof TModel)[] });\n }\n\n /**\n * Hydrate single-valued relation paths through SQL joins.\n *\n * Forward `belongsTo` relations can be inferred from the source model's\n * field-authored relation metadata. Reverse `hasOne` relations can be\n * selected with a target model generic when the target model points back to\n * the source model. Generated relation typing also enables nested `__`\n * path keys for applications that keep the app-local registry current.\n */\n selectRelated<\n TTargetModel = undefined,\n const TRelationName extends\n | RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>\n | GeneratedSelectRelatedPathKeys<TSourceModel> =\n | RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>\n | GeneratedSelectRelatedPathKeys<TSourceModel>,\n >(\n ...rels: readonly TRelationName[]\n ): QuerySet<\n TModel,\n TBaseResult,\n TSourceModel,\n THydrated &\n MaybeHydratedRelationMap<\n TSourceModel,\n SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>,\n Extract<TRelationName, RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>,\n SingleRelationHydrationCardinality\n > &\n GeneratedHydratedRelationMap<\n TSourceModel,\n Extract<TRelationName, GeneratedSelectRelatedPathKeys<TSourceModel>>\n >\n > {\n return new QuerySet(this.executor, { ...this.state, selectRelated: [...rels] });\n }\n\n /**\n * Hydrate collection-rooted relation paths with follow-up queries.\n *\n * Reverse `hasMany` relations can be prefetched with a target model generic\n * when the target model points back to the source model. Generated relation\n * typing also enables nested `__` path keys for applications that keep the\n * app-local registry current.\n */\n prefetchRelated<\n TTargetModel = undefined,\n const TRelationName extends\n | RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>\n | GeneratedPrefetchRelatedPathKeys<TSourceModel> =\n | RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>\n | GeneratedPrefetchRelatedPathKeys<TSourceModel>,\n >(\n ...rels: readonly TRelationName[]\n ): QuerySet<\n TModel,\n TBaseResult,\n TSourceModel,\n THydrated &\n MaybeHydratedRelationMap<\n TSourceModel,\n PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>,\n Extract<TRelationName, RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>,\n ManyRelationHydrationCardinality\n > &\n GeneratedHydratedRelationMap<\n TSourceModel,\n Extract<TRelationName, GeneratedPrefetchRelatedPathKeys<TSourceModel>>\n >\n > {\n return new QuerySet(this.executor, { ...this.state, prefetchRelated: [...rels] });\n }\n\n /**\n * Execute the query and optionally shape each row.\n *\n * When the queryset has been narrowed by `select(...)`, rows passed to the\n * shaping callback or parser use that narrowed fetched-row type.\n */\n async fetch(): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated>>>;\n async fetch<Out>(\n shape: QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>\n ): Promise<QueryResult<Out>>;\n async fetch<Out>(\n shape: QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>\n ): Promise<QueryResult<Out>>;\n async fetch<TShape extends QueryShape<HydratedQueryResult<TBaseResult, THydrated>> | undefined>(\n shape: TShape\n ): Promise<\n QueryResult<\n | HydratedQueryResult<TBaseResult, THydrated>\n | QueryShapeOutput<HydratedQueryResult<TBaseResult, THydrated>, NonNullable<TShape>>\n >\n >;\n async fetch<Out>(\n shape?:\n | QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>\n | QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>\n ): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated> | Out>> {\n const baseResult = await this.getOrCreateEvaluationCache();\n if (!shape) {\n return baseResult;\n }\n\n const results: Array<HydratedQueryResult<TBaseResult, THydrated> | Out> =\n typeof shape === 'function'\n ? baseResult.items.map(shape)\n : this.normalizeHydratedRowsForParserShape(baseResult.items).map((row) => shape.parse(row));\n\n return new QueryResult(results);\n }\n\n /**\n * Async iterable surface for `for await (... of queryset)`.\n *\n * Evaluates this queryset on first use by awaiting {@link QuerySet.fetch} without arguments, then\n * yields each element from that {@link QueryResult}. Later async iterations over the same queryset\n * instance reuse the cached materialized result instead of issuing another database round-trip.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<HydratedQueryResult<TBaseResult, THydrated>> {\n const result = await this.fetch();\n for (const row of result) {\n yield row;\n }\n }\n\n /**\n * Execute the query and return the first row, or `null`.\n *\n * As with `fetch(...)`, parser and function overloads receive the current\n * fetched-row type after any `select(...)` projection narrowing.\n */\n async fetchOne(): Promise<HydratedQueryResult<TBaseResult, THydrated> | null>;\n async fetchOne<Out>(\n shape: QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>\n ): Promise<Out | null>;\n async fetchOne<Out>(shape: QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>): Promise<Out | null>;\n async fetchOne<TShape extends QueryShape<HydratedQueryResult<TBaseResult, THydrated>> | undefined>(\n shape: TShape\n ): Promise<\n | HydratedQueryResult<TBaseResult, THydrated>\n | QueryShapeOutput<HydratedQueryResult<TBaseResult, THydrated>, NonNullable<TShape>>\n | null\n >;\n async fetchOne<Out>(\n shape?:\n | QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>\n | QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>\n ): Promise<HydratedQueryResult<TBaseResult, THydrated> | Out | null> {\n const limited = this.limit(1);\n const result = !shape\n ? await limited.fetch()\n : typeof shape === 'function'\n ? await limited.fetch(shape)\n : await limited.fetch(shape);\n for (const row of result) {\n return row;\n }\n return null;\n }\n\n /**\n * Execute a `COUNT(*)` query for the current filtered state.\n */\n async count(): Promise<number> {\n const compiler = new QueryCompiler(this.executor.meta, this.executor.dialect);\n const compiled = compiler.compile(this.withoutHydrationState());\n const countQuery = `SELECT COUNT(*) as count FROM (${compiled.sql}) AS tango_count_subquery`;\n const rows = await this.executor.client.query<{ count: number }>(countQuery, compiled.params);\n return Number(rows.rows[0]?.count ?? 0);\n }\n\n /**\n * Return whether at least one row matches the current query state.\n */\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n private getOrCreateEvaluationCache(): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated>>> {\n if (!this.evaluationCache) {\n this.evaluationCache = this.evaluateRows().catch((error) => {\n this.evaluationCache = undefined;\n throw error;\n });\n }\n return this.evaluationCache;\n }\n\n private async evaluateRows(): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated>>> {\n const compiler = new QueryCompiler(this.executor.meta, this.executor.dialect);\n const compiled = compiler.compile(this.state);\n const rows = await this.executor.run(compiled);\n const hydratedRows = await this.hydrateRows(rows as unknown as Record<string, unknown>[], compiled);\n const projectedRows = hydratedRows as Array<HydratedQueryResult<TBaseResult, THydrated>>;\n return new QueryResult(projectedRows);\n }\n\n private normalizeHydratedRowsForParserShape(\n rows: readonly HydratedQueryResult<TBaseResult, THydrated>[]\n ): Array<HydratedQueryResult<TBaseResult, THydrated>> {\n if (this.executor.dialect !== InternalDialect.SQLITE) {\n return [...rows];\n }\n\n const booleanColumns = Object.entries(this.executor.meta.columns)\n .filter(([, value]) => this.isBooleanColumnType(value))\n .map(([column]) => column);\n\n if (booleanColumns.length === 0) {\n return [...rows];\n }\n\n return rows.map((row) => this.normalizeBooleanColumns(row, booleanColumns));\n }\n\n private async hydrateRows(\n rows: Record<string, unknown>[],\n compiled: CompiledQuery\n ): Promise<Record<string, unknown>[]> {\n if (!compiled.hydrationPlan) {\n return rows;\n }\n\n // Hydration mutates row objects by attaching related entities and\n // stripping internal alias columns. Copy once here so the executor's\n // raw rows remain untouched throughout the recursive hydration pass.\n const hydratedRows = rows.map((row) => ({ ...row }));\n // Canonicalize by model key and primary key so one database row maps to\n // one in-memory object even when multiple hydration paths reach it.\n const canonicalEntities = new Map<string, Map<string | number, Record<string, unknown>>>();\n const queuedJoinPrefetchOwners = new Map<CompiledHydrationNode, Set<Record<string, unknown>>>();\n const compiler = new QueryCompiler(this.executor.meta, this.executor.dialect);\n\n for (const row of hydratedRows) {\n this.hydrateJoinNodesForOwner(\n row,\n row,\n compiled.hydrationPlan.joinNodes,\n canonicalEntities,\n queuedJoinPrefetchOwners\n );\n }\n\n for (const node of compiled.hydrationPlan.prefetchNodes) {\n await this.hydratePrefetchNode(node, hydratedRows, canonicalEntities, compiler);\n }\n\n for (const [node, owners] of queuedJoinPrefetchOwners.entries()) {\n await this.hydratePrefetchNode(node, [...owners], canonicalEntities, compiler);\n }\n\n for (const row of hydratedRows) {\n for (const alias of compiled.hydrationPlan.hiddenRootAliases) {\n delete row[alias];\n }\n }\n\n return hydratedRows;\n }\n\n private hydrateJoinNodesForOwner(\n owner: Record<string, unknown>,\n rawRow: Record<string, unknown>,\n nodes: readonly CompiledHydrationNode[],\n canonicalEntities: Map<string, Map<string | number, Record<string, unknown>>>,\n queuedJoinPrefetchOwners?: Map<CompiledHydrationNode, Set<Record<string, unknown>>>\n ): void {\n // Join-backed descendants already live on the current SQL row. This\n // pass reads the aliased columns, materializes the related entity, and\n // then recurses into any join-backed children on the same row payload.\n for (const node of nodes) {\n if (!node.join) {\n continue;\n }\n\n const target: Record<string, unknown> = {};\n let hasTargetValue = false;\n\n for (const [column, alias] of Object.entries(node.join.columns)) {\n const value = rawRow[alias];\n delete rawRow[alias];\n target[column] = this.normalizeColumnValue(node.targetColumns[column], value);\n if (value !== null && value !== undefined) {\n hasTargetValue = true;\n }\n }\n\n if (!hasTargetValue) {\n owner[node.relationName] = null;\n continue;\n }\n\n const canonical = this.canonicalizeEntity(node, target, canonicalEntities);\n owner[node.relationName] = canonical;\n for (const childNode of node.prefetchChildren) {\n const queuedOwners = queuedJoinPrefetchOwners?.get(childNode);\n if (queuedOwners) {\n queuedOwners.add(canonical);\n continue;\n }\n\n queuedJoinPrefetchOwners?.set(childNode, new Set([canonical]));\n }\n this.hydrateJoinNodesForOwner(\n canonical,\n rawRow,\n node.joinChildren,\n canonicalEntities,\n queuedJoinPrefetchOwners\n );\n }\n }\n\n private async hydratePrefetchNode(\n node: CompiledHydrationNode,\n owners: readonly Record<string, unknown>[],\n canonicalEntities: Map<string, Map<string | number, Record<string, unknown>>>,\n compiler: QueryCompiler\n ): Promise<void> {\n if (owners.length === 0) {\n return;\n }\n\n // Prefetch-backed descendants run as follow-up queries keyed by the\n // owner rows produced so far. Initialize defaults first so missing\n // children still hydrate to [] or null deterministically.\n const groupedOwners = this.groupOwnersByAccessor(owners, node.ownerSourceAccessor);\n const sourceValues = [...groupedOwners.keys()];\n for (const owner of owners) {\n owner[node.relationName] = node.cardinality === InternalRelationHydrationCardinality.MANY ? [] : null;\n }\n\n if (sourceValues.length === 0) {\n return;\n }\n\n const compiledPrefetch = compiler.compilePrefetch(node, sourceValues);\n const result = await this.executor.client.query<Record<string, unknown>>(\n compiledPrefetch.sql,\n compiledPrefetch.params\n );\n const groupedTargets = new Map<string | number, Record<string, unknown>[]>();\n const canonicalChildren = new Map<string | number, Record<string, unknown>>();\n\n for (const rawResultRow of result.rows) {\n const normalized = this.normalizeTargetRow(compiledPrefetch, rawResultRow);\n const canonical = this.canonicalizeEntity(node, normalized, canonicalEntities);\n this.hydrateJoinNodesForOwner(canonical, normalized, node.joinChildren, canonicalEntities);\n\n const key = normalized[compiledPrefetch.targetKey];\n if (typeof key !== 'string' && typeof key !== 'number') {\n continue;\n }\n\n const bucket = groupedTargets.get(key) ?? [];\n bucket.push(canonical);\n groupedTargets.set(key, bucket);\n const childPrimaryKey = canonical[node.targetPrimaryKey];\n if (typeof childPrimaryKey === 'string' || typeof childPrimaryKey === 'number') {\n canonicalChildren.set(childPrimaryKey, canonical);\n }\n }\n\n for (const [sourceValue, grouped] of groupedTargets.entries()) {\n for (const owner of groupedOwners.get(sourceValue) ?? []) {\n owner[node.relationName] =\n node.cardinality === InternalRelationHydrationCardinality.MANY ? grouped : grouped[0]!;\n }\n }\n\n const childOwners = [...canonicalChildren.values()];\n for (const childNode of node.prefetchChildren) {\n await this.hydratePrefetchNode(childNode, childOwners, canonicalEntities, compiler);\n }\n }\n\n private groupOwnersByAccessor(\n owners: readonly Record<string, unknown>[],\n accessor: string\n ): Map<string | number, Record<string, unknown>[]> {\n const grouped = new Map<string | number, Record<string, unknown>[]>();\n\n for (const owner of owners) {\n const key = owner[accessor];\n if (typeof key !== 'string' && typeof key !== 'number') {\n continue;\n }\n const bucket = grouped.get(key) ?? [];\n bucket.push(owner);\n grouped.set(key, bucket);\n }\n\n return grouped;\n }\n\n private canonicalizeEntity(\n node: CompiledHydrationNode,\n row: Record<string, unknown>,\n canonicalEntities: Map<string, Map<string | number, Record<string, unknown>>>\n ): Record<string, unknown> {\n // Mixed join/prefetch traversal can encounter the same related row more\n // than once. Canonicalization ensures all later descendants attach to\n // one stable object graph instead of competing copies.\n const primaryKeyValue = row[node.targetPrimaryKey];\n if (typeof primaryKeyValue !== 'string' && typeof primaryKeyValue !== 'number') {\n return row;\n }\n\n const byModel =\n canonicalEntities.get(node.targetModelKey) ?? new Map<string | number, Record<string, unknown>>();\n const existing = byModel.get(primaryKeyValue);\n if (existing) {\n Object.assign(existing, row);\n return existing;\n }\n\n byModel.set(primaryKeyValue, row);\n canonicalEntities.set(node.targetModelKey, byModel);\n return row;\n }\n\n private normalizeTargetRow(prefetch: TargetColumnMetadata, row: Record<string, unknown>): Record<string, unknown> {\n if (this.executor.dialect !== InternalDialect.SQLITE) {\n return row;\n }\n\n let normalized: Record<string, unknown> | null = null;\n for (const [column, type] of Object.entries(prefetch.targetColumns)) {\n if (!this.isBooleanColumnType(type)) {\n continue;\n }\n const next = this.normalizeSqliteBoolean(row[column]);\n if (next === row[column]) {\n continue;\n }\n normalized ??= { ...row };\n normalized[column] = next;\n }\n return normalized ?? row;\n }\n\n private normalizeColumnValue(columnType: string | undefined, value: unknown): unknown {\n return this.executor.dialect === InternalDialect.SQLITE && this.isBooleanColumnType(columnType)\n ? this.normalizeSqliteBoolean(value)\n : value;\n }\n\n private isBooleanColumnType(value: unknown): boolean {\n return typeof value === 'string' && ['bool', 'boolean'].includes(value.trim().toLowerCase());\n }\n\n private normalizeSqliteBoolean(value: unknown): unknown {\n if (value === 0 || value === '0') {\n return false;\n }\n if (value === 1 || value === '1') {\n return true;\n }\n return value;\n }\n\n private normalizeBooleanColumns<TRow extends Record<string, unknown>>(row: TRow, columns: readonly string[]): TRow {\n let normalized: TRow | null = null;\n\n for (const column of columns) {\n const current = (row as Record<string, unknown>)[column];\n const next = this.normalizeSqliteBoolean(current);\n if (next === current) {\n continue;\n }\n if (!normalized) {\n normalized = { ...row };\n }\n (normalized as Record<string, unknown>)[column] = next;\n }\n\n return normalized ?? row;\n }\n\n private withoutHydrationState(): QuerySetState<TModel> {\n const { selectRelated: _selectRelated, prefetchRelated: _prefetchRelated, ...rest } = this.state;\n return rest;\n }\n}\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as compiler from './compiler/index';\nexport * as domain from './domain/index';\n\nexport type * from './domain/index';\nexport type { TableMeta } from './domain/index';\nexport { QueryResult } from './domain/index';\nexport { QuerySet } from './QuerySet';\nexport type { QueryExecutor } from './QuerySet';\nexport { QBuilder, QBuilder as Q } from './QBuilder';\nexport { QueryCompiler } from './compiler/index';\n"],"mappings":"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"}
|