@framers/sql-storage-adapter 0.6.15 → 0.6.16

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 (54) hide show
  1. package/README.md +80 -0
  2. package/dist/adapters/baseStorageAdapter.d.ts.map +1 -1
  3. package/dist/adapters/baseStorageAdapter.js +4 -2
  4. package/dist/adapters/baseStorageAdapter.js.map +1 -1
  5. package/dist/adapters/betterSqliteAdapter.d.ts.map +1 -1
  6. package/dist/adapters/betterSqliteAdapter.js +10 -2
  7. package/dist/adapters/betterSqliteAdapter.js.map +1 -1
  8. package/dist/adapters/capacitorSqliteAdapter.d.ts.map +1 -1
  9. package/dist/adapters/capacitorSqliteAdapter.js +7 -0
  10. package/dist/adapters/capacitorSqliteAdapter.js.map +1 -1
  11. package/dist/adapters/indexedDbAdapter.d.ts +5 -1
  12. package/dist/adapters/indexedDbAdapter.d.ts.map +1 -1
  13. package/dist/adapters/indexedDbAdapter.js +22 -5
  14. package/dist/adapters/indexedDbAdapter.js.map +1 -1
  15. package/dist/adapters/postgresAdapter.d.ts +17 -0
  16. package/dist/adapters/postgresAdapter.d.ts.map +1 -1
  17. package/dist/adapters/postgresAdapter.js +55 -33
  18. package/dist/adapters/postgresAdapter.js.map +1 -1
  19. package/dist/adapters/sqlJsAdapter.d.ts +4 -0
  20. package/dist/adapters/sqlJsAdapter.d.ts.map +1 -1
  21. package/dist/adapters/sqlJsAdapter.js +14 -23
  22. package/dist/adapters/sqlJsAdapter.js.map +1 -1
  23. package/dist/core/contracts/index.d.ts +9 -0
  24. package/dist/core/contracts/index.d.ts.map +1 -1
  25. package/dist/core/contracts/index.js.map +1 -1
  26. package/dist/core/database.d.ts +15 -0
  27. package/dist/core/database.d.ts.map +1 -1
  28. package/dist/core/database.js +6 -0
  29. package/dist/core/database.js.map +1 -1
  30. package/dist/core/resolver.d.ts +6 -0
  31. package/dist/core/resolver.d.ts.map +1 -1
  32. package/dist/core/resolver.js +6 -4
  33. package/dist/core/resolver.js.map +1 -1
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +2 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/shared/errors.d.ts +23 -0
  39. package/dist/shared/errors.d.ts.map +1 -0
  40. package/dist/shared/errors.js +44 -0
  41. package/dist/shared/errors.js.map +1 -0
  42. package/dist/shared/logger.d.ts +26 -0
  43. package/dist/shared/logger.d.ts.map +1 -0
  44. package/dist/shared/logger.js +26 -0
  45. package/dist/shared/logger.js.map +1 -0
  46. package/dist/shared/parameterUtils.d.ts +7 -0
  47. package/dist/shared/parameterUtils.d.ts.map +1 -1
  48. package/dist/shared/parameterUtils.js +25 -0
  49. package/dist/shared/parameterUtils.js.map +1 -1
  50. package/dist/shared/sqlPlaceholders.d.ts +40 -0
  51. package/dist/shared/sqlPlaceholders.d.ts.map +1 -0
  52. package/dist/shared/sqlPlaceholders.js +276 -0
  53. package/dist/shared/sqlPlaceholders.js.map +1 -0
  54. package/package.json +1 -1
@@ -43,6 +43,7 @@ import { createCapacitorSqliteAdapter } from '../adapters/capacitorSqliteAdapter
43
43
  import { createPostgresAdapter } from '../adapters/postgresAdapter.js';
44
44
  import { IndexedDbAdapter } from '../adapters/indexedDbAdapter.js';
45
45
  import { isNonEmpty, namesPostgresServer } from '../shared/postgresTarget.js';
