sqlstack 1.0.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 (70) hide show
  1. package/dist/adapters/index.d.ts +4 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/index.js +10 -0
  4. package/dist/adapters/index.js.map +1 -0
  5. package/dist/adapters/mysql.d.ts +3 -0
  6. package/dist/adapters/mysql.d.ts.map +1 -0
  7. package/dist/adapters/mysql.js +21 -0
  8. package/dist/adapters/mysql.js.map +1 -0
  9. package/dist/adapters/pg.d.ts +3 -0
  10. package/dist/adapters/pg.d.ts.map +1 -0
  11. package/dist/adapters/pg.js +20 -0
  12. package/dist/adapters/pg.js.map +1 -0
  13. package/dist/adapters/sqlite.d.ts +3 -0
  14. package/dist/adapters/sqlite.d.ts.map +1 -0
  15. package/dist/adapters/sqlite.js +64 -0
  16. package/dist/adapters/sqlite.js.map +1 -0
  17. package/dist/adapters/test.d.ts +3 -0
  18. package/dist/adapters/test.d.ts.map +1 -0
  19. package/dist/adapters/test.js +47 -0
  20. package/dist/adapters/test.js.map +1 -0
  21. package/dist/binders/sqlBinder.d.ts +14 -0
  22. package/dist/binders/sqlBinder.d.ts.map +1 -0
  23. package/dist/binders/sqlBinder.js +189 -0
  24. package/dist/binders/sqlBinder.js.map +1 -0
  25. package/dist/core/errors.d.ts +13 -0
  26. package/dist/core/errors.d.ts.map +1 -0
  27. package/dist/core/errors.js +32 -0
  28. package/dist/core/errors.js.map +1 -0
  29. package/dist/core/fileResolution.d.ts +11 -0
  30. package/dist/core/fileResolution.d.ts.map +1 -0
  31. package/dist/core/fileResolution.js +82 -0
  32. package/dist/core/fileResolution.js.map +1 -0
  33. package/dist/core/metadata.d.ts +26 -0
  34. package/dist/core/metadata.d.ts.map +1 -0
  35. package/dist/core/metadata.js +31 -0
  36. package/dist/core/metadata.js.map +1 -0
  37. package/dist/core/validator.d.ts +8 -0
  38. package/dist/core/validator.d.ts.map +1 -0
  39. package/dist/core/validator.js +66 -0
  40. package/dist/core/validator.js.map +1 -0
  41. package/dist/decorators/defaults.d.ts +2 -0
  42. package/dist/decorators/defaults.d.ts.map +1 -0
  43. package/dist/decorators/defaults.js +10 -0
  44. package/dist/decorators/defaults.js.map +1 -0
  45. package/dist/decorators/query.d.ts +8 -0
  46. package/dist/decorators/query.d.ts.map +1 -0
  47. package/dist/decorators/query.js +101 -0
  48. package/dist/decorators/query.js.map +1 -0
  49. package/dist/decorators/queryBinder.d.ts +4 -0
  50. package/dist/decorators/queryBinder.d.ts.map +1 -0
  51. package/dist/decorators/queryBinder.js +10 -0
  52. package/dist/decorators/queryBinder.js.map +1 -0
  53. package/dist/decorators/resultShape.d.ts +5 -0
  54. package/dist/decorators/resultShape.d.ts.map +1 -0
  55. package/dist/decorators/resultShape.js +20 -0
  56. package/dist/decorators/resultShape.js.map +1 -0
  57. package/dist/decorators/validateResult.d.ts +2 -0
  58. package/dist/decorators/validateResult.d.ts.map +1 -0
  59. package/dist/decorators/validateResult.js +11 -0
  60. package/dist/decorators/validateResult.js.map +1 -0
  61. package/dist/index.d.ts +11 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +27 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/registry.d.ts +16 -0
  66. package/dist/registry.d.ts.map +1 -0
  67. package/dist/registry.js +29 -0
  68. package/dist/registry.js.map +1 -0
  69. package/package.json +86 -0
  70. package/readme.md +376 -0
