@danceroutine/tango-orm 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/PostgresAdapter-BFdo_nIt.js +4 -0
  2. package/dist/{PostgresAdapter-C9a1XJRx.js → PostgresAdapter-CMiEpHya.js} +4 -52
  3. package/dist/PostgresAdapter-CMiEpHya.js.map +1 -0
  4. package/dist/PostgresClient-BQJZfEOT.js +68 -0
  5. package/dist/PostgresClient-BQJZfEOT.js.map +1 -0
  6. package/dist/SqliteAdapter-A-P9zUhP.js +4 -0
  7. package/dist/SqliteAdapter-CeqhyrPC.js +44 -0
  8. package/dist/SqliteAdapter-CeqhyrPC.js.map +1 -0
  9. package/dist/{SqliteAdapter-Dp6VRXmz.js → SqliteClient-CjOK9-ki.js} +20 -41
  10. package/dist/SqliteClient-CjOK9-ki.js.map +1 -0
  11. package/dist/connection/clients/DBClient.d.ts +6 -0
  12. package/dist/connection/clients/dialects/PostgresClient.d.ts +21 -5
  13. package/dist/connection/clients/dialects/SqliteClient.d.ts +13 -1
  14. package/dist/connection/index.js +5 -3
  15. package/dist/{connection-CVvycXus.js → connection-B_K2ZAf7.js} +7 -5
  16. package/dist/{connection-CVvycXus.js.map → connection-B_K2ZAf7.js.map} +1 -1
  17. package/dist/defaultRuntime-BPK9kWEW.js +447 -0
  18. package/dist/defaultRuntime-BPK9kWEW.js.map +1 -0
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.js +12 -9
  21. package/dist/manager/ModelManager.d.ts +13 -11
  22. package/dist/manager/index.js +6 -6
  23. package/dist/manager/internal/RuntimeBoundClient.d.ts +5 -1
  24. package/dist/{manager-D6tU8xTO.js → manager-C6oJ2tAF.js} +2 -2
  25. package/dist/{manager-D6tU8xTO.js.map → manager-C6oJ2tAF.js.map} +1 -1
  26. package/dist/query/QuerySet.d.ts +17 -13
  27. package/dist/query/compiler/QueryCompiler.d.ts +14 -21
  28. package/dist/query/domain/CompiledQuery.d.ts +26 -9
  29. package/dist/query/domain/RelationMeta.d.ts +37 -0
  30. package/dist/query/domain/RelationTyping.d.ts +42 -0
  31. package/dist/query/domain/TableMeta.d.ts +9 -0
  32. package/dist/query/domain/TableMetaFactory.d.ts +23 -0
  33. package/dist/query/domain/index.d.ts +2 -1
  34. package/dist/query/index.js +1 -1
  35. package/dist/query/planning/QueryPlanner.d.ts +16 -0
  36. package/dist/query/planning/domain/QueryHydrationPlan.d.ts +20 -0
  37. package/dist/query/planning/index.d.ts +2 -0
  38. package/dist/{query-6GeNOf-w.js → query-DYiJ5m_B.js} +434 -165
  39. package/dist/query-DYiJ5m_B.js.map +1 -0
  40. package/dist/{registerModelObjects-CXSI5ndy.js → registerModelObjects-B1VzZ072.js} +28 -144
  41. package/dist/registerModelObjects-B1VzZ072.js.map +1 -0
  42. package/dist/runtime/TangoRuntime.d.ts +17 -4
  43. package/dist/runtime/index.js +6 -6
  44. package/dist/runtime/internal/DBClientProvider.d.ts +12 -0
  45. package/dist/runtime/internal/PostgresDBClientProvider.d.ts +12 -0
  46. package/dist/runtime/internal/SqliteDBClientProvider.d.ts +16 -0
  47. package/dist/runtime/internal/createDBClientProvider.d.ts +5 -0
  48. package/dist/{runtime-7U5_XDad.js → runtime-ByXbpVBS.js} +3 -2
  49. package/dist/{runtime-7U5_XDad.js.map → runtime-ByXbpVBS.js.map} +1 -1
  50. package/dist/transaction/AtomicTransaction.d.ts +32 -0
  51. package/dist/transaction/UnitOfWork.d.ts +3 -0
  52. package/dist/transaction/atomic.d.ts +2 -0
  53. package/dist/transaction/index.d.ts +2 -0
  54. package/dist/transaction/index.js +5 -2
  55. package/dist/transaction/internal/context/AsyncLocalTransactionEngine.d.ts +21 -0
  56. package/dist/transaction/internal/context/CallbackRecord.d.ts +5 -0
  57. package/dist/transaction/internal/context/FrameBoundTransaction.d.ts +20 -0
  58. package/dist/transaction/internal/context/FrameTransactionHandle.d.ts +4 -0
  59. package/dist/transaction/internal/context/TransactionEngine.d.ts +16 -0
  60. package/dist/transaction/internal/context/TransactionFrame.d.ts +7 -0
  61. package/dist/transaction/internal/context/TransactionState.d.ts +10 -0
  62. package/dist/transaction/internal/context/index.d.ts +1 -0
  63. package/dist/{transaction-DooTMuAl.js → transaction-Cs0Z9tbW.js} +15 -3
  64. package/dist/transaction-Cs0Z9tbW.js.map +1 -0
  65. package/package.json +6 -6
  66. package/dist/PostgresAdapter-C9a1XJRx.js.map +0 -1
  67. package/dist/PostgresAdapter-CBc1u8eT.js +0 -3
  68. package/dist/SqliteAdapter-BJKNxCvS.js +0 -3
  69. package/dist/SqliteAdapter-Dp6VRXmz.js.map +0 -1
  70. package/dist/query-6GeNOf-w.js.map +0 -1
  71. package/dist/registerModelObjects-CXSI5ndy.js.map +0 -1
  72. package/dist/transaction-DooTMuAl.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ import "./PostgresClient-BQJZfEOT.js";
