@framers/sql-storage-adapter 0.6.15 → 0.7.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 (94) hide show
  1. package/README.md +174 -3
  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 +18 -2
  6. package/dist/adapters/betterSqliteAdapter.d.ts.map +1 -1
  7. package/dist/adapters/betterSqliteAdapter.js +23 -7
  8. package/dist/adapters/betterSqliteAdapter.js.map +1 -1
  9. package/dist/adapters/capacitorSqliteAdapter.d.ts +8 -0
  10. package/dist/adapters/capacitorSqliteAdapter.d.ts.map +1 -1
  11. package/dist/adapters/capacitorSqliteAdapter.js +11 -1
  12. package/dist/adapters/capacitorSqliteAdapter.js.map +1 -1
  13. package/dist/adapters/electron/electronMainAdapter.d.ts +10 -0
  14. package/dist/adapters/electron/electronMainAdapter.d.ts.map +1 -1
  15. package/dist/adapters/electron/electronMainAdapter.js +21 -12
  16. package/dist/adapters/electron/electronMainAdapter.js.map +1 -1
  17. package/dist/adapters/indexedDbAdapter.d.ts +202 -54
  18. package/dist/adapters/indexedDbAdapter.d.ts.map +1 -1
  19. package/dist/adapters/indexedDbAdapter.js +560 -123
  20. package/dist/adapters/indexedDbAdapter.js.map +1 -1
  21. package/dist/adapters/postgresAdapter.d.ts +159 -3
  22. package/dist/adapters/postgresAdapter.d.ts.map +1 -1
  23. package/dist/adapters/postgresAdapter.js +667 -140
  24. package/dist/adapters/postgresAdapter.js.map +1 -1
  25. package/dist/adapters/sqlJsAdapter.d.ts +21 -3
  26. package/dist/adapters/sqlJsAdapter.d.ts.map +1 -1
  27. package/dist/adapters/sqlJsAdapter.js +29 -26
  28. package/dist/adapters/sqlJsAdapter.js.map +1 -1
  29. package/dist/core/contracts/index.d.ts +9 -0
  30. package/dist/core/contracts/index.d.ts.map +1 -1
  31. package/dist/core/contracts/index.js.map +1 -1
  32. package/dist/core/database.d.ts +43 -8
  33. package/dist/core/database.d.ts.map +1 -1
  34. package/dist/core/database.js +40 -5
  35. package/dist/core/database.js.map +1 -1
  36. package/dist/core/resolver.d.ts +20 -1
  37. package/dist/core/resolver.d.ts.map +1 -1
  38. package/dist/core/resolver.js +33 -11
  39. package/dist/core/resolver.js.map +1 -1
  40. package/dist/features/kv/idb.d.ts +79 -0
  41. package/dist/features/kv/idb.d.ts.map +1 -0
  42. package/dist/features/kv/idb.js +14 -0
  43. package/dist/features/kv/idb.js.map +1 -0
  44. package/dist/features/kv/index.d.ts +14 -0
  45. package/dist/features/kv/index.d.ts.map +1 -0
  46. package/dist/features/kv/index.js +14 -0
  47. package/dist/features/kv/index.js.map +1 -0
  48. package/dist/features/kv/indexedDbKeyValueStore.d.ts +77 -0
  49. package/dist/features/kv/indexedDbKeyValueStore.d.ts.map +1 -0
  50. package/dist/features/kv/indexedDbKeyValueStore.js +127 -0
  51. package/dist/features/kv/indexedDbKeyValueStore.js.map +1 -0
  52. package/dist/features/kv/keyValueStore.d.ts +48 -0
  53. package/dist/features/kv/keyValueStore.d.ts.map +1 -0
  54. package/dist/features/kv/keyValueStore.js +54 -0
  55. package/dist/features/kv/keyValueStore.js.map +1 -0
  56. package/dist/features/kv/sqlKeyValueStore.d.ts +34 -0
  57. package/dist/features/kv/sqlKeyValueStore.d.ts.map +1 -0
  58. package/dist/features/kv/sqlKeyValueStore.js +91 -0
  59. package/dist/features/kv/sqlKeyValueStore.js.map +1 -0
  60. package/dist/features/kv/valueCodec.d.ts +35 -0
  61. package/dist/features/kv/valueCodec.d.ts.map +1 -0
  62. package/dist/features/kv/valueCodec.js +462 -0
  63. package/dist/features/kv/valueCodec.js.map +1 -0
  64. package/dist/features/migrations/dataExport.js +9 -6
  65. package/dist/features/migrations/dataExport.js.map +1 -1
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +5 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/shared/errors.d.ts +23 -0
  71. package/dist/shared/errors.d.ts.map +1 -0
  72. package/dist/shared/errors.js +44 -0
  73. package/dist/shared/errors.js.map +1 -0
  74. package/dist/shared/logger.d.ts +26 -0
  75. package/dist/shared/logger.d.ts.map +1 -0
  76. package/dist/shared/logger.js +26 -0
  77. package/dist/shared/logger.js.map +1 -0
  78. package/dist/shared/parameterUtils.d.ts +7 -0
  79. package/dist/shared/parameterUtils.d.ts.map +1 -1
  80. package/dist/shared/parameterUtils.js +25 -0
  81. package/dist/shared/parameterUtils.js.map +1 -1
  82. package/dist/shared/postgresTarget.d.ts +4 -3
  83. package/dist/shared/postgresTarget.d.ts.map +1 -1
  84. package/dist/shared/postgresTarget.js +6 -4
  85. package/dist/shared/postgresTarget.js.map +1 -1
  86. package/dist/shared/segment.d.ts +43 -0
  87. package/dist/shared/segment.d.ts.map +1 -0
  88. package/dist/shared/segment.js +77 -0
  89. package/dist/shared/segment.js.map +1 -0
  90. package/dist/shared/sqlPlaceholders.d.ts +40 -0
  91. package/dist/shared/sqlPlaceholders.d.ts.map +1 -0
  92. package/dist/shared/sqlPlaceholders.js +276 -0
  93. package/dist/shared/sqlPlaceholders.js.map +1 -0
  94. package/package.json +10 -2
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlPlaceholders.js","sourceRoot":"","sources":["../../src/shared/sqlPlaceholders.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framers/sql-storage-adapter",
3
- "version": "0.6.15",
3
+ "version": "0.7.0",
4
4
  "description": "Robust cross-platform SQL storage abstraction with automatic fallbacks and runtime detection",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,6 +32,11 @@