@@ -0,0 +1,4 @@
1
+ export { createSqliteDb } from './sqlite';
2
+ export { createPgDb } from './pg';
3
+ export { createMysqlDb } from './mysql';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMysqlDb = exports.createPgDb = exports.createSqliteDb = void 0;
4
+ var sqlite_1 = require("./sqlite");
5
+ Object.defineProperty(exports, "createSqliteDb", { enumerable: true, get: function () { return sqlite_1.createSqliteDb; } });
6
+ var pg_1 = require("./pg");
7
+ Object.defineProperty(exports, "createPgDb", { enumerable: true, get: function () { return pg_1.createPgDb; } });
8
+ var mysql_1 = require("./mysql");
9
+ Object.defineProperty(exports, "createMysqlDb", { enumerable: true, get: function () { return mysql_1.createMysqlDb; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,2BAAkC;AAAzB,gGAAA,UAAU,OAAA;AACnB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA","sourcesContent":["export { createSqliteDb } from './sqlite';\nexport { createPgDb } from './pg';\nexport { createMysqlDb } from './mysql';\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Database } from '../registry';
2
+ export declare function createMysqlDb(url: string): Database;
3
+ //# sourceMappingURL=mysql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/adapters/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAgBnD"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMysqlDb = createMysqlDb;
4
+ function createMysqlDb(url) {
5
+ // Lazy import to keep driver optional
6
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
7
+ const mysql = require('mysql2/promise');
8
+ const pool = mysql.createPool({ uri: url, connectionLimit: 4 });
9
+ return {
10
+ dialect: 'mysql',
11
+ async query(sql, params) {
12
+ const [rows] = await pool.query(sql, params);
13
+ // rows may be RowDataPacket[]; spread into plain objects
14
+ return Array.isArray(rows) ? rows.map((r) => ({ ...r })) : [];
15
+ },
16
+ async close() {
17
+ await pool.end();
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/adapters/mysql.ts"],"names":[],"mappings":";;AAEA,sCAgBC;AAhBD,SAAgB,aAAa,CAAC,GAAW;IACvC,sCAAsC;IACtC,8DAA8D;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB;YACxC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7C,yDAAyD;YACzD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAI,CAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;KACU,CAAC;AAChB,CAAC","sourcesContent":["import type { Database } from '../registry';\n\nexport function createMysqlDb(url: string): Database {\n // Lazy import to keep driver optional\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mysql = require('mysql2/promise');\n const pool = mysql.createPool({ uri: url, connectionLimit: 4 });\n return {\n dialect: 'mysql',\n async query(sql: string, params: unknown[]) {\n const [rows] = await pool.query(sql, params);\n // rows may be RowDataPacket[]; spread into plain objects\n return Array.isArray(rows) ? rows.map((r) => ({ ...(r as any) })) : [];\n },\n async close() {\n await pool.end();\n },\n } as Database;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Database } from '../registry';
2
+ export declare function createPgDb(url: string): Database;
3
+ //# sourceMappingURL=pg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../src/adapters/pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAehD"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPgDb = createPgDb;
4
+ function createPgDb(url) {
5
+ // Lazy import to keep driver optional
6
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
7
+ const { Pool } = require('pg');
8
+ const pool = new Pool({ connectionString: url, max: 4 });
9
+ return {
10
+ dialect: 'postgres',
11
+ async query(sql, params) {
12
+ const res = await pool.query(sql, params);
13
+ return res.rows;
14
+ },
15
+ async close() {
16
+ await pool.end();
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=pg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.js","sourceRoot":"","sources":["../../src/adapters/pg.ts"],"names":[],"mappings":";;AAEA,gCAeC;AAfD,SAAgB,UAAU,CAAC,GAAW;IACpC,sCAAsC;IACtC,8DAA8D;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB;YACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1C,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;KACU,CAAC;AAChB,CAAC","sourcesContent":["import type { Database } from '../registry';\n\nexport function createPgDb(url: string): Database {\n // Lazy import to keep driver optional\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Pool } = require('pg');\n const pool = new Pool({ connectionString: url, max: 4 });\n return {\n dialect: 'postgres',\n async query(sql: string, params: unknown[]) {\n const res = await pool.query(sql, params);\n return res.rows;\n },\n async close() {\n await pool.end();\n },\n } as Database;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Database } from '../registry';
2
+ export declare function createSqliteDb(filename: string): Database;
3
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +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;AAE5C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAyDzD"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSqliteDb = createSqliteDb;
4
+ function createSqliteDb(filename) {
5
+ // Prefer better-sqlite3
6
+ try {
7
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
8
+ const BetterSqlite3 = require('better-sqlite3');
9
+ const db = new BetterSqlite3(filename);
10
+ return {
11
+ dialect: 'sqlite',
12
+ async query(sql, params) {
13
+ const stmt = db.prepare(sql);
14
+ const text = String(sql).trim().toUpperCase();
15
+ if (text.startsWith('SELECT') || text.startsWith('WITH')) {
16
+ return stmt.all(...params);
17
+ }
18
+ stmt.run(...params);
19
+ return [];
20
+ },
21
+ close() {
22
+ db.close();
23
+ },
24
+ };
25
+ }
26
+ catch { }
27
+ // Fallback to sqlite3
28
+ try {
29
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
30
+ const sqlite3 = require('sqlite3');
31
+ const db = new sqlite3.Database(filename);
32
+ return {
33
+ dialect: 'sqlite',
34
+ async query(sql, params) {
35
+ const text = String(sql).trim().toUpperCase();
36
+ if (text.startsWith('SELECT') || text.startsWith('WITH')) {
37
+ return new Promise((resolve, reject) => {
38
+ db.all(sql, params, (err, rows) => {
39
+ if (err)
40
+ return reject(err);
41
+ resolve(rows || []);
42
+ });
43
+ });
44
+ }
45
+ // Non-SELECT statements
46
+ return new Promise((resolve, reject) => {
47
+ db.run(sql, params, (err) => {
48
+ if (err)
49
+ return reject(err);
50
+ resolve([]);
51
+ });
52
+ });
53
+ },
54
+ close() {
55
+ return new Promise((resolve, reject) => {
56
+ db.close((err) => (err ? reject(err) : resolve()));
57
+ });
58
+ },
59
+ };
60
+ }
61
+ catch { }
62
+ throw new Error('No SQLite driver available. Install either better-sqlite3 or sqlite3.');
63
+ }
64
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":";;AAEA,wCAyDC;AAzDD,SAAgB,cAAc,CAAC,QAAgB;IAC7C,wBAAwB;IACxB,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB;gBACxC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;SACU,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,sBAAsB;IACtB,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB;gBACxC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBAC5C,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAiB,EAAE,IAAW,EAAE,EAAE;4BACrD,IAAI,GAAG;gCAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;4BAC5B,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;wBACtB,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,wBAAwB;gBACxB,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC5C,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAiB,EAAE,EAAE;wBACxC,IAAI,GAAG;4BAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC5B,OAAO,CAAC,EAAE,CAAC,CAAC;oBACd,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;YACD,KAAK;gBACH,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC3C,EAAE,CAAC,KAAK,CAAC,CAAC,GAAiB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC,CAAC,CAAC;YACL,CAAC;SACU,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;AAC3F,CAAC","sourcesContent":["import type { Database } from '../registry';\n\nexport function createSqliteDb(filename: string): Database {\n // Prefer better-sqlite3\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const BetterSqlite3 = require('better-sqlite3');\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 const text = String(sql).trim().toUpperCase();\n if (text.startsWith('SELECT') || text.startsWith('WITH')) {\n return stmt.all(...params);\n }\n stmt.run(...params);\n return [];\n },\n close() {\n db.close();\n },\n } as Database;\n } catch {}\n\n // Fallback to sqlite3\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const sqlite3 = require('sqlite3');\n const db = new sqlite3.Database(filename);\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]) {\n const text = String(sql).trim().toUpperCase();\n if (text.startsWith('SELECT') || text.startsWith('WITH')) {\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<any[]>((resolve, reject) => {\n db.run(sql, params, (err: Error | null) => {\n if (err) return reject(err);\n resolve([]);\n });\n });\n },\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 } catch {}\n\n throw new Error('No SQLite driver available. Install either better-sqlite3 or sqlite3.');\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Database } from '../registry';
2
+ export declare function createTestDb(): Database;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/adapters/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAgB,YAAY,IAAI,QAAQ,CAiDvC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestDb = createTestDb;
4
+ function createTestDb() {
5
+ const tables = Object.create(null);
6
+ const ensure = (name) => (tables[name] || (tables[name] = []));
7
+ return {
8
+ dialect: 'sqlite',
9
+ async query(sql, params) {
10
+ const s = sql.trim().toUpperCase();
11
+ // Very small subset for tests: CREATE TABLE users
12
+ if (s.startsWith('CREATE TABLE USERS')) {
13
+ ensure('users');
14
+ return [];
15
+ }
16
+ // INSERT INTO users (id, email, status, ...)
17
+ if (s.startsWith('INSERT INTO USERS')) {
18
+ const users = ensure('users');
19
+ // naive: params order must match tests
20
+ const [id, email, status, created_at] = params;
21
+ users.push({ id, email, status, created_at });
22
+ return [];
23
+ }
24
+ // SELECT id, email, status FROM users WHERE email = ? AND status = ?
25
+ if (/FROM\s+users/i.test(sql) && /WHERE\s+email\s*=/.test(sql) && /status\s*=/.test(sql)) {
26
+ const [email, status] = params;
27
+ return ensure('users').filter((r) => r.email === email && r.status === status);
28
+ }
29
+ // SELECT id, email, status FROM users WHERE id = ?
30
+ if (/FROM\s+users/i.test(sql) && /WHERE\s+id\s*=/.test(sql)) {
31
+ const [id] = params;
32
+ return ensure('users').filter((r) => r.id === id).map((r) => ({ id: r.id, email: r.email, status: r.status }));
33
+ }
34
+ // SELECT id FROM users WHERE status = ? ORDER BY id
35
+ if (/FROM\s+users/i.test(sql) && /WHERE\s+status\s*=/.test(sql)) {
36
+ const [status] = params;
37
+ return ensure('users')
38
+ .filter((r) => r.status === status)
39
+ .sort((a, b) => String(a.id).localeCompare(String(b.id)))
40
+ .map((r) => ({ id: r.id }));
41
+ }
42
+ // Fallback: return empty
43
+ return [];
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/adapters/test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Database } from '../registry';\n\ntype Row = Record<string, any>;\n\nexport function createTestDb(): Database {\n const tables: Record<string, Row[]> = Object.create(null);\n const ensure = (name: string) => (tables[name] ||= []);\n\n return {\n dialect: 'sqlite',\n async query(sql: string, params: unknown[]): Promise<any[]> {\n const s = sql.trim().toUpperCase();\n\n // Very small subset for tests: CREATE TABLE users\n if (s.startsWith('CREATE TABLE USERS')) {\n ensure('users');\n return [];\n }\n\n // INSERT INTO users (id, email, status, ...)\n if (s.startsWith('INSERT INTO USERS')) {\n const users = ensure('users');\n // naive: params order must match tests\n const [id, email, status, created_at] = params as any[];\n users.push({ id, email, status, created_at });\n return [];\n }\n\n // SELECT id, email, status FROM users WHERE email = ? AND status = ?\n if (/FROM\\s+users/i.test(sql) && /WHERE\\s+email\\s*=/.test(sql) && /status\\s*=/.test(sql)) {\n const [email, status] = params as any[];\n return ensure('users').filter((r) => r.email === email && r.status === status);\n }\n\n // SELECT id, email, status FROM users WHERE id = ?\n if (/FROM\\s+users/i.test(sql) && /WHERE\\s+id\\s*=/.test(sql)) {\n const [id] = params as any[];\n return ensure('users').filter((r) => r.id === id).map((r) => ({ id: r.id, email: r.email, status: r.status }));\n }\n\n // SELECT id FROM users WHERE status = ? ORDER BY id\n if (/FROM\\s+users/i.test(sql) && /WHERE\\s+status\\s*=/.test(sql)) {\n const [status] = params as any[];\n return ensure('users')\n .filter((r) => r.status === status)\n .sort((a, b) => String(a.id).localeCompare(String(b.id)))\n .map((r) => ({ id: r.id }));\n }\n\n // Fallback: return empty\n return [];\n },\n };\n}\n"]}
@@ -0,0 +1,14 @@
1
+ export type BindResult = {
2
+ sql: string;
3
+ params: unknown[];
4
+ };
5
+ export interface SqlBinder {
6
+ bind(sql: string, args: Record<string, unknown> | unknown[]): BindResult;
7
+ }
8
+ type Dialect = 'mysql' | 'sqlite' | 'postgres';
9
+ export declare function createBinder(dialect: Dialect): SqlBinder;
10
+ export declare const createMysqlBinder: () => SqlBinder;
11
+ export declare const createSqliteBinder: () => SqlBinder;
12
+ export declare const createPostgresBinder: () => SqlBinder;
13
+ export {};
14
+ //# sourceMappingURL=sqlBinder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlBinder.d.ts","sourceRoot":"","sources":["../../src/binders/sqlBinder.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,UAAU,CAAC;CAC1E;AAED,KAAK,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAiLxD;AAED,eAAO,MAAM,iBAAiB,iBAA8B,CAAC;AAC7D,eAAO,MAAM,kBAAkB,iBAA+B,CAAC;AAC/D,eAAO,MAAM,oBAAoB,iBAAiC,CAAC"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPostgresBinder = exports.createSqliteBinder = exports.createMysqlBinder = void 0;
4
+ exports.createBinder = createBinder;
5
+ function createBinder(dialect) {
6
+ const placeholder = (indexRef) => {
7
+ if (dialect === 'postgres')
8
+ return `$${indexRef.i++}`;
9
+ return '?'; // mysql + sqlite
10
+ };
11
+ return {
12
+ bind(sql, args) {
13
+ const isArrayArgs = Array.isArray(args);
14
+ const params = [];
15
+ const out = [];
16
+ let i = 0;
17
+ let inSQ = false; // single quote string
18
+ let inDQ = false; // double quote identifier
19
+ let inLC = false; // line comment -- ...\n
20
+ let inBC = false; // block comment /* ... */
21
+ const pgIndex = { i: 1 };
22
+ let sawNamed = false;
23
+ let sawPositional = false;
24
+ const len = sql.length;
25
+ while (i < len) {
26
+ const ch = sql[i];
27
+ const next = i + 1 < len ? sql[i + 1] : '';
28
+ // Handle exiting comments/strings first
29
+ if (inLC) {
30
+ out.push(ch);
31
+ i++;
32
+ if (ch === '\n')
33
+ inLC = false;
34
+ continue;
35
+ }
36
+ if (inBC) {
37
+ out.push(ch);
38
+ i++;
39
+ if (ch === '*' && next === '/') {
40
+ out.push(next);
41
+ i++;
42
+ inBC = false;
43
+ }
44
+ continue;
45
+ }
46
+ if (inSQ) {
47
+ out.push(ch);
48
+ i++;
49
+ // escape '' inside string
50
+ if (ch === "'" && next === "'") {
51
+ out.push(next);
52
+ i++;
53
+ }
54
+ else if (ch === "'") {
55
+ inSQ = false;
56
+ }
57
+ continue;
58
+ }
59
+ if (inDQ) {
60
+ out.push(ch);
61
+ i++;
62
+ // escape "" inside identifier
63
+ if (ch === '"' && next === '"') {
64
+ out.push(next);
65
+ i++;
66
+ }
67
+ else if (ch === '"') {
68
+ inDQ = false;
69
+ }
70
+ continue;
71
+ }
72
+ // Not inside string/comment
73
+ if (ch === '-' && next === '-') {
74
+ out.push(ch, next);
75
+ i += 2;
76
+ inLC = true;
77
+ continue;
78
+ }
79
+ if (ch === '/' && next === '*') {
80
+ out.push(ch, next);
81
+ i += 2;
82
+ inBC = true;
83
+ continue;
84
+ }
85
+ if (ch === "'") {
86
+ out.push(ch);
87
+ i++;
88
+ inSQ = true;
89
+ continue;
90
+ }
91
+ if (ch === '"') {
92
+ out.push(ch);
93
+ i++;
94
+ inDQ = true;
95
+ continue;
96
+ }
97
+ // Postgres cast :: — skip as literal
98
+ if (ch === ':' && next === ':') {
99
+ out.push('::');
100
+ i += 2;
101
+ continue;
102
+ }
103
+ if (ch === ':') {
104
+ // Attempt to parse a parameter token
105
+ let j = i + 1;
106
+ const start = j;
107
+ while (j < len) {
108
+ const c = sql[j];
109
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c === '_') {
110
+ j++;
111
+ }
112
+ else {
113
+ break;
114
+ }
115
+ }
116
+ const name = sql.slice(start, j);
117
+ if (!name) {
118
+ // not a parameter — keep literal ':'
119
+ out.push(':');
120
+ i++;
121
+ continue;
122
+ }
123
+ // Decide positional vs named
124
+ const m = /^arg([1-9][0-9]*)$/.exec(name);
125
+ const isPos = !!m;
126
+ if (isPos)
127
+ sawPositional = true;
128
+ else
129
+ sawNamed = true;
130
+ if (sawNamed && sawPositional) {
131
+ throw new Error('Cannot mix named and positional parameters in a single query');
132
+ }
133
+ let value;
134
+ if (isPos) {
135
+ if (!isArrayArgs)
136
+ throw new Error('Positional placeholders require array arguments');
137
+ const index = parseInt(m[1], 10) - 1; // 1-based in SQL
138
+ const arr = args;
139
+ if (index < 0 || index >= arr.length)
140
+ throw new Error(`Missing positional argument :${name}`);
141
+ value = arr[index];
142
+ }
143
+ else {
144
+ if (isArrayArgs)
145
+ throw new Error('Named placeholders require a parameter object');
146
+ const obj = args;
147
+ if (!Object.prototype.hasOwnProperty.call(obj, name)) {
148
+ throw new Error(`Missing named parameter :${name}`);
149
+ }
150
+ value = obj[name];
151
+ }
152
+ if (value === undefined) {
153
+ throw new Error(`Parameter :${name} is undefined`);
154
+ }
155
+ // Expand placeholder(s)
156
+ if (Array.isArray(value)) {
157
+ if (value.length === 0)
158
+ throw new Error(`Array parameter :${name} must not be empty`);
159
+ const placeholders = [];
160
+ for (const v of value) {
161
+ if (v === undefined)
162
+ throw new Error(`Array parameter :${name} contains undefined`);
163
+ placeholders.push(placeholder(pgIndex));
164
+ params.push(v === undefined ? null : v);
165
+ }
166
+ out.push(placeholders.join(', '));
167
+ }
168
+ else {
169
+ out.push(placeholder(pgIndex));
170
+ params.push(value === undefined ? null : value);
171
+ }
172
+ i = j;
173
+ continue;
174
+ }
175
+ // default: copy char
176
+ out.push(ch);
177
+ i++;
178
+ }
179
+ return { sql: out.join(''), params };
180
+ },
181
+ };
182
+ }
183
+ const createMysqlBinder = () => createBinder('mysql');
184
+ exports.createMysqlBinder = createMysqlBinder;
185
+ const createSqliteBinder = () => createBinder('sqlite');
186
+ exports.createSqliteBinder = createSqliteBinder;
187
+ const createPostgresBinder = () => createBinder('postgres');
188
+ exports.createPostgresBinder = createPostgresBinder;
189
+ //# sourceMappingURL=sqlBinder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlBinder.js","sourceRoot":"","sources":["../../src/binders/sqlBinder.ts"],"names":[],"mappings":"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","sourcesContent":["export type BindResult = {\n sql: string;\n params: unknown[];\n};\n\nexport interface SqlBinder {\n bind(sql: string, args: Record<string, unknown> | unknown[]): BindResult;\n}\n\ntype Dialect = 'mysql' | 'sqlite' | 'postgres';\n\nexport function createBinder(dialect: Dialect): SqlBinder {\n const placeholder = (indexRef: { i: number }) => {\n if (dialect === 'postgres') return `$${indexRef.i++}`;\n return '?'; // mysql + sqlite\n };\n\n return {\n bind(sql: string, args: Record<string, unknown> | unknown[]): BindResult {\n const isArrayArgs = Array.isArray(args);\n const params: unknown[] = [];\n const out: string[] = [];\n\n let i = 0;\n let inSQ = false; // single quote string\n let inDQ = false; // double quote identifier\n let inLC = false; // line comment -- ...\\n\n let inBC = false; // block comment /* ... */\n const pgIndex = { i: 1 };\n\n let sawNamed = false;\n let sawPositional = false;\n\n const len = sql.length;\n while (i < len) {\n const ch = sql[i];\n const next = i + 1 < len ? sql[i + 1] : '';\n\n // Handle exiting comments/strings first\n if (inLC) {\n out.push(ch);\n i++;\n if (ch === '\\n') inLC = false;\n continue;\n }\n if (inBC) {\n out.push(ch);\n i++;\n if (ch === '*' && next === '/') {\n out.push(next);\n i++;\n inBC = false;\n }\n continue;\n }\n if (inSQ) {\n out.push(ch);\n i++;\n // escape '' inside string\n if (ch === \"'\" && next === \"'\") {\n out.push(next);\n i++;\n } else if (ch === \"'\") {\n inSQ = false;\n }\n continue;\n }\n if (inDQ) {\n out.push(ch);\n i++;\n // escape \"\" inside identifier\n if (ch === '\"' && next === '\"') {\n out.push(next);\n i++;\n } else if (ch === '\"') {\n inDQ = false;\n }\n continue;\n }\n\n // Not inside string/comment\n if (ch === '-' && next === '-') {\n out.push(ch, next);\n i += 2;\n inLC = true;\n continue;\n }\n if (ch === '/' && next === '*') {\n out.push(ch, next);\n i += 2;\n inBC = true;\n continue;\n }\n if (ch === \"'\") {\n out.push(ch);\n i++;\n inSQ = true;\n continue;\n }\n if (ch === '\"') {\n out.push(ch);\n i++;\n inDQ = true;\n continue;\n }\n\n // Postgres cast :: — skip as literal\n if (ch === ':' && next === ':') {\n out.push('::');\n i += 2;\n continue;\n }\n\n if (ch === ':') {\n // Attempt to parse a parameter token\n let j = i + 1;\n const start = j;\n while (j < len) {\n const c = sql[j];\n if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c === '_') {\n j++;\n } else {\n break;\n }\n }\n const name = sql.slice(start, j);\n if (!name) {\n // not a parameter — keep literal ':'\n out.push(':');\n i++;\n continue;\n }\n\n // Decide positional vs named\n const m = /^arg([1-9][0-9]*)$/.exec(name);\n const isPos = !!m;\n if (isPos) sawPositional = true; else sawNamed = true;\n if (sawNamed && sawPositional) {\n throw new Error('Cannot mix named and positional parameters in a single query');\n }\n\n let value: unknown;\n if (isPos) {\n if (!isArrayArgs) throw new Error('Positional placeholders require array arguments');\n const index = parseInt(m![1], 10) - 1; // 1-based in SQL\n const arr = args as unknown[];\n if (index < 0 || index >= arr.length) throw new Error(`Missing positional argument :${name}`);\n value = arr[index];\n } else {\n if (isArrayArgs) throw new Error('Named placeholders require a parameter object');\n const obj = args as Record<string, unknown>;\n if (!Object.prototype.hasOwnProperty.call(obj, name)) {\n throw new Error(`Missing named parameter :${name}`);\n }\n value = obj[name];\n }\n\n if (value === undefined) {\n throw new Error(`Parameter :${name} is undefined`);\n }\n\n // Expand placeholder(s)\n if (Array.isArray(value)) {\n if (value.length === 0) throw new Error(`Array parameter :${name} must not be empty`);\n const placeholders: string[] = [];\n for (const v of value) {\n if (v === undefined) throw new Error(`Array parameter :${name} contains undefined`);\n placeholders.push(placeholder(pgIndex));\n params.push(v === undefined ? null : v);\n }\n out.push(placeholders.join(', '));\n } else {\n out.push(placeholder(pgIndex));\n params.push(value === undefined ? null : value);\n }\n\n i = j;\n continue;\n }\n\n // default: copy char\n out.push(ch);\n i++;\n }\n\n return { sql: out.join(''), params };\n },\n };\n}\n\nexport const createMysqlBinder = () => createBinder('mysql');\nexport const createSqliteBinder = () => createBinder('sqlite');\nexport const createPostgresBinder = () => createBinder('postgres');\n"]}
@@ -0,0 +1,13 @@
1
+ export declare class SqlStackError extends Error {
2
+ constructor(message?: string);
3
+ }
4
+ export declare class ExactlyOneRowError extends SqlStackError {
5
+ constructor(actualCount: number);
6
+ }
7
+ export declare class NoRowsError extends SqlStackError {
8
+ constructor();
9
+ }
10
+ export declare class RowsExistError extends SqlStackError {
11
+ constructor(actualCount: number);
12
+ }
13
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RowsExistError = exports.NoRowsError = exports.ExactlyOneRowError = exports.SqlStackError = void 0;
4
+ class SqlStackError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'SqlStackError';
8
+ }
9
+ }
10
+ exports.SqlStackError = SqlStackError;
11
+ class ExactlyOneRowError extends SqlStackError {
12
+ constructor(actualCount) {
13
+ super(`Expected exactly one row, got ${actualCount}`);
14
+ this.name = 'ExactlyOneRowError';
15
+ }
16
+ }
17
+ exports.ExactlyOneRowError = ExactlyOneRowError;
18
+ class NoRowsError extends SqlStackError {
19
+ constructor() {
20
+ super('Expected at least one row, got 0');
21
+ this.name = 'NoRowsError';
22
+ }
23
+ }
24
+ exports.NoRowsError = NoRowsError;
25
+ class RowsExistError extends SqlStackError {
26
+ constructor(actualCount) {
27
+ super(`Expected no rows, got ${actualCount}`);
28
+ this.name = 'RowsExistError';
29
+ }
30
+ }
31
+ exports.RowsExistError = RowsExistError;
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +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","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"]}
@@ -0,0 +1,11 @@
1
+ import type { Dialect } from '../registry';
2
+ export declare function resolveSqlFromFs(rootDir: string, methodName: string, dialect: Dialect): {
3
+ sql: string;
4
+ tried: string[];
5
+ };
6
+ export declare function coerceRootPath(input?: string): {
7
+ rootDir?: string;
8
+ from?: 'file' | 'folder';
9
+ };
10
+ export declare function guessDecoratorDir(): string | undefined;
11
+ //# sourceMappingURL=fileResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileResolution.d.ts","sourceRoot":"","sources":["../../src/core/fileResolution.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAe3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxH;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAO7F;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAgBtD"}