@effect-app/infra 4.0.0-beta.83 → 4.0.0-beta.84
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/CHANGELOG.md +7 -0
- package/dist/Store/SQL.d.ts +8 -1
- package/dist/Store/SQL.d.ts.map +1 -1
- package/dist/Store/SQL.js +7 -10
- package/package.json +2 -2
- package/src/Store/SQL.ts +4 -10
- package/test/sql-store.test.ts +259 -36
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.84
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c80e781: Fix SQLite store namespace parameter ordering in filter queries. The `_namespace` placeholder was prepended to the WHERE clause but its value was appended to the end of the positional params array, causing it to bind to the wrong placeholder. PostgreSQL was unaffected (uses indexed `$N` placeholders).
|
|
8
|
+
- effect-app@4.0.0-beta.84
|
|
9
|
+
|
|
3
10
|
## 4.0.0-beta.83
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
package/dist/Store/SQL.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { SqlClient } from "effect/unstable/sql";
|
|
2
|
-
import
|
|
2
|
+
import type { FieldValues } from "../Model/filter/types.js";
|
|
3
|
+
import { type PersistenceModelType, type StorageConfig, StoreMaker } from "./service.js";
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare const parseRow: <Encoded extends FieldValues>(row: {
|
|
6
|
+
id: string;
|
|
7
|
+
_etag: string | null;
|
|
8
|
+
data: string;
|
|
9
|
+
}, idKey: PropertyKey, defaultValues: Partial<Encoded>) => PersistenceModelType<Encoded>;
|
|
3
10
|
export declare function SQLiteStoreLayer(cfg: StorageConfig): import("effect/Layer").Layer<StoreMaker, never, SqlClient.SqlClient>;
|
|
4
11
|
//# sourceMappingURL=SQL.d.ts.map
|
package/dist/Store/SQL.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQL.d.ts","sourceRoot":"","sources":["../../src/Store/SQL.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"SQL.d.ts","sourceRoot":"","sources":["../../src/Store/SQL.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAmB,KAAK,oBAAoB,EAAE,KAAK,aAAa,EAAgC,UAAU,EAAE,MAAM,cAAc,CAAA;AAIvI,gBAAgB;AAChB,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,WAAW,EAClD,KAAK;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACvD,OAAO,WAAW,EAClB,eAAe,OAAO,CAAC,OAAO,CAAC,KAC9B,oBAAoB,CAAC,OAAO,CAG9B,CAAA;AA6SD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,wEAGlD"}
|
package/dist/Store/SQL.js
CHANGED
|
@@ -8,7 +8,8 @@ import { storeId } from "./Memory.js";
|
|
|
8
8
|
import { StoreMaker } from "./service.js";
|
|
9
9
|
import { buildWhereSQLQuery, logQuery, sqliteDialect } from "./SQL/query.js";
|
|
10
10
|
import { makeETag } from "./utils.js";
|
|
11
|
-
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const parseRow = (row, idKey, defaultValues) => {
|
|
12
13
|
const data = (typeof row.data === "string" ? JSON.parse(row.data) : row.data);
|
|
13
14
|
return { ...defaultValues, ...data, [idKey]: row.id, _etag: row._etag ?? undefined };
|
|
14
15
|
};
|
|
@@ -89,26 +90,22 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
89
90
|
.order, f
|
|
90
91
|
.skip, f
|
|
91
92
|
.limit);
|
|
92
|
-
const nsPlaceholder = dialect
|
|
93
|
-
.placeholder(q
|
|
94
|
-
.params
|
|
95
|
-
.length + 1);
|
|
96
93
|
const hasWhere = q
|
|
97
94
|
.sql
|
|
98
95
|
.includes("WHERE");
|
|
99
96
|
const nsSql = hasWhere
|
|
100
97
|
? q
|
|
101
98
|
.sql
|
|
102
|
-
.replace("WHERE", `WHERE _namespace =
|
|
99
|
+
.replace("WHERE", `WHERE _namespace = ? AND`)
|
|
103
100
|
: q
|
|
104
101
|
.sql
|
|
105
|
-
.replace(`FROM "${tableName}"`, `FROM "${tableName}" WHERE _namespace =
|
|
102
|
+
.replace(`FROM "${tableName}"`, `FROM "${tableName}" WHERE _namespace = ?`);
|
|
106
103
|
return {
|
|
107
104
|
sql: nsSql,
|
|
108
105
|
params: [
|
|
106
|
+
ns,
|
|
109
107
|
...q
|
|
110
|
-
.params
|
|
111
|
-
ns
|
|
108
|
+
.params
|
|
112
109
|
]
|
|
113
110
|
};
|
|
114
111
|
})
|
|
@@ -201,4 +198,4 @@ export function SQLiteStoreLayer(cfg) {
|
|
|
201
198
|
return StoreMaker
|
|
202
199
|
.toLayer(makeSQLStoreInt(sqliteDialect, "JSON")(cfg));
|
|
203
200
|
}
|
|
204
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL1NRTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBOEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkksT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBbUIsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxNQUFNLFFBQVEsR0FBRyxDQUNmLEdBQXVELEVBQ3ZELEtBQWtCLEVBQ2xCLGFBQStCLEVBQ0EsRUFBRTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUE7SUFDdkYsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQW1DLENBQUE7QUFDdkgsQ0FBQyxD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
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL1NRTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBOEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkksT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBbUIsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxnQkFBZ0I7QUFDaEIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQ3RCLEdBQXVELEVBQ3ZELEtBQWtCLEVBQ2xCLGFBQStCLEVBQ0EsRUFBRTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUE7SUFDdkYsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFT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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.84",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.84"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.2",
|
package/src/Store/SQL.ts
CHANGED
|
@@ -144,31 +144,25 @@ function makeSQLStoreInt(dialect: SQLDialect, jsonColumnType: string) {
|
|
|
144
144
|
f
|
|
145
145
|
.limit
|
|
146
146
|
)
|
|
147
|
-
const nsPlaceholder = dialect
|
|
148
|
-
.placeholder(
|
|
149
|
-
q
|
|
150
|
-
.params
|
|
151
|
-
.length + 1
|
|
152
|
-
)
|
|
153
147
|
const hasWhere = q
|
|
154
148
|
.sql
|
|
155
149
|
.includes("WHERE")
|
|
156
150
|
const nsSql = hasWhere
|
|
157
151
|
? q
|
|
158
152
|
.sql
|
|
159
|
-
.replace("WHERE", `WHERE _namespace =
|
|
153
|
+
.replace("WHERE", `WHERE _namespace = ? AND`)
|
|
160
154
|
: q
|
|
161
155
|
.sql
|
|
162
156
|
.replace(
|
|
163
157
|
`FROM "${tableName}"`,
|
|
164
|
-
`FROM "${tableName}" WHERE _namespace =
|
|
158
|
+
`FROM "${tableName}" WHERE _namespace = ?`
|
|
165
159
|
)
|
|
166
160
|
return {
|
|
167
161
|
sql: nsSql,
|
|
168
162
|
params: [
|
|
163
|
+
ns,
|
|
169
164
|
...q
|
|
170
|
-
.params
|
|
171
|
-
ns
|
|
165
|
+
.params
|
|
172
166
|
]
|
|
173
167
|
}
|
|
174
168
|
})
|
package/test/sql-store.test.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import type Sqlite from "better-sqlite3"
|
|
3
3
|
import BetterSqlite from "better-sqlite3"
|
|
4
4
|
import { describe, expect, it } from "vitest"
|
|
5
|
+
import { parseRow } from "../src/Store/SQL.js"
|
|
5
6
|
import { buildWhereSQLQuery, pgDialect, sqliteDialect } from "../src/Store/SQL/query.js"
|
|
7
|
+
import { makeETag } from "../src/Store/utils.js"
|
|
6
8
|
|
|
7
9
|
const query = (db: Sqlite.Database, sql: string, params: unknown[] = []) =>
|
|
8
10
|
db.prepare(sql).all(...params as any[]) as any[]
|
|
@@ -309,7 +311,8 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
309
311
|
db.exec(
|
|
310
312
|
`CREATE TABLE IF NOT EXISTS "test_items" (id TEXT PRIMARY KEY, _etag TEXT, data JSON NOT NULL)`
|
|
311
313
|
)
|
|
312
|
-
db
|
|
314
|
+
db
|
|
315
|
+
.prepare(`INSERT INTO "test_items" (id, _etag, data) VALUES (?, ?, ?)`)
|
|
313
316
|
.run("1", "etag1", JSON.stringify({ name: "Alice", age: 30 }))
|
|
314
317
|
|
|
315
318
|
const rows = db.prepare(`SELECT * FROM "test_items"`).all()
|
|
@@ -324,7 +327,8 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
324
327
|
)
|
|
325
328
|
// Simulate what toRow now produces: data without id or _etag
|
|
326
329
|
const data = { name: "Alice", age: 30, tags: ["admin"] }
|
|
327
|
-
db
|
|
330
|
+
db
|
|
331
|
+
.prepare(`INSERT INTO "test_clean" (id, _etag, data) VALUES (?, ?, ?)`)
|
|
328
332
|
.run("1", "etag1", JSON.stringify(data))
|
|
329
333
|
|
|
330
334
|
const row = db.prepare(`SELECT * FROM "test_clean" WHERE id = ?`).get("1") as any
|
|
@@ -345,26 +349,32 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
345
349
|
`CREATE TABLE IF NOT EXISTS "test_compat" (id TEXT PRIMARY KEY, _etag TEXT, data JSON NOT NULL)`
|
|
346
350
|
)
|
|
347
351
|
// Old format: id and _etag inside data
|
|
348
|
-
db
|
|
352
|
+
db
|
|
353
|
+
.prepare(`INSERT INTO "test_compat" (id, _etag, data) VALUES (?, ?, ?)`)
|
|
349
354
|
.run("1", "etag1", JSON.stringify({ id: "1", _etag: "old_etag", name: "Alice", age: 30 }))
|
|
350
355
|
// New format: id and _etag stripped from data
|
|
351
|
-
db
|
|
356
|
+
db
|
|
357
|
+
.prepare(`INSERT INTO "test_compat" (id, _etag, data) VALUES (?, ?, ?)`)
|
|
352
358
|
.run("2", "etag2", JSON.stringify({ name: "Bob", age: 25 }))
|
|
353
359
|
|
|
354
360
|
// Both should be queryable by name
|
|
355
361
|
const q1 = buildWhereSQLQuery(
|
|
356
|
-
sqliteDialect,
|
|
362
|
+
sqliteDialect,
|
|
363
|
+
"id",
|
|
357
364
|
[{ t: "where", path: "name", op: "eq", value: "Alice" }],
|
|
358
|
-
"test_compat",
|
|
365
|
+
"test_compat",
|
|
366
|
+
{}
|
|
359
367
|
)
|
|
360
368
|
const r1 = query(db, q1.sql, q1.params)
|
|
361
369
|
expect(r1.length).toBe(1)
|
|
362
370
|
expect((r1[0] as any).id).toBe("1")
|
|
363
371
|
|
|
364
372
|
const q2 = buildWhereSQLQuery(
|
|
365
|
-
sqliteDialect,
|
|
373
|
+
sqliteDialect,
|
|
374
|
+
"id",
|
|
366
375
|
[{ t: "where", path: "name", op: "eq", value: "Bob" }],
|
|
367
|
-
"test_compat",
|
|
376
|
+
"test_compat",
|
|
377
|
+
{}
|
|
368
378
|
)
|
|
369
379
|
const r2 = query(db, q2.sql, q2.params)
|
|
370
380
|
expect(r2.length).toBe(1)
|
|
@@ -372,9 +382,11 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
372
382
|
|
|
373
383
|
// Both queryable by id column
|
|
374
384
|
const q3 = buildWhereSQLQuery(
|
|
375
|
-
sqliteDialect,
|
|
385
|
+
sqliteDialect,
|
|
386
|
+
"id",
|
|
376
387
|
[{ t: "where", path: "id", op: "in", value: ["1", "2"] as any }],
|
|
377
|
-
"test_compat",
|
|
388
|
+
"test_compat",
|
|
389
|
+
{}
|
|
378
390
|
)
|
|
379
391
|
expect(query(db, q3.sql, q3.params).length).toBe(2)
|
|
380
392
|
}))
|
|
@@ -396,17 +408,21 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
396
408
|
|
|
397
409
|
// Filter by field in data
|
|
398
410
|
const q1 = buildWhereSQLQuery(
|
|
399
|
-
sqliteDialect,
|
|
411
|
+
sqliteDialect,
|
|
412
|
+
"id",
|
|
400
413
|
[{ t: "where", path: "age", op: "gt", value: 28 as any }],
|
|
401
|
-
"test_noid",
|
|
414
|
+
"test_noid",
|
|
415
|
+
{}
|
|
402
416
|
)
|
|
403
417
|
expect(query(db, q1.sql, q1.params).length).toBe(2) // Alice(30), Charlie(35)
|
|
404
418
|
|
|
405
419
|
// Filter by id column
|
|
406
420
|
const q2 = buildWhereSQLQuery(
|
|
407
|
-
sqliteDialect,
|
|
421
|
+
sqliteDialect,
|
|
422
|
+
"id",
|
|
408
423
|
[{ t: "where", path: "id", op: "eq", value: "2" }],
|
|
409
|
-
"test_noid",
|
|
424
|
+
"test_noid",
|
|
425
|
+
{}
|
|
410
426
|
)
|
|
411
427
|
const r2 = query(db, q2.sql, q2.params)
|
|
412
428
|
expect(r2.length).toBe(1)
|
|
@@ -415,10 +431,15 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
415
431
|
|
|
416
432
|
// Order + limit still works
|
|
417
433
|
const q3 = buildWhereSQLQuery(
|
|
418
|
-
sqliteDialect,
|
|
434
|
+
sqliteDialect,
|
|
435
|
+
"id",
|
|
436
|
+
[],
|
|
437
|
+
"test_noid",
|
|
438
|
+
{},
|
|
419
439
|
undefined,
|
|
420
440
|
[{ key: "age", direction: "ASC" }] as any,
|
|
421
|
-
undefined,
|
|
441
|
+
undefined,
|
|
442
|
+
2
|
|
422
443
|
)
|
|
423
444
|
const r3 = query(db, q3.sql, q3.params)
|
|
424
445
|
expect(r3.length).toBe(2)
|
|
@@ -448,40 +469,48 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
448
469
|
|
|
449
470
|
// Test eq
|
|
450
471
|
const q1 = buildWhereSQLQuery(
|
|
451
|
-
sqliteDialect,
|
|
472
|
+
sqliteDialect,
|
|
473
|
+
"id",
|
|
452
474
|
[{ t: "where", path: "name", op: "eq", value: "Alice" }],
|
|
453
|
-
"test_people",
|
|
475
|
+
"test_people",
|
|
476
|
+
{}
|
|
454
477
|
)
|
|
455
478
|
expect(query(db, q1.sql, q1.params).length).toBe(1)
|
|
456
479
|
expect((JSON.parse((query(db, q1.sql, q1.params)[0] as any).data) as any).name).toBe("Alice")
|
|
457
480
|
|
|
458
481
|
// Test gt
|
|
459
482
|
const q2 = buildWhereSQLQuery(
|
|
460
|
-
sqliteDialect,
|
|
483
|
+
sqliteDialect,
|
|
484
|
+
"id",
|
|
461
485
|
[{ t: "where", path: "age", op: "gt", value: 28 as any }],
|
|
462
|
-
"test_people",
|
|
486
|
+
"test_people",
|
|
487
|
+
{}
|
|
463
488
|
)
|
|
464
489
|
expect(query(db, q2.sql, q2.params).length).toBe(2)
|
|
465
490
|
|
|
466
491
|
// Test OR
|
|
467
492
|
const q3 = buildWhereSQLQuery(
|
|
468
|
-
sqliteDialect,
|
|
493
|
+
sqliteDialect,
|
|
494
|
+
"id",
|
|
469
495
|
[
|
|
470
496
|
{ t: "where", path: "name", op: "eq", value: "Alice" },
|
|
471
497
|
{ t: "or", path: "name", op: "eq", value: "Bob" }
|
|
472
498
|
],
|
|
473
|
-
"test_people",
|
|
499
|
+
"test_people",
|
|
500
|
+
{}
|
|
474
501
|
)
|
|
475
502
|
expect(query(db, q3.sql, q3.params).length).toBe(2)
|
|
476
503
|
|
|
477
504
|
// Test AND
|
|
478
505
|
const q4 = buildWhereSQLQuery(
|
|
479
|
-
sqliteDialect,
|
|
506
|
+
sqliteDialect,
|
|
507
|
+
"id",
|
|
480
508
|
[
|
|
481
509
|
{ t: "where", path: "name", op: "eq", value: "Alice" },
|
|
482
510
|
{ t: "and", path: "age", op: "gt", value: 25 as any }
|
|
483
511
|
],
|
|
484
|
-
"test_people",
|
|
512
|
+
"test_people",
|
|
513
|
+
{}
|
|
485
514
|
)
|
|
486
515
|
const r4 = query(db, q4.sql, q4.params)
|
|
487
516
|
expect(r4.length).toBe(1)
|
|
@@ -489,25 +518,31 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
489
518
|
|
|
490
519
|
// Test IN
|
|
491
520
|
const q5 = buildWhereSQLQuery(
|
|
492
|
-
sqliteDialect,
|
|
521
|
+
sqliteDialect,
|
|
522
|
+
"id",
|
|
493
523
|
[{ t: "where", path: "id", op: "in", value: ["1", "3"] as any }],
|
|
494
|
-
"test_people",
|
|
524
|
+
"test_people",
|
|
525
|
+
{}
|
|
495
526
|
)
|
|
496
527
|
expect(query(db, q5.sql, q5.params).length).toBe(2)
|
|
497
528
|
|
|
498
529
|
// Test contains (string)
|
|
499
530
|
const q6 = buildWhereSQLQuery(
|
|
500
|
-
sqliteDialect,
|
|
531
|
+
sqliteDialect,
|
|
532
|
+
"id",
|
|
501
533
|
[{ t: "where", path: "name", op: "contains", value: "li" }],
|
|
502
|
-
"test_people",
|
|
534
|
+
"test_people",
|
|
535
|
+
{}
|
|
503
536
|
)
|
|
504
537
|
expect(query(db, q6.sql, q6.params).length).toBe(2) // Alice, Charlie
|
|
505
538
|
|
|
506
539
|
// Test startsWith
|
|
507
540
|
const q7 = buildWhereSQLQuery(
|
|
508
|
-
sqliteDialect,
|
|
541
|
+
sqliteDialect,
|
|
542
|
+
"id",
|
|
509
543
|
[{ t: "where", path: "name", op: "startsWith", value: "Al" }],
|
|
510
|
-
"test_people",
|
|
544
|
+
"test_people",
|
|
545
|
+
{}
|
|
511
546
|
)
|
|
512
547
|
const r7 = query(db, q7.sql, q7.params)
|
|
513
548
|
expect(r7.length).toBe(1)
|
|
@@ -515,15 +550,18 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
515
550
|
|
|
516
551
|
// Test includes (array)
|
|
517
552
|
const q8 = buildWhereSQLQuery(
|
|
518
|
-
sqliteDialect,
|
|
553
|
+
sqliteDialect,
|
|
554
|
+
"id",
|
|
519
555
|
[{ t: "where", path: "tags", op: "includes", value: "admin" }],
|
|
520
|
-
"test_people",
|
|
556
|
+
"test_people",
|
|
557
|
+
{}
|
|
521
558
|
)
|
|
522
559
|
expect(query(db, q8.sql, q8.params).length).toBe(2) // Alice, Charlie
|
|
523
560
|
|
|
524
561
|
// Test nested scope: where name = Alice OR (age > 30 AND name contains 'ar')
|
|
525
562
|
const q9 = buildWhereSQLQuery(
|
|
526
|
-
sqliteDialect,
|
|
563
|
+
sqliteDialect,
|
|
564
|
+
"id",
|
|
527
565
|
[
|
|
528
566
|
{ t: "where", path: "name", op: "eq", value: "Alice" },
|
|
529
567
|
{
|
|
@@ -535,19 +573,204 @@ describe("SQL Store (SQLite integration)", () => {
|
|
|
535
573
|
relation: "some"
|
|
536
574
|
}
|
|
537
575
|
],
|
|
538
|
-
"test_people",
|
|
576
|
+
"test_people",
|
|
577
|
+
{}
|
|
539
578
|
)
|
|
540
579
|
expect(query(db, q9.sql, q9.params).length).toBe(2) // Alice + Charlie
|
|
541
580
|
|
|
542
581
|
// Test order + limit
|
|
543
582
|
const q10 = buildWhereSQLQuery(
|
|
544
|
-
sqliteDialect,
|
|
583
|
+
sqliteDialect,
|
|
584
|
+
"id",
|
|
585
|
+
[],
|
|
586
|
+
"test_people",
|
|
587
|
+
{},
|
|
545
588
|
undefined,
|
|
546
589
|
[{ key: "age", direction: "DESC" }] as any,
|
|
547
|
-
undefined,
|
|
590
|
+
undefined,
|
|
591
|
+
2
|
|
548
592
|
)
|
|
549
593
|
const r10 = query(db, q10.sql, q10.params)
|
|
550
594
|
expect(r10.length).toBe(2)
|
|
551
595
|
expect((JSON.parse((r10[0] as any).data) as any).name).toBe("Charlie") // oldest first
|
|
552
596
|
}))
|
|
597
|
+
|
|
598
|
+
it("namespace param is in correct position for SQLite positional placeholders", () =>
|
|
599
|
+
withDb((db) => {
|
|
600
|
+
db.exec(
|
|
601
|
+
`CREATE TABLE IF NOT EXISTS "test_ns" (id TEXT NOT NULL, _namespace TEXT NOT NULL DEFAULT 'primary', _etag TEXT, data JSON NOT NULL, PRIMARY KEY (id, _namespace))`
|
|
602
|
+
)
|
|
603
|
+
const insert = db.prepare(
|
|
604
|
+
`INSERT INTO "test_ns" (id, _namespace, _etag, data) VALUES (?, ?, ?, ?)`
|
|
605
|
+
)
|
|
606
|
+
insert.run("1", "primary", "e1", JSON.stringify({ name: "Alice", role: "admin" }))
|
|
607
|
+
insert.run("2", "primary", "e2", JSON.stringify({ name: "Bob", role: "user" }))
|
|
608
|
+
insert.run("3", "other", "e3", JSON.stringify({ name: "Charlie", role: "admin" }))
|
|
609
|
+
|
|
610
|
+
// Build a filter query: role != 'deleted'
|
|
611
|
+
const q = buildWhereSQLQuery(
|
|
612
|
+
sqliteDialect,
|
|
613
|
+
"id",
|
|
614
|
+
[{ t: "where", path: "role", op: "neq", value: "deleted" }],
|
|
615
|
+
"test_ns",
|
|
616
|
+
{}
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
// Simulate what SQL.ts does: prepend _namespace = ? and put ns FIRST in params
|
|
620
|
+
const hasWhere = q.sql.includes("WHERE")
|
|
621
|
+
const nsSql = hasWhere
|
|
622
|
+
? q.sql.replace("WHERE", `WHERE _namespace = ? AND`)
|
|
623
|
+
: q.sql.replace(`FROM "test_ns"`, `FROM "test_ns" WHERE _namespace = ?`)
|
|
624
|
+
const params = ["primary", ...q.params]
|
|
625
|
+
|
|
626
|
+
const results = query(db, nsSql, params)
|
|
627
|
+
// Should only get Alice and Bob (primary namespace), not Charlie (other namespace)
|
|
628
|
+
expect(results.length).toBe(2)
|
|
629
|
+
const names = results.map((r) => (JSON.parse((r as any).data) as any).name).sort()
|
|
630
|
+
expect(names).toEqual(["Alice", "Bob"])
|
|
631
|
+
}))
|
|
632
|
+
})
|
|
633
|
+
|
|
634
|
+
// --- toRow stripping and parseRow reconstruction tests ---
|
|
635
|
+
|
|
636
|
+
describe("toRow strips _etag and id from data", () => {
|
|
637
|
+
// Replicate the toRow logic from SQL.ts to test in isolation
|
|
638
|
+
const toRow = <IdKey extends PropertyKey>(e: any, idKey: IdKey) => {
|
|
639
|
+
const newE = makeETag(e)
|
|
640
|
+
const id = newE[idKey] as string
|
|
641
|
+
const { _etag, [idKey]: _id, ...rest } = newE as any
|
|
642
|
+
const data = JSON.stringify(rest)
|
|
643
|
+
return { id, _etag: newE._etag!, data, item: newE }
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
it("data JSON does not contain _etag", () => {
|
|
647
|
+
const row = toRow({ id: "1", _etag: undefined, name: "Alice", age: 30 }, "id")
|
|
648
|
+
const parsed = JSON.parse(row.data) as any
|
|
649
|
+
expect(parsed).not.toHaveProperty("_etag")
|
|
650
|
+
expect(parsed.name).toBe("Alice")
|
|
651
|
+
expect(parsed.age).toBe(30)
|
|
652
|
+
})
|
|
653
|
+
|
|
654
|
+
it("data JSON does not contain id field", () => {
|
|
655
|
+
const row = toRow({ id: "1", _etag: undefined, name: "Alice" }, "id")
|
|
656
|
+
const parsed = JSON.parse(row.data) as any
|
|
657
|
+
expect(parsed).not.toHaveProperty("id")
|
|
658
|
+
expect(parsed.name).toBe("Alice")
|
|
659
|
+
})
|
|
660
|
+
|
|
661
|
+
it("data JSON does not contain custom idKey field", () => {
|
|
662
|
+
const row = toRow({ myId: "abc", _etag: undefined, name: "Bob" }, "myId")
|
|
663
|
+
const parsed = JSON.parse(row.data) as any
|
|
664
|
+
expect(parsed).not.toHaveProperty("myId")
|
|
665
|
+
expect(parsed.name).toBe("Bob")
|
|
666
|
+
expect(row.id).toBe("abc")
|
|
667
|
+
})
|
|
668
|
+
|
|
669
|
+
it("id and _etag are returned as separate fields", () => {
|
|
670
|
+
const row = toRow({ id: "1", _etag: undefined, name: "Alice" }, "id")
|
|
671
|
+
expect(row.id).toBe("1")
|
|
672
|
+
expect(typeof row._etag).toBe("string")
|
|
673
|
+
expect(row._etag.length).toBeGreaterThan(0)
|
|
674
|
+
})
|
|
675
|
+
|
|
676
|
+
it("item still contains all fields including _etag and id", () => {
|
|
677
|
+
const row = toRow({ id: "1", _etag: undefined, name: "Alice" }, "id")
|
|
678
|
+
expect(row.item.id).toBe("1")
|
|
679
|
+
expect(row.item._etag).toBe(row._etag)
|
|
680
|
+
expect(row.item.name).toBe("Alice")
|
|
681
|
+
})
|
|
682
|
+
|
|
683
|
+
it("preserves nested objects in data", () => {
|
|
684
|
+
const row = toRow({ id: "1", _etag: undefined, address: { city: "NYC", zip: "10001" } }, "id")
|
|
685
|
+
const parsed = JSON.parse(row.data) as any
|
|
686
|
+
expect(parsed.address).toEqual({ city: "NYC", zip: "10001" })
|
|
687
|
+
expect(parsed).not.toHaveProperty("id")
|
|
688
|
+
expect(parsed).not.toHaveProperty("_etag")
|
|
689
|
+
})
|
|
690
|
+
})
|
|
691
|
+
|
|
692
|
+
describe("parseRow reconstructs full object from row", () => {
|
|
693
|
+
it("re-injects id from row column using idKey", () => {
|
|
694
|
+
const result: any = parseRow(
|
|
695
|
+
{ id: "42", _etag: "etag1", data: JSON.stringify({ name: "Alice", age: 30 }) },
|
|
696
|
+
"id",
|
|
697
|
+
{}
|
|
698
|
+
)
|
|
699
|
+
expect(result.id).toBe("42")
|
|
700
|
+
expect(result.name).toBe("Alice")
|
|
701
|
+
expect(result.age).toBe(30)
|
|
702
|
+
expect(result._etag).toBe("etag1")
|
|
703
|
+
})
|
|
704
|
+
|
|
705
|
+
it("re-injects custom idKey from row column", () => {
|
|
706
|
+
const result: any = parseRow(
|
|
707
|
+
{ id: "abc", _etag: "etag2", data: JSON.stringify({ name: "Bob" }) },
|
|
708
|
+
"myId",
|
|
709
|
+
{}
|
|
710
|
+
)
|
|
711
|
+
expect(result.myId).toBe("abc")
|
|
712
|
+
expect(result.name).toBe("Bob")
|
|
713
|
+
expect(result._etag).toBe("etag2")
|
|
714
|
+
})
|
|
715
|
+
|
|
716
|
+
it("uses _etag from row column, not from data", () => {
|
|
717
|
+
const result: any = parseRow(
|
|
718
|
+
{ id: "1", _etag: "column_etag", data: JSON.stringify({ _etag: "stale_data_etag", name: "Alice" }) },
|
|
719
|
+
"id",
|
|
720
|
+
{}
|
|
721
|
+
)
|
|
722
|
+
expect(result._etag).toBe("column_etag")
|
|
723
|
+
})
|
|
724
|
+
|
|
725
|
+
it("uses id from row column, not from data", () => {
|
|
726
|
+
const result: any = parseRow(
|
|
727
|
+
{ id: "correct_id", _etag: "e1", data: JSON.stringify({ id: "wrong_id", name: "Alice" }) },
|
|
728
|
+
"id",
|
|
729
|
+
{}
|
|
730
|
+
)
|
|
731
|
+
expect(result.id).toBe("correct_id")
|
|
732
|
+
})
|
|
733
|
+
|
|
734
|
+
it("applies defaultValues for missing fields", () => {
|
|
735
|
+
const result: any = parseRow(
|
|
736
|
+
{ id: "1", _etag: "e1", data: JSON.stringify({ name: "Alice" }) },
|
|
737
|
+
"id",
|
|
738
|
+
{ status: "active", role: "user" }
|
|
739
|
+
)
|
|
740
|
+
expect(result.name).toBe("Alice")
|
|
741
|
+
expect(result.status).toBe("active")
|
|
742
|
+
expect(result.role).toBe("user")
|
|
743
|
+
})
|
|
744
|
+
|
|
745
|
+
it("data fields override defaultValues", () => {
|
|
746
|
+
const result: any = parseRow(
|
|
747
|
+
{ id: "1", _etag: "e1", data: JSON.stringify({ name: "Alice", status: "inactive" }) },
|
|
748
|
+
"id",
|
|
749
|
+
{ status: "active" }
|
|
750
|
+
)
|
|
751
|
+
expect(result.status).toBe("inactive")
|
|
752
|
+
})
|
|
753
|
+
|
|
754
|
+
it("handles null _etag from row", () => {
|
|
755
|
+
const result: any = parseRow(
|
|
756
|
+
{ id: "1", _etag: null, data: JSON.stringify({ name: "Alice" }) },
|
|
757
|
+
"id",
|
|
758
|
+
{}
|
|
759
|
+
)
|
|
760
|
+
expect(result._etag).toBeUndefined()
|
|
761
|
+
})
|
|
762
|
+
|
|
763
|
+
it("round-trip: toRow then parseRow reconstructs the original", () => {
|
|
764
|
+
const original = { id: "1", _etag: undefined as string | undefined, name: "Alice", age: 30, tags: ["admin"] }
|
|
765
|
+
const newE = makeETag(original)
|
|
766
|
+
const { _etag, id: _id, ...rest } = newE as any
|
|
767
|
+
const row = { id: newE.id, _etag: newE._etag!, data: JSON.stringify(rest) }
|
|
768
|
+
|
|
769
|
+
const reconstructed: any = parseRow(row, "id", {})
|
|
770
|
+
expect(reconstructed.id).toBe("1")
|
|
771
|
+
expect(reconstructed.name).toBe("Alice")
|
|
772
|
+
expect(reconstructed.age).toBe(30)
|
|
773
|
+
expect(reconstructed.tags).toEqual(["admin"])
|
|
774
|
+
expect(reconstructed._etag).toBe(newE._etag)
|
|
775
|
+
})
|
|
553
776
|
})
|