@c9up/atlas 0.3.4 → 0.3.5
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.
package/db.win32-x64-msvc.node
CHANGED
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NapiDbAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/NapiDbAdapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"NapiDbAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/NapiDbAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,36 @@ function napiReplacer(_key, value) {
|
|
|
20
20
|
}
|
|
21
21
|
return value;
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Refuse an array bound as ONE parameter.
|
|
25
|
+
*
|
|
26
|
+
* The binder has no array arm, so an array reached its catch-all and was bound
|
|
27
|
+
* as the JSON text `["a","b"]`. On SQLite that is merely wrong; on Postgres,
|
|
28
|
+
* `WHERE id = ANY($1)` makes the server read those text bytes as a binary array
|
|
29
|
+
* header, and it reports a dimension count read out of whatever happened to be
|
|
30
|
+
* there — a different number on every run. Silently sending bytes the server
|
|
31
|
+
* misreads is the failure this replaces.
|
|
32
|
+
*
|
|
33
|
+
* Expanding the list is the answer, and it is what Lucid does: `whereIn` emits
|
|
34
|
+
* `IN ($1, $2, …)` with one placeholder per value. So this names `whereIn`
|
|
35
|
+
* rather than teaching the binder a shape the query builder never produces.
|
|
36
|
+
*
|
|
37
|
+
* Only the TOP level is checked: a nested array is a JSON value inside an
|
|
38
|
+
* object being bound to a `json`/`jsonb` column, which is legitimate.
|
|
39
|
+
*/
|
|
40
|
+
function assertNoArrayParams(params) {
|
|
41
|
+
if (!params)
|
|
42
|
+
return;
|
|
43
|
+
for (const [index, value] of params.entries()) {
|
|
44
|
+
if (!Array.isArray(value))
|
|
45
|
+
continue;
|
|
46
|
+
throw new Error(`[E_ARRAY_PARAM] Parameter $${index + 1} is an array, which cannot be bound as a single value. ` +
|
|
47
|
+
"Expand it into one placeholder per element — `whereIn(column, values)` does this, " +
|
|
48
|
+
"and so does building the placeholders yourself: `IN (${values.map((_, i) => '$' + (i + 1)).join(', ')})`. " +
|
|
49
|
+
"Binding the array itself sends Postgres text where it expects an array, and it reports " +
|
|
50
|
+
"a nonsensical dimension count rather than a type error.");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
23
53
|
/**
|
|
24
54
|
* JSON reviver for napi result sets. Rebuilds `{"$bytes": …}` envelopes (emitted
|
|
25
55
|
* by the Rust decoder for BLOB/BYTEA columns) into a `Uint8Array`. Integers
|
|
@@ -91,7 +121,7 @@ export async function createNapiConnection(url, poolMin = 1, poolMax = 10, pragm
|
|
|
91
121
|
const evt = makeTrxEvents();
|
|
92
122
|
const base = {
|
|
93
123
|
async execute(sql, params = []) {
|
|
94
|
-
const json = await native.execute(sql, JSON.stringify(params, napiReplacer));
|
|
124
|
+
const json = await native.execute(sql, (assertNoArrayParams(params), JSON.stringify(params, napiReplacer)));
|
|
95
125
|
const r = JSON.parse(json);
|
|
96
126
|
return {
|
|
97
127
|
rowsAffected: Number(r.rows_affected),
|
|
@@ -99,7 +129,7 @@ export async function createNapiConnection(url, poolMin = 1, poolMax = 10, pragm
|
|
|
99
129
|
};
|
|
100
130
|
},
|
|
101
131
|
async query(sql, params = []) {
|
|
102
|
-
const json = await native.query(sql, JSON.stringify(params, napiReplacer));
|
|
132
|
+
const json = await native.query(sql, (assertNoArrayParams(params), JSON.stringify(params, napiReplacer)));
|
|
103
133
|
return JSON.parse(json, napiReviver);
|
|
104
134
|
},
|
|
105
135
|
get isCompleted() {
|
|
@@ -201,7 +231,7 @@ export async function createNapiConnection(url, poolMin = 1, poolMax = 10, pragm
|
|
|
201
231
|
transaction,
|
|
202
232
|
async query(sql, params = [], meta) {
|
|
203
233
|
return observed(sql, params, meta, async () => {
|
|
204
|
-
const paramsJson = JSON.stringify(params, napiReplacer);
|
|
234
|
+
const paramsJson = (assertNoArrayParams(params), JSON.stringify(params, napiReplacer));
|
|
205
235
|
const json = meta?.serverTimeoutMs != null
|
|
206
236
|
? await db.queryTimed(sql, paramsJson, meta.serverTimeoutMs)
|
|
207
237
|
: await db.query(sql, paramsJson);
|
|
@@ -210,7 +240,7 @@ export async function createNapiConnection(url, poolMin = 1, poolMax = 10, pragm
|
|
|
210
240
|
},
|
|
211
241
|
async execute(sql, params = [], meta) {
|
|
212
242
|
return observed(sql, params, meta, async () => {
|
|
213
|
-
const paramsJson = JSON.stringify(params, napiReplacer);
|
|
243
|
+
const paramsJson = (assertNoArrayParams(params), JSON.stringify(params, napiReplacer));
|
|
214
244
|
const json = meta?.serverTimeoutMs != null
|
|
215
245
|
? await db.executeTimed(sql, paramsJson, meta.serverTimeoutMs)
|
|
216
246
|
: await db.execute(sql, paramsJson);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NapiDbAdapter.js","sourceRoot":"","sources":["../../src/adapters/NapiDbAdapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAEN,uBAAuB,EACvB,aAAa,EACb,aAAa,GAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpE,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,KAAc;IAChD,IACC,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,QAAQ,IAAI,KAAK;QACjB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAC9B,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AA6ID;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,GAAW,EACX,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,EAAE,EACZ,OAAyC,EACzC,KAA2B,EAC3B,gBAAsC,EAAE;IAExC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC;IACxD,kEAAkE;IAClE,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IAEpC,6DAA6D;IAC7D,mEAAmE;IACnE,+DAA+D;IAC/D,+DAA+D;IAC/D,mEAAmE;IACnE,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,iBAAiB,CAAC;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACd,sCAAsC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAC3D,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CACd,4CAA4C,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IACD,oEAAoE;IACpE,mEAAmE;IACnE,gEAAgE;IAChE,qEAAqE;IACrE,+DAA+D;IAC/D,iEAAiE;IACjE,MAAM,UAAU,GACf,OAAO,KAAK,QAAQ,IAAI,OAAO;QAC9B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAC3B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAqB,CAC9C;QACF,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAC3C,GAAG,EACH,OAAO,EACP,OAAO,EACP,UAAU,EACV,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,CAChB,CAAC;IAEF,4EAA4E;IAC5E,0EAA0E;IAC1E,2EAA2E;IAC3E,KAAK,UAAU,UAAU,CACxB,cAA+B;QAE/B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9C,sEAAsE;QACtE,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,WAAW,GAAgB,EAAE,CAAC;QACpC,MAAM,aAAa,GAAgB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG;YACZ,KAAK,CAAC,OAAO,CACZ,GAAW,EACX,SAAoB,EAAE;gBAEtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"NapiDbAdapter.js","sourceRoot":"","sources":["../../src/adapters/NapiDbAdapter.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -29,6 +29,37 @@ function napiReplacer(_key: string, value: unknown): unknown {
|
|
|
29
29
|
return value;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Refuse an array bound as ONE parameter.
|
|
34
|
+
*
|
|
35
|
+
* The binder has no array arm, so an array reached its catch-all and was bound
|
|
36
|
+
* as the JSON text `["a","b"]`. On SQLite that is merely wrong; on Postgres,
|
|
37
|
+
* `WHERE id = ANY($1)` makes the server read those text bytes as a binary array
|
|
38
|
+
* header, and it reports a dimension count read out of whatever happened to be
|
|
39
|
+
* there — a different number on every run. Silently sending bytes the server
|
|
40
|
+
* misreads is the failure this replaces.
|
|
41
|
+
*
|
|
42
|
+
* Expanding the list is the answer, and it is what Lucid does: `whereIn` emits
|
|
43
|
+
* `IN ($1, $2, …)` with one placeholder per value. So this names `whereIn`
|
|
44
|
+
* rather than teaching the binder a shape the query builder never produces.
|
|
45
|
+
*
|
|
46
|
+
* Only the TOP level is checked: a nested array is a JSON value inside an
|
|
47
|
+
* object being bound to a `json`/`jsonb` column, which is legitimate.
|
|
48
|
+
*/
|
|
49
|
+
function assertNoArrayParams(params: readonly unknown[] | undefined): void {
|
|
50
|
+
if (!params) return;
|
|
51
|
+
for (const [index, value] of params.entries()) {
|
|
52
|
+
if (!Array.isArray(value)) continue;
|
|
53
|
+
throw new Error(
|
|
54
|
+
`[E_ARRAY_PARAM] Parameter $${index + 1} is an array, which cannot be bound as a single value. ` +
|
|
55
|
+
"Expand it into one placeholder per element — `whereIn(column, values)` does this, " +
|
|
56
|
+
"and so does building the placeholders yourself: `IN (${values.map((_, i) => '$' + (i + 1)).join(', ')})`. " +
|
|
57
|
+
"Binding the array itself sends Postgres text where it expects an array, and it reports " +
|
|
58
|
+
"a nonsensical dimension count rather than a type error.",
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
32
63
|
/**
|
|
33
64
|
* JSON reviver for napi result sets. Rebuilds `{"$bytes": …}` envelopes (emitted
|
|
34
65
|
* by the Rust decoder for BLOB/BYTEA columns) into a `Uint8Array`. Integers
|
|
@@ -274,7 +305,7 @@ export async function createNapiConnection(
|
|
|
274
305
|
): Promise<{ rowsAffected: number; lastInsertId?: number }> {
|
|
275
306
|
const json = await native.execute(
|
|
276
307
|
sql,
|
|
277
|
-
JSON.stringify(params, napiReplacer),
|
|
308
|
+
(assertNoArrayParams(params), JSON.stringify(params, napiReplacer)),
|
|
278
309
|
);
|
|
279
310
|
const r = JSON.parse(json);
|
|
280
311
|
return {
|
|
@@ -289,7 +320,7 @@ export async function createNapiConnection(
|
|
|
289
320
|
): Promise<T[]> {
|
|
290
321
|
const json = await native.query(
|
|
291
322
|
sql,
|
|
292
|
-
JSON.stringify(params, napiReplacer),
|
|
323
|
+
(assertNoArrayParams(params), JSON.stringify(params, napiReplacer)),
|
|
293
324
|
);
|
|
294
325
|
return JSON.parse(json, napiReviver) as T[];
|
|
295
326
|
},
|
|
@@ -415,7 +446,8 @@ export async function createNapiConnection(
|
|
|
415
446
|
meta?: QueryMeta,
|
|
416
447
|
): Promise<T[]> {
|
|
417
448
|
return observed(sql, params, meta, async () => {
|
|
418
|
-
const paramsJson =
|
|
449
|
+
const paramsJson =
|
|
450
|
+
(assertNoArrayParams(params), JSON.stringify(params, napiReplacer));
|
|
419
451
|
const json =
|
|
420
452
|
meta?.serverTimeoutMs != null
|
|
421
453
|
? await db.queryTimed(sql, paramsJson, meta.serverTimeoutMs)
|
|
@@ -430,7 +462,8 @@ export async function createNapiConnection(
|
|
|
430
462
|
meta?: QueryMeta,
|
|
431
463
|
): Promise<{ rowsAffected: number; lastInsertId?: number }> {
|
|
432
464
|
return observed(sql, params, meta, async () => {
|
|
433
|
-
const paramsJson =
|
|
465
|
+
const paramsJson =
|
|
466
|
+
(assertNoArrayParams(params), JSON.stringify(params, napiReplacer));
|
|
434
467
|
const json =
|
|
435
468
|
meta?.serverTimeoutMs != null
|
|
436
469
|
? await db.executeTimed(sql, paramsJson, meta.serverTimeoutMs)
|