2
+ import { PostgresAdapter } from "./PostgresAdapter-CMiEpHya.js";
3
+
4
+ export { PostgresAdapter };
@@ -1,54 +1,6 @@
1
+ import { PostgresClient } from "./PostgresClient-BQJZfEOT.js";
1
2
  import pg from "pg";
2
3
 
3
- //#region src/connection/clients/dialects/PostgresClient.ts
4
- var PostgresClient = class PostgresClient {
5
- static BRAND = "tango.orm.postgres_client";
6
- __tangoBrand = PostgresClient.BRAND;
7
- constructor(pool, client) {
8
- this.pool = pool;
9
- this.client = client;
10
- }
11
- /**
12
- * Narrow an unknown value to `PostgresClient`.
13
- */
14
- static isPostgresClient(value) {
15
- return typeof value === "object" && value !== null && value.__tangoBrand === PostgresClient.BRAND;
16
- }
17
- /**
18
- * Execute a SQL statement with optional bound parameters.
19
- */
20
- async query(sql, params) {
21
- const result = await this.client.query(sql, params);
22
- return { rows: result.rows };
23
- }
24
- /**
25
- * Begin a database transaction.
26
- */
27
- async begin() {
28
- await this.client.query("BEGIN");
29
- }
30
- /**
31
- * Commit the active transaction.
32
- */
33
- async commit() {
34
- await this.client.query("COMMIT");
35
- }
36
- /**
37
- * Roll back the active transaction.
38
- */
39
- async rollback() {
40
- await this.client.query("ROLLBACK");
41
- }
42
- /**
43
- * Release client resources and close the associated pool.
44
- */
45
- async close() {
46
- this.client.release();
47
- await this.pool.end();
48
- }
49
- };
50
-
51
- //#endregion
52
4
  //#region src/connection/adapters/dialects/PostgresAdapter.ts
53
5
  const { Pool } = pg;
54
6
  var PostgresAdapter = class PostgresAdapter {
@@ -88,10 +40,10 @@ var PostgresAdapter = class PostgresAdapter {
88
40
  max: config.maxConnections || 10
89
41
  });
90
42
  const client = await pool.connect();
91
- return new PostgresClient(pool, client);
43
+ return new PostgresClient(client);
92
44
  }
93
45
  };
94
46
 
95
47
  //#endregion
