sqlstack 3.3.0 → 3.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 (95) hide show
  1. package/dist/cjs/adapters/sqlite.d.ts.map +1 -1
  2. package/dist/cjs/adapters/sqlite.js +4 -1
  3. package/dist/cjs/adapters/sqlite.js.map +1 -1
  4. package/dist/cjs/core/errors.d.ts +9 -0
  5. package/dist/cjs/core/errors.d.ts.map +1 -1
  6. package/dist/cjs/core/errors.js +10 -0
  7. package/dist/cjs/core/errors.js.map +1 -1
  8. package/dist/cjs/decorators/query.d.ts +14 -0
  9. package/dist/cjs/decorators/query.d.ts.map +1 -1
  10. package/dist/cjs/decorators/query.js +124 -17
  11. package/dist/cjs/decorators/query.js.map +1 -1
  12. package/dist/cjs/index.d.ts +2 -1
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js +4 -2
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/run.d.ts +140 -6
  17. package/dist/cjs/run.d.ts.map +1 -1
  18. package/dist/cjs/run.js +127 -17
  19. package/dist/cjs/run.js.map +1 -1
  20. package/dist/cjs/runtime.d.ts +8 -0
  21. package/dist/cjs/runtime.d.ts.map +1 -1
  22. package/dist/cjs/runtime.js +12 -0
  23. package/dist/cjs/runtime.js.map +1 -1
  24. package/dist/cjs/sql.d.ts +19 -0
  25. package/dist/cjs/sql.d.ts.map +1 -1
  26. package/dist/cjs/sql.js +66 -28
  27. package/dist/cjs/sql.js.map +1 -1
  28. package/dist/cjs/stack.d.ts +2 -0
  29. package/dist/cjs/stack.d.ts.map +1 -1
  30. package/dist/cjs/stack.js +40 -27
  31. package/dist/cjs/stack.js.map +1 -1
  32. package/dist/cjs/testing/builder.d.ts.map +1 -1
  33. package/dist/cjs/testing/builder.js +14 -5
  34. package/dist/cjs/testing/builder.js.map +1 -1
  35. package/dist/cjs/testing/fixture-provenance.d.ts +3 -0
  36. package/dist/cjs/testing/fixture-provenance.d.ts.map +1 -0
  37. package/dist/cjs/testing/fixture-provenance.js +21 -0
  38. package/dist/cjs/testing/fixture-provenance.js.map +1 -0
  39. package/dist/cjs/testing/index.d.ts +2 -0
  40. package/dist/cjs/testing/index.d.ts.map +1 -1
  41. package/dist/cjs/testing/index.js +5 -1
  42. package/dist/cjs/testing/index.js.map +1 -1
  43. package/dist/cjs/testing/postgres/database.d.ts +9 -1
  44. package/dist/cjs/testing/postgres/database.d.ts.map +1 -1
  45. package/dist/cjs/testing/postgres/database.js +17 -13
  46. package/dist/cjs/testing/postgres/database.js.map +1 -1
  47. package/dist/cjs/testing/resource.d.ts +76 -0
  48. package/dist/cjs/testing/resource.d.ts.map +1 -0
  49. package/dist/cjs/testing/resource.js +117 -0
  50. package/dist/cjs/testing/resource.js.map +1 -0
  51. package/dist/cjs/testing/sqlite/builder.d.ts.map +1 -1
  52. package/dist/cjs/testing/sqlite/builder.js +10 -2
  53. package/dist/cjs/testing/sqlite/builder.js.map +1 -1
  54. package/dist/cjs/testing/sqlite/database.d.ts +11 -1
  55. package/dist/cjs/testing/sqlite/database.d.ts.map +1 -1
  56. package/dist/cjs/testing/sqlite/database.js +32 -18
  57. package/dist/cjs/testing/sqlite/database.js.map +1 -1
  58. package/dist/cjs/transactions.d.ts +14 -0
  59. package/dist/cjs/transactions.d.ts.map +1 -1
  60. package/dist/cjs/transactions.js +27 -0
  61. package/dist/cjs/transactions.js.map +1 -1
  62. package/dist/esm/adapters/sqlite.js +4 -1
  63. package/dist/esm/adapters/sqlite.js.map +1 -1
  64. package/dist/esm/core/errors.js +10 -0
  65. package/dist/esm/core/errors.js.map +1 -1
  66. package/dist/esm/decorators/query.js +127 -20
  67. package/dist/esm/decorators/query.js.map +1 -1
  68. package/dist/esm/index.js +3 -2
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/run.js +123 -18
  71. package/dist/esm/run.js.map +1 -1
  72. package/dist/esm/runtime.js +11 -0
  73. package/dist/esm/runtime.js.map +1 -1
  74. package/dist/esm/sql.js +63 -27
  75. package/dist/esm/sql.js.map +1 -1
  76. package/dist/esm/stack.js +40 -27
  77. package/dist/esm/stack.js.map +1 -1
  78. package/dist/esm/testing/builder.js +14 -5
  79. package/dist/esm/testing/builder.js.map +1 -1
  80. package/dist/esm/testing/fixture-provenance.js +15 -0
  81. package/dist/esm/testing/fixture-provenance.js.map +1 -0
  82. package/dist/esm/testing/index.js +1 -0
  83. package/dist/esm/testing/index.js.map +1 -1
  84. package/dist/esm/testing/postgres/database.js +17 -13
  85. package/dist/esm/testing/postgres/database.js.map +1 -1
  86. package/dist/esm/testing/resource.js +106 -0
  87. package/dist/esm/testing/resource.js.map +1 -0
  88. package/dist/esm/testing/sqlite/builder.js +10 -2
  89. package/dist/esm/testing/sqlite/builder.js.map +1 -1
  90. package/dist/esm/testing/sqlite/database.js +32 -18
  91. package/dist/esm/testing/sqlite/database.js.map +1 -1
  92. package/dist/esm/transactions.js +25 -0
  93. package/dist/esm/transactions.js.map +1 -1
  94. package/package.json +1 -1
  95. package/readme.md +128 -39
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2G5C,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqJlF"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2G5C,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwJlF"}
@@ -255,7 +255,10 @@ async function createSqliteDb(filenameOrDb) {
255
255
  else {
256
256
  try {
257
257
  // @ts-ignore optional dependency without types
258
- const mod = await Promise.resolve().then(() => __importStar(require('sqlite3')));
258
+ // Optional fallback: defer resolution to runtime rather than making
259
+ // bundlers require sqlite3 when the preferred driver is installed.
260
+ const packageName = 'sqlite3';
261
+ const mod = await Promise.resolve(`${packageName}`).then(s => __importStar(require(s)));
259
262
  sqlite3 = mod.default ?? mod;
260
263
  }
261
264
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/adapters/sqlite.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Database } from '../registry';\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\nasync function prepareStatement(db: any, sql: string) {\n const stmt = db.prepare(sql);\n return isPromiseLike(stmt) ? await stmt : stmt;\n}\n\nasync function finalizeStatement(stmt: any) {\n if (!stmt || typeof stmt.finalize !== 'function') return;\n const result = stmt.finalize();\n if (isPromiseLike(result)) {\n await result;\n }\n}\n\nasync function statementAll(stmt: any, params: unknown[]) {\n if (typeof stmt.all !== 'function') {\n throw new Error('SQLite statement missing all()');\n }\n if (stmt.all.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n };\n try {\n if (params.length > 0) {\n stmt.all(params, callback);\n } else {\n stmt.all(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.all(...(params as any[]));\n return isPromiseLike(result) ? await result : result;\n}\n\nasync function statementRun(stmt: any, params: unknown[]) {\n if (typeof stmt.run !== 'function') {\n throw new Error('SQLite statement missing run()');\n }\n if (stmt.run.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ changes: this?.changes ?? 0, lastInsertId: this?.lastID });\n };\n try {\n if (params.length > 0) {\n stmt.run(params, callback);\n } else {\n stmt.run(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.run(...(params as any[]));\n return isPromiseLike(result) ? await result : result;\n}\n\nfunction stripLeadingComments(sql: string): string {\n let i = 0;\n const n = sql.length;\n if (sql.charCodeAt(0) === 0xfeff) i = 1; // BOM\n while (i < n) {\n while (i < n && /\\s/.test(sql[i]!)) i++;\n if (i + 1 < n && sql[i] === '-' && sql[i + 1] === '-') {\n // -- line comment\n i += 2;\n while (i < n && sql[i] !== '\\n') i++;\n continue;\n }\n if (i + 1 < n && sql[i] === '/' && sql[i + 1] === '*') {\n // /* block comment */\n i += 2;\n const end = sql.indexOf('*/', i);\n if (end === -1) return '';\n i = end + 2;\n continue;\n }\n break;\n }\n return sql.slice(i);\n}\n\n// Text-based fallback for drivers that do not expose statement metadata\n// (the sqlite3 callback API). SELECT, CTEs, and `... RETURNING` all produce\n// a result set and must be executed with all(), not run().\nfunction producesRows(sql: string): boolean {\n const text = stripLeadingComments(String(sql)).trimStart().toUpperCase();\n return text.startsWith('SELECT') || text.startsWith('WITH') || /\\bRETURNING\\b/.test(text);\n}\n\n// better-sqlite3 exposes `stmt.reader` (true when the statement returns rows).\nfunction statementReturnsRows(stmt: any, sql: string): boolean {\n return typeof stmt?.reader === 'boolean' ? stmt.reader : producesRows(sql);\n}\n\nexport async function createSqliteDb(filenameOrDb: string | any): Promise<Database> {\n // If a pre-created connection is provided\n if (typeof filenameOrDb !== 'string' && filenameOrDb) {\n const db = filenameOrDb;\n\n // better-sqlite3 shape\n if (typeof db.prepare === 'function') {\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n const stmt = await prepareStatement(db, sql);\n try {\n if (statementReturnsRows(stmt, sql)) {\n const rows = await statementAll(stmt, params);\n return rows;\n }\n const info = await statementRun(stmt, params);\n const rowsAffected = Number(info?.changes ?? info?.rowsAffected ?? 0);\n const lastInsertId = info?.lastInsertRowid ?? info?.lastID ?? info?.lastInsertId;\n return { rowsAffected, lastInsertId };\n } finally {\n await finalizeStatement(stmt);\n }\n },\n conn: db,\n // Do not close externally provided connection\n async close() {\n if (typeof db.close === 'function') {\n const res = db.close();\n if (isPromiseLike(res)) {\n await res;\n }\n }\n },\n } as Database;\n }\n\n // sqlite3 shape\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n if (producesRows(sql)) {\n return new Promise<any[]>((resolve, reject) => {\n db.all(sql, params, (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n });\n });\n }\n return new Promise((resolve, reject) => {\n // Use function callback to access `this` for metadata\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ rowsAffected: Number(this?.changes ?? 0), lastInsertId: this?.lastID });\n });\n });\n },\n conn: db,\n // Do not close externally provided connection\n close() {},\n } as Database;\n }\n\n const filename = filenameOrDb as string;\n\n let BetterSqlite3: any;\n if (typeof require === 'function') {\n try {\n BetterSqlite3 = require('better-sqlite3');\n } catch {\n BetterSqlite3 = null;\n }\n } else {\n try {\n // @ts-ignore optional dependency without types\n const mod = await import('better-sqlite3');\n BetterSqlite3 = (mod as any).default ?? mod;\n } catch {\n BetterSqlite3 = null;\n }\n }\n\n if (BetterSqlite3) {\n const db = new BetterSqlite3(filename);\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n const stmt = db.prepare(sql);\n if (statementReturnsRows(stmt, sql)) {\n return stmt.all(...params);\n }\n const info = stmt.run(...params);\n return { rowsAffected: Number(info?.changes ?? 0), lastInsertId: info?.lastInsertRowid };\n },\n conn: db,\n close() {\n db.close();\n },\n } as Database;\n }\n\n let sqlite3: any;\n if (typeof require === 'function') {\n try {\n sqlite3 = require('sqlite3');\n } catch {\n sqlite3 = null;\n }\n } else {\n try {\n // @ts-ignore optional dependency without types\n const mod = await import('sqlite3');\n sqlite3 = (mod as any).default ?? mod;\n } catch {\n sqlite3 = null;\n }\n }\n\n if (sqlite3) {\n const db = new sqlite3.Database(filename);\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n if (producesRows(sql)) {\n return new Promise<any[]>((resolve, reject) => {\n db.all(sql, params, (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n });\n });\n }\n // Non-SELECT statements\n return new Promise((resolve, reject) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ rowsAffected: Number(this?.changes ?? 0), lastInsertId: this?.lastID });\n });\n });\n },\n conn: db,\n close() {\n return new Promise<void>((resolve, reject) => {\n db.close((err: Error | null) => (err ? reject(err) : resolve()));\n });\n },\n } as Database;\n }\n\n throw new Error('No SQLite driver available. Install either better-sqlite3 or sqlite3.');\n}\n"]}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/adapters/sqlite.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Database } from '../registry';\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\nasync function prepareStatement(db: any, sql: string) {\n const stmt = db.prepare(sql);\n return isPromiseLike(stmt) ? await stmt : stmt;\n}\n\nasync function finalizeStatement(stmt: any) {\n if (!stmt || typeof stmt.finalize !== 'function') return;\n const result = stmt.finalize();\n if (isPromiseLike(result)) {\n await result;\n }\n}\n\nasync function statementAll(stmt: any, params: unknown[]) {\n if (typeof stmt.all !== 'function') {\n throw new Error('SQLite statement missing all()');\n }\n if (stmt.all.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n };\n try {\n if (params.length > 0) {\n stmt.all(params, callback);\n } else {\n stmt.all(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.all(...(params as any[]));\n return isPromiseLike(result) ? await result : result;\n}\n\nasync function statementRun(stmt: any, params: unknown[]) {\n if (typeof stmt.run !== 'function') {\n throw new Error('SQLite statement missing run()');\n }\n if (stmt.run.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ changes: this?.changes ?? 0, lastInsertId: this?.lastID });\n };\n try {\n if (params.length > 0) {\n stmt.run(params, callback);\n } else {\n stmt.run(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.run(...(params as any[]));\n return isPromiseLike(result) ? await result : result;\n}\n\nfunction stripLeadingComments(sql: string): string {\n let i = 0;\n const n = sql.length;\n if (sql.charCodeAt(0) === 0xfeff) i = 1; // BOM\n while (i < n) {\n while (i < n && /\\s/.test(sql[i]!)) i++;\n if (i + 1 < n && sql[i] === '-' && sql[i + 1] === '-') {\n // -- line comment\n i += 2;\n while (i < n && sql[i] !== '\\n') i++;\n continue;\n }\n if (i + 1 < n && sql[i] === '/' && sql[i + 1] === '*') {\n // /* block comment */\n i += 2;\n const end = sql.indexOf('*/', i);\n if (end === -1) return '';\n i = end + 2;\n continue;\n }\n break;\n }\n return sql.slice(i);\n}\n\n// Text-based fallback for drivers that do not expose statement metadata\n// (the sqlite3 callback API). SELECT, CTEs, and `... RETURNING` all produce\n// a result set and must be executed with all(), not run().\nfunction producesRows(sql: string): boolean {\n const text = stripLeadingComments(String(sql)).trimStart().toUpperCase();\n return text.startsWith('SELECT') || text.startsWith('WITH') || /\\bRETURNING\\b/.test(text);\n}\n\n// better-sqlite3 exposes `stmt.reader` (true when the statement returns rows).\nfunction statementReturnsRows(stmt: any, sql: string): boolean {\n return typeof stmt?.reader === 'boolean' ? stmt.reader : producesRows(sql);\n}\n\nexport async function createSqliteDb(filenameOrDb: string | any): Promise<Database> {\n // If a pre-created connection is provided\n if (typeof filenameOrDb !== 'string' && filenameOrDb) {\n const db = filenameOrDb;\n\n // better-sqlite3 shape\n if (typeof db.prepare === 'function') {\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n const stmt = await prepareStatement(db, sql);\n try {\n if (statementReturnsRows(stmt, sql)) {\n const rows = await statementAll(stmt, params);\n return rows;\n }\n const info = await statementRun(stmt, params);\n const rowsAffected = Number(info?.changes ?? info?.rowsAffected ?? 0);\n const lastInsertId = info?.lastInsertRowid ?? info?.lastID ?? info?.lastInsertId;\n return { rowsAffected, lastInsertId };\n } finally {\n await finalizeStatement(stmt);\n }\n },\n conn: db,\n // Do not close externally provided connection\n async close() {\n if (typeof db.close === 'function') {\n const res = db.close();\n if (isPromiseLike(res)) {\n await res;\n }\n }\n },\n } as Database;\n }\n\n // sqlite3 shape\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n if (producesRows(sql)) {\n return new Promise<any[]>((resolve, reject) => {\n db.all(sql, params, (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n });\n });\n }\n return new Promise((resolve, reject) => {\n // Use function callback to access `this` for metadata\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ rowsAffected: Number(this?.changes ?? 0), lastInsertId: this?.lastID });\n });\n });\n },\n conn: db,\n // Do not close externally provided connection\n close() {},\n } as Database;\n }\n\n const filename = filenameOrDb as string;\n\n let BetterSqlite3: any;\n if (typeof require === 'function') {\n try {\n BetterSqlite3 = require('better-sqlite3');\n } catch {\n BetterSqlite3 = null;\n }\n } else {\n try {\n // @ts-ignore optional dependency without types\n const mod = await import('better-sqlite3');\n BetterSqlite3 = (mod as any).default ?? mod;\n } catch {\n BetterSqlite3 = null;\n }\n }\n\n if (BetterSqlite3) {\n const db = new BetterSqlite3(filename);\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n const stmt = db.prepare(sql);\n if (statementReturnsRows(stmt, sql)) {\n return stmt.all(...params);\n }\n const info = stmt.run(...params);\n return { rowsAffected: Number(info?.changes ?? 0), lastInsertId: info?.lastInsertRowid };\n },\n conn: db,\n close() {\n db.close();\n },\n } as Database;\n }\n\n let sqlite3: any;\n if (typeof require === 'function') {\n try {\n sqlite3 = require('sqlite3');\n } catch {\n sqlite3 = null;\n }\n } else {\n try {\n // @ts-ignore optional dependency without types\n // Optional fallback: defer resolution to runtime rather than making\n // bundlers require sqlite3 when the preferred driver is installed.\n const packageName = 'sqlite3';\n const mod = await import(/* @vite-ignore */ packageName);\n sqlite3 = (mod as any).default ?? mod;\n } catch {\n sqlite3 = null;\n }\n }\n\n if (sqlite3) {\n const db = new sqlite3.Database(filename);\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n if (producesRows(sql)) {\n return new Promise<any[]>((resolve, reject) => {\n db.all(sql, params, (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n });\n });\n }\n // Non-SELECT statements\n return new Promise((resolve, reject) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ rowsAffected: Number(this?.changes ?? 0), lastInsertId: this?.lastID });\n });\n });\n },\n conn: db,\n close() {\n return new Promise<void>((resolve, reject) => {\n db.close((err: Error | null) => (err ? reject(err) : resolve()));\n });\n },\n } as Database;\n }\n\n throw new Error('No SQLite driver available. Install either better-sqlite3 or sqlite3.');\n}\n"]}
@@ -19,10 +19,19 @@ export declare class ValidationError extends SqlStackError {
19
19
  constructor(details: string);
20
20
  details: string;
21
21
  }
22
+ /**
23
+ * A statement failed: the driver rejected it, or (for the `run(...)` forms
24
+ * that take arguments) the SQL could not be compiled, bound, or routed to a
25
+ * database. The original error is kept in `.cause`; when the cause carries a
26
+ * string driver code (`SQLITE_CONSTRAINT_UNIQUE`, `23505`, `ER_DUP_ENTRY`)
27
+ * it is copied to `.code` so existing `err.code` checks keep working.
28
+ */
22
29
  export declare class DatabaseError extends SqlStackError {
23
30
  constructor(message: string, sql: string, cause?: Error);
24
31
  sql: string;
25
32
  cause?: Error;
33
+ /** Driver error code copied from `cause` when it is a string. */
34
+ code?: string;
26
35
  }
27
36
  export declare class RollbackTransactionError extends SqlStackError {
28
37
  constructor(message?: string, cause?: unknown);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,WAAW,EAAE,MAAM;CAIhC;AAED,qBAAa,WAAY,SAAQ,aAAa;;CAK7C;AAED,qBAAa,cAAe,SAAQ,aAAa;gBACnC,WAAW,EAAE,MAAM;CAIhC;AAKD,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAUzC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;IAK3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAMvD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAID,qBAAa,wBAAyB,SAAQ,aAAa;gBAC7C,OAAO,SAA4B,EAAE,KAAK,CAAC,EAAE,OAAO;IAKhE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,WAAW,EAAE,MAAM;CAIhC;AAED,qBAAa,WAAY,SAAQ,aAAa;;CAK7C;AAED,qBAAa,cAAe,SAAQ,aAAa;gBACnC,WAAW,EAAE,MAAM;CAIhC;AAKD,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAUzC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;IAK3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAQvD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,qBAAa,wBAAyB,SAAQ,aAAa;gBAC7C,OAAO,SAA4B,EAAE,KAAK,CAAC,EAAE,OAAO;IAKhE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
@@ -51,11 +51,21 @@ class ValidationError extends SqlStackError {
51
51
  }
52
52
  }
53
53
  exports.ValidationError = ValidationError;
54
+ /**
55
+ * A statement failed: the driver rejected it, or (for the `run(...)` forms
56
+ * that take arguments) the SQL could not be compiled, bound, or routed to a
57
+ * database. The original error is kept in `.cause`; when the cause carries a
58
+ * string driver code (`SQLITE_CONSTRAINT_UNIQUE`, `23505`, `ER_DUP_ENTRY`)
59
+ * it is copied to `.code` so existing `err.code` checks keep working.
60
+ */
54
61
  class DatabaseError extends SqlStackError {
55
62
  constructor(message, sql, cause) {
56
63
  super(`${message}\nSQL: ${sql}`);
57
64
  this.sql = sql;
58
65
  this.cause = cause;
66
+ const code = cause?.code;
67
+ if (typeof code === 'string')
68
+ this.code = code;
59
69
  this.name = 'DatabaseError';
60
70
  }
61
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,kBAAmB,SAAQ,aAAa;IACnD,YAAY,WAAmB;QAC7B,KAAK,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,MAAa,WAAY,SAAQ,aAAa;IAC5C;QACE,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AALD,kCAKC;AAED,MAAa,cAAe,SAAQ,aAAa;IAC/C,YAAY,WAAmB;QAC7B,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,yEAAyE;AACzE,wEAAwE;AACxE,2DAA2D;AAC3D,MAAa,iBAAkB,SAAQ,aAAa;IAClD,YAAY,MAAc,EAAE,KAAa;QACvC,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CACH,GAAG,SAAS,OAAO,MAAM,oEAAoE;YAC3F,2EAA2E,CAC9E,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CAGF;AAbD,8CAaC;AAED,MAAa,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CAEF;AAPD,0CAOC;AAED,MAAa,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe,EAAE,GAAW,EAAE,KAAa;QACrD,KAAK,CAAC,GAAG,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CAGF;AATD,sCASC;AAED,8DAA8D;AAC9D,kEAAkE;AAClE,MAAa,wBAAyB,SAAQ,aAAa;IACzD,YAAY,OAAO,GAAG,yBAAyB,EAAE,KAAe;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CAEF;AAPD,4DAOC","sourcesContent":["export class SqlStackError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'SqlStackError';\n }\n}\n\nexport class ExactlyOneRowError extends SqlStackError {\n constructor(actualCount: number) {\n super(`Expected exactly one row, got ${actualCount}`);\n this.name = 'ExactlyOneRowError';\n }\n}\n\nexport class NoRowsError extends SqlStackError {\n constructor() {\n super('Expected at least one row, got 0');\n this.name = 'NoRowsError';\n }\n}\n\nexport class RowsExistError extends SqlStackError {\n constructor(actualCount: number) {\n super(`Expected no rows, got ${actualCount}`);\n this.name = 'RowsExistError';\n }\n}\n\n// A result-shape decorator (@Single/@Only/@Exist/@None) was applied to a\n// method whose statement produced no result set (a plain write). Shapes\n// require rows; use `... RETURNING` or drop the decorator.\nexport class ExpectedRowsError extends SqlStackError {\n constructor(method: string, shape: string) {\n const decorator = '@' + shape.charAt(0).toUpperCase() + shape.slice(1);\n super(\n `${decorator} on ${method} requires a result set, but the statement produced a write result ` +\n `({ rowsAffected }). Add a RETURNING clause or remove the shape decorator.`\n );\n this.method = method;\n this.shape = shape;\n this.name = 'ExpectedRowsError';\n }\n method: string;\n shape: string;\n}\n\nexport class ValidationError extends SqlStackError {\n constructor(details: string) {\n super(`Validation failed: ${details}`);\n this.details = details;\n this.name = 'ValidationError';\n }\n details: string;\n}\n\nexport class DatabaseError extends SqlStackError {\n constructor(message: string, sql: string, cause?: Error) {\n super(`${message}\\nSQL: ${sql}`);\n this.sql = sql;\n this.cause = cause;\n this.name = 'DatabaseError';\n }\n sql: string;\n cause?: Error;\n}\n\n// Signals that the current transaction should be rolled back.\n// If `cause` is provided, wrappers may rethrow it after rollback.\nexport class RollbackTransactionError extends SqlStackError {\n constructor(message = 'Transaction rolled back', cause?: unknown) {\n super(message);\n this.cause = cause;\n this.name = 'RollbackTransactionError';\n }\n cause?: unknown;\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,kBAAmB,SAAQ,aAAa;IACnD,YAAY,WAAmB;QAC7B,KAAK,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,MAAa,WAAY,SAAQ,aAAa;IAC5C;QACE,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AALD,kCAKC;AAED,MAAa,cAAe,SAAQ,aAAa;IAC/C,YAAY,WAAmB;QAC7B,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,yEAAyE;AACzE,wEAAwE;AACxE,2DAA2D;AAC3D,MAAa,iBAAkB,SAAQ,aAAa;IAClD,YAAY,MAAc,EAAE,KAAa;QACvC,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CACH,GAAG,SAAS,OAAO,MAAM,oEAAoE;YAC3F,2EAA2E,CAC9E,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CAGF;AAbD,8CAaC;AAED,MAAa,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CAEF;AAPD,0CAOC;AAED;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe,EAAE,GAAW,EAAE,KAAa;QACrD,KAAK,CAAC,GAAG,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,IAAI,GAAI,KAAwC,EAAE,IAAI,CAAC;QAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CAKF;AAbD,sCAaC;AAED,8DAA8D;AAC9D,kEAAkE;AAClE,MAAa,wBAAyB,SAAQ,aAAa;IACzD,YAAY,OAAO,GAAG,yBAAyB,EAAE,KAAe;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CAEF;AAPD,4DAOC","sourcesContent":["export class SqlStackError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'SqlStackError';\n }\n}\n\nexport class ExactlyOneRowError extends SqlStackError {\n constructor(actualCount: number) {\n super(`Expected exactly one row, got ${actualCount}`);\n this.name = 'ExactlyOneRowError';\n }\n}\n\nexport class NoRowsError extends SqlStackError {\n constructor() {\n super('Expected at least one row, got 0');\n this.name = 'NoRowsError';\n }\n}\n\nexport class RowsExistError extends SqlStackError {\n constructor(actualCount: number) {\n super(`Expected no rows, got ${actualCount}`);\n this.name = 'RowsExistError';\n }\n}\n\n// A result-shape decorator (@Single/@Only/@Exist/@None) was applied to a\n// method whose statement produced no result set (a plain write). Shapes\n// require rows; use `... RETURNING` or drop the decorator.\nexport class ExpectedRowsError extends SqlStackError {\n constructor(method: string, shape: string) {\n const decorator = '@' + shape.charAt(0).toUpperCase() + shape.slice(1);\n super(\n `${decorator} on ${method} requires a result set, but the statement produced a write result ` +\n `({ rowsAffected }). Add a RETURNING clause or remove the shape decorator.`\n );\n this.method = method;\n this.shape = shape;\n this.name = 'ExpectedRowsError';\n }\n method: string;\n shape: string;\n}\n\nexport class ValidationError extends SqlStackError {\n constructor(details: string) {\n super(`Validation failed: ${details}`);\n this.details = details;\n this.name = 'ValidationError';\n }\n details: string;\n}\n\n/**\n * A statement failed: the driver rejected it, or (for the `run(...)` forms\n * that take arguments) the SQL could not be compiled, bound, or routed to a\n * database. The original error is kept in `.cause`; when the cause carries a\n * string driver code (`SQLITE_CONSTRAINT_UNIQUE`, `23505`, `ER_DUP_ENTRY`)\n * it is copied to `.code` so existing `err.code` checks keep working.\n */\nexport class DatabaseError extends SqlStackError {\n constructor(message: string, sql: string, cause?: Error) {\n super(`${message}\\nSQL: ${sql}`);\n this.sql = sql;\n this.cause = cause;\n const code = (cause as { code?: unknown } | undefined)?.code;\n if (typeof code === 'string') this.code = code;\n this.name = 'DatabaseError';\n }\n sql: string;\n cause?: Error;\n /** Driver error code copied from `cause` when it is a string. */\n code?: string;\n}\n\n// Signals that the current transaction should be rolled back.\n// If `cause` is provided, wrappers may rethrow it after rollback.\nexport class RollbackTransactionError extends SqlStackError {\n constructor(message = 'Transaction rolled back', cause?: unknown) {\n super(message);\n this.cause = cause;\n this.name = 'RollbackTransactionError';\n }\n cause?: unknown;\n}\n"]}
@@ -3,6 +3,20 @@ type QueryOptions = {
3
3
  db?: string;
4
4
  dialect?: 'sqlite' | 'mysql' | 'postgres';
5
5
  };
6
+ /**
7
+ * Turn a method into a database query. The body calls `run(...)` (see `run`
8
+ * for its forms); the wrapper resolves SQL, binds, executes, and applies the
9
+ * shape/transform/validation decorators. A string argument is the root
10
+ * directory holding the method's `.sql` file; `{ sql }` gives inline SQL,
11
+ * `{ db }` pins a registered database, `{ dialect }` overrides binding style.
12
+ *
13
+ * The decorated method's promise rejects with:
14
+ * @throws {DatabaseError} When the driver rejects the statement (original
15
+ * error in `.cause`).
16
+ * @throws {SqlStackError} For missing SQL sources, unresolvable databases,
17
+ * and shape/validation failures (ExpectedRowsError, ExactlyOneRowError,
18
+ * NoRowsError, RowsExistError, ValidationError).
19
+ */
6
20
  export declare function Query(arg?: string | QueryOptions): (_target: any, prop: string | symbol, desc: PropertyDescriptor) => PropertyDescriptor;
7
21
  export {};
8
22
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/decorators/query.ts"],"names":[],"mappings":"AAYA,KAAK,YAAY,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;CAC3C,CAAC;AAEF,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,IAC9B,SAAS,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,kBAAkB,wBA+Q/E"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/decorators/query.ts"],"names":[],"mappings":"AAsBA,KAAK,YAAY,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,IAC9B,SAAS,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,kBAAkB,wBAqW/E"}
@@ -12,6 +12,20 @@ const sourceScanResolver_1 = require("../core/sourceScanResolver");
12
12
  const transactions_1 = require("../transactions");
13
13
  const sql_1 = require("../sql");
14
14
  const run_1 = require("../run");
15
+ /**
16
+ * Turn a method into a database query. The body calls `run(...)` (see `run`
17
+ * for its forms); the wrapper resolves SQL, binds, executes, and applies the
18
+ * shape/transform/validation decorators. A string argument is the root
19
+ * directory holding the method's `.sql` file; `{ sql }` gives inline SQL,
20
+ * `{ db }` pins a registered database, `{ dialect }` overrides binding style.
21
+ *
22
+ * The decorated method's promise rejects with:
23
+ * @throws {DatabaseError} When the driver rejects the statement (original
24
+ * error in `.cause`).
25
+ * @throws {SqlStackError} For missing SQL sources, unresolvable databases,
26
+ * and shape/validation failures (ExpectedRowsError, ExactlyOneRowError,
27
+ * NoRowsError, RowsExistError, ValidationError).
28
+ */
15
29
  function Query(arg) {
16
30
  return function (_target, prop, desc) {
17
31
  const options = typeof arg === 'string' ? undefined : arg;
@@ -48,16 +62,26 @@ function Query(arg) {
48
62
  desc.value = async function (...callArgs) {
49
63
  const labels = (0, metadata_1.getMethodLabels)(this, prop);
50
64
  const classLabels = (0, metadata_1.getClassLabels)(this);
51
- // The full file/inline pipeline (resolve source, bind, execute,
52
- // shape/transform/validate). Invoked either by run() from inside the
53
- // method body, or directly as the legacy fallback when the body throws.
54
- const pipeline = async () => {
65
+ // Resolve, bind, and execute the method's own SQL (inline, resolver,
66
+ // or file) and return the adapter's raw result. `callArgs` is the
67
+ // binding input: the method's own arguments for run() and the legacy
68
+ // fallback, or the params given to run(db, params). `explicit` carries
69
+ // the database chosen by run(db, params).
70
+ const executeMethodSql = async (callArgs, explicit, onSql) => {
55
71
  // 1) prepare args with defaults
56
72
  const rawInput = callArgs.length === 1 ? callArgs[0] : callArgs; // object or positional array
57
- // 2) choose database and dialect via the active environment
58
- const dbName = labels.db ?? options?.db ?? classLabels?.db;
59
- const { entry, resolver: activeResolver } = await (0, runtime_1.resolveExecution)(dbName);
60
- const db = entry.db;
73
+ // 2) choose database and dialect via the active environment (or run's explicit database)
74
+ let target;
75
+ let activeResolver;
76
+ if (explicit) {
77
+ target = explicit.target;
78
+ activeResolver = explicit.resolver;
79
+ }
80
+ else {
81
+ target = await contextTarget();
82
+ activeResolver = target.resolver;
83
+ }
84
+ const db = target.db;
61
85
  const dialect = options?.dialect ?? db.dialect ?? 'sqlite';
62
86
  // 3) load SQL source (inline, environment resolver, v1 fs fallback,
63
87
  // or the zero-config source scan — bare @Query() with nothing installed)
@@ -80,6 +104,7 @@ function Query(arg) {
80
104
  if (!sql) {
81
105
  throw new errors_1.SqlStackError(`No SQL source provided for method ${String(prop)}. Use @Query() with a file/folder path or inline sql.`);
82
106
  }
107
+ onSql(sql);
83
108
  // 4) bind placeholders
84
109
  // Decide argument mode: positional if SQL contains :argN
85
110
  let workingSql = sql;
@@ -260,28 +285,96 @@ function Query(arg) {
260
285
  }
261
286
  }
262
287
  const binder = dialect === 'postgres' ? (0, sqlBinder_1.createPostgresBinder)() : dialect === 'mysql' ? (0, sqlBinder_1.createMysqlBinder)() : (0, sqlBinder_1.createSqliteBinder)();
263
- const { sql: boundSql, params } = binder.bind(workingSql, args);
264
- // 5) execute query via registry DB
288
+ // Binding failures (missing :name, bad array value) surface as DatabaseError like every
289
+ // other run() failure; the original error stays in `.cause`.
290
+ let bound;
291
+ try {
292
+ bound = binder.bind(workingSql, args);
293
+ }
294
+ catch (bindError) {
295
+ throw (0, run_1.toRunError)(bindError, workingSql);
296
+ }
297
+ const { sql: boundSql, params } = bound;
298
+ onSql(boundSql);
299
+ // 5) execute query (inside the active transaction on that database, if any)
265
300
  let out;
266
301
  try {
267
- const tx = (0, transactions_1.getActiveTransaction)(entry);
268
- out = tx ? await tx.query(boundSql, params) : await db.query(boundSql, params);
302
+ out = target.tx ? await target.tx.query(boundSql, params) : await db.query(boundSql, params);
269
303
  }
270
304
  catch (dbError) {
271
305
  // Attach SQL query (with placeholders) to error for debugging
272
306
  throw new errors_1.DatabaseError(dbError?.message || String(dbError), boundSql, dbError instanceof Error ? dbError : undefined);
273
307
  }
274
- // 6) If rows were returned (SELECT/CTE/RETURNING), shape + transform + validate;
275
- // otherwise return the write result as-is (or fail if a shape was requested)
308
+ return out;
309
+ };
310
+ // Database from the decorator context: @Query({ db }), @QueryBinder({ db }),
311
+ // or the environment default.
312
+ const contextTarget = async () => {
313
+ const dbName = labels.db ?? options?.db ?? classLabels?.db;
314
+ const resolved = await (0, runtime_1.resolveExecution)(dbName);
315
+ return {
316
+ db: resolved.entry.db,
317
+ tx: (0, transactions_1.getActiveTransaction)(resolved.entry),
318
+ resolver: resolved.resolver,
319
+ byName: true,
320
+ };
321
+ };
322
+ // run's argument-taking forms: return the adapter's raw result.
323
+ const executeInvocation = async (invocation, onSql) => {
324
+ if (invocation.kind === 'fragment') {
325
+ // run(query) / run(db, query): the fragment replaces the method's SQL;
326
+ // the method's arguments are not bound.
327
+ const target = invocation.db !== undefined ? await (0, run_1.resolveRunTarget)(invocation.db) : await contextTarget();
328
+ const dialect = options?.dialect ?? target.db.dialect ?? 'sqlite';
329
+ const { sql: boundSql, params } = (0, sql_1.compileFragment)(invocation.fragment, dialect);
330
+ onSql(boundSql);
331
+ return (0, run_1.executeOnTarget)(target, boundSql, params);
332
+ }
333
+ // run(db, params): the method's own SQL against db, bound from params
334
+ // only (an object for :named, an array for :argN).
335
+ const target = await (0, run_1.resolveRunTarget)(invocation.db);
336
+ // Inline SQL needs no resolver; only look one up for file-based SQL.
337
+ const resolver = target.byName
338
+ ? target.resolver
339
+ : labels?.source?.kind === 'inline'
340
+ ? undefined
341
+ : await (0, runtime_1.resolveSqlResolver)();
342
+ const bindArgs = Array.isArray(invocation.params) ? [...invocation.params] : [invocation.params];
343
+ return executeMethodSql(bindArgs, { target, resolver }, onSql);
344
+ };
345
+ // The full pipeline: execute, then — if rows were returned
346
+ // (SELECT/CTE/RETURNING) — shape + transform + validate; a write result
347
+ // is returned as-is (or fails if a shape was requested). Invoked by
348
+ // run() from inside the method body, or directly as the legacy fallback
349
+ // when the body throws. The zero-argument path is unchanged; run's
350
+ // argument-taking forms get the unified error contract: any failure
351
+ // before shaping that is not already a SqlStackError becomes a
352
+ // DatabaseError with the original error in `.cause`.
353
+ const pipeline = async (invocation) => {
354
+ if (invocation === undefined || invocation.kind === 'default') {
355
+ const out = await executeMethodSql(callArgs, undefined, () => { });
356
+ return finishResult(out, labels, this, prop);
357
+ }
358
+ let sqlText = invocation.kind === 'fragment' ? (0, run_1.fragmentText)(invocation.fragment) : '';
359
+ let out;
360
+ try {
361
+ out = await executeInvocation(invocation, (s) => {
362
+ sqlText = s;
363
+ });
364
+ }
365
+ catch (err) {
366
+ throw (0, run_1.toRunError)(err, sqlText);
367
+ }
276
368
  return finishResult(out, labels, this, prop);
277
369
  };
278
370
  // 0) Invoke the method body inside a run() context. Three outcomes:
279
- // - body calls run(): the pipeline executed inside the body; return
371
+ // - body calls run(...): the pipeline executed inside the body; return
280
372
  // the body's result verbatim (it may have caught/transformed it).
281
- // - body returns a SqlFragment (template literal path): execute it.
373
+ // - body returns a SqlFragment (deprecated template literal path):
374
+ // execute it.
282
375
  // - body throws without calling run() (legacy placeholder throw):
283
376
  // fall through to the pipeline.
284
- const runCtx = { ran: false, execute: pipeline };
377
+ const runCtx = { ran: false, execute: pipeline, invocations: true };
285
378
  let fragmentResult;
286
379
  try {
287
380
  fragmentResult = await run_1.runStorage.run(runCtx, () => original.apply(this, callArgs));
@@ -296,6 +389,7 @@ function Query(arg) {
296
389
  if (runCtx.ran)
297
390
  return fragmentResult;
298
391
  if (fragmentResult instanceof sql_1.SqlFragment) {
392
+ warnFragmentBodyDeprecated(this, prop);
299
393
  const { sql: boundSql, params } = fragmentResult.toSQL();
300
394
  const dbName = labels.db ?? options?.db ?? classLabels?.db;
301
395
  const { entry } = await (0, runtime_1.resolveExecution)(dbName);
@@ -315,6 +409,19 @@ function Query(arg) {
315
409
  return desc;
316
410
  };
317
411
  }
412
+ // Deprecated (removal in the next major version): a @Query body that RETURNS
413
+ // an sql`` fragment. It only type-checks when the method's declared return
414
+ // type is bent to admit SqlFragment (an `as any`-style hole). One warning per
415
+ // class.method per process.
416
+ const warnedFragmentBodies = new Set();
417
+ function warnFragmentBodyDeprecated(self, prop) {
418
+ const key = `${self?.constructor?.name ?? '<anonymous>'}.${String(prop)}`;
419
+ if (warnedFragmentBodies.has(key))
420
+ return;
421
+ warnedFragmentBodies.add(key);
422
+ process.emitWarning(`@Query method ${key} returns an sql\`\` fragment from its body. This form is deprecated and will be ` +
423
+ 'removed in the next major version. Use `return run(sql`...`)` (or `return run(db, sql`...`)`) instead.', { type: 'DeprecationWarning', code: 'SQLSTACK_FRAGMENT_BODY' });
424
+ }
318
425
  function applyDefaults(defaults, input) {
319
426
  if (!defaults)
320
427
  return input;
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/decorators/query.ts"],"names":[],"mappings":"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","sourcesContent":["import { getClassLabels, getMethodLabels, setMethodLabels } from '../core/metadata';\nimport { SqlStackError, ExactlyOneRowError, NoRowsError, RowsExistError, DatabaseError, ExpectedRowsError } from '../core/errors';\nimport { isValidationDisabled, validateOutput } from '../core/validator';\nimport { resolveExecution } from '../runtime';\nimport { createSqliteBinder, createMysqlBinder, createPostgresBinder } from '../binders/sqlBinder';\nimport { coerceRootPath, resolveSqlFromFs } from '../core/fileResolution';\nimport { registerDecoratedMethod, recordQueryMethodOnClass } from '../core/resolver';\nimport { defaultSourceScanResolver } from '../core/sourceScanResolver';\nimport { getActiveTransaction } from '../transactions';\nimport { SqlFragment } from '../sql';\nimport { runStorage, type RunContext } from '../run';\n\ntype QueryOptions = {\n sql?: string; // optional inline SQL for testing; otherwise, future: load from file\n db?: string; // optional override DB name\n dialect?: 'sqlite' | 'mysql' | 'postgres';\n};\n\nexport function Query(arg?: string | QueryOptions) {\n return function (_target: any, prop: string | symbol, desc: PropertyDescriptor) {\n const options: QueryOptions | undefined = typeof arg === 'string' ? undefined : arg;\n const rootArg: string | undefined = typeof arg === 'string' ? arg : undefined;\n // Store method-level db override if provided\n if (options?.db) {\n setMethodLabels(_target, prop, { db: options.db });\n }\n // Store inline SQL if provided\n if (options?.sql) {\n setMethodLabels(_target, prop, { source: { kind: 'inline', sql: options.sql } });\n } else {\n // FS-based resolution: only an EXPLICIT path argument pins a directory.\n // Bare @Query() resolves through the active resolver (or the default\n // SourceScanResolver) — no stack-based directory guessing, which breaks\n // under bundlers and test transforms.\n const { rootDir } = coerceRootPath(rootArg);\n if (rootDir) {\n setMethodLabels(_target, prop, { source: { kind: 'fs', rootDir } });\n }\n }\n\n // Record for resolver coverage checks: immutable class metadata (the\n // canonical, environment-local source) plus the deprecated global list\n // consulted by the legacy global-resolver path.\n const decoratedEntry = {\n className: _target?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n inline: !!options?.sql,\n };\n recordQueryMethodOnClass(_target, decoratedEntry);\n registerDecoratedMethod(decoratedEntry);\n\n const original = desc.value;\n desc.value = async function (...callArgs: any[]) {\n const labels = getMethodLabels(this, prop);\n const classLabels = getClassLabels(this);\n\n // The full file/inline pipeline (resolve source, bind, execute,\n // shape/transform/validate). Invoked either by run() from inside the\n // method body, or directly as the legacy fallback when the body throws.\n const pipeline = async () => {\n // 1) prepare args with defaults\n const rawInput = callArgs.length === 1 ? callArgs[0] : callArgs; // object or positional array\n\n // 2) choose database and dialect via the active environment\n const dbName = labels.db ?? options?.db ?? classLabels?.db;\n const { entry, resolver: activeResolver } = await resolveExecution(dbName);\n const db = entry.db;\n const dialect = options?.dialect ?? db.dialect ?? 'sqlite';\n\n // 3) load SQL source (inline, environment resolver, v1 fs fallback,\n // or the zero-config source scan — bare @Query() with nothing installed)\n const sql = labels?.source?.kind === 'inline'\n ? labels.source.sql\n : activeResolver\n ? activeResolver.resolve({\n className: this?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n dialect,\n rootDir: labels?.source?.kind === 'fs' ? labels.source.rootDir : undefined,\n })\n : labels?.source?.kind === 'fs'\n ? resolveSqlFromFs(labels.source.rootDir, String(prop), dialect).sql\n : defaultSourceScanResolver()?.resolve({\n className: this?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n dialect,\n });\n if (!sql) {\n throw new SqlStackError(`No SQL source provided for method ${String(prop)}. Use @Query() with a file/folder path or inline sql.`);\n }\n\n // 4) bind placeholders\n // Decide argument mode: positional if SQL contains :argN\n let workingSql = sql;\n const hasPositional = /:arg[1-9][0-9]*/.test(workingSql);\n\n // Prepare args for binder\n let args: any;\n if (hasPositional) {\n args = callArgs;\n } else {\n const namedBase = callArgs.length > 0 ? callArgs[0] : undefined;\n args = applyDefaults(labels.defaults, namedBase ?? {});\n }\n\n // Compute paging and inject :offset/:limit (named mode) or rewrite to positional\n const pageCfg = labels.page;\n if (pageCfg) {\n const { size, zeroBase } = pageCfg;\n const base = zeroBase ? 0 : 1;\n\n // Extract page number from input (object) or a trailing options object in positional mode\n const pageFromObject = (val: any): number | undefined => {\n if (val && typeof val === 'object' && !Array.isArray(val) && typeof (val as any).page !== 'undefined') {\n const p = (val as any).page;\n if (typeof p === 'number' && isFinite(p)) return p;\n }\n return undefined;\n };\n\n let pageNum: number | undefined;\n if (hasPositional) {\n // Variadic-style: only the LAST argument may carry `{ page }`\n if (callArgs.length > 0) {\n const last = callArgs[callArgs.length - 1];\n pageNum = pageFromObject(last);\n }\n } else {\n // Prefer last-arg options if provided; otherwise read from named object\n if (callArgs.length > 1) {\n const last = callArgs[callArgs.length - 1];\n pageNum = pageFromObject(last);\n }\n if (pageNum === undefined) {\n pageNum = pageFromObject(args);\n }\n }\n\n const effectivePage = typeof pageNum === 'number' ? pageNum : base;\n const offset = (effectivePage - base) * size;\n const limit = size;\n\n if (hasPositional) {\n // Replace occurrences of :offset and :limit with new :argN tokens appended to args\n const baseIndex = callArgs.length; // start numbering after user args\n let nextIndex = baseIndex + 1;\n const additions: unknown[] = [];\n\n const rewrite = (sqlText: string) => {\n const out: string[] = [];\n let i = 0;\n let inSQ = false, inDQ = false, inLC = false, inBC = false;\n const len = sqlText.length;\n while (i < len) {\n const ch = sqlText[i];\n const next = i + 1 < len ? sqlText[i + 1] : '';\n if (inLC) { out.push(ch); if (ch === '\\n') inLC = false; i++; continue; }\n if (inBC) { out.push(ch); if (ch === '*' && next === '/') { out.push(next); i++; inBC = false; } i++; continue; }\n if (inSQ) {\n out.push(ch);\n if (ch === \"'\" && next === \"'\") { out.push(next); i += 2; continue; }\n if (ch === \"'\") inSQ = false;\n i++;\n continue;\n }\n if (inDQ) {\n out.push(ch);\n if (ch === '\"' && next === '\"') { out.push(next); i += 2; continue; }\n if (ch === '\"') inDQ = false;\n i++;\n continue;\n }\n if (ch === '-' && next === '-') { out.push(ch, next); i += 2; inLC = true; continue; }\n if (ch === '/' && next === '*') { out.push(ch, next); i += 2; inBC = true; continue; }\n if (ch === '\"') { out.push(ch); inDQ = true; i++; continue; }\n if (ch === \"'\") { out.push(ch); inSQ = true; i++; continue; }\n if (ch === ':' && next === ':') { out.push('::'); i += 2; continue; }\n if (ch === ':') {\n // parse token\n let j = i + 1;\n const start = j;\n while (j < len) {\n const c = sqlText[j];\n if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c === '_') j++; else break;\n }\n const name = sqlText.slice(start, j);\n if (name === 'offset') {\n const token = `:arg${nextIndex++}`;\n out.push(token);\n additions.push(offset);\n i = j;\n continue;\n }\n if (name === 'limit') {\n const token = `:arg${nextIndex++}`;\n out.push(token);\n additions.push(limit);\n i = j;\n continue;\n }\n // otherwise leave untouched\n out.push(':');\n i++;\n continue;\n }\n out.push(ch);\n i++;\n }\n return out.join('');\n };\n\n const rewritten = rewrite(workingSql);\n if (rewritten !== workingSql) {\n workingSql = rewritten;\n // append values so :argK map correctly\n (args as unknown[]).push(...additions);\n }\n } else {\n // Named-mode: attach computed values (override any provided)\n args = { ...(args as Record<string, unknown>), offset, limit };\n }\n }\n const binder =\n dialect === 'postgres' ? createPostgresBinder() : dialect === 'mysql' ? createMysqlBinder() : createSqliteBinder();\n const { sql: boundSql, params } = binder.bind(workingSql, args as any);\n\n // 5) execute query via registry DB\n let out;\n try {\n const tx = getActiveTransaction(entry);\n out = tx ? await tx.query(boundSql, params) : await db.query(boundSql, params);\n } catch (dbError: any) {\n // Attach SQL query (with placeholders) to error for debugging\n throw new DatabaseError(\n dbError?.message || String(dbError),\n boundSql,\n dbError instanceof Error ? dbError : undefined\n );\n }\n\n // 6) If rows were returned (SELECT/CTE/RETURNING), shape + transform + validate;\n // otherwise return the write result as-is (or fail if a shape was requested)\n return finishResult(out, labels, this, prop);\n };\n\n // 0) Invoke the method body inside a run() context. Three outcomes:\n // - body calls run(): the pipeline executed inside the body; return\n // the body's result verbatim (it may have caught/transformed it).\n // - body returns a SqlFragment (template literal path): execute it.\n // - body throws without calling run() (legacy placeholder throw):\n // fall through to the pipeline.\n const runCtx: RunContext = { ran: false, execute: pipeline };\n let fragmentResult: unknown;\n try {\n fragmentResult = await runStorage.run(runCtx, () => original.apply(this, callArgs));\n } catch (bodyError) {\n // A body that invoked run() is real logic — its errors propagate.\n if (runCtx.ran) throw bodyError;\n // Method body threw (e.g. placeholder `throw new Error('replaced')`) — fall through to file/inline SQL\n fragmentResult = undefined;\n }\n if (runCtx.ran) return fragmentResult;\n\n if (fragmentResult instanceof SqlFragment) {\n const { sql: boundSql, params } = fragmentResult.toSQL();\n\n const dbName = labels.db ?? options?.db ?? classLabels?.db;\n const { entry } = await resolveExecution(dbName);\n const db = entry.db;\n\n let out;\n try {\n const tx = getActiveTransaction(entry);\n out = tx ? await tx.query(boundSql, params) : await db.query(boundSql, params);\n } catch (dbError: any) {\n throw new DatabaseError(\n dbError?.message || String(dbError),\n boundSql,\n dbError instanceof Error ? dbError : undefined\n );\n }\n\n return finishResult(out, labels, this, prop);\n }\n\n return pipeline();\n };\n\n return desc;\n };\n}\n\nfunction applyDefaults(defaults: Record<string, unknown> | undefined, input: any) {\n if (!defaults) return input;\n if (Array.isArray(input)) return input; // defaults only apply to named-object args\n return { ...defaults, ...(input || {}) };\n}\n\n// Shared tail of both execution paths. Rows (any statement that produced a\n// result set) are shaped, transformed, and validated. A write result is\n// returned verbatim — unless a result-shape decorator was requested, in which\n// case the statement cannot satisfy it and we fail at the call site instead of\n// silently handing back a truthy `{ rowsAffected }` object.\nfunction finishResult(out: unknown, labels: any, self: any, prop: string | symbol): any {\n if (!Array.isArray(out)) {\n if (labels.shape) {\n throw new ExpectedRowsError(\n `${self?.constructor?.name ?? '<anonymous>'}.${String(prop)}`,\n labels.shape\n );\n }\n return out;\n }\n const shaped = applyShape(out, labels.shape);\n const transformed = labels.transform ? labels.transform(shaped) : shaped;\n\n if (labels.validateSchema && !isValidationDisabled()) {\n if (Array.isArray(transformed)) {\n for (const row of transformed) validateOutput(labels.validateSchema, row);\n } else if (transformed !== null && transformed !== undefined) {\n validateOutput(labels.validateSchema, transformed);\n }\n }\n return transformed;\n}\n\nfunction applyShape<T>(rows: T[], shape?: 'single' | 'only' | 'exist' | 'none'): any {\n switch (shape) {\n case 'single':\n return rows.length > 0 ? rows[0] : null;\n case 'only':\n if (rows.length !== 1) throw new ExactlyOneRowError(rows.length);\n return rows[0];\n case 'exist':\n if (rows.length < 1) throw new NoRowsError();\n return rows[0];\n case 'none':\n if (rows.length > 0) throw new RowsExistError(rows.length);\n return null;\n default:\n return rows;\n }\n}\n"]}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/decorators/query.ts"],"names":[],"mappings":"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","sourcesContent":["import { getClassLabels, getMethodLabels, setMethodLabels } from '../core/metadata';\nimport { SqlStackError, ExactlyOneRowError, NoRowsError, RowsExistError, DatabaseError, ExpectedRowsError } from '../core/errors';\nimport { isValidationDisabled, validateOutput } from '../core/validator';\nimport { resolveExecution, resolveSqlResolver } from '../runtime';\nimport type { SqlResolver } from '../core/resolver';\nimport { createSqliteBinder, createMysqlBinder, createPostgresBinder } from '../binders/sqlBinder';\nimport { coerceRootPath, resolveSqlFromFs } from '../core/fileResolution';\nimport { registerDecoratedMethod, recordQueryMethodOnClass } from '../core/resolver';\nimport { defaultSourceScanResolver } from '../core/sourceScanResolver';\nimport { getActiveTransaction } from '../transactions';\nimport { SqlFragment, compileFragment } from '../sql';\nimport {\n runStorage,\n resolveRunTarget,\n executeOnTarget,\n toRunError,\n fragmentText,\n type RunContext,\n type RunInvocation,\n type RunTarget,\n} from '../run';\n\ntype QueryOptions = {\n sql?: string; // optional inline SQL for testing; otherwise, future: load from file\n db?: string; // optional override DB name\n dialect?: 'sqlite' | 'mysql' | 'postgres';\n};\n\n/**\n * Turn a method into a database query. The body calls `run(...)` (see `run`\n * for its forms); the wrapper resolves SQL, binds, executes, and applies the\n * shape/transform/validation decorators. A string argument is the root\n * directory holding the method's `.sql` file; `{ sql }` gives inline SQL,\n * `{ db }` pins a registered database, `{ dialect }` overrides binding style.\n *\n * The decorated method's promise rejects with:\n * @throws {DatabaseError} When the driver rejects the statement (original\n * error in `.cause`).\n * @throws {SqlStackError} For missing SQL sources, unresolvable databases,\n * and shape/validation failures (ExpectedRowsError, ExactlyOneRowError,\n * NoRowsError, RowsExistError, ValidationError).\n */\nexport function Query(arg?: string | QueryOptions) {\n return function (_target: any, prop: string | symbol, desc: PropertyDescriptor) {\n const options: QueryOptions | undefined = typeof arg === 'string' ? undefined : arg;\n const rootArg: string | undefined = typeof arg === 'string' ? arg : undefined;\n // Store method-level db override if provided\n if (options?.db) {\n setMethodLabels(_target, prop, { db: options.db });\n }\n // Store inline SQL if provided\n if (options?.sql) {\n setMethodLabels(_target, prop, { source: { kind: 'inline', sql: options.sql } });\n } else {\n // FS-based resolution: only an EXPLICIT path argument pins a directory.\n // Bare @Query() resolves through the active resolver (or the default\n // SourceScanResolver) — no stack-based directory guessing, which breaks\n // under bundlers and test transforms.\n const { rootDir } = coerceRootPath(rootArg);\n if (rootDir) {\n setMethodLabels(_target, prop, { source: { kind: 'fs', rootDir } });\n }\n }\n\n // Record for resolver coverage checks: immutable class metadata (the\n // canonical, environment-local source) plus the deprecated global list\n // consulted by the legacy global-resolver path.\n const decoratedEntry = {\n className: _target?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n inline: !!options?.sql,\n };\n recordQueryMethodOnClass(_target, decoratedEntry);\n registerDecoratedMethod(decoratedEntry);\n\n const original = desc.value;\n desc.value = async function (...callArgs: any[]) {\n const labels = getMethodLabels(this, prop);\n const classLabels = getClassLabels(this);\n\n // Resolve, bind, and execute the method's own SQL (inline, resolver,\n // or file) and return the adapter's raw result. `callArgs` is the\n // binding input: the method's own arguments for run() and the legacy\n // fallback, or the params given to run(db, params). `explicit` carries\n // the database chosen by run(db, params).\n const executeMethodSql = async (\n callArgs: any[],\n explicit: { target: RunTarget; resolver: SqlResolver | undefined } | undefined,\n onSql: (sqlText: string) => void\n ): Promise<unknown> => {\n // 1) prepare args with defaults\n const rawInput = callArgs.length === 1 ? callArgs[0] : callArgs; // object or positional array\n\n // 2) choose database and dialect via the active environment (or run's explicit database)\n let target: RunTarget;\n let activeResolver: SqlResolver | undefined;\n if (explicit) {\n target = explicit.target;\n activeResolver = explicit.resolver;\n } else {\n target = await contextTarget();\n activeResolver = target.resolver;\n }\n const db = target.db;\n const dialect = options?.dialect ?? db.dialect ?? 'sqlite';\n\n // 3) load SQL source (inline, environment resolver, v1 fs fallback,\n // or the zero-config source scan — bare @Query() with nothing installed)\n const sql = labels?.source?.kind === 'inline'\n ? labels.source.sql\n : activeResolver\n ? activeResolver.resolve({\n className: this?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n dialect,\n rootDir: labels?.source?.kind === 'fs' ? labels.source.rootDir : undefined,\n })\n : labels?.source?.kind === 'fs'\n ? resolveSqlFromFs(labels.source.rootDir, String(prop), dialect).sql\n : defaultSourceScanResolver()?.resolve({\n className: this?.constructor?.name ?? '<anonymous>',\n methodName: String(prop),\n dialect,\n });\n if (!sql) {\n throw new SqlStackError(`No SQL source provided for method ${String(prop)}. Use @Query() with a file/folder path or inline sql.`);\n }\n onSql(sql);\n\n // 4) bind placeholders\n // Decide argument mode: positional if SQL contains :argN\n let workingSql = sql;\n const hasPositional = /:arg[1-9][0-9]*/.test(workingSql);\n\n // Prepare args for binder\n let args: any;\n if (hasPositional) {\n args = callArgs;\n } else {\n const namedBase = callArgs.length > 0 ? callArgs[0] : undefined;\n args = applyDefaults(labels.defaults, namedBase ?? {});\n }\n\n // Compute paging and inject :offset/:limit (named mode) or rewrite to positional\n const pageCfg = labels.page;\n if (pageCfg) {\n const { size, zeroBase } = pageCfg;\n const base = zeroBase ? 0 : 1;\n\n // Extract page number from input (object) or a trailing options object in positional mode\n const pageFromObject = (val: any): number | undefined => {\n if (val && typeof val === 'object' && !Array.isArray(val) && typeof (val as any).page !== 'undefined') {\n const p = (val as any).page;\n if (typeof p === 'number' && isFinite(p)) return p;\n }\n return undefined;\n };\n\n let pageNum: number | undefined;\n if (hasPositional) {\n // Variadic-style: only the LAST argument may carry `{ page }`\n if (callArgs.length > 0) {\n const last = callArgs[callArgs.length - 1];\n pageNum = pageFromObject(last);\n }\n } else {\n // Prefer last-arg options if provided; otherwise read from named object\n if (callArgs.length > 1) {\n const last = callArgs[callArgs.length - 1];\n pageNum = pageFromObject(last);\n }\n if (pageNum === undefined) {\n pageNum = pageFromObject(args);\n }\n }\n\n const effectivePage = typeof pageNum === 'number' ? pageNum : base;\n const offset = (effectivePage - base) * size;\n const limit = size;\n\n if (hasPositional) {\n // Replace occurrences of :offset and :limit with new :argN tokens appended to args\n const baseIndex = callArgs.length; // start numbering after user args\n let nextIndex = baseIndex + 1;\n const additions: unknown[] = [];\n\n const rewrite = (sqlText: string) => {\n const out: string[] = [];\n let i = 0;\n let inSQ = false, inDQ = false, inLC = false, inBC = false;\n const len = sqlText.length;\n while (i < len) {\n const ch = sqlText[i];\n const next = i + 1 < len ? sqlText[i + 1] : '';\n if (inLC) { out.push(ch); if (ch === '\\n') inLC = false; i++; continue; }\n if (inBC) { out.push(ch); if (ch === '*' && next === '/') { out.push(next); i++; inBC = false; } i++; continue; }\n if (inSQ) {\n out.push(ch);\n if (ch === \"'\" && next === \"'\") { out.push(next); i += 2; continue; }\n if (ch === \"'\") inSQ = false;\n i++;\n continue;\n }\n if (inDQ) {\n out.push(ch);\n if (ch === '\"' && next === '\"') { out.push(next); i += 2; continue; }\n if (ch === '\"') inDQ = false;\n i++;\n continue;\n }\n if (ch === '-' && next === '-') { out.push(ch, next); i += 2; inLC = true; continue; }\n if (ch === '/' && next === '*') { out.push(ch, next); i += 2; inBC = true; continue; }\n if (ch === '\"') { out.push(ch); inDQ = true; i++; continue; }\n if (ch === \"'\") { out.push(ch); inSQ = true; i++; continue; }\n if (ch === ':' && next === ':') { out.push('::'); i += 2; continue; }\n if (ch === ':') {\n // parse token\n let j = i + 1;\n const start = j;\n while (j < len) {\n const c = sqlText[j];\n if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c === '_') j++; else break;\n }\n const name = sqlText.slice(start, j);\n if (name === 'offset') {\n const token = `:arg${nextIndex++}`;\n out.push(token);\n additions.push(offset);\n i = j;\n continue;\n }\n if (name === 'limit') {\n const token = `:arg${nextIndex++}`;\n out.push(token);\n additions.push(limit);\n i = j;\n continue;\n }\n // otherwise leave untouched\n out.push(':');\n i++;\n continue;\n }\n out.push(ch);\n i++;\n }\n return out.join('');\n };\n\n const rewritten = rewrite(workingSql);\n if (rewritten !== workingSql) {\n workingSql = rewritten;\n // append values so :argK map correctly\n (args as unknown[]).push(...additions);\n }\n } else {\n // Named-mode: attach computed values (override any provided)\n args = { ...(args as Record<string, unknown>), offset, limit };\n }\n }\n const binder =\n dialect === 'postgres' ? createPostgresBinder() : dialect === 'mysql' ? createMysqlBinder() : createSqliteBinder();\n // Binding failures (missing :name, bad array value) surface as DatabaseError like every\n // other run() failure; the original error stays in `.cause`.\n let bound: { sql: string; params: unknown[] };\n try {\n bound = binder.bind(workingSql, args as any);\n } catch (bindError) {\n throw toRunError(bindError, workingSql);\n }\n const { sql: boundSql, params } = bound;\n onSql(boundSql);\n\n // 5) execute query (inside the active transaction on that database, if any)\n let out;\n try {\n out = target.tx ? await target.tx.query(boundSql, params) : await db.query(boundSql, params);\n } catch (dbError: any) {\n // Attach SQL query (with placeholders) to error for debugging\n throw new DatabaseError(\n dbError?.message || String(dbError),\n boundSql,\n dbError instanceof Error ? dbError : undefined\n );\n }\n return out;\n };\n\n // Database from the decorator context: @Query({ db }), @QueryBinder({ db }),\n // or the environment default.\n const contextTarget = async (): Promise<RunTarget> => {\n const dbName = labels.db ?? options?.db ?? classLabels?.db;\n const resolved = await resolveExecution(dbName);\n return {\n db: resolved.entry.db,\n tx: getActiveTransaction(resolved.entry),\n resolver: resolved.resolver,\n byName: true,\n };\n };\n\n // run's argument-taking forms: return the adapter's raw result.\n const executeInvocation = async (\n invocation: Exclude<RunInvocation, { kind: 'default' }>,\n onSql: (sqlText: string) => void\n ): Promise<unknown> => {\n if (invocation.kind === 'fragment') {\n // run(query) / run(db, query): the fragment replaces the method's SQL;\n // the method's arguments are not bound.\n const target = invocation.db !== undefined ? await resolveRunTarget(invocation.db) : await contextTarget();\n const dialect = options?.dialect ?? target.db.dialect ?? 'sqlite';\n const { sql: boundSql, params } = compileFragment(invocation.fragment, dialect);\n onSql(boundSql);\n return executeOnTarget(target, boundSql, params);\n }\n // run(db, params): the method's own SQL against db, bound from params\n // only (an object for :named, an array for :argN).\n const target = await resolveRunTarget(invocation.db);\n // Inline SQL needs no resolver; only look one up for file-based SQL.\n const resolver = target.byName\n ? target.resolver\n : labels?.source?.kind === 'inline'\n ? undefined\n : await resolveSqlResolver();\n const bindArgs = Array.isArray(invocation.params) ? [...invocation.params] : [invocation.params];\n return executeMethodSql(bindArgs, { target, resolver }, onSql);\n };\n\n // The full pipeline: execute, then — if rows were returned\n // (SELECT/CTE/RETURNING) — shape + transform + validate; a write result\n // is returned as-is (or fails if a shape was requested). Invoked by\n // run() from inside the method body, or directly as the legacy fallback\n // when the body throws. The zero-argument path is unchanged; run's\n // argument-taking forms get the unified error contract: any failure\n // before shaping that is not already a SqlStackError becomes a\n // DatabaseError with the original error in `.cause`.\n const pipeline = async (invocation?: RunInvocation): Promise<unknown> => {\n if (invocation === undefined || invocation.kind === 'default') {\n const out = await executeMethodSql(callArgs, undefined, () => {});\n return finishResult(out, labels, this, prop);\n }\n let sqlText = invocation.kind === 'fragment' ? fragmentText(invocation.fragment) : '';\n let out: unknown;\n try {\n out = await executeInvocation(invocation, (s) => {\n sqlText = s;\n });\n } catch (err) {\n throw toRunError(err, sqlText);\n }\n return finishResult(out, labels, this, prop);\n };\n\n // 0) Invoke the method body inside a run() context. Three outcomes:\n // - body calls run(...): the pipeline executed inside the body; return\n // the body's result verbatim (it may have caught/transformed it).\n // - body returns a SqlFragment (deprecated template literal path):\n // execute it.\n // - body throws without calling run() (legacy placeholder throw):\n // fall through to the pipeline.\n const runCtx: RunContext = { ran: false, execute: pipeline, invocations: true };\n let fragmentResult: unknown;\n try {\n fragmentResult = await runStorage.run(runCtx, () => original.apply(this, callArgs));\n } catch (bodyError) {\n // A body that invoked run() is real logic — its errors propagate.\n if (runCtx.ran) throw bodyError;\n // Method body threw (e.g. placeholder `throw new Error('replaced')`) — fall through to file/inline SQL\n fragmentResult = undefined;\n }\n if (runCtx.ran) return fragmentResult;\n\n if (fragmentResult instanceof SqlFragment) {\n warnFragmentBodyDeprecated(this, prop);\n const { sql: boundSql, params } = fragmentResult.toSQL();\n\n const dbName = labels.db ?? options?.db ?? classLabels?.db;\n const { entry } = await resolveExecution(dbName);\n const db = entry.db;\n\n let out;\n try {\n const tx = getActiveTransaction(entry);\n out = tx ? await tx.query(boundSql, params) : await db.query(boundSql, params);\n } catch (dbError: any) {\n throw new DatabaseError(\n dbError?.message || String(dbError),\n boundSql,\n dbError instanceof Error ? dbError : undefined\n );\n }\n\n return finishResult(out, labels, this, prop);\n }\n\n return pipeline();\n };\n\n return desc;\n };\n}\n\n// Deprecated (removal in the next major version): a @Query body that RETURNS\n// an sql`` fragment. It only type-checks when the method's declared return\n// type is bent to admit SqlFragment (an `as any`-style hole). One warning per\n// class.method per process.\nconst warnedFragmentBodies = new Set<string>();\n\nfunction warnFragmentBodyDeprecated(self: any, prop: string | symbol): void {\n const key = `${self?.constructor?.name ?? '<anonymous>'}.${String(prop)}`;\n if (warnedFragmentBodies.has(key)) return;\n warnedFragmentBodies.add(key);\n process.emitWarning(\n `@Query method ${key} returns an sql\\`\\` fragment from its body. This form is deprecated and will be ` +\n 'removed in the next major version. Use `return run(sql`...`)` (or `return run(db, sql`...`)`) instead.',\n { type: 'DeprecationWarning', code: 'SQLSTACK_FRAGMENT_BODY' }\n );\n}\n\nfunction applyDefaults(defaults: Record<string, unknown> | undefined, input: any) {\n if (!defaults) return input;\n if (Array.isArray(input)) return input; // defaults only apply to named-object args\n return { ...defaults, ...(input || {}) };\n}\n\n// Shared tail of both execution paths. Rows (any statement that produced a\n// result set) are shaped, transformed, and validated. A write result is\n// returned verbatim — unless a result-shape decorator was requested, in which\n// case the statement cannot satisfy it and we fail at the call site instead of\n// silently handing back a truthy `{ rowsAffected }` object.\nfunction finishResult(out: unknown, labels: any, self: any, prop: string | symbol): any {\n if (!Array.isArray(out)) {\n if (labels.shape) {\n throw new ExpectedRowsError(\n `${self?.constructor?.name ?? '<anonymous>'}.${String(prop)}`,\n labels.shape\n );\n }\n return out;\n }\n const shaped = applyShape(out, labels.shape);\n const transformed = labels.transform ? labels.transform(shaped) : shaped;\n\n if (labels.validateSchema && !isValidationDisabled()) {\n if (Array.isArray(transformed)) {\n for (const row of transformed) validateOutput(labels.validateSchema, row);\n } else if (transformed !== null && transformed !== undefined) {\n validateOutput(labels.validateSchema, transformed);\n }\n }\n return transformed;\n}\n\nfunction applyShape<T>(rows: T[], shape?: 'single' | 'only' | 'exist' | 'none'): any {\n switch (shape) {\n case 'single':\n return rows.length > 0 ? rows[0] : null;\n case 'only':\n if (rows.length !== 1) throw new ExactlyOneRowError(rows.length);\n return rows[0];\n case 'exist':\n if (rows.length < 1) throw new NoRowsError();\n return rows[0];\n case 'none':\n if (rows.length > 0) throw new RowsExistError(rows.length);\n return null;\n default:\n return rows;\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  export { sql, SqlFragment } from './sql';
2
2
  export { run } from './run';
3
+ export type { RunDatabase, RejectCompiledSql } from './run';
3
4
  export * from './decorators/queryBinder';
4
5
  export * from './decorators/query';
5
6
  export * from './decorators/defaults';
@@ -22,7 +23,7 @@ export type { DatabaseFamilyProvider, FamilyConfig, FamilyMemberEntry, DatabaseL
22
23
  export { sqliteFamily } from './families/sqliteFamily';
23
24
  export type { SqliteFamilyOptions } from './families/sqliteFamily';
24
25
  export type { SqlResolver, SqlManifest, SqlResolutionRequest, ManifestResolverOptions } from './core/resolver';
25
- export { FsResolver, ManifestResolver, MANIFEST_DIALECT_EXT } from './core/resolver';
26
+ export { FsResolver, ManifestResolver, MANIFEST_DIALECT_EXT, getActiveResolver } from './core/resolver';
26
27
  export { SourceScanResolver } from './core/sourceScanResolver';
27
28
  export * from './binders/sqlBinder';
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAIzC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG5D,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,cAAc,qBAAqB,CAAC"}