46
+ import { getStorageLogger } from '../shared/logger.js';
46
47
  const isCapacitorRuntime = () => {
47
48
  if (typeof window === 'undefined') {
48
49
  return false;
@@ -86,6 +87,7 @@ const unsupportedKind = (kind) => {
86
87
  */
87
88
  export const resolveStorageAdapter = async (options = {}) => {
88
89
  const envOverride = getEnv('STORAGE_ADAPTER');
90
+ const log = options.logger ?? getStorageLogger();
89
91
  const strict = options.strict === true;
90
92
  const postgresOptions = options.postgres;
91
93
  const explicitConnection = postgresOptions?.connectionString;
@@ -110,14 +112,14 @@ export const resolveStorageAdapter = async (options = {}) => {
110
112
  }
111
113
  // Electron detection - provide guidance to use dedicated Electron adapters
112
114
  if (isElectronMain()) {
113
- console.warn('[StorageAdapter] Electron main process detected. ' +
115
+ log.warn({ runtime: 'electron-main' }, 'Electron main process detected. ' +
114
116
  'Consider using the dedicated Electron adapter for full framework support:\n' +
115
117
  " import { createElectronMainAdapter } from '@framers/sql-storage-adapter/electron';\n" +
116
118
  'Falling back to better-sqlite3 adapter.');
117
119
  return ['better-sqlite3'];
118
120
  }
119
121
  if (isElectronRenderer()) {
120
- console.warn('[StorageAdapter] Electron renderer process detected. ' +
122
+ log.warn({ runtime: 'electron-renderer' }, 'Electron renderer process detected. ' +
121
123
  'For IPC-based database access, use the dedicated Electron adapter:\n' +
122
124
  " import { createElectronRendererAdapter } from '@framers/sql-storage-adapter/electron';\n" +
123
125
  'Note: Direct database access in renderer is not recommended for security reasons.');
@@ -215,7 +217,7 @@ export const resolveStorageAdapter = async (options = {}) => {
215
217
  };
216
218
  await adapter.open(openOptions);
217
219
  if (!quiet)
218
- console.info(`[StorageAdapter] Using adapter "${candidate.name}".`);
220
+ log.info({ adapter: candidate.name }, `Using adapter "${candidate.name}".`);
219
221
  return adapter;
220
222
  }
221
223
  catch (error) {
@@ -226,7 +228,7 @@ export const resolveStorageAdapter = async (options = {}) => {
226
228
  }
227
229
  if (!quiet) {
228
230
  const msg = error instanceof Error ? error.message : String(error);
229
- console.warn(`[StorageAdapter] ${candidate.name} not available, trying next. ${msg}`);
231
+ log.warn({ adapter: candidate.name, error: msg }, `${candidate.name} not available, trying next. ${msg}`);
230
232
  }
231
233
  continue;
232
234
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -23,4 +23,6 @@ export { BrowserBlobCodec } from './codecs/BrowserBlobCodec.js';
23
23
  export { SqliteFileExporter } from './exporters/SqliteFileExporter.js';
24
24
  export { PostgresExporter } from './exporters/PostgresExporter.js';
25
25
  export { createStorageFeatures } from './core/contracts/features.js';
26
+ export { isUniqueViolation } from './shared/errors.js';
27
+ export { setStorageLogger, getStorageLogger, type StorageLogger } from './shared/logger.js';
26
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAQ9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAM5C,cAAc,yBAAyB,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAQ9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAM5C,cAAc,yBAAyB,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -35,4 +35,6 @@ export { BrowserBlobCodec } from './codecs/BrowserBlobCodec.js';
35
35
  export { SqliteFileExporter } from './exporters/SqliteFileExporter.js';
36
36
  export { PostgresExporter } from './exporters/PostgresExporter.js';
37
37
  export { createStorageFeatures } from './core/contracts/features.js';
38
+ export { isUniqueViolation } from './shared/errors.js';
39
+ export { setStorageLogger, getStorageLogger } from './shared/logger.js';
38
40
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,cAAc,SAAS,CAAC;AAExB,8EAA8E;AAC9E,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,+EAA+E;AAC/E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAE9C,wEAAwE;AACxE,yDAAyD;AACzD,2HAA2H;AAC3H,mEAAmE;AAEnE,+EAA+E;AAC/E,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,uFAAuF;AACvF,sFAAsF;AAEtF,+EAA+E;AAC/E,cAAc,yBAAyB,CAAC;AAExC,iFAAiF;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,cAAc,SAAS,CAAC;AAExB,8EAA8E;AAC9E,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,+EAA+E;AAC/E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAE9C,wEAAwE;AACxE,yDAAyD;AACzD,2HAA2H;AAC3H,mEAAmE;AAEnE,+EAA+E;AAC/E,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,uFAAuF;AACvF,sFAAsF;AAEtF,+EAA+E;AAC/E,cAAc,yBAAyB,CAAC;AAExC,iFAAiF;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAsB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Error checks that read the same failure from every adapter.
3
+ */
4
+ /**
5
+ * Whether `error` is a unique or primary-key violation, from any adapter:
6
+ * PostgreSQL's SQLSTATE `23505` (`unique_violation`, pg's `code`),
7
+ * better-sqlite3's `SQLITE_CONSTRAINT_UNIQUE` and
8
+ * `SQLITE_CONSTRAINT_PRIMARYKEY`, and the "UNIQUE constraint failed" message
9
+ * that sql.js, the IndexedDB adapter and the Capacitor plugin give. An error
10
+ * that wraps one as its `cause`, to any depth up to ten, counts too.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * try {
15
+ * await db.run('INSERT INTO users (email) VALUES (?)', [email]);
16
+ * } catch (error) {
17
+ * if (isUniqueViolation(error)) return { taken: true };
18
+ * throw error;
19
+ * }
20
+ * ```
21
+ */
22
+ export declare const isUniqueViolation: (error: unknown) => boolean;
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,OAYlD,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Error checks that read the same failure from every adapter.
3
+ */
4
+ /** better-sqlite3's extended result codes for a unique or primary-key violation. */
5
+ const SQLITE_UNIQUE_CODES = new Set(['SQLITE_CONSTRAINT_UNIQUE', 'SQLITE_CONSTRAINT_PRIMARYKEY']);
6
+ /** SQLite's message for one, which sql.js and the Capacitor plugin pass on without a code. */
7
+ const SQLITE_UNIQUE_MESSAGE = /\bUNIQUE constraint failed\b/;
8
+ /** How deep isUniqueViolation follows `cause`. */
9
+ const MAX_CAUSE_DEPTH = 10;
10
+ /**
11
+ * Whether `error` is a unique or primary-key violation, from any adapter:
12
+ * PostgreSQL's SQLSTATE `23505` (`unique_violation`, pg's `code`),
13
+ * better-sqlite3's `SQLITE_CONSTRAINT_UNIQUE` and
14
+ * `SQLITE_CONSTRAINT_PRIMARYKEY`, and the "UNIQUE constraint failed" message
15
+ * that sql.js, the IndexedDB adapter and the Capacitor plugin give. An error
16
+ * that wraps one as its `cause`, to any depth up to ten, counts too.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * try {
21
+ * await db.run('INSERT INTO users (email) VALUES (?)', [email]);
22
+ * } catch (error) {
23
+ * if (isUniqueViolation(error)) return { taken: true };
24
+ * throw error;
25
+ * }
26
+ * ```
27
+ */
28
+ export const isUniqueViolation = (error) => {
29
+ const seen = new Set();
30
+ let current = error;
31
+ while (current !== null && typeof current === 'object' && !seen.has(current) && seen.size < MAX_CAUSE_DEPTH) {
32
+ seen.add(current);
33
+ const { code, message } = current;
34
+ if (code === '23505')
35
+ return true;
36
+ if (typeof code === 'string' && SQLITE_UNIQUE_CODES.has(code))
37
+ return true;
38
+ if (typeof message === 'string' && SQLITE_UNIQUE_MESSAGE.test(message))
39
+ return true;
40
+ current = current.cause;
41
+ }
42
+ return false;
43
+ };
44
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oFAAoF;AACpF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,CAAC,CAAC;AAElG,8FAA8F;AAC9F,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAE7D,kDAAkD;AAClD,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,eAAe,EAAE,CAAC;QAC5G,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAgD,CAAC;QAC3E,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACpF,OAAO,GAAI,OAA+B,CAAC,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Where the library's log lines go. A host hands its own logger in, and
3
+ * pino's logger fits as it is: each call passes the line's fields first and
4
+ * its message second, as pino takes them. Without one, lines go to the
5
+ * console, as the library has always written them.
6
+ */
7
+ export interface StorageLogger {
8
+ debug?(fields: Record<string, unknown>, message: string): void;
9
+ info(fields: Record<string, unknown>, message: string): void;
10
+ warn(fields: Record<string, unknown>, message: string): void;
11
+ error(fields: Record<string, unknown>, message: string): void;
12
+ }
13
+ /**
14
+ * Routes every line the library writes to `logger`, from then on and in every
15
+ * adapter. `null` routes them back to the console.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import pino from 'pino';
20
+ * setStorageLogger(pino({ name: 'storage' }));
21
+ * ```
22
+ */
23
+ export declare const setStorageLogger: (logger: StorageLogger | null) => void;
24
+ /** The logger the library writes to now. */
25
+ export declare const getStorageLogger: () => StorageLogger;
26
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAgBD;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,WAAY,aAAa,GAAG,IAAI,KAAG,IAE/D,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,QAAO,aAAwB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** The console line's prefix: the field `scope` when a line has one, else StorageAdapter. */
2
+ const prefix = (fields) => `[${typeof fields.scope === 'string' ? fields.scope : 'StorageAdapter'}]`;
3
+ /** The default: one line on the console per call, prefixed as before. */
4
+ const consoleLogger = {
5
+ debug: (fields, message) => console.log(`${prefix(fields)} ${message}`),
6
+ info: (fields, message) => console.info(`${prefix(fields)} ${message}`),
7
+ warn: (fields, message) => console.warn(`${prefix(fields)} ${message}`),
8
+ error: (fields, message) => console.error(`${prefix(fields)} ${message}`),
9
+ };
10
+ let current = consoleLogger;
11
+ /**
12
+ * Routes every line the library writes to `logger`, from then on and in every
13
+ * adapter. `null` routes them back to the console.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import pino from 'pino';
18
+ * setStorageLogger(pino({ name: 'storage' }));
19
+ * ```
20
+ */
21
+ export const setStorageLogger = (logger) => {
22
+ current = logger ?? consoleLogger;
23
+ };
24
+ /** The logger the library writes to now. */
25
+ export const getStorageLogger = () => current;
26
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"AAaA,6FAA6F;AAC7F,MAAM,MAAM,GAAG,CAAC,MAA+B,EAAU,EAAE,CACzD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC;AAE5E,yEAAyE;AACzE,MAAM,aAAa,GAAkB;IACnC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IACvE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IACvE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IACvE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;CAC1E,CAAC;AAEF,IAAI,OAAO,GAAkB,aAAa,CAAC;AAE3C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAA4B,EAAQ,EAAE;IACrE,OAAO,GAAG,MAAM,IAAI,aAAa,CAAC;AACpC,CAAC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAkB,EAAE,CAAC,OAAO,CAAC"}
@@ -6,4 +6,11 @@ export declare const normaliseParameters: (parameters?: StorageParameters) => {
6
6
  named?: Record<string, unknown>;
7
7
  positional?: Array<unknown>;
8
8
  };
9
+ /**
10
+ * Named parameters under every key sql.js may look them up by. sql.js binds a
11
+ * named value only under the key that matches the placeholder as written
12
+ * (":id", "@id", "$id"); better-sqlite3 takes the bare key ("id"). Expanding
13
+ * every variant lets one payload work on both.
14
+ */
15
+ export declare const expandNamedParameters: (named: Record<string, unknown>) => Record<string, unknown>;
9
16
  //# sourceMappingURL=parameterUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parameterUtils.d.ts","sourceRoot":"","sources":["../../src/shared/parameterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,mBAAmB,gBACjB,iBAAiB,KAC7B;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CAehE,CAAC"}
1
+ {"version":3,"file":"parameterUtils.d.ts","sourceRoot":"","sources":["../../src/shared/parameterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,mBAAmB,gBACjB,iBAAiB,KAC7B;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CAehE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,UAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAY5F,CAAC"}
@@ -14,4 +14,29 @@ export const normaliseParameters = (parameters) => {
14
14
  // Fall back to positional when unknown primitive is provided.
15
15
  return { positional: [parameters] };
16
16
  };
17
+ /**
18
+ * Named parameters under every key sql.js may look them up by. sql.js binds a
19
+ * named value only under the key that matches the placeholder as written
20
+ * (":id", "@id", "$id"); better-sqlite3 takes the bare key ("id"). Expanding
21
+ * every variant lets one payload work on both.
22
+ */
23
+ export const expandNamedParameters = (named) => {
24
+ const expanded = { ...named };
25
+ for (const [rawKey, value] of Object.entries(named)) {
26
+ if (!rawKey)
27
+ continue;
28
+ const key = rawKey.replace(/^[:@$]/, '');
29
+ if (!key)
30
+ continue;
31
+ if (!(key in expanded))
32
+ expanded[key] = value;
33
+ if (!(`:${key}` in expanded))
34
+ expanded[`:${key}`] = value;
35
+ if (!(`@${key}` in expanded))
36
+ expanded[`@${key}`] = value;
37
+ if (!(`$${key}` in expanded))
38
+ expanded[`$${key}`] = value;
39
+ }
40
+ return expanded;
41
+ };
17
42
  //# sourceMappingURL=parameterUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parameterUtils.js","sourceRoot":"","sources":["../../src/shared/parameterUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAA8B,EACoC,EAAE;IACpE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,UAAqC,EAAE,CAAC;IAC1D,CAAC;IAED,8DAA8D;IAC9D,OAAO,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;AACtC,CAAC,CAAC"}
1
+ {"version":3,"file":"parameterUtils.js","sourceRoot":"","sources":["../../src/shared/parameterUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAA8B,EACoC,EAAE;IACpE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,UAAqC,EAAE,CAAC;IAC1D,CAAC;IAED,8DAA8D;IAC9D,OAAO,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;AACtC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAA8B,EAA2B,EAAE;IAC/F,MAAM,QAAQ,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC9C,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,QAAQ,CAAC;YAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC1D,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,QAAQ,CAAC;YAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAC1D,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,QAAQ,CAAC;YAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { StorageParameters } from '../core/contracts/index.js';
2
+ /** A statement and its values, ready for node-postgres. */
3
+ export interface PostgresStatement {
4
+ text: string;
5
+ values: unknown[];
6
+ }
7
+ /**
8
+ * Rewrites a statement's placeholders for node-postgres, which takes only
9
+ * `$1`, `$2`, ... Outside literals, quoted identifiers, dollar-quoted strings
10
+ * and comments:
11
+ *
12
+ * - Named parameters: each `@name` becomes the next `$n`, bound to that name's value.
13
+ * - A statement that already uses `$n` placeholders is sent as written, its
14
+ * `?` operators included.
15
+ * - Otherwise `??` becomes `?` (the jsonb key-exists operator), `?|` and `?&`
16
+ * stay operators (`?||` and `?&&` are a placeholder followed by `||` or
17
+ * `&&`), and each other `?` becomes the next `$n`. A statement run without
18
+ * parameters keeps its `?`, so the jsonb `?` operator works in it as written.
19
+ */
20
+ export declare const toPostgresStatement: (statement: string, parameters?: StorageParameters) => PostgresStatement;
21
+ /** A statement and its parameters, ready for a SQLite engine. */
22
+ export interface SqliteStatement {
23
+ statement: string;
24
+ parameters?: StorageParameters;
25
+ }
26
+ /**
27
+ * A value as the SQLite adapters bind it. better-sqlite3 refuses booleans,
28
+ * Dates and objects, and sql.js refuses Dates and binds an array as a blob,
29
+ * so: a boolean binds as 1 or 0, a Date as its ISO 8601 text (an Invalid Date
30
+ * is refused), an array or a plain object as JSON text, and undefined as
31
+ * NULL. Strings, numbers, bigints, null and bytes bind as they are.
32
+ */
33
+ export declare const toSqliteValue: (value: unknown) => unknown;
34
+ /**
35
+ * The statement and values a SQLite adapter binds: `$n` placeholders become
36
+ * `?` (see rewriteDollarPlaceholders above) and each value is converted with
37
+ * toSqliteValue, positional and named alike.
38
+ */
39
+ export declare const toSqliteStatement: (statement: string, parameters?: StorageParameters) => SqliteStatement;
40
+ //# sourceMappingURL=sqlPlaceholders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlPlaceholders.d.ts","sourceRoot":"","sources":["../../src/shared/sqlPlaceholders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA8J3D,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,cAAe,MAAM,eAAe,iBAAiB,KAAG,iBA4DvF,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AA+CD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,OAW9C,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,cAAe,MAAM,eAAe,iBAAiB,KAAG,eAGrF,CAAC"}
@@ -0,0 +1,276 @@
1
+ import { normaliseParameters } from './parameterUtils.js';
2
+ const POSTGRES_RULES = { nestedComments: true, dollarQuotes: true, escapeStrings: true, backticks: false };
3
+ const SQLITE_RULES = { nestedComments: false, dollarQuotes: false, escapeStrings: false, backticks: true };
4
+ const isIdentStart = (ch) => ch !== undefined && ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch === '_');
5
+ /** Characters that continue an identifier; both dialects allow `$` after the first. */
6
+ const isIdentPart = (ch) => ch !== undefined && (isIdentStart(ch) || (ch >= '0' && ch <= '9') || ch === '$');
7
+ /** The dollar-quote delimiter (`$$` or `$tag$`) that starts at `start`, or null. */
8
+ const readDollarTag = (sql, start) => {
9
+ if (sql[start + 1] === '$')
10
+ return '$$';
11
+ if (!isIdentStart(sql[start + 1]))
12
+ return null;
13
+ let end = start + 2;
14
+ while (end < sql.length && (isIdentStart(sql[end]) || (sql[end] >= '0' && sql[end] <= '9')))
15
+ end += 1;
16
+ return sql[end] === '$' ? sql.slice(start, end + 1) : null;
17
+ };
18
+ /** Splits `sql` into code and the literals, quoted identifiers and comments between it. */
19
+ const scanSql = (sql, rules) => {
20
+ const segments = [];
21
+ const length = sql.length;
22
+ let codeStart = 0;
23
+ let i = 0;
24
+ const keep = (start, end) => {
25
+ if (start > codeStart)
26
+ segments.push({ code: true, text: sql.slice(codeStart, start) });
27
+ segments.push({ code: false, text: sql.slice(start, end) });
28
+ codeStart = end;
29
+ };
30
+ while (i < length) {
31
+ const ch = sql[i];
32
+ const next = sql[i + 1];
33
+ if (ch === '-' && next === '-') {
34
+ const newline = sql.indexOf('\n', i + 2);
35
+ const end = newline === -1 ? length : newline;
36
+ keep(i, end);
37
+ i = end;
38
+ continue;
39
+ }
40
+ if (ch === '/' && next === '*') {
41
+ let end = i + 2;
42
+ let depth = 1;
43
+ while (end < length && depth > 0) {
44
+ if (rules.nestedComments && sql[end] === '/' && sql[end + 1] === '*') {
45
+ depth += 1;
46
+ end += 2;
47
+ }
48
+ else if (sql[end] === '*' && sql[end + 1] === '/') {
49
+ depth -= 1;
50
+ end += 2;
51
+ }
52
+ else {
53
+ end += 1;
54
+ }
55
+ }
56
+ keep(i, Math.min(end, length));
57
+ i = Math.min(end, length);
58
+ continue;
59
+ }
60
+ if (ch === "'") {
61
+ // E'...' (not the E at the end of a longer word) takes backslash escapes.
62
+ const escapes = rules.escapeStrings && (sql[i - 1] === 'E' || sql[i - 1] === 'e') && !isIdentPart(sql[i - 2]);
63
+ let end = i + 1;
64
+ while (end < length) {
65
+ if (escapes && sql[end] === '\\') {
66
+ end += 2;
67
+ continue;
68
+ }
69
+ if (sql[end] === "'") {
70
+ if (sql[end + 1] === "'") {
71
+ end += 2;
72
+ continue;
73
+ }
74
+ end += 1;
75
+ break;
76
+ }
77
+ end += 1;
78
+ }
79
+ keep(i, Math.min(end, length));
80
+ i = Math.min(end, length);
81
+ continue;
82
+ }
83
+ if (ch === '"' || (rules.backticks && ch === '`')) {
84
+ let end = i + 1;
85
+ while (end < length) {
86
+ if (sql[end] === ch) {
87
+ if (sql[end + 1] === ch) {
88
+ end += 2;
89
+ continue;
90
+ }
91
+ end += 1;
92
+ break;
93
+ }
94
+ end += 1;
95
+ }
96
+ keep(i, Math.min(end, length));
97
+ i = Math.min(end, length);
98
+ continue;
99
+ }
100
+ // A dollar quote never follows an identifier character directly: there the
101
+ // $ is part of the identifier.
102
+ if (rules.dollarQuotes && ch === '$' && !isIdentPart(sql[i - 1])) {
103
+ const tag = readDollarTag(sql, i);
104
+ if (tag) {
105
+ const close = sql.indexOf(tag, i + tag.length);
106
+ const end = close === -1 ? length : close + tag.length;
107
+ keep(i, end);
108
+ i = end;
109
+ continue;
110
+ }
111
+ }
112
+ i += 1;
113
+ }
114
+ if (codeStart < length)
115
+ segments.push({ code: true, text: sql.slice(codeStart) });
116
+ return segments;
117
+ };
118
+ /** A `$n` placeholder: `$` and digits, not inside an identifier such as `price$1`. */
119
+ const DOLLAR_PLACEHOLDER = /(^|[^A-Za-z0-9_$])\$(\d+)/g;
120
+ const hasDollarPlaceholder = (code) => new RegExp(DOLLAR_PLACEHOLDER.source).test(code);
121
+ /**
122
+ * Rewrites a statement's placeholders for node-postgres, which takes only
123
+ * `$1`, `$2`, ... Outside literals, quoted identifiers, dollar-quoted strings
124
+ * and comments:
125
+ *
126
+ * - Named parameters: each `@name` becomes the next `$n`, bound to that name's value.
127
+ * - A statement that already uses `$n` placeholders is sent as written, its
128
+ * `?` operators included.
129
+ * - Otherwise `??` becomes `?` (the jsonb key-exists operator), `?|` and `?&`
130
+ * stay operators (`?||` and `?&&` are a placeholder followed by `||` or
131
+ * `&&`), and each other `?` becomes the next `$n`. A statement run without
132
+ * parameters keeps its `?`, so the jsonb `?` operator works in it as written.
133
+ */
134
+ export const toPostgresStatement = (statement, parameters) => {
135
+ const { named, positional } = normaliseParameters(parameters);
136
+ if (!named && !statement.includes('?')) {
137
+ return { text: statement, values: positional ?? [] };
138
+ }
139
+ if (named && !statement.includes('@')) {
140
+ return { text: statement, values: [] };
141
+ }
142
+ const segments = scanSql(statement, POSTGRES_RULES);
143
+ if (named) {
144
+ const order = [];
145
+ const text = segments
146
+ .map((segment) => segment.code
147
+ ? segment.text.replace(/@([A-Za-z0-9_]+)/g, (_match, name) => {
148
+ order.push(name);
149
+ return `$${order.length}`;
150
+ })
151
+ : segment.text)
152
+ .join('');
153
+ return { text, values: order.map((name) => named[name]) };
154
+ }
155
+ if (segments.some((segment) => segment.code && hasDollarPlaceholder(segment.text))) {
156
+ return { text: statement, values: positional ?? [] };
157
+ }
158
+ let index = 0;
159
+ const text = segments
160
+ .map((segment) => {
161
+ if (!segment.code)
162
+ return segment.text;
163
+ const code = segment.text;
164
+ let out = '';
165
+ for (let i = 0; i < code.length; i += 1) {
166
+ const ch = code[i];
167
+ if (ch !== '?') {
168
+ out += ch;
169
+ continue;
170
+ }
171
+ const after = code[i + 1];
172
+ if (after === '?') {
173
+ out += '?';
174
+ i += 1;
175
+ }
176
+ else if ((after === '|' && code[i + 2] !== '|') || (after === '&' && code[i + 2] !== '&')) {
177
+ out += `?${after}`;
178
+ i += 1;
179
+ }
180
+ else if (positional) {
181
+ index += 1;
182
+ out += `$${index}`;
183
+ }
184
+ else {
185
+ out += '?';
186
+ }
187
+ }
188
+ return out;
189
+ })
190
+ .join('');
191
+ return { text, values: positional ?? [] };
192
+ };
193
+ /**
194
+ * Lets the SQLite adapters take `$1`, `$2`, ... with a positional array, as
195
+ * PostgreSQL does. SQLite reads `$1` as a parameter named "1", which
196
+ * better-sqlite3 will not bind from an array and sql.js binds in order of
197
+ * first appearance, so each `$n` outside literals, quoted identifiers and
198
+ * comments becomes `?`, and the values follow the `$n` order, repeats
199
+ * included. Named parameters, and statements without `$n`, pass through. A
200
+ * statement that mixes `?` and `$n` placeholders is refused.
201
+ */
202
+ const rewriteDollarPlaceholders = (statement, parameters) => {
203
+ if (!statement.includes('$'))
204
+ return { statement, parameters };
205
+ const { named, positional } = normaliseParameters(parameters);
206
+ if (named)
207
+ return { statement, parameters };
208
+ const segments = scanSql(statement, SQLITE_RULES);
209
+ if (!segments.some((segment) => segment.code && hasDollarPlaceholder(segment.text))) {
210
+ return { statement, parameters };
211
+ }
212
+ if (segments.some((segment) => segment.code && segment.text.includes('?'))) {
213
+ throw new Error('This statement mixes ? and $n placeholders. Write it with one kind: ?, or $1, $2, ... bound from the same array.');
214
+ }
215
+ const order = [];
216
+ const text = segments
217
+ .map((segment) => segment.code
218
+ ? segment.text.replace(DOLLAR_PLACEHOLDER, (_match, before, digits) => {
219
+ order.push(Number(digits));
220
+ return `${before}?`;
221
+ })
222
+ : segment.text)
223
+ .join('');
224
+ const values = positional ?? [];
225
+ return { statement: text, parameters: order.map((n) => values[n - 1]) };
226
+ };
227
+ /** Whether SQLite would refuse or mangle `value` as it is: a boolean, a Date, undefined, or an array or object that is not bytes. */
228
+ const needsSqliteConversion = (value) => value === undefined ||
229
+ typeof value === 'boolean' ||
230
+ (value !== null && typeof value === 'object' && !ArrayBuffer.isView(value) && !(value instanceof ArrayBuffer));
231
+ /**
232
+ * A value as the SQLite adapters bind it. better-sqlite3 refuses booleans,
233
+ * Dates and objects, and sql.js refuses Dates and binds an array as a blob,
234
+ * so: a boolean binds as 1 or 0, a Date as its ISO 8601 text (an Invalid Date
235
+ * is refused), an array or a plain object as JSON text, and undefined as
236
+ * NULL. Strings, numbers, bigints, null and bytes bind as they are.
237
+ */
238
+ export const toSqliteValue = (value) => {
239
+ if (value === undefined)
240
+ return null;
241
+ if (typeof value === 'boolean')
242
+ return value ? 1 : 0;
243
+ if (value instanceof Date) {
244
+ if (Number.isNaN(value.getTime())) {
245
+ throw new RangeError('Cannot bind an Invalid Date.');
246
+ }
247
+ return value.toISOString();
248
+ }
249
+ if (needsSqliteConversion(value))
250
+ return JSON.stringify(value);
251
+ return value;
252
+ };
253
+ const toSqliteParameters = (parameters) => {
254
+ if (parameters == null)
255
+ return parameters;
256
+ if (Array.isArray(parameters)) {
257
+ return parameters.some(needsSqliteConversion) ? parameters.map(toSqliteValue) : parameters;
258
+ }
259
+ if (typeof parameters === 'object') {
260
+ const values = Object.values(parameters);
261
+ if (!values.some(needsSqliteConversion))
262
+ return parameters;
263
+ return Object.fromEntries(Object.entries(parameters).map(([name, value]) => [name, toSqliteValue(value)]));
264
+ }
265
+ return [toSqliteValue(parameters)];
266
+ };
267
+ /**
268
+ * The statement and values a SQLite adapter binds: `$n` placeholders become
269
+ * `?` (see rewriteDollarPlaceholders above) and each value is converted with
270
+ * toSqliteValue, positional and named alike.
271
+ */
272
+ export const toSqliteStatement = (statement, parameters) => {
273
+ const rewritten = rewriteDollarPlaceholders(statement, parameters);
274
+ return { statement: rewritten.statement, parameters: toSqliteParameters(rewritten.parameters) };
275
+ };
276
+ //# sourceMappingURL=sqlPlaceholders.js.map