96
- export { PostgresAdapter, PostgresClient };
97
- //# sourceMappingURL=PostgresAdapter-C9a1XJRx.js.map
48
+ export { PostgresAdapter };
49
+ //# sourceMappingURL=PostgresAdapter-CMiEpHya.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresAdapter-CMiEpHya.js","names":["value: unknown","config: AdapterConfig"],"sources":["../src/connection/adapters/dialects/PostgresAdapter.ts"],"sourcesContent":["import pg from 'pg';\nimport type { Adapter, AdapterConfig } from '../Adapter';\nimport type { DBClient } from '../../clients/DBClient';\nimport { PostgresClient } from '../../clients/dialects/PostgresClient';\n\nconst { Pool } = pg;\n\n/**\n * Postgres adapter that turns adapter config into a transactional `DBClient`.\n */\nexport class PostgresAdapter implements Adapter {\n static readonly BRAND = 'tango.orm.postgres_adapter' as const;\n readonly __tangoBrand: typeof PostgresAdapter.BRAND = PostgresAdapter.BRAND;\n readonly name = 'postgres';\n /**\n * Declares capabilities of this database adapter.\n * Used by the migration runner and query compiler to determine which\n * SQL features can be safely used:\n * - transactionalDDL: Postgres supports DDL inside transactions (safe rollback of schema changes)\n * - concurrentIndex: Supports CREATE INDEX CONCURRENTLY (non-blocking index builds)\n * - validateForeignKeys: Supports deferred FK validation via NOT VALID + VALIDATE CONSTRAINT\n */\n readonly features = {\n transactionalDDL: true,\n concurrentIndex: true,\n validateForeignKeys: true,\n };\n\n /**\n * Narrow an unknown value to `PostgresAdapter`.\n */\n static isPostgresAdapter(value: unknown): value is PostgresAdapter {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === PostgresAdapter.BRAND\n );\n }\n\n /**\n * Open a Postgres connection pool and return a client-backed DB abstraction.\n */\n async connect(config: AdapterConfig): Promise<DBClient> {\n const 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 const client = await pool.connect();\n return new PostgresClient(client);\n }\n}\n"],"mappings":";;;;AAKA,MAAM,EAAE,MAAM,GAAG;IAKJ,kBAAN,MAAM,gBAAmC;CAC5C,OAAgB,QAAQ;CACxB,eAAsD,gBAAgB;CACtE,OAAgB;;;;;;;;;CAShB,WAAoB;EAChB,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;CACxB;;;;CAKD,OAAO,kBAAkBA,OAA0C;AAC/D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,gBAAgB;CAE9E;;;;CAKD,MAAM,QAAQC,QAA0C;EACpD,MAAM,OAAO,IAAI,KAAK;GAClB,kBAAkB,OAAO;GACzB,MAAM,OAAO;GACb,MAAM,OAAO;GACb,UAAU,OAAO;GACjB,MAAM,OAAO;GACb,UAAU,OAAO;GACjB,KAAK,OAAO,kBAAkB;EACjC;EAED,MAAM,SAAS,MAAM,KAAK,SAAS;AACnC,SAAO,IAAI,eAAe;CAC7B;AACJ"}
@@ -0,0 +1,68 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,4 @@
1
+ import "./SqliteClient-CjOK9-ki.js";
2
+ import { SqliteAdapter } from "./SqliteAdapter-CeqhyrPC.js";
3
+
4
+ export { SqliteAdapter };
@@ -0,0 +1,44 @@
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
@@ -0,0 +1 @@
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,4 +1,3 @@
1
- import { createRequire } from "node:module";
2
1
 
3
2
  //#region src/connection/clients/dialects/SqliteClient.ts
4
3
  var SqliteClient = class SqliteClient {
@@ -60,6 +59,24 @@ else stmt.run();
60
59
  }
61
60
  }
62
61
  /**
62
+ * Create a savepoint inside the active transaction.
63
+ */
64
+ async createSavepoint(name) {
65
+ this.db.prepare(`SAVEPOINT ${name}`).run();
66
+ }
67
+ /**
68
+ * Release a previously-created savepoint.
69
+ */
70
+ async releaseSavepoint(name) {
71
+ this.db.prepare(`RELEASE SAVEPOINT ${name}`).run();
72
+ }
73
+ /**
74
+ * Roll back the active transaction to a savepoint.
75
+ */
76
+ async rollbackToSavepoint(name) {
77
+ this.db.prepare(`ROLLBACK TO SAVEPOINT ${name}`).run();
78
+ }
79
+ /**
63
80
  * Close the underlying SQLite handle.
64
81
  */