32
32
  "import": "./dist/features/sync/index.js",
33
33
  "default": "./dist/features/sync/index.js"
34
34
  },
35
+ "./kv": {
36
+ "types": "./dist/features/kv/index.d.ts",
37
+ "import": "./dist/features/kv/index.js",
38
+ "default": "./dist/features/kv/index.js"
39
+ },
35
40
  "./package.json": "./package.json"
36
41
  },
37
42
  "files": [
@@ -48,6 +53,7 @@
48
53
  "format:check": "prettier --check \"src/**/*.{ts,tsx,json,md}\"",
49
54
  "typecheck": "tsc --noEmit",
50
55
  "test": "vitest run",
56
+ "test:browser": "vitest run --config vitest.browser.config.ts",
51
57
  "test:watch": "vitest",
52
58
  "test:coverage": "vitest run --coverage",
53
59
  "coverage": "npm run test:coverage",
@@ -121,7 +127,9 @@
121
127
  "typedoc": "^0.26.11",
122
128
  "typescript": "^5.6.3",
123
129
  "typescript-eslint": "^8.46.2",
124
- "vitest": "^3.2.7"
130
+ "vitest": "^3.2.7",
131
+ "@vitest/browser": "^3.2.7",
132
+ "playwright": "~1.63.0"
125
133
  },
126
134
  "dependencies": {
127
135
  "pg": "^8.13.1",