@prisma-idb/adapter-idb 0.6.1 → 0.8.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.
- package/README.md +5 -14
- package/dist/control.mjs +1 -1
- package/dist/descriptor-meta-lcyUIkpU.mjs +34 -0
- package/dist/descriptor-meta-lcyUIkpU.mjs.map +1 -0
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +27 -12
- package/dist/runtime.mjs.map +1 -1
- package/package.json +4 -4
- package/dist/descriptor-meta-DRDNlZjA.mjs +0 -22
- package/dist/descriptor-meta-DRDNlZjA.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
# `@prisma-idb/adapter-idb`
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The IndexedDB adapter for Prisma 8. It maps Prisma types to how IndexedDB stores them, declares what IndexedDB can do, and passes query plans from the ORM to the driver.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Install it as a dev dependency; `prisma.config.ts` uses `@prisma-idb/adapter-idb/control`. Apps don't import it directly; `@prisma-idb/client-idb` does.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
family-idb (CLI / config)
|
|
11
|
-
client-idb (ORM query builder)
|
|
12
|
-
runtime-idb (RuntimeCore)
|
|
13
|
-
adapter-idb ← you are here (query AST → IDB plan)
|
|
14
|
-
driver-idb (window.indexedDB wrapper)
|
|
15
|
-
target-idb (identity + migrations)
|
|
7
|
+
```bash
|
|
8
|
+
npm install --save-dev @prisma-idb/adapter-idb
|
|
16
9
|
```
|
|
17
10
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Consumed internally by the rest of the `@prisma-idb` family. You generally do not install this package directly — use [`@prisma-idb/family-idb`](https://www.npmjs.com/package/@prisma-idb/family-idb) as your entry point.
|
|
11
|
+
Part of [Prisma 8 IDB](https://prisma-idb.dev/docs/prisma-8), a typed IndexedDB client for Prisma 8. Start with the [Quick Start](https://prisma-idb.dev/docs/prisma-8/getting-started). For how the packages fit together, see [ARCHITECTURE.md](https://github.com/prisma-idb/prisma-idb/blob/main/packages/prisma-orm/docs/ARCHITECTURE.md).
|
|
21
12
|
|
|
22
13
|
## License
|
|
23
14
|
|
package/dist/control.mjs
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/core/descriptor-meta.ts
|
|
2
|
+
const idbAdapterDescriptorMeta = {
|
|
3
|
+
kind: "adapter",
|
|
4
|
+
familyId: "idb",
|
|
5
|
+
targetId: "idb",
|
|
6
|
+
id: "idb",
|
|
7
|
+
version: "0.0.1",
|
|
8
|
+
capabilities: { idb: {
|
|
9
|
+
/** IDB's `upgradeneeded` callback IS a version-change transaction. */
|
|
10
|
+
transactionalDDL: true,
|
|
11
|
+
/** DDL can ONLY run inside `upgradeneeded` — never at query time. */
|
|
12
|
+
ddlOnlyInUpgrade: true,
|
|
13
|
+
/** IDB has no RETURNING clause. */
|
|
14
|
+
returning: false,
|
|
15
|
+
/**
|
|
16
|
+
* Storage-level compound keys/indexes (Phase 9.1/9.2 —
|
|
17
|
+
* `IdbStoreDefinition`/`IdbIndexDefinition.keyPath` accept an array).
|
|
18
|
+
* This describes the `idb` adapter itself, not any optional add-on:
|
|
19
|
+
* `@prisma-idb/sync-server`'s ownership DAG (used by
|
|
20
|
+
* `sync-extension-idb`) separately does not support compound-keyed
|
|
21
|
+
* models yet — `getKeyField` throws for anything but a single string
|
|
22
|
+
* `keyPath` — but that's a `sync-server`-specific limitation enforced
|
|
23
|
+
* (and documented) there, not a capability of this adapter/target
|
|
24
|
+
* stack, and targets don't declare capabilities of their own (see
|
|
25
|
+
* `target-idb/src/core/descriptor-meta.ts`) for a narrower consumer
|
|
26
|
+
* to override this with.
|
|
27
|
+
*/
|
|
28
|
+
compoundKeys: true
|
|
29
|
+
} }
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { idbAdapterDescriptorMeta as t };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=descriptor-meta-lcyUIkpU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-meta-lcyUIkpU.mjs","names":[],"sources":["../src/core/descriptor-meta.ts"],"sourcesContent":["import type { AdapterDescriptor } from \"@prisma/orm-framework/components/components\";\n\nexport const idbAdapterDescriptorMeta = {\n kind: \"adapter\",\n familyId: \"idb\",\n targetId: \"idb\",\n id: \"idb\",\n version: \"0.0.1\",\n capabilities: {\n idb: {\n /** IDB's `upgradeneeded` callback IS a version-change transaction. */\n transactionalDDL: true,\n /** DDL can ONLY run inside `upgradeneeded` — never at query time. */\n ddlOnlyInUpgrade: true,\n /** IDB has no RETURNING clause. */\n returning: false,\n /**\n * Storage-level compound keys/indexes (Phase 9.1/9.2 —\n * `IdbStoreDefinition`/`IdbIndexDefinition.keyPath` accept an array).\n * This describes the `idb` adapter itself, not any optional add-on:\n * `@prisma-idb/sync-server`'s ownership DAG (used by\n * `sync-extension-idb`) separately does not support compound-keyed\n * models yet — `getKeyField` throws for anything but a single string\n * `keyPath` — but that's a `sync-server`-specific limitation enforced\n * (and documented) there, not a capability of this adapter/target\n * stack, and targets don't declare capabilities of their own (see\n * `target-idb/src/core/descriptor-meta.ts`) for a narrower consumer\n * to override this with.\n */\n compoundKeys: true,\n },\n },\n} satisfies AdapterDescriptor<\"idb\", \"idb\">;\n"],"mappings":";AAEA,MAAa,2BAA2B;CACtC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EACZ,KAAK;;EAEH,kBAAkB;;EAElB,kBAAkB;;EAElB,WAAW;;;;;;;;;;;;;;EAcX,cAAc;CAChB,EACF;AACF"}
|
package/dist/runtime.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/core/idb-filter-expr.ts","../src/core/idb-query-ast.ts","../src/core/idb-query-plan.ts","../src/core/runtime-adapter-instance.ts","../src/core/filter-eval.ts","../src/core/idb-adapter.ts","../src/exports/runtime.ts"],"mappings":";;;;;;;;;;;;;;;;;;KAcY;;UAIK;WACN;WACA;WACA,IAAI;WACJ;;;UAIM;WACN;WACA,OAAO,cAAc;;;UAIf;WACN;WACA,OAAO,cAAc;;;UAIf;WACN;WACA,MAAM;;;;;;;UAQA;WACN;WACA;WACA;;KAGC,gBAAgB,iBAAiB,aAAa,YAAY,aAAa;;cAKtE,cAAe,eAAe,IAAI,aAAa,mBAAiB;;cAIhE,UAAW,OAAO,cAAc,mBAAiB;;cAIjD,SAAU,OAAO,cAAc,mBAAiB;;cAIhD,UAAW,MAAM,kBAAgB;;cAGjC,gBAAiB,eAAe,oBAAkB;;;;;;;;;;;iBAe/C,sBAAsB,SAAS,0BAA0B;;;;;;;;;;KCnE7D,cACR,iBACA,mBACA,eACA,eACA,eACA,kBACA,oBACA,kBACA,oBACA,kBACA,oBACA,cACA,kBACA;;UAGa;WACN;;WAEA;;WAEA,QAAQ;;WAER,UAAU;;WAEV;;WAEA;;;UAIM;WACN;;WAEA;;WAEA;;;UAIM;WACN;;WAEA;;WAEA,MAAM;;;UAIA;WACN;;WAEA;;WAEA;;;UAIM;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,MAAM;;;UAIA;WACN;WACA;WACA,MAAM;;;UAIA;WACN;WACA;WACA,QAAQ;;;UAIF;WACN;WACA;WACA,QAAQ;;;UAIF;WACN;WACA;WACA,QAAQ;;;UAIF;;WAEN;;WAEA;;;;;;;;;UAUM;WACN;WACA;WACA,QAAQ;;WAER,YAAY,SAAS,eAAe;;;;;;;;UAS9B;WACN;WACA;WACA,QAAQ;;WAER;;WAEA,YAAY,SAAS,eAAe;;;;cC1KjC;;;;;;;;;;;;;;;;;;;;UAqBG,aAAa,uBAAuB,UAAU;;WAEpD,SAAS;;;;;;;WAOT,MAAM;;YAEL,qBAAqB;;;;;;;;;;;;;;;UCrBhB,kBAAkB,6BAA6B;;WAErD,UAAU;;;;;;;;;;;;;;;UAgBJ,kCAAkC;;;;;;;;;;;EAWjD,MAAM,MAAM,cAAc,KAAK,oBAAoB,QAAQ;;;;;
|
|
1
|
+
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/core/idb-filter-expr.ts","../src/core/idb-query-ast.ts","../src/core/idb-query-plan.ts","../src/core/runtime-adapter-instance.ts","../src/core/filter-eval.ts","../src/core/idb-adapter.ts","../src/exports/runtime.ts"],"mappings":";;;;;;;;;;;;;;;;;;KAcY;;UAIK;WACN;WACA;WACA,IAAI;WACJ;;;UAIM;WACN;WACA,OAAO,cAAc;;;UAIf;WACN;WACA,OAAO,cAAc;;;UAIf;WACN;WACA,MAAM;;;;;;;UAQA;WACN;WACA;WACA;;KAGC,gBAAgB,iBAAiB,aAAa,YAAY,aAAa;;cAKtE,cAAe,eAAe,IAAI,aAAa,mBAAiB;;cAIhE,UAAW,OAAO,cAAc,mBAAiB;;cAIjD,SAAU,OAAO,cAAc,mBAAiB;;cAIhD,UAAW,MAAM,kBAAgB;;cAGjC,gBAAiB,eAAe,oBAAkB;;;;;;;;;;;iBAe/C,sBAAsB,SAAS,0BAA0B;;;;;;;;;;KCnE7D,cACR,iBACA,mBACA,eACA,eACA,eACA,kBACA,oBACA,kBACA,oBACA,kBACA,oBACA,cACA,kBACA;;UAGa;WACN;;WAEA;;WAEA,QAAQ;;WAER,UAAU;;WAEV;;WAEA;;;UAIM;WACN;;WAEA;;WAEA;;;UAIM;WACN;;WAEA;;WAEA,MAAM;;;UAIA;WACN;;WAEA;;WAEA;;;UAIM;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,OAAO;WACP,QAAQ;;;UAIF;WACN;WACA;WACA,MAAM;;;UAIA;WACN;WACA;WACA,MAAM;;;UAIA;WACN;WACA;WACA,QAAQ;;;UAIF;WACN;WACA;WACA,QAAQ;;;UAIF;WACN;WACA;WACA,QAAQ;;;UAIF;;WAEN;;WAEA;;;;;;;;;UAUM;WACN;WACA;WACA,QAAQ;;WAER,YAAY,SAAS,eAAe;;;;;;;;UAS9B;WACN;WACA;WACA,QAAQ;;WAER;;WAEA,YAAY,SAAS,eAAe;;;;cC1KjC;;;;;;;;;;;;;;;;;;;;UAqBG,aAAa,uBAAuB,UAAU;;WAEpD,SAAS;;;;;;;WAOT,MAAM;;YAEL,qBAAqB;;;;;;;;;;;;;;;UCrBhB,kBAAkB,6BAA6B;;WAErD,UAAU;;;;;;;;;;;;;;;UAgBJ,kCAAkC;;;;;;;;;;;EAWjD,MAAM,MAAM,cAAc,KAAK,oBAAoB,QAAQ;;;;;iBC1B7C,eAAe,MAAM,eAAe,KAAK;;;;;;;;;;;;;;;;;;cCC5C,sBAAsB;;WACxB;WACA;EAIG,YAAA,QAAQ;EAIpB,MAAM,MAAM,cAAc,KAAK,oBAAoB,QAAQ;;;;cCSvD,6BAA6B,uCAAuC"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as idbAdapterDescriptorMeta } from "./descriptor-meta-
|
|
2
|
-
import { idbCodecLookup } from "@prisma-idb/target-idb/runtime";
|
|
1
|
+
import { t as idbAdapterDescriptorMeta } from "./descriptor-meta-lcyUIkpU.mjs";
|
|
2
|
+
import { compareFieldValues, fieldValuesEqual, idbCodecLookup } from "@prisma-idb/target-idb/runtime";
|
|
3
3
|
//#region src/core/idb-adapter.ts
|
|
4
4
|
/**
|
|
5
5
|
* Concrete IDB runtime adapter.
|
|
@@ -85,6 +85,20 @@ function shorthandToFilterExpr(filters) {
|
|
|
85
85
|
}
|
|
86
86
|
//#endregion
|
|
87
87
|
//#region src/core/filter-eval.ts
|
|
88
|
+
/**
|
|
89
|
+
* Pure-JS evaluator for {@link IdbFilterExpr}.
|
|
90
|
+
*
|
|
91
|
+
* The driver's `IdbRowFilter` type stays as `(row) => boolean` — the
|
|
92
|
+
* accessor builds a closure that calls `evaluateFilter(expr, row)` and
|
|
93
|
+
* passes that to the driver. The driver therefore never imports the
|
|
94
|
+
* adapter's AST types, and keeps no dependency on the adapter.
|
|
95
|
+
*
|
|
96
|
+
* Equality and ordering compare values the way IndexedDB compares keys, so
|
|
97
|
+
* a filter gives the same answer whether it runs here or through an index
|
|
98
|
+
* key range. Plain `===` would never match two equal `Date`s or byte arrays,
|
|
99
|
+
* because values read back from IndexedDB are fresh objects. String
|
|
100
|
+
* operations coerce both sides via `String(...)` so they work on numbers too.
|
|
101
|
+
*/
|
|
88
102
|
/** Evaluate an AST node against a single row. Returns `true` to keep the row. */
|
|
89
103
|
function evaluateFilter(expr, row) {
|
|
90
104
|
switch (expr.kind) {
|
|
@@ -109,28 +123,29 @@ function evalFieldOp(field, op, value, row) {
|
|
|
109
123
|
switch (op) {
|
|
110
124
|
case "eq":
|
|
111
125
|
if (value === null) return cell === null || cell === void 0;
|
|
112
|
-
return cell
|
|
126
|
+
return fieldValuesEqual(cell, value);
|
|
113
127
|
case "neq":
|
|
114
128
|
if (value === null) return cell !== null && cell !== void 0;
|
|
115
|
-
return cell
|
|
116
|
-
case "gt": return cell
|
|
117
|
-
case "lt": return cell
|
|
118
|
-
case "gte": return cell
|
|
119
|
-
case "lte": return cell
|
|
129
|
+
return !fieldValuesEqual(cell, value);
|
|
130
|
+
case "gt": return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) > 0;
|
|
131
|
+
case "lt": return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) < 0;
|
|
132
|
+
case "gte": return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) >= 0;
|
|
133
|
+
case "lte": return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) <= 0;
|
|
120
134
|
case "in":
|
|
121
135
|
if (!Array.isArray(value)) return false;
|
|
122
|
-
|
|
123
|
-
return false;
|
|
136
|
+
return value.some((v) => fieldValuesEqual(cell, v));
|
|
124
137
|
case "notIn":
|
|
125
138
|
if (!Array.isArray(value)) return true;
|
|
126
|
-
|
|
127
|
-
return true;
|
|
139
|
+
return !value.some((v) => fieldValuesEqual(cell, v));
|
|
128
140
|
case "contains": return cell !== void 0 && cell !== null && String(cell).includes(String(value));
|
|
129
141
|
case "startsWith": return cell !== void 0 && cell !== null && String(cell).startsWith(String(value));
|
|
130
142
|
case "endsWith": return cell !== void 0 && cell !== null && String(cell).endsWith(String(value));
|
|
131
143
|
default: return false;
|
|
132
144
|
}
|
|
133
145
|
}
|
|
146
|
+
function isPresent(value) {
|
|
147
|
+
return value !== null && value !== void 0;
|
|
148
|
+
}
|
|
134
149
|
//#endregion
|
|
135
150
|
//#region src/exports/runtime.ts
|
|
136
151
|
const idbRuntimeAdapterDescriptor = {
|
package/dist/runtime.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":["#codecs"],"sources":["../src/core/idb-adapter.ts","../src/core/idb-filter-expr.ts","../src/core/filter-eval.ts","../src/exports/runtime.ts"],"sourcesContent":["import type { CodecLookup } from \"@prisma/orm-framework/components/codec\";\nimport type { IdbPlanBody } from \"@prisma-idb/driver-idb/runtime\";\nimport type { IdbQueryPlan } from \"./idb-query-plan\";\nimport type { IdbLowererContext, IdbRuntimeAdapterInstance } from \"./runtime-adapter-instance\";\n\n/**\n * Concrete IDB runtime adapter.\n *\n * Implements {@link IdbRuntimeAdapterInstance} — the `lower()` method that\n * translates an {@link IdbQueryPlan} into an {@link IdbPlanBody} ready for\n * the driver.\n *\n * `lower()` is a structural passthrough: the `idbPlan` carried by\n * `IdbQueryPlan` is already execution-ready because IDB has no query\n * language to compile from. The `codecs` lookup and `ctx.contract` are\n * available for per-field codec encoding when custom codecs (e.g.\n * `idb/date@1`) need to transform field values before they reach the\n * driver. Since all current `idb/*` codecs are identity transforms, the\n * passthrough output is correct for the standard type set.\n */\nexport class IdbAdapter implements IdbRuntimeAdapterInstance {\n readonly familyId = \"idb\" as const;\n readonly targetId = \"idb\" as const;\n\n readonly #codecs: CodecLookup;\n\n constructor(codecs: CodecLookup) {\n this.#codecs = codecs;\n }\n\n lower(plan: IdbQueryPlan, ctx: IdbLowererContext): Promise<IdbPlanBody> {\n // Passthrough: idbPlan is execution-ready as-is since IDB has no query\n // language. When per-field codec encoding is added, walk\n // plan.idbPlan's record/key fields here, resolve each field's codec via\n // this.#codecs + ctx.contract's per-store schema, and call\n // codec.encode(value, ctx) to produce the wire value.\n void this.#codecs; // codec registry for per-field encoding\n void ctx.contract; // contract storage schema (field→codec resolution)\n void ctx.signal; // AbortSignal for cooperative cancellation\n return Promise.resolve(plan.idbPlan);\n }\n}\n","/**\n * Filter expression AST for IDB queries.\n *\n * Plain frozen objects (not classes) — IDB has no codec trait gating to\n * worry about and no visitor pattern needed (a recursive `evaluateFilter`\n * is plenty). Mirrors the design of Prisma ORM's Mongo family\n * (`MongoFieldFilter`, `MongoAndExpr`, ...) and the SQL ORM's `BinaryExpr`,\n * but with the class machinery stripped out.\n *\n * The AST is carried on `IdbQueryAst` (intent layer) and lowered into an\n * `IdbRowFilter` closure that the driver applies during cursor scans —\n * keeping the driver free of any AST imports.\n */\n\nexport type IdbFilterOp =\n \"eq\" | \"neq\" | \"gt\" | \"lt\" | \"gte\" | \"lte\" | \"in\" | \"notIn\" | \"contains\" | \"startsWith\" | \"endsWith\";\n\n/** Comparison / membership predicate on a single field. */\nexport interface IdbFieldFilter {\n readonly kind: \"field\";\n readonly field: string;\n readonly op: IdbFilterOp;\n readonly value: unknown;\n}\n\n/** Conjunction. Empty `exprs` is truthy (vacuously true). */\nexport interface IdbAndExpr {\n readonly kind: \"and\";\n readonly exprs: ReadonlyArray<IdbFilterExpr>;\n}\n\n/** Disjunction. Empty `exprs` is falsy. */\nexport interface IdbOrExpr {\n readonly kind: \"or\";\n readonly exprs: ReadonlyArray<IdbFilterExpr>;\n}\n\n/** Logical NOT. */\nexport interface IdbNotExpr {\n readonly kind: \"not\";\n readonly expr: IdbFilterExpr;\n}\n\n/**\n * Null check. Distinct from `eq null` because IDB serialises absent\n * fields as `undefined`; a null check treats `null` and `undefined`\n * as equivalent (matching the shorthand `where({ field: null })`).\n */\nexport interface IdbNullCheckExpr {\n readonly kind: \"null-check\";\n readonly field: string;\n readonly isNull: boolean;\n}\n\nexport type IdbFilterExpr = IdbFieldFilter | IdbAndExpr | IdbOrExpr | IdbNotExpr | IdbNullCheckExpr;\n\n// ── Factory helpers ───────────────────────────────────────────────────────────\n\n/** Build a frozen field-filter node. */\nexport const fieldFilter = (field: string, op: IdbFilterOp, value: unknown): IdbFieldFilter =>\n Object.freeze({ kind: \"field\", field, op, value });\n\n/** Build a frozen AND combinator with a frozen `exprs` array. */\nexport const andExpr = (exprs: ReadonlyArray<IdbFilterExpr>): IdbAndExpr =>\n Object.freeze({ kind: \"and\", exprs: Object.freeze([...exprs]) });\n\n/** Build a frozen OR combinator with a frozen `exprs` array. */\nexport const orExpr = (exprs: ReadonlyArray<IdbFilterExpr>): IdbOrExpr =>\n Object.freeze({ kind: \"or\", exprs: Object.freeze([...exprs]) });\n\n/** Build a frozen NOT combinator. */\nexport const notExpr = (expr: IdbFilterExpr): IdbNotExpr => Object.freeze({ kind: \"not\", expr });\n\n/** Build a frozen null-check node. */\nexport const nullCheckExpr = (field: string, isNull: boolean): IdbNullCheckExpr =>\n Object.freeze({ kind: \"null-check\", field, isNull });\n\n// ── Shorthand → expression ────────────────────────────────────────────────────\n\n/**\n * Convert a shorthand equality object (e.g. `{ active: true, email: \"x\" }`)\n * into the canonical AST form. `undefined` entries are dropped; `null`\n * values become null-checks rather than literal-null equalities (IDB\n * stores absent fields as `undefined`, so a literal-null equality misses).\n *\n * Returns `undefined` when the input has no usable entries — callers can\n * skip filter installation in that case rather than testing an empty\n * AND node every row.\n */\nexport function shorthandToFilterExpr(filters: Record<string, unknown>): IdbFilterExpr | undefined {\n const exprs: IdbFilterExpr[] = [];\n for (const [field, value] of Object.entries(filters)) {\n if (value === undefined) continue;\n if (value === null) {\n exprs.push(nullCheckExpr(field, true));\n continue;\n }\n exprs.push(fieldFilter(field, \"eq\", value));\n }\n if (exprs.length === 0) return undefined;\n return exprs.length === 1 ? exprs[0]! : andExpr(exprs);\n}\n","/**\n * Pure-JS evaluator for {@link IdbFilterExpr}.\n *\n * The driver's `IdbRowFilter` type stays as `(row) => boolean` — the\n * accessor builds a closure that calls `evaluateFilter(expr, row)` and\n * passes that to the driver. The driver therefore never imports the\n * adapter's AST types, preserving the layering rule in ARCHITECTURE.md.\n *\n * Comparisons use JS semantics (numeric vs string ordering is governed\n * by `<`/`>` on whatever the stored value type is). String operations\n * coerce both sides via `String(...)` so they work on numbers too — the\n * IDB driver stores values via the structured-clone algorithm, so a\n * field that contains an integer is genuinely a JS `number`.\n */\n\nimport type { IdbFilterExpr } from \"./idb-filter-expr\";\n\n/** Evaluate an AST node against a single row. Returns `true` to keep the row. */\nexport function evaluateFilter(expr: IdbFilterExpr, row: Record<string, unknown>): boolean {\n switch (expr.kind) {\n case \"field\":\n return evalFieldOp(expr.field, expr.op, expr.value, row);\n case \"and\": {\n for (const e of expr.exprs) {\n if (!evaluateFilter(e, row)) return false;\n }\n return true;\n }\n case \"or\": {\n if (expr.exprs.length === 0) return false;\n for (const e of expr.exprs) {\n if (evaluateFilter(e, row)) return true;\n }\n return false;\n }\n case \"not\":\n return !evaluateFilter(expr.expr, row);\n case \"null-check\": {\n const v = row[expr.field];\n const isNullish = v === null || v === undefined;\n return expr.isNull ? isNullish : !isNullish;\n }\n }\n}\n\nfunction evalFieldOp(field: string, op: string, value: unknown, row: Record<string, unknown>): boolean {\n const cell = row[field];\n switch (op) {\n case \"eq\":\n // `eq` treats null and undefined as equivalent so the shorthand path\n // (`{ field: someValue }`) keeps working when stored rows omit the\n // field. Literal-null equality goes through `null-check` instead.\n if (value === null) return cell === null || cell === undefined;\n return cell === value;\n case \"neq\":\n if (value === null) return cell !== null && cell !== undefined;\n return cell !== value;\n case \"gt\":\n return cell !== undefined && cell !== null && (cell as number | string) > (value as number | string);\n case \"lt\":\n return cell !== undefined && cell !== null && (cell as number | string) < (value as number | string);\n case \"gte\":\n return cell !== undefined && cell !== null && (cell as number | string) >= (value as number | string);\n case \"lte\":\n return cell !== undefined && cell !== null && (cell as number | string) <= (value as number | string);\n case \"in\": {\n if (!Array.isArray(value)) return false;\n for (const v of value) {\n if (cell === v) return true;\n }\n return false;\n }\n case \"notIn\": {\n if (!Array.isArray(value)) return true;\n for (const v of value) {\n if (cell === v) return false;\n }\n return true;\n }\n case \"contains\":\n return cell !== undefined && cell !== null && String(cell).includes(String(value));\n case \"startsWith\":\n return cell !== undefined && cell !== null && String(cell).startsWith(String(value));\n case \"endsWith\":\n return cell !== undefined && cell !== null && String(cell).endsWith(String(value));\n default:\n return false;\n }\n}\n","import type { RuntimeAdapterDescriptor, ExecutionStack } from \"@prisma/orm-framework/components/execution\";\nimport { idbCodecLookup } from \"@prisma-idb/target-idb/runtime\";\nimport { idbAdapterDescriptorMeta } from \"../core/descriptor-meta\";\nimport { IdbAdapter } from \"../core/idb-adapter\";\nimport type { IdbRuntimeAdapterInstance } from \"../core/runtime-adapter-instance\";\n\nexport type { IdbRuntimeAdapterInstance, IdbLowererContext } from \"../core/runtime-adapter-instance\";\nexport type { IdbQueryPlan } from \"../core/idb-query-plan\";\nexport type {\n IdbQueryAst,\n IdbFindManyAst,\n IdbFindUniqueAst,\n IdbCreateAst,\n IdbDeleteAst,\n IdbUpdateAst,\n IdbUpdateAllAst,\n IdbUpdateCountAst,\n IdbCreateAllAst,\n IdbCreateCountAst,\n IdbDeleteAllAst,\n IdbDeleteCountAst,\n IdbCountAst,\n IdbAggregateAst,\n IdbGroupByAst,\n IdbAggregateRequest,\n} from \"../core/idb-query-ast\";\nexport type {\n IdbFilterExpr,\n IdbFieldFilter,\n IdbAndExpr,\n IdbOrExpr,\n IdbNotExpr,\n IdbNullCheckExpr,\n IdbFilterOp,\n} from \"../core/idb-filter-expr\";\nexport { fieldFilter, andExpr, orExpr, notExpr, nullCheckExpr, shorthandToFilterExpr } from \"../core/idb-filter-expr\";\nexport { evaluateFilter } from \"../core/filter-eval\";\nexport { IdbAdapter } from \"../core/idb-adapter\";\n\nconst idbRuntimeAdapterDescriptor: RuntimeAdapterDescriptor<\"idb\", \"idb\", IdbRuntimeAdapterInstance> = {\n ...idbAdapterDescriptorMeta,\n create(_stack: ExecutionStack<\"idb\", \"idb\">): IdbRuntimeAdapterInstance {\n // Construct the adapter with the real IDB codec lookup so per-field\n // encoding works when non-identity codecs are added. The current set\n // is all-identity, so output behavior is unchanged; this wiring makes\n // the descriptor-built adapter match the hand-constructed one in\n // `createIdbClient`.\n return new IdbAdapter(idbCodecLookup);\n },\n};\n\nexport default idbRuntimeAdapterDescriptor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":["#codecs"],"sources":["../src/core/idb-adapter.ts","../src/core/idb-filter-expr.ts","../src/core/filter-eval.ts","../src/exports/runtime.ts"],"sourcesContent":["import type { CodecLookup } from \"@prisma/orm-framework/components/codec\";\nimport type { IdbPlanBody } from \"@prisma-idb/driver-idb/runtime\";\nimport type { IdbQueryPlan } from \"./idb-query-plan\";\nimport type { IdbLowererContext, IdbRuntimeAdapterInstance } from \"./runtime-adapter-instance\";\n\n/**\n * Concrete IDB runtime adapter.\n *\n * Implements {@link IdbRuntimeAdapterInstance} — the `lower()` method that\n * translates an {@link IdbQueryPlan} into an {@link IdbPlanBody} ready for\n * the driver.\n *\n * `lower()` is a structural passthrough: the `idbPlan` carried by\n * `IdbQueryPlan` is already execution-ready because IDB has no query\n * language to compile from. The `codecs` lookup and `ctx.contract` are\n * available for per-field codec encoding when custom codecs (e.g.\n * `idb/date@1`) need to transform field values before they reach the\n * driver. Since all current `idb/*` codecs are identity transforms, the\n * passthrough output is correct for the standard type set.\n */\nexport class IdbAdapter implements IdbRuntimeAdapterInstance {\n readonly familyId = \"idb\" as const;\n readonly targetId = \"idb\" as const;\n\n readonly #codecs: CodecLookup;\n\n constructor(codecs: CodecLookup) {\n this.#codecs = codecs;\n }\n\n lower(plan: IdbQueryPlan, ctx: IdbLowererContext): Promise<IdbPlanBody> {\n // Passthrough: idbPlan is execution-ready as-is since IDB has no query\n // language. When per-field codec encoding is added, walk\n // plan.idbPlan's record/key fields here, resolve each field's codec via\n // this.#codecs + ctx.contract's per-store schema, and call\n // codec.encode(value, ctx) to produce the wire value.\n void this.#codecs; // codec registry for per-field encoding\n void ctx.contract; // contract storage schema (field→codec resolution)\n void ctx.signal; // AbortSignal for cooperative cancellation\n return Promise.resolve(plan.idbPlan);\n }\n}\n","/**\n * Filter expression AST for IDB queries.\n *\n * Plain frozen objects (not classes) — IDB has no codec trait gating to\n * worry about and no visitor pattern needed (a recursive `evaluateFilter`\n * is plenty). Mirrors the design of Prisma ORM's Mongo family\n * (`MongoFieldFilter`, `MongoAndExpr`, ...) and the SQL ORM's `BinaryExpr`,\n * but with the class machinery stripped out.\n *\n * The AST is carried on `IdbQueryAst` (intent layer) and lowered into an\n * `IdbRowFilter` closure that the driver applies during cursor scans —\n * keeping the driver free of any AST imports.\n */\n\nexport type IdbFilterOp =\n \"eq\" | \"neq\" | \"gt\" | \"lt\" | \"gte\" | \"lte\" | \"in\" | \"notIn\" | \"contains\" | \"startsWith\" | \"endsWith\";\n\n/** Comparison / membership predicate on a single field. */\nexport interface IdbFieldFilter {\n readonly kind: \"field\";\n readonly field: string;\n readonly op: IdbFilterOp;\n readonly value: unknown;\n}\n\n/** Conjunction. Empty `exprs` is truthy (vacuously true). */\nexport interface IdbAndExpr {\n readonly kind: \"and\";\n readonly exprs: ReadonlyArray<IdbFilterExpr>;\n}\n\n/** Disjunction. Empty `exprs` is falsy. */\nexport interface IdbOrExpr {\n readonly kind: \"or\";\n readonly exprs: ReadonlyArray<IdbFilterExpr>;\n}\n\n/** Logical NOT. */\nexport interface IdbNotExpr {\n readonly kind: \"not\";\n readonly expr: IdbFilterExpr;\n}\n\n/**\n * Null check. Distinct from `eq null` because IDB serialises absent\n * fields as `undefined`; a null check treats `null` and `undefined`\n * as equivalent (matching the shorthand `where({ field: null })`).\n */\nexport interface IdbNullCheckExpr {\n readonly kind: \"null-check\";\n readonly field: string;\n readonly isNull: boolean;\n}\n\nexport type IdbFilterExpr = IdbFieldFilter | IdbAndExpr | IdbOrExpr | IdbNotExpr | IdbNullCheckExpr;\n\n// ── Factory helpers ───────────────────────────────────────────────────────────\n\n/** Build a frozen field-filter node. */\nexport const fieldFilter = (field: string, op: IdbFilterOp, value: unknown): IdbFieldFilter =>\n Object.freeze({ kind: \"field\", field, op, value });\n\n/** Build a frozen AND combinator with a frozen `exprs` array. */\nexport const andExpr = (exprs: ReadonlyArray<IdbFilterExpr>): IdbAndExpr =>\n Object.freeze({ kind: \"and\", exprs: Object.freeze([...exprs]) });\n\n/** Build a frozen OR combinator with a frozen `exprs` array. */\nexport const orExpr = (exprs: ReadonlyArray<IdbFilterExpr>): IdbOrExpr =>\n Object.freeze({ kind: \"or\", exprs: Object.freeze([...exprs]) });\n\n/** Build a frozen NOT combinator. */\nexport const notExpr = (expr: IdbFilterExpr): IdbNotExpr => Object.freeze({ kind: \"not\", expr });\n\n/** Build a frozen null-check node. */\nexport const nullCheckExpr = (field: string, isNull: boolean): IdbNullCheckExpr =>\n Object.freeze({ kind: \"null-check\", field, isNull });\n\n// ── Shorthand → expression ────────────────────────────────────────────────────\n\n/**\n * Convert a shorthand equality object (e.g. `{ active: true, email: \"x\" }`)\n * into the canonical AST form. `undefined` entries are dropped; `null`\n * values become null-checks rather than literal-null equalities (IDB\n * stores absent fields as `undefined`, so a literal-null equality misses).\n *\n * Returns `undefined` when the input has no usable entries — callers can\n * skip filter installation in that case rather than testing an empty\n * AND node every row.\n */\nexport function shorthandToFilterExpr(filters: Record<string, unknown>): IdbFilterExpr | undefined {\n const exprs: IdbFilterExpr[] = [];\n for (const [field, value] of Object.entries(filters)) {\n if (value === undefined) continue;\n if (value === null) {\n exprs.push(nullCheckExpr(field, true));\n continue;\n }\n exprs.push(fieldFilter(field, \"eq\", value));\n }\n if (exprs.length === 0) return undefined;\n return exprs.length === 1 ? exprs[0]! : andExpr(exprs);\n}\n","/**\n * Pure-JS evaluator for {@link IdbFilterExpr}.\n *\n * The driver's `IdbRowFilter` type stays as `(row) => boolean` — the\n * accessor builds a closure that calls `evaluateFilter(expr, row)` and\n * passes that to the driver. The driver therefore never imports the\n * adapter's AST types, and keeps no dependency on the adapter.\n *\n * Equality and ordering compare values the way IndexedDB compares keys, so\n * a filter gives the same answer whether it runs here or through an index\n * key range. Plain `===` would never match two equal `Date`s or byte arrays,\n * because values read back from IndexedDB are fresh objects. String\n * operations coerce both sides via `String(...)` so they work on numbers too.\n */\n\nimport { compareFieldValues, fieldValuesEqual } from \"@prisma-idb/target-idb/runtime\";\nimport type { IdbFilterExpr } from \"./idb-filter-expr\";\n\n/** Evaluate an AST node against a single row. Returns `true` to keep the row. */\nexport function evaluateFilter(expr: IdbFilterExpr, row: Record<string, unknown>): boolean {\n switch (expr.kind) {\n case \"field\":\n return evalFieldOp(expr.field, expr.op, expr.value, row);\n case \"and\": {\n for (const e of expr.exprs) {\n if (!evaluateFilter(e, row)) return false;\n }\n return true;\n }\n case \"or\": {\n if (expr.exprs.length === 0) return false;\n for (const e of expr.exprs) {\n if (evaluateFilter(e, row)) return true;\n }\n return false;\n }\n case \"not\":\n return !evaluateFilter(expr.expr, row);\n case \"null-check\": {\n const v = row[expr.field];\n const isNullish = v === null || v === undefined;\n return expr.isNull ? isNullish : !isNullish;\n }\n }\n}\n\nfunction evalFieldOp(field: string, op: string, value: unknown, row: Record<string, unknown>): boolean {\n const cell = row[field];\n switch (op) {\n case \"eq\":\n // `eq` treats null and undefined as equivalent so the shorthand path\n // (`{ field: someValue }`) keeps working when stored rows omit the\n // field. Literal-null equality goes through `null-check` instead.\n if (value === null) return cell === null || cell === undefined;\n return fieldValuesEqual(cell, value);\n case \"neq\":\n if (value === null) return cell !== null && cell !== undefined;\n return !fieldValuesEqual(cell, value);\n case \"gt\":\n return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) > 0;\n case \"lt\":\n return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) < 0;\n case \"gte\":\n return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) >= 0;\n case \"lte\":\n return isPresent(cell) && isPresent(value) && compareFieldValues(cell, value) <= 0;\n case \"in\": {\n if (!Array.isArray(value)) return false;\n return value.some((v) => fieldValuesEqual(cell, v));\n }\n case \"notIn\": {\n if (!Array.isArray(value)) return true;\n return !value.some((v) => fieldValuesEqual(cell, v));\n }\n case \"contains\":\n return cell !== undefined && cell !== null && String(cell).includes(String(value));\n case \"startsWith\":\n return cell !== undefined && cell !== null && String(cell).startsWith(String(value));\n case \"endsWith\":\n return cell !== undefined && cell !== null && String(cell).endsWith(String(value));\n default:\n return false;\n }\n}\n\nfunction isPresent(value: unknown): boolean {\n return value !== null && value !== undefined;\n}\n","import type { RuntimeAdapterDescriptor, ExecutionStack } from \"@prisma/orm-framework/components/execution\";\nimport { idbCodecLookup } from \"@prisma-idb/target-idb/runtime\";\nimport { idbAdapterDescriptorMeta } from \"../core/descriptor-meta\";\nimport { IdbAdapter } from \"../core/idb-adapter\";\nimport type { IdbRuntimeAdapterInstance } from \"../core/runtime-adapter-instance\";\n\nexport type { IdbRuntimeAdapterInstance, IdbLowererContext } from \"../core/runtime-adapter-instance\";\nexport type { IdbQueryPlan } from \"../core/idb-query-plan\";\nexport type {\n IdbQueryAst,\n IdbFindManyAst,\n IdbFindUniqueAst,\n IdbCreateAst,\n IdbDeleteAst,\n IdbUpdateAst,\n IdbUpdateAllAst,\n IdbUpdateCountAst,\n IdbCreateAllAst,\n IdbCreateCountAst,\n IdbDeleteAllAst,\n IdbDeleteCountAst,\n IdbCountAst,\n IdbAggregateAst,\n IdbGroupByAst,\n IdbAggregateRequest,\n} from \"../core/idb-query-ast\";\nexport type {\n IdbFilterExpr,\n IdbFieldFilter,\n IdbAndExpr,\n IdbOrExpr,\n IdbNotExpr,\n IdbNullCheckExpr,\n IdbFilterOp,\n} from \"../core/idb-filter-expr\";\nexport { fieldFilter, andExpr, orExpr, notExpr, nullCheckExpr, shorthandToFilterExpr } from \"../core/idb-filter-expr\";\nexport { evaluateFilter } from \"../core/filter-eval\";\nexport { IdbAdapter } from \"../core/idb-adapter\";\n\nconst idbRuntimeAdapterDescriptor: RuntimeAdapterDescriptor<\"idb\", \"idb\", IdbRuntimeAdapterInstance> = {\n ...idbAdapterDescriptorMeta,\n create(_stack: ExecutionStack<\"idb\", \"idb\">): IdbRuntimeAdapterInstance {\n // Construct the adapter with the real IDB codec lookup so per-field\n // encoding works when non-identity codecs are added. The current set\n // is all-identity, so output behavior is unchanged; this wiring makes\n // the descriptor-built adapter match the hand-constructed one in\n // `createIdbClient`.\n return new IdbAdapter(idbCodecLookup);\n },\n};\n\nexport default idbRuntimeAdapterDescriptor;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-idb/adapter-idb",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Prisma 8 IDB family — adapter (lowers query AST to opaque IDB plan body)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"./package.json": "./package.json"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@prisma-idb/driver-idb": "0.
|
|
33
|
-
"@prisma-idb/target-idb": "0.
|
|
34
|
-
"@prisma/orm-framework": "8.0.0-rc.
|
|
32
|
+
"@prisma-idb/driver-idb": "0.8.0",
|
|
33
|
+
"@prisma-idb/target-idb": "0.8.0",
|
|
34
|
+
"@prisma/orm-framework": "8.0.0-rc.12"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"tsdown": "^0.22.14",
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
//#region src/core/descriptor-meta.ts
|
|
2
|
-
const idbAdapterDescriptorMeta = {
|
|
3
|
-
kind: "adapter",
|
|
4
|
-
familyId: "idb",
|
|
5
|
-
targetId: "idb",
|
|
6
|
-
id: "idb",
|
|
7
|
-
version: "0.0.1",
|
|
8
|
-
capabilities: { idb: {
|
|
9
|
-
/** IDB's `upgradeneeded` callback IS a version-change transaction. */
|
|
10
|
-
transactionalDDL: true,
|
|
11
|
-
/** DDL can ONLY run inside `upgradeneeded` — never at query time. */
|
|
12
|
-
ddlOnlyInUpgrade: true,
|
|
13
|
-
/** IDB has no RETURNING clause. */
|
|
14
|
-
returning: false,
|
|
15
|
-
/** Compound keys are forbidden by sync ownership invariants. */
|
|
16
|
-
compoundKeys: false
|
|
17
|
-
} }
|
|
18
|
-
};
|
|
19
|
-
//#endregion
|
|
20
|
-
export { idbAdapterDescriptorMeta as t };
|
|
21
|
-
|
|
22
|
-
//# sourceMappingURL=descriptor-meta-DRDNlZjA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor-meta-DRDNlZjA.mjs","names":[],"sources":["../src/core/descriptor-meta.ts"],"sourcesContent":["import type { AdapterDescriptor } from \"@prisma/orm-framework/components/components\";\n\nexport const idbAdapterDescriptorMeta = {\n kind: \"adapter\",\n familyId: \"idb\",\n targetId: \"idb\",\n id: \"idb\",\n version: \"0.0.1\",\n capabilities: {\n idb: {\n /** IDB's `upgradeneeded` callback IS a version-change transaction. */\n transactionalDDL: true,\n /** DDL can ONLY run inside `upgradeneeded` — never at query time. */\n ddlOnlyInUpgrade: true,\n /** IDB has no RETURNING clause. */\n returning: false,\n /** Compound keys are forbidden by sync ownership invariants. */\n compoundKeys: false,\n },\n },\n} satisfies AdapterDescriptor<\"idb\", \"idb\">;\n"],"mappings":";AAEA,MAAa,2BAA2B;CACtC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EACZ,KAAK;;EAEH,kBAAkB;;EAElB,kBAAkB;;EAElB,WAAW;;EAEX,cAAc;CAChB,EACF;AACF"}
|