65
82
  async close() {
@@ -76,43 +93,5 @@ function isDateValue(value) {
76
93
  }
77
94
 
78
95
  //#endregion
79
- //#region src/connection/adapters/dialects/SqliteAdapter.ts
80
- var SqliteAdapter = class SqliteAdapter {
81
- static BRAND = "tango.orm.sqlite_adapter";
82
- __tangoBrand = SqliteAdapter.BRAND;
83
- name = "sqlite";
84
- features = {
85
- transactionalDDL: true,
86
- concurrentIndex: false,
87
- validateForeignKeys: false
88
- };
89
- /**
90
- * Narrow an unknown value to `SqliteAdapter`.
91
- */
92
- static isSqliteAdapter(value) {
93
- return typeof value === "object" && value !== null && value.__tangoBrand === SqliteAdapter.BRAND;
94
- }
95
- /**
96
- * Open a SQLite database and apply baseline pragmas for durability/safety.
97
- */
98
- async connect(config = {}) {
99
- const Database = this.getDatabaseCtor();
100
- const filename = typeof config.filename === "string" && config.filename.length > 0 ? config.filename : ":memory:";
101
- const db = new Database(filename);
102
- db.pragma("journal_mode = WAL");
103
- db.pragma("foreign_keys = ON");
104
- return new SqliteClient(db);
105
- }
106
- getDatabaseCtor() {
107
- const require = createRequire(import.meta.url);
108
- const moduleValue = require("better-sqlite3");
109
- if (typeof moduleValue === "function") return moduleValue;
110
- const defaultExport = moduleValue.default;
111
- if (typeof defaultExport === "function") return defaultExport;
112
- throw new TypeError("Failed to load better-sqlite3 constructor.");
113
- }
114
- };
115
-
116
- //#endregion
117
- export { SqliteAdapter, SqliteClient };
118
- //# sourceMappingURL=SqliteAdapter-Dp6VRXmz.js.map
96
+ export { SqliteClient };
97
+ //# sourceMappingURL=SqliteClient-CjOK9-ki.js.map
@@ -0,0 +1 @@
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"}
@@ -12,6 +12,12 @@ export interface DBClient {
12
12
  commit(): Promise<void>;
13
13
  /** Roll back current transaction. */
14
14
  rollback(): Promise<void>;
15
+ /** Create a savepoint inside the current transaction. */
16
+ createSavepoint(name: string): Promise<void>;
17
+ /** Release a previously-created savepoint. */
18
+ releaseSavepoint(name: string): Promise<void>;
19
+ /** Roll back current transaction state to a savepoint. */
20
+ rollbackToSavepoint(name: string): Promise<void>;
15
21
  /** Close underlying connection resources. */
16
22
  close(): Promise<void>;
17
23
  }
@@ -1,14 +1,18 @@
1
- import type pg from 'pg';
2
1
  import type { DBClient } from '../DBClient';
2
+ export interface PostgresPoolClientLike {
3
+ query(sql: string, params?: readonly unknown[]): Promise<{
4
+ rows: unknown[];
5
+ }>;
6
+ release(): void;
7
+ }
3
8
  /**
4
- * `DBClient` implementation backed by a PostgreSQL pool client.
9
+ * Transaction-capable client backed by a PostgreSQL pool client.
5
10
  */
6
11
  export declare class PostgresClient implements DBClient {
7
- private pool;
8
12
  private client;
9
13
  static readonly BRAND: "tango.orm.postgres_client";
10
14
  readonly __tangoBrand: typeof PostgresClient.BRAND;
11
- constructor(pool: pg.Pool, client: pg.PoolClient);
15
+ constructor(client: PostgresPoolClientLike);
12
16
  /**
13
17
  * Narrow an unknown value to `PostgresClient`.
14
18
  */
@@ -32,7 +36,19 @@ export declare class PostgresClient implements DBClient {
32
36
  */
33
37
  rollback(): Promise<void>;
34
38
  /**
35
- * Release client resources and close the associated pool.
39
+ * Create a savepoint inside the active transaction.
40
+ */
41
+ createSavepoint(name: string): Promise<void>;
42
+ /**
43
+ * Release a previously-created savepoint.
44
+ */
45
+ releaseSavepoint(name: string): Promise<void>;
46
+ /**
47
+ * Roll back the active transaction to a savepoint.
48
+ */
49
+ rollbackToSavepoint(name: string): Promise<void>;
50
+ /**
51
+ * Release the leased PostgreSQL client back to its owning pool.
36
52
  */
37
53
  close(): Promise<void>;
38
54
  }
@@ -1,7 +1,7 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  import type { DBClient } from '../DBClient';
3
3
  /**
4
- * `DBClient` implementation backed by a synchronous `better-sqlite3` handle.
4
+ * Transaction-capable client backed by a synchronous `better-sqlite3` handle.
5
5
  */
6
6
  export declare class SqliteClient implements DBClient {
7
7
  private db;
@@ -34,6 +34,18 @@ export declare class SqliteClient implements DBClient {
34
34
  * Roll back the active transaction.
35
35
  */
36
36
  rollback(): Promise<void>;
37
+ /**
38
+ * Create a savepoint inside the active transaction.
39
+ */
40
+ createSavepoint(name: string): Promise<void>;
41
+ /**
42
+ * Release a previously-created savepoint.
43
+ */
44
+ releaseSavepoint(name: string): Promise<void>;
45
+ /**
46
+ * Roll back the active transaction to a savepoint.
47
+ */
48
+ rollbackToSavepoint(name: string): Promise<void>;
37
49
  /**
38
50
  * Close the underlying SQLite handle.
39
51
  */
@@ -1,5 +1,7 @@
1
- import { PostgresAdapter, PostgresClient } from "../PostgresAdapter-C9a1XJRx.js";
2
- import { SqliteAdapter, SqliteClient } from "../SqliteAdapter-Dp6VRXmz.js";
3
- import { AdapterRegistry, adapters_exports, clients_exports, connectDB, getDefaultAdapterRegistry } from "../connection-CVvycXus.js";
1
+ import { PostgresClient } from "../PostgresClient-BQJZfEOT.js";
2
+ import { PostgresAdapter } from "../PostgresAdapter-CMiEpHya.js";
3
+ import { SqliteClient } from "../SqliteClient-CjOK9-ki.js";
4
+ import { SqliteAdapter } from "../SqliteAdapter-CeqhyrPC.js";
5
+ import { AdapterRegistry, adapters_exports, clients_exports, connectDB, getDefaultAdapterRegistry } from "../connection-B_K2ZAf7.js";
4
6
 
5
7
  export { AdapterRegistry, PostgresAdapter, PostgresClient, SqliteAdapter, SqliteClient, adapters_exports as adapters, clients_exports as clients, connectDB, getDefaultAdapterRegistry };
@@ -1,6 +1,8 @@
1
1
  import { __export } from "./chunk-DLY2FNSh.js";
2
- import { PostgresAdapter, PostgresClient } from "./PostgresAdapter-C9a1XJRx.js";
3
- import { SqliteAdapter, SqliteClient } from "./SqliteAdapter-Dp6VRXmz.js";
2
+ import { PostgresClient } from "./PostgresClient-BQJZfEOT.js";
3
+ import { PostgresAdapter } from "./PostgresAdapter-CMiEpHya.js";
4
+ import { SqliteClient } from "./SqliteClient-CjOK9-ki.js";
5
+ import { SqliteAdapter } from "./SqliteAdapter-CeqhyrPC.js";
4
6
 
5
7
  //#region src/connection/adapters/dialects/index.ts
6
8
  var dialects_exports$1 = {};
@@ -28,8 +30,8 @@ var AdapterRegistry = class AdapterRegistry {
28
30
  static async getDefaultRegistry() {
29
31
  if (AdapterRegistry.defaultRegistryInstance) return AdapterRegistry.defaultRegistryInstance;
30
32
  AdapterRegistry.defaultRegistryInstance = new AdapterRegistry();
31
- const { PostgresAdapter: PostgresAdapter$1 } = await import("./PostgresAdapter-CBc1u8eT.js");
32
- const { SqliteAdapter: SqliteAdapter$1 } = await import("./SqliteAdapter-BJKNxCvS.js");
33
+ const { PostgresAdapter: PostgresAdapter$1 } = await import("./PostgresAdapter-BFdo_nIt.js");
34
+ const { SqliteAdapter: SqliteAdapter$1 } = await import("./SqliteAdapter-A-P9zUhP.js");
33
35
  AdapterRegistry.defaultRegistryInstance.register(new PostgresAdapter$1());
34
36
  AdapterRegistry.defaultRegistryInstance.register(new SqliteAdapter$1());
35
37
  return AdapterRegistry.defaultRegistryInstance;
@@ -114,4 +116,4 @@ __export(connection_exports, {
114
116
 
115
117
  //#endregion
116
118
  export { AdapterRegistry, adapters_exports, clients_exports, connectDB, connection_exports, getDefaultAdapterRegistry };
117
- //# sourceMappingURL=connection-CVvycXus.js.map
119
+ //# sourceMappingURL=connection-B_K2ZAf7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-CVvycXus.js","names":["value: unknown","adapter: Adapter","name: string","config: AdapterConfig & { adapter: string }","registry?: AdapterRegistry"],"sources":["../src/connection/adapters/dialects/index.ts","../src/connection/adapters/AdapterRegistry.ts","../src/connection/adapters/index.ts","../src/connection/clients/dialects/index.ts","../src/connection/clients/index.ts","../src/connection/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresAdapter } from './PostgresAdapter';\nexport { SqliteAdapter } from './SqliteAdapter';\n","import type { Adapter, AdapterConfig } from './Adapter';\nimport type { DBClient } from '../clients/DBClient';\n\n/**\n * Runtime registry for database adapters.\n *\n * Use a custom instance when tests or applications need explicit control\n * over supported adapters; use `getDefaultRegistry()` for the built-in set.\n */\nexport class AdapterRegistry {\n static readonly BRAND = 'tango.orm.adapter_registry' as const;\n private static defaultRegistryInstance: AdapterRegistry | undefined;\n readonly __tangoBrand: typeof AdapterRegistry.BRAND = AdapterRegistry.BRAND;\n private adapters = new Map<string, Adapter>();\n\n /**\n * Narrow an unknown value to `AdapterRegistry`.\n */\n static isAdapterRegistry(value: unknown): value is AdapterRegistry {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === AdapterRegistry.BRAND\n );\n }\n\n /**\n * Return a lazily-initialized registry preloaded with built-in adapters.\n */\n static async getDefaultRegistry(): Promise<AdapterRegistry> {\n if (AdapterRegistry.defaultRegistryInstance) {\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n AdapterRegistry.defaultRegistryInstance = new AdapterRegistry();\n\n const { PostgresAdapter } = await import('./dialects/PostgresAdapter');\n const { SqliteAdapter } = await import('./dialects/SqliteAdapter');\n\n AdapterRegistry.defaultRegistryInstance.register(new PostgresAdapter());\n AdapterRegistry.defaultRegistryInstance.register(new SqliteAdapter());\n\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n /**\n * Register an adapter under its declared `name`.\n */\n register(adapter: Adapter): this {\n this.adapters.set(adapter.name, adapter);\n return this;\n }\n\n /**\n * Resolve an adapter by name, or throw a descriptive error.\n */\n get(name: string): Adapter {\n const adapter = this.adapters.get(name);\n if (!adapter) {\n const available = [...this.adapters.keys()].join(', ');\n throw new Error(`Unknown adapter: ${name}. Available adapters: ${available || 'none'}`);\n }\n return adapter;\n }\n\n /**\n * Check whether an adapter has been registered.\n */\n has(name: string): boolean {\n return this.adapters.has(name);\n }\n}\n\n/**\n * Connect to a database by adapter name using the provided (or default) registry.\n */\nexport async function connectDB(\n config: AdapterConfig & { adapter: string },\n registry?: AdapterRegistry\n): Promise<DBClient> {\n const effectiveRegistry = registry ?? (await AdapterRegistry.getDefaultRegistry());\n const adapter = effectiveRegistry.get(config.adapter);\n return adapter.connect(config);\n}\n\n/**\n * Convenience helper that exposes the singleton default adapter registry.\n */\nexport async function getDefaultAdapterRegistry(): Promise<AdapterRegistry> {\n return AdapterRegistry.getDefaultRegistry();\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 dialects from './dialects/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './AdapterRegistry';\nexport type { Adapter, AdapterConfig } from './Adapter';\nexport { PostgresAdapter, SqliteAdapter } from './dialects/index';\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresClient } from './PostgresClient';\nexport { SqliteClient } from './SqliteClient';\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 dialects from './dialects/index';\n\nexport type { DBClient } from './DBClient';\nexport { PostgresClient, SqliteClient } from './dialects/index';\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 adapters from './adapters/index';\nexport * as clients from './clients/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './adapters/index';\nexport type { Adapter, AdapterConfig } from './adapters/index';\nexport type { DBClient } from './clients/DBClient';\nexport { PostgresAdapter, SqliteAdapter } from './adapters/index';\nexport { PostgresClient, SqliteClient } from './clients/index';\n"],"mappings":";;;;;;;;;;;;;ICSa,kBAAN,MAAM,gBAAgB;CACzB,OAAgB,QAAQ;CACxB,OAAe;CACf,eAAsD,gBAAgB;CACtE,WAAmB,IAAI;;;;CAKvB,OAAO,kBAAkBA,OAA0C;AAC/D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,gBAAgB;CAE9E;;;;CAKD,aAAa,qBAA+C;AACxD,MAAI,gBAAgB,wBAChB,QAAO,gBAAgB;AAG3B,kBAAgB,0BAA0B,IAAI;EAE9C,MAAM,EAAE,oCAAiB,GAAG,MAAM,OAAO;EACzC,MAAM,EAAE,gCAAe,GAAG,MAAM,OAAO;AAEvC,kBAAgB,wBAAwB,SAAS,IAAI,oBAAkB;AACvE,kBAAgB,wBAAwB,SAAS,IAAI,kBAAgB;AAErE,SAAO,gBAAgB;CAC1B;;;;CAKD,SAASC,SAAwB;AAC7B,OAAK,SAAS,IAAI,QAAQ,MAAM,QAAQ;AACxC,SAAO;CACV;;;;CAKD,IAAIC,MAAuB;EACvB,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,OAAK,SAAS;GACV,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,MAAM,AAAC,EAAC,KAAK,KAAK;AACtD,SAAM,IAAI,OAAO,mBAAmB,KAAK,wBAAwB,aAAa,OAAO;EACxF;AACD,SAAO;CACV;;;;CAKD,IAAIA,MAAuB;AACvB,SAAO,KAAK,SAAS,IAAI,KAAK;CACjC;AACJ;AAKM,eAAe,UAClBC,QACAC,UACiB;CACjB,MAAM,oBAAoB,YAAa,MAAM,gBAAgB,oBAAoB;CACjF,MAAM,UAAU,kBAAkB,IAAI,OAAO,QAAQ;AACrD,QAAO,QAAQ,QAAQ,OAAO;AACjC;AAKM,eAAe,4BAAsD;AACxE,QAAO,gBAAgB,oBAAoB;AAC9C"}
1
+ {"version":3,"file":"connection-B_K2ZAf7.js","names":["value: unknown","adapter: Adapter","name: string","config: AdapterConfig & { adapter: string }","registry?: AdapterRegistry"],"sources":["../src/connection/adapters/dialects/index.ts","../src/connection/adapters/AdapterRegistry.ts","../src/connection/adapters/index.ts","../src/connection/clients/dialects/index.ts","../src/connection/clients/index.ts","../src/connection/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresAdapter } from './PostgresAdapter';\nexport { SqliteAdapter } from './SqliteAdapter';\n","import type { Adapter, AdapterConfig } from './Adapter';\nimport type { DBClient } from '../clients/DBClient';\n\n/**\n * Runtime registry for database adapters.\n *\n * Use a custom instance when tests or applications need explicit control\n * over supported adapters; use `getDefaultRegistry()` for the built-in set.\n */\nexport class AdapterRegistry {\n static readonly BRAND = 'tango.orm.adapter_registry' as const;\n private static defaultRegistryInstance: AdapterRegistry | undefined;\n readonly __tangoBrand: typeof AdapterRegistry.BRAND = AdapterRegistry.BRAND;\n private adapters = new Map<string, Adapter>();\n\n /**\n * Narrow an unknown value to `AdapterRegistry`.\n */\n static isAdapterRegistry(value: unknown): value is AdapterRegistry {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === AdapterRegistry.BRAND\n );\n }\n\n /**\n * Return a lazily-initialized registry preloaded with built-in adapters.\n */\n static async getDefaultRegistry(): Promise<AdapterRegistry> {\n if (AdapterRegistry.defaultRegistryInstance) {\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n AdapterRegistry.defaultRegistryInstance = new AdapterRegistry();\n\n const { PostgresAdapter } = await import('./dialects/PostgresAdapter');\n const { SqliteAdapter } = await import('./dialects/SqliteAdapter');\n\n AdapterRegistry.defaultRegistryInstance.register(new PostgresAdapter());\n AdapterRegistry.defaultRegistryInstance.register(new SqliteAdapter());\n\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n /**\n * Register an adapter under its declared `name`.\n */\n register(adapter: Adapter): this {\n this.adapters.set(adapter.name, adapter);\n return this;\n }\n\n /**\n * Resolve an adapter by name, or throw a descriptive error.\n */\n get(name: string): Adapter {\n const adapter = this.adapters.get(name);\n if (!adapter) {\n const available = [...this.adapters.keys()].join(', ');\n throw new Error(`Unknown adapter: ${name}. Available adapters: ${available || 'none'}`);\n }\n return adapter;\n }\n\n /**\n * Check whether an adapter has been registered.\n */\n has(name: string): boolean {\n return this.adapters.has(name);\n }\n}\n\n/**\n * Connect to a database by adapter name using the provided (or default) registry.\n */\nexport async function connectDB(\n config: AdapterConfig & { adapter: string },\n registry?: AdapterRegistry\n): Promise<DBClient> {\n const effectiveRegistry = registry ?? (await AdapterRegistry.getDefaultRegistry());\n const adapter = effectiveRegistry.get(config.adapter);\n return adapter.connect(config);\n}\n\n/**\n * Convenience helper that exposes the singleton default adapter registry.\n */\nexport async function getDefaultAdapterRegistry(): Promise<AdapterRegistry> {\n return AdapterRegistry.getDefaultRegistry();\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 dialects from './dialects/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './AdapterRegistry';\nexport type { Adapter, AdapterConfig } from './Adapter';\nexport { PostgresAdapter, SqliteAdapter } from './dialects/index';\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresClient } from './PostgresClient';\nexport { SqliteClient } from './SqliteClient';\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 dialects from './dialects/index';\n\nexport type { DBClient } from './DBClient';\nexport { PostgresClient, SqliteClient } from './dialects/index';\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 adapters from './adapters/index';\nexport * as clients from './clients/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './adapters/index';\nexport type { Adapter, AdapterConfig } from './adapters/index';\nexport type { DBClient } from './clients/DBClient';\nexport { PostgresAdapter, SqliteAdapter } from './adapters/index';\nexport { PostgresClient, SqliteClient } from './clients/index';\n"],"mappings":";;;;;;;;;;;;;;;ICSa,kBAAN,MAAM,gBAAgB;CACzB,OAAgB,QAAQ;CACxB,OAAe;CACf,eAAsD,gBAAgB;CACtE,WAAmB,IAAI;;;;CAKvB,OAAO,kBAAkBA,OAA0C;AAC/D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,gBAAgB;CAE9E;;;;CAKD,aAAa,qBAA+C;AACxD,MAAI,gBAAgB,wBAChB,QAAO,gBAAgB;AAG3B,kBAAgB,0BAA0B,IAAI;EAE9C,MAAM,EAAE,oCAAiB,GAAG,MAAM,OAAO;EACzC,MAAM,EAAE,gCAAe,GAAG,MAAM,OAAO;AAEvC,kBAAgB,wBAAwB,SAAS,IAAI,oBAAkB;AACvE,kBAAgB,wBAAwB,SAAS,IAAI,kBAAgB;AAErE,SAAO,gBAAgB;CAC1B;;;;CAKD,SAASC,SAAwB;AAC7B,OAAK,SAAS,IAAI,QAAQ,MAAM,QAAQ;AACxC,SAAO;CACV;;;;CAKD,IAAIC,MAAuB;EACvB,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,OAAK,SAAS;GACV,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,MAAM,AAAC,EAAC,KAAK,KAAK;AACtD,SAAM,IAAI,OAAO,mBAAmB,KAAK,wBAAwB,aAAa,OAAO;EACxF;AACD,SAAO;CACV;;;;CAKD,IAAIA,MAAuB;AACvB,SAAO,KAAK,SAAS,IAAI,KAAK;CACjC;AACJ;AAKM,eAAe,UAClBC,QACAC,UACiB;CACjB,MAAM,oBAAoB,YAAa,MAAM,gBAAgB,oBAAoB;CACjF,MAAM,UAAU,kBAAkB,IAAI,OAAO,QAAQ;AACrD,QAAO,QAAQ,QAAQ,OAAO;AACjC;AAKM,eAAe,4BAAsD;AACxE,QAAO,gBAAgB,oBAAoB;AAC9C"}