@vibeorm/runtime 2.0.0-alpha.1 → 2.0.0-alpha.10

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 (76) hide show
  1. package/dist/adapter.d.ts +132 -6
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/bulk-upsert.d.ts +282 -0
  4. package/dist/bulk-upsert.d.ts.map +1 -0
  5. package/dist/client.d.ts +70 -19
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/codecs.d.ts.map +1 -1
  8. package/dist/computed.d.ts +43 -0
  9. package/dist/computed.d.ts.map +1 -0
  10. package/dist/db-now.d.ts +41 -0
  11. package/dist/db-now.d.ts.map +1 -0
  12. package/dist/diagnostics/index.d.ts +12 -0
  13. package/dist/diagnostics/index.d.ts.map +1 -0
  14. package/dist/diagnostics/insight.d.ts +63 -0
  15. package/dist/diagnostics/insight.d.ts.map +1 -0
  16. package/dist/diagnostics/plan.d.ts +88 -0
  17. package/dist/diagnostics/plan.d.ts.map +1 -0
  18. package/dist/diagnostics/preview.d.ts +43 -0
  19. package/dist/diagnostics/preview.d.ts.map +1 -0
  20. package/dist/diagnostics/types.d.ts +223 -0
  21. package/dist/diagnostics/types.d.ts.map +1 -0
  22. package/dist/diagnostics/workload.d.ts +32 -0
  23. package/dist/diagnostics/workload.d.ts.map +1 -0
  24. package/dist/index.d.ts +33 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +10958 -4325
  27. package/dist/index.js.map +36 -13
  28. package/dist/keyset-iterator.d.ts +73 -0
  29. package/dist/keyset-iterator.d.ts.map +1 -0
  30. package/dist/keyset.d.ts +121 -0
  31. package/dist/keyset.d.ts.map +1 -0
  32. package/dist/model-meta.d.ts +62 -6
  33. package/dist/model-meta.d.ts.map +1 -1
  34. package/dist/nested-writes.d.ts +0 -33
  35. package/dist/nested-writes.d.ts.map +1 -1
  36. package/dist/policy-operation.d.ts +14 -0
  37. package/dist/policy-operation.d.ts.map +1 -0
  38. package/dist/policy.d.ts +17 -0
  39. package/dist/policy.d.ts.map +1 -0
  40. package/dist/query-builder.d.ts +30 -1
  41. package/dist/query-builder.d.ts.map +1 -1
  42. package/dist/relation-key.d.ts +23 -0
  43. package/dist/relation-key.d.ts.map +1 -0
  44. package/dist/relation-loader.d.ts +0 -29
  45. package/dist/relation-loader.d.ts.map +1 -1
  46. package/dist/relation-plan.d.ts +47 -7
  47. package/dist/relation-plan.d.ts.map +1 -1
  48. package/dist/render-cache.d.ts.map +1 -1
  49. package/dist/rls-context.d.ts +14 -0
  50. package/dist/rls-context.d.ts.map +1 -0
  51. package/dist/rls-readiness.d.ts +114 -0
  52. package/dist/rls-readiness.d.ts.map +1 -0
  53. package/dist/scoped.d.ts +104 -0
  54. package/dist/scoped.d.ts.map +1 -0
  55. package/dist/strict-args.d.ts +47 -0
  56. package/dist/strict-args.d.ts.map +1 -0
  57. package/dist/telemetry/collector.d.ts +53 -0
  58. package/dist/telemetry/collector.d.ts.map +1 -0
  59. package/dist/telemetry/config.d.ts +53 -0
  60. package/dist/telemetry/config.d.ts.map +1 -0
  61. package/dist/telemetry/fingerprint.d.ts +38 -0
  62. package/dist/telemetry/fingerprint.d.ts.map +1 -0
  63. package/dist/telemetry/index.d.ts +18 -0
  64. package/dist/telemetry/index.d.ts.map +1 -0
  65. package/dist/telemetry/recorder.d.ts +93 -0
  66. package/dist/telemetry/recorder.d.ts.map +1 -0
  67. package/dist/telemetry/statement.d.ts +53 -0
  68. package/dist/telemetry/statement.d.ts.map +1 -0
  69. package/dist/telemetry/types.d.ts +265 -0
  70. package/dist/telemetry/types.d.ts.map +1 -0
  71. package/dist/validators.d.ts +61 -0
  72. package/dist/validators.d.ts.map +1 -0
  73. package/dist/views.d.ts.map +1 -1
  74. package/dist/write-scope.d.ts +14 -0
  75. package/dist/write-scope.d.ts.map +1 -0
  76. package/package.json +6 -4
package/dist/index.js.map CHANGED
@@ -1,20 +1,43 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/adapter.ts", "../src/model-meta.ts", "../src/codecs.ts", "../src/query-builder.ts", "../src/relation-plan.ts", "../src/relation-loader.ts", "../src/nested-writes.ts", "../src/extensions.ts", "../src/views.ts", "../src/client.ts", "../src/render-cache.ts"],
3
+ "sources": ["../src/adapter.ts", "../src/db-now.ts", "../src/model-meta.ts", "../src/codecs.ts", "../src/query-builder.ts", "../src/bulk-upsert.ts", "../src/keyset.ts", "../src/relation-plan.ts", "../src/diagnostics/preview.ts", "../src/relation-key.ts", "../src/write-scope.ts", "../src/nested-writes.ts", "../src/telemetry/fingerprint.ts", "../src/diagnostics/plan.ts", "../src/diagnostics/workload.ts", "../src/diagnostics/insight.ts", "../src/relation-loader.ts", "../src/computed.ts", "../src/extensions.ts", "../src/views.ts", "../src/validators.ts", "../src/policy-operation.ts", "../src/policy.ts", "../src/scoped.ts", "../src/rls-readiness.ts", "../src/client.ts", "../src/render-cache.ts", "../src/strict-args.ts", "../src/rls-context.ts", "../src/telemetry/recorder.ts", "../src/telemetry/config.ts", "../src/telemetry/statement.ts", "../src/keyset-iterator.ts", "../src/telemetry/collector.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Database adapter contract for VibeORM v2. FROZEN INTERFACE — the runtime is\n * driver-agnostic and talks to databases exclusively through this type;\n * adapter packages (adapter-bun, adapter-pg, adapter-pglite, adapter-sqlite,\n * adapter-mysql) implement it.\n *\n * ERROR CONTRACT: adapters never let raw driver errors escape. Every failure\n * is mapped to a VibeError with a stable code via a per-driver table\n * (unique violation → VIBE_UNIQUE_VIOLATION, FK violation → VIBE_FK_VIOLATION,\n * serialization/deadlock → VIBE_TRANSACTION, connection/other → VIBE_ADAPTER),\n * with the driver error attached as `cause`.\n */\n\nimport type { Dialect, Provider } from \"@vibeorm/schema\";\nimport type { WireFidelity } from \"@vibeorm/sql\";\n\n// ─── Transaction options ──────────────────────────────────────────\n\n/** Transaction isolation levels (mapped per dialect by the adapter). */\nexport type IsolationLevel = \"ReadCommitted\" | \"RepeatableRead\" | \"Serializable\";\n\n/**\n * Options for `$transaction` / `adapter.transaction`.\n *\n * `timeout` is milliseconds, enforced database-side where the engine can\n * genuinely cancel a running statement (postgres servers via `SET LOCAL\n * statement_timeout`, mysql's SELECT-only `MAX_EXECUTION_TIME`). Dialect\n * honesty: an adapter whose engine CANNOT enforce it refuses loudly instead\n * of no-opping — sqlite adapters throw `VIBE_VALIDATION` (busy_timeout only\n * bounds lock acquisition), pglite throws `VIBE_UNSUPPORTED_CAPABILITY` (the\n * WASM build accepts statement_timeout but never fires it).\n *\n * Options are TOP-LEVEL only: a nested `transaction()` call (a savepoint)\n * refuses BOTH fields with `VIBE_VALIDATION` on every adapter — a savepoint\n * cannot change the isolation level of the transaction it joins, and a\n * nested timeout is not enforceable.\n */\nexport type TransactionOptions = {\n isolationLevel?: IsolationLevel;\n timeout?: number;\n};\n\n// ─── Results ──────────────────────────────────────────────────────\n\n/** Result of an unsafe/raw execution: rows plus affected-row count. */\nexport type QueryResult = {\n rows: Record<string, unknown>[];\n affectedRows: number;\n};\n\n// ─── The adapter ──────────────────────────────────────────────────\n\n/**\n * The primary interface every database adapter implements. Adapters own\n * connection management, statement caching, transactions (including nested →\n * savepoints), driver-specific parameter formatting and driver-error mapping.\n */\nexport type DatabaseAdapter = {\n /** SQL dialect this adapter's database speaks (selects the @vibeorm/sql dialect). */\n readonly dialect: Dialect;\n /** Concrete provider (pglite and postgresql both speak `postgres`). */\n readonly provider: Provider;\n\n /**\n * What this DRIVER actually delivers for non-list scalar columns on the\n * result path (board #30) — lets the runtime's decode plans skip decoders\n * that are provably no-ops for this driver (e.g. node-postgres already hands\n * `Date` for timestamptz and parsed values for jsonb). OPTIONAL and purely\n * an optimization contract: an adapter that declares nothing gets the full\n * idempotency-guarded decode path. Declare only what the driver verifiably\n * does; transactional adapters must carry the same declaration.\n */\n readonly wire?: WireFidelity;\n\n /**\n * Execute a parameterized query on the ORM hot path and return rows.\n * The adapter owns prepared-statement caching and ORM-path parameter\n * serialization (e.g. tagged scalar-list params vs JSON values).\n */\n execute(params: { text: string; values: unknown[] }): Promise<Record<string, unknown>[]>;\n\n /**\n * Execute a raw query (`$queryRaw*`, `$executeRaw*`, DDL). No statement\n * caching; raw-path parameter serialization (arrays pass through to the\n * driver where it supports them — see LEARNINGS: raw vs ORM paths differ).\n *\n * OMITTING `values` changes semantics on the sqlite adapters (board #31):\n * `adapter-sqlite` and `adapter-better-sqlite3` route no-`values` text\n * through the driver's multi-statement script mode (`db.run`/`exec` — the\n * shape @vibeorm/migrate emits for DDL/PRAGMA batches), which CANNOT return\n * rows: a parameterless SELECT yields `rows: []` there, while pg/pglite/\n * mysql/bun return its result set either way. Callers that want rows from a\n * single parameterless statement must pass `values: []` — the client's\n * `$queryRawUnsafe` always does. Rule of thumb: `values` present (even\n * empty) = one prepared statement with rows; `values` absent = script mode,\n * rows not guaranteed.\n */\n executeUnsafe(params: { text: string; values?: unknown[] }): Promise<QueryResult>;\n\n /**\n * Run `fn` inside a transaction; the callback receives a transactional\n * adapter with this same interface. Nested calls create savepoints. Throwing\n * rolls back (the savepoint or the whole transaction) and rethrows.\n *\n * `options` is honored on TOP-LEVEL calls only. A NESTED call refuses any\n * `isolationLevel` or `timeout` with `VIBE_VALIDATION` (`meta.nested:\n * true`), identically on every adapter: a savepoint cannot change the\n * isolation level of the transaction it joins, and a nested timeout is not\n * enforceable. Silently dropping the option was the pre-#3 behaviour of the\n * pg/pglite/mysql/bun adapters and is forbidden by constitution rule 4.\n */\n transaction<T>(fn: (txAdapter: DatabaseAdapter) => Promise<T>, options?: TransactionOptions): Promise<T>;\n\n /** Eagerly open/verify connectivity (pool warm-up or first connection). */\n connect(): Promise<void>;\n\n /** Gracefully close all connections. */\n disconnect(): Promise<void>;\n\n /**\n * Convert a JS array into the driver's preferred representation for a\n * scalar-array parameter (postgres `= ANY($n)`): PG array literal string for\n * drivers that send strings, the raw array for drivers with native support.\n */\n formatArrayParam(values: unknown[]): unknown;\n};\n\n// ─── Migration-compatible executor ────────────────────────────────\n\n/** Minimal SQL execution interface used by @vibeorm/migrate. */\nexport type SqlExecutor = (params: {\n text: string;\n values?: unknown[];\n}) => Promise<Record<string, unknown>[]>;\n\n/** Bridge a DatabaseAdapter to the migrate package's SqlExecutor shape. */\nexport function toSqlExecutor(params: { adapter: DatabaseAdapter }): SqlExecutor {\n const { adapter } = params;\n return async (queryParams) => {\n const result = await adapter.executeUnsafe({\n text: queryParams.text,\n values: queryParams.values,\n });\n return result.rows;\n };\n}\n",
6
- "/**\n * Runtime model metadata: the pre-resolved view of the Schema IR the query\n * builder and client run on.\n *\n * Built once per client (`buildRuntimeMeta`), then read-only. Everything the\n * hot path needs is precomputed here — column names, field lookup maps, primary\n * keys — so no query ever walks the IR. Relations are carried verbatim: the P2\n * core slice does not load them, P3 does.\n *\n * Also the home of app-side default generation (uuid/cuid/nanoid/ulid/now),\n * which is dialect-free by design: the id exists before the INSERT, which is\n * what lets dialects without RETURNING re-select the row they just wrote.\n */\n\nimport { VibeError, isEnumType } from \"@vibeorm/schema\";\nimport type { DefaultValueIR, FieldIR, FieldType, ModelIR, RelationIR, ScalarType, SchemaIR } from \"@vibeorm/schema\";\nimport type { SqlExpr } from \"@vibeorm/sql\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** Where a field's default value is produced. */\nexport type DefaultOrigin = \"app\" | \"database\" | \"none\";\n\n/** A scalar or enum column, resolved for the runtime. */\nexport type FieldMeta = {\n /** Client-facing field name. */\n readonly name: string;\n /** Database column name (`dbName ?? name`). */\n readonly columnName: string;\n readonly type: FieldType;\n /** The scalar type, or `null` when the field is an enum reference. */\n readonly scalarType: ScalarType | null;\n /** The enum name, or `null` when the field is a scalar. */\n readonly enumName: string | null;\n readonly isList: boolean;\n readonly isOptional: boolean;\n readonly isId: boolean;\n readonly isUnique: boolean;\n readonly isUpdatedAt: boolean;\n readonly default: DefaultValueIR | null;\n /**\n * `\"app\"` — the runtime generates the value and sends it (uuid/cuid/nanoid/\n * ulid/now). `\"database\"` — the column's DEFAULT clause applies and the field\n * is omitted from INSERTs (autoincrement, dbgenerated, literal, enum value).\n */\n readonly defaultOrigin: DefaultOrigin;\n};\n\n/** A model, resolved for the runtime. */\nexport type ModelMeta = {\n /** IR model name, e.g. `\"User\"`. */\n readonly name: string;\n /** Delegate key on the client, e.g. `\"user\"`. */\n readonly clientName: string;\n /** Table name (`dbName ?? name`). */\n readonly tableName: string;\n readonly fields: readonly FieldMeta[];\n readonly fieldByName: ReadonlyMap<string, FieldMeta>;\n /** Reverse map for row materialization (driver rows are keyed by column). */\n readonly fieldByColumn: ReadonlyMap<string, FieldMeta>;\n /** Primary-key fields: the single `@id` field, or the `@@id` fields in order. */\n readonly primaryKey: readonly FieldMeta[];\n /** Fields that identify a row on their own (`@id` or `@unique`). */\n readonly uniqueFields: readonly FieldMeta[];\n /**\n * COMPOSITE ways to address one row, keyed exactly like the generated\n * `…WhereUniqueInput` property — member field names joined with `_`\n * (`projectId_userId`). The composite `@@id` comes first, then every\n * multi-field `@@unique`, in schema order. Empty for models without one.\n */\n readonly compoundUniques: ReadonlyMap<string, readonly FieldMeta[]>;\n /** Carried verbatim from the IR — consumed by relation loading in P3. */\n readonly relations: readonly RelationIR[];\n readonly relationByName: ReadonlyMap<string, RelationIR>;\n readonly isView: boolean;\n};\n\n/**\n * A pre-bound extension where-operator: compiles one use (`{ similarTo: … }`)\n * into a SqlExpr fragment. Built by `buildExtensionOperatorMap` in\n * extensions.ts with dialect/provider/options already curried in.\n */\nexport type ExtensionOperatorFn = (params: {\n /** Identifier path of the column (qualified when inside a subquery). */\n readonly column: readonly string[];\n readonly operand: unknown;\n readonly model: string;\n readonly field: string;\n}) => SqlExpr;\n\n/** All runtime metadata for one schema. */\nexport type RuntimeMeta = {\n readonly models: readonly ModelMeta[];\n /** Keyed by BOTH camelCase client name (`user`) and model name (`User`). */\n readonly modelByName: ReadonlyMap<string, ModelMeta>;\n /** Enum name → its values, for validation and codec decisions. */\n readonly enums: ReadonlyMap<string, readonly string[]>;\n /**\n * Extension where-operators (extension sql plane), keyed by operator name.\n * Rides on the meta so the WHERE compiler reaches it at every site without\n * threading a parameter through the hot path.\n */\n readonly extensionOperators?: ReadonlyMap<string, ExtensionOperatorFn>;\n};\n\n// ─── Naming ───────────────────────────────────────────────────────\n\n/**\n * Delegate key for a model name: the first character lowercased, nothing else\n * (the Prisma convention — `User` → `user`, `URLMap` → `uRLMap`). Keeping the\n * rest untouched makes the mapping unambiguous and reversible.\n */\nexport function toClientName(params: { name: string }): string {\n const { name } = params;\n if (name.length === 0) return name;\n return name.charAt(0).toLowerCase() + name.slice(1);\n}\n\n// ─── Id generators (dialect-free, no dependencies) ────────────────\n\nconst BASE36_ALPHABET: string = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n/** Largest multiple of 36 below 256 — bytes at or above it are rejected, not folded. */\nconst BASE36_LIMIT: number = 252;\n\nfunction randomBase36(params: { length: number }): string {\n const { length } = params;\n let out = \"\";\n while (out.length < length) {\n const bytes = new Uint8Array(length - out.length + 8);\n crypto.getRandomValues(bytes);\n for (const byte of bytes) {\n if (byte >= BASE36_LIMIT) continue;\n out += BASE36_ALPHABET[byte % 36];\n if (out.length === length) break;\n }\n }\n return out;\n}\n\n/** RFC 4122 v4 UUID. */\nexport function generateUuid(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Collision-resistant, sortable-ish id in the CUID spirit: `\"c\"` + a base-36\n * millisecond timestamp + 16 random base-36 characters. Starts with a letter so\n * it is safe as an HTML id and in every database identifier context.\n */\nexport function generateCuid(): string {\n return `c${Date.now().toString(36)}${randomBase36({ length: 16 })}`;\n}\n\nconst NANOID_ALPHABET: string = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nconst NANOID_LENGTH: number = 21;\n\n/** 21-character NanoID over the standard URL-safe alphabet (64 chars, unbiased 6-bit mask). */\nexport function generateNanoid(): string {\n const bytes = new Uint8Array(NANOID_LENGTH);\n crypto.getRandomValues(bytes);\n let out = \"\";\n for (const byte of bytes) {\n out += NANOID_ALPHABET[byte & 63];\n }\n return out;\n}\n\nconst ULID_ALPHABET: string = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\n/**\n * ULID: 10 characters of millisecond timestamp + 16 of randomness, Crockford\n * base32, lexicographically sortable by creation time. 256 % 32 === 0, so the\n * byte-to-symbol fold is unbiased.\n */\nexport function generateUlid(): string {\n let remaining = Date.now();\n let time = \"\";\n for (let i = 0; i < 10; i++) {\n time = ULID_ALPHABET[remaining % 32] + time;\n remaining = Math.floor(remaining / 32);\n }\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n let random = \"\";\n for (const byte of bytes) {\n random += ULID_ALPHABET[byte % 32];\n }\n return time + random;\n}\n\n/**\n * The value the runtime sends for an app-side default, or `undefined` when the\n * database owns it (autoincrement, dbgenerated, literal, enum value — those\n * ride the column's DEFAULT clause so the database stays the single source of\n * truth for them).\n */\nexport function generateDefaultValue(params: { spec: DefaultValueIR }): unknown {\n const { spec } = params;\n switch (spec.kind) {\n case \"uuid\":\n return generateUuid();\n case \"cuid\":\n return generateCuid();\n case \"nanoid\":\n return generateNanoid();\n case \"ulid\":\n return generateUlid();\n case \"now\":\n return new Date();\n case \"autoincrement\":\n case \"dbgenerated\":\n case \"literal\":\n case \"enumValue\":\n return undefined;\n }\n}\n\nfunction defaultOriginOf(params: { spec: DefaultValueIR | undefined }): DefaultOrigin {\n const { spec } = params;\n if (spec === undefined) return \"none\";\n switch (spec.kind) {\n case \"uuid\":\n case \"cuid\":\n case \"nanoid\":\n case \"ulid\":\n case \"now\":\n return \"app\";\n default:\n return \"database\";\n }\n}\n\n// ─── Building ─────────────────────────────────────────────────────\n\nfunction buildFieldMeta(params: { field: FieldIR }): FieldMeta {\n const { field } = params;\n const enumRef = isEnumType(field.type);\n return {\n name: field.name,\n columnName: field.dbName ?? field.name,\n type: field.type,\n scalarType: enumRef ? null : (field.type as ScalarType),\n enumName: enumRef ? (field.type as { readonly enum: string }).enum : null,\n isList: field.isList,\n isOptional: field.isOptional,\n isId: field.isId,\n isUnique: field.isUnique,\n isUpdatedAt: field.isUpdatedAt,\n default: field.default ?? null,\n defaultOrigin: defaultOriginOf({ spec: field.default }),\n };\n}\n\nfunction buildModelMeta(params: { model: ModelIR }): ModelMeta {\n const { model } = params;\n // `Unsupported(\"...\")` columns stay in the IR for schema fidelity (convert,\n // migrate DDL) but are excluded from the queryable surface entirely: never\n // projected, never writable — using one in a query reports \"unknown field\"\n // (VIBE_VALIDATION). Reviewed as ruling F3.\n const fields = model.fields\n .filter((field) => field.isUnsupported !== true)\n .map((field) => buildFieldMeta({ field }));\n const fieldByName = new Map(fields.map((field) => [field.name, field]));\n const fieldByColumn = new Map(fields.map((field) => [field.columnName, field]));\n\n const primaryKey: FieldMeta[] = [];\n if (model.primaryKey !== undefined) {\n for (const name of model.primaryKey.fields) {\n const field = fieldByName.get(name);\n if (field === undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `model \"${model.name}\" declares composite primary-key field \"${name}\", which does not exist`,\n meta: { model: model.name, field: name },\n });\n }\n primaryKey.push(field);\n }\n } else {\n primaryKey.push(...fields.filter((field) => field.isId));\n }\n\n // Compound keys mirror the generator's `buildUniques` rule exactly, so the\n // runtime accepts every member the generated WhereUniqueInput offers.\n const compoundUniques = new Map<string, readonly FieldMeta[]>();\n const addCompound = (names: readonly string[]): void => {\n if (names.length < 2) return;\n const key = names.join(\"_\");\n if (compoundUniques.has(key)) return;\n const resolved: FieldMeta[] = [];\n for (const name of names) {\n const field = fieldByName.get(name);\n // An Unsupported() column inside the key makes it unaddressable.\n if (field === undefined) return;\n resolved.push(field);\n }\n compoundUniques.set(key, resolved);\n };\n if (primaryKey.length > 1) addCompound(primaryKey.map((field) => field.name));\n for (const index of model.indexes) {\n if (index.kind === \"unique\") addCompound(index.fields.map((entry) => entry.name));\n }\n\n return {\n name: model.name,\n clientName: toClientName({ name: model.name }),\n tableName: model.dbName ?? model.name,\n fields,\n fieldByName,\n fieldByColumn,\n primaryKey,\n uniqueFields: fields.filter((field) => field.isId || field.isUnique),\n compoundUniques,\n relations: model.relations,\n relationByName: new Map(model.relations.map((relation) => [relation.name, relation])),\n isView: model.isView,\n };\n}\n\n/** Resolve a whole schema into the runtime's read-only metadata. */\nexport function buildRuntimeMeta(params: { schema: SchemaIR }): RuntimeMeta {\n const { schema } = params;\n const models = schema.models.map((model) => buildModelMeta({ model }));\n\n const modelByName = new Map<string, ModelMeta>();\n for (const model of models) {\n modelByName.set(model.name, model);\n modelByName.set(model.clientName, model);\n }\n\n return {\n models,\n modelByName,\n enums: new Map(schema.enums.map((declared) => [declared.name, declared.values])),\n };\n}\n\n// ─── Lookups ──────────────────────────────────────────────────────\n\n/** Look a model up by client name or model name; unknown names are a caller error. */\nexport function getModelMeta(params: { meta: RuntimeMeta; model: string }): ModelMeta {\n const { meta, model } = params;\n const found = meta.modelByName.get(model);\n if (found === undefined) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown model \"${model}\"`,\n meta: { model, known: [...new Set(meta.models.map((entry) => entry.name))] },\n });\n }\n return found;\n}\n\n/** Look a field up on a model; unknown names are a caller error naming the field. */\nexport function getFieldMeta(params: { model: ModelMeta; field: string; context: string }): FieldMeta {\n const { model, field, context } = params;\n const found = model.fieldByName.get(field);\n if (found === undefined) {\n if (model.relationByName.has(field)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${field}\" on model \"${model.name}\" is a relation — not valid in ${context} here (relation writes use nested-write verbs, relation reads use select/include)`,\n meta: { model: model.name, field, context },\n });\n }\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown field \"${field}\" on model \"${model.name}\" in ${context}`,\n meta: { model: model.name, field, context },\n });\n }\n return found;\n}\n",
7
- "/**\n * The codec entry points — constitution rule 6.\n *\n * The PURE per-dialect tables (dialect × scalar type) live in @vibeorm/sql\n * (`codecs.ts` there) and are re-exported here so consumers keep one import\n * site. This module owns the FieldMeta-aware entry points: list handling,\n * enum-to-String routing and row materialization.\n *\n * The two rules that make it work:\n * - EVERY parameter bound by the query builder passes through `encodeValue`.\n * - EVERY row materialized by the client passes through `decodeRow`/\n * `decodeRows` — including every relation-loaded child row, at every\n * materialization point (the v1 lesson: BigInt-as-string and enum-array\n * bugs came from children skipping coercion).\n */\n\nimport { VibeError, isEnumType } from \"@vibeorm/schema\";\nimport type { Dialect, FieldType } from \"@vibeorm/schema\";\nimport { DIALECT_CODECS, decodeIsNoop } from \"@vibeorm/sql\";\nimport type { ScalarCodec, WireFidelity } from \"@vibeorm/sql\";\nimport type { FieldMeta, ModelMeta } from \"./model-meta.ts\";\n\n// ─── Pure tables (defined in @vibeorm/sql, re-exported) ───────────\n\nexport {\n DIALECT_CODECS,\n MYSQL_CODECS,\n POSTGRES_CODECS,\n SQLITE_CODECS,\n decodeIsNoop,\n} from \"@vibeorm/sql\";\nexport type { CodecTable, ScalarCodec, WireFidelity } from \"@vibeorm/sql\";\n\n// ─── Entry points ─────────────────────────────────────────────────\n\n/** The codec for a field type on a dialect. Enum references use the String codec. */\nexport function getCodec(params: { dialect: Dialect; type: FieldType }): ScalarCodec {\n const { dialect, type } = params;\n const table = DIALECT_CODECS[dialect];\n return isEnumType(type) ? table.String : table[type];\n}\n\n// ─── postgres enum arrays (the LEARNINGS enum-array lesson) ───────\n\n/**\n * Enum ARRAY columns are the one place no postgres driver can help: none of\n * them knows a user-defined enum's array type OID. A JS array therefore reaches\n * the server as `A,B` (`array_in` rejects it: \"malformed array literal\") and the\n * column comes back as the raw literal `{A,B}` instead of an array. Both\n * directions go through the literal, here in the codec table — the only place\n * coercion may live (rule 6). Built-in scalar arrays (`text[]`, `int4[]`, …) have\n * well-known OIDs and are left to the driver.\n */\nfunction isPostgresEnumList(params: { dialect: Dialect; field: FieldMeta }): boolean {\n const { dialect, field } = params;\n return dialect === \"postgres\" && field.isList && field.enumName !== null;\n}\n\n/** Elements that must be double-quoted inside a postgres array literal. */\nconst PG_ARRAY_QUOTE: RegExp = /^$|^NULL$|[{},\"\\\\\\s]/i;\n\n/** Render encoded elements as a postgres array literal (`{A,\"B,C\",NULL}`). */\nfunction toPgArrayLiteral(values: readonly unknown[]): string {\n const parts = values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n const text = String(value);\n return PG_ARRAY_QUOTE.test(text) ? `\"${text.replace(/[\"\\\\]/g, (char) => `\\\\${char}`)}\"` : text;\n });\n return `{${parts.join(\",\")}}`;\n}\n\n/**\n * Parse a postgres array literal into its elements, or `null` when the text is\n * not a literal (defensive — the value then passes through untouched).\n * Unquoted `NULL` is SQL NULL; postgres quotes any element that could be\n * mistaken for it.\n */\nfunction parsePgArrayLiteral(literal: string): (string | null)[] | null {\n if (literal.length < 2 || !literal.startsWith(\"{\") || !literal.endsWith(\"}\")) return null;\n const inner = literal.slice(1, -1);\n if (inner.length === 0) return [];\n const out: (string | null)[] = [];\n let index = 0;\n while (index < inner.length) {\n if (inner[index] === '\"') {\n let text = \"\";\n index++;\n while (index < inner.length) {\n const char = inner[index] as string;\n if (char === \"\\\\\") {\n text += inner[index + 1] ?? \"\";\n index += 2;\n continue;\n }\n index++;\n if (char === '\"') break;\n text += char;\n }\n out.push(text);\n } else {\n let text = \"\";\n while (index < inner.length && inner[index] !== \",\") {\n text += inner[index];\n index++;\n }\n out.push(text === \"NULL\" ? null : text);\n }\n if (inner[index] === \",\") index++;\n }\n return out;\n}\n\n/**\n * Encode one value for parameter binding. `null`/`undefined` pass through\n * untouched (SQL NULL). List fields encode element-wise; the adapter's\n * `formatArrayParam` then owns the array's wire representation — except for\n * postgres ENUM arrays, which become an array literal here (no driver can\n * serialize them, see {@link isPostgresEnumList}).\n */\nexport function encodeValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n const codec = getCodec({ dialect, type: field.type });\n if (field.isList && Array.isArray(value)) {\n const elements = value.map((element) =>\n element === null || element === undefined ? element : codec.encode(element),\n );\n return isPostgresEnumList({ dialect, field }) ? toPgArrayLiteral(elements) : elements;\n }\n return codec.encode(value);\n}\n\n/**\n * Decode one driver value. List fields decode element-wise.\n *\n * postgres returns ENUM arrays as a raw array literal string, because no driver\n * knows a user-defined enum's array OID (LEARNINGS.md) — that literal is parsed\n * here, next to the other coercion rules.\n */\nexport function decodeValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n const codec = getCodec({ dialect, type: field.type });\n if (typeof value === \"string\" && isPostgresEnumList({ dialect, field })) {\n const parsed = parsePgArrayLiteral(value);\n if (parsed !== null) return parsed;\n }\n if (field.isList && Array.isArray(value)) {\n return value.map((element) => (element === null || element === undefined ? element : codec.decode(element)));\n }\n return codec.decode(value);\n}\n\n// ─── Filter transport (SQL review B4/M5) ───────────────────\n\n/** Decimal literal: optional sign, digits with optional fraction, optional exponent. */\nconst DECIMAL_LITERAL: RegExp = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A Decimal operand as a REAL-comparable number — sqlite's compare form.\n * SQLITE-3 (review round 2): `Number()` accepts \"\" (→ 0), whitespace and hex\n * (\"0x10\" → 16) — silent constants on sqlite where postgres raises 22P02.\n * Only canonical decimal literals pass (surrounding whitespace tolerated —\n * postgres numeric input trims it too); everything else is VIBE_VALIDATION.\n */\nfunction toRealNumber(params: { field: FieldMeta; value: unknown }): number {\n const { field, value } = params;\n const refuse = (): never => {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${String(value)}\" is not a numeric value for the Decimal field \"${field.name}\"`,\n meta: { field: field.name, value },\n });\n };\n if (typeof value === \"number\") return Number.isFinite(value) ? value : refuse();\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed !== \"\" && DECIMAL_LITERAL.test(trimmed)) {\n const parsed = Number(trimmed);\n if (Number.isFinite(parsed)) return parsed;\n }\n return refuse();\n }\n return refuse();\n}\n\n/**\n * Encode one COMPARISON operand (WHERE / cursor bounds). Identical to\n * {@link encodeValue} everywhere except sqlite Decimal (SQL review B4):\n * Decimal STORES as exact TEXT there, but text comparison is lexicographic —\n * so every compare site casts the column (`CAST(col AS REAL)`) and binds the\n * operand as a NUMBER. Comparison precision is float64-bounded on sqlite\n * (docs/dialects.md); storage and read-back stay exact.\n */\nexport function encodeFilterValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n if (dialect === \"sqlite\" && field.scalarType === \"Decimal\" && !field.isList) {\n return toRealNumber({ field, value });\n }\n return encodeValue({ dialect, field, value });\n}\n\n/**\n * Encode one AGGREGATE-predicate operand (HAVING). On sqlite an aggregate\n * expression has NO column affinity, so a TEXT operand never converts and the\n * predicate is constant-false (SQL review M5, live-proven) — operands bind in\n * raw numeric form there: Decimal as a number (the aggregate is over\n * `CAST(col AS REAL)`), BigInt as a bigint (bun:sqlite binds int64 natively).\n * Other dialects keep the field codec's wire form.\n */\nexport function encodeAggregateOperand(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n if (dialect === \"sqlite\") {\n if (field.scalarType === \"Decimal\") return toRealNumber({ field, value });\n if (field.scalarType === \"BigInt\") {\n if (typeof value === \"bigint\" || typeof value === \"number\") return value;\n return BigInt(String(value));\n }\n return encodeValue({ dialect, field, value });\n }\n return encodeValue({ dialect, field, value });\n}\n\n// ─── Decode plans (per model × dialect, precomputed) ──────────────\n\n/** Decode one non-null driver value (list handling prebound). */\ntype RowDecoder = (value: unknown) => unknown;\n\ntype DecodePlanEntry = {\n readonly name: string;\n /** `null` = the codec is a no-op for this dialect — copy verbatim. */\n readonly decode: RowDecoder | null;\n};\n\ntype DecodePlan = {\n readonly byColumn: ReadonlyMap<string, DecodePlanEntry>;\n /**\n * Non-null when NO column is renamed (columnName === name for every field):\n * rows can then be decoded by touching only these columns, in place.\n */\n readonly inPlace: readonly { readonly column: string; readonly decode: RowDecoder }[] | null;\n};\n\n/** The shared `identity` fn (one reference across all passthrough codecs). */\nconst IDENTITY_DECODE: RowDecoder = DIALECT_CODECS.postgres.String.decode;\nconst IDENTITY_ENCODE: (value: unknown) => unknown = DIALECT_CODECS.postgres.String.encode;\n\n/**\n * The prebound encoder for one field on one dialect, or `null` when its codec\n * encode is the identity. Mirrors `encodeValue` exactly (see `fieldDecoder`).\n */\nexport function fieldEncoder(params: { dialect: Dialect; field: FieldMeta }): RowDecoder | null {\n const { dialect, field } = params;\n const encode = getCodec({ dialect, type: field.type }).encode;\n // postgres enum arrays go OUT as a PG array literal — never the identity,\n // even though the element codec (String) is one. Mirrors `encodeValue`\n // exactly, the way `fieldDecoder` mirrors `decodeValue` on the way in —\n // rule 6: the two entry points must never disagree about a wire form.\n if (isPostgresEnumList({ dialect, field })) {\n return (value) => encodeValue({ dialect, field, value });\n }\n if (encode === IDENTITY_ENCODE) return null;\n if (field.isList) {\n return (value) =>\n Array.isArray(value)\n ? value.map((element) => (element === null || element === undefined ? element : encode(element)))\n : encode(value);\n }\n return encode;\n}\n\n/**\n * Per-model plan cache, keyed by dialect × wire fidelity ({@link wirePlanKey})\n * — one process can hold clients over different adapters of the same dialect\n * with different declarations (e.g. adapter-pg and adapter-bun).\n */\nconst decodePlanCache = new WeakMap<ModelMeta, Map<string, DecodePlan>>();\n\n/** Canonical cache-key fragment for a wire declaration (adapter constants only — tiny domain). */\nfunction wirePlanKey(wire: WireFidelity | undefined): string {\n if (wire === undefined) return \"-\";\n return `${wire.dateTime ?? \"?\"}|${wire.json ?? \"?\"}|${wire.numbers ?? \"?\"}`;\n}\n\n/**\n * The prebound decoder for one field on one dialect, or `null` when its codec\n * decode is the identity (nothing to do). Mirrors `decodeValue` exactly:\n * elements of a list decode element-wise (null elements pass), a non-array\n * value on a list field goes through the element decoder as-is.\n *\n * With a `wire` declaration (board #30 — the ADAPTER's promise about what its\n * driver delivers), decoders that are provably no-ops for that wire are pruned\n * too ({@link decodeIsNoop}): non-list DateTime/Json/Int/Float columns on\n * drivers that already deliver native forms. Without a declaration the full\n * idempotency-guarded decoder set applies — exactly the pre-#30 behaviour.\n */\nexport function fieldDecoder(params: { dialect: Dialect; field: FieldMeta; wire?: WireFidelity }): RowDecoder | null {\n const { dialect, field, wire } = params;\n const decode = getCodec({ dialect, type: field.type }).decode;\n // postgres enum arrays arrive as a literal string — never the identity.\n if (isPostgresEnumList({ dialect, field })) {\n return (value) => decodeValue({ dialect, field, value });\n }\n if (decode === IDENTITY_DECODE) return null;\n if (field.isList) {\n return (value) =>\n Array.isArray(value)\n ? value.map((element) => (element === null || element === undefined ? element : decode(element)))\n : decode(value);\n }\n if (field.scalarType !== null && decodeIsNoop({ scalarType: field.scalarType, wire })) return null;\n return decode;\n}\n\nfunction buildDecodePlan(params: { dialect: Dialect; model: ModelMeta; wire: WireFidelity | undefined }): DecodePlan {\n const { dialect, model, wire } = params;\n const byColumn = new Map<string, DecodePlanEntry>();\n const inPlace: { column: string; decode: RowDecoder }[] = [];\n let renamed = false;\n for (const field of model.fields) {\n const decode = fieldDecoder({ dialect, field, ...(wire === undefined ? {} : { wire }) });\n byColumn.set(field.columnName, { name: field.name, decode });\n if (field.columnName !== field.name) renamed = true;\n if (decode !== null) inPlace.push({ column: field.columnName, decode });\n }\n return { byColumn, inPlace: renamed ? null : inPlace };\n}\n\nfunction getDecodePlan(params: { dialect: Dialect; model: ModelMeta; wire: WireFidelity | undefined }): DecodePlan {\n const { dialect, model } = params;\n // VIEWS are exempt from pruning: a view field's declared type says nothing\n // about the EXPRESSION behind it (`postCount Int` over mysql `COUNT(*)` is\n // BIGINT on the wire and arrives as a string; uncast pg aggregates arrive\n // as int8/numeric text). The wire declaration is a promise about base-table\n // STORAGE columns only — views keep the full idempotency-guarded decode.\n const wire = model.isView ? undefined : params.wire;\n let perModel = decodePlanCache.get(model);\n if (perModel === undefined) {\n perModel = new Map();\n decodePlanCache.set(model, perModel);\n }\n const key = `${dialect}|${wirePlanKey(wire)}`;\n let plan = perModel.get(key);\n if (plan === undefined) {\n plan = buildDecodePlan({ dialect, model, wire });\n perModel.set(key, plan);\n }\n return plan;\n}\n\nfunction decodeRowWithPlan(plan: DecodePlan, row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const column of Object.keys(row)) {\n const value = row[column];\n const entry = plan.byColumn.get(column);\n if (entry === undefined) {\n out[column] = value;\n continue;\n }\n out[entry.name] = value === null || value === undefined || entry.decode === null ? value : entry.decode(value);\n }\n return out;\n}\n\n/**\n * Materialize one driver row: column names become field names, values pass\n * through their codecs. Columns the model does not know (aggregate aliases, raw\n * extras) are carried over verbatim.\n */\nexport function decodeRow(params: {\n dialect: Dialect;\n model: ModelMeta;\n row: Record<string, unknown>;\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown> {\n const { dialect, model, row, wire } = params;\n return decodeRowWithPlan(getDecodePlan({ dialect, model, wire }), row);\n}\n\n/** `decodeRow` over a result set. */\nexport function decodeRows(params: {\n dialect: Dialect;\n model: ModelMeta;\n rows: readonly Record<string, unknown>[];\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown>[] {\n const { dialect, model, rows, wire } = params;\n const plan = getDecodePlan({ dialect, model, wire });\n return rows.map((row) => decodeRowWithPlan(plan, row));\n}\n\n/**\n * `decodeRows` for rows the caller OWNS (fresh driver output): when no column\n * is renamed the rows are decoded in place — only columns whose codec does\n * something are touched — and the same array returns. With renames it falls\n * back to rebuilding rows. Every decoder is idempotent (each checks its input\n * type), so re-materializing an already-decoded row is harmless.\n *\n * Internal to the runtime (client + relation loader) — the exported\n * `decodeRow`/`decodeRows` keep their copy semantics.\n */\nexport function materializeRows(params: {\n dialect: Dialect;\n model: ModelMeta;\n rows: Record<string, unknown>[];\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown>[] {\n const { dialect, model, rows, wire } = params;\n const plan = getDecodePlan({ dialect, model, wire });\n if (plan.inPlace === null) {\n for (let index = 0; index < rows.length; index++) {\n rows[index] = decodeRowWithPlan(plan, rows[index] as Record<string, unknown>);\n }\n return rows;\n }\n const decoders = plan.inPlace;\n if (decoders.length === 0) return rows;\n for (const row of rows) {\n for (const entry of decoders) {\n const value = row[entry.column];\n if (value !== null && value !== undefined) row[entry.column] = entry.decode(value);\n }\n }\n return rows;\n}\n\n// ─── JSON transport (postgres lateral joins, SQL review B3) ─────\n\n/**\n * Base64 → bytes: the lateral subselect ships Bytes as `encode(…,'base64')`\n * (raw `to_jsonb` would give `\\x` hex text — a wire form the Bytes codec\n * never sees on the query path).\n */\nconst decodeBase64Bytes: RowDecoder = (value) =>\n typeof value === \"string\" ? new Uint8Array(Buffer.from(value, \"base64\")) : value;\n\nconst jsonDecodePlanCache = new WeakMap<ModelMeta, DecodePlan>();\n\n/**\n * The decode plan for rows that crossed the wire as JSON (pg lateral joins):\n * BigInt/Decimal arrive as strings (the subselect's `::text` cast — their\n * regular codecs already accept that form), Bytes as base64, and Json values\n * arrive ALREADY PARSED — running the Json codec would double-parse a JSON\n * string value into garbage, so it is identity here.\n */\nfunction getJsonDecodePlan(model: ModelMeta): DecodePlan {\n let plan = jsonDecodePlanCache.get(model);\n if (plan !== undefined) return plan;\n const byColumn = new Map<string, DecodePlanEntry>();\n const inPlace: { column: string; decode: RowDecoder }[] = [];\n let renamed = false;\n for (const field of model.fields) {\n const decode =\n field.scalarType === \"Json\"\n ? null\n : field.scalarType === \"Bytes\" && !field.isList\n ? decodeBase64Bytes\n : fieldDecoder({ dialect: \"postgres\", field });\n byColumn.set(field.columnName, { name: field.name, decode });\n if (field.columnName !== field.name) renamed = true;\n if (decode !== null) inPlace.push({ column: field.columnName, decode });\n }\n plan = { byColumn, inPlace: renamed ? null : inPlace };\n jsonDecodePlanCache.set(model, plan);\n return plan;\n}\n\n/**\n * `materializeRows` for JSON-transport rows — the join strategy's child rows\n * after `JSON.parse`. Postgres-only by construction (lateral joins are).\n */\nexport function materializeJsonRows(params: {\n model: ModelMeta;\n rows: Record<string, unknown>[];\n}): Record<string, unknown>[] {\n const { model, rows } = params;\n const plan = getJsonDecodePlan(model);\n if (plan.inPlace === null) {\n for (let index = 0; index < rows.length; index++) {\n rows[index] = decodeRowWithPlan(plan, rows[index] as Record<string, unknown>);\n }\n return rows;\n }\n const decoders = plan.inPlace;\n if (decoders.length === 0) return rows;\n for (const row of rows) {\n for (const entry of decoders) {\n const value = row[entry.column];\n if (value !== null && value !== undefined) row[entry.column] = entry.decode(value);\n }\n }\n return rows;\n}\n\n// ─── Aggregate normalization ───────────────────────────────\n\n/**\n * Normalize one aggregate value — the contract, tested live on PGlite:\n *\n * | aggregate | field type | JS result |\n * |-----------|-----------------|-------------------------------|\n * | `_count` | any / `_all` | `number` (0 over an empty set)|\n * | `_avg` | Int/BigInt/Float| `number` (pg numeric → Number)|\n * | `_avg` | Decimal | `string` (no float rounding) |\n * | `_sum` | Int / Float | `number` |\n * | `_sum` | BigInt | `bigint` |\n * | `_sum` | Decimal | `string` |\n * | `_min/_max`| any | the field's own codec type |\n *\n * Every non-`_count` aggregate over an empty set is `null` (SQL semantics,\n * kept deliberately — 0 would be a lie for MIN/AVG).\n */\nexport function decodeAggregateValue(params: {\n dialect: Dialect;\n key: \"_count\" | \"_avg\" | \"_sum\" | \"_min\" | \"_max\";\n field: FieldMeta | null;\n value: unknown;\n}): unknown {\n const { dialect, key, field, value } = params;\n if (key === \"_count\") return Number(value ?? 0);\n if (value === null || value === undefined) return null;\n if (key === \"_avg\") {\n if (field !== null && field.scalarType === \"Decimal\") {\n return typeof value === \"number\" || typeof value === \"bigint\" ? String(value) : value;\n }\n return typeof value === \"string\" ? Number(value) : value;\n }\n // _sum/_min/_max carry the field's own type — its codec is the truth. One\n // transport exception (B4): sqlite aggregates Decimal over CAST(col AS REAL)\n // and returns a NUMBER — the Decimal contract is a string, so it converts\n // here (float64-bounded, like every sqlite Decimal comparison).\n if (field !== null && field.scalarType === \"Decimal\" && typeof value === \"number\") return String(value);\n return field === null ? value : decodeValue({ dialect, field, value });\n}\n",
8
- "/**\n * The query builder: `{ model, method, args }` → a SQL AST statement, purely.\n *\n * Nothing here touches a database, a clock-free input always produces the same\n * statement, and every branch is reachable from the query catalog\n * (`tests/query-catalog/`) — which pins the rendered SQL for all three dialects\n * and exports it to the reviewable root `sql-catalog.md`.\n *\n * Division of labour:\n * - shapes and SQL text live in @vibeorm/sql (this file never writes SQL),\n * - value transport lives in codecs.ts (this file never coerces),\n * - dialect gaps become VIBE_UNSUPPORTED_CAPABILITY here, at build time,\n * which is the earliest knowable moment for a query-level feature,\n * - bad input becomes VIBE_VALIDATION naming the model, field and operator.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { RelationIR, ScalarType } from \"@vibeorm/schema\";\nimport {\n SQL_DEFAULT_CELL,\n containsPattern,\n endsWithPattern,\n escapeLikePattern,\n jsonParamCell,\n startsWithPattern,\n} from \"@vibeorm/sql\";\nimport type {\n AggRef,\n AggSelect,\n ColRef,\n JsonFilterOp,\n LateralJoin,\n OrderByColumn,\n OrderBySubquery,\n OrderTerm,\n SelectStatement,\n SetOperator,\n SqlDialect,\n SqlExpr,\n SqlStatement,\n} from \"@vibeorm/sql\";\nimport { encodeAggregateOperand, encodeFilterValue, encodeValue, fieldEncoder } from \"./codecs.ts\";\nimport { getFieldMeta, getModelMeta, generateDefaultValue } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { requiredParentFields, resolveRelationLink, resolveRelationSelection } from \"./relation-plan.ts\";\nimport type { RelationLink, RelationSelection, RelationTreeNode } from \"./relation-plan.ts\";\n\n// ─── Public shapes ────────────────────────────────────────────────\n\n/** Every ORM method the query builder builds SQL for. */\nexport type QueryMethod =\n | \"findMany\"\n | \"findFirst\"\n | \"findUnique\"\n | \"create\"\n | \"createMany\"\n | \"createManyAndReturn\"\n | \"update\"\n | \"updateMany\"\n | \"upsert\"\n | \"delete\"\n | \"deleteMany\"\n | \"count\"\n | \"aggregate\"\n | \"groupBy\";\n\n/** Client-level options that shape SQL (subset of ClientOptions the builder needs). */\nexport type BuilderClientOptions = {\n /** Append the primary key to ORDER BY when no explicit orderBy was given (default false). */\n readonly defaultOrderByPk?: boolean;\n /** Append the primary key as a `distinct` tie-breaker for determinism (default true). */\n readonly distinctOrderByPk?: boolean;\n};\n\n// ─── Aggregate result contract ─────────────────────────────\n\n/** The five aggregate selector keys, in the deterministic order they project. */\nexport type AggregateKey = \"_count\" | \"_avg\" | \"_sum\" | \"_min\" | \"_max\";\n\n/**\n * One projected aggregate. `field: null` is `_all` (COUNT(*)). The alias is the\n * deterministic `<key>__<selector>` scheme (`_count___all`, `_avg__score`) —\n * results are read back by construction from these aliases, never parsed.\n */\nexport type AggregateSelection = {\n readonly key: AggregateKey;\n readonly field: string | null;\n readonly alias: string;\n};\n\n/** Everything the client needs to decode an aggregate/groupBy/count-select row. */\nexport type AggregateSpec = {\n readonly selections: readonly AggregateSelection[];\n /** `_count: true` — the result's `_count` is a bare number, not an object. */\n readonly countShorthand: boolean;\n};\n\n/** How included relations are fetched. */\nexport type RelationStrategy = \"query\" | \"join\";\n\n/**\n * A built query plus everything the client needs after execution. The plan is\n * data only: the client decides how to run it.\n */\nexport type QueryPlan = {\n readonly method: QueryMethod;\n readonly model: ModelMeta;\n readonly statement: SqlStatement;\n /**\n * Field names the statement projects, in order, or `null` when it projects\n * every scalar field. Mutations RETURNING extra primary-key columns are\n * narrowed back down to this list by the client.\n */\n readonly selectedFields: readonly string[] | null;\n /**\n * What the CALLER should see: the user's scalar select plus relation names\n * and `_count`, or `null` for \"all scalars (plus attached relations)\".\n * Differs from `selectedFields` when stitching keys were added to the SQL\n * projection — the client narrows back down to this after relation loading.\n */\n readonly resultFields: readonly string[] | null;\n /** Relations to load after the base rows, or `null` when none were asked for. */\n readonly relations: RelationSelection | null;\n /**\n * How relations load. With `\"join\"` on a find method the base statement IS\n * the lateral statement (level-1 relations ride along as JSON columns);\n * deeper levels always fall back to `\"query\"` batches (v1 semantics).\n */\n readonly relationStrategy: RelationStrategy;\n /** True when `take` produced a LIMIT. */\n readonly takeApplied: boolean;\n /** Alias the COUNT(*) value is projected under (`count` only). */\n readonly countAlias: string | null;\n /**\n * Unique WHERE identifying the affected row, for the re-select a dialect\n * without RETURNING needs. `null` when the row cannot be identified before\n * the write (an autoincrement key the database assigns).\n */\n readonly refetchWhere: Readonly<Record<string, unknown>> | null;\n /**\n * Upsert only: the unique where WITHOUT the update-arm overlay. The INSERT\n * arm's row answers this key (its create row binds the conflict target — the\n * B1 native-eligibility gate), so the mysql read-back tries the overlaid\n * `refetchWhere` first, then this. `null` on every other method.\n */\n readonly refetchWhereBase: Readonly<Record<string, unknown>> | null;\n /**\n * createMany/createManyAndReturn only: when the call compiles to MORE than\n * one statement (sqlite's heterogeneous column-set groups — M4 — or the M7\n * parameter-budget chunks), every statement in order (`statement` is the\n * first). The client executes them in ONE transaction, summing counts /\n * concatenating returned rows. Absent for single-statement calls.\n */\n readonly batch?: readonly SqlStatement[];\n /** The caller's `select`, replayed on that re-select. */\n readonly selectArg: Readonly<Record<string, unknown>> | null;\n /** How to decode aggregate/groupBy/count-select rows; `null` elsewhere. */\n readonly aggregateSpec: AggregateSpec | null;\n /** groupBy's `by` field names, for row assembly; `null` elsewhere. */\n readonly groupByFields: readonly string[] | null;\n /** Negative `take`: the SQL ordering was flipped; re-reverse rows after fetch. */\n readonly reverseRows: boolean;\n /**\n * `distinct` + an explicit user orderBy (N1, board #22): the arrangement\n * DISTINCT ON needs demotes the user's order behind the distinct fields, so\n * the client re-sorts the FINAL rows by these keys — Prisma's presentation\n * order, on every dialect. `nulls` is resolved at build time to the\n * dialect's own NULL placement so the re-sort mirrors what the SQL order\n * would have produced. `null` when no re-sort is needed.\n */\n readonly resortBy: readonly ResortKey[] | null;\n};\n\n/** One client-side re-sort key (see QueryPlan.resortBy). */\nexport type ResortKey = {\n readonly field: string;\n readonly direction: \"asc\" | \"desc\";\n readonly nulls: \"first\" | \"last\";\n /** B4 mirror: Decimal ranks numerically — the SQL side ordered a number. */\n readonly decimal: boolean;\n};\n\n// ─── Constants ────────────────────────────────────────────────────\n\n/** Column alias for COUNT(*) — postgres and sqlite/mysql name it differently otherwise. */\nexport const COUNT_ALIAS: string = \"_count\";\n\nconst NUMERIC_TYPES: readonly ScalarType[] = [\"Int\", \"BigInt\", \"Float\", \"Decimal\"];\n\nconst ATOMIC_OPERATIONS: Readonly<Record<string, SetOperator>> = {\n increment: \"increment\",\n decrement: \"decrement\",\n multiply: \"multiply\",\n divide: \"divide\",\n};\n\n/** Per-method argument allowlist — anything else is loud, never ignored. */\nconst ALLOWED_ARGS: Readonly<Record<QueryMethod, readonly string[]>> = {\n findMany: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"distinct\", \"select\", \"include\", \"omit\", \"relationStrategy\"],\n findFirst: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"distinct\", \"select\", \"include\", \"omit\", \"relationStrategy\"],\n findUnique: [\"where\", \"select\", \"include\", \"omit\", \"relationStrategy\"],\n create: [\"data\", \"select\", \"include\", \"omit\"],\n createMany: [\"data\", \"skipDuplicates\"],\n createManyAndReturn: [\"data\", \"skipDuplicates\", \"select\", \"include\", \"omit\"],\n update: [\"where\", \"data\", \"select\", \"include\", \"omit\"],\n updateMany: [\"where\", \"data\"],\n upsert: [\"where\", \"create\", \"update\", \"select\", \"include\", \"omit\"],\n delete: [\"where\", \"select\", \"include\", \"omit\"],\n deleteMany: [\"where\"],\n count: [\"where\", \"select\", \"take\", \"skip\", \"orderBy\"],\n aggregate: [\"where\", \"orderBy\", \"take\", \"skip\", \"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"],\n groupBy: [\"by\", \"where\", \"having\", \"orderBy\", \"take\", \"skip\", \"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"],\n};\n\nconst AGGREGATE_KEYS: readonly AggregateKey[] = [\"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"];\n\nconst AGG_FN_BY_KEY: Readonly<Record<AggregateKey, \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\">> = {\n _count: \"count\",\n _avg: \"avg\",\n _sum: \"sum\",\n _min: \"min\",\n _max: \"max\",\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n// ─── Small helpers ────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array)\n );\n}\n\n/** A value usable directly as an equality operand (no operator wrapper). */\nfunction isDirectValue(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n value instanceof Date ||\n value instanceof Uint8Array\n );\n}\n\n/** B4: does this field compare through `CAST(col AS REAL)` on this dialect? */\nfunction needsRealCast(dialect: SqlDialect, field: FieldMeta): boolean {\n return dialect.name === \"sqlite\" && field.scalarType === \"Decimal\" && !field.isList;\n}\n\n/**\n * Column reference for a COMPARE/ORDER/AGGREGATE site — sqlite Decimal columns\n * read as REAL there (SQL review B4); everything else is a plain reference.\n */\nfunction compareColumnRef(params: { dialect: SqlDialect; field: FieldMeta; table?: string }): ColRef {\n const { dialect, field, table } = params;\n const ref = columnRef({ field, ...(table === undefined ? {} : { table }) });\n return needsRealCast(dialect, field) ? { ...ref, castReal: true } : ref;\n}\n\nfunction columnRef(params: { field: FieldMeta; table?: string }): ColRef {\n const { field, table } = params;\n return table === undefined ? { name: field.columnName } : { table, name: field.columnName };\n}\n\nfunction requireObject(params: { value: unknown; what: string; model: ModelMeta }): Record<string, unknown> {\n const { value, what, model } = params;\n if (!isPlainObject(value)) {\n throw validationError({\n message: `${what} must be an object on model \"${model.name}\"`,\n meta: { model: model.name, argument: what },\n });\n }\n return value;\n}\n\nfunction toNonNegativeInteger(params: { value: unknown; what: string; model: ModelMeta }): number {\n const { value, what, model } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw validationError({\n message: `${what} must be an integer on model \"${model.name}\", got ${String(value)}`,\n meta: { model: model.name, argument: what, value },\n });\n }\n if (value < 0) {\n throw validationError({\n message: `negative ${what} is not supported here — only findMany's take may be negative (backwards pagination)`,\n meta: { model: model.name, argument: what, value },\n });\n }\n return value;\n}\n\nfunction assertArgs(params: { method: QueryMethod; args: Record<string, unknown>; model: ModelMeta }): void {\n const { method, args, model } = params;\n const allowed = ALLOWED_ARGS[method];\n for (const key of Object.keys(args)) {\n if (args[key] === undefined) continue;\n if (!allowed.includes(key)) {\n throw validationError({\n message: `unsupported argument \"${key}\" for ${model.clientName}.${method}() — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, method, argument: key, allowed },\n });\n }\n }\n}\n\n// ─── WHERE compilation ────────────────────────────────────────────\n\n/** Filtering a scalar list needs native array columns — postgres only. */\nfunction assertListFilterable(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n field: FieldMeta;\n operator: string;\n}): void {\n const { dialect, model, field, operator } = params;\n if (dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `scalar list filter \"${operator}\" on ${model.name}.${field.name}`,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\n/**\n * Writing a scalar-list value needs native array columns. Only postgres has\n * them, so elsewhere this is a schema that cannot exist — say so at build time\n * instead of binding a JS array the driver will mangle.\n */\nfunction assertListWritable(params: { dialect: SqlDialect; model: ModelMeta; field: FieldMeta }): void {\n const { dialect, model, field } = params;\n if (!field.isList || dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `writing the scalar list ${model.name}.${field.name}`,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\nfunction compileStringPattern(params: { operator: string; operand: unknown; field: FieldMeta; model: ModelMeta }): string {\n const { operator, operand, field, model } = params;\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n if (operator === \"contains\") return containsPattern({ raw: operand });\n if (operator === \"startsWith\") return startsWithPattern({ raw: operand });\n return endsWithPattern({ raw: operand });\n}\n\n/**\n * Shared state for one WHERE compilation: the dialect, the schema (relation\n * filters cross model boundaries) and a statement-scoped alias sequence so\n * every correlated subquery gets a unique alias (`__rf1`, `__jt2`, …) —\n * required for self-relations, harmless everywhere else.\n */\ntype WhereContext = {\n readonly dialect: SqlDialect;\n readonly meta: RuntimeMeta;\n readonly aliasSeq: { n: number };\n};\n\n/**\n * Scalar-list filters (postgres only): `has`, `hasEvery`, `hasSome`, `isEmpty`,\n * `equals`. v1 semantics ported exactly — notably `isEmpty: true` matches NULL\n * AND empty arrays (`array_length(col, 1) IS NULL` for both).\n */\nfunction compileListFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n const dialect = ctx.dialect;\n const column = columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n const conditions: SqlExpr[] = [];\n\n for (const [operator, operand] of Object.entries(filter)) {\n if (operand === undefined) continue;\n assertListFilterable({ dialect, model, field, operator });\n switch (operator) {\n case \"equals\": {\n if (operand === null) {\n conditions.push({ kind: \"isNull\", column });\n break;\n }\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"equals\" on the list ${model.name}.${field.name} expects an array or null`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({\n kind: \"cmp\",\n op: \"eq\",\n column,\n value: encodeValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n case \"has\": {\n conditions.push({\n kind: \"arrayHas\",\n column,\n value: encodeValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n case \"hasEvery\":\n case \"hasSome\": {\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects an array`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const values = encodeValue({ dialect: dialect.name, field, value: operand }) as readonly unknown[];\n conditions.push(\n operator === \"hasEvery\"\n ? { kind: \"arrayContainsAll\", column, values }\n : { kind: \"arrayOverlaps\", column, values },\n );\n break;\n }\n case \"isEmpty\": {\n if (typeof operand !== \"boolean\") {\n throw validationError({\n message: `\"isEmpty\" on ${model.name}.${field.name} expects a boolean`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({ kind: \"arrayIsEmpty\", column, empty: operand });\n break;\n }\n default:\n throw validationError({\n message: `unknown list filter \"${operator}\" on ${model.name}.${field.name} — lists take equals, has, hasEvery, hasSome, isEmpty`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n }\n\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nconst JSON_STRING_OPS: readonly JsonFilterOp[] = [\"string_contains\", \"string_starts_with\", \"string_ends_with\"];\nconst JSON_ARRAY_OPS: readonly JsonFilterOp[] = [\"array_contains\", \"array_starts_with\", \"array_ends_with\"];\n\n/**\n * Json-field filters (Prisma surface): `path` + `equals`/`not`/`string_*`/\n * `array_*`, with `mode: \"insensitive\"` on the string ops. Which ops a dialect\n * can express is declared on `SqlDialect.supportedJsonOps` — the gap throws\n * VIBE_UNSUPPORTED_CAPABILITY here, at build time (dialect honesty).\n */\nfunction compileJsonFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n const dialect = ctx.dialect;\n const column = columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n const rawPath = filter.path;\n if (rawPath !== undefined) {\n if (!Array.isArray(rawPath) || rawPath.some((seg) => typeof seg !== \"string\" && typeof seg !== \"number\")) {\n throw validationError({\n message: `\"path\" on ${model.name}.${field.name} must be an array of keys (strings) and indexes (numbers)`,\n meta: { model: model.name, field: field.name },\n });\n }\n }\n const path: readonly (string | number)[] = (rawPath as readonly (string | number)[] | undefined) ?? [];\n\n const mode = filter.mode;\n if (mode !== undefined && mode !== \"insensitive\" && mode !== \"default\") {\n throw validationError({\n message: `mode must be \"insensitive\" or \"default\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, mode },\n });\n }\n const insensitive = mode === \"insensitive\";\n\n const requireOp = (op: JsonFilterOp): void => {\n if (dialect.supportedJsonOps.includes(op)) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `json filter \"${op}\" on ${model.name}.${field.name}`,\n hint: `this dialect can express: ${dialect.supportedJsonOps.join(\", \")}`,\n });\n };\n\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(filter)) {\n if (operand === undefined || operator === \"path\" || operator === \"mode\") continue;\n\n if (operator === \"equals\" || operator === \"not\") {\n if (operand === null) {\n if (path.length > 0) {\n throw validationError({\n message: `\"${operator}: null\" with a path on ${model.name}.${field.name} is ambiguous (SQL NULL vs JSON null) — omit the path to test column NULL`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({ kind: \"isNull\", column, ...(operator === \"not\" ? { negate: true } : {}) });\n continue;\n }\n requireOp(\"equals\");\n conditions.push({\n kind: \"jsonFilter\",\n column,\n path,\n op: \"equals\",\n value: operand,\n ...(operator === \"not\" ? { negate: true } : {}),\n });\n continue;\n }\n\n if ((JSON_STRING_OPS as readonly string[]).includes(operator)) {\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const op = operator as JsonFilterOp;\n requireOp(op);\n conditions.push({\n kind: \"jsonFilter\",\n column,\n path,\n op,\n value: operand,\n ...(insensitive ? { insensitive: true } : {}),\n });\n continue;\n }\n\n if ((JSON_ARRAY_OPS as readonly string[]).includes(operator)) {\n const op = operator as JsonFilterOp;\n requireOp(op);\n conditions.push({ kind: \"jsonFilter\", column, path, op, value: operand });\n continue;\n }\n\n throw validationError({\n message: `unknown json filter \"${operator}\" on ${model.name}.${field.name} — supported: path, mode, equals, not, ${[...JSON_STRING_OPS, ...JSON_ARRAY_OPS].join(\", \")}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n\n if (conditions.length === 0) {\n throw validationError({\n message: `json filter on ${model.name}.${field.name} needs at least one operator`,\n meta: { model: model.name, field: field.name },\n });\n }\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nfunction compileOperatorFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n if (field.isList) return compileListFieldFilter({ ctx, model, field, filter, qualify });\n if (field.scalarType === \"Json\") return compileJsonFieldFilter({ ctx, model, field, filter, qualify });\n const dialect = ctx.dialect;\n // B4: sqlite Decimal comparisons cast the TEXT column to REAL (and bind\n // NUMBER operands via encodeFilterValue) — text comparison is lexicographic.\n const column = compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n const entries = Object.entries(filter).filter(([, operand]) => operand !== undefined);\n const stringOperators = [\"contains\", \"startsWith\", \"endsWith\"];\n\n // `mode` modifies string matching (and #10: string equality). Combining it\n // with anything else would silently leave that operator at engine-default\n // sensitivity, so it is rejected instead. `\"strict\"` (board #20) is the\n // honest case-SENSITIVE direction — a no-op on postgres, GLOB on sqlite,\n // a BINARY cast on mysql `_ci` — compiled to its own AST node below.\n const modeCompanions = [...stringOperators, \"equals\"];\n const mode = filter.mode;\n if (mode !== undefined) {\n if (mode !== \"insensitive\" && mode !== \"strict\" && mode !== \"default\") {\n throw validationError({\n message: `mode must be \"insensitive\", \"strict\" or \"default\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, mode },\n });\n }\n const others = entries.filter(([operator]) => operator !== \"mode\");\n if (others.length === 0 || others.some(([operator]) => !modeCompanions.includes(operator))) {\n throw validationError({\n message: `mode is only supported with ${modeCompanions.join(\"/\")} on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name },\n });\n }\n }\n const insensitive = mode === \"insensitive\";\n const strict = mode === \"strict\";\n\n /** The raw string operand a `mode`-modified operator requires. */\n const requireStringOperand = (operator: string, operand: unknown): string => {\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `mode: \"${String(mode)}\" with ${operator} on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name },\n });\n }\n return operand;\n };\n\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of entries) {\n if (operator === \"mode\") continue;\n\n switch (operator) {\n case \"equals\": {\n if (operand === null) {\n // NULL tests never need the B4 cast — keep the plain reference.\n conditions.push({\n kind: \"isNull\",\n column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }),\n });\n break;\n }\n if (insensitive) {\n // #10 (v1/Prisma parity): insensitive equality rides the LIKE\n // machinery with a wildcard-FREE, escaped pattern — `ILIKE` on\n // postgres, `LOWER(col) LIKE LOWER(?)` elsewhere — so `%`/`_` in the\n // operand match literally. Non-string operands stay refused: case\n // has no meaning off text.\n conditions.push({\n kind: \"like\",\n column,\n pattern: escapeLikePattern({ raw: requireStringOperand(\"equals\", operand) }),\n insensitive: true,\n });\n break;\n }\n if (strict) {\n // #20: byte-exact equality — `= CAST(? AS BINARY)` on mysql `_ci`,\n // plain `=` on postgres/sqlite (already byte-exact there).\n conditions.push({\n kind: \"strictMatch\",\n column,\n op: \"equals\",\n value: requireStringOperand(\"equals\", operand),\n });\n break;\n }\n conditions.push({\n kind: \"cmp\",\n op: \"eq\",\n column,\n value: encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"not\": {\n if (operand === null) {\n conditions.push({\n kind: \"isNull\",\n column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }),\n negate: true,\n });\n break;\n }\n if (isPlainObject(operand)) {\n conditions.push({\n kind: \"not\",\n operand: compileOperatorFilter({ ctx, model, field, filter: operand, qualify }),\n });\n break;\n }\n conditions.push({\n kind: \"cmp\",\n op: \"ne\",\n column,\n value: encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"in\":\n case \"notIn\": {\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects an array`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({\n kind: \"inArray\",\n column,\n values: operand.map((item) => encodeFilterValue({ dialect: dialect.name, field, value: item })),\n negate: operator === \"notIn\",\n });\n break;\n }\n\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n conditions.push({\n kind: \"cmp\",\n op: operator,\n column,\n value: encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"contains\":\n case \"startsWith\":\n case \"endsWith\": {\n if (strict) {\n // #20: the RAW operand rides the AST — pattern building happens at\n // render time, where each strategy escapes its own metacharacters\n // (LIKE's %/_/\\ vs GLOB's */?/[).\n conditions.push({\n kind: \"strictMatch\",\n column,\n op: operator,\n value: requireStringOperand(operator, operand),\n });\n break;\n }\n conditions.push({\n kind: \"like\",\n column,\n pattern: compileStringPattern({ operator, operand, field, model }),\n insensitive,\n });\n break;\n }\n\n default: {\n // Extension where-operators (extensions.md §3 sql plane): compiled\n // through the owning extension into a bound fragment.\n const extensionOperator = ctx.meta.extensionOperators?.get(operator);\n if (extensionOperator !== undefined) {\n conditions.push(\n extensionOperator({\n column: qualify === undefined ? [field.columnName] : [qualify, field.columnName],\n operand,\n model: model.name,\n field: field.name,\n }),\n );\n break;\n }\n throw validationError({\n message: `unknown filter operator \"${operator}\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n }\n }\n\n // An empty filter object constrains nothing — the AST's neutral AND is `1 = 1`.\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nfunction compileFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n value: unknown;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, value, qualify } = params;\n const dialect = ctx.dialect;\n const column = compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n if (value === null) {\n return { kind: \"isNull\", column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }) };\n }\n\n if (isDirectValue(value)) {\n return { kind: \"cmp\", op: \"eq\", column, value: encodeFilterValue({ dialect: dialect.name, field, value }) };\n }\n\n if (Array.isArray(value)) {\n // A bare array is list equality — only meaningful on a list field.\n if (!field.isList) {\n throw validationError({\n message: `array filter value on ${model.name}.${field.name} — only list fields compare against arrays`,\n meta: { model: model.name, field: field.name },\n });\n }\n assertListFilterable({ dialect, model, field, operator: \"equals\" });\n return { kind: \"cmp\", op: \"eq\", column, value: encodeValue({ dialect: dialect.name, field, value }) };\n }\n\n if (isPlainObject(value)) {\n return compileOperatorFilter({ ctx, model, field, filter: value, qualify });\n }\n\n throw validationError({\n message: `unsupported filter value for ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name },\n });\n}\n\n// ─── Relation filters (some/every/none · is/isNot) ──────────────\n\n/** The neutral always-true expression (renders `1 = 1`). */\nconst NEUTRAL_TRUE: SqlExpr = { kind: \"and\", operands: [] };\n\n/**\n * Correlated EXISTS over a relation's target: child rows matching `predicate`\n * that belong to the outer row. `outer` is the outer scope's qualifier (table\n * name or enclosing subquery alias). Implicit M2M nests a second EXISTS\n * through the join table instead of adding JOINs to the AST.\n */\nfunction buildRelationExists(params: {\n ctx: WhereContext;\n link: RelationLink;\n outer: string;\n predicate: Record<string, unknown> | undefined;\n negatePredicate?: boolean;\n negate?: boolean;\n}): SqlExpr {\n const { ctx, link, outer, predicate, negatePredicate = false, negate = false } = params;\n const target = link.target;\n\n const childAlias = `__rf${++ctx.aliasSeq.n}`;\n let pred: SqlExpr =\n predicate === undefined\n ? NEUTRAL_TRUE\n : (compileWhereInternal({ ctx, model: target, where: predicate, qualify: childAlias }) ?? NEUTRAL_TRUE);\n if (negatePredicate) pred = { kind: \"not\", operand: pred };\n\n // #14: an empty predicate (`some: {}`) leaves the correlation as the only\n // real test — ANDing the neutral `1 = 1` in was pinned catalog noise.\n // Reference equality is exact: NEUTRAL_TRUE is only ever assigned above.\n const correlated = (correlation: SqlExpr): SqlExpr =>\n pred === NEUTRAL_TRUE ? correlation : { kind: \"and\", operands: [correlation, pred] };\n\n if (link.kind === \"manyToMany\") {\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const jtAlias = `__jt${++ctx.aliasSeq.n}`;\n const childExists: SqlExpr = {\n kind: \"exists\",\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: childAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: correlated({\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: childAlias, name: link.childKey.columnName },\n right: { table: jtAlias, name: join.childColumn },\n }),\n },\n };\n return {\n kind: \"exists\",\n ...(negate ? { negate: true } : {}),\n select: {\n kind: \"select\",\n table: { name: join.tableName, alias: jtAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: {\n kind: \"and\",\n operands: [\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.parentColumn },\n right: { table: outer, name: link.parentKey.columnName },\n },\n childExists,\n ],\n },\n },\n };\n }\n\n return {\n kind: \"exists\",\n ...(negate ? { negate: true } : {}),\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: childAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: correlated({\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: childAlias, name: link.childKey.columnName },\n right: { table: outer, name: link.parentKey.columnName },\n }),\n },\n };\n}\n\nfunction requirePredicateObject(params: {\n model: ModelMeta;\n relation: RelationIR;\n operator: string;\n operand: unknown;\n}): Record<string, unknown> {\n const { model, relation, operator, operand } = params;\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `\"${operator}\" on relation ${model.name}.${relation.name} expects a where object`,\n meta: { model: model.name, relation: relation.name, operator },\n });\n }\n return operand;\n}\n\n/**\n * A relation key inside `where`.\n *\n * To-many: `{ some | every | none: <child where> }` — correlated EXISTS;\n * `every X` compiles as `none NOT X` (NOT EXISTS a violating child).\n * To-one: `{ is | isNot: <child where> | null }`, or a bare where object\n * (shorthand for `is`), or `null` (shorthand for `is: null`). On the owning\n * side `is: null` / `isNot: null` become FK IS [NOT] NULL — no subquery.\n */\nfunction compileRelationFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n relation: RelationIR;\n value: unknown;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, relation, value, qualify } = params;\n const link = resolveRelationLink({ meta: ctx.meta, model, relation });\n const outer = qualify ?? model.tableName;\n\n if (relation.isList) {\n if (!isPlainObject(value)) {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must be { some | every | none: … }`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n switch (operator) {\n case \"some\":\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n }),\n );\n break;\n case \"none\":\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n negate: true,\n }),\n );\n break;\n case \"every\":\n // every X ⇔ no child violates X.\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n negatePredicate: true,\n negate: true,\n }),\n );\n break;\n default:\n throw validationError({\n message: `unknown relation filter \"${operator}\" on ${model.name}.${relation.name} — to-many relations take some/every/none`,\n meta: { model: model.name, relation: relation.name, operator },\n });\n }\n }\n if (conditions.length === 0) {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must contain some, every or none`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n }\n\n // To-one: normalize to { is } / { isNot } arms.\n let isArm: unknown;\n let hasIs = false;\n let isNotArm: unknown;\n let hasIsNot = false;\n if (value === null) {\n isArm = null;\n hasIs = true;\n } else if (isPlainObject(value) && (\"is\" in value || \"isNot\" in value)) {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) continue;\n if (key === \"is\") {\n isArm = value[key];\n hasIs = true;\n } else if (key === \"isNot\") {\n isNotArm = value[key];\n hasIsNot = true;\n } else {\n throw validationError({\n message: `relation filter on ${model.name}.${relation.name} cannot mix \"${key}\" with is/isNot`,\n meta: { model: model.name, relation: relation.name, operator: key },\n });\n }\n }\n } else if (isPlainObject(value)) {\n isArm = value;\n hasIs = true;\n } else {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must be a where object, { is | isNot: … } or null`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n\n const conditions: SqlExpr[] = [];\n const fkColumn: ColRef = columnRef({\n field: link.parentKey,\n ...(qualify === undefined ? {} : { table: qualify }),\n });\n\n if (hasIs) {\n if (isArm === null) {\n conditions.push(\n link.kind === \"toOneOwner\"\n ? { kind: \"isNull\", column: fkColumn }\n : buildRelationExists({ ctx, link, outer, predicate: undefined, negate: true }),\n );\n } else {\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator: \"is\", operand: isArm }),\n }),\n );\n }\n }\n if (hasIsNot) {\n if (isNotArm === null) {\n conditions.push(\n link.kind === \"toOneOwner\"\n ? { kind: \"isNull\", column: fkColumn, negate: true }\n : buildRelationExists({ ctx, link, outer, predicate: undefined }),\n );\n } else {\n // NOT EXISTS — rows with NO related row also match, like Prisma.\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator: \"isNot\", operand: isNotArm }),\n negate: true,\n }),\n );\n }\n }\n\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\n// ─── WHERE assembly ───────────────────────────────────────────\n\nfunction compileWhereGroup(params: {\n ctx: WhereContext;\n model: ModelMeta;\n value: unknown;\n key: string;\n qualify: string | undefined;\n}): SqlExpr[] {\n const { ctx, model, value, key, qualify } = params;\n const items = Array.isArray(value) ? value : [value];\n return items.map((item) => {\n const where = requireObject({ value: item, what: key, model });\n // An empty member constrains nothing: the neutral AND renders `1 = 1`.\n return compileWhereInternal({ ctx, model, where, qualify }) ?? NEUTRAL_TRUE;\n });\n}\n\nfunction compileWhereInternal(params: {\n ctx: WhereContext;\n model: ModelMeta;\n where: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr | undefined {\n const { ctx, model, where, qualify } = params;\n const operands: SqlExpr[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n\n if (key === \"AND\") {\n operands.push({ kind: \"and\", operands: compileWhereGroup({ ctx, model, value, key, qualify }) });\n continue;\n }\n if (key === \"OR\") {\n operands.push({ kind: \"or\", operands: compileWhereGroup({ ctx, model, value, key, qualify }) });\n continue;\n }\n if (key === \"NOT\") {\n // Prisma semantics: NOT: [A, B] negates each member — NOT(A) AND NOT(B).\n for (const member of compileWhereGroup({ ctx, model, value, key, qualify })) {\n operands.push({ kind: \"not\", operand: member });\n }\n continue;\n }\n\n const relation = model.relationByName.get(key);\n if (relation !== undefined) {\n operands.push(compileRelationFilter({ ctx, model, relation, value, qualify }));\n continue;\n }\n\n const field = getFieldMeta({ model, field: key, context: \"where\" });\n operands.push(compileFieldFilter({ ctx, model, field, value, qualify }));\n }\n\n if (operands.length === 0) return undefined;\n if (operands.length === 1) return operands[0] as SqlExpr;\n return { kind: \"and\", operands };\n}\n\n/**\n * Compile a Prisma-shaped where object; `undefined` when it constrains nothing.\n *\n * `qualify` table-qualifies every column reference (used inside lateral and\n * EXISTS subqueries); `aliasSeq` threads the statement-wide subquery-alias\n * counter so nested relation filters never collide.\n */\nexport function compileWhere(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n where: Record<string, unknown>;\n qualify?: string;\n aliasSeq?: { n: number };\n}): SqlExpr | undefined {\n const { dialect, meta, model, where, qualify, aliasSeq } = params;\n const ctx: WhereContext = { dialect, meta, aliasSeq: aliasSeq ?? { n: 0 } };\n return compileWhereInternal({ ctx, model, where, qualify });\n}\n\n// ─── ORDER BY ─────────────────────────────────────────────────────\n\nfunction compileOrderTerm(params: {\n model: ModelMeta;\n field: FieldMeta;\n spec: unknown;\n qualify?: string;\n dialect?: SqlDialect;\n}): OrderByColumn {\n const { model, field, spec, qualify, dialect } = params;\n // B4: ordering a sqlite Decimal by its TEXT storage would be lexicographic.\n const column =\n dialect !== undefined\n ? compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) })\n : columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n if (spec === \"asc\" || spec === \"desc\") return { column, direction: spec };\n\n if (isPlainObject(spec)) {\n const { sort, nulls } = spec;\n if (sort !== \"asc\" && sort !== \"desc\") {\n throw validationError({\n message: `orderBy sort must be \"asc\" or \"desc\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, sort },\n });\n }\n if (nulls !== undefined && nulls !== \"first\" && nulls !== \"last\") {\n throw validationError({\n message: `orderBy nulls must be \"first\" or \"last\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, nulls },\n });\n }\n return nulls === undefined ? { column, direction: sort } : { column, direction: sort, nulls };\n }\n\n throw validationError({\n message: `orderBy on ${model.name}.${field.name} must be \"asc\", \"desc\" or { sort, nulls }`,\n meta: { model: model.name, field: field.name },\n });\n}\n\n/** Compile `orderBy` (a single object or an array of them) into order terms. */\nexport function compileOrderBy(params: {\n model: ModelMeta;\n orderBy: unknown;\n qualify?: string;\n /** When given, B4's sqlite Decimal ordering cast applies (`CAST … AS REAL`). */\n dialect?: SqlDialect;\n}): OrderByColumn[] {\n const { model, orderBy, qualify, dialect } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: OrderByColumn[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n terms.push(\n compileOrderTerm({\n model,\n field,\n spec: value,\n ...(qualify === undefined ? {} : { qualify }),\n ...(dialect === undefined ? {} : { dialect }),\n }),\n );\n }\n }\n return terms;\n}\n\n// ─── Relation ORDER BY (board #1) ─────────────────────────\n\n/** An order term a find statement may carry: a column, or a correlated subquery. */\ntype FindOrderTerm = OrderByColumn | OrderBySubquery;\n\n/**\n * Compile one relation orderBy entry — `{ posts: { _count: \"desc\" } }` or\n * `{ author: { email: \"asc\" } }` — into correlated scalar subquery terms\n * (portable on every dialect; v1 used a correlated COUNT and a LEFT JOIN, v2\n * expresses both through ORDER BY subqueries so the AST stays join-free):\n * - `_count` on a LIST relation → `(SELECT COUNT(*) FROM child|joinTable\n * WHERE correlation)` — implicit M2M counts join-table rows;\n * - a scalar field on a TO-ONE relation → `(SELECT \"col\" FROM target WHERE\n * correlation)` — at most one row by construction, NULL when missing\n * (engine-native NULL placement; nulls options are refused, they would\n * render the subquery twice).\n */\nfunction compileRelationOrderTerms(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n spec: unknown;\n qualify: string | undefined;\n aliasSeq: { n: number };\n}): OrderBySubquery[] {\n const { dialect, meta, model, relation, spec, qualify, aliasSeq } = params;\n const entries = requireObject({ value: spec, what: `orderBy.${relation.name}`, model });\n const link = resolveRelationLink({ meta, model, relation });\n const outer = qualify ?? model.tableName;\n const isList = link.kind === \"toManyFk\" || link.kind === \"manyToMany\";\n const terms: OrderBySubquery[] = [];\n\n const requireDirection = (value: unknown, what: string): \"asc\" | \"desc\" => {\n if (value === \"asc\" || value === \"desc\") return value;\n throw validationError({\n message: `${what} on ${model.name}.${relation.name} must be \"asc\" or \"desc\" — nulls placement is not supported on relation orderBy`,\n meta: { model: model.name, relation: relation.name },\n });\n };\n\n for (const [key, value] of Object.entries(entries)) {\n if (value === undefined) continue;\n\n if (key === \"_count\") {\n if (!isList) {\n throw validationError({\n message: `orderBy.${relation.name}._count on model \"${model.name}\" needs a list relation — \"${relation.name}\" is to-one`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n const direction = requireDirection(value, `orderBy.${relation.name}._count`);\n const alias = `__ord${++aliasSeq.n}`;\n const select: SelectStatement =\n link.kind === \"manyToMany\"\n ? {\n kind: \"select\",\n table: { name: (link.join as NonNullable<RelationLink[\"join\"]>).tableName, alias },\n columns: [],\n selectExpr: { kind: \"countAll\" },\n where: {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: alias, name: (link.join as NonNullable<RelationLink[\"join\"]>).parentColumn },\n right: { table: outer, name: link.parentKey.columnName },\n },\n }\n : {\n kind: \"select\",\n table: { name: link.target.tableName, alias },\n columns: [],\n selectExpr: { kind: \"countAll\" },\n where: {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: alias, name: link.childKey.columnName },\n right: { table: outer, name: link.parentKey.columnName },\n },\n };\n terms.push({ select, direction });\n continue;\n }\n\n if (isList) {\n throw validationError({\n message: `orderBy.${relation.name}.${key} on model \"${model.name}\" — a to-many relation orders by _count only (a scalar across many rows is ambiguous)`,\n meta: { model: model.name, relation: relation.name, field: key },\n });\n }\n const field = getFieldMeta({ model: link.target, field: key, context: `orderBy.${relation.name}` });\n const direction = requireDirection(value, `orderBy.${relation.name}.${key}`);\n const alias = `__ord${++aliasSeq.n}`;\n terms.push({\n select: {\n kind: \"select\",\n table: { name: link.target.tableName, alias },\n // B4 rides along: a sqlite Decimal projects CAST(… AS REAL) here — the\n // subquery's value IS the comparison site.\n columns: [compareColumnRef({ dialect, field, table: alias })],\n where: {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: alias, name: link.childKey.columnName },\n right: { table: outer, name: link.parentKey.columnName },\n },\n },\n direction,\n });\n }\n return terms;\n}\n\n/**\n * `compileOrderBy` plus relation entries — the FIND pipeline's order compiler.\n * Scalar keys compile exactly as before; a key naming a relation compiles to\n * correlated subquery terms. Only find statements order by relations: child\n * statements, aggregates and groupBy keep the scalar-only compiler.\n */\nfunction compileFindOrderBy(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n orderBy: unknown;\n qualify: string | undefined;\n aliasSeq: { n: number };\n}): FindOrderTerm[] {\n const { dialect, meta, model, orderBy, qualify, aliasSeq } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: FindOrderTerm[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n const relation = model.relationByName.get(name);\n if (relation !== undefined) {\n terms.push(...compileRelationOrderTerms({ dialect, meta, model, relation, spec: value, qualify, aliasSeq }));\n continue;\n }\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n terms.push(\n compileOrderTerm({\n model,\n field,\n spec: value,\n ...(qualify === undefined ? {} : { qualify }),\n dialect,\n }),\n );\n }\n }\n return terms;\n}\n\n// ─── SELECT projection ────────────────────────────────────────────\n\n/**\n * Compile `select` into scalar field names, projecting EXACTLY what was asked\n * — the primary key is not smuggled in. Relation keys and `_count` are the\n * relation resolver's business (`relation-plan.ts`) and are skipped here;\n * `allowEmpty` permits a select of ONLY relations (the stitching key is added\n * separately and stripped from the result).\n */\nexport function compileSelect(params: { model: ModelMeta; select: unknown; allowEmpty?: boolean }): string[] {\n const { model, select, allowEmpty = false } = params;\n const spec = requireObject({ value: select, what: \"select\", model });\n const names: string[] = [];\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined || value === false) continue;\n if (name === \"_count\" || model.relationByName.has(name)) continue;\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n names.push(getFieldMeta({ model, field: name, context: \"select\" }).name);\n }\n if (names.length === 0 && !allowEmpty) {\n throw validationError({\n message: `select on model \"${model.name}\" must include at least one field`,\n meta: { model: model.name },\n });\n }\n return names;\n}\n\n/** Per-model full projection, precomputed — the §9 \"select skeleton\". Shared, never mutated. */\nconst fullProjectionCache = new WeakMap<ModelMeta, readonly ColRef[]>();\n\nfunction projectionColumns(params: {\n model: ModelMeta;\n selectedFields: readonly string[] | null;\n table?: string;\n}): readonly ColRef[] {\n const { model, selectedFields, table } = params;\n if (selectedFields === null && table === undefined) {\n let cached = fullProjectionCache.get(model);\n if (cached === undefined) {\n cached = model.fields.map((field) => columnRef({ field }));\n fullProjectionCache.set(model, cached);\n }\n return cached;\n }\n const ref = (field: FieldMeta): ColRef => columnRef({ field, ...(table === undefined ? {} : { table }) });\n if (selectedFields === null) return model.fields.map(ref);\n return selectedFields.map((name) => ref(model.fieldByName.get(name) as FieldMeta));\n}\n\n/**\n * RETURNING columns for a mutation: the primary key plus everything selected,\n * in model field order. The key rides along because it identifies the row for\n * post-write work (P3 relation loading); the client narrows the result back to\n * `selectedFields` so callers still see exactly what they asked for.\n */\n/** Per-model full RETURNING list, precomputed. Shared, never mutated. */\nconst fullReturningCache = new WeakMap<ModelMeta, readonly string[]>();\n\nfunction returningColumns(params: {\n model: ModelMeta;\n selectedFields: readonly string[] | null;\n}): readonly string[] {\n const { model, selectedFields } = params;\n if (selectedFields === null) {\n let cached = fullReturningCache.get(model);\n if (cached === undefined) {\n cached = model.fields.map((field) => field.columnName);\n fullReturningCache.set(model, cached);\n }\n return cached;\n }\n const wanted = new Set<string>([...model.primaryKey.map((field) => field.name), ...selectedFields]);\n return model.fields.filter((field) => wanted.has(field.name)).map((field) => field.columnName);\n}\n\n// ─── Unique WHERE ─────────────────────────────────────────────────\n\n/**\n * Expand the compound-key sugar the GENERATED `…WhereUniqueInput` emits:\n * `{ projectId_userId: { projectId, userId } }` becomes\n * `{ projectId: …, userId: … }`, so a composite `@@id`/`@@unique` compiles\n * exactly like the flat form. Models without a composite key (the common case)\n * return their where object untouched, allocation-free.\n */\nfunction expandCompoundWhere(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n /** Argument label for errors — `\"where\"` (default) or `\"cursor\"` (#4). */\n what?: string;\n}): Record<string, unknown> {\n const { model, where, what = \"where\" } = params;\n if (model.compoundUniques.size === 0) return where;\n let expanded: Record<string, unknown> | null = null;\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n const fields = model.compoundUniques.get(key);\n if (fields === undefined) continue;\n const spec = requireObject({ value, what: `${what}.${key}`, model });\n expanded ??= { ...where };\n delete expanded[key];\n for (const field of fields) {\n const member = spec[field.name];\n if (member === undefined) {\n throw validationError({\n message: `${what}.${key} on model \"${model.name}\" needs every member field (${fields\n .map((entry) => entry.name)\n .join(\", \")}) — \"${field.name}\" is missing`,\n meta: { model: model.name, key, field: field.name },\n });\n }\n expanded[field.name] = member;\n }\n }\n return expanded ?? where;\n}\n\n/**\n * A where that identifies at most one row: one `@id`/`@unique` field, or every\n * field of a composite `@@id`/`@@unique`, each carrying a direct value. Callers\n * run `expandCompoundWhere` first, so the compound sugar arrives flattened.\n */\nfunction assertUniqueWhere(params: { model: ModelMeta; where: Record<string, unknown>; method: QueryMethod }): void {\n const { model, where, method } = params;\n for (const field of model.uniqueFields) {\n if (isDirectValue(where[field.name])) return;\n }\n for (const fields of model.compoundUniques.values()) {\n if (fields.every((field) => isDirectValue(where[field.name]))) return;\n }\n const candidates = [...model.uniqueFields.map((field) => field.name), ...model.compoundUniques.keys()];\n throw validationError({\n message: `${model.clientName}.${method}() needs a unique where — one of: ${candidates.join(\", \")}`,\n meta: { model: model.name, method, candidates },\n });\n}\n\n/** The unique fields an upsert's where addresses — its conflict target. */\nfunction conflictTargetFields(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n}): readonly FieldMeta[] {\n const { model, where } = params;\n for (const field of model.uniqueFields) {\n if (isDirectValue(where[field.name])) return [field];\n }\n // A composite key addressed the row — conflict on exactly those columns\n // (the primary key is not always the one the where names).\n for (const fields of model.compoundUniques.values()) {\n if (fields.every((field) => isDirectValue(where[field.name]))) return fields;\n }\n return model.primaryKey;\n}\n\n/**\n * Loose scalar equality for the upsert-eligibility check: the question is\n * \"would the create row and the where address the SAME row\", so `1n`, `1` and\n * `\"1\"` count as equal (the database coerces them to one key) and Dates\n * compare by instant. Anything unclear compares unequal — the FALLBACK flow is\n * always semantically correct, so false negatives only cost a statement.\n */\nfunction sameDirectValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n const comparable = (value: unknown): boolean =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"bigint\";\n if (comparable(a) && comparable(b)) return String(a) === String(b);\n return false;\n}\n\n/**\n * Whether `upsert({ where, create, update })` can ride ONE native\n * `INSERT … ON CONFLICT`/`ON DUPLICATE KEY` statement — Prisma's own\n * criterion: the create data must bind every conflict-target column with the\n * SAME value the where names. Otherwise the conflict can never fire on the\n * addressed row (postgres/sqlite would silently insert instead of update;\n * mysql's ODKU could update an unrelated row — SQL review B1) and the client\n * must run the transactional find-then-write fallback instead.\n */\n/**\n * Whether `upsert({ where, create, update })` can ride ONE native\n * `INSERT … ON CONFLICT`/`ON DUPLICATE KEY` statement — Prisma's own\n * criterion, two halves:\n * 1. the create data binds every conflict-target column with the SAME value\n * the where names (otherwise the conflict can never fire on the\n * addressed row — postgres/sqlite would silently insert instead of\n * update; mysql's ODKU could update an unrelated row — SQL review B1);\n * 2. the where carries NO fields beyond the conflict target (PG-2): a guard\n * field (`where: { email, active: true }`) is invisible to ON CONFLICT —\n * the update arm would fire even when the guard fails, where update()\n * honors the same guard.\n * Ineligible shapes run the client's transactional find-then-write fallback,\n * whose probe honors the FULL where.\n */\nexport function upsertUsesNativeStatement(params: {\n model: ModelMeta;\n args: Record<string, unknown>;\n}): boolean {\n const { model, args } = params;\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method: \"upsert\" });\n const create = requireObject({ value: args.create, what: \"create\", model });\n const targets = conflictTargetFields({ model, where });\n const targetNames = new Set(targets.map((field) => field.name));\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n if (!targetNames.has(key)) return false; // PG-2: guard field → fallback\n }\n return targets.every(\n (field) => isDirectValue(create[field.name]) && sameDirectValue(create[field.name], where[field.name]),\n );\n}\n\n// ─── Data compilation ─────────────────────────────────\n\n/**\n * Per-model × dialect write plan (§9 precompute): each writable field with its\n * prebound codec encoder, plus the fields injected when absent (@updatedAt,\n * app-side defaults) so a create/update never scans the whole field list.\n */\ntype WriteFieldPlan = {\n readonly field: FieldMeta;\n /** `null` = the codec encode is a no-op for this dialect. */\n readonly encode: ((value: unknown) => unknown) | null;\n /** List field on a dialect without arrays — refuse via assertListWritable. */\n readonly listRefused: boolean;\n};\n\ntype ModelWritePlan = {\n readonly byKey: ReadonlyMap<string, WriteFieldPlan>;\n /** Fields injected when absent, in model field order. */\n readonly injected: readonly WriteFieldPlan[];\n};\n\nconst writePlanCache = new WeakMap<ModelMeta, Map<string, ModelWritePlan>>();\n\nfunction getWritePlan(params: { dialect: SqlDialect; model: ModelMeta }): ModelWritePlan {\n const { dialect, model } = params;\n let perDialect = writePlanCache.get(model);\n if (perDialect === undefined) {\n perDialect = new Map();\n writePlanCache.set(model, perDialect);\n }\n const hit = perDialect.get(dialect.name);\n if (hit !== undefined) return hit;\n\n const byKey = new Map<string, WriteFieldPlan>();\n const injected: WriteFieldPlan[] = [];\n for (const field of model.fields) {\n const entry: WriteFieldPlan = {\n field,\n encode: fieldEncoder({ dialect: dialect.name, field }),\n listRefused: field.isList && !dialect.capabilities.scalarArrays,\n };\n byKey.set(field.name, entry);\n if (field.isUpdatedAt || (field.defaultOrigin === \"app\" && field.default !== null)) {\n injected.push(entry);\n }\n }\n const plan: ModelWritePlan = { byKey, injected };\n perDialect.set(dialect.name, plan);\n return plan;\n}\n\n/** Plan-accelerated `encodeValue`: null/undefined pass, prebound codec otherwise. */\nfunction encodeWith(entry: WriteFieldPlan, value: unknown): unknown {\n if (value === null || value === undefined || entry.encode === null) return value;\n const encoded = entry.encode(value);\n // Non-list Json params ride a typed VALUES/SET cell: OID-typed drivers\n // (bun:sql) re-serialize a bare jsonb-slot param and DOUBLE-ENCODE the\n // pre-stringified document — the cell renders the dialect's param cast\n // (`$n::text::jsonb` on postgres, bare elsewhere) so the server parses the\n // text instead. See JsonParamCell in @vibeorm/sql. Lists ride the array\n // machinery (formatArrayParam) and never take the cell.\n if (entry.field.scalarType === \"Json\" && !entry.field.isList && typeof encoded === \"string\") {\n return jsonParamCell({ text: encoded });\n }\n return encoded;\n}\n\ntype CreateRow = {\n readonly values: Readonly<Record<string, unknown>>;\n /** Primary-key values known before the INSERT, when all of them are. */\n readonly knownKey: Record<string, unknown> | null;\n};\n\nfunction compileCreateRow(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n}): CreateRow {\n const { dialect, model, data } = params;\n const spec = requireObject({ value: data, what: \"data\", model });\n const plan = getWritePlan({ dialect, model });\n const values: Record<string, unknown> = {};\n const raw = new Map<string, unknown>();\n\n for (const name of Object.keys(spec)) {\n const value = spec[name];\n if (value === undefined) continue;\n const entry = plan.byKey.get(name);\n if (entry === undefined) {\n getFieldMeta({ model, field: name, context: \"data\" }); // throws the canonical error\n continue;\n }\n if (entry.listRefused) assertListWritable({ dialect, model, field: entry.field });\n raw.set(entry.field.name, value);\n values[entry.field.columnName] = encodeWith(entry, value);\n }\n\n for (const entry of plan.injected) {\n const field = entry.field;\n if (raw.has(field.name)) continue;\n // @updatedAt is stamped on create as well as update, matching Prisma.\n if (field.isUpdatedAt) {\n const now = new Date();\n raw.set(field.name, now);\n values[field.columnName] = encodeWith(entry, now);\n continue;\n }\n const generated = generateDefaultValue({ spec: field.default as NonNullable<FieldMeta[\"default\"]> });\n if (generated === undefined) continue;\n raw.set(field.name, generated);\n values[field.columnName] = encodeWith(entry, generated);\n }\n\n const knownKey: Record<string, unknown> = {};\n let keyComplete = model.primaryKey.length > 0;\n for (const field of model.primaryKey) {\n const value = raw.get(field.name);\n if (value === undefined) {\n keyComplete = false;\n break;\n }\n knownKey[field.name] = value;\n }\n\n return { values, knownKey: keyComplete ? knownKey : null };\n}\n\n/**\n * Column order for an INSERT: model field order, never the caller's key order,\n * so the same logical create always renders the same SQL text.\n */\nfunction orderedColumns(params: { model: ModelMeta; values: Readonly<Record<string, unknown>> }): string[] {\n const { model, values } = params;\n return model.fields.map((field) => field.columnName).filter((column) => column in values);\n}\n\nfunction compileAtomicOperation(params: {\n model: ModelMeta;\n field: FieldMeta;\n operator: SetOperator;\n operand: unknown;\n}): { readonly __op: SetOperator; readonly value: number } {\n const { model, field, operator, operand } = params;\n if (field.scalarType === null || !NUMERIC_TYPES.includes(field.scalarType)) {\n throw validationError({\n message: `\"${operator}\" needs a numeric field, but ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const numeric = typeof operand === \"bigint\" ? Number(operand) : operand;\n if (typeof numeric !== \"number\" || !Number.isFinite(numeric)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a number`,\n meta: { model: model.name, field: field.name, operator, operand },\n });\n }\n return { __op: operator, value: numeric };\n}\n\nfunction compileUpdateSet(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n}): Record<string, unknown> {\n const { dialect, model, data } = params;\n const spec = requireObject({ value: data, what: \"data\", model });\n const plan = getWritePlan({ dialect, model });\n const set: Record<string, unknown> = {};\n const touched = new Set<string>();\n\n for (const name of Object.keys(spec)) {\n const value = spec[name];\n if (value === undefined) continue;\n const entry = plan.byKey.get(name);\n if (entry === undefined) {\n getFieldMeta({ model, field: name, context: \"data\" }); // throws the canonical error\n continue;\n }\n const field = entry.field;\n if (entry.listRefused) assertListWritable({ dialect, model, field });\n touched.add(field.name);\n\n // Json values are opaque payloads — `{ set: … }` and `{ increment: … }`\n // wrappers are not interpreted inside them.\n if (isPlainObject(value) && field.scalarType !== \"Json\") {\n const entries = Object.entries(value).filter(([, operand]) => operand !== undefined);\n if (entries.length !== 1) {\n throw validationError({\n message: `update of ${model.name}.${field.name} must use exactly one operation`,\n meta: { model: model.name, field: field.name, operations: entries.map(([key]) => key) },\n });\n }\n const [operator, operand] = entries[0] as [string, unknown];\n if (operator === \"set\") {\n set[field.columnName] = encodeWith(entry, operand);\n continue;\n }\n if (operator === \"push\" && field.isList) {\n // assertListWritable above already refused dialects without arrays.\n // One element → array_append; an array → || concatenation.\n set[field.columnName] = Array.isArray(operand)\n ? { __listOp: \"concat\", value: encodeWith(entry, operand) }\n : { __listOp: \"append\", value: encodeWith(entry, operand) };\n continue;\n }\n const atomic = ATOMIC_OPERATIONS[operator];\n if (atomic === undefined) {\n throw validationError({\n message: `unknown update operation \"${operator}\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n set[field.columnName] = compileAtomicOperation({ model, field, operator: atomic, operand });\n continue;\n }\n\n set[field.columnName] = encodeWith(entry, value);\n }\n\n for (const entry of plan.injected) {\n if (!entry.field.isUpdatedAt || touched.has(entry.field.name)) continue;\n set[entry.field.columnName] = encodeWith(entry, new Date());\n }\n\n if (Object.keys(set).length === 0) {\n throw validationError({\n message: `update of model \"${model.name}\" must change at least one field`,\n meta: { model: model.name },\n });\n }\n return set;\n}\n\ntype CreateManyGroup = { readonly columns: string[]; readonly rows: unknown[][] };\n\n/**\n * createMany rows → one or more INSERT groups.\n *\n * Homogeneous rows stay ONE statement. Heterogeneous rows (M4, SQL review):\n * a missing cell means \"let the COLUMN default apply\" — binding NULL there\n * either violated NOT NULL or silently wrote NULL over a DB default. On\n * dialects with the per-row DEFAULT keyword (postgres/mysql) the union of\n * columns stays one statement with `SQL_DEFAULT_CELL` sentinels; sqlite has\n * no row DEFAULT, so rows group by their column set into separate statements\n * (first-appearance order) that the client runs in ONE transaction.\n *\n * Every group is then re-chunked to the dialect's parameter budget (M7):\n * sqlite hard-errors past ~32k bound params and mysql caps at 65535 —\n * unbounded VALUES lists are never emitted.\n */\nfunction compileCreateRows(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n}): CreateManyGroup[] {\n const { dialect, model, data } = params;\n const items = Array.isArray(data) ? data : [data];\n if (items.length === 0) {\n throw validationError({\n message: `createMany on model \"${model.name}\" needs at least one row`,\n meta: { model: model.name },\n });\n }\n const compiled = items.map((item) => compileCreateRow({ dialect, model, data: item }).values);\n\n // Column order is model field order — deterministic whatever order the\n // caller wrote the keys in.\n const present = new Set<string>();\n for (const row of compiled) {\n for (const column of Object.keys(row)) present.add(column);\n }\n const unionColumns = model.fields.map((field) => field.columnName).filter((column) => present.has(column));\n const homogeneous = compiled.every((row) => unionColumns.every((column) => column in row));\n\n let groups: CreateManyGroup[];\n if (homogeneous) {\n groups = [{ columns: unionColumns, rows: compiled.map((row) => unionColumns.map((column) => row[column])) }];\n } else if (dialect.rowDefaultKeyword) {\n groups = [\n {\n columns: unionColumns,\n rows: compiled.map((row) => unionColumns.map((column) => (column in row ? row[column] : SQL_DEFAULT_CELL))),\n },\n ];\n } else {\n const bySignature = new Map<string, CreateManyGroup>();\n for (const row of compiled) {\n const columns = unionColumns.filter((column) => column in row);\n const signature = columns.join(\"\\u0000\");\n let group = bySignature.get(signature);\n if (group === undefined) {\n group = { columns, rows: [] };\n bySignature.set(signature, group);\n }\n group.rows.push(columns.map((column) => row[column]));\n }\n groups = [...bySignature.values()];\n }\n\n // M7: parameter-budget chunking (DEFAULT cells bind nothing, but counting\n // them keeps the arithmetic simple and errs conservative).\n const chunked: CreateManyGroup[] = [];\n for (const group of groups) {\n const columnCount = Math.max(1, group.columns.length);\n const rowsPerChunk = Math.max(1, Math.floor(dialect.paramBudget / columnCount));\n for (let start = 0; start < group.rows.length; start += rowsPerChunk) {\n chunked.push({ columns: group.columns, rows: group.rows.slice(start, start + rowsPerChunk) });\n }\n }\n return chunked;\n}\n\n// ─── Statement assembly ───────────────────────────────────────────\n\n// ─── Find pipeline (order · cursor · distinct · pagination) ───────\n\n/**\n * `take` on the find methods — negative values are backwards pagination on\n * findMany and \"the last row\" on findFirst (#13), so both accept them.\n */\nfunction compileTake(params: { value: unknown; model: ModelMeta }): number {\n const { value, model } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw validationError({\n message: `take must be an integer on model \"${model.name}\", got ${String(value)}`,\n meta: { model: model.name, argument: \"take\", value },\n });\n }\n return value;\n}\n\ntype ParsedCursor = {\n readonly fields: readonly FieldMeta[];\n readonly values: readonly unknown[];\n};\n\n/**\n * `cursor: { uniqueField: value }` — the position to paginate FROM,\n * EXCLUSIVELY: the cursor row itself is not returned (v1 semantics, documented\n * in FROM_PRISMA.md as a deliberate deviation from Prisma's inclusive cursor;\n * carry that note into the v2 migration guide). A single-field cursor must be\n * `@id`/`@unique`; a multi-field cursor must be exactly the composite primary\n * key or a composite `@@unique` group — the generated WhereUniqueInput's\n * compound sugar (`cursor: { userId_planId: {…} }`) expands first (#4).\n */\nfunction parseCursor(params: { model: ModelMeta; cursor: unknown }): ParsedCursor {\n const { model } = params;\n const spec = expandCompoundWhere({\n model,\n where: requireObject({ value: params.cursor, what: \"cursor\", model }),\n what: \"cursor\",\n });\n const entries = Object.entries(spec).filter(([, value]) => value !== undefined);\n if (entries.length === 0) {\n throw validationError({\n message: `cursor on model \"${model.name}\" needs a unique field value`,\n meta: { model: model.name },\n });\n }\n const fields: FieldMeta[] = [];\n const values: unknown[] = [];\n for (const [name, value] of entries) {\n const field = getFieldMeta({ model, field: name, context: \"cursor\" });\n if (!isDirectValue(value)) {\n throw validationError({\n message: `cursor.${name} on model \"${model.name}\" must be a direct value`,\n meta: { model: model.name, field: name },\n });\n }\n fields.push(field);\n values.push(value);\n }\n if (fields.length === 1) {\n const field = fields[0] as FieldMeta;\n if (!field.isId && !field.isUnique) {\n throw validationError({\n message: `cursor field ${model.name}.${field.name} must be @id or @unique — a non-unique cursor cannot identify a position`,\n meta: { model: model.name, field: field.name },\n });\n }\n } else {\n const names = new Set(fields.map((field) => field.name));\n const matchesGroup = (group: readonly FieldMeta[]): boolean =>\n group.length === names.size && group.every((field) => names.has(field.name));\n const matches =\n matchesGroup(model.primaryKey) || [...model.compoundUniques.values()].some(matchesGroup);\n if (!matches) {\n const candidates = [\n model.primaryKey.map((field) => field.name).join(\" + \") || \"none\",\n ...model.compoundUniques.keys(),\n ];\n throw validationError({\n message: `multi-field cursor on model \"${model.name}\" must be exactly the composite primary key or a composite @@unique group (${candidates.join(\", \")})`,\n meta: { model: model.name, fields: [...names] },\n });\n }\n }\n return { fields, values };\n}\n\nfunction normalizeDistinct(params: { model: ModelMeta; distinct: unknown }): FieldMeta[] {\n const { model, distinct } = params;\n const names = typeof distinct === \"string\" ? [distinct] : distinct;\n if (!Array.isArray(names) || names.length === 0 || names.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `distinct on model \"${model.name}\" must be a field name or a non-empty array of field names`,\n meta: { model: model.name },\n });\n }\n return (names as string[]).map((name) => getFieldMeta({ model, field: name, context: \"distinct\" }));\n}\n\nfunction flipOrderTerms(terms: readonly FindOrderTerm[]): FindOrderTerm[] {\n return terms.map((term) => {\n const direction = term.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const);\n if (\"select\" in term) return { ...term, direction };\n return {\n ...term,\n direction,\n ...(term.nulls === undefined ? {} : { nulls: term.nulls === \"first\" ? (\"last\" as const) : (\"first\" as const) }),\n };\n });\n}\n\ntype FindShape = {\n readonly statement: SelectStatement;\n readonly reverseRows: boolean;\n readonly resortBy: readonly ResortKey[] | null;\n};\n\n/**\n * Resolve the client-side re-sort keys for `distinct` + a user orderBy (N1):\n * the user's own terms, with `nulls` resolved to what the SQL order would\n * have done — the explicit request, else the dialect's native placement\n * (postgres: NULLs are largest — last on ASC; sqlite/mysql: smallest — first\n * on ASC). Decimal ranks numerically (B4 mirror).\n */\nfunction resortKeysOf(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n terms: readonly OrderByColumn[];\n}): ResortKey[] {\n const { dialect, model, terms } = params;\n return terms.map((term) => {\n const field = model.fieldByColumn.get(term.column.name);\n const nativeFirst = dialect.name === \"postgres\" ? term.direction === \"desc\" : term.direction === \"asc\";\n return {\n field: field?.name ?? term.column.name,\n direction: term.direction,\n nulls: term.nulls ?? (nativeFirst ? \"first\" : \"last\"),\n decimal: field !== undefined && field.scalarType === \"Decimal\" && !field.isList,\n };\n });\n}\n\n/**\n * The find-statement pipeline shared by findMany/findFirst/findUnique on both\n * relation strategies. Order of operations:\n * 1. base order = explicit orderBy, else the cursor fields ASC, else the PK\n * (when reversing, or under `defaultOrderByPk`), else nothing;\n * 2. a negative take flips the SQL order — rows re-reverse client-side;\n * 3. the cursor compiles to an EXCLUSIVE lexicographic bound against that\n * SQL order (`(a > $1) OR (a = $1 AND b > $2) …`);\n * 4. distinct leads the ORDER BY with its fields (a user's direction on them\n * is kept) and appends the PK tie-breaker (`distinctOrderByPk`, default\n * true) — native DISTINCT ON on postgres, a client post-filter elsewhere,\n * over the SAME ordering, so every dialect keeps the same first-row-per-key.\n */\nfunction buildFindShape(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n args: Record<string, unknown>;\n selectedFields: readonly string[] | null;\n firstLimit?: number;\n selection?: RelationSelection;\n clientOptions: BuilderClientOptions | undefined;\n}): FindShape {\n const { dialect, meta, model, args, selectedFields, firstLimit, selection, clientOptions } = params;\n const useLateral = selection !== undefined;\n const qualify = useLateral ? model.tableName : undefined;\n\n let where =\n args.where === undefined\n ? undefined\n : compileWhere({\n dialect,\n meta,\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n ...(qualify === undefined ? {} : { qualify }),\n });\n\n // #13: findFirst accepts `take` with Prisma semantics — the limit stays 1\n // (or 0 for `take: 0`), and a NEGATIVE take flips the order so `take: -1`\n // reads \"the last row\".\n const take = args.take === undefined ? undefined : compileTake({ value: args.take, model });\n const backward = take !== undefined && take < 0;\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n\n const userOrder: FindOrderTerm[] =\n args.orderBy === undefined\n ? []\n : compileFindOrderBy({ dialect, meta, model, orderBy: args.orderBy, qualify, aliasSeq: { n: 0 } });\n\n const cursor = args.cursor === undefined ? undefined : parseCursor({ model, cursor: args.cursor });\n\n // Order/compare context — carries B4's sqlite Decimal cast where needed.\n const colRefOf = (field: FieldMeta): ColRef =>\n compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n let baseOrder: FindOrderTerm[] = userOrder;\n if (baseOrder.length === 0 && cursor !== undefined) {\n baseOrder = cursor.fields.map((field) => ({ column: colRefOf(field), direction: \"asc\" as const }));\n }\n if (baseOrder.length === 0 && (backward || clientOptions?.defaultOrderByPk === true)) {\n baseOrder = model.primaryKey.map((field) => ({ column: colRefOf(field), direction: \"asc\" as const }));\n }\n if (backward && baseOrder.length === 0) {\n throw validationError({\n message: `negative take on model \"${model.name}\" needs an orderBy (or a primary key) to reverse`,\n meta: { model: model.name },\n });\n }\n\n let orderTerms: FindOrderTerm[] = backward ? flipOrderTerms(baseOrder) : baseOrder;\n\n let distinctOn: ColRef[] | undefined;\n let emulateDistinct = false;\n let resortBy: ResortKey[] | null = null;\n let distinctLeadCount = 0;\n let distinctPartition: ColRef[] | null = null;\n if (args.distinct !== undefined) {\n if (backward) {\n throw validationError({\n message: `distinct cannot combine with a negative take on model \"${model.name}\"`,\n meta: { model: model.name },\n });\n }\n if (orderTerms.some((term) => \"select\" in term)) {\n // The N1 re-sort mirrors the SQL order client-side — a correlated\n // subquery's value is not on the row, so it cannot be mirrored.\n throw validationError({\n message: `distinct cannot combine with a relation orderBy on model \"${model.name}\"`,\n meta: { model: model.name },\n });\n }\n const columnTerms = orderTerms as OrderByColumn[];\n // N1 (board #22): the DISTINCT arrangement demotes the user's order — the\n // client re-sorts the final rows by the user's own terms afterwards.\n if (userOrder.length > 0) {\n resortBy = resortKeysOf({ dialect, model, terms: userOrder as OrderByColumn[] });\n }\n const distinctFields = normalizeDistinct({ model, distinct: args.distinct });\n // SQLITE-4 stays true under the ROW_NUMBER emulation: the PARTITION uses\n // the PLAIN column (never the B4 REAL cast), so a sqlite Decimal key still\n // deduplicates on its exact text — the same keys the old client-side\n // post-filter produced.\n distinctPartition = distinctFields.map((field) => columnRef({ field }));\n const leading: OrderByColumn[] = distinctFields.map((field) => {\n const existing = columnTerms.find((term) => term.column.name === field.columnName);\n return existing ?? { column: colRefOf(field), direction: \"asc\" as const };\n });\n const rest = columnTerms.filter(\n (term) => !distinctFields.some((field) => field.columnName === term.column.name),\n );\n orderTerms = [...leading, ...rest];\n if (clientOptions?.distinctOrderByPk !== false) {\n for (const field of model.primaryKey) {\n if (!(orderTerms as OrderByColumn[]).some((term) => term.column.name === field.columnName)) {\n orderTerms.push({ column: colRefOf(field), direction: \"asc\" });\n }\n }\n }\n distinctLeadCount = leading.length;\n if (dialect.capabilities.distinctOn) {\n distinctOn = distinctFields.map((field) => colRefOf(field));\n } else {\n emulateDistinct = true;\n }\n }\n\n // M3 (SQL review): a cursor bound is only cursor pagination when the FINAL\n // ordering — after the distinct reorder — LEADS with the cursor fields: the\n // lexicographic bound walks that leading prefix. Anything else (`cursor:\n // { id } + orderBy: { karma: \"desc\" }`) would filter raw key ranges while\n // presenting an unrelated order — not pagination, refused at build time.\n if (cursor !== undefined) {\n const leading = orderTerms.slice(0, cursor.fields.length);\n const cursorIndexByColumn = new Map(cursor.fields.map((field, index) => [field.columnName, index]));\n const leadingColumns = leading.filter((term): term is OrderByColumn => \"column\" in term);\n const coherent =\n leadingColumns.length === leading.length &&\n leading.length === cursor.fields.length &&\n new Set(leadingColumns.map((term) => term.column.name)).size === leading.length &&\n leadingColumns.every((term) => cursorIndexByColumn.has(term.column.name));\n if (!coherent) {\n throw validationError({\n message: `cursor pagination on model \"${model.name}\" needs orderBy to lead with the cursor field(s) ${cursor.fields\n .map((field) => `\"${field.name}\"`)\n .join(\", \")} — a cursor bound over a different ordering is not cursor pagination`,\n meta: { model: model.name, cursorFields: cursor.fields.map((field) => field.name) },\n });\n }\n // The bound follows the ORDER BY's leading sequence (a composite cursor's\n // object-key order is irrelevant), each op from that term's direction.\n const sequence = (leading as OrderByColumn[]).map((term) => {\n const index = cursorIndexByColumn.get(term.column.name) as number;\n const field = cursor.fields[index] as FieldMeta;\n return {\n field,\n op: (term.direction === \"asc\" ? \"gt\" : \"lt\") as \"gt\" | \"lt\",\n value: encodeFilterValue({ dialect: dialect.name, field, value: cursor.values[index] }),\n };\n });\n const branches: SqlExpr[] = sequence.map((entry, index) => {\n const operands: SqlExpr[] = [];\n for (let previous = 0; previous < index; previous++) {\n const before = sequence[previous] as (typeof sequence)[number];\n operands.push({ kind: \"cmp\", op: \"eq\", column: colRefOf(before.field), value: before.value });\n }\n operands.push({ kind: \"cmp\", op: entry.op, column: colRefOf(entry.field), value: entry.value });\n return operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands };\n });\n const bound: SqlExpr = branches.length === 1 ? (branches[0] as SqlExpr) : { kind: \"or\", operands: branches };\n where = where === undefined ? bound : { kind: \"and\", operands: [where, bound] };\n }\n\n // #13: under a firstLimit (findFirst) the limit stays 1 — except `take: 0`,\n // which honestly fetches nothing.\n const absTake = take === undefined ? undefined : Math.abs(take);\n const limit =\n firstLimit === undefined ? absTake : absTake === undefined ? firstLimit : Math.min(firstLimit, absTake);\n const offset = skip;\n\n const lateralJoins = useLateral\n ? selection.relations.map((node, index) => buildLateralJoinClause({ dialect, meta, model, node, index }))\n : [];\n const projected = projectionColumns({\n model,\n selectedFields,\n ...(qualify === undefined ? {} : { table: qualify }),\n });\n const columns: readonly ColRef[] =\n lateralJoins.length === 0\n ? projected\n : [...projected, ...lateralJoins.map((join) => ({ table: join.alias, name: join.columnAlias }))];\n\n if (emulateDistinct) {\n // ROW_NUMBER emulation (N10): the inner select carries the WHERE (cursor\n // bound included) and a `ROW_NUMBER() OVER (PARTITION BY <distinct cols>\n // ORDER BY <rest of the arranged order>)`; the outer keeps `__rn = 1` —\n // the same representative row DISTINCT ON picks — and orders by the\n // leading distinct terms only (each key appears exactly once after the\n // filter, so they fully determine the sequence). take/skip bound the\n // OUTER select — SQL-side pagination, bounded transfer. The lateral path\n // cannot reach here: lateral joins are postgres-only, and postgres has\n // DISTINCT ON.\n const arranged = orderTerms as OrderByColumn[];\n const windowOrder = arranged.slice(distinctLeadCount);\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns,\n rowNumber: {\n partitionBy: distinctPartition as ColRef[],\n orderBy: windowOrder,\n alias: DISTINCT_ROW_NUMBER_ALIAS,\n },\n ...(where === undefined ? {} : { where }),\n };\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: DISTINCT_TABLE_ALIAS },\n columns: projectionColumns({ model, selectedFields }),\n fromSelect: inner,\n where: { kind: \"cmp\", op: \"eq\", column: { name: DISTINCT_ROW_NUMBER_ALIAS }, value: 1 },\n orderBy: arranged.slice(0, distinctLeadCount),\n ...(limit === undefined ? {} : { limit }),\n ...(offset === undefined ? {} : { offset }),\n };\n return { statement, reverseRows: backward, resortBy };\n }\n\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns,\n ...(lateralJoins.length > 0 ? { lateralJoins } : {}),\n ...(where === undefined ? {} : { where }),\n ...(distinctOn === undefined ? {} : { distinctOn }),\n ...(orderTerms.length === 0 ? {} : { orderBy: orderTerms }),\n ...(limit === undefined ? {} : { limit }),\n ...(offset === undefined ? {} : { offset }),\n };\n return { statement, reverseRows: backward, resortBy };\n}\n\n// ─── Lateral (join-strategy) statement assembly ─────────────────\n\n/** Alias every child subquery uses; scoped per lateral, so reuse is safe (v1 did the same). */\nconst LATERAL_CHILD_ALIAS: string = \"__rel\";\n\n/** Derived-table alias of the ROW_NUMBER distinct emulation (board #22 / N10). */\nconst DISTINCT_TABLE_ALIAS: string = \"__dist\";\n/** The window projection's alias — the outer statement filters `__rn = 1`. */\nconst DISTINCT_ROW_NUMBER_ALIAS: string = \"__rn\";\n\n/** The column a relation's JSON payload is exposed under in the outer row. */\nexport function lateralColumnAlias(params: { relation: string }): string {\n return `__rel_${params.relation}`;\n}\n\n/**\n * PG-3 (SQL review round 2): order fields the lateral subselect must project\n * HIDDEN — the aggregate's explicit `ORDER BY \"__sub\".…` (N2) can only\n * reference projected columns, and a per-relation orderBy on a field outside\n * the child select otherwise left the aggregate relying on \"usually preserves\n * subquery order\". The loader deletes these after parsing (the stitch-key\n * pattern). Empty when the projection is full or no orderBy was given.\n */\nexport function lateralHiddenOrderFields(params: { node: RelationTreeNode }): string[] {\n const { node } = params;\n const projected = node.args.projected;\n if (projected === null || node.args.orderBy === undefined) return [];\n const target = node.link.target;\n const hidden: string[] = [];\n const items = Array.isArray(node.args.orderBy) ? node.args.orderBy : [node.args.orderBy];\n for (const item of items) {\n if (!isPlainObject(item)) continue;\n for (const [name, value] of Object.entries(item)) {\n if (value === undefined) continue;\n if (!target.fieldByName.has(name)) continue;\n if (!projected.includes(name) && !hidden.includes(name)) hidden.push(name);\n }\n }\n return hidden;\n}\n\nconst lateralFieldByColumn = new WeakMap<ModelMeta, ReadonlyMap<string, FieldMeta>>();\n\nfunction fieldByColumnName(model: ModelMeta): ReadonlyMap<string, FieldMeta> {\n let map = lateralFieldByColumn.get(model);\n if (map === undefined) {\n map = new Map(model.fields.map((field) => [field.columnName, field]));\n lateralFieldByColumn.set(model, map);\n }\n return map;\n}\n\n/**\n * B3 (SQL review): raw `to_jsonb` ships BigInt/Decimal as float64 JSON numbers\n * (9007199254740993 → …992, live-proven) and Bytes as `\\x` hex text — the two\n * relation strategies then silently disagree on the same rows. The lateral\n * subselect casts instead: `::text` for BigInt/Decimal (their wire form on the\n * query path too), `encode(…,'base64')` for Bytes; BigInt[]/Decimal[] would\n * need `::text[]` element casts and Bytes[] has no cheap faithful form — both\n * are refused toward the portable query strategy at build time.\n */\nfunction applyLateralTransform(params: { model: ModelMeta; column: ColRef }): ColRef {\n const { model, column } = params;\n const field = fieldByColumnName(model).get(column.name);\n if (field === undefined) return column;\n const scalar = field.scalarType;\n if (scalar !== \"BigInt\" && scalar !== \"Decimal\" && scalar !== \"Bytes\") return column;\n if (field.isList) {\n throw unsupportedCapability({\n dialect: \"postgres\",\n feature: `join-strategy relation loading of ${model.name}.${field.name} (${scalar}[])`,\n hint: 'list columns of BigInt/Decimal/Bytes have no faithful JSON wire form — use the portable \"query\" relation strategy',\n });\n }\n return { ...column, transform: scalar === \"Bytes\" ? \"encodeBase64\" : \"castText\" };\n}\n\nfunction buildLateralJoinClause(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n node: RelationTreeNode;\n index: number;\n}): LateralJoin {\n const { dialect, meta, model, node, index } = params;\n const link = node.link;\n const target = link.target;\n const aliasSeq = { n: 0 };\n\n const projected = node.args.projected;\n // PG-3: order fields outside the child select ride the subselect hidden —\n // the aggregate's ORDER BY (N2) references \"__sub\" columns — and the loader\n // strips them after parsing.\n const hiddenOrder = lateralHiddenOrderFields({ node });\n const selectedWithOrder =\n projected === null || hiddenOrder.length === 0 ? projected : [...projected, ...hiddenOrder];\n const columns = projectionColumns({\n model: target,\n selectedFields: selectedWithOrder,\n table: LATERAL_CHILD_ALIAS,\n }).map((column) => applyLateralTransform({ model: target, column }));\n\n // Correlation: child key against the OUTER table's parent key. For implicit\n // M2M the membership test nests an EXISTS through the join table — the AST\n // stays join-free (see the select-exists-join-table catalog case).\n let correlate: SqlExpr;\n if (link.kind === \"manyToMany\") {\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const jtAlias = `__jt${++aliasSeq.n}`;\n correlate = {\n kind: \"exists\",\n select: {\n kind: \"select\",\n table: { name: join.tableName, alias: jtAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: {\n kind: \"and\",\n operands: [\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.childColumn },\n right: { table: LATERAL_CHILD_ALIAS, name: link.childKey.columnName },\n },\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.parentColumn },\n right: { table: model.tableName, name: link.parentKey.columnName },\n },\n ],\n },\n },\n };\n } else {\n correlate = {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: LATERAL_CHILD_ALIAS, name: link.childKey.columnName },\n right: { table: model.tableName, name: link.parentKey.columnName },\n };\n }\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({\n dialect,\n meta,\n model: target,\n where: node.args.where,\n qualify: LATERAL_CHILD_ALIAS,\n aliasSeq,\n });\n const where: SqlExpr =\n nestedWhere === undefined ? correlate : { kind: \"and\", operands: [correlate, nestedWhere] };\n\n const isList = link.relation.isList;\n let orderBy: OrderTerm[] | undefined;\n if (node.args.orderBy !== undefined) {\n orderBy = compileOrderBy({ model: target, orderBy: node.args.orderBy, qualify: LATERAL_CHILD_ALIAS, dialect });\n } else if (node.args.take !== undefined || node.args.skip !== undefined) {\n // Deterministic pagination needs a total order — default to the child PK.\n orderBy = target.primaryKey.map((field) => ({\n column: columnRef({ field, table: LATERAL_CHILD_ALIAS }),\n direction: \"asc\" as const,\n }));\n }\n\n const limit = isList ? node.args.take : 1;\n\n return {\n alias: `__lat_${index}`,\n columnAlias: lateralColumnAlias({ relation: node.name }),\n agg: isList ? \"jsonArray\" : \"jsonObject\",\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: LATERAL_CHILD_ALIAS },\n columns,\n where,\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(limit === undefined ? {} : { limit }),\n ...(node.args.skip === undefined || !isList ? {} : { offset: node.args.skip }),\n },\n };\n}\n\n// ─── Omit ───────────────────────────────────────────────────────\n\n/**\n * `omit: { field: true }` — every scalar EXCEPT the omitted ones (v1\n * semantics). Mutually exclusive with `select`; relations still ride `include`.\n */\nfunction compileOmit(params: { model: ModelMeta; omit: unknown }): string[] {\n const { model } = params;\n const spec = requireObject({ value: params.omit, what: \"omit\", model });\n const omitted = new Set<string>();\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `omit.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n if (model.relationByName.has(name)) {\n throw validationError({\n message: `omit.${name} on model \"${model.name}\" — omit takes scalar fields; a relation is excluded by not including it`,\n meta: { model: model.name, field: name },\n });\n }\n omitted.add(getFieldMeta({ model, field: name, context: \"omit\" }).name);\n }\n const kept = model.fields.filter((field) => !omitted.has(field.name)).map((field) => field.name);\n if (kept.length === 0) {\n throw validationError({\n message: `omit on model \"${model.name}\" removes every field`,\n meta: { model: model.name },\n });\n }\n return kept;\n}\n\n// ─── Aggregation (aggregate · groupBy · count-select) ────────────\n\nfunction aggregateAlias(params: { key: AggregateKey; selector: string }): string {\n return `${params.key}__${params.selector}`;\n}\n\nfunction validateAggregatedField(params: { model: ModelMeta; field: FieldMeta; key: AggregateKey }): void {\n const { model, field, key } = params;\n if (key === \"_count\") return; // COUNT works on any column (counts non-null values)\n if (field.isList) {\n throw validationError({\n message: `${key} cannot aggregate the list field ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n if (key === \"_avg\" || key === \"_sum\") {\n if (field.scalarType === null || !NUMERIC_TYPES.includes(field.scalarType)) {\n throw validationError({\n message: `${key} needs a numeric field, but ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n return;\n }\n // _min/_max order values — numbers, strings, dates and enums all sort.\n if (field.scalarType === \"Json\" || field.scalarType === \"Bytes\" || field.scalarType === \"Boolean\") {\n throw validationError({\n message: `${key} cannot aggregate ${model.name}.${field.name} (${field.scalarType} has no ordering)`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n}\n\ntype CompiledAggregates = {\n readonly spec: AggregateSpec;\n readonly aggSelects: AggSelect[];\n /** Field names any aggregation references — the subquery projection. */\n readonly referenced: string[];\n};\n\n/**\n * Compile the `_count`/`_avg`/`_sum`/`_min`/`_max` argument keys. Iteration is\n * deterministic — aggregate keys in fixed order, `_all` first, then fields in\n * MODEL order — so the same logical call always renders the same SQL whatever\n * order the caller wrote its keys in. Aliases follow `<key>__<selector>`\n * (`_count___all`, `_avg__score`); field names cannot start with `_`, so the\n * `_all` selector can never collide.\n */\nfunction compileAggregations(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n args: Record<string, unknown>;\n method: QueryMethod;\n}): CompiledAggregates {\n const { dialect, model, args, method } = params;\n const selections: AggregateSelection[] = [];\n const aggSelects: AggSelect[] = [];\n const referenced: string[] = [];\n let countShorthand = false;\n\n for (const key of AGGREGATE_KEYS) {\n const value = args[key];\n if (value === undefined) continue;\n\n if (key === \"_count\" && value === true) {\n countShorthand = true;\n const alias = aggregateAlias({ key, selector: \"_all\" });\n selections.push({ key, field: null, alias });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias });\n continue;\n }\n const spec = requireObject({ value, what: key, model });\n for (const [name, flag] of Object.entries(spec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `${key}.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name, key },\n });\n }\n if (name === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `${key}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key },\n });\n }\n continue;\n }\n getFieldMeta({ model, field: name, context: key }); // unknown fields are loud\n }\n if (key === \"_count\" && spec._all === true) {\n const alias = aggregateAlias({ key, selector: \"_all\" });\n selections.push({ key, field: null, alias });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias });\n }\n for (const field of model.fields) {\n if (spec[field.name] !== true) continue;\n validateAggregatedField({ model, field, key });\n const alias = aggregateAlias({ key, selector: field.name });\n selections.push({ key, field: field.name, alias });\n // B4: sqlite aggregates Decimal over CAST(col AS REAL) — MIN/MAX/SUM over\n // the TEXT storage would be lexicographic/coerced-wrong. _count counts\n // rows/non-nulls and never needs it.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n aggSelects.push({ agg: { fn: AGG_FN_BY_KEY[key], column: aggColumn }, alias });\n if (!referenced.includes(field.name)) referenced.push(field.name);\n }\n }\n\n if (selections.length === 0 && method === \"aggregate\") {\n throw validationError({\n message: `${model.clientName}.aggregate() needs at least one of ${AGGREGATE_KEYS.join(\", \")}`,\n meta: { model: model.name },\n });\n }\n return { spec: { selections, countShorthand }, aggSelects, referenced };\n}\n\nconst HAVING_OPERATOR_MAP: Readonly<Record<string, \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\">> = {\n equals: \"eq\",\n not: \"ne\",\n gt: \"gt\",\n gte: \"gte\",\n lt: \"lt\",\n lte: \"lte\",\n};\n\nfunction compileAggregatePredicate(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n key: AggregateKey;\n selector: string;\n filter: unknown;\n}): SqlExpr[] {\n const { dialect, model, key, selector, filter } = params;\n let agg: AggRef;\n let field: FieldMeta | null = null;\n if (selector === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `having ${key}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key },\n });\n }\n agg = { fn: \"countAll\" };\n } else {\n field = getFieldMeta({ model, field: selector, context: `having ${key}` });\n validateAggregatedField({ model, field, key });\n // B4: the HAVING aggregate mirrors the projection's sqlite Decimal cast.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n agg = { fn: AGG_FN_BY_KEY[key], column: aggColumn };\n }\n const spec = isPlainObject(filter) ? filter : { equals: filter };\n const out: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(spec)) {\n if (operand === undefined) continue;\n const op = HAVING_OPERATOR_MAP[operator];\n if (op === undefined) {\n throw validationError({\n message: `unknown having operator \"${operator}\" on ${key} of ${model.name}.${selector} — supported: ${Object.keys(HAVING_OPERATOR_MAP).join(\", \")}`,\n meta: { model: model.name, key, operator },\n });\n }\n // _count/_avg compare as plain numbers; _sum/_min/_max ride the field\n // codec — EXCEPT on sqlite (M5): an aggregate expression has no column\n // affinity there, so a TEXT operand never converts and the predicate is\n // constant-false. Operands bind raw numeric forms instead (bigint stays\n // bigint — bun:sqlite binds int64 natively; Decimal binds as a number\n // against the CAST(… AS REAL) aggregate).\n const value =\n dialect.name === \"sqlite\" && field !== null && key !== \"_count\"\n ? encodeAggregateOperand({ dialect: dialect.name, field, value: operand })\n : field !== null && (key === \"_sum\" || key === \"_min\" || key === \"_max\")\n ? encodeValue({ dialect: dialect.name, field, value: operand })\n : typeof operand === \"bigint\"\n ? dialect.name === \"sqlite\"\n ? operand\n : operand.toString()\n : operand;\n out.push({ kind: \"aggCmp\", op, agg, value });\n }\n if (out.length === 0) {\n throw validationError({\n message: `having ${key}.${selector} on model \"${model.name}\" needs an operator`,\n meta: { model: model.name, key },\n });\n }\n return out;\n}\n\n/**\n * `having` — aggregate predicates in BOTH orientations\n * (`{ _count: { id: { gt: 2 } } }` and `{ id: { _count: { gt: 2 } } }`), plain\n * scalar predicates on GROUPED columns only (anything else could not appear\n * after GROUP BY), and AND/OR/NOT groups.\n */\nfunction compileHaving(params: {\n ctx: WhereContext;\n model: ModelMeta;\n byNames: ReadonlySet<string>;\n having: Record<string, unknown>;\n}): SqlExpr | undefined {\n const { ctx, model, byNames, having } = params;\n const operands: SqlExpr[] = [];\n\n const group = (value: unknown, what: string): SqlExpr[] => {\n const items = Array.isArray(value) ? value : [value];\n return items.map((item) => {\n const spec = requireObject({ value: item, what, model });\n return compileHaving({ ctx, model, byNames, having: spec }) ?? NEUTRAL_TRUE;\n });\n };\n\n for (const [key, value] of Object.entries(having)) {\n if (value === undefined) continue;\n if (key === \"AND\") {\n operands.push({ kind: \"and\", operands: group(value, key) });\n continue;\n }\n if (key === \"OR\") {\n operands.push({ kind: \"or\", operands: group(value, key) });\n continue;\n }\n if (key === \"NOT\") {\n for (const member of group(value, key)) operands.push({ kind: \"not\", operand: member });\n continue;\n }\n\n if ((AGGREGATE_KEYS as readonly string[]).includes(key)) {\n const spec = requireObject({ value, what: `having ${key}`, model });\n for (const [selector, filter] of Object.entries(spec)) {\n if (filter === undefined) continue;\n operands.push(\n ...compileAggregatePredicate({ dialect: ctx.dialect, model, key: key as AggregateKey, selector, filter }),\n );\n }\n continue;\n }\n\n const field = getFieldMeta({ model, field: key, context: \"having\" });\n const requireGrouped = (): void => {\n if (byNames.has(field.name)) return;\n throw validationError({\n message: `having on ${model.name}.${field.name} needs the field in \\`by\\` — only grouped columns and aggregates exist after grouping`,\n meta: { model: model.name, field: field.name },\n });\n };\n if (isPlainObject(value)) {\n const plain: Record<string, unknown> = {};\n for (const [operator, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if ((AGGREGATE_KEYS as readonly string[]).includes(operator)) {\n operands.push(\n ...compileAggregatePredicate({\n dialect: ctx.dialect,\n model,\n key: operator as AggregateKey,\n selector: field.name,\n filter: operand,\n }),\n );\n continue;\n }\n plain[operator] = operand;\n }\n if (Object.keys(plain).length > 0) {\n requireGrouped();\n operands.push(compileOperatorFilter({ ctx, model, field, filter: plain, qualify: undefined }));\n }\n continue;\n }\n requireGrouped();\n operands.push(compileFieldFilter({ ctx, model, field, value, qualify: undefined }));\n }\n\n if (operands.length === 0) return undefined;\n if (operands.length === 1) return operands[0] as SqlExpr;\n return { kind: \"and\", operands };\n}\n\n/**\n * groupBy's orderBy: grouped fields (which must be in `by` — Prisma's rule,\n * enforced with a clear error) or aggregate references\n * (`{ _count: { _all: \"desc\" } }`, `{ _avg: { score: \"asc\" } }`).\n */\nfunction compileGroupByOrder(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n byNames: ReadonlySet<string>;\n orderBy: unknown;\n}): OrderTerm[] {\n const { dialect, model, byNames, orderBy } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: OrderTerm[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n if ((AGGREGATE_KEYS as readonly string[]).includes(name)) {\n const key = name as AggregateKey;\n const aggSpec = requireObject({ value, what: `orderBy ${name}`, model });\n for (const [selector, direction] of Object.entries(aggSpec)) {\n if (direction === undefined) continue;\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw validationError({\n message: `orderBy ${name}.${selector} must be \"asc\" or \"desc\" on model \"${model.name}\"`,\n meta: { model: model.name, key: name, selector },\n });\n }\n let agg: AggRef;\n if (selector === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `orderBy ${name}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key: name },\n });\n }\n agg = { fn: \"countAll\" };\n } else {\n const field = getFieldMeta({ model, field: selector, context: `orderBy ${name}` });\n validateAggregatedField({ model, field, key });\n // B4: the ordering aggregate mirrors the projection's sqlite cast.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n agg = { fn: AGG_FN_BY_KEY[key], column: aggColumn };\n }\n terms.push({ agg, direction });\n }\n continue;\n }\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n if (!byNames.has(field.name)) {\n throw validationError({\n message: `orderBy on ${model.name}.${field.name} — groupBy can only order by fields in \\`by\\` or by aggregates`,\n meta: { model: model.name, field: field.name },\n });\n }\n terms.push(compileOrderTerm({ model, field, spec: value, dialect }));\n }\n }\n return terms;\n}\n\n// ─── Refetch-where overlay (review F5) ─────────────────────────\n\n/**\n * The refetch-WHERE for update/upsert on a no-RETURNING dialect must reflect\n * the values the write itself sets: an update that changes its own unique key\n * would otherwise be re-selected by the OLD value and \"vanish\". Direct values\n * and `{ set: … }` wrappers overlay; atomic operations don't (their result is\n * only knowable in the database).\n *\n * Upsert overlays from the UPDATE arm. Documented edge: an upsert whose insert\n * path runs while its update arm rewrites the key field cannot be re-selected\n * correctly on such dialects — Prisma's create/where consistency convention\n * makes that shape pathological.\n */\nfunction overlayRefetchWhere(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n data: unknown;\n}): Record<string, unknown> {\n const { model, where, data } = params;\n const out: Record<string, unknown> = { ...where };\n if (!isPlainObject(data)) return out;\n for (const key of Object.keys(out)) {\n if (!model.fieldByName.has(key)) continue;\n const value = data[key];\n if (value === undefined) continue;\n if (isDirectValue(value) || value === null) {\n out[key] = value;\n continue;\n }\n if (isPlainObject(value) && (isDirectValue(value.set) || value.set === null)) {\n out[key] = value.set;\n }\n }\n return out;\n}\n\n// ─── Entry point ──────────────────────────────────────────────────\n\nconst FIND_METHODS: readonly QueryMethod[] = [\"findMany\", \"findFirst\", \"findUnique\"];\n\n/** Methods whose results can carry relations (select/include with relation keys). */\nconst RELATION_CAPABLE_METHODS: readonly QueryMethod[] = [\n \"findMany\",\n \"findFirst\",\n \"findUnique\",\n \"create\",\n \"createManyAndReturn\",\n \"update\",\n \"upsert\",\n // #25: relations load from the row the DELETE returns (or the mysql\n // read-before-delete) — children removed by a cascading delete come back\n // empty, exactly as v1 documented.\n \"delete\",\n];\n\nfunction resolveStrategy(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n method: QueryMethod;\n args: Record<string, unknown>;\n hasRelations: boolean;\n defaultRelationStrategy: RelationStrategy | undefined;\n}): RelationStrategy {\n const { dialect, model, method, args, hasRelations, defaultRelationStrategy } = params;\n const explicit = args.relationStrategy;\n if (explicit !== undefined && explicit !== \"query\" && explicit !== \"join\") {\n throw validationError({\n message: `relationStrategy on ${model.clientName}.${method}() must be \"query\" or \"join\"`,\n meta: { model: model.name, method, relationStrategy: explicit },\n });\n }\n if (!FIND_METHODS.includes(method)) return \"query\";\n const strategy = (explicit as RelationStrategy | undefined) ?? defaultRelationStrategy ?? \"query\";\n if (strategy === \"join\" && !dialect.capabilities.lateralJoin) {\n // A per-query \"join\" is an explicit ask — refuse loudly even without\n // relations. A client-level default only bites once relations are used.\n if (explicit !== undefined || hasRelations) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: 'relationStrategy \"join\"',\n hint: 'lateral joins are postgres-only — use the portable \"query\" strategy on this dialect',\n });\n }\n return \"query\";\n }\n return strategy;\n}\n\n/**\n * The relation selection + caller-visible field list for one call, WITHOUT\n * building a statement — the nested-write path orchestrates its own\n * statements but still needs the validated result shape for relation loading\n * and projection.\n */\nexport function resolveResultShape(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n method: QueryMethod;\n args: Record<string, unknown>;\n}): { relations: RelationSelection | null; resultFields: readonly string[] | null } {\n const { meta, model, method, args } = params;\n assertArgs({ method, args, model });\n const relations = resolveRelationSelection({ meta, model, select: args.select, include: args.include });\n const scalarSelect =\n args.select === undefined ? null : compileSelect({ model, select: args.select, allowEmpty: relations !== null });\n const resultFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n if (relations !== null && resultFields !== null) {\n for (const node of relations.relations) resultFields.push(node.name);\n if (relations.counts.length > 0) resultFields.push(\"_count\");\n }\n return { relations, resultFields };\n}\n\n/**\n * Build the SQL plan for one ORM call. Pure: same inputs, same statement —\n * except for app-generated defaults (uuid/cuid/nanoid/ulid/now), which are by\n * definition fresh per call.\n *\n * `defaultRelationStrategy` is the client-level option; a per-query\n * `relationStrategy` argument (find methods only) overrides it.\n */\nexport function buildQuery(params: {\n meta: RuntimeMeta;\n dialect: SqlDialect;\n model: string;\n method: QueryMethod;\n args?: Record<string, unknown>;\n defaultRelationStrategy?: RelationStrategy;\n clientOptions?: BuilderClientOptions;\n}): QueryPlan {\n const { meta, dialect, method } = params;\n const model = getModelMeta({ meta, model: params.model });\n const args = params.args ?? {};\n assertArgs({ method, args, model });\n\n // aggregate/groupBy/count interpret select/_agg keys themselves; the generic\n // projection machinery below is for row-returning methods only.\n const aggregating = method === \"aggregate\" || method === \"groupBy\" || method === \"count\";\n\n // Relations: resolve (and validate) what select/include ask for.\n const relationCapable = RELATION_CAPABLE_METHODS.includes(method);\n const relations = relationCapable\n ? resolveRelationSelection({ meta, model, select: args.select, include: args.include })\n : null;\n if (!relationCapable && !aggregating && isPlainObject(args.select)) {\n for (const key of Object.keys(args.select)) {\n if (args.select[key] === undefined || args.select[key] === false) continue;\n if (key === \"_count\" || model.relationByName.has(key)) {\n throw validationError({\n message: `select.${key} on ${model.clientName}.${method}() — relations are not supported on this method`,\n meta: { model: model.name, method, field: key },\n });\n }\n }\n }\n const relationStrategy = resolveStrategy({\n dialect,\n model,\n method,\n args,\n hasRelations: relations !== null,\n defaultRelationStrategy: params.defaultRelationStrategy,\n });\n\n // Projection: what the SQL fetches (scalar select + stitching keys) vs what\n // the caller sees (their select + relation names + `_count`).\n if (args.select !== undefined && args.omit !== undefined) {\n throw validationError({\n message: `select and omit cannot combine on ${model.clientName}.${method}() — select names fields to keep, omit fields to drop`,\n meta: { model: model.name, method },\n });\n }\n const scalarSelect = aggregating\n ? null\n : args.select !== undefined\n ? compileSelect({ model, select: args.select, allowEmpty: relations !== null })\n : args.omit !== undefined\n ? compileOmit({ model, omit: args.omit })\n : null;\n let selectedFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n let resultFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n if (relations !== null && resultFields !== null) {\n for (const node of relations.relations) resultFields.push(node.name);\n if (relations.counts.length > 0) resultFields.push(\"_count\");\n }\n if (relations !== null && selectedFields !== null) {\n for (const name of requiredParentFields({ meta, model, selection: relations })) {\n if (!selectedFields.includes(name)) selectedFields.push(name);\n }\n }\n // The distinct key must exist on fetched rows — the emulating post-filter\n // reads it — so it rides along like a stitch key and is narrowed away after.\n if (args.distinct !== undefined && selectedFields !== null && (method === \"findMany\" || method === \"findFirst\")) {\n for (const field of normalizeDistinct({ model, distinct: args.distinct })) {\n if (!selectedFields.includes(field.name)) selectedFields.push(field.name);\n }\n }\n\n const selectArg = args.select === undefined || aggregating ? null : (args.select as Record<string, unknown>);\n const base = {\n method,\n model,\n selectedFields,\n resultFields,\n relations,\n relationStrategy,\n takeApplied: args.take !== undefined,\n countAlias: null,\n refetchWhere: null,\n refetchWhereBase: null,\n selectArg,\n aggregateSpec: null,\n groupByFields: null,\n reverseRows: false,\n resortBy: null,\n } as const;\n\n const useLateral = relationStrategy === \"join\" && relations !== null;\n\n switch (method) {\n case \"findMany\":\n case \"findFirst\": {\n const shape = buildFindShape({\n dialect,\n meta,\n model,\n args,\n selectedFields,\n ...(method === \"findFirst\" ? { firstLimit: 1 } : {}),\n ...(useLateral ? { selection: relations as RelationSelection } : {}),\n clientOptions: params.clientOptions,\n });\n return {\n ...base,\n statement: shape.statement,\n reverseRows: shape.reverseRows,\n resortBy: shape.resortBy,\n };\n }\n\n case \"findUnique\": {\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method });\n const shape = buildFindShape({\n dialect,\n meta,\n model,\n args: { where },\n selectedFields,\n ...(useLateral ? { selection: relations as RelationSelection } : {}),\n clientOptions: undefined,\n });\n return { ...base, statement: shape.statement };\n }\n\n case \"count\": {\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n // #13: `count({ take, skip, orderBy })` counts a BOUNDED subset —\n // COUNT(*) over a derived table that limits the rows first (the same\n // shape aggregate-over-a-subset builds). An orderBy WITHOUT take/skip\n // is accepted and dropped: ordering cannot change a full count.\n const countTake =\n args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const countSkip =\n args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const countOrder =\n args.orderBy === undefined ? undefined : compileOrderBy({ model, orderBy: args.orderBy, dialect });\n const bounded = countTake !== undefined || countSkip !== undefined;\n const boundedInner = (innerFields: readonly string[]): SelectStatement => ({\n kind: \"select\",\n table: { name: model.tableName },\n columns: projectionColumns({ model, selectedFields: innerFields }),\n ...(where === undefined ? {} : { where }),\n ...(countOrder === undefined || countOrder.length === 0 ? {} : { orderBy: countOrder }),\n ...(countTake === undefined ? {} : { limit: countTake }),\n ...(countSkip === undefined ? {} : { offset: countSkip }),\n });\n if (args.select !== undefined) {\n // count-with-select: COUNT(*) for `_all`, COUNT(\"col\") (non-null count)\n // per field. Aliases ARE the result keys — `_all` first, then model order.\n const spec = requireObject({ value: args.select, what: \"select\", model });\n for (const [name, flag] of Object.entries(spec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `select.${name} must be true or false on ${model.clientName}.count()`,\n meta: { model: model.name, field: name },\n });\n }\n if (name !== \"_all\") getFieldMeta({ model, field: name, context: \"count select\" });\n }\n const selections: AggregateSelection[] = [];\n const aggSelects: AggSelect[] = [];\n if (spec._all === true) {\n selections.push({ key: \"_count\", field: null, alias: \"_all\" });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias: \"_all\" });\n }\n for (const field of model.fields) {\n if (spec[field.name] !== true) continue;\n selections.push({ key: \"_count\", field: field.name, alias: field.name });\n aggSelects.push({ agg: { fn: \"count\", column: { name: field.columnName } }, alias: field.name });\n }\n if (selections.length === 0) {\n throw validationError({\n message: `count select on model \"${model.name}\" must include _all or at least one field`,\n meta: { model: model.name },\n });\n }\n if (bounded) {\n // The per-field COUNTs read the derived table's columns — the inner\n // select projects exactly the counted fields (or the PK when only\n // `_all` was asked).\n const referenced = selections.filter((entry) => entry.field !== null).map((entry) => entry.field as string);\n const innerFields = referenced.length > 0 ? referenced : model.primaryKey.map((field) => field.name);\n return {\n ...base,\n aggregateSpec: { selections, countShorthand: false },\n statement: {\n kind: \"select\",\n table: { name: \"__cnt\" },\n columns: [],\n aggregates: aggSelects,\n fromSelect: boundedInner(innerFields),\n },\n };\n }\n return {\n ...base,\n aggregateSpec: { selections, countShorthand: false },\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n aggregates: aggSelects,\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n if (bounded) {\n return {\n ...base,\n countAlias: COUNT_ALIAS,\n statement: {\n kind: \"select\",\n table: { name: \"__cnt\" },\n columns: [],\n selectExpr: { kind: \"countAll\", alias: COUNT_ALIAS },\n fromSelect: boundedInner(model.primaryKey.map((field) => field.name)),\n },\n };\n }\n return {\n ...base,\n countAlias: COUNT_ALIAS,\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n selectExpr: { kind: \"countAll\", alias: COUNT_ALIAS },\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n\n case \"aggregate\": {\n const { spec, aggSelects, referenced } = compileAggregations({ dialect, model, args, method });\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n const orderBy =\n args.orderBy === undefined ? undefined : compileOrderBy({ model, orderBy: args.orderBy, dialect });\n const take = args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const bounded = orderBy !== undefined || take !== undefined || skip !== undefined;\n if (!bounded) {\n return {\n ...base,\n aggregateSpec: spec,\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n aggregates: aggSelects,\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n // Aggregate over a subset: the inner select bounds the rows, the outer\n // aggregates the derived table (`__agg`). Inner projection is the\n // referenced fields — or the PK when only COUNT(*) was asked.\n const innerFields = referenced.length > 0 ? referenced : model.primaryKey.map((field) => field.name);\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns: projectionColumns({ model, selectedFields: innerFields }),\n ...(where === undefined ? {} : { where }),\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(take === undefined ? {} : { limit: take }),\n ...(skip === undefined ? {} : { offset: skip }),\n };\n return {\n ...base,\n aggregateSpec: spec,\n statement: {\n kind: \"select\",\n table: { name: \"__agg\" },\n columns: [],\n aggregates: aggSelects,\n fromSelect: inner,\n },\n };\n }\n\n case \"groupBy\": {\n const byRaw = args.by;\n const byList = typeof byRaw === \"string\" ? [byRaw] : byRaw;\n if (!Array.isArray(byList) || byList.length === 0 || byList.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `groupBy on model \"${model.name}\" needs \\`by\\`: a field name or a non-empty array of field names`,\n meta: { model: model.name },\n });\n }\n const byFields = (byList as string[]).map((name) => {\n const field = getFieldMeta({ model, field: name, context: \"by\" });\n if (field.isList || field.scalarType === \"Json\") {\n throw validationError({\n message: `groupBy cannot group by ${model.name}.${field.name} (${field.isList ? \"list\" : \"Json\"} fields have no grouping equality)`,\n meta: { model: model.name, field: field.name },\n });\n }\n return field;\n });\n const byNames = new Set(byFields.map((field) => field.name));\n const { spec, aggSelects } = compileAggregations({ dialect, model, args, method });\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n const ctx: WhereContext = { dialect, meta, aliasSeq: { n: 0 } };\n const having =\n args.having === undefined\n ? undefined\n : compileHaving({ ctx, model, byNames, having: requireObject({ value: args.having, what: \"having\", model }) });\n const orderBy =\n args.orderBy === undefined\n ? undefined\n : compileGroupByOrder({ dialect, model, byNames, orderBy: args.orderBy });\n const take = args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const byColumns = byFields.map((field) => columnRef({ field }));\n return {\n ...base,\n aggregateSpec: spec,\n groupByFields: byFields.map((field) => field.name),\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: byColumns,\n ...(aggSelects.length === 0 ? {} : { aggregates: aggSelects }),\n ...(where === undefined ? {} : { where }),\n groupBy: byColumns,\n ...(having === undefined ? {} : { having }),\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(take === undefined ? {} : { limit: take }),\n ...(skip === undefined ? {} : { offset: skip }),\n },\n };\n }\n\n case \"create\": {\n const row = compileCreateRow({ dialect, model, data: args.data });\n const columns = orderedColumns({ model, values: row.values });\n if (columns.length === 0) {\n throw validationError({\n message: `create on model \"${model.name}\" needs at least one field value`,\n meta: { model: model.name },\n });\n }\n return {\n ...base,\n refetchWhere: row.knownKey,\n statement: {\n kind: \"insert\",\n table: { name: model.tableName },\n columns,\n rows: [columns.map((column) => row.values[column])],\n returning: returningColumns({ model, selectedFields }),\n },\n };\n }\n\n case \"createMany\":\n case \"createManyAndReturn\": {\n if (method === \"createManyAndReturn\" && !dialect.capabilities.createManyAndReturn) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"createManyAndReturn\",\n hint: \"this dialect cannot RETURNING multiple inserted rows — use createMany then findMany\",\n });\n }\n const groups = compileCreateRows({ dialect, model, data: args.data });\n const skipDuplicates = args.skipDuplicates === true;\n const statements = groups.map(\n (group): SqlStatement => ({\n kind: \"insert\",\n table: { name: model.tableName },\n columns: group.columns,\n rows: group.rows,\n ...(skipDuplicates ? { onConflict: { doNothing: true } } : {}),\n ...(method === \"createManyAndReturn\" ? { returning: returningColumns({ model, selectedFields }) } : {}),\n }),\n );\n return {\n ...base,\n statement: statements[0] as SqlStatement,\n // M4/M7: sqlite column-set groups and parameter-budget chunks — the\n // client runs a multi-statement batch in ONE transaction.\n ...(statements.length > 1 ? { batch: statements } : {}),\n };\n }\n\n case \"update\":\n case \"updateMany\": {\n const isUnique = method === \"update\";\n const raw = requireObject({ value: args.where, what: \"where\", model });\n const where = isUnique ? expandCompoundWhere({ model, where: raw }) : raw;\n if (isUnique) assertUniqueWhere({ model, where, method });\n const compiled = compileWhere({ dialect, meta, model, where });\n return {\n ...base,\n // F5: overlay the values the update itself writes onto the refetch key.\n refetchWhere: isUnique ? overlayRefetchWhere({ model, where, data: args.data }) : null,\n statement: {\n kind: \"update\",\n table: { name: model.tableName },\n set: compileUpdateSet({ dialect, model, data: args.data }),\n ...(compiled === undefined ? {} : { where: compiled }),\n ...(isUnique ? { returning: returningColumns({ model, selectedFields }) } : {}),\n },\n };\n }\n\n case \"upsert\": {\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method });\n const row = compileCreateRow({ dialect, model, data: args.create });\n const columns = orderedColumns({ model, values: row.values });\n const targetFields = conflictTargetFields({ model, where });\n // Defensive mirror of the client's routing (`upsertUsesNativeStatement`):\n // a native upsert whose create row does not bind the conflict target can\n // never fire its conflict clause on the addressed row — emitting it would\n // silently insert instead of update (SQL review B1). The client routes\n // such shapes to the transactional fallback before ever building this.\n for (const field of targetFields) {\n if (!(field.columnName in row.values)) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `upsert on ${model.name}: create data does not bind conflict-target column \"${field.columnName}\" — this shape must run the find-then-write fallback flow`,\n meta: { model: model.name, column: field.columnName },\n });\n }\n }\n // PG-2 mirror: a guard field beyond the conflict target is invisible to\n // ON CONFLICT — the update arm would fire even when the guard fails.\n const nativeTargetNames = new Set(targetFields.map((field) => field.name));\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined || nativeTargetNames.has(key)) continue;\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `upsert on ${model.name}: where field \"${key}\" is not part of the conflict target — guarded upserts must run the find-then-write fallback flow`,\n meta: { model: model.name, field: key },\n });\n }\n const update = compileUpdateSet({ dialect, model, data: args.update });\n // B2 (mysql): make the ODKU update arm record the addressed row's key so\n // the read-back can resolve it via LAST_INSERT_ID(). Integer single-column\n // keys only — LAST_INSERT_ID is an integer register.\n const pk = model.primaryKey.length === 1 ? (model.primaryKey[0] as FieldMeta) : undefined;\n const odkuKeyColumn =\n dialect.upsertForm === \"onDuplicateKey\" &&\n pk !== undefined &&\n (pk.scalarType === \"Int\" || pk.scalarType === \"BigInt\") &&\n !(pk.columnName in update)\n ? pk.columnName\n : undefined;\n return {\n ...base,\n // F5: on conflict the UPDATE arm applies — overlay its values.\n refetchWhere: overlayRefetchWhere({ model, where, data: args.update }),\n // The un-overlaid where: the INSERT arm's row answers this one (its\n // create row binds the conflict target — checked above).\n refetchWhereBase: { ...where },\n statement: {\n kind: \"insert\",\n table: { name: model.tableName },\n columns,\n rows: [columns.map((column) => row.values[column])],\n onConflict: {\n columns: targetFields.map((field) => field.columnName),\n update,\n ...(odkuKeyColumn === undefined ? {} : { lastInsertIdColumn: odkuKeyColumn }),\n },\n returning: returningColumns({ model, selectedFields }),\n },\n };\n }\n\n case \"delete\":\n case \"deleteMany\": {\n const isUnique = method === \"delete\";\n const raw =\n args.where === undefined && !isUnique\n ? undefined\n : requireObject({ value: args.where, what: \"where\", model });\n const where = isUnique && raw !== undefined ? expandCompoundWhere({ model, where: raw }) : raw;\n if (isUnique && where !== undefined) assertUniqueWhere({ model, where, method });\n const compiled = where === undefined ? undefined : compileWhere({ dialect, meta, model, where });\n return {\n ...base,\n refetchWhere: isUnique ? (where as Record<string, unknown>) : null,\n statement: {\n kind: \"delete\",\n table: { name: model.tableName },\n ...(compiled === undefined ? {} : { where: compiled }),\n ...(isUnique ? { returning: returningColumns({ model, selectedFields }) } : {}),\n },\n };\n }\n }\n}\n",
9
- "/**\n * Relation RESOLUTION: `select`/`include` args → a validated relation tree,\n * plus the structural link (FK fields, join table) each relation loads through.\n *\n * Pure structure — no SQL, no execution. The query builder consumes this to\n * gate strategies and augment projections at build time (the earliest knowable\n * moment); the relation loader consumes it to run and stitch.\n *\n * v1 semantics carried:\n * - `select: { rel: … }` and `include: { rel: … }` both load; `include` wins\n * when both name the same relation.\n * - `_count` uses the v1 shape: `include._count: true | { select: { rel: true } }`\n * (or under `select`), counts LIST relations only, and supports no `where`.\n * - Implicit many-to-many resolves through the ONE shared join-table rule\n * (`implicitJoinTable` in @vibeorm/schema) — never re-derived here.\n */\n\nimport { VibeError, implicitJoinTable } from \"@vibeorm/schema\";\nimport type { RelationIR } from \"@vibeorm/schema\";\nimport { getModelMeta } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** How a relation is physically wired. */\nexport type RelationKind =\n /** Children hold the FK (`oneToMany`) — batch `WHERE fk IN (parents)`. */\n | \"toManyFk\"\n /** THIS model holds the FK (`manyToOne` / owning `oneToOne`). */\n | \"toOneOwner\"\n /** The other side holds the FK (non-owning `oneToOne`). */\n | \"toOneInverse\"\n /** Implicit join table (`manyToMany`). */\n | \"manyToMany\";\n\n/** The resolved physical link for one relation. */\nexport type RelationLink = {\n readonly kind: RelationKind;\n readonly relation: RelationIR;\n readonly target: ModelMeta;\n /** Field on the PARENT whose values correlate the two sides. */\n readonly parentKey: FieldMeta;\n /** Field on the CHILD whose values match `parentKey`'s. */\n readonly childKey: FieldMeta;\n /** Join-table wiring; `null` unless kind is `manyToMany`. */\n readonly join: {\n readonly tableName: string;\n readonly parentColumn: \"A\" | \"B\";\n readonly childColumn: \"A\" | \"B\";\n } | null;\n};\n\n/** Nested args for one relation to load, validated. */\nexport type RelationArgs = {\n readonly where: Record<string, unknown> | undefined;\n readonly orderBy: unknown;\n readonly take: number | undefined;\n readonly skip: number | undefined;\n /** Child scalar fields the CALLER asked for, or `null` for all scalars. */\n readonly select: readonly string[] | null;\n /** SQL projection: `select` plus stitching keys — what the child statement fetches. */\n readonly projected: readonly string[] | null;\n /** Fields in `projected` the caller did NOT ask for — deleted after stitching. */\n readonly strip: readonly string[];\n /** Deeper relation levels under this one. */\n readonly nested: RelationSelection | null;\n};\n\nexport type RelationTreeNode = {\n /** Relation field name on the parent (`posts`). */\n readonly name: string;\n readonly link: RelationLink;\n readonly args: RelationArgs;\n};\n\n/** Everything relation-shaped one query level asked for. */\nexport type RelationSelection = {\n readonly relations: readonly RelationTreeNode[];\n /** List-relation names to count into `_count`. */\n readonly counts: readonly string[];\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n// ─── Link resolution ──────────────────────────────────────────────\n\nfunction relationKeyOf(relation: RelationIR): string | null {\n return relation.relationName ?? null;\n}\n\n/**\n * The counterpart of `relation` on the target model: symmetric name match\n * (both unnamed or same name) with self-exclusion — the ONE implicit-pairing\n * rule from LEARNINGS, matching the parser's.\n */\nfunction findReverseRelation(params: { relation: RelationIR; target: ModelMeta }): RelationIR | null {\n const { relation, target } = params;\n const key = relationKeyOf(relation);\n const candidates = target.relations.filter(\n (candidate) =>\n candidate.targetModel === relation.model &&\n relationKeyOf(candidate) === key &&\n // Self-exclusion: on a self-relation, a side must never match itself.\n (relation.model !== relation.targetModel || candidate.name !== relation.name),\n );\n return candidates[0] ?? null;\n}\n\nfunction singleField(params: {\n model: ModelMeta;\n names: readonly string[] | undefined;\n relation: RelationIR;\n what: string;\n}): FieldMeta {\n const { model, names, relation, what } = params;\n if (names === undefined || names.length !== 1) {\n throw validationError({\n message:\n names === undefined\n ? `relation \"${relation.name}\" on ${relation.model} has no ${what} — the schema cannot be loaded through`\n : `relation \"${relation.name}\" on ${relation.model} uses a composite ${what} — composite-key relation loading is not supported yet`,\n meta: { model: relation.model, relation: relation.name },\n });\n }\n const field = model.fieldByName.get(names[0] as string);\n if (field === undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `relation \"${relation.name}\" on ${relation.model} names unknown ${what} field \"${String(names[0])}\"`,\n meta: { model: relation.model, relation: relation.name },\n });\n }\n return field;\n}\n\nfunction singlePrimaryKey(params: { model: ModelMeta; relation: RelationIR }): FieldMeta {\n const { model, relation } = params;\n const pk = model.primaryKey;\n if (pk.length !== 1) {\n throw validationError({\n message: `implicit many-to-many relation \"${relation.name}\" needs a single-column primary key on ${model.name}`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n return pk[0] as FieldMeta;\n}\n\n/**\n * Link cache: resolution is pure per (meta, relation) — the same RelationIR\n * always resolves against the same RuntimeMeta to the same wiring — and it\n * sits on every relation-load and nested-write path. Keyed on meta first so\n * two clients over the same SchemaIR never share ModelMeta instances.\n */\nconst linkCache = new WeakMap<RuntimeMeta, WeakMap<RelationIR, RelationLink>>();\n\n/** Resolve how one relation is physically wired. */\nexport function resolveRelationLink(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n}): RelationLink {\n const { meta, relation } = params;\n let perMeta = linkCache.get(meta);\n if (perMeta === undefined) {\n perMeta = new WeakMap();\n linkCache.set(meta, perMeta);\n }\n const cached = perMeta.get(relation);\n if (cached !== undefined) return cached;\n const link = resolveRelationLinkUncached(params);\n perMeta.set(relation, link);\n return link;\n}\n\nfunction resolveRelationLinkUncached(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n}): RelationLink {\n const { meta, model, relation } = params;\n const target = getModelMeta({ meta, model: relation.targetModel });\n\n if (relation.type === \"manyToMany\") {\n const join = implicitJoinTable({\n modelA: relation.model,\n modelB: relation.targetModel,\n ...(relation.relationName === undefined ? {} : { relationName: relation.relationName }),\n });\n // Self-relations sort to themselves; the parent then takes column A —\n // mirroring v1's `parentIsA = name === sorted[0]`.\n const parentIsA = model.name === join.modelA;\n return {\n kind: \"manyToMany\",\n relation,\n target,\n parentKey: singlePrimaryKey({ model, relation }),\n childKey: singlePrimaryKey({ model: target, relation }),\n join: {\n tableName: join.tableName,\n parentColumn: parentIsA ? \"A\" : \"B\",\n childColumn: parentIsA ? \"B\" : \"A\",\n },\n };\n }\n\n if (relation.fields !== undefined && relation.fields.length > 0) {\n // This side holds the FK — a to-one owner.\n return {\n kind: \"toOneOwner\",\n relation,\n target,\n parentKey: singleField({ model, names: relation.fields, relation, what: \"fields\" }),\n childKey: singleField({ model: target, names: relation.references, relation, what: \"references\" }),\n join: null,\n };\n }\n\n // FK lives on the other side: find the counterpart carrying it.\n const reverse = findReverseRelation({ relation, target });\n if (reverse === null || reverse.fields === undefined || reverse.fields.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `relation \"${relation.name}\" on ${relation.model} has no foreign-key counterpart on ${relation.targetModel}`,\n meta: { model: relation.model, relation: relation.name, target: relation.targetModel },\n });\n }\n return {\n kind: relation.isList ? \"toManyFk\" : \"toOneInverse\",\n relation,\n target,\n parentKey: singleField({ model, names: reverse.references, relation: reverse, what: \"references\" }),\n childKey: singleField({ model: target, names: reverse.fields, relation: reverse, what: \"fields\" }),\n join: null,\n };\n}\n\n// ─── Selection resolution ─────────────────────────────────────────\n\nconst TO_MANY_ARG_KEYS: readonly string[] = [\"where\", \"orderBy\", \"take\", \"skip\", \"select\", \"include\", \"omit\"];\nconst TO_ONE_ARG_KEYS: readonly string[] = [\"where\", \"select\", \"include\", \"omit\"];\n\nfunction toNonNegativeInteger(params: { value: unknown; what: string; relation: string }): number {\n const { value, what, relation } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n throw validationError({\n message: `${what} on relation \"${relation}\" must be a non-negative integer`,\n meta: { relation, argument: what, value },\n });\n }\n return value;\n}\n\n/**\n * Child scalar projection for a nested `select`: relation keys and `_count`\n * are handled by the recursion, everything else must be a scalar `true`.\n */\nfunction compileChildSelect(params: { model: ModelMeta; select: Record<string, unknown> }): string[] {\n const { model, select } = params;\n const names: string[] = [];\n for (const [name, value] of Object.entries(select)) {\n if (value === undefined || value === false) continue;\n if (name === \"_count\" || model.relationByName.has(name)) continue;\n const field = model.fieldByName.get(name);\n if (field === undefined) {\n throw validationError({\n message: `unknown field \"${name}\" on model \"${model.name}\" in select`,\n meta: { model: model.name, field: name },\n });\n }\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n names.push(field.name);\n }\n return names;\n}\n\n/**\n * Child scalar projection for a nested `omit`: every scalar EXCEPT the named\n * ones, in model field order — the same rule the top-level `omit` follows\n * (v1 semantics). Mutually exclusive with the relation's `select`.\n */\nfunction compileChildOmit(params: { model: ModelMeta; omit: unknown; relation: string }): string[] {\n const { model, omit, relation } = params;\n if (!isPlainObject(omit)) {\n throw validationError({\n message: `omit on relation \"${relation}\" must be an object`,\n meta: { model: model.name, relation },\n });\n }\n const omitted = new Set<string>();\n for (const [name, value] of Object.entries(omit)) {\n if (value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `omit.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, relation, field: name },\n });\n }\n if (model.relationByName.has(name)) {\n throw validationError({\n message: `omit.${name} on model \"${model.name}\" — omit takes scalar fields; a relation is excluded by not including it`,\n meta: { model: model.name, relation, field: name },\n });\n }\n if (!model.fieldByName.has(name)) {\n throw validationError({\n message: `unknown field \"${name}\" on model \"${model.name}\" in omit`,\n meta: { model: model.name, relation, field: name },\n });\n }\n omitted.add(name);\n }\n const kept = model.fields.filter((field) => !omitted.has(field.name)).map((field) => field.name);\n if (kept.length === 0) {\n throw validationError({\n message: `omit on relation \"${relation}\" removes every field of model \"${model.name}\"`,\n meta: { model: model.name, relation },\n });\n }\n return kept;\n}\n\n/**\n * The parent-side fields a selection needs for stitching: each relation's\n * `parentKey`, and each counted relation's `parentKey`.\n */\nexport function requiredParentFields(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n selection: RelationSelection;\n}): string[] {\n const { meta, model, selection } = params;\n const needed = new Set<string>();\n for (const node of selection.relations) {\n needed.add(node.link.parentKey.name);\n }\n for (const name of selection.counts) {\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n needed.add(resolveRelationLink({ meta, model, relation }).parentKey.name);\n }\n return [...needed];\n}\n\nfunction resolveCountNames(params: { model: ModelMeta; spec: unknown }): string[] {\n const { model, spec } = params;\n const listRelations = model.relations.filter((relation) => relation.isList).map((relation) => relation.name);\n if (spec === true) return listRelations;\n if (!isPlainObject(spec) || !isPlainObject(spec.select)) {\n throw validationError({\n message: `_count on model \"${model.name}\" must be true or { select: { relation: true } }`,\n meta: { model: model.name },\n });\n }\n const names: string[] = [];\n for (const [name, value] of Object.entries(spec.select)) {\n if (value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `_count.select.${name} on model \"${model.name}\" must be true — per-relation count filters are not supported`,\n meta: { model: model.name, relation: name },\n });\n }\n const relation = model.relationByName.get(name);\n if (relation === undefined || !relation.isList) {\n throw validationError({\n message: `_count.select.${name} on model \"${model.name}\" must name a list relation`,\n meta: { model: model.name, relation: name },\n });\n }\n names.push(name);\n }\n return names;\n}\n\nfunction resolveNode(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n spec: unknown;\n}): RelationTreeNode {\n const { meta, model, relation, spec } = params;\n const link = resolveRelationLink({ meta, model, relation });\n const raw: Record<string, unknown> = spec === true ? {} : (spec as Record<string, unknown>);\n\n const allowed = relation.isList ? TO_MANY_ARG_KEYS : TO_ONE_ARG_KEYS;\n for (const key of Object.keys(raw)) {\n if (raw[key] === undefined) continue;\n if (!allowed.includes(key)) {\n throw validationError({\n message: `unsupported argument \"${key}\" on relation \"${relation.name}\" — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, relation: relation.name, argument: key },\n });\n }\n }\n if (raw.select !== undefined && raw.include !== undefined) {\n throw validationError({\n message: `relation \"${relation.name}\" cannot use select and include together`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n if (raw.select !== undefined && raw.omit !== undefined) {\n throw validationError({\n message: `relation \"${relation.name}\" cannot use select and omit together — select names fields to keep, omit fields to drop`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n\n const where =\n raw.where === undefined\n ? undefined\n : (() => {\n if (!isPlainObject(raw.where)) {\n throw validationError({\n message: `where on relation \"${relation.name}\" must be an object`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n return raw.where;\n })();\n\n const take =\n raw.take === undefined ? undefined : toNonNegativeInteger({ value: raw.take, what: \"take\", relation: relation.name });\n const skip =\n raw.skip === undefined ? undefined : toNonNegativeInteger({ value: raw.skip, what: \"skip\", relation: relation.name });\n\n // Deeper levels ride the child's own select/include.\n const nested = resolveRelationSelection({\n meta,\n model: link.target,\n select: raw.select,\n include: raw.include,\n });\n\n const select =\n raw.select !== undefined\n ? compileChildSelect({ model: link.target, select: raw.select as Record<string, unknown> })\n : raw.omit !== undefined\n ? compileChildOmit({ model: link.target, omit: raw.omit, relation: relation.name })\n : null;\n\n // The child statement must fetch the stitching key plus whatever deeper\n // levels stitch through; anything the caller did not select is stripped\n // after loading (the v1 auto-added-PK rule, applied structurally).\n let projected: readonly string[] | null = null;\n const strip: string[] = [];\n if (select !== null) {\n const fetch = [...select];\n const additions = new Set<string>([link.childKey.name]);\n if (nested !== null) {\n for (const name of requiredParentFields({ meta, model: link.target, selection: nested })) {\n additions.add(name);\n }\n }\n for (const name of additions) {\n if (!fetch.includes(name)) {\n fetch.push(name);\n strip.push(name);\n }\n }\n projected = fetch;\n }\n\n return {\n name: relation.name,\n link,\n args: { where, orderBy: raw.orderBy, take, skip, select, projected, strip, nested },\n };\n}\n\n/**\n * Resolve everything relation-shaped in one level's `select`/`include`.\n * Returns `null` when neither names a relation or `_count`.\n *\n * Scalar keys in `select` are ignored here (the query builder projects them);\n * every key in `include` must be a relation or `_count` — anything else is a\n * loud validation error.\n */\nexport function resolveRelationSelection(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n select: unknown;\n include: unknown;\n}): RelationSelection | null {\n const { meta, model, select, include } = params;\n\n const selectSpec = isPlainObject(select) ? select : null;\n const includeSpec = isPlainObject(include) ? include : null;\n\n if (includeSpec !== null) {\n for (const [key, value] of Object.entries(includeSpec)) {\n if (value === undefined || value === false) continue;\n if (key === \"_count\") continue;\n if (!model.relationByName.has(key)) {\n const isScalar = model.fieldByName.has(key);\n throw validationError({\n message: isScalar\n ? `\"${key}\" on model \"${model.name}\" is a scalar field — include takes relations, use select for scalars`\n : `unknown relation \"${key}\" on model \"${model.name}\" in include`,\n meta: { model: model.name, relation: key },\n });\n }\n if (value !== true && !isPlainObject(value)) {\n throw validationError({\n message: `include.${key} on model \"${model.name}\" must be true or an object`,\n meta: { model: model.name, relation: key },\n });\n }\n }\n }\n\n const specs = new Map<string, unknown>();\n if (selectSpec !== null) {\n for (const relation of model.relations) {\n const value = selectSpec[relation.name];\n if (value === true || isPlainObject(value)) specs.set(relation.name, value);\n }\n }\n // include wins when both name the same relation (v1 precedence).\n if (includeSpec !== null) {\n for (const relation of model.relations) {\n const value = includeSpec[relation.name];\n if (value === true || isPlainObject(value)) specs.set(relation.name, value);\n }\n }\n\n const countSpec = includeSpec?._count ?? selectSpec?._count;\n const counts = countSpec === undefined || countSpec === false ? [] : resolveCountNames({ model, spec: countSpec });\n\n if (specs.size === 0 && counts.length === 0) return null;\n\n const relations = [...specs.entries()].map(([name, spec]) =>\n resolveNode({ meta, model, relation: model.relationByName.get(name) as RelationIR, spec }),\n );\n\n return { relations, counts };\n}\n",
10
- "/**\n * Relation LOADING: attach included relations onto already-materialized rows.\n *\n * The portable \"query\" strategy (default, all dialects): one batched statement\n * per relation per level (`WHERE childKey IN (parent keys)`), grouped and\n * stitched in memory — never one query per parent. Implicit M2M loads in ONE\n * statement per level (board #12, v1's shape): children INNER JOINed to their\n * join-table membership rows, the join table's parent-key column projected\n * under a reserved alias and decoded through the PARENT key's codec (rule 6).\n * Deeper levels recurse over the level's loaded children.\n *\n * PER-PARENT take/skip MECHANISM (differs from v1's SQL, matches its\n * semantics): v1 windowed with `ROW_NUMBER() OVER (PARTITION BY fk)`; v2 loads\n * the batch fully ordered (the user's orderBy, or the child PK when paginating\n * without one) and applies each parent's skip/take at stitch time. Same\n * observable result for any deterministic ordering, no window functions in the\n * AST. The trade-off — overfetching children that fall outside a page — is\n * accepted for 2.0 and confined to this module.\n *\n * The \"join\" strategy's rows arrive with `__rel_<name>` JSON columns (built by\n * the query builder's lateral statement); `attachLateralRelations` parses,\n * DECODES (codecs on every child row — to_jsonb strings timestamps and drops\n * BigInt-ness, LEARNINGS) and stitches them, then recurses deeper levels\n * through the query strategy exactly like v1.\n *\n * Statements run SEQUENTIALLY in relation-declaration order, so the statement\n * stream is deterministic (scripted-adapter tests pin it; real adapters get\n * predictable logs).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { SelectStatement, SqlDialect, SqlExpr, WireFidelity } from \"@vibeorm/sql\";\nimport { decodeValue, encodeValue, fieldDecoder, materializeJsonRows, materializeRows } from \"./codecs.ts\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { compileOrderBy, compileWhere, lateralColumnAlias, lateralHiddenOrderFields } from \"./query-builder.ts\";\nimport { resolveRelationLink } from \"./relation-plan.ts\";\nimport type { RelationLink, RelationSelection, RelationTreeNode } from \"./relation-plan.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** A materialized row relations are stitched onto. */\nexport type LoadedRow = Record<string, unknown>;\n\n/**\n * Executes one SELECT and returns RAW driver rows — the loader decodes them\n * itself (the child model's codecs, at every materialization point). The\n * client provides this bound to its adapter + onQuery reporting.\n */\nexport type RelationExecutor = (params: {\n statement: SelectStatement;\n model: string;\n method: string;\n}) => Promise<Record<string, unknown>[]>;\n\ntype LoaderContext = {\n readonly dialect: SqlDialect;\n readonly meta: RuntimeMeta;\n readonly execute: RelationExecutor;\n /** The executing adapter's wire declaration — threads into every child materialization (board #30). */\n readonly wire: WireFidelity | undefined;\n};\n\n/** Internal alias for the grouped-count column — never collides with model columns. */\nconst COUNT_VALUE_ALIAS: string = \"__vibe_count\";\n\n// ─── Small helpers ────────────────────────────────────────────────\n\nfunction distinctKeys(params: { rows: readonly LoadedRow[]; field: string }): unknown[] {\n const { rows, field } = params;\n const seen = new Set<unknown>();\n for (const row of rows) {\n const value = row[field];\n if (value !== null && value !== undefined) seen.add(value);\n }\n return [...seen];\n}\n\nfunction sliceForParent(params: {\n group: readonly LoadedRow[];\n take: number | undefined;\n skip: number | undefined;\n}): LoadedRow[] {\n const { group, take, skip } = params;\n const from = skip ?? 0;\n return group.slice(from, take === undefined ? undefined : from + take);\n}\n\n/** The batched child SELECT for one relation level (single-table statement). */\nfunction buildChildStatement(params: {\n ctx: LoaderContext;\n node: RelationTreeNode;\n membership: SqlExpr;\n}): SelectStatement {\n const { ctx, node, membership } = params;\n const target = node.link.target;\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({ dialect: ctx.dialect, meta: ctx.meta, model: target, where: node.args.where });\n const where: SqlExpr =\n nestedWhere === undefined ? membership : { kind: \"and\", operands: [membership, nestedWhere] };\n\n let orderBy =\n node.args.orderBy === undefined\n ? undefined\n : compileOrderBy({ model: target, orderBy: node.args.orderBy, dialect: ctx.dialect });\n if (orderBy === undefined && (node.args.take !== undefined || node.args.skip !== undefined)) {\n // Pagination without an order is nondeterministic — default to the PK.\n orderBy = target.primaryKey.map((field) => ({\n column: { name: field.columnName },\n direction: \"asc\" as const,\n }));\n }\n\n const projected = node.args.projected;\n const columns =\n projected === null\n ? target.fields.map((field) => ({ name: field.columnName }))\n : projected.map((name) => ({\n name: (target.fieldByName.get(name) as { columnName: string }).columnName,\n }));\n\n return {\n kind: \"select\",\n table: { name: target.tableName },\n columns,\n where,\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n };\n}\n\nfunction membershipExpr(params: {\n ctx: LoaderContext;\n link: RelationLink;\n keys: readonly unknown[];\n}): SqlExpr {\n const { ctx, link, keys } = params;\n return {\n kind: \"inArray\",\n column: { name: link.childKey.columnName },\n values: keys.map((key) => encodeValue({ dialect: ctx.dialect.name, field: link.childKey, value: key })),\n };\n}\n\n/**\n * M7 (SQL review): dialects that EXPAND `IN (?, ?, …)` bind one parameter per\n * key — sqlite hard-errors past ~32k and mysql caps at 65535, so an unbounded\n * parent batch must chunk to the dialect's conservative budget. Postgres\n * passes ONE array parameter (`= ANY($1)`) and never chunks.\n *\n * Correctness per load kind (SHARED-1, review round 2): the chunk key IS the\n * grouping key for EVERY load kind — FK/to-one chunk by parent key, and the\n * single-statement M2M join (board #12) filters the join table by PARENT key\n * too — so a parent's children always arrive from one statement, in that\n * statement's order, and chunk results simply concatenate.\n */\nfunction chunkKeys(params: { ctx: LoaderContext; keys: readonly unknown[] }): readonly (readonly unknown[])[] {\n const { ctx, keys } = params;\n const budget = ctx.dialect.paramBudget;\n if (ctx.dialect.inArrayStrategy === \"any\" || keys.length <= budget) return [keys];\n const chunks: (readonly unknown[])[] = [];\n for (let start = 0; start < keys.length; start += budget) {\n chunks.push(keys.slice(start, start + budget));\n }\n return chunks;\n}\n\n\n// ─── Per-kind loaders (query strategy) ────────────────────────────\n\n/** Load + stitch a to-many FK relation; returns the kept children (for recursion). */\nasync function loadToManyFk(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const keys = distinctKeys({ rows, field: link.parentKey.name });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = [];\n return [];\n }\n\n const raw: Record<string, unknown>[] = [];\n for (const chunk of chunkKeys({ ctx, keys })) {\n const statement = buildChildStatement({\n ctx,\n node,\n membership: membershipExpr({ ctx, link, keys: chunk }),\n });\n raw.push(...(await ctx.execute({ statement, model: model.name, method: `include.${node.name}` })));\n }\n const children = materializeRows({ dialect: ctx.dialect.name, model: link.target, rows: raw, wire: ctx.wire });\n\n const grouped = new Map<unknown, LoadedRow[]>();\n for (const child of children) {\n const key = child[link.childKey.name];\n const group = grouped.get(key);\n if (group === undefined) grouped.set(key, [child]);\n else group.push(child);\n }\n\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n const group = grouped.get(row[link.parentKey.name]) ?? [];\n const slice = sliceForParent({ group, take: node.args.take, skip: node.args.skip });\n row[node.name] = slice;\n kept.push(...slice);\n }\n return kept;\n}\n\n/** Load + stitch a to-one relation (either side); returns kept children. */\nasync function loadToOne(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const keys = distinctKeys({ rows, field: link.parentKey.name });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = null;\n return [];\n }\n\n const raw: Record<string, unknown>[] = [];\n for (const chunk of chunkKeys({ ctx, keys })) {\n const statement = buildChildStatement({\n ctx,\n node,\n membership: membershipExpr({ ctx, link, keys: chunk }),\n });\n raw.push(...(await ctx.execute({ statement, model: model.name, method: `include.${node.name}` })));\n }\n const children = materializeRows({ dialect: ctx.dialect.name, model: link.target, rows: raw, wire: ctx.wire });\n\n const byKey = new Map<unknown, LoadedRow>();\n for (const child of children) {\n const key = child[link.childKey.name];\n if (!byKey.has(key)) byKey.set(key, child);\n }\n\n // Each parent gets its OWN instance — shared references across parents\n // would make later recursion/strips act at a distance.\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n const child = byKey.get(row[link.parentKey.name]);\n if (child === undefined) {\n row[node.name] = null;\n continue;\n }\n const copy = { ...child };\n row[node.name] = copy;\n kept.push(copy);\n }\n return kept;\n}\n\n/** Join-table alias in the single-statement M2M load. */\nconst M2M_JOIN_ALIAS: string = \"__jt\";\n/** Reserved projection alias for the join table's parent-key column. */\nconst M2M_PARENT_ALIAS: string = \"__vibe_parent\";\n\n/**\n * Load + stitch an implicit M2M relation — ONE statement per parent-key chunk\n * (board #12, v1's single-statement shape): children INNER JOINed to the join\n * table, the parent-key column projected under {@link M2M_PARENT_ALIAS}. Each\n * result row is one (parent, child) membership pair, so distribution needs no\n * separate pair query; a chunk holds ALL of a parent's pairs (chunking is by\n * PARENT key), so per-parent order is chunk-local and needs no re-sort.\n */\nasync function loadManyToMany(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const join = link.join;\n if (join === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `manyToMany relation \"${node.name}\" resolved without join-table wiring`,\n });\n }\n const keys = distinctKeys({ rows, field: link.parentKey.name });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = [];\n return [];\n }\n\n const target = link.target;\n // Child columns are table-qualified: the join table's own column names\n // (`A`/`B`) could collide with child columns.\n const projected = node.args.projected;\n const childColumns: { table: string; name: string }[] = (\n projected === null\n ? target.fields.map((field) => field.columnName)\n : projected.map((name) => (target.fieldByName.get(name) as { columnName: string }).columnName)\n ).map((name) => ({ table: target.tableName, name }));\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({\n dialect: ctx.dialect,\n meta: ctx.meta,\n model: target,\n where: node.args.where,\n qualify: target.tableName,\n });\n let orderBy =\n node.args.orderBy === undefined\n ? undefined\n : compileOrderBy({ model: target, orderBy: node.args.orderBy, qualify: target.tableName, dialect: ctx.dialect });\n if (orderBy === undefined && (node.args.take !== undefined || node.args.skip !== undefined)) {\n // Pagination without an order is nondeterministic — default to the PK.\n orderBy = target.primaryKey.map((field) => ({\n column: { table: target.tableName, name: field.columnName },\n direction: \"asc\" as const,\n }));\n }\n\n const raw: Record<string, unknown>[] = [];\n for (const chunk of chunkKeys({ ctx, keys })) {\n const membership: SqlExpr = {\n kind: \"inArray\",\n column: { table: M2M_JOIN_ALIAS, name: join.parentColumn },\n values: chunk.map((key) => encodeValue({ dialect: ctx.dialect.name, field: link.parentKey, value: key })),\n };\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: target.tableName },\n columns: [...childColumns, { table: M2M_JOIN_ALIAS, name: join.parentColumn, alias: M2M_PARENT_ALIAS }],\n innerJoins: [\n {\n table: { name: join.tableName, alias: M2M_JOIN_ALIAS },\n on: [\n {\n left: { table: M2M_JOIN_ALIAS, name: join.childColumn },\n right: { table: target.tableName, name: link.childKey.columnName },\n },\n ],\n },\n ],\n where: nestedWhere === undefined ? membership : { kind: \"and\", operands: [membership, nestedWhere] },\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n };\n raw.push(...(await ctx.execute({ statement, model: model.name, method: `include.${node.name}` })));\n }\n\n // Children decode through the TARGET model's codecs; the reserved parent\n // column rides the PARENT key's codec (rule 6 — BigInt ids arrive as strings\n // from pg drivers, exactly like everywhere else).\n const pairs = materializeRows({ dialect: ctx.dialect.name, model: target, rows: raw, wire: ctx.wire });\n const decodeParent = fieldDecoder({\n dialect: ctx.dialect.name,\n field: link.parentKey,\n ...(ctx.wire === undefined ? {} : { wire: ctx.wire }),\n });\n\n const groups = new Map<unknown, LoadedRow[]>();\n for (const pair of pairs) {\n const rawParent = pair[M2M_PARENT_ALIAS];\n delete pair[M2M_PARENT_ALIAS];\n const parentKey =\n decodeParent === null || rawParent === null || rawParent === undefined ? rawParent : decodeParent(rawParent);\n // Each result row is one membership pair — already a per-parent instance.\n const group = groups.get(parentKey);\n if (group === undefined) groups.set(parentKey, [pair]);\n else group.push(pair);\n }\n\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n const group = groups.get(row[link.parentKey.name]) ?? [];\n const slice = sliceForParent({ group, take: node.args.take, skip: node.args.skip });\n row[node.name] = slice;\n kept.push(...slice);\n }\n return kept;\n}\n\n// ─── _count ───────────────────────────────────────────────────────\n\n/**\n * Load `_count` for the named list relations: ONE grouped COUNT per relation\n * for the whole parent batch. Runs for both strategies (the lateral path has\n * no aggregate column — v1 lesson: forgetting this silently dropped `_count`).\n */\nasync function loadCounts(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n rows: readonly LoadedRow[];\n counts: readonly string[];\n}): Promise<void> {\n const { ctx, model, rows, counts } = params;\n if (counts.length === 0 || rows.length === 0) return;\n\n for (const row of rows) {\n const bucket: Record<string, number> = {};\n for (const name of counts) bucket[name] = 0;\n row._count = bucket;\n }\n\n for (const name of counts) {\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n const link = resolveRelationLink({ meta: ctx.meta, model, relation });\n const keys = distinctKeys({ rows, field: link.parentKey.name });\n if (keys.length === 0) continue;\n\n const join = link.join;\n const groupColumn = join === null ? link.childKey.columnName : join.parentColumn;\n const table = join === null ? link.target.tableName : join.tableName;\n const raw: Record<string, unknown>[] = [];\n for (const chunk of chunkKeys({ ctx, keys })) {\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: table },\n columns: [{ name: groupColumn }],\n selectExpr: { kind: \"countAll\", alias: COUNT_VALUE_ALIAS },\n where: {\n kind: \"inArray\",\n column: { name: groupColumn },\n values: chunk.map((key) => encodeValue({ dialect: ctx.dialect.name, field: link.parentKey, value: key })),\n },\n groupBy: [{ name: groupColumn }],\n };\n raw.push(...(await ctx.execute({ statement, model: model.name, method: `_count.${name}` })));\n }\n\n const byKey = new Map<unknown, number>();\n for (const entry of raw) {\n const key = decodeValue({ dialect: ctx.dialect.name, field: link.parentKey, value: entry[groupColumn] });\n byKey.set(key, Number(entry[COUNT_VALUE_ALIAS] ?? 0));\n }\n for (const row of rows) {\n const count = byKey.get(row[link.parentKey.name]);\n if (count !== undefined) (row._count as Record<string, number>)[name] = count;\n }\n }\n}\n\n// ─── Entry points ─────────────────────────────────────────────────\n\nasync function loadNode(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<void> {\n const { ctx, model, node, rows } = params;\n\n let kept: LoadedRow[];\n switch (node.link.kind) {\n case \"toManyFk\":\n kept = await loadToManyFk({ ctx, model, node, rows });\n break;\n case \"manyToMany\":\n kept = await loadManyToMany({ ctx, model, node, rows });\n break;\n case \"toOneOwner\":\n case \"toOneInverse\":\n kept = await loadToOne({ ctx, model, node, rows });\n break;\n }\n\n await finishNode({ ctx, node, kept });\n}\n\n/** Recurse deeper levels over the kept children, then strip stitching keys. */\nasync function finishNode(params: {\n ctx: LoaderContext;\n node: RelationTreeNode;\n kept: readonly LoadedRow[];\n}): Promise<void> {\n const { ctx, node, kept } = params;\n if (node.args.nested !== null && kept.length > 0) {\n await attachRelations({\n dialect: ctx.dialect,\n meta: ctx.meta,\n model: node.link.target,\n rows: [...kept],\n selection: node.args.nested,\n execute: ctx.execute,\n ...(ctx.wire === undefined ? {} : { wire: ctx.wire }),\n });\n }\n if (node.args.strip.length > 0) {\n for (const child of kept) {\n for (const name of node.args.strip) delete child[name];\n }\n }\n}\n\n/**\n * \"query\"-strategy loading: batched statements per relation, in declaration\n * order, recursively. Mutates `rows` in place (relations become properties).\n */\nexport async function attachRelations(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n rows: LoadedRow[];\n selection: RelationSelection;\n execute: RelationExecutor;\n /** The executing adapter's wire declaration (board #30). */\n wire?: WireFidelity;\n}): Promise<void> {\n const { dialect, meta, model, rows, selection, execute, wire } = params;\n if (rows.length === 0) return;\n const ctx: LoaderContext = { dialect, meta, execute, wire };\n\n for (const node of selection.relations) {\n await loadNode({ ctx, model, node, rows });\n }\n await loadCounts({ ctx, model, rows, counts: selection.counts });\n}\n\n/**\n * \"join\"-strategy post-processing: parse each row's `__rel_<name>` JSON\n * column, decode the children through the child model's codecs, stitch, then\n * recurse deeper levels through the query strategy (v1 semantics) and load\n * `_count` separately.\n */\nexport async function attachLateralRelations(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n rows: LoadedRow[];\n selection: RelationSelection;\n execute: RelationExecutor;\n /** The executing adapter's wire declaration (board #30 — deeper levels recurse through the query strategy). */\n wire?: WireFidelity;\n}): Promise<void> {\n const { dialect, meta, model, rows, selection, execute, wire } = params;\n if (rows.length === 0) return;\n const ctx: LoaderContext = { dialect, meta, execute, wire };\n\n for (const node of selection.relations) {\n const column = lateralColumnAlias({ relation: node.name });\n const isList = node.link.relation.isList;\n // PG-3: order fields the subselect projected HIDDEN (outside the child\n // select, referenced by the aggregate's ORDER BY) — deleted after parse,\n // exactly like the strip list's stitch keys.\n const hiddenOrder = lateralHiddenOrderFields({ node });\n const kept: LoadedRow[] = [];\n\n for (const row of rows) {\n const raw = row[column];\n delete row[column];\n\n let parsed: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n parsed = JSON.parse(raw);\n } catch (cause) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `relation column \"${column}\" returned text that is not valid JSON`,\n meta: { relation: node.name },\n cause,\n });\n }\n }\n\n if (isList) {\n const list = Array.isArray(parsed) ? (parsed as Record<string, unknown>[]) : [];\n // B3: JSON-transport decode — ::text/base64 wire forms, Json pre-parsed.\n const children = materializeJsonRows({ model: node.link.target, rows: list });\n for (const child of children) {\n for (const name of hiddenOrder) delete child[name];\n }\n row[node.name] = children;\n kept.push(...children);\n } else {\n if (parsed === null || parsed === undefined || typeof parsed !== \"object\") {\n row[node.name] = null;\n continue;\n }\n const child = materializeJsonRows({\n model: node.link.target,\n rows: [parsed as Record<string, unknown>],\n })[0] as LoadedRow;\n for (const name of hiddenOrder) delete child[name];\n row[node.name] = child;\n kept.push(child);\n }\n }\n\n await finishNode({ ctx, node, kept });\n }\n\n await loadCounts({ ctx, model, rows, counts: selection.counts });\n}\n",
11
- "/**\n * Nested writes (Prisma-shaped, v1 parity plus implicit-M2M support):\n *\n * create data: relation: { create | connect | connectOrCreate }\n * update data: … plus { update | updateMany | upsert | set | disconnect |\n * delete | deleteMany }\n *\n * STATEMENT ORDER (deterministic, pinned by unit tests):\n * create: [owner-side to-one resolutions: SELECT/INSERT per verb] →\n * parent INSERT → [list/M2M ops in data-key order, item order;\n * each M2M child op is followed immediately by its join-row INSERT].\n * PLAIN multi-item FK-side `create` lists collapse into ONE\n * multi-row INSERT (v1 parity — one fewer round-trip per item) when\n * no item carries nested ops of its own and all items write the\n * same columns (so no NULL-vs-database-default drift can appear).\n * update: parent pre-SELECT (findUnique) → [owner-side to-one resolutions]\n * → parent UPDATE (scalars + FK changes, skipped when empty) →\n * [deferred owner-side child DELETEs] → [list/M2M ops in data-key\n * order] — the returned row is the UPDATE's result (or the\n * pre-SELECT when nothing on the parent changed).\n *\n * TRANSACTIONS: any nested write that produces more than one statement wraps\n * in `adapter.transaction` automatically; inside an outer `$transaction` that\n * nests as a savepoint (the adapter contract). A mid-write failure therefore\n * rolls the whole write back.\n *\n * Implicit M2M goes through the ONE shared join-table rule (`implicitJoinTable`\n * via relation-plan's link resolution); `connect` writes join rows with\n * conflict-skip, so re-connecting an existing pair is a no-op.\n *\n * Unknown verbs are loud: VIBE_VALIDATION naming the verb (v1 silently\n * ignored them — that was a bug class, not a feature).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect, SqlStatement } from \"@vibeorm/sql\";\nimport { encodeValue } from \"./codecs.ts\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport type { QueryMethod } from \"./query-builder.ts\";\nimport { resolveRelationLink } from \"./relation-plan.ts\";\nimport type { RelationLink } from \"./relation-plan.ts\";\n\n// ─── Runner contract (implemented by the client) ──────────────────\n\nexport type ClientRowLike = Record<string, unknown>;\n\n/**\n * Executes ORM statements against ONE adapter (plain or transactional).\n * `single` runs a single-row mutation with the client's full RETURNING /\n * re-select machinery (mysql-safe); `statement` runs a raw AST statement\n * (join-table work has no model).\n */\nexport type StatementRunner = {\n readonly single: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<ClientRowLike>;\n readonly rows: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<ClientRowLike[]>;\n readonly affected: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<number>;\n readonly statement: (params: {\n statement: SqlStatement;\n model: string;\n method: string;\n }) => Promise<ClientRowLike[]>;\n};\n\n/** What the client hands the nested-write orchestrator. */\nexport type WriteContext = {\n readonly meta: RuntimeMeta;\n readonly dialect: SqlDialect;\n /** Runner on the client's current adapter (may already be transactional). */\n readonly run: StatementRunner;\n /** Runs `fn` with a runner bound to a (nested) transaction. */\n readonly transactional: <T>(fn: (run: StatementRunner) => Promise<T>) => Promise<T>;\n};\n\n// ─── Errors & guards ──────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\nfunction notFound(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_NOT_FOUND\", message: params.message, meta: params.meta });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array)\n );\n}\n\nfunction isDirectValue(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n value instanceof Date ||\n value instanceof Uint8Array\n );\n}\n\n// ─── Detection & partitioning ─────────────────────────────────────\n\n/** Does this `data` object carry nested relation operations? */\nexport function hasNestedWrites(params: { model: ModelMeta; data: unknown }): boolean {\n const { model, data } = params;\n if (!isPlainObject(data)) return false;\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n if (model.relationByName.has(key)) return true;\n }\n return false;\n}\n\ntype NestedOp = {\n readonly name: string;\n readonly link: RelationLink;\n readonly verbs: Record<string, unknown>;\n};\n\nconst CREATE_VERBS: readonly string[] = [\"create\", \"connect\", \"connectOrCreate\"];\nconst TO_ONE_UPDATE_VERBS: readonly string[] = [\n ...CREATE_VERBS,\n \"disconnect\",\n \"delete\",\n \"update\",\n \"upsert\",\n];\nconst TO_MANY_UPDATE_VERBS: readonly string[] = [\n ...CREATE_VERBS,\n \"set\",\n \"disconnect\",\n \"delete\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"deleteMany\",\n];\n\nfunction partitionData(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n data: Record<string, unknown>;\n phase: \"create\" | \"update\";\n}): { scalars: Record<string, unknown>; ops: NestedOp[] } {\n const { meta, model, data, phase } = params;\n const scalars: Record<string, unknown> = {};\n const ops: NestedOp[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const relation = model.relationByName.get(key);\n if (relation === undefined) {\n scalars[key] = value;\n continue;\n }\n if (!isPlainObject(value)) {\n throw validationError({\n message: `relation ${model.name}.${key} in data must be an object of nested-write operations`,\n meta: { model: model.name, relation: key },\n });\n }\n const link = resolveRelationLink({ meta, model, relation });\n const allowed =\n phase === \"create\" ? CREATE_VERBS : relation.isList ? TO_MANY_UPDATE_VERBS : TO_ONE_UPDATE_VERBS;\n const verbs: Record<string, unknown> = {};\n for (const [verb, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if (!allowed.includes(verb)) {\n throw validationError({\n message: `unknown nested-write operation \"${verb}\" on ${model.name}.${key} (${phase}) — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, relation: key, verb, phase },\n });\n }\n verbs[verb] = operand;\n }\n if (Object.keys(verbs).length === 0) {\n throw validationError({\n message: `relation ${model.name}.${key} in data carries no nested-write operation`,\n meta: { model: model.name, relation: key },\n });\n }\n ops.push({ name: key, link, verbs });\n }\n\n return { scalars, ops };\n}\n\nfunction toItems(params: { op: NestedOp; verb: string; operand: unknown }): Record<string, unknown>[] {\n const { op, verb, operand } = params;\n const list = Array.isArray(operand) ? operand : [operand];\n if (!op.link.relation.isList && Array.isArray(operand)) {\n throw validationError({\n message: `nested \"${verb}\" on to-one relation ${op.link.relation.model}.${op.name} cannot take an array`,\n meta: { relation: op.name, verb },\n });\n }\n return list.map((item) => {\n if (!isPlainObject(item)) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} expects object items`,\n meta: { relation: op.name, verb },\n });\n }\n return item;\n });\n}\n\nfunction requireShape(params: {\n op: NestedOp;\n verb: string;\n item: Record<string, unknown>;\n keys: readonly string[];\n}): void {\n const { op, verb, item, keys } = params;\n for (const key of keys) {\n if (!isPlainObject(item[key])) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} needs an object \"${key}\"`,\n meta: { relation: op.name, verb, missing: key },\n });\n }\n }\n}\n\n// ─── Target-key resolution ────────────────────────────────────────\n\n/**\n * The child-key value a unique `where` identifies. When the where directly\n * provides the referenced field (`connect: { id: 5 }` against `references:\n * [id]`), no SELECT is needed; anything else resolves with one.\n */\nasync function resolveTargetKey(params: {\n run: StatementRunner;\n link: RelationLink;\n where: Record<string, unknown>;\n what: string;\n}): Promise<unknown> {\n const { run, link, where, what } = params;\n const keyField = link.childKey.name;\n const entries = Object.entries(where).filter(([, value]) => value !== undefined);\n if (entries.length === 1 && entries[0]?.[0] === keyField && isDirectValue(entries[0][1])) {\n return entries[0][1];\n }\n const rows = await run.rows({\n model: link.target.name,\n method: \"findUnique\",\n args: { where, select: { [keyField]: true } },\n });\n const row = rows[0];\n if (row === undefined) {\n throw notFound({\n message: `${what}: no ${link.target.name} record matched the unique where`,\n meta: { model: link.target.name, where },\n });\n }\n return row[keyField];\n}\n\n// ─── Join-table statements (implicit M2M) ─────────────────────────\n\nfunction joinValues(params: {\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKey: unknown;\n}): { a: unknown; b: unknown } {\n const { dialect, link, parentKey, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const parentValue = encodeValue({ dialect: dialect.name, field: link.parentKey, value: parentKey });\n const childValue = encodeValue({ dialect: dialect.name, field: link.childKey, value: childKey });\n return join.parentColumn === \"A\" ? { a: parentValue, b: childValue } : { a: childValue, b: parentValue };\n}\n\nasync function insertJoinRow(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKey: unknown;\n}): Promise<void> {\n const { run, dialect, link, parentKey, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const { a, b } = joinValues({ dialect, link, parentKey, childKey });\n await run.statement({\n statement: {\n kind: \"insert\",\n table: { name: join.tableName },\n columns: [\"A\", \"B\"],\n rows: [[a, b]],\n // Re-connecting an existing pair is a no-op, not an error.\n onConflict: { columns: [\"A\", \"B\"], doNothing: true },\n },\n model: link.relation.model,\n method: \"nested.connect\",\n });\n}\n\nasync function deleteJoinRows(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKeys?: readonly unknown[];\n}): Promise<void> {\n const { run, dialect, link, parentKey, childKeys } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const parentValue = encodeValue({ dialect: dialect.name, field: link.parentKey, value: parentKey });\n await run.statement({\n statement: {\n kind: \"delete\",\n table: { name: join.tableName },\n where: {\n kind: \"and\",\n operands: [\n { kind: \"cmp\", op: \"eq\", column: { name: join.parentColumn }, value: parentValue },\n ...(childKeys === undefined\n ? []\n : [\n {\n kind: \"inArray\" as const,\n column: { name: join.childColumn },\n values: childKeys.map((key) =>\n encodeValue({ dialect: dialect.name, field: link.childKey, value: key }),\n ),\n },\n ]),\n ],\n },\n },\n model: link.relation.model,\n method: \"nested.disconnect\",\n });\n}\n\n/** Remove EVERY join row referencing a child about to be deleted (both columns on self-relations). */\nasync function deleteJoinRowsForChild(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n childKey: unknown;\n}): Promise<void> {\n const { run, dialect, link, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const value = encodeValue({ dialect: dialect.name, field: link.childKey, value: childKey });\n const isSelf = link.relation.model === link.relation.targetModel;\n await run.statement({\n statement: {\n kind: \"delete\",\n table: { name: join.tableName },\n where: isSelf\n ? {\n kind: \"or\",\n operands: [\n { kind: \"cmp\", op: \"eq\", column: { name: \"A\" }, value },\n { kind: \"cmp\", op: \"eq\", column: { name: \"B\" }, value },\n ],\n }\n : { kind: \"cmp\", op: \"eq\", column: { name: join.childColumn }, value },\n },\n model: link.relation.model,\n method: \"nested.delete\",\n });\n}\n\n// ─── CREATE ───────────────────────────────────────────────────────\n\nfunction singleVerb(params: { op: NestedOp }): { verb: string; operand: unknown } {\n const { op } = params;\n const entries = Object.entries(op.verbs);\n if (entries.length !== 1) {\n throw validationError({\n message: `to-one relation ${op.link.relation.model}.${op.name} takes exactly one nested-write operation, got: ${entries\n .map(([verb]) => verb)\n .join(\", \")}`,\n meta: { relation: op.name, verbs: entries.map(([verb]) => verb) },\n });\n }\n return { verb: entries[0]?.[0] as string, operand: entries[0]?.[1] };\n}\n\n/** Resolve an owner-side to-one op at create time into the FK value to write. */\nasync function resolveOwnerCreateVerb(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n}): Promise<unknown> {\n const { ctx, run, op } = params;\n const { verb, operand } = singleVerb({ op });\n const [item] = toItems({ op, verb, operand });\n const spec = item as Record<string, unknown>;\n\n switch (verb) {\n case \"connect\":\n return await resolveTargetKey({ run, link: op.link, where: spec, what: `connect ${op.name}` });\n case \"create\": {\n const child = await runCreate({ ctx, run, model: op.link.target, data: spec });\n return child[op.link.childKey.name];\n }\n default: {\n // connectOrCreate\n requireShape({ op, verb, item: spec, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: op.link.target.name,\n method: \"findUnique\",\n args: { where: spec.where, select: { [op.link.childKey.name]: true } },\n });\n if (found[0] !== undefined) return found[0][op.link.childKey.name];\n const child = await runCreate({ ctx, run, model: op.link.target, data: spec.create as Record<string, unknown> });\n return child[op.link.childKey.name];\n }\n }\n}\n\n/** Every row defines the same key set — the batching precondition (see below). */\nfunction sameDefinedKeys(rows: readonly Record<string, unknown>[]): boolean {\n const first = rows[0];\n if (first === undefined) return true;\n const keyOf = (row: Record<string, unknown>): string =>\n Object.keys(row)\n .filter((key) => row[key] !== undefined)\n .sort()\n .join(\"\\u0000\");\n const expected = keyOf(first);\n for (let index = 1; index < rows.length; index++) {\n if (keyOf(rows[index] as Record<string, unknown>) !== expected) return false;\n }\n return true;\n}\n\n/** Apply a list-side / M2M op after the parent exists. */\nasync function applyChildCreateOps(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n parentKey: unknown;\n}): Promise<void> {\n const { ctx, run, op, parentKey } = params;\n const link = op.link;\n const target = link.target;\n const fk = link.childKey.name;\n\n for (const [verb, operand] of Object.entries(op.verbs)) {\n const items = toItems({ op, verb, operand });\n\n // v1 parity + rule 8: plain multi-item FK-side creates collapse into ONE\n // multi-row INSERT. Batchable only when no item needs statements of its\n // own (nested verbs) and every item writes the SAME columns — a multi-row\n // VALUES binds NULL for a missing column where per-item INSERTs would let\n // a database-side default apply, so heterogeneous shapes stay per-item.\n if (verb === \"create\" && link.kind !== \"manyToMany\" && items.length > 1) {\n const rows = items.map((item) => ({ ...item, [fk]: parentKey }));\n if (\n rows.every((row) => !hasNestedWrites({ model: target, data: row })) &&\n sameDefinedKeys(rows)\n ) {\n await run.affected({ model: target.name, method: \"createMany\", args: { data: rows } });\n continue;\n }\n }\n\n for (const item of items) {\n if (link.kind === \"manyToMany\") {\n let childKey: unknown;\n if (verb === \"connect\") {\n childKey = await resolveTargetKey({ run, link, where: item, what: `connect ${op.name}` });\n } else if (verb === \"create\") {\n const child = await runCreate({ ctx, run, model: target, data: item });\n childKey = child[link.childKey.name];\n } else {\n requireShape({ op, verb, item, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: { where: item.where, select: { [link.childKey.name]: true } },\n });\n childKey =\n found[0] !== undefined\n ? found[0][link.childKey.name]\n : (await runCreate({ ctx, run, model: target, data: item.create as Record<string, unknown> }))[\n link.childKey.name\n ];\n }\n await insertJoinRow({ run, dialect: ctx.dialect, link, parentKey, childKey });\n continue;\n }\n\n // FK-side children (oneToMany list, or non-owning oneToOne).\n if (verb === \"create\") {\n await runCreate({ ctx, run, model: target, data: { ...item, [fk]: parentKey } });\n } else if (verb === \"connect\") {\n await run.single({\n model: target.name,\n method: \"update\",\n args: { where: item, data: { [fk]: parentKey } },\n });\n } else {\n requireShape({ op, verb, item, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: { where: item.where, select: { [fk]: true } },\n });\n if (found[0] !== undefined) {\n await run.single({\n model: target.name,\n method: \"update\",\n args: { where: item.where, data: { [fk]: parentKey } },\n });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(item.create as Record<string, unknown>), [fk]: parentKey },\n });\n }\n }\n }\n }\n}\n\n/** The recursive create core — runs on an already-chosen runner (no tx management). */\nasync function runCreate(params: {\n ctx: WriteContext;\n run: StatementRunner;\n model: ModelMeta;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, run, model, data } = params;\n const { scalars, ops } = partitionData({ meta: ctx.meta, model, data, phase: \"create\" });\n\n for (const op of ops) {\n if (op.link.kind !== \"toOneOwner\") continue;\n scalars[op.link.parentKey.name] = await resolveOwnerCreateVerb({ ctx, run, op });\n }\n\n const parent = await run.single({ model: model.name, method: \"create\", args: { data: scalars } });\n\n for (const op of ops) {\n if (op.link.kind === \"toOneOwner\") continue;\n await applyChildCreateOps({ ctx, run, op, parentKey: parent[op.link.parentKey.name] });\n }\n\n return parent;\n}\n\n/** Whether a create's nested ops need more than the parent INSERT itself. */\nfunction createNeedsTransaction(params: { ops: readonly NestedOp[] }): boolean {\n const { ops } = params;\n return ops.some((op) => {\n if (op.link.kind !== \"toOneOwner\") return true;\n const { verb, operand } = singleVerb({ op });\n if (verb !== \"connect\" || !isPlainObject(operand)) return true;\n // A direct-key connect resolves without SQL — parent INSERT stays the only statement.\n const entries = Object.entries(operand).filter(([, value]) => value !== undefined);\n return !(entries.length === 1 && entries[0]?.[0] === op.link.childKey.name && isDirectValue(entries[0][1]));\n });\n}\n\n/**\n * `create` with nested relation operations. Returns the parent row as the\n * INSERT produced it (relation loading/projection are the client's follow-up).\n */\nexport async function createWithNested(params: {\n ctx: WriteContext;\n model: ModelMeta;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, model, data } = params;\n const { ops } = partitionData({ meta: ctx.meta, model, data, phase: \"create\" });\n if (createNeedsTransaction({ ops })) {\n return await ctx.transactional((run) => runCreate({ ctx, run, model, data }));\n }\n return await runCreate({ ctx, run: ctx.run, model, data });\n}\n\n// ─── UPDATE ───────────────────────────────────────────────────────\n\n/** `{ update: data }` or `{ update: { where?, data } }` both appear in the wild. */\nfunction updateDataOf(params: { op: NestedOp; operand: Record<string, unknown> }): Record<string, unknown> {\n const { op, operand } = params;\n if (\"data\" in operand && isPlainObject(operand.data)) return operand.data;\n if (\"data\" in operand) {\n throw validationError({\n message: `nested \"update\" on ${op.link.relation.model}.${op.name} needs an object \"data\"`,\n meta: { relation: op.name },\n });\n }\n return operand;\n}\n\nfunction assertOptionalFk(params: { op: NestedOp; verb: string }): void {\n const { op, verb } = params;\n if (!op.link.childKey.isOptional) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} needs an optional foreign key on ${op.link.target.name}.${op.link.childKey.name} — a required relation cannot be detached`,\n meta: { relation: op.name, verb },\n });\n }\n}\n\n/** Owner-side to-one verbs at update time → FK assignment + deferred child work. */\nasync function resolveOwnerUpdateVerb(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n pre: ClientRowLike;\n fkSets: Record<string, unknown>;\n deferred: (() => Promise<void>)[];\n}): Promise<void> {\n const { ctx, run, op, pre, fkSets, deferred } = params;\n const link = op.link;\n const fkField = link.parentKey.name;\n const current = pre[fkField];\n const { verb, operand } = singleVerb({ op });\n\n switch (verb) {\n case \"connect\": {\n const [item] = toItems({ op, verb, operand });\n fkSets[fkField] = await resolveTargetKey({\n run,\n link,\n where: item as Record<string, unknown>,\n what: `connect ${op.name}`,\n });\n return;\n }\n case \"create\": {\n const [item] = toItems({ op, verb, operand });\n const child = await runCreate({ ctx, run, model: link.target, data: item as Record<string, unknown> });\n fkSets[fkField] = child[link.childKey.name];\n return;\n }\n case \"connectOrCreate\": {\n const [item] = toItems({ op, verb, operand });\n const spec = item as Record<string, unknown>;\n requireShape({ op, verb, item: spec, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: link.target.name,\n method: \"findUnique\",\n args: { where: spec.where, select: { [link.childKey.name]: true } },\n });\n fkSets[fkField] =\n found[0] !== undefined\n ? found[0][link.childKey.name]\n : (await runCreate({ ctx, run, model: link.target, data: spec.create as Record<string, unknown> }))[\n link.childKey.name\n ];\n return;\n }\n case \"disconnect\": {\n if (operand === false) return;\n if (!link.relation.isOptional) {\n throw validationError({\n message: `nested \"disconnect\" on required relation ${link.relation.model}.${op.name} — connect a replacement instead`,\n meta: { relation: op.name },\n });\n }\n fkSets[fkField] = null;\n return;\n }\n case \"delete\": {\n if (operand === false) return;\n if (!link.relation.isOptional) {\n throw validationError({\n message: `nested \"delete\" on required relation ${link.relation.model}.${op.name} — the parent cannot exist without it`,\n meta: { relation: op.name },\n });\n }\n if (current === null || current === undefined) {\n throw notFound({\n message: `nested \"delete\" on ${link.relation.model}.${op.name}: no connected ${link.target.name}`,\n meta: { relation: op.name },\n });\n }\n fkSets[fkField] = null;\n // The child DELETE waits until the parent no longer references it.\n deferred.push(async () => {\n await run.single({\n model: link.target.name,\n method: \"delete\",\n args: { where: { [link.childKey.name]: current } },\n });\n });\n return;\n }\n case \"update\": {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"update\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n if (current === null || current === undefined) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${link.target.name}`,\n meta: { relation: op.name },\n });\n }\n deferred.push(async () => {\n await run.single({\n model: link.target.name,\n method: \"update\",\n args: { where: { [link.childKey.name]: current }, data: updateDataOf({ op, operand }) },\n });\n });\n return;\n }\n default: {\n // upsert\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"upsert\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n requireShape({ op, verb, item: operand, keys: [\"create\", \"update\"] });\n if (current === null || current === undefined) {\n const child = await runCreate({ ctx, run, model: link.target, data: operand.create as Record<string, unknown> });\n fkSets[fkField] = child[link.childKey.name];\n } else {\n deferred.push(async () => {\n await run.single({\n model: link.target.name,\n method: \"update\",\n args: { where: { [link.childKey.name]: current }, data: operand.update },\n });\n });\n }\n return;\n }\n }\n}\n\n/** Members of an M2M relation for one parent (decoded child keys). */\nasync function loadMemberKeys(params: {\n run: StatementRunner;\n ctx: WriteContext;\n link: RelationLink;\n parentKey: unknown;\n}): Promise<unknown[]> {\n const { run, ctx, link, parentKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const rows = await run.statement({\n statement: {\n kind: \"select\",\n table: { name: join.tableName },\n columns: [{ name: join.childColumn }],\n where: {\n kind: \"cmp\",\n op: \"eq\",\n column: { name: join.parentColumn },\n value: encodeValue({ dialect: ctx.dialect.name, field: link.parentKey, value: parentKey }),\n },\n },\n model: link.relation.model,\n method: \"nested.members\",\n });\n return rows.map((row) => row[join.childColumn]);\n}\n\n/** List-side (FK or M2M) verbs at update time, in declaration order. */\nasync function applyChildUpdateOps(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n parentKey: unknown;\n}): Promise<void> {\n const { ctx, run, op, parentKey } = params;\n const link = op.link;\n const target = link.target;\n const fk = link.childKey.name;\n const isM2M = link.kind === \"manyToMany\";\n\n for (const [verb, operand] of Object.entries(op.verbs)) {\n switch (verb) {\n case \"create\":\n case \"connect\":\n case \"connectOrCreate\": {\n await applyChildCreateOps({ ctx, run, op: { ...op, verbs: { [verb]: operand } }, parentKey });\n break;\n }\n\n case \"set\": {\n const items = toItems({ op, verb, operand: operand ?? [] });\n if (isM2M) {\n await deleteJoinRows({ run, dialect: ctx.dialect, link, parentKey });\n for (const item of items) {\n const childKey = await resolveTargetKey({ run, link, where: item, what: `set ${op.name}` });\n await insertJoinRow({ run, dialect: ctx.dialect, link, parentKey, childKey });\n }\n } else {\n assertOptionalFk({ op, verb });\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { [fk]: parentKey }, data: { [fk]: null } },\n });\n for (const item of items) {\n await run.single({\n model: target.name,\n method: \"update\",\n args: { where: item, data: { [fk]: parentKey } },\n });\n }\n }\n break;\n }\n\n case \"disconnect\": {\n if (link.kind === \"toOneInverse\") {\n if (operand === false) break;\n assertOptionalFk({ op, verb });\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { [fk]: parentKey }, data: { [fk]: null } },\n });\n break;\n }\n const items = toItems({ op, verb, operand });\n if (isM2M) {\n const keys: unknown[] = [];\n for (const item of items) {\n keys.push(await resolveTargetKey({ run, link, where: item, what: `disconnect ${op.name}` }));\n }\n await deleteJoinRows({ run, dialect: ctx.dialect, link, parentKey, childKeys: keys });\n } else {\n assertOptionalFk({ op, verb });\n for (const item of items) {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item, { [fk]: parentKey }] }, data: { [fk]: null } },\n });\n }\n }\n break;\n }\n\n case \"delete\": {\n if (link.kind === \"toOneInverse\") {\n if (operand === false) break;\n await run.affected({ model: target.name, method: \"deleteMany\", args: { where: { [fk]: parentKey } } });\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n if (isM2M) {\n const childKey = await resolveTargetKey({ run, link, where: item, what: `delete ${op.name}` });\n await deleteJoinRowsForChild({ run, dialect: ctx.dialect, link, childKey });\n await run.single({\n model: target.name,\n method: \"delete\",\n args: { where: { [link.childKey.name]: childKey } },\n });\n } else {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: { where: { AND: [item, { [fk]: parentKey }] } },\n });\n }\n }\n break;\n }\n\n case \"update\": {\n if (link.kind === \"toOneInverse\") {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"update\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n const affected = await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { [fk]: parentKey }, data: updateDataOf({ op, operand }) },\n });\n if (affected === 0) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${target.name}`,\n meta: { relation: op.name },\n });\n }\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n requireShape({ op, verb, item, keys: [\"where\", \"data\"] });\n if (isM2M) {\n const childKey = await resolveTargetKey({ run, link, where: item.where as Record<string, unknown>, what: `update ${op.name}` });\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n const childValue = encodeValue({ dialect: ctx.dialect.name, field: link.childKey, value: childKey });\n const isMember = members.some((member) => String(member) === String(childValue));\n if (!isMember) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: ${target.name} is not connected`,\n meta: { relation: op.name },\n });\n }\n await run.single({ model: target.name, method: \"update\", args: { where: item.where, data: item.data } });\n } else {\n const affected = await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item.where, { [fk]: parentKey }] }, data: item.data },\n });\n if (affected === 0) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${target.name} matched`,\n meta: { relation: op.name },\n });\n }\n }\n }\n break;\n }\n\n case \"updateMany\": {\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n const data = item.data;\n if (!isPlainObject(data)) {\n throw validationError({\n message: `nested \"updateMany\" on ${link.relation.model}.${op.name} needs an object \"data\"`,\n meta: { relation: op.name },\n });\n }\n if (isM2M) {\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: {\n where: { AND: [item.where ?? {}, { [link.childKey.name]: { in: members } }] },\n data,\n },\n });\n } else {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item.where ?? {}, { [fk]: parentKey }] }, data },\n });\n }\n }\n break;\n }\n\n case \"deleteMany\": {\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n if (isM2M) {\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n const victims = await run.rows({\n model: target.name,\n method: \"findMany\",\n args: {\n where: { AND: [item, { [link.childKey.name]: { in: members } }] },\n select: { [link.childKey.name]: true },\n },\n });\n for (const victim of victims) {\n await deleteJoinRowsForChild({\n run,\n dialect: ctx.dialect,\n link,\n childKey: victim[link.childKey.name],\n });\n }\n if (victims.length > 0) {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: { where: { [link.childKey.name]: { in: victims.map((victim) => victim[link.childKey.name]) } } },\n });\n }\n } else {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: { where: { AND: [item, { [fk]: parentKey }] } },\n });\n }\n }\n break;\n }\n\n default: {\n // upsert\n if (link.kind === \"toOneInverse\") {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"upsert\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n requireShape({ op, verb, item: operand, keys: [\"create\", \"update\"] });\n const existing = await run.rows({\n model: target.name,\n method: \"findFirst\",\n args: { where: { [fk]: parentKey }, select: { [fk]: true } },\n });\n if (existing[0] !== undefined) {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { [fk]: parentKey }, data: operand.update },\n });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(operand.create as Record<string, unknown>), [fk]: parentKey },\n });\n }\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n requireShape({ op, verb, item, keys: [\"where\", \"create\", \"update\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: { where: item.where, select: { [link.childKey.name]: true } },\n });\n if (found[0] !== undefined) {\n await run.single({ model: target.name, method: \"update\", args: { where: item.where, data: item.update } });\n if (isM2M) {\n await insertJoinRow({\n run,\n dialect: ctx.dialect,\n link,\n parentKey,\n childKey: found[0][link.childKey.name],\n });\n }\n } else if (isM2M) {\n const child = await runCreate({ ctx, run, model: target, data: item.create as Record<string, unknown> });\n await insertJoinRow({ run, dialect: ctx.dialect, link, parentKey, childKey: child[link.childKey.name] });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(item.create as Record<string, unknown>), [fk]: parentKey },\n });\n }\n }\n break;\n }\n }\n }\n}\n\n/**\n * `update` with nested relation operations. Always transactional (the flow is\n * multi-statement by construction). Returns the parent row after its UPDATE\n * (or the pre-read row when only children changed).\n */\nexport async function updateWithNested(params: {\n ctx: WriteContext;\n model: ModelMeta;\n where: Record<string, unknown>;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, model, where, data } = params;\n const { scalars, ops } = partitionData({ meta: ctx.meta, model, data, phase: \"update\" });\n\n return await ctx.transactional(async (run) => {\n const preRows = await run.rows({ model: model.name, method: \"findUnique\", args: { where } });\n const pre = preRows[0];\n if (pre === undefined) {\n throw notFound({\n message: `no ${model.name} record matched the where clause of update()`,\n meta: { model: model.name },\n });\n }\n\n const fkSets: Record<string, unknown> = {};\n const deferred: (() => Promise<void>)[] = [];\n for (const op of ops) {\n if (op.link.kind !== \"toOneOwner\") continue;\n await resolveOwnerUpdateVerb({ ctx, run, op, pre, fkSets, deferred });\n }\n\n const updateData = { ...scalars, ...fkSets };\n let parent: ClientRowLike = pre;\n if (Object.keys(updateData).length > 0) {\n parent = await run.single({ model: model.name, method: \"update\", args: { where, data: updateData } });\n }\n\n for (const fn of deferred) await fn();\n\n for (const op of ops) {\n if (op.link.kind === \"toOneOwner\") continue;\n await applyChildUpdateOps({ ctx, run, op, parentKey: parent[op.link.parentKey.name] });\n }\n\n return parent;\n });\n}\n",
5
+ "/**\n * Database adapter contract for VibeORM v2. FROZEN INTERFACE — the runtime is\n * driver-agnostic and talks to databases exclusively through this type;\n * adapter packages (adapter-bun, adapter-pg, adapter-pglite, adapter-sqlite,\n * adapter-mysql) implement it.\n *\n * ERROR CONTRACT: adapters never let raw driver errors escape. Every failure\n * is mapped to a VibeError with a stable code via a per-driver table\n * (unique violation → VIBE_UNIQUE_VIOLATION, FK violation → VIBE_FK_VIOLATION,\n * serialization/deadlock → VIBE_TRANSACTION, connection/other → VIBE_ADAPTER),\n * with the driver error attached as `cause`.\n */\n\nimport type { Dialect, Provider } from \"@vibeorm/schema\";\nimport type { WireFidelity } from \"@vibeorm/sql\";\n\n// ─── Transaction options ──────────────────────────────────────────\n\n/** Transaction isolation levels (mapped per dialect by the adapter). */\nexport type IsolationLevel = \"ReadCommitted\" | \"RepeatableRead\" | \"Serializable\";\n\n/**\n * What a caller REQUIRES of a transaction deadline (EPIC 6).\n *\n * - `\"between-statements\"` (the default, deliverable by every adapter): an\n * expired budget refuses the next statement, refuses the `COMMIT`, and rolls\n * back. A statement already in flight is NOT interrupted.\n * - `\"cancel-running-statements\"`: additionally hands the engine the remaining\n * budget as `statement_timeout`, so the SERVER cancels an over-long\n * statement. Postgres servers only (`adapter-pg`, `adapter-bun`); every other\n * adapter refuses the request with `VIBE_UNSUPPORTED_CAPABILITY` rather than\n * quietly delivering the weaker level.\n */\nexport type TransactionDeadlineEnforcement = \"between-statements\" | \"cancel-running-statements\";\n\n/**\n * A TOTAL wall-clock budget for one top-level transaction (EPIC 6) — distinct\n * from {@link TransactionOptions.timeout}, which bounds a single statement.\n *\n * The clock starts immediately before `BEGIN` is sent, so acquiring a\n * connection (bounded separately by the pooled adapters' own acquire timeout)\n * is NOT counted against it.\n *\n * On expiry the adapter refuses the next statement, refuses the commit and\n * rolls back, and every handle of that transaction becomes unusable. Nothing\n * is retried automatically: a callback's external side effects (an SMS, a\n * payment, a queued job) may already have happened. JavaScript cannot forcibly\n * stop a running callback — it can only refuse its later database calls.\n */\nexport type TransactionDeadline = {\n /** Whole milliseconds, greater than zero. */\n readonly totalMs: number;\n /** Defaults to `\"between-statements\"`. */\n readonly enforcement?: TransactionDeadlineEnforcement;\n};\n\n/**\n * Options for `$transaction` / `adapter.transaction`.\n *\n * `timeout` is milliseconds, enforced database-side where the engine can\n * genuinely cancel a running statement (postgres servers via `SET LOCAL\n * statement_timeout`, mysql's SELECT-only `MAX_EXECUTION_TIME`). Dialect\n * honesty: an adapter whose engine CANNOT enforce it refuses loudly instead\n * of no-opping — sqlite adapters throw `VIBE_VALIDATION` (busy_timeout only\n * bounds lock acquisition), pglite throws `VIBE_UNSUPPORTED_CAPABILITY` (the\n * WASM build accepts statement_timeout but never fires it). Its meaning is\n * UNCHANGED by the deadline work below: it is a PER-STATEMENT bound.\n *\n * `deadline` is the TOTAL budget for the whole transaction — see\n * {@link TransactionDeadline}.\n *\n * Options are TOP-LEVEL only: a nested `transaction()` call (a savepoint)\n * refuses ALL THREE fields with `VIBE_VALIDATION` on every adapter — a\n * savepoint cannot change the isolation level of the transaction it joins,\n * a nested timeout is not enforceable, and a nested deadline would need an\n * independent session setting on a connection it does not own. A nested\n * savepoint instead INHERITS the top-level deadline, by reference.\n */\nexport type TransactionOptions = {\n isolationLevel?: IsolationLevel;\n timeout?: number;\n deadline?: TransactionDeadline;\n};\n\n// ─── Budget support (declared, not guessed) ───────────────────────\n\n/**\n * How far an engine's per-statement timeout actually reaches.\n *\n * Tri-state rather than boolean because MySQL's `MAX_EXECUTION_TIME` bounds\n * **SELECT statements only** — INSERT/UPDATE/DELETE run unbounded there, so\n * declaring `true` would be exactly the silent misbehaviour constitution rule 4\n * forbids.\n */\nexport type StatementTimeoutSupport = \"all-statements\" | \"select-only\" | \"unsupported\";\n\n/** The strongest transaction-deadline guarantee an adapter can honestly deliver. */\nexport type TransactionDeadlineSupport =\n | \"cancel-running-statements\"\n | \"between-statements\"\n | \"unsupported\";\n\n/**\n * What timing budgets this adapter genuinely enforces (EPIC 6). Read it to\n * decide what to ask for; the adapter refuses anything beyond it rather than\n * degrading silently.\n */\nexport type AdapterBudgetSupport = {\n /**\n * The wait for a pooled connection is bounded. False on the single-connection\n * engines (pglite, both sqlite adapters), which have no pool to exhaust.\n */\n readonly acquireTimeout: boolean;\n /** What `TransactionOptions.timeout` reaches on this engine. */\n readonly statementTimeout: StatementTimeoutSupport;\n /** What `TransactionOptions.deadline.enforcement` may ask for on this engine. */\n readonly transactionDeadline: TransactionDeadlineSupport;\n};\n\n// ─── Results ──────────────────────────────────────────────────────\n\n/** Result of an unsafe/raw execution: rows plus affected-row count. */\nexport type QueryResult = {\n rows: Record<string, unknown>[];\n affectedRows: number;\n};\n\n// ─── The adapter ──────────────────────────────────────────────────\n\n/**\n * The primary interface every database adapter implements. Adapters own\n * connection management, statement caching, transactions (including nested →\n * savepoints), driver-specific parameter formatting and driver-error mapping.\n */\nexport type DatabaseAdapter = {\n /** SQL dialect this adapter's database speaks (selects the @vibeorm/sql dialect). */\n readonly dialect: Dialect;\n /** Concrete provider (pglite and postgresql both speak `postgres`). */\n readonly provider: Provider;\n\n /**\n * What this DRIVER actually delivers for non-list scalar columns on the\n * result path (board #30) — lets the runtime's decode plans skip decoders\n * that are provably no-ops for this driver (e.g. node-postgres already hands\n * `Date` for timestamptz and parsed values for jsonb). OPTIONAL and purely\n * an optimization contract: an adapter that declares nothing gets the full\n * idempotency-guarded decode path. Declare only what the driver verifiably\n * does; transactional adapters must carry the same declaration.\n */\n readonly wire?: WireFidelity;\n\n /**\n * Execute a parameterized query on the ORM hot path and return rows.\n * The adapter owns prepared-statement caching and ORM-path parameter\n * serialization (e.g. tagged scalar-list params vs JSON values).\n */\n execute(params: { text: string; values: unknown[] }): Promise<Record<string, unknown>[]>;\n\n /**\n * Execute a raw query (`$queryRaw*`, `$executeRaw*`, DDL). No statement\n * caching; raw-path parameter serialization (arrays pass through to the\n * driver where it supports them — see LEARNINGS: raw vs ORM paths differ).\n *\n * OMITTING `values` changes semantics on the sqlite adapters (board #31):\n * `adapter-sqlite` and `adapter-better-sqlite3` route no-`values` text\n * through the driver's multi-statement script mode (`db.run`/`exec` — the\n * shape @vibeorm/migrate emits for DDL/PRAGMA batches), which CANNOT return\n * rows: a parameterless SELECT yields `rows: []` there, while pg/pglite/\n * mysql/bun return its result set either way. Callers that want rows from a\n * single parameterless statement must pass `values: []` — the client's\n * `$queryRawUnsafe` always does. Rule of thumb: `values` present (even\n * empty) = one prepared statement with rows; `values` absent = script mode,\n * rows not guaranteed.\n */\n executeUnsafe(params: { text: string; values?: unknown[] }): Promise<QueryResult>;\n\n /**\n * ORM-path execution (same protocol and parameter serialization as\n * {@link DatabaseAdapter.execute}) that ALSO reports the affected-row count.\n *\n * WHY IT EXISTS (F01): bulk mutations need a row count, and `executeUnsafe`\n * used to be the only entry point that surfaces one — but `executeUnsafe` is\n * the RAW path, and a driver is free to implement it with client-side text\n * escaping. mysql2 does (`pool.query`), and client-side escaping cannot know\n * the server's `sql_mode`: under `NO_BACKSLASH_ESCAPES` a hostile string\n * predicate breaks out of its literal. Generated statements must never take\n * that route, so the runtime prefers this entry point and only falls back to\n * `executeUnsafe` for an adapter that does not implement it.\n *\n * OPTIONAL, so the frozen contract stays additive: an adapter whose raw path\n * already binds parameters (pg, pglite, bun, both sqlite adapters) is equally\n * safe without it. An implementation MUST bind — never interpolate, and never\n * fall back to text interpolation when preparation fails.\n */\n executeAffected?(params: { text: string; values: unknown[] }): Promise<QueryResult>;\n\n /**\n * What timing budgets this adapter actually enforces (EPIC 6).\n *\n * OPTIONAL, so the frozen contract stays additive — exactly like\n * {@link DatabaseAdapter.executeAffected}. An adapter that declares nothing\n * is treated as declaring nothing: callers must not infer support from a\n * provider name. Every adapter in this repository declares it.\n */\n readonly budgets?: AdapterBudgetSupport;\n\n /**\n * Run `fn` inside a transaction; the callback receives a transactional\n * adapter with this same interface. Nested calls create savepoints. Throwing\n * rolls back (the savepoint or the whole transaction) and rethrows.\n *\n * `options` is honored on TOP-LEVEL calls only. A NESTED call refuses any\n * `isolationLevel` or `timeout` with `VIBE_VALIDATION` (`meta.nested:\n * true`), identically on every adapter: a savepoint cannot change the\n * isolation level of the transaction it joins, and a nested timeout is not\n * enforceable. Silently dropping the option was the pre-#3 behaviour of the\n * pg/pglite/mysql/bun adapters and is forbidden by constitution rule 4.\n */\n transaction<T>(fn: (txAdapter: DatabaseAdapter) => Promise<T>, options?: TransactionOptions): Promise<T>;\n\n /** Eagerly open/verify connectivity (pool warm-up or first connection). */\n connect(): Promise<void>;\n\n /**\n * Gracefully close the connections open right now. NOT terminal: every\n * adapter constructs its pool/connection lazily, so a query issued after\n * `disconnect()` transparently opens a NEW connection and succeeds — the\n * documented contract (symmetric with lazy construction, and with Prisma's\n * `$disconnect()`-then-query semantics), not an accident.\n */\n disconnect(): Promise<void>;\n\n /**\n * Convert a JS array into the driver's preferred representation for a\n * scalar-array parameter (postgres `= ANY($n)`): PG array literal string for\n * drivers that send strings, the raw array for drivers with native support.\n */\n formatArrayParam(values: unknown[]): unknown;\n};\n\n// ─── Migration-compatible executor ────────────────────────────────\n\n/** Minimal SQL execution interface used by @vibeorm/migrate. */\nexport type SqlExecutor = (params: {\n text: string;\n values?: unknown[];\n}) => Promise<Record<string, unknown>[]>;\n\n/**\n * Bridge a DatabaseAdapter to the migrate package's SqlExecutor shape.\n *\n * NO SESSION AFFINITY — this bridge pins nothing. Every call goes through\n * `adapter.executeUnsafe`, which a pooled adapter runs on whatever connection\n * the pool hands out. @vibeorm/migrate's executor contract requires the\n * opposite (`packages/migrate/src/types.ts`): its session-scoped statements\n * (`BEGIN`/`COMMIT`, `PRAGMA foreign_keys`, `pg_advisory_lock` / `GET_LOCK`)\n * must all reach ONE session. pglite and sqlite satisfy that by construction;\n * a POOLED adapter (pg, mysql, bun) used for migrate must be constructed with\n * a single-connection pool (`max: 1`; mysql `connectionLimit: 1`), as the\n * `vibeorm` CLI does, or the caller must pin a connection another way —\n * otherwise the advisory lock is taken on one connection while each\n * migration's `BEGIN` runs on another, and a driver that reaps the idle\n * lock-holding connection (node-postgres does, after 10s by default) releases\n * the migration lock mid-run, silently.\n *\n * RE-ENTRANCY HAZARD: `pg_advisory_lock` is re-entrant per SESSION, so two\n * concurrent `applyMigrations` calls sharing one adapter (hence one pool) can\n * both \"acquire\" it on the same underlying connection and get zero mutual\n * exclusion — separate CLI processes never collide this way, a programmatic\n * caller sharing one adapter can.\n */\nexport function toSqlExecutor(params: { adapter: DatabaseAdapter }): SqlExecutor {\n const { adapter } = params;\n return async (queryParams) => {\n const result = await adapter.executeUnsafe({\n text: queryParams.text,\n values: queryParams.values,\n });\n return result.rows;\n };\n}\n",
6
+ "/**\n * `dbNow()` — the DATABASE clock as a value.\n *\n * Leases, TTLs and expiry comparisons must trust the database's clock, never\n * the process's (\"a process that slept past its own expiry cannot argue with\n * this comparison\"). The sentinel rides DateTime positions:\n *\n * - create/update data values: `data: { expiresAt: dbNow({ plusSeconds: 30 }) }`\n * - DateTime filters: `where: { expiresAt: { lt: dbNow() } }`\n *\n * and compiles to the dialect's own expression (`now()`, `NOW(6)`, an\n * ISO-8601 `strftime` on sqlite) — the offset binds as a parameter, the\n * expression is never string-built from caller input.\n *\n * Deliberately NOT a generic SQL escape hatch: the closed shape keeps every\n * rendering reviewable in the SQL catalog (constitution rule 3).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** The database-clock sentinel produced by {@link dbNow}. */\nexport type DbNow = {\n readonly __vibeDbNow: true;\n /** Seconds added to the database's now() (fractional OK; negative = past). */\n readonly offsetSeconds: number;\n};\n\n/**\n * Build a database-clock sentinel for DateTime data values and filters.\n *\n * @example Lease acquisition on the database's clock\n * ```ts\n * await tx.lease.update({\n * where: { id },\n * data: { expiresAt: dbNow({ plusSeconds: 30 }) },\n * });\n * const expired = await db.lease.findMany({ where: { expiresAt: { lt: dbNow() } } });\n * ```\n */\nexport function dbNow(options?: { readonly plusSeconds?: number }): DbNow {\n const offset = options?.plusSeconds ?? 0;\n if (typeof offset !== \"number\" || !Number.isFinite(offset)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `dbNow plusSeconds must be a finite number of seconds (fractional is fine), got ${String(offset)}`,\n meta: { plusSeconds: offset },\n });\n }\n return { __vibeDbNow: true, offsetSeconds: offset };\n}\n\n/** Narrow a value to the {@link dbNow} sentinel (exact two-key shape). */\nexport function isDbNow(value: unknown): value is DbNow {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(\"__vibeDbNow\") || !keys.includes(\"offsetSeconds\")) {\n return false;\n }\n const candidate = value as { __vibeDbNow: unknown; offsetSeconds: unknown };\n return (\n candidate.__vibeDbNow === true &&\n typeof candidate.offsetSeconds === \"number\" &&\n Number.isFinite(candidate.offsetSeconds)\n );\n}\n",
7
+ "/**\n * Runtime model metadata: the pre-resolved view of the Schema IR the query\n * builder and client run on.\n *\n * Built once per client (`buildRuntimeMeta`), then read-only. Everything the\n * hot path needs is precomputed here — column names, field lookup maps, primary\n * keys — so no query ever walks the IR. Relations are carried verbatim: the P2\n * core slice does not load them, P3 does.\n *\n * Also the home of app-side default generation (uuid/cuid/nanoid/ulid/now),\n * which is dialect-free by design: the id exists before the INSERT, which is\n * what lets dialects without RETURNING re-select the row they just wrote.\n */\n\nimport { VibeError, enumStorageOf, isEnumType, validateComputedConfig } from \"@vibeorm/schema\";\nimport type {\n ComputedConfig,\n ComputedFieldSpec,\n DefaultValueIR,\n EnumIR,\n EnumStorage,\n FieldIR,\n FieldType,\n ModelIR,\n RelationIR,\n ScalarType,\n SchemaIR,\n} from \"@vibeorm/schema\";\nimport { enumMembershipCodec } from \"@vibeorm/sql\";\nimport type { ScalarCodec, SqlExpr } from \"@vibeorm/sql\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** Where a field's default value is produced. */\nexport type DefaultOrigin = \"app\" | \"database\" | \"none\";\n\n/** A scalar or enum column, resolved for the runtime. */\nexport type FieldMeta = {\n /** Client-facing field name. */\n readonly name: string;\n /** Database column name (`dbName ?? name`). */\n readonly columnName: string;\n /** Explicit column collation (@collation, board #36) — mysql insensitive-filter rendering reads it. */\n readonly collation?: string;\n /**\n * The declared `@db.*` native column type, verbatim as Prisma writes it\n * (`Uuid`, `VarChar(191)`, `Char(10)`, `Decimal(10, 2)`), or `undefined`\n * when the field takes the dialect's canonical mapping.\n *\n * Carried because the physical type decides value equality on its own,\n * before any collation: `char(n)` pads, `uuid` folds case, `timestamp(0)`\n * truncates, `real` narrows a Float. `upsertMany`'s duplicate rule reads it\n * (`conflictKeyComparisonOf` in bulk-upsert.ts). It is a schema claim, not a\n * reading of the live column.\n */\n readonly nativeType?: string;\n readonly type: FieldType;\n /** The scalar type, or `null` when the field is an enum reference. */\n readonly scalarType: ScalarType | null;\n /** The enum name, or `null` when the field is a scalar. */\n readonly enumName: string | null;\n /** Physical enum storage, or `null` for ordinary scalar fields. */\n readonly enumStorage: EnumStorage | null;\n /** Precomputed membership codec for string-backed enums only. */\n readonly enumCodec: ScalarCodec | null;\n readonly isList: boolean;\n readonly isOptional: boolean;\n readonly isId: boolean;\n readonly isUnique: boolean;\n readonly isUpdatedAt: boolean;\n readonly default: DefaultValueIR | null;\n /**\n * `\"app\"` — the runtime generates the value and sends it (uuid/cuid/nanoid/\n * ulid/now). `\"database\"` — the column's DEFAULT clause applies and the field\n * is omitted from INSERTs (autoincrement, dbgenerated, literal, enum value).\n */\n readonly defaultOrigin: DefaultOrigin;\n};\n\n/** One computed field, resolved for the runtime (config-declared, see @vibeorm/schema computed.ts). */\nexport type ComputedFieldMeta = {\n readonly name: string;\n /** The declared TypeScript type (informational at runtime; the generator wrote it into the .d.ts). */\n readonly type: string;\n /** Scalar fields the compute reads — fetched with the computed field, stripped unless selected. */\n readonly needs: readonly string[];\n readonly compute: (row: Record<string, unknown>) => unknown;\n};\n\n/** A model, resolved for the runtime. */\nexport type ModelMeta = {\n /** IR model name, e.g. `\"User\"`. */\n readonly name: string;\n /** Delegate key on the client, e.g. `\"user\"`. */\n readonly clientName: string;\n /** Table name (`dbName ?? name`). */\n readonly tableName: string;\n readonly fields: readonly FieldMeta[];\n readonly fieldByName: ReadonlyMap<string, FieldMeta>;\n /** Reverse map for row materialization (driver rows are keyed by column). */\n readonly fieldByColumn: ReadonlyMap<string, FieldMeta>;\n /** Primary-key fields: the single `@id` field, or the `@@id` fields in order. */\n readonly primaryKey: readonly FieldMeta[];\n /** Fields that identify a row on their own (`@id` or `@unique`). */\n readonly uniqueFields: readonly FieldMeta[];\n /**\n * COMPOSITE ways to address one row, keyed exactly like the generated\n * `…WhereUniqueInput` property — the declared client selector name\n * (`@@unique`/`@@id` `name:`) when present, else member field names joined\n * with `_` (`projectId_userId`). The composite `@@id` comes first, then\n * every multi-field `@@unique`, in schema order. Empty for models without\n * one.\n */\n readonly compoundUniques: ReadonlyMap<string, UniqueGroupMeta>;\n /**\n * Single-field unique INDEXES that are addressable but not folded into\n * `field.isUnique` (today: NULLS NOT DISTINCT singles) — mirrors the\n * generator's WhereUniqueInput surface.\n */\n readonly singleIndexUniques: readonly UniqueGroupMeta[];\n /** Carried verbatim from the IR — consumed by relation loading in P3. */\n readonly relations: readonly RelationIR[];\n readonly relationByName: ReadonlyMap<string, RelationIR>;\n readonly isView: boolean;\n /** Row-scoping policy (@@policy) — the client fails closed on it ($withPolicy). */\n readonly policy?: { readonly field: string; readonly context: string };\n /** Computed fields configured for this model, or `null` (the common case). */\n readonly computed: ReadonlyMap<string, ComputedFieldMeta> | null;\n};\n\n/**\n * A pre-bound extension where-operator: compiles one use (`{ similarTo: … }`)\n * into a SqlExpr fragment. Built by `buildExtensionOperatorMap` in\n * extensions.ts with dialect/provider/options already curried in.\n */\nexport type ExtensionOperatorFn = (params: {\n /** Identifier path of the column (qualified when inside a subquery). */\n readonly column: readonly string[];\n readonly operand: unknown;\n readonly model: string;\n readonly field: string;\n}) => SqlExpr;\n\n/**\n * One addressable unique group beyond the flat `@id`/`@unique` fields: a\n * composite `@@id`/`@@unique`, or a single-field unique INDEX that does not\n * fold into `field.isUnique` (today: `nullsNotDistinct` uniques). Under\n * NULLS NOT DISTINCT the database keeps at most one row per key INCLUDING\n * null dimensions, so a `null` member addresses exactly one row — those\n * groups accept `null` where members; default (nulls-distinct) groups never\n * do.\n */\nexport type UniqueGroupMeta = {\n readonly fields: readonly FieldMeta[];\n readonly nullsNotDistinct: boolean;\n};\n\n/** All runtime metadata for one schema. */\nexport type RuntimeMeta = {\n readonly models: readonly ModelMeta[];\n /** Keyed by BOTH camelCase client name (`user`) and model name (`User`). */\n readonly modelByName: ReadonlyMap<string, ModelMeta>;\n /** Enum name → its values, for validation and codec decisions. */\n readonly enums: ReadonlyMap<string, readonly string[]>;\n /**\n * Extension where-operators (extension sql plane), keyed by operator name.\n * Rides on the meta so the WHERE compiler reaches it at every site without\n * threading a parameter through the hot path.\n */\n readonly extensionOperators?: ReadonlyMap<string, ExtensionOperatorFn>;\n};\n\n// ─── Naming ───────────────────────────────────────────────────────\n\n/**\n * Delegate key for a model name: the first character lowercased, nothing else\n * (the Prisma convention — `User` → `user`, `URLMap` → `uRLMap`). Keeping the\n * rest untouched makes the mapping unambiguous and reversible.\n */\nexport function toClientName(params: { name: string }): string {\n const { name } = params;\n if (name.length === 0) return name;\n return name.charAt(0).toLowerCase() + name.slice(1);\n}\n\n// ─── Id generators (dialect-free, no dependencies) ────────────────\n\nconst BASE36_ALPHABET: string = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n/** Largest multiple of 36 below 256 — bytes at or above it are rejected, not folded. */\nconst BASE36_LIMIT: number = 252;\n\nfunction randomBase36(params: { length: number }): string {\n const { length } = params;\n let out = \"\";\n while (out.length < length) {\n const bytes = new Uint8Array(length - out.length + 8);\n crypto.getRandomValues(bytes);\n for (const byte of bytes) {\n if (byte >= BASE36_LIMIT) continue;\n out += BASE36_ALPHABET[byte % 36];\n if (out.length === length) break;\n }\n }\n return out;\n}\n\n/** RFC 4122 v4 UUID. */\nexport function generateUuid(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Collision-resistant, sortable-ish id in the CUID spirit: `\"c\"` + a base-36\n * millisecond timestamp + 16 random base-36 characters. Starts with a letter so\n * it is safe as an HTML id and in every database identifier context.\n */\nexport function generateCuid(): string {\n return `c${Date.now().toString(36)}${randomBase36({ length: 16 })}`;\n}\n\nconst NANOID_ALPHABET: string = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nconst NANOID_LENGTH: number = 21;\n\n/** 21-character NanoID over the standard URL-safe alphabet (64 chars, unbiased 6-bit mask). */\nexport function generateNanoid(): string {\n const bytes = new Uint8Array(NANOID_LENGTH);\n crypto.getRandomValues(bytes);\n let out = \"\";\n for (const byte of bytes) {\n out += NANOID_ALPHABET[byte & 63];\n }\n return out;\n}\n\nconst ULID_ALPHABET: string = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\n/**\n * ULID: 10 characters of millisecond timestamp + 16 of randomness, Crockford\n * base32, lexicographically sortable by creation time. 256 % 32 === 0, so the\n * byte-to-symbol fold is unbiased.\n */\nexport function generateUlid(): string {\n let remaining = Date.now();\n let time = \"\";\n for (let i = 0; i < 10; i++) {\n time = ULID_ALPHABET[remaining % 32] + time;\n remaining = Math.floor(remaining / 32);\n }\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n let random = \"\";\n for (const byte of bytes) {\n random += ULID_ALPHABET[byte % 32];\n }\n return time + random;\n}\n\n/**\n * The value the runtime sends for an app-side default, or `undefined` when the\n * database owns it (autoincrement, dbgenerated, literal, enum value — those\n * ride the column's DEFAULT clause so the database stays the single source of\n * truth for them).\n */\nexport function generateDefaultValue(params: { spec: DefaultValueIR }): unknown {\n const { spec } = params;\n switch (spec.kind) {\n case \"uuid\":\n return generateUuid();\n case \"cuid\":\n return generateCuid();\n case \"nanoid\":\n return generateNanoid();\n case \"ulid\":\n return generateUlid();\n case \"now\":\n return new Date();\n case \"autoincrement\":\n case \"dbgenerated\":\n case \"literal\":\n case \"enumValue\":\n return undefined;\n }\n}\n\nfunction defaultOriginOf(params: { spec: DefaultValueIR | undefined }): DefaultOrigin {\n const { spec } = params;\n if (spec === undefined) return \"none\";\n switch (spec.kind) {\n case \"uuid\":\n case \"cuid\":\n case \"nanoid\":\n case \"ulid\":\n case \"now\":\n return \"app\";\n default:\n return \"database\";\n }\n}\n\n// ─── Building ─────────────────────────────────────────────────────\n\nfunction buildFieldMeta(params: { model: string; field: FieldIR; enums: ReadonlyMap<string, EnumIR> }): FieldMeta {\n // (collation spread below rides the same shape as the other optionals)\n const { model, field, enums } = params;\n const enumName = isEnumType(field.type) ? field.type.enum : null;\n const enumDef = enumName === null ? undefined : enums.get(enumName);\n const enumStorage = enumName === null ? null : enumStorageOf({ enumDef: enumDef ?? {} });\n return {\n name: field.name,\n columnName: field.dbName ?? field.name,\n ...(field.collation === undefined ? {} : { collation: field.collation }),\n ...(field.nativeType === undefined ? {} : { nativeType: field.nativeType }),\n type: field.type,\n scalarType: enumName === null ? (field.type as ScalarType) : null,\n enumName,\n enumStorage,\n enumCodec: enumStorage === \"string\" && enumDef !== undefined\n ? enumMembershipCodec({ model, field: field.name, enum: enumDef.name, members: enumDef.values })\n : null,\n isList: field.isList,\n isOptional: field.isOptional,\n isId: field.isId,\n isUnique: field.isUnique,\n isUpdatedAt: field.isUpdatedAt,\n default: field.default ?? null,\n defaultOrigin: defaultOriginOf({ spec: field.default }),\n };\n}\n\nfunction buildModelMeta(params: {\n model: ModelIR;\n enums: ReadonlyMap<string, EnumIR>;\n computed?: Readonly<Record<string, ComputedFieldSpec>>;\n}): ModelMeta {\n const { model } = params;\n // `Unsupported(\"...\")` columns stay in the IR for schema fidelity (convert,\n // migrate DDL) but are excluded from the queryable surface entirely: never\n // projected, never writable — using one in a query reports \"unknown field\"\n // (VIBE_VALIDATION). Reviewed as ruling F3.\n const fields = model.fields\n .filter((field) => field.isUnsupported !== true)\n .map((field) => buildFieldMeta({ model: model.name, field, enums: params.enums }));\n const fieldByName = new Map(fields.map((field) => [field.name, field]));\n const fieldByColumn = new Map(fields.map((field) => [field.columnName, field]));\n\n const primaryKey: FieldMeta[] = [];\n if (model.primaryKey !== undefined) {\n for (const name of model.primaryKey.fields) {\n const field = fieldByName.get(name);\n if (field === undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `model \"${model.name}\" declares composite primary-key field \"${name}\", which does not exist`,\n meta: { model: model.name, field: name },\n });\n }\n primaryKey.push(field);\n }\n } else {\n primaryKey.push(...fields.filter((field) => field.isId));\n }\n\n // Compound keys mirror the generator's `buildUniques` rule exactly, so the\n // runtime accepts every member the generated WhereUniqueInput offers.\n const compoundUniques = new Map<string, UniqueGroupMeta>();\n const singleIndexUniques: UniqueGroupMeta[] = [];\n const resolveFields = (names: readonly string[]): FieldMeta[] | null => {\n const resolved: FieldMeta[] = [];\n for (const name of names) {\n const field = fieldByName.get(name);\n // An Unsupported() column inside the key makes it unaddressable.\n if (field === undefined) return null;\n resolved.push(field);\n }\n return resolved;\n };\n const addCompound = (names: readonly string[], nullsNotDistinct: boolean, clientName?: string): void => {\n if (names.length < 2) return;\n const key = clientName ?? names.join(\"_\");\n if (compoundUniques.has(key)) return;\n const resolved = resolveFields(names);\n if (resolved === null) return;\n compoundUniques.set(key, { fields: resolved, nullsNotDistinct });\n };\n if (primaryKey.length > 1) {\n addCompound(primaryKey.map((field) => field.name), false, model.primaryKey?.clientName);\n } else {\n // A SINGLE-column block key (`@@id([sessionId])`) lives on the model, not\n // on the field, so `field.isId` stays false and `uniqueFields` misses it.\n // It addresses a row exactly like `@id`; register it as a single-column\n // unique group so where/cursor/upsert accept it. Mirrors the generator's\n // `buildUniques` — without this the two sides disagree and the model is\n // unaddressable at BOTH layers.\n const only = primaryKey[0];\n if (only !== undefined && !only.isId && !only.isUnique) {\n singleIndexUniques.push({ fields: [only], nullsNotDistinct: false });\n }\n }\n for (const index of model.indexes) {\n // A PARTIAL unique guards only the rows its predicate covers — it cannot\n // address a row and must not join the unique-where surface.\n if (index.kind !== \"unique\" || index.where !== undefined) continue;\n const names = index.fields.map((entry) => entry.name);\n const nullsNotDistinct = index.nullsNotDistinct === true;\n if (names.length === 1) {\n const field = resolveFields(names)?.[0];\n // Plain single-column uniques fold into field.isUnique upstream; what\n // remains here (NND singles) joins the addressable surface separately.\n if (field === undefined || field.isId || field.isUnique) continue;\n if (singleIndexUniques.some((entry) => entry.fields[0]?.name === field.name)) continue;\n singleIndexUniques.push({ fields: [field], nullsNotDistinct });\n } else {\n addCompound(names, nullsNotDistinct, index.clientName);\n }\n }\n\n const computedSpecs = params.computed;\n const computed =\n computedSpecs === undefined || Object.keys(computedSpecs).length === 0\n ? null\n : new Map(\n Object.entries(computedSpecs).map(([name, spec]): [string, ComputedFieldMeta] => [\n name,\n { name, type: spec.type, needs: spec.needs, compute: spec.compute },\n ]),\n );\n\n return {\n name: model.name,\n clientName: toClientName({ name: model.name }),\n tableName: model.dbName ?? model.name,\n fields,\n fieldByName,\n fieldByColumn,\n primaryKey,\n uniqueFields: fields.filter((field) => field.isId || field.isUnique),\n compoundUniques,\n singleIndexUniques,\n relations: model.relations,\n relationByName: new Map(model.relations.map((relation) => [relation.name, relation])),\n ...(model.policy === undefined ? {} : { policy: model.policy }),\n isView: model.isView,\n computed,\n };\n}\n\n/** Resolve a whole schema into the runtime's read-only metadata. */\nexport function buildRuntimeMeta(params: { schema: SchemaIR; computed?: ComputedConfig }): RuntimeMeta {\n const { schema, computed } = params;\n if (computed !== undefined && Object.keys(computed).length > 0) {\n // Full structural validation (VIBE_CONFIG, every problem at once) — the\n // same rule the generator applies, so dynamic-client users get it too.\n validateComputedConfig({ schema, computed });\n }\n const enums = new Map(schema.enums.map((enumDef) => [enumDef.name, enumDef]));\n const models = schema.models.map((model) => {\n const specs = computed?.[model.name];\n return buildModelMeta({ model, enums, ...(specs === undefined ? {} : { computed: specs }) });\n });\n\n const modelByName = new Map<string, ModelMeta>();\n for (const model of models) {\n modelByName.set(model.name, model);\n modelByName.set(model.clientName, model);\n }\n\n return {\n models,\n modelByName,\n enums: new Map(schema.enums.map((declared) => [declared.name, declared.values])),\n };\n}\n\n// ─── Lookups ──────────────────────────────────────────────────────\n\n/** Look a model up by client name or model name; unknown names are a caller error. */\nexport function getModelMeta(params: { meta: RuntimeMeta; model: string }): ModelMeta {\n const { meta, model } = params;\n const found = meta.modelByName.get(model);\n if (found === undefined) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown model \"${model}\"`,\n meta: { model, known: [...new Set(meta.models.map((entry) => entry.name))] },\n });\n }\n return found;\n}\n\n/** Look a field up on a model; unknown names are a caller error naming the field. */\nexport function getFieldMeta(params: { model: ModelMeta; field: string; context: string }): FieldMeta {\n const { model, field, context } = params;\n const found = model.fieldByName.get(field);\n if (found === undefined) {\n if (model.computed !== null && model.computed.has(field)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${field}\" on model \"${model.name}\" is a computed field — computed fields appear in results (select/omit) only, not in ${context}`,\n meta: { model: model.name, field, context, computed: true },\n });\n }\n if (model.relationByName.has(field)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${field}\" on model \"${model.name}\" is a relation — not valid in ${context} here (relation writes use nested-write verbs, relation reads use select/include)`,\n meta: { model: model.name, field, context },\n });\n }\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown field \"${field}\" on model \"${model.name}\" in ${context}`,\n meta: { model: model.name, field, context },\n });\n }\n return found;\n}\n",
8
+ "/**\n * The codec entry points — constitution rule 6.\n *\n * The PURE per-dialect tables (dialect × scalar type) live in @vibeorm/sql\n * (`codecs.ts` there) and are re-exported here so consumers keep one import\n * site. This module owns the FieldMeta-aware entry points: list handling,\n * enum-to-String routing and row materialization.\n *\n * The two rules that make it work:\n * - EVERY parameter bound by the query builder passes through `encodeValue`.\n * - EVERY row materialized by the client passes through `decodeRow`/\n * `decodeRows` — including every relation-loaded child row, at every\n * materialization point (the v1 lesson: BigInt-as-string and enum-array\n * bugs came from children skipping coercion).\n */\n\nimport { VibeError, isEnumType } from \"@vibeorm/schema\";\nimport type { Dialect, FieldType } from \"@vibeorm/schema\";\nimport { DIALECT_CODECS, decodeIsNoop } from \"@vibeorm/sql\";\nimport type { ScalarCodec, WireFidelity } from \"@vibeorm/sql\";\nimport type { FieldMeta, ModelMeta } from \"./model-meta.ts\";\n\n// ─── Pure tables (defined in @vibeorm/sql, re-exported) ───────────\n\nexport {\n DIALECT_CODECS,\n MYSQL_CODECS,\n POSTGRES_CODECS,\n SQLITE_CODECS,\n decodeIsNoop,\n} from \"@vibeorm/sql\";\nexport type { CodecTable, ScalarCodec, WireFidelity } from \"@vibeorm/sql\";\n\n// ─── Entry points ─────────────────────────────────────────────────\n\n/** The codec for a field type on a dialect. Enum references use the String codec. */\nexport function getCodec(params: { dialect: Dialect; type: FieldType }): ScalarCodec {\n const { dialect, type } = params;\n const table = DIALECT_CODECS[dialect];\n return isEnumType(type) ? table.String : table[type];\n}\n\n/** Field-aware routing: membership survives identity pruning despite String transport. */\nfunction fieldCodec(params: { dialect: Dialect; field: FieldMeta }): ScalarCodec {\n const { dialect, field } = params;\n return field.enumCodec ?? getCodec({ dialect, type: field.type });\n}\n\n// ─── postgres enum arrays (the LEARNINGS enum-array lesson) ───────\n\n/**\n * Enum ARRAY columns are the one place no postgres driver can help: none of\n * them knows a user-defined enum's array type OID. A JS array therefore reaches\n * the server as `A,B` (`array_in` rejects it: \"malformed array literal\") and the\n * column comes back as the raw literal `{A,B}` instead of an array. Both\n * directions go through the literal, here in the codec table — the only place\n * coercion may live (rule 6). Built-in scalar arrays (`text[]`, `int4[]`, …) have\n * well-known OIDs and are left to the driver.\n */\nfunction isPostgresEnumList(params: { dialect: Dialect; field: FieldMeta }): boolean {\n const { dialect, field } = params;\n return dialect === \"postgres\" && field.isList && field.enumStorage === \"database\";\n}\n\n/** Elements that must be double-quoted inside a postgres array literal. */\nconst PG_ARRAY_QUOTE: RegExp = /^$|^NULL$|[{},\"\\\\\\s]/i;\n\n/** Render encoded elements as a postgres array literal (`{A,\"B,C\",NULL}`). */\nfunction toPgArrayLiteral(values: readonly unknown[]): string {\n const parts = values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n const text = String(value);\n return PG_ARRAY_QUOTE.test(text) ? `\"${text.replace(/[\"\\\\]/g, (char) => `\\\\${char}`)}\"` : text;\n });\n return `{${parts.join(\",\")}}`;\n}\n\n/**\n * Parse a postgres array literal into its elements, or `null` when the text is\n * not a literal (defensive — the value then passes through untouched).\n * Unquoted `NULL` is SQL NULL; postgres quotes any element that could be\n * mistaken for it.\n */\nfunction parsePgArrayLiteral(literal: string): (string | null)[] | null {\n if (literal.length < 2 || !literal.startsWith(\"{\") || !literal.endsWith(\"}\")) return null;\n const inner = literal.slice(1, -1);\n if (inner.length === 0) return [];\n const out: (string | null)[] = [];\n let index = 0;\n while (index < inner.length) {\n if (inner[index] === '\"') {\n let text = \"\";\n index++;\n while (index < inner.length) {\n const char = inner[index] as string;\n if (char === \"\\\\\") {\n text += inner[index + 1] ?? \"\";\n index += 2;\n continue;\n }\n index++;\n if (char === '\"') break;\n text += char;\n }\n out.push(text);\n } else {\n let text = \"\";\n while (index < inner.length && inner[index] !== \",\") {\n text += inner[index];\n index++;\n }\n out.push(text === \"NULL\" ? null : text);\n }\n if (inner[index] === \",\") index++;\n }\n return out;\n}\n\n/**\n * Encode one value for parameter binding. `null`/`undefined` pass through\n * untouched (SQL NULL). List fields encode element-wise; the adapter's\n * `formatArrayParam` then owns the array's wire representation — except for\n * postgres ENUM arrays, which become an array literal here (no driver can\n * serialize them, see {@link isPostgresEnumList}).\n */\nexport function encodeValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n const codec = fieldCodec({ dialect, field });\n if (field.isList && Array.isArray(value)) {\n const elements = value.map((element) =>\n element === null || element === undefined ? element : codec.encode(element),\n );\n return isPostgresEnumList({ dialect, field }) ? toPgArrayLiteral(elements) : elements;\n }\n return codec.encode(value);\n}\n\n/**\n * Decode one driver value. List fields decode element-wise.\n *\n * postgres returns ENUM arrays as a raw array literal string, because no driver\n * knows a user-defined enum's array OID (LEARNINGS.md) — that literal is parsed\n * here, next to the other coercion rules.\n */\nexport function decodeValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n const codec = fieldCodec({ dialect, field });\n if (typeof value === \"string\" && isPostgresEnumList({ dialect, field })) {\n const parsed = parsePgArrayLiteral(value);\n if (parsed !== null) return parsed;\n }\n if (field.isList && Array.isArray(value)) {\n return value.map((element) => (element === null || element === undefined ? element : codec.decode(element)));\n }\n return codec.decode(value);\n}\n\n// ─── Filter transport (SQL review B4/M5) ───────────────────\n\n/** Decimal literal: optional sign, digits with optional fraction, optional exponent. */\nconst DECIMAL_LITERAL: RegExp = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A Decimal operand as a REAL-comparable number — sqlite's compare form.\n * SQLITE-3 (review round 2): `Number()` accepts \"\" (→ 0), whitespace and hex\n * (\"0x10\" → 16) — silent constants on sqlite where postgres raises 22P02.\n * Only canonical decimal literals pass (surrounding whitespace tolerated —\n * postgres numeric input trims it too); everything else is VIBE_VALIDATION.\n */\nfunction toRealNumber(params: { field: FieldMeta; value: unknown }): number {\n const { field, value } = params;\n const refuse = (): never => {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${String(value)}\" is not a numeric value for the Decimal field \"${field.name}\"`,\n meta: { field: field.name, value },\n });\n };\n if (typeof value === \"number\") return Number.isFinite(value) ? value : refuse();\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed !== \"\" && DECIMAL_LITERAL.test(trimmed)) {\n const parsed = Number(trimmed);\n if (Number.isFinite(parsed)) return parsed;\n }\n return refuse();\n }\n return refuse();\n}\n\n/**\n * Encode one COMPARISON operand (WHERE / cursor bounds). Identical to\n * {@link encodeValue} everywhere except sqlite Decimal (SQL review B4):\n * Decimal STORES as exact TEXT there, but text comparison is lexicographic —\n * so every compare site casts the column (`CAST(col AS REAL)`) and binds the\n * operand as a NUMBER. Comparison precision is float64-bounded on sqlite\n * (docs/dialects.md); storage and read-back stay exact.\n */\nexport function encodeFilterValue(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n if (dialect === \"sqlite\" && field.scalarType === \"Decimal\" && !field.isList) {\n return toRealNumber({ field, value });\n }\n return encodeValue({ dialect, field, value });\n}\n\n/**\n * Encode one AGGREGATE-predicate operand (HAVING). On sqlite an aggregate\n * expression has NO column affinity, so a TEXT operand never converts and the\n * predicate is constant-false (SQL review M5, live-proven) — operands bind in\n * raw numeric form there: Decimal as a number (the aggregate is over\n * `CAST(col AS REAL)`), BigInt as a bigint (bun:sqlite binds int64 natively).\n * Other dialects keep the field codec's wire form.\n */\nexport function encodeAggregateOperand(params: { dialect: Dialect; field: FieldMeta; value: unknown }): unknown {\n const { dialect, field, value } = params;\n if (value === null || value === undefined) return value;\n if (dialect === \"sqlite\") {\n if (field.scalarType === \"Decimal\") return toRealNumber({ field, value });\n if (field.scalarType === \"BigInt\") {\n if (typeof value === \"bigint\" || typeof value === \"number\") return value;\n return BigInt(String(value));\n }\n return encodeValue({ dialect, field, value });\n }\n return encodeValue({ dialect, field, value });\n}\n\n// ─── Decode plans (per model × dialect, precomputed) ──────────────\n\n/** Decode one non-null driver value (list handling prebound). */\ntype RowDecoder = (value: unknown) => unknown;\n\ntype DecodePlanEntry = {\n readonly name: string;\n /** `null` = the codec is a no-op for this dialect — copy verbatim. */\n readonly decode: RowDecoder | null;\n};\n\ntype DecodePlan = {\n readonly byColumn: ReadonlyMap<string, DecodePlanEntry>;\n /**\n * Non-null when NO column is renamed (columnName === name for every field):\n * rows can then be decoded by touching only these columns, in place.\n */\n readonly inPlace: readonly { readonly column: string; readonly decode: RowDecoder }[] | null;\n};\n\n/** The shared `identity` fn (one reference across all passthrough codecs). */\nconst IDENTITY_DECODE: RowDecoder = DIALECT_CODECS.postgres.String.decode;\nconst IDENTITY_ENCODE: (value: unknown) => unknown = DIALECT_CODECS.postgres.String.encode;\n\n/**\n * The prebound encoder for one field on one dialect, or `null` when its codec\n * encode is the identity. Mirrors `encodeValue` exactly (see `fieldDecoder`).\n */\nexport function fieldEncoder(params: { dialect: Dialect; field: FieldMeta }): RowDecoder | null {\n const { dialect, field } = params;\n const encode = fieldCodec({ dialect, field }).encode;\n // postgres enum arrays go OUT as a PG array literal — never the identity,\n // even though the element codec (String) is one. Mirrors `encodeValue`\n // exactly, the way `fieldDecoder` mirrors `decodeValue` on the way in —\n // rule 6: the two entry points must never disagree about a wire form.\n if (isPostgresEnumList({ dialect, field })) {\n return (value) => encodeValue({ dialect, field, value });\n }\n if (encode === IDENTITY_ENCODE) return null;\n if (field.isList) {\n return (value) =>\n Array.isArray(value)\n ? value.map((element) => (element === null || element === undefined ? element : encode(element)))\n : encode(value);\n }\n return encode;\n}\n\n/**\n * Per-model plan cache, keyed by dialect × wire fidelity ({@link wirePlanKey})\n * — one process can hold clients over different adapters of the same dialect\n * with different declarations (e.g. adapter-pg and adapter-bun).\n */\nconst decodePlanCache = new WeakMap<ModelMeta, Map<string, DecodePlan>>();\n\n/** Canonical cache-key fragment for a wire declaration (adapter constants only — tiny domain). */\nfunction wirePlanKey(wire: WireFidelity | undefined): string {\n if (wire === undefined) return \"-\";\n return `${wire.dateTime ?? \"?\"}|${wire.json ?? \"?\"}|${wire.numbers ?? \"?\"}`;\n}\n\n/**\n * The prebound decoder for one field on one dialect, or `null` when its codec\n * decode is the identity (nothing to do). Mirrors `decodeValue` exactly:\n * elements of a list decode element-wise (null elements pass), a non-array\n * value on a list field goes through the element decoder as-is.\n *\n * With a `wire` declaration (board #30 — the ADAPTER's promise about what its\n * driver delivers), decoders that are provably no-ops for that wire are pruned\n * too ({@link decodeIsNoop}): non-list DateTime/Json/Int/Float columns on\n * drivers that already deliver native forms. Without a declaration the full\n * idempotency-guarded decoder set applies — exactly the pre-#30 behaviour.\n */\nexport function fieldDecoder(params: { dialect: Dialect; field: FieldMeta; wire?: WireFidelity }): RowDecoder | null {\n const { dialect, field, wire } = params;\n const decode = fieldCodec({ dialect, field }).decode;\n // postgres enum arrays arrive as a literal string — never the identity.\n if (isPostgresEnumList({ dialect, field })) {\n return (value) => decodeValue({ dialect, field, value });\n }\n if (decode === IDENTITY_DECODE) return null;\n if (field.isList) {\n // F13: a driver that pre-parses Json parses the ELEMENTS of a json array\n // too — verified live on this workspace's servers: node-postgres and PGlite\n // both hand `ARRAY['\"123\"'::jsonb]` back as the JS string `\"123\"`. Running\n // the guarded decode over that re-parses a stored top-level JSON string\n // (`\"123\"` → the number 123) or throws on one that is not valid JSON\n // (`\"hello\"`). Every OTHER scalar type keeps its element decoder: array\n // wire forms differ per driver and the declaration does not cover them.\n if (field.scalarType === \"Json\" && decodeIsNoop({ scalarType: \"Json\", wire })) return null;\n return (value) =>\n Array.isArray(value)\n ? value.map((element) => (element === null || element === undefined ? element : decode(element)))\n : decode(value);\n }\n if (field.scalarType !== null && decodeIsNoop({ scalarType: field.scalarType, wire })) return null;\n return decode;\n}\n\nfunction buildDecodePlan(params: { dialect: Dialect; model: ModelMeta; wire: WireFidelity | undefined }): DecodePlan {\n const { dialect, model, wire } = params;\n const byColumn = new Map<string, DecodePlanEntry>();\n const inPlace: { column: string; decode: RowDecoder }[] = [];\n let renamed = false;\n for (const field of model.fields) {\n const decode = fieldDecoder({ dialect, field, ...(wire === undefined ? {} : { wire }) });\n byColumn.set(field.columnName, { name: field.name, decode });\n if (field.columnName !== field.name) renamed = true;\n if (decode !== null) inPlace.push({ column: field.columnName, decode });\n }\n return { byColumn, inPlace: renamed ? null : inPlace };\n}\n\n/**\n * The part of a wire declaration that still holds over a VIEW: the JSON claim\n * only (F13).\n *\n * `json: \"parsed\"` is a claim about the DRIVER's result path, not about a\n * storage type — node-postgres, PGlite and mysql2 parse whatever comes back as\n * json/jsonb, view or table. Keeping it stops the guarded decode from parsing\n * an already-parsed top-level JSON string a second time. The `dateTime` and\n * `numbers` claims are dropped, because those DO depend on the expression's\n * type: `COUNT(*)` under an `Int` field is BIGINT-as-string, and `to_jsonb`\n * hands timestamps back as strings.\n *\n * Residual, documented: a view column DECLARED `Json` whose expression is\n * actually `text` now returns that text verbatim on a parsing driver instead of\n * being parsed. Nothing on the wire distinguishes it from a stored JSON string,\n * and re-parsing is the case this finding is about.\n */\nfunction viewWire(wire: WireFidelity | undefined): WireFidelity | undefined {\n return wire?.json === \"parsed\" ? { json: \"parsed\" } : undefined;\n}\n\nfunction getDecodePlan(params: { dialect: Dialect; model: ModelMeta; wire: WireFidelity | undefined }): DecodePlan {\n const { dialect, model } = params;\n // VIEWS are exempt from pruning: a view field's declared type says nothing\n // about the EXPRESSION behind it (`postCount Int` over mysql `COUNT(*)` is\n // BIGINT on the wire and arrives as a string; uncast pg aggregates arrive\n // as int8/numeric text). The wire declaration is a promise about base-table\n // STORAGE columns only — views keep the full idempotency-guarded decode.\n const wire = model.isView ? viewWire(params.wire) : params.wire;\n let perModel = decodePlanCache.get(model);\n if (perModel === undefined) {\n perModel = new Map();\n decodePlanCache.set(model, perModel);\n }\n const key = `${dialect}|${wirePlanKey(wire)}`;\n let plan = perModel.get(key);\n if (plan === undefined) {\n plan = buildDecodePlan({ dialect, model, wire });\n perModel.set(key, plan);\n }\n return plan;\n}\n\nfunction decodeRowWithPlan(plan: DecodePlan, row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const column of Object.keys(row)) {\n const value = row[column];\n const entry = plan.byColumn.get(column);\n if (entry === undefined) {\n out[column] = value;\n continue;\n }\n out[entry.name] = value === null || value === undefined || entry.decode === null ? value : entry.decode(value);\n }\n return out;\n}\n\n/**\n * Materialize one driver row: column names become field names, values pass\n * through their codecs. Columns the model does not know (aggregate aliases, raw\n * extras) are carried over verbatim.\n */\nexport function decodeRow(params: {\n dialect: Dialect;\n model: ModelMeta;\n row: Record<string, unknown>;\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown> {\n const { dialect, model, row, wire } = params;\n return decodeRowWithPlan(getDecodePlan({ dialect, model, wire }), row);\n}\n\n/** `decodeRow` over a result set. */\nexport function decodeRows(params: {\n dialect: Dialect;\n model: ModelMeta;\n rows: readonly Record<string, unknown>[];\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown>[] {\n const { dialect, model, rows, wire } = params;\n const plan = getDecodePlan({ dialect, model, wire });\n return rows.map((row) => decodeRowWithPlan(plan, row));\n}\n\n/**\n * `decodeRows` for rows the caller OWNS (fresh driver output): when no column\n * is renamed the rows are decoded in place — only columns whose codec does\n * something are touched — and the same array returns. With renames it falls\n * back to rebuilding rows. Every decoder is idempotent (each checks its input\n * type), so re-materializing an already-decoded row is harmless.\n *\n * Internal to the runtime (client + relation loader) — the exported\n * `decodeRow`/`decodeRows` keep their copy semantics.\n */\nexport function materializeRows(params: {\n dialect: Dialect;\n model: ModelMeta;\n rows: Record<string, unknown>[];\n /** The executing adapter's wire declaration — prunes provably-no-op decoders (board #30). */\n wire?: WireFidelity;\n}): Record<string, unknown>[] {\n const { dialect, model, rows, wire } = params;\n const plan = getDecodePlan({ dialect, model, wire });\n if (plan.inPlace === null) {\n for (let index = 0; index < rows.length; index++) {\n rows[index] = decodeRowWithPlan(plan, rows[index] as Record<string, unknown>);\n }\n return rows;\n }\n const decoders = plan.inPlace;\n if (decoders.length === 0) return rows;\n for (const row of rows) {\n for (const entry of decoders) {\n const value = row[entry.column];\n if (value !== null && value !== undefined) row[entry.column] = entry.decode(value);\n }\n }\n return rows;\n}\n\n// ─── JSON transport (postgres lateral joins, SQL review B3) ─────\n\n/**\n * Base64 → bytes: the lateral subselect ships Bytes as `encode(…,'base64')`\n * (raw `to_jsonb` would give `\\x` hex text — a wire form the Bytes codec\n * never sees on the query path).\n */\nconst decodeBase64Bytes: RowDecoder = (value) =>\n typeof value === \"string\" ? new Uint8Array(Buffer.from(value, \"base64\")) : value;\n\nconst jsonDecodePlanCache = new WeakMap<ModelMeta, DecodePlan>();\n\n/**\n * The decode plan for rows that crossed the wire as JSON (pg lateral joins):\n * BigInt/Decimal arrive as strings (the subselect's `::text` cast — their\n * regular codecs already accept that form), Bytes as base64, and Json values\n * arrive ALREADY PARSED — running the Json codec would double-parse a JSON\n * string value into garbage, so it is identity here.\n */\nfunction getJsonDecodePlan(model: ModelMeta): DecodePlan {\n let plan = jsonDecodePlanCache.get(model);\n if (plan !== undefined) return plan;\n const byColumn = new Map<string, DecodePlanEntry>();\n const inPlace: { column: string; decode: RowDecoder }[] = [];\n let renamed = false;\n for (const field of model.fields) {\n const decode =\n field.scalarType === \"Json\"\n ? null\n : field.scalarType === \"Bytes\" && !field.isList\n ? decodeBase64Bytes\n : fieldDecoder({ dialect: \"postgres\", field });\n byColumn.set(field.columnName, { name: field.name, decode });\n if (field.columnName !== field.name) renamed = true;\n if (decode !== null) inPlace.push({ column: field.columnName, decode });\n }\n plan = { byColumn, inPlace: renamed ? null : inPlace };\n jsonDecodePlanCache.set(model, plan);\n return plan;\n}\n\n/**\n * `materializeRows` for JSON-transport rows — the join strategy's child rows\n * after `JSON.parse`. Postgres-only by construction (lateral joins are).\n */\nexport function materializeJsonRows(params: {\n model: ModelMeta;\n rows: Record<string, unknown>[];\n}): Record<string, unknown>[] {\n const { model, rows } = params;\n const plan = getJsonDecodePlan(model);\n if (plan.inPlace === null) {\n for (let index = 0; index < rows.length; index++) {\n rows[index] = decodeRowWithPlan(plan, rows[index] as Record<string, unknown>);\n }\n return rows;\n }\n const decoders = plan.inPlace;\n if (decoders.length === 0) return rows;\n for (const row of rows) {\n for (const entry of decoders) {\n const value = row[entry.column];\n if (value !== null && value !== undefined) row[entry.column] = entry.decode(value);\n }\n }\n return rows;\n}\n\n// ─── Aggregate normalization ───────────────────────────────\n\n/**\n * Normalize one aggregate value — the contract, tested live on PGlite:\n *\n * | aggregate | field type | JS result |\n * |-----------|-----------------|-------------------------------|\n * | `_count` | any / `_all` | `number` (0 over an empty set)|\n * | `_avg` | Int/BigInt/Float| `number` (pg numeric → Number)|\n * | `_avg` | Decimal | `string` (no float rounding) |\n * | `_sum` | Int / Float | `number` |\n * | `_sum` | BigInt | `bigint` |\n * | `_sum` | Decimal | `string` |\n * | `_min/_max`| any | the field's own codec type |\n *\n * Every non-`_count` aggregate over an empty set is `null` (SQL semantics,\n * kept deliberately — 0 would be a lie for MIN/AVG).\n */\nexport function decodeAggregateValue(params: {\n dialect: Dialect;\n key: \"_count\" | \"_avg\" | \"_sum\" | \"_min\" | \"_max\";\n field: FieldMeta | null;\n value: unknown;\n}): unknown {\n const { dialect, key, field, value } = params;\n if (key === \"_count\") return Number(value ?? 0);\n if (value === null || value === undefined) return null;\n if (key === \"_avg\") {\n if (field !== null && field.scalarType === \"Decimal\") {\n return typeof value === \"number\" || typeof value === \"bigint\" ? String(value) : value;\n }\n return typeof value === \"string\" ? Number(value) : value;\n }\n // _sum/_min/_max carry the field's own type — its codec is the truth. One\n // transport exception (B4): sqlite aggregates Decimal over CAST(col AS REAL)\n // and returns a NUMBER — the Decimal contract is a string, so it converts\n // here (float64-bounded, like every sqlite Decimal comparison).\n if (field !== null && field.scalarType === \"Decimal\" && typeof value === \"number\") return String(value);\n return field === null ? value : decodeValue({ dialect, field, value });\n}\n",
9
+ "/**\n * The query builder: `{ model, method, args }` → a SQL AST statement, purely.\n *\n * Nothing here touches a database, a clock-free input always produces the same\n * statement, and every branch is reachable from the query catalog\n * (`tests/query-catalog/`) — which pins the rendered SQL for all three dialects\n * and exports it to the reviewable root `sql-catalog.md`.\n *\n * Division of labour:\n * - shapes and SQL text live in @vibeorm/sql (this file never writes SQL),\n * - value transport lives in codecs.ts (this file never coerces),\n * - dialect gaps become VIBE_UNSUPPORTED_CAPABILITY here, at build time,\n * which is the earliest knowable moment for a query-level feature,\n * - bad input becomes VIBE_VALIDATION naming the model, field and operator.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { RelationIR, ScalarType } from \"@vibeorm/schema\";\nimport {\n SQL_DEFAULT_CELL,\n containsPattern,\n dbNowMarker,\n endsWithPattern,\n escapeLikePattern,\n excludedRef,\n jsonParamCell,\n startsWithPattern,\n} from \"@vibeorm/sql\";\nimport type {\n AggRef,\n AggSelect,\n ColRef,\n JsonFilterOp,\n LateralJoin,\n OnConflictClause,\n OnConflictUpdate,\n OrderByColumn,\n OrderBySubquery,\n OrderTerm,\n SelectStatement,\n SetOperator,\n SqlDialect,\n SqlExpr,\n SqlStatement,\n} from \"@vibeorm/sql\";\nimport {\n assertConflictTargetIsEnforceable,\n assertConflictKeysAreComparable,\n assertNoDuplicateConflictKeys,\n assertNoDuplicateSecondaryUniques,\n assertUpsertRowsBindColumns,\n resolveUpsertConflictTarget,\n resolveUpsertUpdateFields,\n} from \"./bulk-upsert.ts\";\nimport { encodeAggregateOperand, encodeFilterValue, encodeValue, fieldEncoder } from \"./codecs.ts\";\nimport { compileKeysetOrderPlan, decodeKeysetToken } from \"./keyset.ts\";\nimport type { KeysetNulls, KeysetOrderInput, KeysetTimestampPrecision } from \"./keyset.ts\";\nimport { isDbNow } from \"./db-now.ts\";\nimport type { DbNow } from \"./db-now.ts\";\nimport { getFieldMeta, getModelMeta, generateDefaultValue } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta, UniqueGroupMeta } from \"./model-meta.ts\";\nimport {\n requiredParentFields,\n resolveRelationLink,\n resolveRelationSelection,\n singleKeyPair,\n} from \"./relation-plan.ts\";\nimport type { RelationLink, RelationSelection, RelationTreeNode } from \"./relation-plan.ts\";\n\n// ─── Public shapes ────────────────────────────────────────────────\n\n/** Every ORM method the query builder builds SQL for. */\nexport type QueryMethod =\n | \"findMany\"\n | \"findFirst\"\n | \"findUnique\"\n | \"create\"\n | \"createMany\"\n | \"createManyAndReturn\"\n | \"update\"\n | \"updateMany\"\n | \"updateManyAndReturn\"\n | \"upsert\"\n | \"upsertMany\"\n | \"delete\"\n | \"deleteMany\"\n | \"count\"\n | \"aggregate\"\n | \"groupBy\";\n\n/** Client-level options that shape SQL (subset of ClientOptions the builder needs). */\nexport type BuilderClientOptions = {\n /** Append the primary key to ORDER BY when no explicit orderBy was given (default false). */\n readonly defaultOrderByPk?: boolean;\n /** Append the primary key as a `distinct` tie-breaker for determinism (default true). */\n readonly distinctOrderByPk?: boolean;\n};\n\n// ─── Aggregate result contract ─────────────────────────────\n\n/** The five aggregate selector keys, in the deterministic order they project. */\nexport type AggregateKey = \"_count\" | \"_avg\" | \"_sum\" | \"_min\" | \"_max\";\n\n/**\n * One projected aggregate. `field: null` is `_all` (COUNT(*)). The alias is the\n * deterministic `<key>__<selector>` scheme (`_count___all`, `_avg__score`) —\n * results are read back by construction from these aliases, never parsed.\n */\nexport type AggregateSelection = {\n readonly key: AggregateKey;\n readonly field: string | null;\n readonly alias: string;\n};\n\n/** Everything the client needs to decode an aggregate/groupBy/count-select row. */\nexport type AggregateSpec = {\n readonly selections: readonly AggregateSelection[];\n /** `_count: true` — the result's `_count` is a bare number, not an object. */\n readonly countShorthand: boolean;\n};\n\n/** How included relations are fetched. */\nexport type RelationStrategy = \"query\" | \"join\";\n\n/**\n * A built query plus everything the client needs after execution. The plan is\n * data only: the client decides how to run it.\n */\nexport type QueryPlan = {\n readonly method: QueryMethod;\n readonly model: ModelMeta;\n readonly statement: SqlStatement;\n /**\n * Field names the statement projects, in order, or `null` when it projects\n * every scalar field. Mutations RETURNING extra primary-key columns are\n * narrowed back down to this list by the client.\n */\n readonly selectedFields: readonly string[] | null;\n /**\n * What the CALLER should see: the user's scalar select plus relation names\n * and `_count`, or `null` for \"all scalars (plus attached relations)\".\n * Differs from `selectedFields` when stitching keys were added to the SQL\n * projection — the client narrows back down to this after relation loading.\n */\n readonly resultFields: readonly string[] | null;\n /**\n * Computed fields to attach to result rows (config-declared), resolved from\n * select/omit — always a concrete name list, `null` when none apply. Their\n * `needs` ride `selectedFields` like stitch keys and are narrowed away by\n * `resultFields` unless selected themselves.\n */\n readonly computed: readonly string[] | null;\n /** Relations to load after the base rows, or `null` when none were asked for. */\n readonly relations: RelationSelection | null;\n /**\n * How relations load. With `\"join\"` on a find method the base statement IS\n * the lateral statement (level-1 relations ride along as JSON columns);\n * deeper levels always fall back to `\"query\"` batches (v1 semantics).\n */\n readonly relationStrategy: RelationStrategy;\n /** True when `take` produced a LIMIT. */\n readonly takeApplied: boolean;\n /** Alias the COUNT(*) value is projected under (`count` only). */\n readonly countAlias: string | null;\n /**\n * Unique WHERE identifying the affected row, for the re-select a dialect\n * without RETURNING needs. `null` when the row cannot be identified before\n * the write (an autoincrement key the database assigns).\n */\n readonly refetchWhere: Readonly<Record<string, unknown>> | null;\n /**\n * Upsert only: the unique where WITHOUT the update-arm overlay. The INSERT\n * arm's row answers this key (its create row binds the conflict target — the\n * B1 native-eligibility gate), so the mysql read-back tries the overlaid\n * `refetchWhere` first, then this. `null` on every other method.\n */\n readonly refetchWhereBase: Readonly<Record<string, unknown>> | null;\n /**\n * createMany/createManyAndReturn only: when the call compiles to MORE than\n * one statement (sqlite's heterogeneous column-set groups — M4 — or the M7\n * parameter-budget chunks), every statement in order (`statement` is the\n * first). The client executes them in ONE transaction, summing counts /\n * concatenating returned rows. Absent for single-statement calls.\n */\n readonly batch?: readonly SqlStatement[];\n /**\n * upsertMany only (EPIC 10): the number of rows this plan submits, summed\n * across chunks. It IS the operation's affected count under the one\n * cross-dialect definition — every submitted row is inserted or updated —\n * and it is computed here because the drivers do not agree: mysql's ON\n * DUPLICATE KEY scores an insert 1, a changed update 2 and an unchanged\n * update 0, so its number is not a row count at all.\n */\n readonly upsertRowCount?: number;\n /** The caller's `select`, replayed on that re-select. */\n readonly selectArg: Readonly<Record<string, unknown>> | null;\n /** How to decode aggregate/groupBy/count-select rows; `null` elsewhere. */\n readonly aggregateSpec: AggregateSpec | null;\n /** groupBy's `by` field names, for row assembly; `null` elsewhere. */\n readonly groupByFields: readonly string[] | null;\n /** Negative `take`: the SQL ordering was flipped; re-reverse rows after fetch. */\n readonly reverseRows: boolean;\n /**\n * `distinct` + an explicit user orderBy (N1, board #22): the arrangement\n * DISTINCT ON needs demotes the user's order behind the distinct fields, so\n * the client re-sorts the FINAL rows by these keys — Prisma's presentation\n * order, on every dialect. `nulls` is resolved at build time to the\n * dialect's own NULL placement so the re-sort mirrors what the SQL order\n * would have produced. `null` when no re-sort is needed.\n */\n readonly resortBy: readonly ResortKey[] | null;\n};\n\n/** One client-side re-sort key (see QueryPlan.resortBy). */\nexport type ResortKey = {\n readonly field: string;\n readonly direction: \"asc\" | \"desc\";\n readonly nulls: \"first\" | \"last\";\n /** B4 mirror: Decimal ranks numerically — the SQL side ordered a number. */\n readonly decimal: boolean;\n};\n\n// ─── Constants ────────────────────────────────────────────────────\n\n/** Column alias for COUNT(*) — postgres and sqlite/mysql name it differently otherwise. */\nexport const COUNT_ALIAS: string = \"_count\";\n\nconst NUMERIC_TYPES: readonly ScalarType[] = [\"Int\", \"BigInt\", \"Float\", \"Decimal\"];\n\nconst ATOMIC_OPERATIONS: Readonly<Record<string, SetOperator>> = {\n increment: \"increment\",\n decrement: \"decrement\",\n multiply: \"multiply\",\n divide: \"divide\",\n};\n\n/** Per-method argument allowlist — anything else is loud, never ignored. */\nconst ALLOWED_ARGS: Readonly<Record<QueryMethod, readonly string[]>> = {\n // EPIC 7: `after` is the sort-aware keyset position (a token over ordering\n // values + a unique tie-breaker); `keyset` carries its per-query options.\n // The legacy `cursor` keeps its own exclusive unique-key semantics.\n findMany: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"after\", \"keyset\", \"distinct\", \"select\", \"include\", \"omit\", \"relationStrategy\", \"lock\"],\n findFirst: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"after\", \"keyset\", \"distinct\", \"select\", \"include\", \"omit\", \"relationStrategy\", \"lock\"],\n findUnique: [\"where\", \"select\", \"include\", \"omit\", \"relationStrategy\", \"lock\"],\n create: [\"data\", \"select\", \"include\", \"omit\", \"onConflict\"],\n createMany: [\"data\", \"skipDuplicates\"],\n createManyAndReturn: [\"data\", \"skipDuplicates\", \"select\", \"include\", \"omit\"],\n // EPIC 10: scalar rows only — no select/include/omit (the operation reports a\n // count, not rows) and no nested-write verbs.\n upsertMany: [\"data\", \"conflictTarget\", \"conflictWhere\", \"update\", \"skipUpdatedAt\", \"allowAnyUniqueConflict\"],\n // EPIC 2: no `include` — the initial version refuses relations explicitly\n // (assertArgs rejects the key) instead of accepting and ignoring them.\n updateManyAndReturn: [\"where\", \"data\", \"select\", \"omit\", \"skipUpdatedAt\"],\n update: [\"where\", \"data\", \"select\", \"include\", \"omit\", \"skipUpdatedAt\"],\n updateMany: [\"where\", \"data\", \"skipUpdatedAt\"],\n upsert: [\"where\", \"create\", \"update\", \"select\", \"include\", \"omit\", \"onConflict\"],\n delete: [\"where\", \"select\", \"include\", \"omit\"],\n deleteMany: [\"where\"],\n count: [\"where\", \"select\", \"take\", \"skip\", \"orderBy\"],\n aggregate: [\"where\", \"orderBy\", \"take\", \"skip\", \"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"],\n groupBy: [\"by\", \"where\", \"having\", \"orderBy\", \"take\", \"skip\", \"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"],\n};\n\nconst AGGREGATE_KEYS: readonly AggregateKey[] = [\"_count\", \"_avg\", \"_sum\", \"_min\", \"_max\"];\n\nconst AGG_FN_BY_KEY: Readonly<Record<AggregateKey, \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\">> = {\n _count: \"count\",\n _avg: \"avg\",\n _sum: \"sum\",\n _min: \"min\",\n _max: \"max\",\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n// ─── Small helpers ────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array)\n );\n}\n\n/** A value usable directly as an equality operand (no operator wrapper). */\nfunction isDirectValue(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n value instanceof Date ||\n value instanceof Uint8Array\n );\n}\n\n/** B4: does this field compare through `CAST(col AS REAL)` on this dialect? */\nfunction needsRealCast(dialect: SqlDialect, field: FieldMeta): boolean {\n return dialect.name === \"sqlite\" && field.scalarType === \"Decimal\" && !field.isList;\n}\n\n/**\n * Column reference for a COMPARE/ORDER/AGGREGATE site — sqlite Decimal columns\n * read as REAL there (SQL review B4); everything else is a plain reference.\n */\nfunction compareColumnRef(params: { dialect: SqlDialect; field: FieldMeta; table?: string }): ColRef {\n const { dialect, field, table } = params;\n const ref = columnRef({ field, ...(table === undefined ? {} : { table }) });\n return needsRealCast(dialect, field) ? { ...ref, castReal: true } : ref;\n}\n\nfunction columnRef(params: { field: FieldMeta; table?: string }): ColRef {\n const { field, table } = params;\n return table === undefined ? { name: field.columnName } : { table, name: field.columnName };\n}\n\n/**\n * `lock: \"update\"` — a row-locking read (`SELECT … FOR UPDATE` where the\n * dialect has the clause; sqlite has none and needs none, its write\n * transactions are mutually exclusive). Built here; the CLIENT enforces the\n * in-transaction requirement (only it knows). Refused on shapes where the\n * clause is unsound: `distinct` (postgres rejects FOR UPDATE with DISTINCT)\n * and relation loading (the join strategy would lock lateral-joined rows, the\n * query strategy would leave children unlocked — both surprising).\n */\nfunction compileLock(params: {\n args: Record<string, unknown>;\n model: ModelMeta;\n method: QueryMethod;\n hasRelations: boolean;\n}): boolean {\n const { args, model, method, hasRelations } = params;\n if (args.lock === undefined) return false;\n if (model.isView) {\n throw validationError({\n message: `lock on ${model.clientName}.${method}() — a view row cannot be locked; lock the underlying table's rows instead`,\n meta: { model: model.name, method },\n });\n }\n if (args.lock !== \"update\") {\n throw validationError({\n message: `lock on ${model.clientName}.${method}() must be \"update\", got ${String(args.lock)}`,\n meta: { model: model.name, method, lock: args.lock },\n });\n }\n if (args.distinct !== undefined) {\n throw validationError({\n message: `lock cannot combine with distinct on ${model.clientName}.${method}() — postgres rejects FOR UPDATE with DISTINCT`,\n meta: { model: model.name, method },\n });\n }\n if (hasRelations) {\n throw validationError({\n message: `lock cannot combine with relation loading on ${model.clientName}.${method}() — lock the parent row alone, then read relations inside the same transaction`,\n meta: { model: model.name, method },\n });\n }\n return true;\n}\n\n/**\n * Compile a conflict-target refinement (`onConflict.target` / `.where`, or the\n * object form of `skipDuplicates`) into the pieces of an ON CONFLICT clause.\n *\n * - a field-name array → the column-list target;\n * - `{ constraint }` → `ON CONFLICT ON CONSTRAINT \"name\"` (postgres only,\n * capability-gated);\n * - `where` → the partial-index predicate `(cols) WHERE pred` — the arbiter\n * when the unique index is PARTIAL (postgres/sqlite; needs a column target).\n *\n * mysql refuses every refinement: INSERT IGNORE / ODKU fire on ANY duplicate\n * key and no target can be named — a silent drop would WIDEN the skip.\n */\nfunction compileConflictTarget(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n method: QueryMethod;\n target: unknown;\n where: unknown;\n}): { columns?: string[]; constraint?: string; conflictWhere?: string } {\n const { dialect, meta, model, method, target, where } = params;\n if ((target !== undefined || where !== undefined) && dialect.doNothingForm === \"insertIgnore\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a conflict target on ${model.clientName}.${method}()`,\n hint: \"mysql's INSERT IGNORE / ON DUPLICATE KEY fire on ANY duplicate key — no target can be named; gate the call per dialect\",\n });\n }\n const out: { columns?: string[]; constraint?: string; conflictWhere?: string } = {};\n if (target !== undefined) {\n if (Array.isArray(target)) {\n if (target.length === 0) {\n throw validationError({\n message: `onConflict target on ${model.clientName}.${method}() must name at least one field`,\n meta: { model: model.name, method },\n });\n }\n out.columns = target.map(\n (name) => getFieldMeta({ model, field: String(name), context: \"onConflict target\" }).columnName,\n );\n } else if (\n isPlainObject(target) &&\n typeof target.constraint === \"string\" &&\n target.constraint.length > 0 &&\n Object.keys(target).length === 1\n ) {\n if (!dialect.capabilities.conflictTargetConstraint) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target (ON CONFLICT ON CONSTRAINT)\",\n hint: \"only postgres supports ON CONSTRAINT targets — name the indexed columns instead\",\n });\n }\n out.constraint = target.constraint;\n } else {\n throw validationError({\n message: `onConflict target on ${model.clientName}.${method}() must be a field-name array or { constraint: string }`,\n meta: { model: model.name, method },\n });\n }\n }\n if (where !== undefined) {\n if (out.columns === undefined) {\n throw validationError({\n message: `onConflict where on ${model.clientName}.${method}() needs a column-list target — the predicate refines \"(columns) WHERE …\"`,\n meta: { model: model.name, method },\n });\n }\n if (!dialect.capabilities.partialIndexes) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a partial-index conflict target\",\n hint: \"this dialect has no partial indexes to target\",\n });\n }\n // RAW predicate string — the SAME text the schema's partial index declared\n // (`@@unique([…], where: \"…\")`): both engines match the clause against the\n // index's stored predicate STRUCTURALLY, so a bound parameter could never\n // match and a typed tree would re-serialize differently. Byte-for-byte is\n // the only faithful form.\n if (typeof where !== \"string\" || where.trim().length === 0) {\n throw validationError({\n message: `onConflict where on ${model.clientName}.${method}() must be the partial index's raw predicate string (the schema declaration's where: text)`,\n meta: { model: model.name, method },\n });\n }\n out.conflictWhere = where;\n }\n return out;\n}\n\n/**\n * Compile a `dbNow()` DATA value (create data / update SET) to its SQL marker.\n * DateTime fields only, and never a key field: a database-computed value on a\n * key would leave the client unable to re-address the written row (refetch\n * overlays, upsert read-backs).\n */\nfunction compileDbNowWrite(params: { model: ModelMeta; field: FieldMeta; value: DbNow }): unknown {\n const { model, field, value } = params;\n if (field.scalarType !== \"DateTime\" || field.isList) {\n throw validationError({\n message: `dbNow() writes the database clock into a DateTime field — ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}${field.isList ? \"[]\" : \"\"}`,\n meta: { model: model.name, field: field.name },\n });\n }\n if (\n field.isId ||\n field.isUnique ||\n model.primaryKey.some((candidate) => candidate.name === field.name)\n ) {\n throw validationError({\n message: `dbNow() on ${model.name}.${field.name} — a key field cannot take a database-computed value; the client could not re-address the written row`,\n meta: { model: model.name, field: field.name },\n });\n }\n return dbNowMarker({ offsetSeconds: value.offsetSeconds });\n}\n\n/** Compile a `dbNow()` FILTER operand (comparisons are fine on key fields). */\nfunction compileDbNowFilter(params: { model: ModelMeta; field: FieldMeta; value: DbNow }): unknown {\n const { model, field, value } = params;\n if (field.scalarType !== \"DateTime\" || field.isList) {\n throw validationError({\n message: `dbNow() compares against a DateTime field — ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}${field.isList ? \"[]\" : \"\"}`,\n meta: { model: model.name, field: field.name },\n });\n }\n return dbNowMarker({ offsetSeconds: value.offsetSeconds });\n}\n\nfunction requireObject(params: { value: unknown; what: string; model: ModelMeta }): Record<string, unknown> {\n const { value, what, model } = params;\n if (!isPlainObject(value)) {\n throw validationError({\n message: `${what} must be an object on model \"${model.name}\"`,\n meta: { model: model.name, argument: what },\n });\n }\n return value;\n}\n\nfunction toNonNegativeInteger(params: { value: unknown; what: string; model: ModelMeta }): number {\n const { value, what, model } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw validationError({\n message: `${what} must be an integer on model \"${model.name}\", got ${String(value)}`,\n meta: { model: model.name, argument: what, value },\n });\n }\n if (value < 0) {\n throw validationError({\n message: `negative ${what} is not supported here — only findMany's take may be negative (backwards pagination)`,\n meta: { model: model.name, argument: what, value },\n });\n }\n return value;\n}\n\nfunction assertArgs(params: { method: QueryMethod; args: Record<string, unknown>; model: ModelMeta }): void {\n const { method, args, model } = params;\n const allowed = ALLOWED_ARGS[method];\n for (const key of Object.keys(args)) {\n if (args[key] === undefined) continue;\n if (!allowed.includes(key)) {\n throw validationError({\n message: `unsupported argument \"${key}\" for ${model.clientName}.${method}() — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, method, argument: key, allowed },\n });\n }\n }\n}\n\n// ─── WHERE compilation ────────────────────────────────────────────\n\n/** Filtering a scalar list needs native array columns — postgres only. */\nfunction assertListFilterable(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n field: FieldMeta;\n operator: string;\n}): void {\n const { dialect, model, field, operator } = params;\n if (dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `scalar list filter \"${operator}\" on ${model.name}.${field.name}`,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\n/**\n * Writing a scalar-list value needs native array columns. Only postgres has\n * them, so elsewhere this is a schema that cannot exist — say so at build time\n * instead of binding a JS array the driver will mangle.\n */\nfunction assertListWritable(params: { dialect: SqlDialect; model: ModelMeta; field: FieldMeta }): void {\n const { dialect, model, field } = params;\n if (!field.isList || dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `writing the scalar list ${model.name}.${field.name}`,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\nfunction compileStringPattern(params: { operator: string; operand: unknown; field: FieldMeta; model: ModelMeta }): string {\n const { operator, operand, field, model } = params;\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n if (operator === \"contains\") return containsPattern({ raw: operand });\n if (operator === \"startsWith\") return startsWithPattern({ raw: operand });\n return endsWithPattern({ raw: operand });\n}\n\n/**\n * Shared state for one WHERE compilation: the dialect, the schema (relation\n * filters cross model boundaries) and a statement-scoped alias sequence so\n * every correlated subquery gets a unique alias (`__rf1`, `__jt2`, …) —\n * required for self-relations, harmless everywhere else.\n */\ntype WhereContext = {\n readonly dialect: SqlDialect;\n readonly meta: RuntimeMeta;\n readonly aliasSeq: { n: number };\n};\n\n/**\n * Scalar-list filters (postgres only): `has`, `hasEvery`, `hasSome`, `isEmpty`,\n * `equals`. v1 semantics ported exactly — notably `isEmpty: true` matches NULL\n * AND empty arrays (`array_length(col, 1) IS NULL` for both).\n */\nfunction compileListFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n const dialect = ctx.dialect;\n const column = columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n const conditions: SqlExpr[] = [];\n\n for (const [operator, operand] of Object.entries(filter)) {\n if (operand === undefined) continue;\n assertListFilterable({ dialect, model, field, operator });\n switch (operator) {\n case \"equals\": {\n if (operand === null) {\n conditions.push({ kind: \"isNull\", column });\n break;\n }\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"equals\" on the list ${model.name}.${field.name} expects an array or null`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({\n kind: \"cmp\",\n op: \"eq\",\n column,\n value: encodeValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n case \"has\": {\n conditions.push({\n kind: \"arrayHas\",\n column,\n value: encodeValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n case \"hasEvery\":\n case \"hasSome\": {\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects an array`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const values = encodeValue({ dialect: dialect.name, field, value: operand }) as readonly unknown[];\n conditions.push(\n operator === \"hasEvery\"\n ? { kind: \"arrayContainsAll\", column, values }\n : { kind: \"arrayOverlaps\", column, values },\n );\n break;\n }\n case \"isEmpty\": {\n if (typeof operand !== \"boolean\") {\n throw validationError({\n message: `\"isEmpty\" on ${model.name}.${field.name} expects a boolean`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({ kind: \"arrayIsEmpty\", column, empty: operand });\n break;\n }\n default:\n throw validationError({\n message: `unknown list filter \"${operator}\" on ${model.name}.${field.name} — lists take equals, has, hasEvery, hasSome, isEmpty`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n }\n\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nconst JSON_STRING_OPS: readonly JsonFilterOp[] = [\"string_contains\", \"string_starts_with\", \"string_ends_with\"];\nconst JSON_ARRAY_OPS: readonly JsonFilterOp[] = [\"array_contains\", \"array_starts_with\", \"array_ends_with\"];\n\n/**\n * Json-field filters (Prisma surface): `path` + `equals`/`not`/`string_*`/\n * `array_*`, with `mode: \"insensitive\"` on the string ops. Which ops a dialect\n * can express is declared on `SqlDialect.supportedJsonOps` — the gap throws\n * VIBE_UNSUPPORTED_CAPABILITY here, at build time (dialect honesty).\n */\nfunction compileJsonFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n const dialect = ctx.dialect;\n const column = columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n const rawPath = filter.path;\n if (rawPath !== undefined) {\n if (!Array.isArray(rawPath) || rawPath.some((seg) => typeof seg !== \"string\" && typeof seg !== \"number\")) {\n throw validationError({\n message: `\"path\" on ${model.name}.${field.name} must be an array of keys (strings) and indexes (numbers)`,\n meta: { model: model.name, field: field.name },\n });\n }\n }\n const path: readonly (string | number)[] = (rawPath as readonly (string | number)[] | undefined) ?? [];\n\n const mode = filter.mode;\n if (mode !== undefined && mode !== \"insensitive\" && mode !== \"default\") {\n throw validationError({\n message: `mode must be \"insensitive\" or \"default\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, mode },\n });\n }\n const insensitive = mode === \"insensitive\";\n\n const requireOp = (op: JsonFilterOp): void => {\n if (dialect.supportedJsonOps.includes(op)) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `json filter \"${op}\" on ${model.name}.${field.name}`,\n hint: `this dialect can express: ${dialect.supportedJsonOps.join(\", \")}`,\n });\n };\n\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(filter)) {\n if (operand === undefined || operator === \"path\" || operator === \"mode\") continue;\n\n if (operator === \"equals\" || operator === \"not\") {\n if (operand === null) {\n if (path.length > 0) {\n throw validationError({\n message: `\"${operator}: null\" with a path on ${model.name}.${field.name} is ambiguous (SQL NULL vs JSON null) — omit the path to test column NULL`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n conditions.push({ kind: \"isNull\", column, ...(operator === \"not\" ? { negate: true } : {}) });\n continue;\n }\n requireOp(\"equals\");\n conditions.push({\n kind: \"jsonFilter\",\n column,\n path,\n op: \"equals\",\n value: operand,\n ...(operator === \"not\" ? { negate: true } : {}),\n });\n continue;\n }\n\n if ((JSON_STRING_OPS as readonly string[]).includes(operator)) {\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const op = operator as JsonFilterOp;\n requireOp(op);\n conditions.push({\n kind: \"jsonFilter\",\n column,\n path,\n op,\n value: operand,\n ...(insensitive ? { insensitive: true } : {}),\n });\n continue;\n }\n\n if ((JSON_ARRAY_OPS as readonly string[]).includes(operator)) {\n const op = operator as JsonFilterOp;\n requireOp(op);\n conditions.push({ kind: \"jsonFilter\", column, path, op, value: operand });\n continue;\n }\n\n throw validationError({\n message: `unknown json filter \"${operator}\" on ${model.name}.${field.name} — supported: path, mode, equals, not, ${[...JSON_STRING_OPS, ...JSON_ARRAY_OPS].join(\", \")}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n\n if (conditions.length === 0) {\n throw validationError({\n message: `json filter on ${model.name}.${field.name} needs at least one operator`,\n meta: { model: model.name, field: field.name },\n });\n }\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nfunction compileOperatorFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n filter: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, filter, qualify } = params;\n if (field.isList) return compileListFieldFilter({ ctx, model, field, filter, qualify });\n if (field.scalarType === \"Json\") return compileJsonFieldFilter({ ctx, model, field, filter, qualify });\n const dialect = ctx.dialect;\n // B4: sqlite Decimal comparisons cast the TEXT column to REAL (and bind\n // NUMBER operands via encodeFilterValue) — text comparison is lexicographic.\n const column = compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n const entries = Object.entries(filter).filter(([, operand]) => operand !== undefined);\n const stringOperators = [\"contains\", \"startsWith\", \"endsWith\"];\n\n // `mode` modifies string matching (and #10: string equality). Combining it\n // with anything else would silently leave that operator at engine-default\n // sensitivity, so it is rejected instead. `\"strict\"` (board #20) is the\n // honest case-SENSITIVE direction — a no-op on postgres, GLOB on sqlite,\n // a BINARY cast on mysql `_ci` — compiled to its own AST node below.\n const modeCompanions = [...stringOperators, \"equals\"];\n const mode = filter.mode;\n if (mode !== undefined) {\n if (mode !== \"insensitive\" && mode !== \"strict\" && mode !== \"default\") {\n throw validationError({\n message: `mode must be \"insensitive\", \"strict\" or \"default\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, mode },\n });\n }\n const others = entries.filter(([operator]) => operator !== \"mode\");\n if (others.length === 0 || others.some(([operator]) => !modeCompanions.includes(operator))) {\n throw validationError({\n message: `mode is only supported with ${modeCompanions.join(\"/\")} on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name },\n });\n }\n }\n const insensitive = mode === \"insensitive\";\n const strict = mode === \"strict\";\n\n /**\n * #36: mysql only — an explicit `…_ci` @collation folds case natively, so\n * the insensitive LIKE can skip the index-defeating LOWER() wrap. Columns\n * without a declared collation keep LOWER(): the runtime cannot know the\n * server default, and conservative is correct.\n */\n const ciCollated = (params: { dialect: SqlDialect; field: FieldMeta }): boolean =>\n params.dialect.name === \"mysql\" && params.field.collation?.toLowerCase().endsWith(\"_ci\") === true;\n\n /** The raw string operand a `mode`-modified operator requires. */\n const requireStringOperand = (operator: string, operand: unknown): string => {\n if (typeof operand !== \"string\") {\n throw validationError({\n message: `mode: \"${String(mode)}\" with ${operator} on ${model.name}.${field.name} expects a string`,\n meta: { model: model.name, field: field.name },\n });\n }\n return operand;\n };\n\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of entries) {\n if (operator === \"mode\") continue;\n\n switch (operator) {\n case \"equals\": {\n if (operand === null) {\n // NULL tests never need the B4 cast — keep the plain reference.\n conditions.push({\n kind: \"isNull\",\n column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }),\n });\n break;\n }\n if (insensitive) {\n // #10 (v1/Prisma parity): insensitive equality rides the LIKE\n // machinery with a wildcard-FREE, escaped pattern — `ILIKE` on\n // postgres, `LOWER(col) LIKE LOWER(?)` elsewhere — so `%`/`_` in the\n // operand match literally. Non-string operands stay refused: case\n // has no meaning off text.\n conditions.push({\n kind: \"like\",\n column,\n pattern: escapeLikePattern({ raw: requireStringOperand(\"equals\", operand) }),\n insensitive: true,\n ...(ciCollated({ dialect, field }) ? { ciCollation: true } : {}),\n });\n break;\n }\n if (strict) {\n // #20: byte-exact equality — `= CAST(? AS BINARY)` on mysql `_ci`,\n // plain `=` on postgres/sqlite (already byte-exact there).\n conditions.push({\n kind: \"strictMatch\",\n column,\n op: \"equals\",\n value: requireStringOperand(\"equals\", operand),\n });\n break;\n }\n conditions.push({\n kind: \"cmp\",\n op: \"eq\",\n column,\n value: isDbNow(operand)\n ? compileDbNowFilter({ model, field, value: operand })\n : encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"not\": {\n if (operand === null) {\n conditions.push({\n kind: \"isNull\",\n column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }),\n negate: true,\n });\n break;\n }\n if (isPlainObject(operand)) {\n conditions.push({\n kind: \"not\",\n operand: compileOperatorFilter({ ctx, model, field, filter: operand, qualify }),\n });\n break;\n }\n conditions.push({\n kind: \"cmp\",\n op: \"ne\",\n column,\n value: isDbNow(operand)\n ? compileDbNowFilter({ model, field, value: operand })\n : encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"in\":\n case \"notIn\": {\n if (!Array.isArray(operand)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects an array`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n for (const item of operand) {\n if (isDbNow(item)) {\n throw validationError({\n message: `dbNow() cannot ride an \"${operator}\" list on ${model.name}.${field.name} — compare with lt/lte/gt/gte/equals instead`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n }\n conditions.push({\n kind: \"inArray\",\n column,\n values: operand.map((item) => encodeFilterValue({ dialect: dialect.name, field, value: item })),\n negate: operator === \"notIn\",\n });\n break;\n }\n\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n conditions.push({\n kind: \"cmp\",\n op: operator,\n column,\n value: isDbNow(operand)\n ? compileDbNowFilter({ model, field, value: operand })\n : encodeFilterValue({ dialect: dialect.name, field, value: operand }),\n });\n break;\n }\n\n case \"contains\":\n case \"startsWith\":\n case \"endsWith\": {\n if (strict) {\n // #20: the RAW operand rides the AST — pattern building happens at\n // render time, where each strategy escapes its own metacharacters\n // (LIKE's %/_/\\ vs GLOB's */?/[).\n conditions.push({\n kind: \"strictMatch\",\n column,\n op: operator,\n value: requireStringOperand(operator, operand),\n });\n break;\n }\n conditions.push({\n kind: \"like\",\n column,\n pattern: compileStringPattern({ operator, operand, field, model }),\n insensitive,\n ...(insensitive && ciCollated({ dialect, field }) ? { ciCollation: true } : {}),\n });\n break;\n }\n\n default: {\n // Extension where-operators (extensions.md §3 sql plane): compiled\n // through the owning extension into a bound fragment.\n const extensionOperator = ctx.meta.extensionOperators?.get(operator);\n if (extensionOperator !== undefined) {\n conditions.push(\n extensionOperator({\n column: qualify === undefined ? [field.columnName] : [qualify, field.columnName],\n operand,\n model: model.name,\n field: field.name,\n }),\n );\n break;\n }\n throw validationError({\n message: `unknown filter operator \"${operator}\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n }\n }\n\n // An empty filter object constrains nothing — the AST's neutral AND is `1 = 1`.\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\nfunction compileFieldFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n field: FieldMeta;\n value: unknown;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, field, value, qualify } = params;\n const dialect = ctx.dialect;\n const column = compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n if (value === null) {\n return { kind: \"isNull\", column: columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }) };\n }\n\n if (isDirectValue(value)) {\n return { kind: \"cmp\", op: \"eq\", column, value: encodeFilterValue({ dialect: dialect.name, field, value }) };\n }\n\n if (isDbNow(value)) {\n return { kind: \"cmp\", op: \"eq\", column, value: compileDbNowFilter({ model, field, value }) };\n }\n\n if (Array.isArray(value)) {\n // A bare array is list equality — only meaningful on a list field.\n if (!field.isList) {\n throw validationError({\n message: `array filter value on ${model.name}.${field.name} — only list fields compare against arrays`,\n meta: { model: model.name, field: field.name },\n });\n }\n assertListFilterable({ dialect, model, field, operator: \"equals\" });\n return { kind: \"cmp\", op: \"eq\", column, value: encodeValue({ dialect: dialect.name, field, value }) };\n }\n\n if (isPlainObject(value)) {\n return compileOperatorFilter({ ctx, model, field, filter: value, qualify });\n }\n\n throw validationError({\n message: `unsupported filter value for ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name },\n });\n}\n\n// ─── Relation filters (some/every/none · is/isNot) ──────────────\n\n/** The neutral always-true expression (renders `1 = 1`). */\nconst NEUTRAL_TRUE: SqlExpr = { kind: \"and\", operands: [] };\n\n/**\n * Correlated EXISTS over a relation's target: child rows matching `predicate`\n * that belong to the outer row. `outer` is the outer scope's qualifier (table\n * name or enclosing subquery alias). Implicit M2M nests a second EXISTS\n * through the join table instead of adding JOINs to the AST.\n */\n/**\n * Correlate a child scope against an outer scope on EVERY member of the\n * relation key, in tuple order. A composite foreign key that correlated on one\n * member would match every row sharing that member — a Cartesian superset.\n */\nfunction correlateLink(params: { link: RelationLink; childTable: string; outerTable: string }): SqlExpr {\n const { link, childTable, outerTable } = params;\n const operands: SqlExpr[] = link.childKeys.map((child, index) => ({\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: childTable, name: child.columnName },\n right: {\n table: outerTable,\n name: (link.parentKeys[index] as (typeof link.parentKeys)[number]).columnName,\n },\n }));\n return operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands };\n}\n\nfunction buildRelationExists(params: {\n ctx: WhereContext;\n link: RelationLink;\n outer: string;\n predicate: Record<string, unknown> | undefined;\n negatePredicate?: boolean;\n negate?: boolean;\n}): SqlExpr {\n const { ctx, link, outer, predicate, negatePredicate = false, negate = false } = params;\n const target = link.target;\n\n const childAlias = `__rf${++ctx.aliasSeq.n}`;\n let pred: SqlExpr =\n predicate === undefined\n ? NEUTRAL_TRUE\n : (compileWhereInternal({ ctx, model: target, where: predicate, qualify: childAlias }) ?? NEUTRAL_TRUE);\n if (negatePredicate) pred = { kind: \"not\", operand: pred };\n\n // #14: an empty predicate (`some: {}`) leaves the correlation as the only\n // real test — ANDing the neutral `1 = 1` in was pinned catalog noise.\n // Reference equality is exact: NEUTRAL_TRUE is only ever assigned above.\n const correlated = (correlation: SqlExpr): SqlExpr =>\n pred === NEUTRAL_TRUE ? correlation : { kind: \"and\", operands: [correlation, pred] };\n\n if (link.kind === \"manyToMany\") {\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const m2m = singleKeyPair({ link, what: \"implicit many-to-many filtering\" });\n const jtAlias = `__jt${++ctx.aliasSeq.n}`;\n const childExists: SqlExpr = {\n kind: \"exists\",\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: childAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: correlated({\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: childAlias, name: m2m.child.columnName },\n right: { table: jtAlias, name: join.childColumn },\n }),\n },\n };\n return {\n kind: \"exists\",\n ...(negate ? { negate: true } : {}),\n select: {\n kind: \"select\",\n table: { name: join.tableName, alias: jtAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: {\n kind: \"and\",\n operands: [\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.parentColumn },\n right: { table: outer, name: m2m.parent.columnName },\n },\n childExists,\n ],\n },\n },\n };\n }\n\n return {\n kind: \"exists\",\n ...(negate ? { negate: true } : {}),\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: childAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: correlated(correlateLink({ link, childTable: childAlias, outerTable: outer })),\n },\n };\n}\n\nfunction requirePredicateObject(params: {\n model: ModelMeta;\n relation: RelationIR;\n operator: string;\n operand: unknown;\n}): Record<string, unknown> {\n const { model, relation, operator, operand } = params;\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `\"${operator}\" on relation ${model.name}.${relation.name} expects a where object`,\n meta: { model: model.name, relation: relation.name, operator },\n });\n }\n return operand;\n}\n\n/**\n * A relation key inside `where`.\n *\n * To-many: `{ some | every | none: <child where> }` — correlated EXISTS;\n * `every X` compiles as `none NOT X` (NOT EXISTS a violating child).\n * To-one: `{ is | isNot: <child where> | null }`, or a bare where object\n * (shorthand for `is`), or `null` (shorthand for `is: null`). On the owning\n * side `is: null` / `isNot: null` become FK IS [NOT] NULL — no subquery.\n */\nfunction compileRelationFilter(params: {\n ctx: WhereContext;\n model: ModelMeta;\n relation: RelationIR;\n value: unknown;\n qualify: string | undefined;\n}): SqlExpr {\n const { ctx, model, relation, value, qualify } = params;\n const link = resolveRelationLink({ meta: ctx.meta, model, relation });\n const outer = qualify ?? model.tableName;\n\n if (relation.isList) {\n if (!isPlainObject(value)) {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must be { some | every | none: … }`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n const conditions: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n switch (operator) {\n case \"some\":\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n }),\n );\n break;\n case \"none\":\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n negate: true,\n }),\n );\n break;\n case \"every\":\n // every X ⇔ no child violates X.\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator, operand }),\n negatePredicate: true,\n negate: true,\n }),\n );\n break;\n default:\n throw validationError({\n message: `unknown relation filter \"${operator}\" on ${model.name}.${relation.name} — to-many relations take some/every/none`,\n meta: { model: model.name, relation: relation.name, operator },\n });\n }\n }\n if (conditions.length === 0) {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must contain some, every or none`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n }\n\n // To-one: normalize to { is } / { isNot } arms.\n let isArm: unknown;\n let hasIs = false;\n let isNotArm: unknown;\n let hasIsNot = false;\n if (value === null) {\n isArm = null;\n hasIs = true;\n } else if (isPlainObject(value) && (\"is\" in value || \"isNot\" in value)) {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) continue;\n if (key === \"is\") {\n isArm = value[key];\n hasIs = true;\n } else if (key === \"isNot\") {\n isNotArm = value[key];\n hasIsNot = true;\n } else {\n throw validationError({\n message: `relation filter on ${model.name}.${relation.name} cannot mix \"${key}\" with is/isNot`,\n meta: { model: model.name, relation: relation.name, operator: key },\n });\n }\n }\n } else if (isPlainObject(value)) {\n isArm = value;\n hasIs = true;\n } else {\n throw validationError({\n message: `filter on relation ${model.name}.${relation.name} must be a where object, { is | isNot: … } or null`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n\n const conditions: SqlExpr[] = [];\n // The owning side's `is: null` short-circuit needs the FK column itself; a\n // COMPOSITE foreign key has no single column to test, and \"any member NULL\"\n // is not the same predicate as \"no related row\" — so composite links take the\n // always-correct EXISTS form instead.\n const singleFk = link.kind === \"toOneOwner\" && link.parentKeys.length === 1;\n const fkColumn: ColRef = columnRef({\n field: link.parentKeys[0] as (typeof link.parentKeys)[number],\n ...(qualify === undefined ? {} : { table: qualify }),\n });\n\n if (hasIs) {\n if (isArm === null) {\n conditions.push(\n singleFk\n ? { kind: \"isNull\", column: fkColumn }\n : buildRelationExists({ ctx, link, outer, predicate: undefined, negate: true }),\n );\n } else {\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator: \"is\", operand: isArm }),\n }),\n );\n }\n }\n if (hasIsNot) {\n if (isNotArm === null) {\n conditions.push(\n singleFk\n ? { kind: \"isNull\", column: fkColumn, negate: true }\n : buildRelationExists({ ctx, link, outer, predicate: undefined }),\n );\n } else {\n // NOT EXISTS — rows with NO related row also match, like Prisma.\n conditions.push(\n buildRelationExists({\n ctx,\n link,\n outer,\n predicate: requirePredicateObject({ model, relation, operator: \"isNot\", operand: isNotArm }),\n negate: true,\n }),\n );\n }\n }\n\n if (conditions.length === 1) return conditions[0] as SqlExpr;\n return { kind: \"and\", operands: conditions };\n}\n\n// ─── WHERE assembly ───────────────────────────────────────────\n\nfunction compileWhereGroup(params: {\n ctx: WhereContext;\n model: ModelMeta;\n value: unknown;\n key: string;\n qualify: string | undefined;\n}): SqlExpr[] {\n const { ctx, model, value, key, qualify } = params;\n const items = Array.isArray(value) ? value : [value];\n return items.map((item) => {\n const where = requireObject({ value: item, what: key, model });\n // An empty member constrains nothing: the neutral AND renders `1 = 1`.\n return compileWhereInternal({ ctx, model, where, qualify }) ?? NEUTRAL_TRUE;\n });\n}\n\nfunction compileWhereInternal(params: {\n ctx: WhereContext;\n model: ModelMeta;\n where: Record<string, unknown>;\n qualify: string | undefined;\n}): SqlExpr | undefined {\n const { ctx, model, where, qualify } = params;\n const operands: SqlExpr[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n\n if (key === \"AND\") {\n operands.push({ kind: \"and\", operands: compileWhereGroup({ ctx, model, value, key, qualify }) });\n continue;\n }\n if (key === \"OR\") {\n operands.push({ kind: \"or\", operands: compileWhereGroup({ ctx, model, value, key, qualify }) });\n continue;\n }\n if (key === \"NOT\") {\n // Prisma semantics: NOT: [A, B] negates each member — NOT(A) AND NOT(B).\n for (const member of compileWhereGroup({ ctx, model, value, key, qualify })) {\n operands.push({ kind: \"not\", operand: member });\n }\n continue;\n }\n\n const relation = model.relationByName.get(key);\n if (relation !== undefined) {\n operands.push(compileRelationFilter({ ctx, model, relation, value, qualify }));\n continue;\n }\n\n const field = getFieldMeta({ model, field: key, context: \"where\" });\n operands.push(compileFieldFilter({ ctx, model, field, value, qualify }));\n }\n\n if (operands.length === 0) return undefined;\n if (operands.length === 1) return operands[0] as SqlExpr;\n return { kind: \"and\", operands };\n}\n\n/**\n * Compile a Prisma-shaped where object; `undefined` when it constrains nothing.\n *\n * `qualify` table-qualifies every column reference (used inside lateral and\n * EXISTS subqueries); `aliasSeq` threads the statement-wide subquery-alias\n * counter so nested relation filters never collide.\n */\nexport function compileWhere(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n where: Record<string, unknown>;\n qualify?: string;\n aliasSeq?: { n: number };\n}): SqlExpr | undefined {\n const { dialect, meta, model, where, qualify, aliasSeq } = params;\n const ctx: WhereContext = { dialect, meta, aliasSeq: aliasSeq ?? { n: 0 } };\n return compileWhereInternal({ ctx, model, where, qualify });\n}\n\n// ─── ORDER BY ─────────────────────────────────────────────────────\n\nfunction compileOrderTerm(params: {\n model: ModelMeta;\n field: FieldMeta;\n spec: unknown;\n qualify?: string;\n dialect?: SqlDialect;\n}): OrderByColumn {\n const { model, field, spec, qualify, dialect } = params;\n // B4: ordering a sqlite Decimal by its TEXT storage would be lexicographic.\n const column =\n dialect !== undefined\n ? compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) })\n : columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n if (spec === \"asc\" || spec === \"desc\") return { column, direction: spec };\n\n if (isPlainObject(spec)) {\n const { sort, nulls } = spec;\n if (sort !== \"asc\" && sort !== \"desc\") {\n throw validationError({\n message: `orderBy sort must be \"asc\" or \"desc\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, sort },\n });\n }\n if (nulls !== undefined && nulls !== \"first\" && nulls !== \"last\") {\n throw validationError({\n message: `orderBy nulls must be \"first\" or \"last\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, nulls },\n });\n }\n return nulls === undefined ? { column, direction: sort } : { column, direction: sort, nulls };\n }\n\n throw validationError({\n message: `orderBy on ${model.name}.${field.name} must be \"asc\", \"desc\" or { sort, nulls }`,\n meta: { model: model.name, field: field.name },\n });\n}\n\n/** Compile `orderBy` (a single object or an array of them) into order terms. */\nexport function compileOrderBy(params: {\n model: ModelMeta;\n orderBy: unknown;\n qualify?: string;\n /** When given, B4's sqlite Decimal ordering cast applies (`CAST … AS REAL`). */\n dialect?: SqlDialect;\n}): OrderByColumn[] {\n const { model, orderBy, qualify, dialect } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: OrderByColumn[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n terms.push(\n compileOrderTerm({\n model,\n field,\n spec: value,\n ...(qualify === undefined ? {} : { qualify }),\n ...(dialect === undefined ? {} : { dialect }),\n }),\n );\n }\n }\n return terms;\n}\n\n// ─── Relation ORDER BY (board #1) ─────────────────────────\n\n/** An order term a find statement may carry: a column, or a correlated subquery. */\ntype FindOrderTerm = OrderByColumn | OrderBySubquery;\n\n/**\n * Compile one relation orderBy entry — `{ posts: { _count: \"desc\" } }` or\n * `{ author: { email: \"asc\" } }` — into correlated scalar subquery terms\n * (portable on every dialect; v1 used a correlated COUNT and a LEFT JOIN, v2\n * expresses both through ORDER BY subqueries so the AST stays join-free):\n * - `_count` on a LIST relation → `(SELECT COUNT(*) FROM child|joinTable\n * WHERE correlation)` — implicit M2M counts join-table rows;\n * - a scalar field on a TO-ONE relation → `(SELECT \"col\" FROM target WHERE\n * correlation)` — at most one row by construction, NULL when missing\n * (engine-native NULL placement; nulls options are refused, they would\n * render the subquery twice).\n */\nfunction compileRelationOrderTerms(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n spec: unknown;\n qualify: string | undefined;\n aliasSeq: { n: number };\n}): OrderBySubquery[] {\n const { dialect, meta, model, relation, spec, qualify, aliasSeq } = params;\n const entries = requireObject({ value: spec, what: `orderBy.${relation.name}`, model });\n const link = resolveRelationLink({ meta, model, relation });\n const outer = qualify ?? model.tableName;\n const isList = link.kind === \"toManyFk\" || link.kind === \"manyToMany\";\n const terms: OrderBySubquery[] = [];\n\n const requireDirection = (value: unknown, what: string): \"asc\" | \"desc\" => {\n if (value === \"asc\" || value === \"desc\") return value;\n throw validationError({\n message: `${what} on ${model.name}.${relation.name} must be \"asc\" or \"desc\" — nulls placement is not supported on relation orderBy`,\n meta: { model: model.name, relation: relation.name },\n });\n };\n\n for (const [key, value] of Object.entries(entries)) {\n if (value === undefined) continue;\n\n if (key === \"_count\") {\n if (!isList) {\n throw validationError({\n message: `orderBy.${relation.name}._count on model \"${model.name}\" needs a list relation — \"${relation.name}\" is to-one`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n const direction = requireDirection(value, `orderBy.${relation.name}._count`);\n const alias = `__ord${++aliasSeq.n}`;\n const select: SelectStatement =\n link.kind === \"manyToMany\"\n ? {\n kind: \"select\",\n table: { name: (link.join as NonNullable<RelationLink[\"join\"]>).tableName, alias },\n columns: [],\n selectExpr: { kind: \"countAll\" },\n where: {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: alias, name: (link.join as NonNullable<RelationLink[\"join\"]>).parentColumn },\n right: {\n table: outer,\n name: singleKeyPair({ link, what: \"implicit many-to-many ordering\" }).parent.columnName,\n },\n },\n }\n : {\n kind: \"select\",\n table: { name: link.target.tableName, alias },\n columns: [],\n selectExpr: { kind: \"countAll\" },\n where: correlateLink({ link, childTable: alias, outerTable: outer }),\n };\n terms.push({ select, direction });\n continue;\n }\n\n if (isList) {\n throw validationError({\n message: `orderBy.${relation.name}.${key} on model \"${model.name}\" — a to-many relation orders by _count only (a scalar across many rows is ambiguous)`,\n meta: { model: model.name, relation: relation.name, field: key },\n });\n }\n const field = getFieldMeta({ model: link.target, field: key, context: `orderBy.${relation.name}` });\n const direction = requireDirection(value, `orderBy.${relation.name}.${key}`);\n const alias = `__ord${++aliasSeq.n}`;\n terms.push({\n select: {\n kind: \"select\",\n table: { name: link.target.tableName, alias },\n // B4 rides along: a sqlite Decimal projects CAST(… AS REAL) here — the\n // subquery's value IS the comparison site.\n columns: [compareColumnRef({ dialect, field, table: alias })],\n where: correlateLink({ link, childTable: alias, outerTable: outer }),\n },\n direction,\n });\n }\n return terms;\n}\n\n/**\n * `compileOrderBy` plus relation entries — the FIND pipeline's order compiler.\n * Scalar keys compile exactly as before; a key naming a relation compiles to\n * correlated subquery terms. Only find statements order by relations: child\n * statements, aggregates and groupBy keep the scalar-only compiler.\n */\nfunction compileFindOrderBy(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n orderBy: unknown;\n qualify: string | undefined;\n aliasSeq: { n: number };\n}): FindOrderTerm[] {\n const { dialect, meta, model, orderBy, qualify, aliasSeq } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: FindOrderTerm[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n const relation = model.relationByName.get(name);\n if (relation !== undefined) {\n terms.push(...compileRelationOrderTerms({ dialect, meta, model, relation, spec: value, qualify, aliasSeq }));\n continue;\n }\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n terms.push(\n compileOrderTerm({\n model,\n field,\n spec: value,\n ...(qualify === undefined ? {} : { qualify }),\n dialect,\n }),\n );\n }\n }\n return terms;\n}\n\n// ─── SELECT projection ────────────────────────────────────────────\n\n/**\n * Compile `select` into scalar field names, projecting EXACTLY what was asked\n * — the primary key is not smuggled in. Relation keys and `_count` are the\n * relation resolver's business (`relation-plan.ts`) and are skipped here;\n * `allowEmpty` permits a select of ONLY relations (the stitching key is added\n * separately and stripped from the result).\n */\nexport function compileSelect(params: { model: ModelMeta; select: unknown; allowEmpty?: boolean }): string[] {\n const { model, select, allowEmpty = false } = params;\n const spec = requireObject({ value: select, what: \"select\", model });\n const names: string[] = [];\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined || value === false) continue;\n if (name === \"_count\" || model.relationByName.has(name)) continue;\n // Computed fields are the plan's business (resolveComputedSelection) —\n // they are results, not columns, so the scalar projection skips them.\n if (model.computed !== null && model.computed.has(name)) continue;\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n names.push(getFieldMeta({ model, field: name, context: \"select\" }).name);\n }\n if (names.length === 0 && !allowEmpty) {\n throw validationError({\n message: `select on model \"${model.name}\" must include at least one field`,\n meta: { model: model.name },\n });\n }\n return names;\n}\n\n/**\n * Which computed fields this call attaches: the ones selected `true`, or (with\n * `omit`/no projection args) every configured one minus the omitted. Always a\n * concrete list — `null` when the model has none, the method aggregates, or\n * the selection excludes them all.\n */\nfunction resolveComputedSelection(params: {\n model: ModelMeta;\n args: Record<string, unknown>;\n aggregating: boolean;\n}): readonly string[] | null {\n const { model, args, aggregating } = params;\n const specs = model.computed;\n if (specs === null || aggregating) return null;\n if (isPlainObject(args.select)) {\n const names: string[] = [];\n for (const [name, value] of Object.entries(args.select)) {\n if (!specs.has(name) || value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n names.push(name);\n }\n return names.length === 0 ? null : names;\n }\n if (isPlainObject(args.omit)) {\n const names: string[] = [];\n for (const name of specs.keys()) {\n const value = (args.omit as Record<string, unknown>)[name];\n if (value === true) continue;\n names.push(name);\n }\n return names.length === 0 ? null : names;\n }\n return [...specs.keys()];\n}\n\n/** Per-model full projection, precomputed — the §9 \"select skeleton\". Shared, never mutated. */\nconst fullProjectionCache = new WeakMap<ModelMeta, readonly ColRef[]>();\n\nfunction projectionColumns(params: {\n model: ModelMeta;\n selectedFields: readonly string[] | null;\n table?: string;\n}): readonly ColRef[] {\n const { model, selectedFields, table } = params;\n if (selectedFields === null && table === undefined) {\n let cached = fullProjectionCache.get(model);\n if (cached === undefined) {\n cached = model.fields.map((field) => columnRef({ field }));\n fullProjectionCache.set(model, cached);\n }\n return cached;\n }\n const ref = (field: FieldMeta): ColRef => columnRef({ field, ...(table === undefined ? {} : { table }) });\n if (selectedFields === null) return model.fields.map(ref);\n return selectedFields.map((name) => ref(model.fieldByName.get(name) as FieldMeta));\n}\n\n/**\n * RETURNING columns for a mutation: the primary key plus everything selected,\n * in model field order. The key rides along because it identifies the row for\n * post-write work (P3 relation loading); the client narrows the result back to\n * `selectedFields` so callers still see exactly what they asked for.\n */\n/** Per-model full RETURNING list, precomputed. Shared, never mutated. */\nconst fullReturningCache = new WeakMap<ModelMeta, readonly string[]>();\n\nfunction returningColumns(params: {\n model: ModelMeta;\n selectedFields: readonly string[] | null;\n}): readonly string[] {\n const { model, selectedFields } = params;\n if (selectedFields === null) {\n let cached = fullReturningCache.get(model);\n if (cached === undefined) {\n cached = model.fields.map((field) => field.columnName);\n fullReturningCache.set(model, cached);\n }\n return cached;\n }\n const wanted = new Set<string>([...model.primaryKey.map((field) => field.name), ...selectedFields]);\n return model.fields.filter((field) => wanted.has(field.name)).map((field) => field.columnName);\n}\n\n// ─── Unique WHERE ─────────────────────────────────────────────────\n\n/**\n * Expand the compound-key sugar the GENERATED `…WhereUniqueInput` emits:\n * `{ projectId_userId: { projectId, userId } }` becomes\n * `{ projectId: …, userId: … }`, so a composite `@@id`/`@@unique` compiles\n * exactly like the flat form. Models without a composite key (the common case)\n * return their where object untouched, allocation-free.\n */\nfunction expandCompoundWhere(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n /** Argument label for errors — `\"where\"` (default) or `\"cursor\"` (#4). */\n what?: string;\n}): Record<string, unknown> {\n const { model, where, what = \"where\" } = params;\n if (model.compoundUniques.size === 0) return where;\n let expanded: Record<string, unknown> | null = null;\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n const fields = model.compoundUniques.get(key)?.fields;\n if (fields === undefined) continue;\n const spec = requireObject({ value, what: `${what}.${key}`, model });\n expanded ??= { ...where };\n delete expanded[key];\n for (const field of fields) {\n const member = spec[field.name];\n if (member === undefined) {\n throw validationError({\n message: `${what}.${key} on model \"${model.name}\" needs every member field (${fields\n .map((entry) => entry.name)\n .join(\", \")}) — \"${field.name}\" is missing`,\n meta: { model: model.name, key, field: field.name },\n });\n }\n expanded[field.name] = member;\n }\n }\n return expanded ?? where;\n}\n\n/**\n * A where that identifies at most one row: one `@id`/`@unique` field, or every\n * field of a composite `@@id`/`@@unique`, each carrying a direct value. Callers\n * run `expandCompoundWhere` first, so the compound sugar arrives flattened.\n */\n/**\n * Whether `value` can address a member of a unique group. `null` addresses a\n * member ONLY under NULLS NOT DISTINCT — there the database keeps at most one\n * row per key including null dimensions, so `IS NULL` identifies a row the\n * same way `= $1` does. On a default (nulls-distinct) unique, many rows may\n * share the null and it stays refused.\n */\nfunction isAddressableMember(params: { value: unknown; nullsNotDistinct: boolean }): boolean {\n return isDirectValue(params.value) || (params.nullsNotDistinct && params.value === null);\n}\n\nfunction assertUniqueWhere(params: { model: ModelMeta; where: Record<string, unknown>; method: QueryMethod }): void {\n const { model, where, method } = params;\n for (const field of model.uniqueFields) {\n if (isDirectValue(where[field.name])) return;\n }\n for (const single of model.singleIndexUniques) {\n const field = single.fields[0] as FieldMeta;\n if (isAddressableMember({ value: where[field.name], nullsNotDistinct: single.nullsNotDistinct })) return;\n }\n for (const group of model.compoundUniques.values()) {\n if (\n group.fields.every((field) =>\n isAddressableMember({ value: where[field.name], nullsNotDistinct: group.nullsNotDistinct }),\n )\n )\n return;\n }\n const candidates = [\n ...model.uniqueFields.map((field) => field.name),\n ...model.singleIndexUniques.map((single) => (single.fields[0] as FieldMeta).name),\n ...model.compoundUniques.keys(),\n ];\n throw validationError({\n message: `${model.clientName}.${method}() needs a unique where — one of: ${candidates.join(\", \")}`,\n meta: { model: model.name, method, candidates },\n });\n}\n\n/**\n * The read-back key for a single-row update on a dialect WITHOUT RETURNING:\n * only the unique group the where addresses, overlaid with the values the\n * update itself writes.\n *\n * A conditional update (`where: { id, version }`) enforces its guard through\n * the UPDATE's own WHERE and its affected-row count — the client throws\n * not-found when zero rows matched. Carrying that guard into the read-back too\n * would re-select by a value the write has just changed, reporting NOT FOUND\n * for a write that in fact succeeded. Falls back to the full where when the\n * addressed group cannot be recovered (never worse than before).\n */\nfunction uniqueRefetchWhere(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n data: unknown;\n}): Record<string, unknown> {\n const { model, where, data } = params;\n const group = conflictTargetGroup({ model, where });\n const key: Record<string, unknown> = {};\n for (const field of group.fields) {\n if (!isAddressableMember({ value: where[field.name], nullsNotDistinct: group.nullsNotDistinct })) {\n return overlayRefetchWhere({ model, where, data });\n }\n key[field.name] = where[field.name];\n }\n return overlayRefetchWhere({ model, where: key, data });\n}\n\n/** The unique group an upsert's where addresses — its conflict target. */\nfunction conflictTargetGroup(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n}): UniqueGroupMeta {\n const { model, where } = params;\n for (const field of model.uniqueFields) {\n if (isDirectValue(where[field.name])) return { fields: [field], nullsNotDistinct: false };\n }\n for (const single of model.singleIndexUniques) {\n const field = single.fields[0] as FieldMeta;\n if (isAddressableMember({ value: where[field.name], nullsNotDistinct: single.nullsNotDistinct })) {\n return single;\n }\n }\n // A composite key addressed the row — conflict on exactly those columns\n // (the primary key is not always the one the where names).\n for (const group of model.compoundUniques.values()) {\n if (\n group.fields.every((field) =>\n isAddressableMember({ value: where[field.name], nullsNotDistinct: group.nullsNotDistinct }),\n )\n ) {\n return group;\n }\n }\n return { fields: model.primaryKey, nullsNotDistinct: false };\n}\n\n/**\n * Loose scalar equality for the upsert-eligibility check: the question is\n * \"would the create row and the where address the SAME row\", so `1n`, `1` and\n * `\"1\"` count as equal (the database coerces them to one key) and Dates\n * compare by instant. Anything unclear compares unequal — the FALLBACK flow is\n * always semantically correct, so false negatives only cost a statement.\n */\nfunction sameDirectValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n const comparable = (value: unknown): boolean =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"bigint\";\n if (comparable(a) && comparable(b)) return String(a) === String(b);\n return false;\n}\n\n/**\n * Whether `upsert({ where, create, update })` can ride ONE native\n * `INSERT … ON CONFLICT`/`ON DUPLICATE KEY` statement — Prisma's own\n * criterion: the create data must bind every conflict-target column with the\n * SAME value the where names. Otherwise the conflict can never fire on the\n * addressed row (postgres/sqlite would silently insert instead of update;\n * mysql's ODKU could update an unrelated row — SQL review B1) and the client\n * must run the transactional find-then-write fallback instead.\n */\n/**\n * Whether `upsert({ where, create, update })` can ride ONE native\n * `INSERT … ON CONFLICT`/`ON DUPLICATE KEY` statement — Prisma's own\n * criterion, two halves:\n * 1. the create data binds every conflict-target column with the SAME value\n * the where names (otherwise the conflict can never fire on the\n * addressed row — postgres/sqlite would silently insert instead of\n * update; mysql's ODKU could update an unrelated row — SQL review B1);\n * 2. the where carries NO fields beyond the conflict target (PG-2): a guard\n * field (`where: { email, active: true }`) is invisible to ON CONFLICT —\n * the update arm would fire even when the guard fails, where update()\n * honors the same guard.\n * Ineligible shapes run the client's transactional find-then-write fallback,\n * whose probe honors the FULL where.\n */\nexport function upsertUsesNativeStatement(params: {\n model: ModelMeta;\n args: Record<string, unknown>;\n}): boolean {\n const { model, args } = params;\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method: \"upsert\" });\n const create = requireObject({ value: args.create, what: \"create\", model });\n const target = conflictTargetGroup({ model, where });\n const targetNames = new Set(target.fields.map((field) => field.name));\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n if (!targetNames.has(key)) return false; // PG-2: guard field → fallback\n }\n return target.fields.every((field) => {\n const createValue = create[field.name];\n const whereValue = where[field.name];\n // NND: an explicit null in BOTH arms addresses the same (single) null slot.\n if (target.nullsNotDistinct && createValue === null && whereValue === null) return true;\n return isDirectValue(createValue) && sameDirectValue(createValue, whereValue);\n });\n}\n\n// ─── Data compilation ─────────────────────────────────\n\n/**\n * Per-model × dialect write plan (§9 precompute): each writable field with its\n * prebound codec encoder, plus the fields injected when absent (@updatedAt,\n * app-side defaults) so a create/update never scans the whole field list.\n */\ntype WriteFieldPlan = {\n readonly field: FieldMeta;\n /** `null` = the codec encode is a no-op for this dialect. */\n readonly encode: ((value: unknown) => unknown) | null;\n /** List field on a dialect without arrays — refuse via assertListWritable. */\n readonly listRefused: boolean;\n};\n\ntype ModelWritePlan = {\n readonly byKey: ReadonlyMap<string, WriteFieldPlan>;\n /** Fields injected when absent, in model field order. */\n readonly injected: readonly WriteFieldPlan[];\n};\n\nconst writePlanCache = new WeakMap<ModelMeta, Map<string, ModelWritePlan>>();\n\nfunction getWritePlan(params: { dialect: SqlDialect; model: ModelMeta }): ModelWritePlan {\n const { dialect, model } = params;\n let perDialect = writePlanCache.get(model);\n if (perDialect === undefined) {\n perDialect = new Map();\n writePlanCache.set(model, perDialect);\n }\n const hit = perDialect.get(dialect.name);\n if (hit !== undefined) return hit;\n\n const byKey = new Map<string, WriteFieldPlan>();\n const injected: WriteFieldPlan[] = [];\n for (const field of model.fields) {\n const entry: WriteFieldPlan = {\n field,\n encode: fieldEncoder({ dialect: dialect.name, field }),\n listRefused: field.isList && !dialect.capabilities.scalarArrays,\n };\n byKey.set(field.name, entry);\n if (field.isUpdatedAt || (field.defaultOrigin === \"app\" && field.default !== null)) {\n injected.push(entry);\n }\n }\n const plan: ModelWritePlan = { byKey, injected };\n perDialect.set(dialect.name, plan);\n return plan;\n}\n\n/** Plan-accelerated `encodeValue`: null/undefined pass, prebound codec otherwise. */\nfunction encodeWith(entry: WriteFieldPlan, value: unknown): unknown {\n if (value === null || value === undefined || entry.encode === null) return value;\n const encoded = entry.encode(value);\n // Non-list Json params ride a typed VALUES/SET cell: OID-typed drivers\n // (bun:sql) re-serialize a bare jsonb-slot param and DOUBLE-ENCODE the\n // pre-stringified document — the cell renders the dialect's param cast\n // (`$n::text::jsonb` on postgres, bare elsewhere) so the server parses the\n // text instead. See JsonParamCell in @vibeorm/sql. Lists ride the array\n // machinery (formatArrayParam) and never take the cell.\n if (entry.field.scalarType === \"Json\" && !entry.field.isList && typeof encoded === \"string\") {\n return jsonParamCell({ text: encoded });\n }\n return encoded;\n}\n\ntype CreateRow = {\n readonly values: Readonly<Record<string, unknown>>;\n /** Primary-key values known before the INSERT, when all of them are. */\n readonly knownKey: Record<string, unknown> | null;\n};\n\nfunction compileCreateRow(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n}): CreateRow {\n const { dialect, model, data } = params;\n const spec = requireObject({ value: data, what: \"data\", model });\n const plan = getWritePlan({ dialect, model });\n const values: Record<string, unknown> = {};\n const raw = new Map<string, unknown>();\n\n for (const name of Object.keys(spec)) {\n const value = spec[name];\n if (value === undefined) continue;\n const entry = plan.byKey.get(name);\n if (entry === undefined) {\n getFieldMeta({ model, field: name, context: \"data\" }); // throws the canonical error\n continue;\n }\n if (entry.listRefused) assertListWritable({ dialect, model, field: entry.field });\n if (isDbNow(value)) {\n raw.set(entry.field.name, value);\n values[entry.field.columnName] = compileDbNowWrite({ model, field: entry.field, value });\n continue;\n }\n if (Array.isArray(value) && value.some((item) => isDbNow(item))) {\n throw validationError({\n message: `dbNow() cannot be a list element (${model.name}.${entry.field.name})`,\n meta: { model: model.name, field: entry.field.name },\n });\n }\n raw.set(entry.field.name, value);\n values[entry.field.columnName] = encodeWith(entry, value);\n }\n\n for (const entry of plan.injected) {\n const field = entry.field;\n if (raw.has(field.name)) continue;\n // @updatedAt is stamped on create as well as update, matching Prisma.\n if (field.isUpdatedAt) {\n const now = new Date();\n raw.set(field.name, now);\n values[field.columnName] = encodeWith(entry, now);\n continue;\n }\n const generated = generateDefaultValue({ spec: field.default as NonNullable<FieldMeta[\"default\"]> });\n if (generated === undefined) continue;\n raw.set(field.name, generated);\n values[field.columnName] = encodeWith(entry, generated);\n }\n\n const knownKey: Record<string, unknown> = {};\n let keyComplete = model.primaryKey.length > 0;\n for (const field of model.primaryKey) {\n const value = raw.get(field.name);\n if (value === undefined) {\n keyComplete = false;\n break;\n }\n knownKey[field.name] = value;\n }\n\n return { values, knownKey: keyComplete ? knownKey : null };\n}\n\n/**\n * Column order for an INSERT: model field order, never the caller's key order,\n * so the same logical create always renders the same SQL text.\n */\nfunction orderedColumns(params: { model: ModelMeta; values: Readonly<Record<string, unknown>> }): string[] {\n const { model, values } = params;\n return model.fields.map((field) => field.columnName).filter((column) => column in values);\n}\n\nfunction compileAtomicOperation(params: {\n model: ModelMeta;\n field: FieldMeta;\n operator: SetOperator;\n operand: unknown;\n}): { readonly __op: SetOperator; readonly value: number } {\n const { model, field, operator, operand } = params;\n if (field.scalarType === null || !NUMERIC_TYPES.includes(field.scalarType)) {\n throw validationError({\n message: `\"${operator}\" needs a numeric field, but ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n const numeric = typeof operand === \"bigint\" ? Number(operand) : operand;\n if (typeof numeric !== \"number\" || !Number.isFinite(numeric)) {\n throw validationError({\n message: `\"${operator}\" on ${model.name}.${field.name} expects a number`,\n meta: { model: model.name, field: field.name, operator, operand },\n });\n }\n return { __op: operator, value: numeric };\n}\n\nfunction compileUpdateSet(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n /**\n * `skipUpdatedAt: true` — leave @updatedAt columns untouched on THIS\n * statement (bookkeeping writes that must not look like content edits).\n * An explicit data value for the column still wins, as always.\n */\n skipUpdatedAt?: boolean;\n}): Record<string, unknown> {\n const { dialect, model, data } = params;\n const spec = requireObject({ value: data, what: \"data\", model });\n const plan = getWritePlan({ dialect, model });\n const set: Record<string, unknown> = {};\n const touched = new Set<string>();\n\n for (const name of Object.keys(spec)) {\n const value = spec[name];\n if (value === undefined) continue;\n const entry = plan.byKey.get(name);\n if (entry === undefined) {\n getFieldMeta({ model, field: name, context: \"data\" }); // throws the canonical error\n continue;\n }\n const field = entry.field;\n if (entry.listRefused) assertListWritable({ dialect, model, field });\n touched.add(field.name);\n\n if (isDbNow(value)) {\n set[field.columnName] = compileDbNowWrite({ model, field, value });\n continue;\n }\n if (Array.isArray(value) && value.some((item) => isDbNow(item))) {\n throw validationError({\n message: `dbNow() cannot be a list element (${model.name}.${field.name})`,\n meta: { model: model.name, field: field.name },\n });\n }\n\n // Json values are opaque payloads — `{ set: … }` and `{ increment: … }`\n // wrappers are not interpreted inside them.\n if (isPlainObject(value) && field.scalarType !== \"Json\") {\n const entries = Object.entries(value).filter(([, operand]) => operand !== undefined);\n if (entries.length !== 1) {\n throw validationError({\n message: `update of ${model.name}.${field.name} must use exactly one operation`,\n meta: { model: model.name, field: field.name, operations: entries.map(([key]) => key) },\n });\n }\n const [operator, operand] = entries[0] as [string, unknown];\n if (operator === \"set\") {\n set[field.columnName] = isDbNow(operand)\n ? compileDbNowWrite({ model, field, value: operand })\n : encodeWith(entry, operand);\n continue;\n }\n if (operator === \"push\" && field.isList) {\n // assertListWritable above already refused dialects without arrays.\n // One element → array_append; an array → || concatenation.\n set[field.columnName] = Array.isArray(operand)\n ? { __listOp: \"concat\", value: encodeWith(entry, operand) }\n : { __listOp: \"append\", value: encodeWith(entry, operand) };\n continue;\n }\n const atomic = ATOMIC_OPERATIONS[operator];\n if (atomic === undefined) {\n throw validationError({\n message: `unknown update operation \"${operator}\" on ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, operator },\n });\n }\n set[field.columnName] = compileAtomicOperation({ model, field, operator: atomic, operand });\n continue;\n }\n\n set[field.columnName] = encodeWith(entry, value);\n }\n\n if (params.skipUpdatedAt !== true) {\n for (const entry of plan.injected) {\n if (!entry.field.isUpdatedAt || touched.has(entry.field.name)) continue;\n set[entry.field.columnName] = encodeWith(entry, new Date());\n }\n }\n\n if (Object.keys(set).length === 0) {\n throw validationError({\n message: `update of model \"${model.name}\" must change at least one field`,\n meta: { model: model.name },\n });\n }\n return set;\n}\n\ntype CreateManyGroup = { readonly columns: string[]; readonly rows: unknown[][] };\n\n/**\n * createMany rows → one or more INSERT groups.\n *\n * Homogeneous rows stay ONE statement. Heterogeneous rows (M4, SQL review):\n * a missing cell means \"let the COLUMN default apply\" — binding NULL there\n * either violated NOT NULL or silently wrote NULL over a DB default. On\n * dialects with the per-row DEFAULT keyword (postgres/mysql) the union of\n * columns stays one statement with `SQL_DEFAULT_CELL` sentinels; sqlite has\n * no row DEFAULT, so rows group by their column set into separate statements\n * (first-appearance order) that the client runs in ONE transaction.\n *\n * Every group is then re-chunked to the dialect's parameter budget (M7):\n * sqlite hard-errors past ~32k bound params and mysql caps at 65535 —\n * unbounded VALUES lists are never emitted.\n */\nfunction compileCreateRows(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n data: unknown;\n /** Names the method in the empty-input refusal; defaults to createMany. */\n method?: QueryMethod;\n /**\n * EPIC 10: receives every compiled row, in INPUT order, before grouping —\n * upsertMany validates the whole logical input (conflict keys, update\n * columns) against these, and it must see the per-row map the grouping\n * flattens away.\n */\n inspectRows?: (rows: readonly Readonly<Record<string, unknown>>[]) => void;\n}): CreateManyGroup[] {\n const { dialect, model, data } = params;\n const items = Array.isArray(data) ? data : [data];\n if (items.length === 0) {\n throw validationError({\n message: `${params.method ?? \"createMany\"} on model \"${model.name}\" needs at least one row`,\n meta: { model: model.name },\n });\n }\n const compiled = items.map((item) => compileCreateRow({ dialect, model, data: item }).values);\n params.inspectRows?.(compiled);\n\n // Column order is model field order — deterministic whatever order the\n // caller wrote the keys in.\n const present = new Set<string>();\n for (const row of compiled) {\n for (const column of Object.keys(row)) present.add(column);\n }\n const unionColumns = model.fields.map((field) => field.columnName).filter((column) => present.has(column));\n const homogeneous = compiled.every((row) => unionColumns.every((column) => column in row));\n\n let groups: CreateManyGroup[];\n if (homogeneous) {\n groups = [{ columns: unionColumns, rows: compiled.map((row) => unionColumns.map((column) => row[column])) }];\n } else if (dialect.rowDefaultKeyword) {\n groups = [\n {\n columns: unionColumns,\n rows: compiled.map((row) => unionColumns.map((column) => (column in row ? row[column] : SQL_DEFAULT_CELL))),\n },\n ];\n } else {\n const bySignature = new Map<string, CreateManyGroup>();\n for (const row of compiled) {\n const columns = unionColumns.filter((column) => column in row);\n const signature = columns.join(\"\\u0000\");\n let group = bySignature.get(signature);\n if (group === undefined) {\n group = { columns, rows: [] };\n bySignature.set(signature, group);\n }\n group.rows.push(columns.map((column) => row[column]));\n }\n groups = [...bySignature.values()];\n }\n\n // M7: parameter-budget chunking (DEFAULT cells bind nothing, but counting\n // them keeps the arithmetic simple and errs conservative).\n const chunked: CreateManyGroup[] = [];\n for (const group of groups) {\n const columnCount = Math.max(1, group.columns.length);\n const rowsPerChunk = Math.max(1, Math.floor(dialect.paramBudget / columnCount));\n for (let start = 0; start < group.rows.length; start += rowsPerChunk) {\n chunked.push({ columns: group.columns, rows: group.rows.slice(start, start + rowsPerChunk) });\n }\n }\n return chunked;\n}\n\n// ─── Statement assembly ───────────────────────────────────────────\n\n// ─── Find pipeline (order · cursor · distinct · pagination) ───────\n\n/**\n * `take` on the find methods — negative values are backwards pagination on\n * findMany and \"the last row\" on findFirst (#13), so both accept them.\n */\nfunction compileTake(params: { value: unknown; model: ModelMeta }): number {\n const { value, model } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw validationError({\n message: `take must be an integer on model \"${model.name}\", got ${String(value)}`,\n meta: { model: model.name, argument: \"take\", value },\n });\n }\n return value;\n}\n\ntype ParsedCursor = {\n readonly fields: readonly FieldMeta[];\n readonly values: readonly unknown[];\n};\n\n/**\n * `cursor: { uniqueField: value }` — the position to paginate FROM,\n * EXCLUSIVELY: the cursor row itself is not returned (v1 semantics, documented\n * in FROM_PRISMA.md as a deliberate deviation from Prisma's inclusive cursor;\n * carry that note into the v2 migration guide). A single-field cursor must be\n * `@id`/`@unique`; a multi-field cursor must be exactly the composite primary\n * key or a composite `@@unique` group — the generated WhereUniqueInput's\n * compound sugar (`cursor: { userId_planId: {…} }`) expands first (#4).\n */\nfunction parseCursor(params: { model: ModelMeta; cursor: unknown }): ParsedCursor {\n const { model } = params;\n const spec = expandCompoundWhere({\n model,\n where: requireObject({ value: params.cursor, what: \"cursor\", model }),\n what: \"cursor\",\n });\n const entries = Object.entries(spec).filter(([, value]) => value !== undefined);\n if (entries.length === 0) {\n throw validationError({\n message: `cursor on model \"${model.name}\" needs a unique field value`,\n meta: { model: model.name },\n });\n }\n const fields: FieldMeta[] = [];\n const values: unknown[] = [];\n for (const [name, value] of entries) {\n const field = getFieldMeta({ model, field: name, context: \"cursor\" });\n if (!isDirectValue(value)) {\n throw validationError({\n message: `cursor.${name} on model \"${model.name}\" must be a direct value`,\n meta: { model: model.name, field: name },\n });\n }\n fields.push(field);\n values.push(value);\n }\n if (fields.length === 1) {\n const field = fields[0] as FieldMeta;\n const isSingleIndexUnique = model.singleIndexUniques.some(\n (single) => (single.fields[0] as FieldMeta).name === field.name,\n );\n if (!field.isId && !field.isUnique && !isSingleIndexUnique) {\n throw validationError({\n message: `cursor field ${model.name}.${field.name} must be @id or @unique — a non-unique cursor cannot identify a position`,\n meta: { model: model.name, field: field.name },\n });\n }\n } else {\n const names = new Set(fields.map((field) => field.name));\n const matchesGroup = (group: readonly FieldMeta[]): boolean =>\n group.length === names.size && group.every((field) => names.has(field.name));\n const matches =\n matchesGroup(model.primaryKey) ||\n [...model.compoundUniques.values()].some((group) => matchesGroup(group.fields));\n if (!matches) {\n const candidates = [\n model.primaryKey.map((field) => field.name).join(\" + \") || \"none\",\n ...model.compoundUniques.keys(),\n ];\n throw validationError({\n message: `multi-field cursor on model \"${model.name}\" must be exactly the composite primary key or a composite @@unique group (${candidates.join(\", \")})`,\n meta: { model: model.name, fields: [...names] },\n });\n }\n }\n return { fields, values };\n}\n\n// ─── Keyset pagination (EPIC 7) ──────────────────────────────────\n\n/**\n * The scalar field an order term names — or a refusal. Relation/aggregate\n * order terms compile to correlated subqueries whose value is not on the row,\n * so no position can describe them; the same is true of a computed key.\n */\nfunction keysetFieldOfTerm(params: { dialect: SqlDialect; model: ModelMeta; term: FindOrderTerm }): FieldMeta {\n const { dialect, model, term } = params;\n if (!(\"column\" in term)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `keyset pagination over a relation or aggregate orderBy on model \"${model.name}\"`,\n hint: \"order by scalar columns plus a unique tie-breaker; a correlated subquery value is not on the row, so no position can describe it\",\n });\n }\n const field = model.fieldByColumn.get(term.column.name);\n if (field === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `keyset pagination over a computed order key on model \"${model.name}\"`,\n hint: \"order by scalar columns plus a unique tie-breaker\",\n });\n }\n return field;\n}\n\n/**\n * Compile a raw `orderBy` argument into keyset order inputs — the ONE parsing\n * path the iterator and the `after` bound share, so a token's signature can\n * never drift from the ordering the statement carries.\n */\nexport function compileKeysetOrderInputs(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n orderBy: unknown;\n}): KeysetOrderInput[] {\n const { dialect, meta, model, orderBy } = params;\n const terms = compileFindOrderBy({ dialect, meta, model, orderBy, qualify: undefined, aliasSeq: { n: 0 } });\n return terms.map((term) => {\n const field = keysetFieldOfTerm({ dialect, model, term });\n const column = term as OrderByColumn;\n return { field, direction: column.direction, nulls: resolveOrderNulls({ dialect, term: column }) };\n });\n}\n\n/**\n * Where NULLs sort for one order term: the explicit request, else the\n * dialect's native placement (postgres: NULLs are largest — last on ASC;\n * sqlite/mysql: smallest — first on ASC). The same rule `resortKeysOf` and the\n * legacy cursor bound already use, named once so the keyset plan, the keyset\n * bound and the token signature cannot drift apart.\n */\nfunction resolveOrderNulls(params: { dialect: SqlDialect; term: OrderByColumn }): KeysetNulls {\n const { dialect, term } = params;\n const nativeFirst = dialect.name === \"postgres\" ? term.direction === \"desc\" : term.direction === \"asc\";\n return term.nulls ?? (nativeFirst ? \"first\" : \"last\");\n}\n\n/** The `keyset: { … }` per-query options bag. */\nfunction parseKeysetOptions(params: {\n model: ModelMeta;\n value: unknown;\n}): { timestampPrecision?: KeysetTimestampPrecision } {\n const { model, value } = params;\n if (value === undefined) return {};\n const spec = requireObject({ value, what: \"keyset\", model });\n for (const key of Object.keys(spec)) {\n if (key !== \"timestampPrecision\") {\n throw validationError({\n message: `unknown keyset option \"${key}\" on model \"${model.name}\" — only timestampPrecision is supported`,\n meta: { model: model.name, option: key, reason: \"keyset-option-unknown\" },\n });\n }\n }\n const precision = spec.timestampPrecision;\n if (precision === undefined) return {};\n if (precision !== \"milliseconds\") {\n throw validationError({\n message: `keyset.timestampPrecision on model \"${model.name}\" must be \"milliseconds\"`,\n meta: { model: model.name, value: precision, reason: \"keyset-option-invalid\" },\n });\n }\n return { timestampPrecision: \"milliseconds\" };\n}\n\n/**\n * The EXCLUSIVE lexicographic bound for a keyset position.\n *\n * `userOrder` is the caller's own ordering — it defines the token's signature,\n * so a token stays valid when the same query is re-run with a negative `take`.\n * `sqlOrder` is the ordering the STATEMENT carries (flipped for a negative\n * take), and every comparison operator and NULL placement comes from it, so\n * \"after this position\" always means \"later in the sequence the rows come back\n * in\".\n *\n * Per key, \"strictly after the position\" is:\n * value is not null → `col > v` (asc) / `col < v` (desc), OR `col IS NULL`\n * when NULLs sort last on this term;\n * value IS null → nothing follows when NULLs sort last; every non-null\n * row follows when they sort first.\n * \"equal to the position\" is `col = v`, or `col IS NULL` for a null value —\n * which is what makes a nullable ordering key tie-break correctly instead of\n * evaluating to UNKNOWN.\n */\nfunction buildKeysetBound(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n args: Record<string, unknown>;\n userOrder: readonly FindOrderTerm[];\n sqlOrder: readonly FindOrderTerm[];\n colRefOf: (field: FieldMeta) => ColRef;\n}): SqlExpr {\n const { dialect, model, args, userOrder, sqlOrder, colRefOf } = params;\n if (args.cursor !== undefined) {\n throw validationError({\n message: `after and cursor cannot combine on model \"${model.name}\" — a keyset position and a unique-key cursor are two different pagination forms`,\n meta: { model: model.name, reason: \"keyset-cursor-conflict\" },\n });\n }\n if (args.distinct !== undefined) {\n throw validationError({\n message: `after cannot combine with distinct on model \"${model.name}\" — deduplication reorders the result, so a position in the requested order does not address it`,\n meta: { model: model.name, reason: \"keyset-distinct-unsupported\" },\n });\n }\n if (args.skip !== undefined) {\n throw validationError({\n message: `after cannot combine with skip on model \"${model.name}\" — keyset pagination has no offset, and an offset on top of it is not keyset pagination`,\n meta: { model: model.name, reason: \"keyset-skip-unsupported\" },\n });\n }\n if (userOrder.length === 0) {\n throw validationError({\n message: `after on model \"${model.name}\" needs an orderBy — a position has no meaning without an order`,\n meta: { model: model.name, reason: \"keyset-order-required\" },\n });\n }\n const fieldOfTerm = (term: FindOrderTerm): FieldMeta => keysetFieldOfTerm({ dialect, model, term });\n\n const planTerms: KeysetOrderInput[] = (userOrder as readonly FindOrderTerm[]).map((term) => {\n const field = fieldOfTerm(term);\n const column = term as OrderByColumn;\n return { field, direction: column.direction, nulls: resolveOrderNulls({ dialect, term: column }) };\n });\n const plan = compileKeysetOrderPlan({\n model,\n dialect,\n terms: planTerms,\n ...parseKeysetOptions({ model, value: args.keyset }),\n });\n const values = decodeKeysetToken({ plan, token: args.after as string });\n\n const boundKeys = (sqlOrder as readonly FindOrderTerm[]).map((term, index) => {\n const field = fieldOfTerm(term);\n const column = term as OrderByColumn;\n return {\n field,\n direction: column.direction,\n nulls: resolveOrderNulls({ dialect, term: column }),\n value: values[index],\n };\n });\n\n const equalTo = (key: (typeof boundKeys)[number]): SqlExpr =>\n key.value === null\n ? { kind: \"isNull\", column: columnRef({ field: key.field }) }\n : {\n kind: \"cmp\",\n op: \"eq\",\n column: colRefOf(key.field),\n value: encodeFilterValue({ dialect: dialect.name, field: key.field, value: key.value }),\n };\n\n /** `null` when NOTHING can follow this position on this key. */\n const strictlyAfter = (key: (typeof boundKeys)[number]): SqlExpr | null => {\n if (key.value === null) {\n return key.nulls === \"last\" ? null : { kind: \"isNull\", column: columnRef({ field: key.field }), negate: true };\n }\n const compare: SqlExpr = {\n kind: \"cmp\",\n op: key.direction === \"asc\" ? \"gt\" : \"lt\",\n column: colRefOf(key.field),\n value: encodeFilterValue({ dialect: dialect.name, field: key.field, value: key.value }),\n };\n return key.field.isOptional && key.nulls === \"last\"\n ? { kind: \"or\", operands: [compare, { kind: \"isNull\", column: columnRef({ field: key.field }) }] }\n : compare;\n };\n\n const branches: SqlExpr[] = [];\n for (let index = 0; index < boundKeys.length; index++) {\n const after = strictlyAfter(boundKeys[index] as (typeof boundKeys)[number]);\n if (after === null) continue;\n const operands: SqlExpr[] = [];\n for (let previous = 0; previous < index; previous++) {\n operands.push(equalTo(boundKeys[previous] as (typeof boundKeys)[number]));\n }\n operands.push(after);\n branches.push(operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands });\n }\n if (branches.length === 0) {\n // The position is the very END of the sequence — every key is a NULL that\n // sorts last — so nothing follows it. Expressed as a contradiction on the\n // leading key rather than raw SQL text, so it renders on every dialect.\n const leading = (boundKeys[0] as (typeof boundKeys)[number]).field;\n return {\n kind: \"and\",\n operands: [\n { kind: \"isNull\", column: columnRef({ field: leading }) },\n { kind: \"isNull\", column: columnRef({ field: leading }), negate: true },\n ],\n };\n }\n return branches.length === 1 ? (branches[0] as SqlExpr) : { kind: \"or\", operands: branches };\n}\n\n/**\n * Top-level SCALAR field names an `orderBy` argument references (F21). Relation\n * order terms are not scalars and cannot ride a projection; `distinct` refuses\n * them at build time anyway.\n */\nfunction orderByScalarFields(params: { model: ModelMeta; orderBy: unknown }): string[] {\n const { model, orderBy } = params;\n const names: string[] = [];\n const visit = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const entry of value) visit(entry);\n return;\n }\n if (!isPlainObject(value)) return;\n for (const [key, spec] of Object.entries(value)) {\n if (spec === undefined) continue;\n if (model.fieldByName.has(key)) names.push(key);\n }\n };\n visit(orderBy);\n return names;\n}\n\nfunction normalizeDistinct(params: { model: ModelMeta; distinct: unknown }): FieldMeta[] {\n const { model, distinct } = params;\n const names = typeof distinct === \"string\" ? [distinct] : distinct;\n if (!Array.isArray(names) || names.length === 0 || names.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `distinct on model \"${model.name}\" must be a field name or a non-empty array of field names`,\n meta: { model: model.name },\n });\n }\n return (names as string[]).map((name) => getFieldMeta({ model, field: name, context: \"distinct\" }));\n}\n\nfunction flipOrderTerms(terms: readonly FindOrderTerm[]): FindOrderTerm[] {\n return terms.map((term) => {\n const direction = term.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const);\n if (\"select\" in term) return { ...term, direction };\n return {\n ...term,\n direction,\n ...(term.nulls === undefined ? {} : { nulls: term.nulls === \"first\" ? (\"last\" as const) : (\"first\" as const) }),\n };\n });\n}\n\ntype FindShape = {\n readonly statement: SelectStatement;\n readonly reverseRows: boolean;\n readonly resortBy: readonly ResortKey[] | null;\n};\n\n/**\n * Resolve the client-side re-sort keys for `distinct` + a user orderBy (N1):\n * the user's own terms, with `nulls` resolved to what the SQL order would\n * have done — the explicit request, else the dialect's native placement\n * (postgres: NULLs are largest — last on ASC; sqlite/mysql: smallest — first\n * on ASC). Decimal ranks numerically (B4 mirror).\n */\nfunction resortKeysOf(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n terms: readonly OrderByColumn[];\n}): ResortKey[] {\n const { dialect, model, terms } = params;\n return terms.map((term) => {\n const field = model.fieldByColumn.get(term.column.name);\n const nativeFirst = dialect.name === \"postgres\" ? term.direction === \"desc\" : term.direction === \"asc\";\n return {\n field: field?.name ?? term.column.name,\n direction: term.direction,\n nulls: term.nulls ?? (nativeFirst ? \"first\" : \"last\"),\n decimal: field !== undefined && field.scalarType === \"Decimal\" && !field.isList,\n };\n });\n}\n\n/**\n * The find-statement pipeline shared by findMany/findFirst/findUnique on both\n * relation strategies. Order of operations:\n * 1. base order = explicit orderBy, else the cursor fields ASC, else the PK\n * (when reversing, or under `defaultOrderByPk`), else nothing;\n * 2. a negative take flips the SQL order — rows re-reverse client-side;\n * 3. the cursor compiles to an EXCLUSIVE lexicographic bound against that\n * SQL order (`(a > $1) OR (a = $1 AND b > $2) …`);\n * 4. distinct leads the ORDER BY with its fields (a user's direction on them\n * is kept) and appends the PK tie-breaker (`distinctOrderByPk`, default\n * true) — native DISTINCT ON on postgres, a client post-filter elsewhere,\n * over the SAME ordering, so every dialect keeps the same first-row-per-key.\n */\nfunction buildFindShape(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n args: Record<string, unknown>;\n selectedFields: readonly string[] | null;\n firstLimit?: number;\n selection?: RelationSelection;\n clientOptions: BuilderClientOptions | undefined;\n}): FindShape {\n const { dialect, meta, model, args, selectedFields, firstLimit, selection, clientOptions } = params;\n const useLateral = selection !== undefined;\n const qualify = useLateral ? model.tableName : undefined;\n\n let where =\n args.where === undefined\n ? undefined\n : compileWhere({\n dialect,\n meta,\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n ...(qualify === undefined ? {} : { qualify }),\n });\n\n // #13: findFirst accepts `take` with Prisma semantics — the limit stays 1\n // (or 0 for `take: 0`), and a NEGATIVE take flips the order so `take: -1`\n // reads \"the last row\".\n const take = args.take === undefined ? undefined : compileTake({ value: args.take, model });\n const backward = take !== undefined && take < 0;\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n\n const userOrder: FindOrderTerm[] =\n args.orderBy === undefined\n ? []\n : compileFindOrderBy({ dialect, meta, model, orderBy: args.orderBy, qualify, aliasSeq: { n: 0 } });\n\n const cursor = args.cursor === undefined ? undefined : parseCursor({ model, cursor: args.cursor });\n const paginating = args.take !== undefined || args.skip !== undefined || firstLimit !== undefined;\n\n // Order/compare context — carries B4's sqlite Decimal cast where needed.\n const colRefOf = (field: FieldMeta): ColRef =>\n compareColumnRef({ dialect, field, ...(qualify === undefined ? {} : { table: qualify }) });\n\n let baseOrder: FindOrderTerm[] = userOrder;\n if (baseOrder.length === 0 && cursor !== undefined) {\n baseOrder = cursor.fields.map((field) => ({ column: colRefOf(field), direction: \"asc\" as const }));\n }\n if (baseOrder.length === 0 && (backward || clientOptions?.defaultOrderByPk === true)) {\n baseOrder = model.primaryKey.map((field) => ({ column: colRefOf(field), direction: \"asc\" as const }));\n }\n if (backward && baseOrder.length === 0) {\n throw validationError({\n message: `negative take on model \"${model.name}\" needs an orderBy (or a primary key) to reverse`,\n meta: { model: model.name },\n });\n }\n\n let orderTerms: FindOrderTerm[] = backward ? flipOrderTerms(baseOrder) : baseOrder;\n\n let distinctOn: ColRef[] | undefined;\n let emulateDistinct = false;\n let resortBy: ResortKey[] | null = null;\n let distinctLeadCount = 0;\n let distinctPartition: ColRef[] | null = null;\n /** F22: the requested order, applied to the DEDUPLICATED result before paging. */\n let distinctOuterOrder: OrderByColumn[] | null = null;\n if (args.distinct !== undefined) {\n if (backward) {\n throw validationError({\n message: `distinct cannot combine with a negative take on model \"${model.name}\"`,\n meta: { model: model.name },\n });\n }\n if (orderTerms.some((term) => \"select\" in term)) {\n // The N1 re-sort mirrors the SQL order client-side — a correlated\n // subquery's value is not on the row, so it cannot be mirrored.\n throw validationError({\n message: `distinct cannot combine with a relation orderBy on model \"${model.name}\"`,\n meta: { model: model.name },\n });\n }\n const columnTerms = orderTerms as OrderByColumn[];\n // N1 (board #22): the DISTINCT arrangement demotes the user's order — the\n // client re-sorts the final rows by the user's own terms afterwards.\n if (userOrder.length > 0) {\n resortBy = resortKeysOf({ dialect, model, terms: userOrder as OrderByColumn[] });\n }\n const distinctFields = normalizeDistinct({ model, distinct: args.distinct });\n // SQLITE-4 stays true under the ROW_NUMBER emulation: the PARTITION uses\n // the PLAIN column (never the B4 REAL cast), so a sqlite Decimal key still\n // deduplicates on its exact text — the same keys the old client-side\n // post-filter produced.\n distinctPartition = distinctFields.map((field) => columnRef({ field }));\n const leading: OrderByColumn[] = distinctFields.map((field) => {\n const existing = columnTerms.find((term) => term.column.name === field.columnName);\n return existing ?? { column: colRefOf(field), direction: \"asc\" as const };\n });\n const rest = columnTerms.filter(\n (term) => !distinctFields.some((field) => field.columnName === term.column.name),\n );\n orderTerms = [...leading, ...rest];\n if (clientOptions?.distinctOrderByPk !== false) {\n for (const field of model.primaryKey) {\n if (!(orderTerms as OrderByColumn[]).some((term) => term.column.name === field.columnName)) {\n orderTerms.push({ column: colRefOf(field), direction: \"asc\" });\n }\n }\n }\n distinctLeadCount = leading.length;\n // F22: pagination must cut the DEDUPLICATED result in the order the caller\n // asked for. The DISTINCT arrangement leads with the distinct key, so a\n // LIMIT placed on it returns \"the first row per key\", not \"the first row of\n // this query's own unpaged result\". When both a user order and a page are\n // present the representative selection happens in an inner select and the\n // page is cut on an OUTER select carrying the user's order — and the client\n // re-sort is then redundant (the SQL already produced that order).\n if (paginating && userOrder.length > 0) {\n distinctOuterOrder = (userOrder as OrderByColumn[]).map((term) => {\n const field = model.fieldByColumn.get(term.column.name);\n return field === undefined ? term : { ...term, column: compareColumnRef({ dialect, field }) };\n });\n if (clientOptions?.distinctOrderByPk !== false) {\n for (const field of model.primaryKey) {\n if (!distinctOuterOrder.some((term) => term.column.name === field.columnName)) {\n distinctOuterOrder.push({ column: compareColumnRef({ dialect, field }), direction: \"asc\" });\n }\n }\n }\n resortBy = null;\n }\n if (dialect.capabilities.distinctOn) {\n distinctOn = distinctFields.map((field) => colRefOf(field));\n } else {\n emulateDistinct = true;\n }\n }\n\n // M3 (SQL review): a cursor bound is only cursor pagination when the FINAL\n // ordering — after the distinct reorder — LEADS with the cursor fields: the\n // lexicographic bound walks that leading prefix. Anything else (`cursor:\n // { id } + orderBy: { karma: \"desc\" }`) would filter raw key ranges while\n // presenting an unrelated order — not pagination, refused at build time.\n if (cursor !== undefined) {\n const leading = orderTerms.slice(0, cursor.fields.length);\n const cursorIndexByColumn = new Map(cursor.fields.map((field, index) => [field.columnName, index]));\n const leadingColumns = leading.filter((term): term is OrderByColumn => \"column\" in term);\n const coherent =\n leadingColumns.length === leading.length &&\n leading.length === cursor.fields.length &&\n new Set(leadingColumns.map((term) => term.column.name)).size === leading.length &&\n leadingColumns.every((term) => cursorIndexByColumn.has(term.column.name));\n if (!coherent) {\n throw validationError({\n message: `cursor pagination on model \"${model.name}\" needs orderBy to lead with the cursor field(s) ${cursor.fields\n .map((field) => `\"${field.name}\"`)\n .join(\", \")} — a cursor bound over a different ordering is not cursor pagination`,\n meta: { model: model.name, cursorFields: cursor.fields.map((field) => field.name) },\n });\n }\n // The bound follows the ORDER BY's leading sequence (a composite cursor's\n // object-key order is irrelevant), each op from that term's direction.\n const sequence = (leading as OrderByColumn[]).map((term) => {\n const index = cursorIndexByColumn.get(term.column.name) as number;\n const field = cursor.fields[index] as FieldMeta;\n // F25: SQL's three-valued logic evaluates `col > $1` as UNKNOWN for a\n // NULL row, so a nullable key needs to know where NULLs SORT. The\n // explicit request wins; otherwise the dialect's native placement\n // (postgres: NULLs largest — last on ASC; sqlite/mysql: smallest — first\n // on ASC), the same rule `resortKeysOf` mirrors client-side.\n const nativeFirst = dialect.name === \"postgres\" ? term.direction === \"desc\" : term.direction === \"asc\";\n const nulls = term.nulls ?? (nativeFirst ? \"first\" : \"last\");\n return {\n field,\n op: (term.direction === \"asc\" ? \"gt\" : \"lt\") as \"gt\" | \"lt\",\n value: encodeFilterValue({ dialect: dialect.name, field, value: cursor.values[index] }),\n // NULL rows sort AFTER this cursor's value, so they belong on the next\n // page and the bound must admit them.\n includeNulls: field.isOptional && nulls === \"last\",\n };\n });\n const branches: SqlExpr[] = sequence.map((entry, index) => {\n const operands: SqlExpr[] = [];\n for (let previous = 0; previous < index; previous++) {\n const before = sequence[previous] as (typeof sequence)[number];\n operands.push({ kind: \"cmp\", op: \"eq\", column: colRefOf(before.field), value: before.value });\n }\n const compare: SqlExpr = { kind: \"cmp\", op: entry.op, column: colRefOf(entry.field), value: entry.value };\n operands.push(\n entry.includeNulls\n ? { kind: \"or\", operands: [compare, { kind: \"isNull\", column: columnRef({ field: entry.field }) }] }\n : compare,\n );\n return operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands };\n });\n const bound: SqlExpr = branches.length === 1 ? (branches[0] as SqlExpr) : { kind: \"or\", operands: branches };\n where = where === undefined ? bound : { kind: \"and\", operands: [where, bound] };\n }\n\n // EPIC 7: the sort-aware keyset position. Mutually exclusive with `cursor`\n // (refused inside), and built from the SQL ordering so a negative take walks\n // backwards from the same position.\n if (args.after !== undefined) {\n if (typeof args.after !== \"string\") {\n throw validationError({\n message: `after on model \"${model.name}\" must be a keyset token string`,\n meta: { model: model.name, reason: \"keyset-token-malformed\" },\n });\n }\n const bound = buildKeysetBound({\n dialect,\n model,\n args,\n userOrder,\n sqlOrder: orderTerms,\n colRefOf,\n });\n where = where === undefined ? bound : { kind: \"and\", operands: [where, bound] };\n } else if (args.keyset !== undefined) {\n // Options without a position are almost always a typo for `after`.\n parseKeysetOptions({ model, value: args.keyset });\n }\n\n // #13: under a firstLimit (findFirst) the limit stays 1 — except `take: 0`,\n // which honestly fetches nothing.\n const absTake = take === undefined ? undefined : Math.abs(take);\n const limit =\n firstLimit === undefined ? absTake : absTake === undefined ? firstLimit : Math.min(firstLimit, absTake);\n const offset = skip;\n\n const lateralJoins = useLateral\n ? selection.relations.map((node, index) => buildLateralJoinClause({ dialect, meta, model, node, index }))\n : [];\n const projected = projectionColumns({\n model,\n selectedFields,\n ...(qualify === undefined ? {} : { table: qualify }),\n });\n const columns: readonly ColRef[] =\n lateralJoins.length === 0\n ? projected\n : [...projected, ...lateralJoins.map((join) => ({ table: join.alias, name: join.columnAlias }))];\n\n /**\n * F22 regression: a derived table exposes ONLY the columns its inner select\n * PROJECTS, so every column the OUTER order names — the implicit primary-key\n * tiebreaker included — has to ride that inner projection or the engine\n * cannot resolve the reference. MEASURED on the wrapped shape: postgres\n * rejects it (SQLSTATE 42703, `column \"id\" does not exist`) and so does\n * mysql (`Unknown column 'id' in 'order clause'`); sqlite happens to\n * TOLERATE the dangling reference, which is precisely why text pins and\n * fake adapters hid the defect. This is F21's problem one level up: an order\n * key that is not in the projection. The OUTER column list stays the\n * caller's own projection, so a key added here is dropped at the wrap and\n * never reaches the payload.\n */\n const withOuterOrderKeys = (inner: readonly ColRef[], order: readonly OrderByColumn[]): ColRef[] => {\n const out = [...inner];\n for (const term of order) {\n if (out.some((column) => column.name === term.column.name)) continue;\n const field = model.fieldByColumn.get(term.column.name);\n if (field === undefined) continue;\n out.push(columnRef({ field, ...(qualify === undefined ? {} : { table: qualify }) }));\n }\n return out;\n };\n\n if (emulateDistinct) {\n // ROW_NUMBER emulation (N10): the inner select carries the WHERE (cursor\n // bound included) and a `ROW_NUMBER() OVER (PARTITION BY <distinct cols>\n // ORDER BY <rest of the arranged order>)`; the outer keeps `__rn = 1` —\n // the same representative row DISTINCT ON picks — and orders by the\n // leading distinct terms only (each key appears exactly once after the\n // filter, so they fully determine the sequence). take/skip bound the\n // OUTER select — SQL-side pagination, bounded transfer. The lateral path\n // cannot reach here: lateral joins are postgres-only, and postgres has\n // DISTINCT ON.\n const arranged = orderTerms as OrderByColumn[];\n const windowOrder = arranged.slice(distinctLeadCount);\n const outerOrder = distinctOuterOrder ?? arranged.slice(0, distinctLeadCount);\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns: withOuterOrderKeys(columns, outerOrder),\n rowNumber: {\n partitionBy: distinctPartition as ColRef[],\n orderBy: windowOrder,\n alias: DISTINCT_ROW_NUMBER_ALIAS,\n },\n ...(where === undefined ? {} : { where }),\n };\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: DISTINCT_TABLE_ALIAS },\n columns: projectionColumns({ model, selectedFields }),\n fromSelect: inner,\n where: { kind: \"cmp\", op: \"eq\", column: { name: DISTINCT_ROW_NUMBER_ALIAS }, value: 1 },\n orderBy: outerOrder,\n ...(limit === undefined ? {} : { limit }),\n ...(offset === undefined ? {} : { offset }),\n };\n return { statement, reverseRows: backward, resortBy };\n }\n\n if (distinctOuterOrder !== null) {\n // Native DISTINCT ON (postgres): its ORDER BY must lead with the distinct\n // expressions, so the page is cut one level out.\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns: withOuterOrderKeys(columns, distinctOuterOrder),\n ...(lateralJoins.length > 0 ? { lateralJoins } : {}),\n ...(where === undefined ? {} : { where }),\n ...(distinctOn === undefined ? {} : { distinctOn }),\n ...(orderTerms.length === 0 ? {} : { orderBy: orderTerms }),\n };\n const outerColumns: ColRef[] = [\n ...projectionColumns({ model, selectedFields }),\n ...lateralJoins.map((join) => ({ name: join.columnAlias })),\n ];\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: DISTINCT_TABLE_ALIAS },\n columns: outerColumns,\n fromSelect: inner,\n orderBy: distinctOuterOrder,\n ...(limit === undefined ? {} : { limit }),\n ...(offset === undefined ? {} : { offset }),\n };\n return { statement, reverseRows: backward, resortBy };\n }\n\n const statement: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns,\n ...(lateralJoins.length > 0 ? { lateralJoins } : {}),\n ...(where === undefined ? {} : { where }),\n ...(distinctOn === undefined ? {} : { distinctOn }),\n ...(orderTerms.length === 0 ? {} : { orderBy: orderTerms }),\n ...(limit === undefined ? {} : { limit }),\n ...(offset === undefined ? {} : { offset }),\n };\n return { statement, reverseRows: backward, resortBy };\n}\n\n// ─── Lateral (join-strategy) statement assembly ─────────────────\n\n/** Alias every child subquery uses; scoped per lateral, so reuse is safe (v1 did the same). */\nconst LATERAL_CHILD_ALIAS: string = \"__rel\";\n\n/** Derived-table alias of the ROW_NUMBER distinct emulation (board #22 / N10). */\nconst DISTINCT_TABLE_ALIAS: string = \"__dist\";\n/** The window projection's alias — the outer statement filters `__rn = 1`. */\nconst DISTINCT_ROW_NUMBER_ALIAS: string = \"__rn\";\n\n/** The column a relation's JSON payload is exposed under in the outer row. */\nexport function lateralColumnAlias(params: { relation: string }): string {\n return `__rel_${params.relation}`;\n}\n\n/**\n * PG-3 (SQL review round 2): order fields the lateral subselect must project\n * HIDDEN — the aggregate's explicit `ORDER BY \"__sub\".…` (N2) can only\n * reference projected columns, and a per-relation orderBy on a field outside\n * the child select otherwise left the aggregate relying on \"usually preserves\n * subquery order\". The loader deletes these after parsing (the stitch-key\n * pattern). Empty when the projection is full or no orderBy was given.\n */\nexport function lateralHiddenOrderFields(params: { node: RelationTreeNode }): string[] {\n const { node } = params;\n const projected = node.args.projected;\n if (projected === null || node.args.orderBy === undefined) return [];\n const target = node.link.target;\n const hidden: string[] = [];\n const items = Array.isArray(node.args.orderBy) ? node.args.orderBy : [node.args.orderBy];\n for (const item of items) {\n if (!isPlainObject(item)) continue;\n for (const [name, value] of Object.entries(item)) {\n if (value === undefined) continue;\n if (!target.fieldByName.has(name)) continue;\n if (!projected.includes(name) && !hidden.includes(name)) hidden.push(name);\n }\n }\n return hidden;\n}\n\nconst lateralFieldByColumn = new WeakMap<ModelMeta, ReadonlyMap<string, FieldMeta>>();\n\nfunction fieldByColumnName(model: ModelMeta): ReadonlyMap<string, FieldMeta> {\n let map = lateralFieldByColumn.get(model);\n if (map === undefined) {\n map = new Map(model.fields.map((field) => [field.columnName, field]));\n lateralFieldByColumn.set(model, map);\n }\n return map;\n}\n\n/**\n * B3 (SQL review): raw `to_jsonb` ships BigInt/Decimal as float64 JSON numbers\n * (9007199254740993 → …992, live-proven) and Bytes as `\\x` hex text — the two\n * relation strategies then silently disagree on the same rows. The lateral\n * subselect casts instead: `::text` for BigInt/Decimal (their wire form on the\n * query path too), `encode(…,'base64')` for Bytes; BigInt[]/Decimal[] would\n * need `::text[]` element casts and Bytes[] has no cheap faithful form — both\n * are refused toward the portable query strategy at build time.\n */\nfunction applyLateralTransform(params: { model: ModelMeta; column: ColRef }): ColRef {\n const { model, column } = params;\n const field = fieldByColumnName(model).get(column.name);\n if (field === undefined) return column;\n const scalar = field.scalarType;\n if (scalar !== \"BigInt\" && scalar !== \"Decimal\" && scalar !== \"Bytes\") return column;\n if (field.isList) {\n throw unsupportedCapability({\n dialect: \"postgres\",\n feature: `join-strategy relation loading of ${model.name}.${field.name} (${scalar}[])`,\n hint: 'list columns of BigInt/Decimal/Bytes have no faithful JSON wire form — use the portable \"query\" relation strategy',\n });\n }\n return { ...column, transform: scalar === \"Bytes\" ? \"encodeBase64\" : \"castText\" };\n}\n\nfunction buildLateralJoinClause(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n node: RelationTreeNode;\n index: number;\n}): LateralJoin {\n const { dialect, meta, model, node, index } = params;\n const link = node.link;\n const target = link.target;\n const aliasSeq = { n: 0 };\n\n const projected = node.args.projected;\n // PG-3: order fields outside the child select ride the subselect hidden —\n // the aggregate's ORDER BY (N2) references \"__sub\" columns — and the loader\n // strips them after parsing.\n const hiddenOrder = lateralHiddenOrderFields({ node });\n const selectedWithOrder =\n projected === null || hiddenOrder.length === 0 ? projected : [...projected, ...hiddenOrder];\n const columns = projectionColumns({\n model: target,\n selectedFields: selectedWithOrder,\n table: LATERAL_CHILD_ALIAS,\n }).map((column) => applyLateralTransform({ model: target, column }));\n\n // Correlation: child key against the OUTER table's parent key. For implicit\n // M2M the membership test nests an EXISTS through the join table — the AST\n // stays join-free (see the select-exists-join-table catalog case).\n let correlate: SqlExpr;\n if (link.kind === \"manyToMany\") {\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const m2m = singleKeyPair({ link, what: \"implicit many-to-many join-strategy loading\" });\n const jtAlias = `__jt${++aliasSeq.n}`;\n correlate = {\n kind: \"exists\",\n select: {\n kind: \"select\",\n table: { name: join.tableName, alias: jtAlias },\n columns: [],\n selectExpr: { kind: \"one\" },\n where: {\n kind: \"and\",\n operands: [\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.childColumn },\n right: { table: LATERAL_CHILD_ALIAS, name: m2m.child.columnName },\n },\n {\n kind: \"cmpCol\",\n op: \"eq\",\n left: { table: jtAlias, name: join.parentColumn },\n right: { table: model.tableName, name: m2m.parent.columnName },\n },\n ],\n },\n },\n };\n } else {\n correlate = correlateLink({ link, childTable: LATERAL_CHILD_ALIAS, outerTable: model.tableName });\n }\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({\n dialect,\n meta,\n model: target,\n where: node.args.where,\n qualify: LATERAL_CHILD_ALIAS,\n aliasSeq,\n });\n const where: SqlExpr =\n nestedWhere === undefined ? correlate : { kind: \"and\", operands: [correlate, nestedWhere] };\n\n const isList = link.relation.isList;\n let orderBy: OrderTerm[] | undefined;\n if (node.args.orderBy !== undefined) {\n orderBy = compileOrderBy({ model: target, orderBy: node.args.orderBy, qualify: LATERAL_CHILD_ALIAS, dialect });\n } else if (node.args.take !== undefined || node.args.skip !== undefined) {\n // Deterministic pagination needs a total order — default to the child PK.\n orderBy = target.primaryKey.map((field) => ({\n column: columnRef({ field, table: LATERAL_CHILD_ALIAS }),\n direction: \"asc\" as const,\n }));\n }\n\n const limit = isList ? node.args.take : 1;\n\n return {\n alias: `__lat_${index}`,\n columnAlias: lateralColumnAlias({ relation: node.name }),\n agg: isList ? \"jsonArray\" : \"jsonObject\",\n select: {\n kind: \"select\",\n table: { name: target.tableName, alias: LATERAL_CHILD_ALIAS },\n columns,\n where,\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(limit === undefined ? {} : { limit }),\n ...(node.args.skip === undefined || !isList ? {} : { offset: node.args.skip }),\n },\n };\n}\n\n// ─── Omit ───────────────────────────────────────────────────────\n\n/**\n * `omit: { field: true }` — every scalar EXCEPT the omitted ones (v1\n * semantics). Mutually exclusive with `select`; relations still ride `include`.\n */\nfunction compileOmit(params: { model: ModelMeta; omit: unknown }): string[] {\n const { model } = params;\n const spec = requireObject({ value: params.omit, what: \"omit\", model });\n const omitted = new Set<string>();\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `omit.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n if (model.relationByName.has(name)) {\n throw validationError({\n message: `omit.${name} on model \"${model.name}\" — omit takes scalar fields; a relation is excluded by not including it`,\n meta: { model: model.name, field: name },\n });\n }\n // Omitting a computed field is the plan's business (resolveComputedSelection).\n if (model.computed !== null && model.computed.has(name)) continue;\n omitted.add(getFieldMeta({ model, field: name, context: \"omit\" }).name);\n }\n const kept = model.fields.filter((field) => !omitted.has(field.name)).map((field) => field.name);\n if (kept.length === 0) {\n throw validationError({\n message: `omit on model \"${model.name}\" removes every field`,\n meta: { model: model.name },\n });\n }\n return kept;\n}\n\n// ─── Aggregation (aggregate · groupBy · count-select) ────────────\n\nfunction aggregateAlias(params: { key: AggregateKey; selector: string }): string {\n return `${params.key}__${params.selector}`;\n}\n\nfunction validateAggregatedField(params: { model: ModelMeta; field: FieldMeta; key: AggregateKey }): void {\n const { model, field, key } = params;\n if (key === \"_count\") return; // COUNT works on any column (counts non-null values)\n if (field.isList) {\n throw validationError({\n message: `${key} cannot aggregate the list field ${model.name}.${field.name}`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n if (key === \"_avg\" || key === \"_sum\") {\n if (field.scalarType === null || !NUMERIC_TYPES.includes(field.scalarType)) {\n throw validationError({\n message: `${key} needs a numeric field, but ${model.name}.${field.name} is ${String(field.enumName ?? field.scalarType)}`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n return;\n }\n // _min/_max order values — numbers, strings, dates and enums all sort.\n if (field.scalarType === \"Json\" || field.scalarType === \"Bytes\" || field.scalarType === \"Boolean\") {\n throw validationError({\n message: `${key} cannot aggregate ${model.name}.${field.name} (${field.scalarType} has no ordering)`,\n meta: { model: model.name, field: field.name, key },\n });\n }\n}\n\ntype CompiledAggregates = {\n readonly spec: AggregateSpec;\n readonly aggSelects: AggSelect[];\n /** Field names any aggregation references — the subquery projection. */\n readonly referenced: string[];\n};\n\n/**\n * Compile the `_count`/`_avg`/`_sum`/`_min`/`_max` argument keys. Iteration is\n * deterministic — aggregate keys in fixed order, `_all` first, then fields in\n * MODEL order — so the same logical call always renders the same SQL whatever\n * order the caller wrote its keys in. Aliases follow `<key>__<selector>`\n * (`_count___all`, `_avg__score`); field names cannot start with `_`, so the\n * `_all` selector can never collide.\n */\nfunction compileAggregations(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n args: Record<string, unknown>;\n method: QueryMethod;\n}): CompiledAggregates {\n const { dialect, model, args, method } = params;\n const selections: AggregateSelection[] = [];\n const aggSelects: AggSelect[] = [];\n const referenced: string[] = [];\n let countShorthand = false;\n\n for (const key of AGGREGATE_KEYS) {\n const value = args[key];\n if (value === undefined) continue;\n\n if (key === \"_count\" && value === true) {\n countShorthand = true;\n const alias = aggregateAlias({ key, selector: \"_all\" });\n selections.push({ key, field: null, alias });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias });\n continue;\n }\n const spec = requireObject({ value, what: key, model });\n for (const [name, flag] of Object.entries(spec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `${key}.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name, key },\n });\n }\n if (name === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `${key}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key },\n });\n }\n continue;\n }\n getFieldMeta({ model, field: name, context: key }); // unknown fields are loud\n }\n if (key === \"_count\" && spec._all === true) {\n const alias = aggregateAlias({ key, selector: \"_all\" });\n selections.push({ key, field: null, alias });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias });\n }\n for (const field of model.fields) {\n if (spec[field.name] !== true) continue;\n validateAggregatedField({ model, field, key });\n const alias = aggregateAlias({ key, selector: field.name });\n selections.push({ key, field: field.name, alias });\n // B4: sqlite aggregates Decimal over CAST(col AS REAL) — MIN/MAX/SUM over\n // the TEXT storage would be lexicographic/coerced-wrong. _count counts\n // rows/non-nulls and never needs it.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n aggSelects.push({ agg: { fn: AGG_FN_BY_KEY[key], column: aggColumn }, alias });\n if (!referenced.includes(field.name)) referenced.push(field.name);\n }\n }\n\n if (selections.length === 0 && method === \"aggregate\") {\n throw validationError({\n message: `${model.clientName}.aggregate() needs at least one of ${AGGREGATE_KEYS.join(\", \")}`,\n meta: { model: model.name },\n });\n }\n return { spec: { selections, countShorthand }, aggSelects, referenced };\n}\n\nconst HAVING_OPERATOR_MAP: Readonly<Record<string, \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\">> = {\n equals: \"eq\",\n not: \"ne\",\n gt: \"gt\",\n gte: \"gte\",\n lt: \"lt\",\n lte: \"lte\",\n};\n\nfunction compileAggregatePredicate(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n key: AggregateKey;\n selector: string;\n filter: unknown;\n}): SqlExpr[] {\n const { dialect, model, key, selector, filter } = params;\n let agg: AggRef;\n let field: FieldMeta | null = null;\n if (selector === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `having ${key}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key },\n });\n }\n agg = { fn: \"countAll\" };\n } else {\n field = getFieldMeta({ model, field: selector, context: `having ${key}` });\n validateAggregatedField({ model, field, key });\n // B4: the HAVING aggregate mirrors the projection's sqlite Decimal cast.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n agg = { fn: AGG_FN_BY_KEY[key], column: aggColumn };\n }\n const spec = isPlainObject(filter) ? filter : { equals: filter };\n const out: SqlExpr[] = [];\n for (const [operator, operand] of Object.entries(spec)) {\n if (operand === undefined) continue;\n const op = HAVING_OPERATOR_MAP[operator];\n if (op === undefined) {\n throw validationError({\n message: `unknown having operator \"${operator}\" on ${key} of ${model.name}.${selector} — supported: ${Object.keys(HAVING_OPERATOR_MAP).join(\", \")}`,\n meta: { model: model.name, key, operator },\n });\n }\n // _count/_avg compare as plain numbers; _sum/_min/_max ride the field\n // codec — EXCEPT on sqlite (M5): an aggregate expression has no column\n // affinity there, so a TEXT operand never converts and the predicate is\n // constant-false. Operands bind raw numeric forms instead (bigint stays\n // bigint — bun:sqlite binds int64 natively; Decimal binds as a number\n // against the CAST(… AS REAL) aggregate).\n const value =\n dialect.name === \"sqlite\" && field !== null && key !== \"_count\"\n ? encodeAggregateOperand({ dialect: dialect.name, field, value: operand })\n : field !== null && (key === \"_sum\" || key === \"_min\" || key === \"_max\")\n ? encodeValue({ dialect: dialect.name, field, value: operand })\n : typeof operand === \"bigint\"\n ? dialect.name === \"sqlite\"\n ? operand\n : operand.toString()\n : operand;\n out.push({ kind: \"aggCmp\", op, agg, value });\n }\n if (out.length === 0) {\n throw validationError({\n message: `having ${key}.${selector} on model \"${model.name}\" needs an operator`,\n meta: { model: model.name, key },\n });\n }\n return out;\n}\n\n/**\n * `having` — aggregate predicates in BOTH orientations\n * (`{ _count: { id: { gt: 2 } } }` and `{ id: { _count: { gt: 2 } } }`), plain\n * scalar predicates on GROUPED columns only (anything else could not appear\n * after GROUP BY), and AND/OR/NOT groups.\n */\nfunction compileHaving(params: {\n ctx: WhereContext;\n model: ModelMeta;\n byNames: ReadonlySet<string>;\n having: Record<string, unknown>;\n}): SqlExpr | undefined {\n const { ctx, model, byNames, having } = params;\n const operands: SqlExpr[] = [];\n\n const group = (value: unknown, what: string): SqlExpr[] => {\n const items = Array.isArray(value) ? value : [value];\n return items.map((item) => {\n const spec = requireObject({ value: item, what, model });\n return compileHaving({ ctx, model, byNames, having: spec }) ?? NEUTRAL_TRUE;\n });\n };\n\n for (const [key, value] of Object.entries(having)) {\n if (value === undefined) continue;\n if (key === \"AND\") {\n operands.push({ kind: \"and\", operands: group(value, key) });\n continue;\n }\n if (key === \"OR\") {\n operands.push({ kind: \"or\", operands: group(value, key) });\n continue;\n }\n if (key === \"NOT\") {\n for (const member of group(value, key)) operands.push({ kind: \"not\", operand: member });\n continue;\n }\n\n if ((AGGREGATE_KEYS as readonly string[]).includes(key)) {\n const spec = requireObject({ value, what: `having ${key}`, model });\n for (const [selector, filter] of Object.entries(spec)) {\n if (filter === undefined) continue;\n operands.push(\n ...compileAggregatePredicate({ dialect: ctx.dialect, model, key: key as AggregateKey, selector, filter }),\n );\n }\n continue;\n }\n\n const field = getFieldMeta({ model, field: key, context: \"having\" });\n const requireGrouped = (): void => {\n if (byNames.has(field.name)) return;\n throw validationError({\n message: `having on ${model.name}.${field.name} needs the field in \\`by\\` — only grouped columns and aggregates exist after grouping`,\n meta: { model: model.name, field: field.name },\n });\n };\n if (isPlainObject(value)) {\n const plain: Record<string, unknown> = {};\n for (const [operator, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if ((AGGREGATE_KEYS as readonly string[]).includes(operator)) {\n operands.push(\n ...compileAggregatePredicate({\n dialect: ctx.dialect,\n model,\n key: operator as AggregateKey,\n selector: field.name,\n filter: operand,\n }),\n );\n continue;\n }\n plain[operator] = operand;\n }\n if (Object.keys(plain).length > 0) {\n requireGrouped();\n operands.push(compileOperatorFilter({ ctx, model, field, filter: plain, qualify: undefined }));\n }\n continue;\n }\n requireGrouped();\n operands.push(compileFieldFilter({ ctx, model, field, value, qualify: undefined }));\n }\n\n if (operands.length === 0) return undefined;\n if (operands.length === 1) return operands[0] as SqlExpr;\n return { kind: \"and\", operands };\n}\n\n/**\n * groupBy's orderBy: grouped fields (which must be in `by` — Prisma's rule,\n * enforced with a clear error) or aggregate references\n * (`{ _count: { _all: \"desc\" } }`, `{ _avg: { score: \"asc\" } }`).\n */\nfunction compileGroupByOrder(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n byNames: ReadonlySet<string>;\n orderBy: unknown;\n}): OrderTerm[] {\n const { dialect, model, byNames, orderBy } = params;\n const items = Array.isArray(orderBy) ? orderBy : [orderBy];\n const terms: OrderTerm[] = [];\n for (const item of items) {\n const spec = requireObject({ value: item, what: \"orderBy\", model });\n for (const [name, value] of Object.entries(spec)) {\n if (value === undefined) continue;\n if ((AGGREGATE_KEYS as readonly string[]).includes(name)) {\n const key = name as AggregateKey;\n const aggSpec = requireObject({ value, what: `orderBy ${name}`, model });\n for (const [selector, direction] of Object.entries(aggSpec)) {\n if (direction === undefined) continue;\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw validationError({\n message: `orderBy ${name}.${selector} must be \"asc\" or \"desc\" on model \"${model.name}\"`,\n meta: { model: model.name, key: name, selector },\n });\n }\n let agg: AggRef;\n if (selector === \"_all\") {\n if (key !== \"_count\") {\n throw validationError({\n message: `orderBy ${name}._all is not valid — _all only counts rows (_count)`,\n meta: { model: model.name, key: name },\n });\n }\n agg = { fn: \"countAll\" };\n } else {\n const field = getFieldMeta({ model, field: selector, context: `orderBy ${name}` });\n validateAggregatedField({ model, field, key });\n // B4: the ordering aggregate mirrors the projection's sqlite cast.\n const aggColumn = key === \"_count\" ? { name: field.columnName } : compareColumnRef({ dialect, field });\n agg = { fn: AGG_FN_BY_KEY[key], column: aggColumn };\n }\n terms.push({ agg, direction });\n }\n continue;\n }\n const field = getFieldMeta({ model, field: name, context: \"orderBy\" });\n if (!byNames.has(field.name)) {\n throw validationError({\n message: `orderBy on ${model.name}.${field.name} — groupBy can only order by fields in \\`by\\` or by aggregates`,\n meta: { model: model.name, field: field.name },\n });\n }\n terms.push(compileOrderTerm({ model, field, spec: value, dialect }));\n }\n }\n return terms;\n}\n\n// ─── Refetch-where overlay (review F5) ─────────────────────────\n\n/**\n * The refetch-WHERE for update/upsert on a no-RETURNING dialect must reflect\n * the values the write itself sets: an update that changes its own unique key\n * would otherwise be re-selected by the OLD value and \"vanish\". Direct values\n * and `{ set: … }` wrappers overlay; atomic operations don't (their result is\n * only knowable in the database).\n *\n * Upsert overlays from the UPDATE arm. Documented edge: an upsert whose insert\n * path runs while its update arm rewrites the key field cannot be re-selected\n * correctly on such dialects — Prisma's create/where consistency convention\n * makes that shape pathological.\n */\nfunction overlayRefetchWhere(params: {\n model: ModelMeta;\n where: Record<string, unknown>;\n data: unknown;\n}): Record<string, unknown> {\n const { model, where, data } = params;\n const out: Record<string, unknown> = { ...where };\n if (!isPlainObject(data)) return out;\n for (const key of Object.keys(out)) {\n if (!model.fieldByName.has(key)) continue;\n const value = data[key];\n if (value === undefined) continue;\n if (isDirectValue(value) || value === null) {\n out[key] = value;\n continue;\n }\n if (isPlainObject(value) && (isDirectValue(value.set) || value.set === null)) {\n out[key] = value.set;\n }\n }\n return out;\n}\n\n// ─── Entry point ──────────────────────────────────────────────────\n\nconst FIND_METHODS: readonly QueryMethod[] = [\"findMany\", \"findFirst\", \"findUnique\"];\n\n/** Methods whose results can carry relations (select/include with relation keys). */\nconst RELATION_CAPABLE_METHODS: readonly QueryMethod[] = [\n \"findMany\",\n \"findFirst\",\n \"findUnique\",\n \"create\",\n \"createManyAndReturn\",\n \"update\",\n \"upsert\",\n // #25: relations load from the row the DELETE returns (or the mysql\n // read-before-delete) — children removed by a cascading delete come back\n // empty, exactly as v1 documented.\n \"delete\",\n];\n\nfunction resolveStrategy(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n method: QueryMethod;\n args: Record<string, unknown>;\n hasRelations: boolean;\n defaultRelationStrategy: RelationStrategy | undefined;\n}): RelationStrategy {\n const { dialect, model, method, args, hasRelations, defaultRelationStrategy } = params;\n const explicit = args.relationStrategy;\n if (explicit !== undefined && explicit !== \"query\" && explicit !== \"join\") {\n throw validationError({\n message: `relationStrategy on ${model.clientName}.${method}() must be \"query\" or \"join\"`,\n meta: { model: model.name, method, relationStrategy: explicit },\n });\n }\n if (!FIND_METHODS.includes(method)) return \"query\";\n const strategy = (explicit as RelationStrategy | undefined) ?? defaultRelationStrategy ?? \"query\";\n if (strategy === \"join\" && !dialect.capabilities.lateralJoin) {\n // A per-query \"join\" is an explicit ask — refuse loudly even without\n // relations. A client-level default only bites once relations are used.\n if (explicit !== undefined || hasRelations) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: 'relationStrategy \"join\"',\n hint: 'lateral joins are postgres-only — use the portable \"query\" strategy on this dialect',\n });\n }\n return \"query\";\n }\n return strategy;\n}\n\n/**\n * The relation selection + caller-visible field list for one call, WITHOUT\n * building a statement — the nested-write path orchestrates its own\n * statements but still needs the validated result shape for relation loading\n * and projection.\n */\nexport function resolveResultShape(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n method: QueryMethod;\n args: Record<string, unknown>;\n}): {\n relations: RelationSelection | null;\n resultFields: readonly string[] | null;\n computed: readonly string[] | null;\n} {\n const { meta, model, method, args } = params;\n assertArgs({ method, args, model });\n const relations = resolveRelationSelection({ meta, model, select: args.select, include: args.include });\n const computed = resolveComputedSelection({ model, args, aggregating: false });\n const scalarSelect =\n args.select === undefined\n ? null\n : compileSelect({ model, select: args.select, allowEmpty: relations !== null || computed !== null });\n const resultFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n if (relations !== null && resultFields !== null) {\n for (const node of relations.relations) resultFields.push(node.name);\n if (relations.counts.length > 0) resultFields.push(\"_count\");\n }\n if (computed !== null && resultFields !== null) {\n for (const name of computed) resultFields.push(name);\n }\n return { relations, resultFields, computed };\n}\n\n/**\n * Build the SQL plan for one ORM call. Pure: same inputs, same statement —\n * except for app-generated defaults (uuid/cuid/nanoid/ulid/now), which are by\n * definition fresh per call.\n *\n * `defaultRelationStrategy` is the client-level option; a per-query\n * `relationStrategy` argument (find methods only) overrides it.\n */\nexport function buildQuery(params: {\n meta: RuntimeMeta;\n dialect: SqlDialect;\n model: string;\n method: QueryMethod;\n args?: Record<string, unknown>;\n defaultRelationStrategy?: RelationStrategy;\n clientOptions?: BuilderClientOptions;\n}): QueryPlan {\n const { meta, dialect, method } = params;\n const model = getModelMeta({ meta, model: params.model });\n const args = params.args ?? {};\n assertArgs({ method, args, model });\n\n // aggregate/groupBy/count interpret select/_agg keys themselves; the generic\n // projection machinery below is for row-returning methods only.\n const aggregating = method === \"aggregate\" || method === \"groupBy\" || method === \"count\";\n\n // Relations: resolve (and validate) what select/include ask for.\n const relationCapable = RELATION_CAPABLE_METHODS.includes(method);\n const relations = relationCapable\n ? resolveRelationSelection({ meta, model, select: args.select, include: args.include })\n : null;\n if (!relationCapable && !aggregating && isPlainObject(args.select)) {\n for (const key of Object.keys(args.select)) {\n if (args.select[key] === undefined || args.select[key] === false) continue;\n if (key === \"_count\" || model.relationByName.has(key)) {\n throw validationError({\n message: `select.${key} on ${model.clientName}.${method}() — relations are not supported on this method`,\n meta: { model: model.name, method, field: key },\n });\n }\n }\n }\n const relationStrategy = resolveStrategy({\n dialect,\n model,\n method,\n args,\n hasRelations: relations !== null,\n defaultRelationStrategy: params.defaultRelationStrategy,\n });\n\n // Projection: what the SQL fetches (scalar select + stitching keys) vs what\n // the caller sees (their select + relation names + `_count`).\n if (args.select !== undefined && args.omit !== undefined) {\n throw validationError({\n message: `select and omit cannot combine on ${model.clientName}.${method}() — select names fields to keep, omit fields to drop`,\n meta: { model: model.name, method },\n });\n }\n const computedSelection = resolveComputedSelection({ model, args, aggregating });\n const scalarSelect = aggregating\n ? null\n : args.select !== undefined\n ? compileSelect({ model, select: args.select, allowEmpty: relations !== null || computedSelection !== null })\n : args.omit !== undefined\n ? compileOmit({ model, omit: args.omit })\n : null;\n let selectedFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n let resultFields: string[] | null = scalarSelect === null ? null : [...scalarSelect];\n if (relations !== null && resultFields !== null) {\n for (const node of relations.relations) resultFields.push(node.name);\n if (relations.counts.length > 0) resultFields.push(\"_count\");\n }\n if (computedSelection !== null && resultFields !== null) {\n for (const name of computedSelection) resultFields.push(name);\n }\n if (relations !== null && selectedFields !== null) {\n for (const name of requiredParentFields({ meta, model, selection: relations })) {\n if (!selectedFields.includes(name)) selectedFields.push(name);\n }\n }\n // The distinct key must exist on fetched rows — the emulating post-filter\n // reads it — so it rides along like a stitch key and is narrowed away after.\n if (args.distinct !== undefined && selectedFields !== null && (method === \"findMany\" || method === \"findFirst\")) {\n for (const field of normalizeDistinct({ model, distinct: args.distinct })) {\n if (!selectedFields.includes(field.name)) selectedFields.push(field.name);\n }\n // F21: every requested ORDER key must exist on the fetched rows too — the\n // DISTINCT arrangement demotes the user's order, and both the client\n // re-sort and the outer SQL order read those columns back. A key the\n // caller's `select`/`omit` dropped silently disabled the restore, so the\n // order changed with the projection. It rides along like a stitch key and\n // `resultFields` narrows it away again.\n for (const name of orderByScalarFields({ model, orderBy: args.orderBy })) {\n if (!selectedFields.includes(name)) selectedFields.push(name);\n }\n }\n // Computed `needs` ride the SQL projection like stitch keys — fetched for\n // the compute, narrowed away by `resultFields` unless selected themselves.\n if (computedSelection !== null && selectedFields !== null && model.computed !== null) {\n for (const name of computedSelection) {\n for (const need of model.computed.get(name)?.needs ?? []) {\n if (!selectedFields.includes(need)) selectedFields.push(need);\n }\n }\n }\n\n const selectArg = args.select === undefined || aggregating ? null : (args.select as Record<string, unknown>);\n const base = {\n method,\n model,\n selectedFields,\n resultFields,\n computed: computedSelection,\n relations,\n relationStrategy,\n takeApplied: args.take !== undefined,\n countAlias: null,\n refetchWhere: null,\n refetchWhereBase: null,\n selectArg,\n aggregateSpec: null,\n groupByFields: null,\n reverseRows: false,\n resortBy: null,\n } as const;\n\n const useLateral = relationStrategy === \"join\" && relations !== null;\n\n switch (method) {\n case \"findMany\":\n case \"findFirst\": {\n const locked = compileLock({ args, model, method, hasRelations: relations !== null });\n const shape = buildFindShape({\n dialect,\n meta,\n model,\n args,\n selectedFields,\n ...(method === \"findFirst\" ? { firstLimit: 1 } : {}),\n ...(useLateral ? { selection: relations as RelationSelection } : {}),\n clientOptions: params.clientOptions,\n });\n return {\n ...base,\n statement: locked ? { ...shape.statement, lockForUpdate: true } : shape.statement,\n reverseRows: shape.reverseRows,\n resortBy: shape.resortBy,\n };\n }\n\n case \"findUnique\": {\n const locked = compileLock({ args, model, method, hasRelations: relations !== null });\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method });\n const shape = buildFindShape({\n dialect,\n meta,\n model,\n args: { where },\n selectedFields,\n ...(useLateral ? { selection: relations as RelationSelection } : {}),\n clientOptions: undefined,\n });\n return {\n ...base,\n statement: locked ? { ...shape.statement, lockForUpdate: true } : shape.statement,\n };\n }\n\n case \"count\": {\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n // #13: `count({ take, skip, orderBy })` counts a BOUNDED subset —\n // COUNT(*) over a derived table that limits the rows first (the same\n // shape aggregate-over-a-subset builds). An orderBy WITHOUT take/skip\n // is accepted and dropped: ordering cannot change a full count.\n const countTake =\n args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const countSkip =\n args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const countOrder =\n args.orderBy === undefined ? undefined : compileOrderBy({ model, orderBy: args.orderBy, dialect });\n const bounded = countTake !== undefined || countSkip !== undefined;\n const boundedInner = (innerFields: readonly string[]): SelectStatement => ({\n kind: \"select\",\n table: { name: model.tableName },\n columns: projectionColumns({ model, selectedFields: innerFields }),\n ...(where === undefined ? {} : { where }),\n ...(countOrder === undefined || countOrder.length === 0 ? {} : { orderBy: countOrder }),\n ...(countTake === undefined ? {} : { limit: countTake }),\n ...(countSkip === undefined ? {} : { offset: countSkip }),\n });\n if (args.select !== undefined) {\n // count-with-select: COUNT(*) for `_all`, COUNT(\"col\") (non-null count)\n // per field. Aliases ARE the result keys — `_all` first, then model order.\n const spec = requireObject({ value: args.select, what: \"select\", model });\n for (const [name, flag] of Object.entries(spec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `select.${name} must be true or false on ${model.clientName}.count()`,\n meta: { model: model.name, field: name },\n });\n }\n if (name !== \"_all\") getFieldMeta({ model, field: name, context: \"count select\" });\n }\n const selections: AggregateSelection[] = [];\n const aggSelects: AggSelect[] = [];\n if (spec._all === true) {\n selections.push({ key: \"_count\", field: null, alias: \"_all\" });\n aggSelects.push({ agg: { fn: \"countAll\" }, alias: \"_all\" });\n }\n for (const field of model.fields) {\n if (spec[field.name] !== true) continue;\n selections.push({ key: \"_count\", field: field.name, alias: field.name });\n aggSelects.push({ agg: { fn: \"count\", column: { name: field.columnName } }, alias: field.name });\n }\n if (selections.length === 0) {\n throw validationError({\n message: `count select on model \"${model.name}\" must include _all or at least one field`,\n meta: { model: model.name },\n });\n }\n if (bounded) {\n // The per-field COUNTs read the derived table's columns — the inner\n // select projects exactly the counted fields (or the PK when only\n // `_all` was asked).\n const referenced = selections.filter((entry) => entry.field !== null).map((entry) => entry.field as string);\n const innerFields = referenced.length > 0 ? referenced : model.primaryKey.map((field) => field.name);\n return {\n ...base,\n aggregateSpec: { selections, countShorthand: false },\n statement: {\n kind: \"select\",\n table: { name: \"__cnt\" },\n columns: [],\n aggregates: aggSelects,\n fromSelect: boundedInner(innerFields),\n },\n };\n }\n return {\n ...base,\n aggregateSpec: { selections, countShorthand: false },\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n aggregates: aggSelects,\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n if (bounded) {\n return {\n ...base,\n countAlias: COUNT_ALIAS,\n statement: {\n kind: \"select\",\n table: { name: \"__cnt\" },\n columns: [],\n selectExpr: { kind: \"countAll\", alias: COUNT_ALIAS },\n fromSelect: boundedInner(model.primaryKey.map((field) => field.name)),\n },\n };\n }\n return {\n ...base,\n countAlias: COUNT_ALIAS,\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n selectExpr: { kind: \"countAll\", alias: COUNT_ALIAS },\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n\n case \"aggregate\": {\n const { spec, aggSelects, referenced } = compileAggregations({ dialect, model, args, method });\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n const orderBy =\n args.orderBy === undefined ? undefined : compileOrderBy({ model, orderBy: args.orderBy, dialect });\n const take = args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const bounded = orderBy !== undefined || take !== undefined || skip !== undefined;\n if (!bounded) {\n return {\n ...base,\n aggregateSpec: spec,\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: [],\n aggregates: aggSelects,\n ...(where === undefined ? {} : { where }),\n },\n };\n }\n // Aggregate over a subset: the inner select bounds the rows, the outer\n // aggregates the derived table (`__agg`). Inner projection is the\n // referenced fields — or the PK when only COUNT(*) was asked.\n const innerFields = referenced.length > 0 ? referenced : model.primaryKey.map((field) => field.name);\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: model.tableName },\n columns: projectionColumns({ model, selectedFields: innerFields }),\n ...(where === undefined ? {} : { where }),\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(take === undefined ? {} : { limit: take }),\n ...(skip === undefined ? {} : { offset: skip }),\n };\n return {\n ...base,\n aggregateSpec: spec,\n statement: {\n kind: \"select\",\n table: { name: \"__agg\" },\n columns: [],\n aggregates: aggSelects,\n fromSelect: inner,\n },\n };\n }\n\n case \"groupBy\": {\n const byRaw = args.by;\n const byList = typeof byRaw === \"string\" ? [byRaw] : byRaw;\n if (!Array.isArray(byList) || byList.length === 0 || byList.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `groupBy on model \"${model.name}\" needs \\`by\\`: a field name or a non-empty array of field names`,\n meta: { model: model.name },\n });\n }\n const byFields = (byList as string[]).map((name) => {\n const field = getFieldMeta({ model, field: name, context: \"by\" });\n if (field.isList || field.scalarType === \"Json\") {\n throw validationError({\n message: `groupBy cannot group by ${model.name}.${field.name} (${field.isList ? \"list\" : \"Json\"} fields have no grouping equality)`,\n meta: { model: model.name, field: field.name },\n });\n }\n return field;\n });\n const byNames = new Set(byFields.map((field) => field.name));\n const { spec, aggSelects } = compileAggregations({ dialect, model, args, method });\n const where =\n args.where === undefined\n ? undefined\n : compileWhere({ dialect, meta, model, where: requireObject({ value: args.where, what: \"where\", model }) });\n const ctx: WhereContext = { dialect, meta, aliasSeq: { n: 0 } };\n const having =\n args.having === undefined\n ? undefined\n : compileHaving({ ctx, model, byNames, having: requireObject({ value: args.having, what: \"having\", model }) });\n const orderBy =\n args.orderBy === undefined\n ? undefined\n : compileGroupByOrder({ dialect, model, byNames, orderBy: args.orderBy });\n const take = args.take === undefined ? undefined : toNonNegativeInteger({ value: args.take, what: \"take\", model });\n const skip = args.skip === undefined ? undefined : toNonNegativeInteger({ value: args.skip, what: \"skip\", model });\n const byColumns = byFields.map((field) => columnRef({ field }));\n return {\n ...base,\n aggregateSpec: spec,\n groupByFields: byFields.map((field) => field.name),\n statement: {\n kind: \"select\",\n table: { name: model.tableName },\n columns: byColumns,\n ...(aggSelects.length === 0 ? {} : { aggregates: aggSelects }),\n ...(where === undefined ? {} : { where }),\n groupBy: byColumns,\n ...(having === undefined ? {} : { having }),\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n ...(take === undefined ? {} : { limit: take }),\n ...(skip === undefined ? {} : { offset: skip }),\n },\n };\n }\n\n case \"create\": {\n // `onConflict: { action: \"nothing\", target?, where? }` — insert-or-skip\n // with the unique index as the concurrency arbiter; the client returns\n // null when the row was skipped (RETURNING presence is the verdict).\n let conflictClause: OnConflictClause | undefined;\n if (args.onConflict !== undefined) {\n const spec = requireObject({ value: args.onConflict, what: \"onConflict\", model });\n for (const key of Object.keys(spec)) {\n if (key !== \"action\" && key !== \"target\" && key !== \"where\") {\n throw validationError({\n message: `unknown onConflict key \"${key}\" on ${model.clientName}.create() — expected action/target/where`,\n meta: { model: model.name, key },\n });\n }\n }\n if (spec.action !== \"nothing\") {\n throw validationError({\n message: `onConflict.action on ${model.clientName}.create() must be \"nothing\" (conflicting rows are skipped — to update instead, use upsert())`,\n meta: { model: model.name },\n });\n }\n const compiled = compileConflictTarget({\n dialect,\n meta,\n model,\n method,\n target: spec.target,\n where: spec.where,\n });\n conflictClause = {\n doNothing: true,\n ...(compiled.columns === undefined ? {} : { columns: compiled.columns }),\n ...(compiled.constraint === undefined ? {} : { constraint: compiled.constraint }),\n ...(compiled.conflictWhere === undefined ? {} : { conflictWhere: compiled.conflictWhere }),\n };\n }\n const row = compileCreateRow({ dialect, model, data: args.data });\n const columns = orderedColumns({ model, values: row.values });\n if (columns.length === 0) {\n throw validationError({\n message: `create on model \"${model.name}\" needs at least one field value`,\n meta: { model: model.name },\n });\n }\n return {\n ...base,\n refetchWhere: row.knownKey,\n statement: {\n kind: \"insert\",\n table: { name: model.tableName },\n columns,\n rows: [columns.map((column) => row.values[column])],\n ...(conflictClause === undefined ? {} : { onConflict: conflictClause }),\n returning: returningColumns({ model, selectedFields }),\n },\n };\n }\n\n case \"createMany\":\n case \"createManyAndReturn\": {\n if (method === \"createManyAndReturn\" && !dialect.capabilities.createManyAndReturn) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"createManyAndReturn\",\n hint: \"this dialect cannot RETURNING multiple inserted rows — use createMany then findMany\",\n });\n }\n const groups = compileCreateRows({ dialect, model, data: args.data });\n // `skipDuplicates: true` = bare DO NOTHING; the OBJECT form refines the\n // conflict target (`{ target, where }` — partial-index / named-constraint\n // arbiters), postgres/sqlite only.\n let manyConflict: OnConflictClause | undefined;\n if (args.skipDuplicates === true) {\n manyConflict = { doNothing: true };\n } else if (args.skipDuplicates !== undefined && args.skipDuplicates !== false) {\n const spec = requireObject({ value: args.skipDuplicates, what: \"skipDuplicates\", model });\n for (const key of Object.keys(spec)) {\n if (key !== \"target\" && key !== \"where\") {\n throw validationError({\n message: `unknown skipDuplicates key \"${key}\" on ${model.clientName}.${method}() — expected target/where`,\n meta: { model: model.name, key },\n });\n }\n }\n const compiled = compileConflictTarget({\n dialect,\n meta,\n model,\n method,\n target: spec.target,\n where: spec.where,\n });\n manyConflict = {\n doNothing: true,\n ...(compiled.columns === undefined ? {} : { columns: compiled.columns }),\n ...(compiled.constraint === undefined ? {} : { constraint: compiled.constraint }),\n ...(compiled.conflictWhere === undefined ? {} : { conflictWhere: compiled.conflictWhere }),\n };\n }\n const statements = groups.map(\n (group): SqlStatement => ({\n kind: \"insert\",\n table: { name: model.tableName },\n columns: group.columns,\n rows: group.rows,\n ...(manyConflict === undefined ? {} : { onConflict: manyConflict }),\n ...(method === \"createManyAndReturn\" ? { returning: returningColumns({ model, selectedFields }) } : {}),\n }),\n );\n return {\n ...base,\n statement: statements[0] as SqlStatement,\n // M4/M7: sqlite column-set groups and parameter-budget chunks — the\n // client runs a multi-statement batch in ONE transaction.\n ...(statements.length > 1 ? { batch: statements } : {}),\n };\n }\n\n case \"upsertMany\": {\n // EPIC 10 — batched upsert for ingestion. ONE conflict-arm INSERT per\n // chunk, whose update arm copies each conflicting row's OWN incoming\n // values by COLUMN reference (`excluded.\"col\"` / `` `new`.`col` ``), so a\n // 5,000-row feed binds each value exactly once.\n //\n // Rows compile through the same `compileCreateRows` createMany uses —\n // validators, string-enum membership, app defaults and @updatedAt all\n // come from that one path. The WHOLE logical input is validated before\n // any statement is assembled.\n for (const flag of [\"skipUpdatedAt\", \"allowAnyUniqueConflict\"] as const) {\n if (args[flag] !== undefined && typeof args[flag] !== \"boolean\") {\n throw validationError({\n message: `${flag} on ${model.clientName}.upsertMany() must be a boolean, got ${String(args[flag])}`,\n meta: { model: model.name, argument: flag },\n });\n }\n }\n assertConflictTargetIsEnforceable({\n dialect,\n model,\n allowAnyUniqueConflict: args.allowAnyUniqueConflict === true,\n });\n const conflictTarget = resolveUpsertConflictTarget({ model, target: args.conflictTarget });\n const targetColumns =\n conflictTarget.kind === \"columns\" ? conflictTarget.fields.map((field) => field.columnName) : [];\n const updateFields = resolveUpsertUpdateFields({\n model,\n update: args.update,\n targetColumns: new Set(targetColumns),\n skipUpdatedAt: args.skipUpdatedAt === true,\n });\n // Refinements (named constraint, partial-index predicate) ride the SAME\n // compiler the createMany/upsert paths use, so a dialect refuses them\n // here exactly as it does there. A plain column target is NOT sent\n // through it: mysql refuses every target there, and upsertMany's mysql\n // contract is \"the target is not enforced\", not \"the call is refused\".\n let namedConstraint: string | undefined;\n let partialArbiter: string | undefined;\n if (conflictTarget.kind === \"constraint\" || args.conflictWhere !== undefined) {\n const refined = compileConflictTarget({\n dialect,\n meta,\n model,\n method,\n target:\n conflictTarget.kind === \"constraint\"\n ? { constraint: conflictTarget.constraint }\n : conflictTarget.fields.map((field) => field.name),\n where: args.conflictWhere,\n });\n namedConstraint = refined.constraint;\n partialArbiter = refined.conflictWhere;\n }\n let compiledRows: readonly Readonly<Record<string, unknown>>[] = [];\n const upsertGroups = compileCreateRows({\n dialect,\n model,\n data: args.data,\n method,\n inspectRows: (rows) => {\n compiledRows = rows;\n },\n });\n assertUpsertRowsBindColumns({ model, compiled: compiledRows, targetColumns, updateFields });\n // A named-constraint arbiter hides its own column list, so the batch's\n // conflict keys are unknowable here; postgres — the only dialect that\n // accepts the form — refuses a doubled key itself with SQLSTATE 21000,\n // atomically, which is the same answer one statement later.\n if (targetColumns.length > 0) {\n assertNoDuplicateConflictKeys({ model, compiled: compiledRows, targetColumns });\n }\n // A dialect whose upsert has no arbiter resolves through ANY unique\n // index, so a batch doubling a group the target does not name loses a\n // submitted row silently. Refused here, before a statement exists.\n assertNoDuplicateSecondaryUniques({ dialect, model, compiled: compiledRows, targetColumns });\n // EPIC B: byte equality is only PART of the answer. A collation, a\n // numeric scale or a column precision can make two keys the check above\n // kept apart into one stored row, and only postgres refuses such a batch\n // (and only inside ONE statement). Anything else is refused here, before\n // a statement runs.\n assertConflictKeysAreComparable({\n dialect,\n model,\n target: conflictTarget,\n statementCount: upsertGroups.length,\n compiled: compiledRows,\n });\n const onConflict: OnConflictUpdate = {\n columns: targetColumns,\n ...(namedConstraint === undefined ? {} : { constraint: namedConstraint }),\n ...(partialArbiter === undefined ? {} : { conflictWhere: partialArbiter }),\n update: Object.fromEntries(\n updateFields.map((field) => [field.columnName, excludedRef({ column: field.columnName })]),\n ),\n };\n const upsertStatements = upsertGroups.map(\n (group): SqlStatement => ({\n kind: \"insert\",\n table: { name: model.tableName },\n columns: group.columns,\n rows: group.rows,\n onConflict,\n }),\n );\n return {\n ...base,\n statement: upsertStatements[0] as SqlStatement,\n upsertRowCount: compiledRows.length,\n // M4/M7 again: column-set groups and parameter-budget chunks run as ONE\n // transaction, so a failure in the last chunk rolls back the earlier ones.\n ...(upsertStatements.length > 1 ? { batch: upsertStatements } : {}),\n };\n }\n\n case \"update\":\n case \"updateMany\":\n case \"updateManyAndReturn\": {\n const isUnique = method === \"update\";\n // EPIC 2: multi-row UPDATE … RETURNING is exactly RETURNING support —\n // postgres/pglite/sqlite have it, mysql does not and is refused HERE, at\n // build time, before any row is touched. Never emulated with a follow-up\n // findMany: that second read is unprotected and would report rows another\n // writer changed in between.\n if (method === \"updateManyAndReturn\" && !dialect.capabilities.returning) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"updateManyAndReturn\",\n hint: \"this dialect has no RETURNING — use updateMany then findMany, accepting that the read is a separate, unprotected statement\",\n });\n }\n if (args.skipUpdatedAt !== undefined && typeof args.skipUpdatedAt !== \"boolean\") {\n throw validationError({\n message: `skipUpdatedAt on ${model.clientName}.${method}() must be a boolean, got ${String(args.skipUpdatedAt)}`,\n meta: { model: model.name, method },\n });\n }\n const raw = requireObject({ value: args.where, what: \"where\", model });\n const where = isUnique ? expandCompoundWhere({ model, where: raw }) : raw;\n if (isUnique) assertUniqueWhere({ model, where, method });\n const compiled = compileWhere({ dialect, meta, model, where });\n return {\n ...base,\n // F5: overlay the values the update itself writes onto the refetch key,\n // narrowed to the addressed unique group (a conditional update's guard\n // must not be re-selected by its pre-update value).\n refetchWhere: isUnique ? uniqueRefetchWhere({ model, where, data: args.data }) : null,\n statement: {\n kind: \"update\",\n table: { name: model.tableName },\n set: compileUpdateSet({\n dialect,\n model,\n data: args.data,\n ...(args.skipUpdatedAt === true ? { skipUpdatedAt: true } : {}),\n }),\n ...(compiled === undefined ? {} : { where: compiled }),\n ...(method === \"updateMany\" ? {} : { returning: returningColumns({ model, selectedFields }) }),\n },\n };\n }\n\n case \"upsert\": {\n // `onConflict: { constraint }` — name the unique constraint that\n // arbitrates instead of the where-derived column list (postgres only).\n let constraintTarget: string | undefined;\n if (args.onConflict !== undefined) {\n const spec = requireObject({ value: args.onConflict, what: \"onConflict\", model });\n if (\n typeof spec.constraint !== \"string\" ||\n spec.constraint.length === 0 ||\n Object.keys(spec).length !== 1\n ) {\n throw validationError({\n message: `onConflict on ${model.clientName}.upsert() must be { constraint: string } — the named unique constraint that arbitrates the conflict`,\n meta: { model: model.name },\n });\n }\n if (!dialect.capabilities.conflictTargetConstraint) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target on upsert\",\n hint: \"only postgres supports ON CONFLICT ON CONSTRAINT — rely on the where-derived column target instead\",\n });\n }\n constraintTarget = spec.constraint;\n }\n const where = expandCompoundWhere({\n model,\n where: requireObject({ value: args.where, what: \"where\", model }),\n });\n assertUniqueWhere({ model, where, method });\n const row = compileCreateRow({ dialect, model, data: args.create });\n const columns = orderedColumns({ model, values: row.values });\n const targetFields = conflictTargetGroup({ model, where }).fields;\n // Defensive mirror of the client's routing (`upsertUsesNativeStatement`):\n // a native upsert whose create row does not bind the conflict target can\n // never fire its conflict clause on the addressed row — emitting it would\n // silently insert instead of update (SQL review B1). The client routes\n // such shapes to the transactional fallback before ever building this.\n for (const field of targetFields) {\n if (!(field.columnName in row.values)) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `upsert on ${model.name}: create data does not bind conflict-target column \"${field.columnName}\" — this shape must run the find-then-write fallback flow`,\n meta: { model: model.name, column: field.columnName },\n });\n }\n }\n // PG-2 mirror: a guard field beyond the conflict target is invisible to\n // ON CONFLICT — the update arm would fire even when the guard fails.\n const nativeTargetNames = new Set(targetFields.map((field) => field.name));\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined || nativeTargetNames.has(key)) continue;\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `upsert on ${model.name}: where field \"${key}\" is not part of the conflict target — guarded upserts must run the find-then-write fallback flow`,\n meta: { model: model.name, field: key },\n });\n }\n const update = compileUpdateSet({ dialect, model, data: args.update });\n // B2 (mysql): make the ODKU update arm record the addressed row's key so\n // the read-back can resolve it via LAST_INSERT_ID(). Integer single-column\n // keys only — LAST_INSERT_ID is an integer register.\n const pk = model.primaryKey.length === 1 ? (model.primaryKey[0] as FieldMeta) : undefined;\n const odkuKeyColumn =\n dialect.upsertForm === \"onDuplicateKey\" &&\n pk !== undefined &&\n (pk.scalarType === \"Int\" || pk.scalarType === \"BigInt\") &&\n !(pk.columnName in update)\n ? pk.columnName\n : undefined;\n return {\n ...base,\n // F5: on conflict the UPDATE arm applies — overlay its values.\n refetchWhere: overlayRefetchWhere({ model, where, data: args.update }),\n // The un-overlaid where: the INSERT arm's row answers this one (its\n // create row binds the conflict target — checked above).\n refetchWhereBase: { ...where },\n statement: {\n kind: \"insert\",\n table: { name: model.tableName },\n columns,\n rows: [columns.map((column) => row.values[column])],\n onConflict: {\n columns: targetFields.map((field) => field.columnName),\n ...(constraintTarget === undefined ? {} : { constraint: constraintTarget }),\n update,\n ...(odkuKeyColumn === undefined ? {} : { lastInsertIdColumn: odkuKeyColumn }),\n },\n returning: returningColumns({ model, selectedFields }),\n },\n };\n }\n\n case \"delete\":\n case \"deleteMany\": {\n const isUnique = method === \"delete\";\n const raw =\n args.where === undefined && !isUnique\n ? undefined\n : requireObject({ value: args.where, what: \"where\", model });\n const where = isUnique && raw !== undefined ? expandCompoundWhere({ model, where: raw }) : raw;\n if (isUnique && where !== undefined) assertUniqueWhere({ model, where, method });\n const compiled = where === undefined ? undefined : compileWhere({ dialect, meta, model, where });\n return {\n ...base,\n refetchWhere: isUnique ? (where as Record<string, unknown>) : null,\n statement: {\n kind: \"delete\",\n table: { name: model.tableName },\n ...(compiled === undefined ? {} : { where: compiled }),\n ...(isUnique ? { returning: returningColumns({ model, selectedFields }) } : {}),\n },\n };\n }\n }\n}\n",
10
+ "/**\n * EPIC 10 — batched upsert for ingestion (`upsertMany`).\n *\n * The whole logical input is validated HERE, before the query builder assembles\n * a single statement, so a malformed feed never reaches the database as a\n * partial write. Everything in this module is a pure function over the runtime\n * metadata and the already-compiled rows: the rows themselves are compiled by\n * the query builder's existing `compileCreateRows`, so validators, string-enum\n * membership checks, app-side defaults and `@updatedAt` stamping all come from\n * the one write path (constitution rule 6 — no second coercion path).\n *\n * The two decisions this file exists to keep honest:\n *\n * 1. **Duplicate conflict keys are refused, not resolved — and \"duplicate\"\n * means what the DATABASE means.** A batch is accepted only when its\n * conflict keys are provably distinct under the database's own equality.\n * Two routes get there, and {@link assertConflictKeysAreComparable} picks\n * one per call:\n *\n * - **Route 1 — the ORM's own check, which spans parameter chunks.**\n * {@link assertNoDuplicateConflictKeys} compares the encoded values of\n * every row in the batch, in input order, before it is split into\n * statements. That answer is the database's answer only where the\n * column's equality IS byte equality, so route 1 is available only when\n * {@link conflictKeyComparisonOf} says so for every target column: no\n * folding collation, no folding scalar, and no `@db.*` native type\n * outside the measured {@link BYTE_EXACT_NATIVE_TYPES}.\n * - **Route 2 — the engine's own comparison, inside ONE statement.**\n * Postgres refuses a doubled key with SQLSTATE 21000 under the real\n * column, which catches every fold the ORM cannot see: a `char(n)` pad,\n * a `uuid` case difference, `numeric` scale, `timestamp(0)` and `date`\n * truncation, `real` narrowing, `citext`, a nondeterministic collation.\n * It ends at the statement boundary. Rows in two statements are never\n * compared, and the second statement silently updates what the first\n * inserted.\n *\n * Neither route available means the batch is refused before a statement is\n * built. Mysql's default `utf8mb4_0900_ai_ci` and a sqlite `COLLATE NOCASE`\n * column both fold keys and both keep the LAST row without an error, so\n * those calls now refuse instead of guessing.\n *\n * **The strength of that guarantee, stated exactly.** Route 2 is the\n * database's own answer and carries no condition. Route 1 is only as true\n * as the schema: it reads `@collation` and `@db.*` and never asks the live\n * database what the column really is. Where the physical column disagrees\n * with what the schema declares — a table or database default, an ALTER\n * applied outside migrations, a restored dump, a column created before the\n * annotation — route 1 can accept a batch the database then folds. Nothing\n * in this module detects that, and nothing here claims to.\n * 2. **The affected count is not the driver's number.** Mysql's ON DUPLICATE\n * KEY convention counts an insert 1, a changed update 2 and an unchanged\n * update 0 — measured 3 for a four-row batch on 8.4.11. That is not a row\n * count and is never presented as one.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type { FieldMeta, ModelMeta } from \"./model-meta.ts\";\n\n/** Local mirror of the query builder's helper: a malformed call, nothing executed. */\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({\n code: \"VIBE_VALIDATION\",\n message: params.message,\n ...(params.meta === undefined ? {} : { meta: params.meta }),\n });\n}\n\n// ─── Result ───────────────────────────────────────────────────────\n\n/** What `upsertMany` resolves to. */\nexport type UpsertManyResult = {\n /**\n * Rows the database was asked to insert-or-update: one per input row, after\n * duplicate-conflict-key validation. Every one of them was either inserted or\n * updated — the statement carries no DO NOTHING arm and the whole operation\n * is atomic. NOT a count of rows whose values changed, and it does not\n * distinguish inserts from updates.\n */\n readonly count: number;\n /**\n * The driver's raw affected-row number, and only where that number IS a row\n * count ({@link affectedRowsAreRowCounts}). `null` on mysql.\n */\n readonly affectedRows: number | null;\n};\n\n/**\n * Does this dialect's affected-row number mean \"rows written\"?\n *\n * Postgres/pglite/sqlite: yes — a four-row `ON CONFLICT DO UPDATE` batch of\n * 2 unchanged + 1 changed + 1 insert reports 4. Mysql: no — the same batch\n * reports 3, because ON DUPLICATE KEY scores an insert 1, a changed update 2\n * and an unchanged update 0. Both measured, see notes-epic10.md.\n */\nexport function affectedRowsAreRowCounts(params: { dialect: SqlDialect }): boolean {\n return params.dialect.upsertForm !== \"onDuplicateKey\";\n}\n\n// ─── Conflict target ──────────────────────────────────────────────\n\n/** The arbiter an `upsertMany` call selected. */\nexport type UpsertConflictTarget =\n | { readonly kind: \"columns\"; readonly fields: readonly FieldMeta[] }\n | { readonly kind: \"constraint\"; readonly constraint: string };\n\n/**\n * Every distinct way this model can address one row, as a column-set signature.\n * Used to check that a conflict target names a REAL unique group, and to decide\n * whether mysql's untargetable ON DUPLICATE KEY could fire on something else.\n */\nexport function uniqueGroupSignatures(params: { model: ModelMeta }): ReadonlySet<string> {\n return new Set(uniqueGroupsOf({ model: params.model }).map((fields) => signatureOf({ fields })));\n}\n\n/** One unique group's column-set signature: order-independent, collision-safe. */\nfunction signatureOf(params: { fields: readonly FieldMeta[] }): string {\n return [...params.fields.map((field) => field.columnName)]\n .sort((left, right) => (left < right ? -1 : 1))\n .join(\"\\u0000\");\n}\n\n/**\n * Every distinct way this model can address one row, as FIELD groups.\n *\n * The single enumeration behind {@link uniqueGroupSignatures} and\n * {@link assertNoDuplicateSecondaryUniques} — one rule, so the set a conflict\n * target is validated against and the set a batch is checked against can never\n * drift apart.\n */\nfunction uniqueGroupsOf(params: { model: ModelMeta }): readonly (readonly FieldMeta[])[] {\n const { model } = params;\n const groups: (readonly FieldMeta[])[] = [];\n const seen = new Set<string>();\n const add = (fields: readonly FieldMeta[]): void => {\n if (fields.length === 0) return;\n const signature = signatureOf({ fields });\n if (seen.has(signature)) return;\n seen.add(signature);\n groups.push(fields);\n };\n add(model.primaryKey);\n for (const field of model.uniqueFields) add([field]);\n for (const group of model.compoundUniques.values()) add(group.fields);\n for (const group of model.singleIndexUniques) add(group.fields);\n return groups;\n}\n\n/**\n * `conflictTarget` → the arbiter. A field-name array must name a DECLARED\n * unique group: a target the database has no unique index for cannot arbitrate\n * anything, and postgres would refuse it at execution time anyway (\"there is no\n * unique or exclusion constraint matching the ON CONFLICT specification\") —\n * refusing at build time is the same answer, earlier and typed.\n */\nexport function resolveUpsertConflictTarget(params: {\n model: ModelMeta;\n target: unknown;\n}): UpsertConflictTarget {\n const { model, target } = params;\n if (target === undefined) {\n throw validationError({\n message: `upsertMany on ${model.clientName} needs an explicit conflictTarget — the unique group that decides which stored row an incoming row replaces`,\n meta: { model: model.name },\n });\n }\n if (\n typeof target === \"object\" &&\n target !== null &&\n !Array.isArray(target) &&\n typeof (target as { constraint?: unknown }).constraint === \"string\"\n ) {\n const constraint = (target as { constraint: string }).constraint;\n if (constraint.length === 0 || Object.keys(target).length !== 1) {\n throw validationError({\n message: `conflictTarget on ${model.clientName}.upsertMany() must be a field-name array or { constraint: string }`,\n meta: { model: model.name },\n });\n }\n return { kind: \"constraint\", constraint };\n }\n if (!Array.isArray(target) || target.length === 0 || target.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `conflictTarget on ${model.clientName}.upsertMany() must be a non-empty field-name array or { constraint: string }`,\n meta: { model: model.name },\n });\n }\n const fields: FieldMeta[] = [];\n for (const name of target as readonly string[]) {\n const field = model.fieldByName.get(name);\n if (field === undefined) {\n throw validationError({\n message: `unknown field \"${name}\" in conflictTarget on ${model.clientName}.upsertMany()`,\n meta: { model: model.name, field: name },\n });\n }\n fields.push(field);\n }\n const signature = [...fields.map((field) => field.columnName)]\n .sort((left, right) => (left < right ? -1 : 1))\n .join(\"\\u0000\");\n if (!uniqueGroupSignatures({ model }).has(signature)) {\n throw validationError({\n message: `conflictTarget [${fields.map((field) => field.name).join(\", \")}] on ${model.clientName}.upsertMany() is not a declared unique group of ${model.name} — an arbiter without a unique index cannot decide which row an incoming row replaces`,\n meta: { model: model.name, fields: fields.map((field) => field.name) },\n });\n }\n return { kind: \"columns\", fields };\n}\n\n/**\n * Mysql's `ON DUPLICATE KEY UPDATE` fires on ANY unique index, so a selected\n * conflict target is not enforceable there. With exactly one unique group there\n * is nothing else it could fire on and the contract holds; with more, the call\n * is refused unless the caller acknowledges the widening. This EPIC never\n * claims mysql enforces the target.\n */\nexport function assertConflictTargetIsEnforceable(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n allowAnyUniqueConflict: boolean;\n}): void {\n const { dialect, model, allowAnyUniqueConflict } = params;\n if (dialect.upsertForm !== \"onDuplicateKey\" || allowAnyUniqueConflict) return;\n const groups = uniqueGroupSignatures({ model });\n if (groups.size <= 1) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `an enforced conflict target on ${model.clientName}.upsertMany() (${model.name} declares ${groups.size} unique groups)`,\n hint: \"mysql's ON DUPLICATE KEY UPDATE fires on ANY unique index, so another one can decide the conflict — pass allowAnyUniqueConflict: true to accept that, or gate the call per dialect\",\n });\n}\n\n// ─── The update arm ───────────────────────────────────────────────\n\n/**\n * `update` → the fields the conflict arm overwrites from the incoming row.\n *\n * Refused: a conflict-target column (the arbiter is not a mutable field) and\n * the `@@policy` tenant field (tenant identity is not a mutable field). The\n * list is explicit by design — a \"everything else\" default would rewrite\n * columns a caller never mentioned.\n */\nexport function resolveUpsertUpdateFields(params: {\n model: ModelMeta;\n update: unknown;\n targetColumns: ReadonlySet<string>;\n skipUpdatedAt: boolean;\n}): readonly FieldMeta[] {\n const { model, update, targetColumns, skipUpdatedAt } = params;\n if (!Array.isArray(update) || update.length === 0 || update.some((name) => typeof name !== \"string\")) {\n throw validationError({\n message: `update on ${model.clientName}.upsertMany() must be a non-empty array of field names — the columns a conflicting row takes from the incoming row`,\n meta: { model: model.name },\n });\n }\n const fields: FieldMeta[] = [];\n const seen = new Set<string>();\n for (const name of update as readonly string[]) {\n const field = model.fieldByName.get(name);\n if (field === undefined) {\n throw validationError({\n message: `unknown field \"${name}\" in update on ${model.clientName}.upsertMany()`,\n meta: { model: model.name, field: name },\n });\n }\n if (targetColumns.has(field.columnName)) {\n throw validationError({\n message: `update on ${model.clientName}.upsertMany() cannot rewrite \"${field.name}\": it is part of the conflict target, the value that decides which row is being replaced`,\n meta: { model: model.name, field: field.name },\n });\n }\n if (model.policy !== undefined && model.policy.field === field.name) {\n throw validationError({\n message: `update on ${model.clientName}.upsertMany() cannot rewrite \"${field.name}\": it is ${model.name}'s tenant field (@@policy), and a batch that moves rows between tenants is never what an ingestion feed meant`,\n meta: { model: model.name, field: field.name },\n });\n }\n if (seen.has(field.columnName)) continue;\n seen.add(field.columnName);\n fields.push(field);\n }\n if (!skipUpdatedAt) {\n // Every compiled row already carries a fresh stamp, so the arm writes the\n // row's OWN value — the same semantics `compileUpdateSet` gives update().\n for (const field of model.fields) {\n if (!field.isUpdatedAt || seen.has(field.columnName) || targetColumns.has(field.columnName)) continue;\n seen.add(field.columnName);\n fields.push(field);\n }\n }\n return fields;\n}\n\n// ─── Whole-input validation ───────────────────────────────────────\n\n/**\n * Every row must BIND every conflict-target column and every updated column.\n *\n * The target columns are the B1 rule batched: a row that does not bind the\n * arbiter can never conflict on the row the caller meant. The update columns\n * are the destructive case — `SET col = <incoming row>.col` on a row that\n * omitted the column would write the column DEFAULT (or NULL) over a live\n * value. Columns that are neither may still be omitted per row: they take the\n * column default on insert and keep their stored value on conflict.\n */\nexport function assertUpsertRowsBindColumns(params: {\n model: ModelMeta;\n compiled: readonly Readonly<Record<string, unknown>>[];\n targetColumns: readonly string[];\n updateFields: readonly FieldMeta[];\n}): void {\n const { model, compiled, targetColumns, updateFields } = params;\n for (let index = 0; index < compiled.length; index += 1) {\n const row = compiled[index] as Readonly<Record<string, unknown>>;\n for (const column of targetColumns) {\n if (column in row) continue;\n throw validationError({\n message: `row ${index} of ${model.clientName}.upsertMany() does not set conflict-target column \"${column}\" — an incoming row without the arbiter's value cannot replace anything`,\n meta: { model: model.name, row: index, column },\n });\n }\n for (const field of updateFields) {\n if (field.columnName in row) continue;\n throw validationError({\n message: `row ${index} of ${model.clientName}.upsertMany() does not set \"${field.name}\", which the update list overwrites — the conflict arm would write the column default over a stored value; give every row a value or drop \"${field.name}\" from update`,\n meta: { model: model.name, row: index, field: field.name },\n });\n }\n }\n}\n\n/**\n * A stable, TYPE-TAGGED key for one row's conflict-target values, built from\n * the ENCODED values so a `Date` and its stored form, or `1n` and `1`, land in\n * the same bucket exactly as they will in the database.\n */\nfunction conflictKeyOf(params: { row: Readonly<Record<string, unknown>>; columns: readonly string[] }): string {\n return params.columns\n .map((column) => {\n const value = params.row[column];\n if (value === null || value === undefined) return \"n\";\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\" || typeof value === \"bigint\") return `f:${value.toString()}`;\n if (typeof value === \"boolean\") return `b:${value ? 1 : 0}`;\n if (value instanceof Date) return `d:${value.getTime()}`;\n if (value instanceof Uint8Array) return `x:${[...value].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`;\n return `j:${JSON.stringify(value)}`;\n })\n .join(\"\\u0000\");\n}\n\n/**\n * Refuse a batch that proposes the same conflict key twice, BYTE-wise.\n *\n * Not a `firstWins`/`lastWins` resolution, because the engines disagree about\n * what such a batch even means (postgres: SQLSTATE 21000; mysql and sqlite:\n * silent last-wins). Byte equality is a SUBSET of every collation's equality —\n * no collation can call two identical byte strings different — so this check\n * never refuses a batch the database would have accepted, and it covers the\n * whole batch, parameter chunks included. Where it is not the WHOLE answer,\n * {@link assertConflictKeysAreComparable} refuses rather than guessing.\n */\nexport function assertNoDuplicateConflictKeys(params: {\n model: ModelMeta;\n compiled: readonly Readonly<Record<string, unknown>>[];\n targetColumns: readonly string[];\n}): void {\n const { model, compiled, targetColumns } = params;\n const firstIndexByKey = new Map<string, number>();\n for (let index = 0; index < compiled.length; index += 1) {\n const key = conflictKeyOf({ row: compiled[index] as Readonly<Record<string, unknown>>, columns: targetColumns });\n const first = firstIndexByKey.get(key);\n if (first !== undefined) {\n throw validationError({\n message: `${model.clientName}.upsertMany() got the same conflict key twice — rows ${first} and ${index} both address (${targetColumns.join(\", \")}); deduplicate the feed before submitting it, because the databases disagree about what one statement writing a key twice means (postgres refuses it, mysql keeps the last one)`,\n meta: { model: model.name, rows: [first, index], columns: [...targetColumns] },\n });\n }\n firstIndexByKey.set(key, index);\n }\n}\n\n/**\n * Refuse a batch that doubles a unique group the arbiter does NOT name, on a\n * dialect whose upsert has no arbiter at all.\n *\n * `ON DUPLICATE KEY UPDATE` resolves through whichever unique index the\n * incoming row happens to match, so two rows carrying one `email` — distinct\n * `id`s, an untouched conflict target — are not two rows: the second UPDATES\n * the first and one of them silently disappears, with `ROW_COUNT()` reporting\n * a number that hides it. Postgres and sqlite arbitrate on the named target\n * only, so the second row violates the other index and the whole batch fails\n * loudly; nothing is refused for them here.\n *\n * `allowAnyUniqueConflict` does NOT authorise this. That flag acknowledges\n * that a SINGLE incoming row may be resolved through an index other than the\n * one named — a widening of which stored row is replaced. It was never an\n * acceptance of two submitted rows collapsing into one, which is a row the\n * caller sent and the database does not have.\n *\n * Comparison is byte equality, deliberately: byte-identical values are equal\n * under every collation and every native type, so this can only refuse a batch\n * the database would itself have folded. Values a collation might fold while\n * their bytes differ are the opaque case, and\n * {@link assertConflictKeysAreComparable} already governs it.\n *\n * Rows that leave any of the group's columns unbound or NULL are skipped: an\n * unbound column takes a default this layer cannot know, and mysql's unique\n * indexes never collide on NULL.\n */\nexport function assertNoDuplicateSecondaryUniques(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n compiled: readonly Readonly<Record<string, unknown>>[];\n targetColumns: readonly string[];\n}): void {\n const { dialect, model, compiled, targetColumns } = params;\n if (dialect.upsertForm !== \"onDuplicateKey\") return;\n const targetSignature =\n targetColumns.length === 0\n ? null\n : [...targetColumns].sort((left, right) => (left < right ? -1 : 1)).join(\"\\u0000\");\n\n for (const fields of uniqueGroupsOf({ model })) {\n if (signatureOf({ fields }) === targetSignature) continue;\n const columns = fields.map((field) => field.columnName);\n const firstIndexByKey = new Map<string, number>();\n for (let index = 0; index < compiled.length; index += 1) {\n const row = compiled[index] as Readonly<Record<string, unknown>>;\n if (columns.some((column) => !(column in row) || row[column] === null || row[column] === undefined)) continue;\n const key = conflictKeyOf({ row, columns });\n const first = firstIndexByKey.get(key);\n if (first !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `${model.clientName}.upsertMany() with rows ${first} and ${index} carrying the same ${fields.map((field) => field.name).join(\" + \")}`,\n hint: `ON DUPLICATE KEY UPDATE has no conflict target: it resolves through whichever unique index an incoming row matches, so row ${index} would UPDATE row ${first} through unique (${columns.join(\", \")}) and one of the two rows you submitted would silently not exist. Deduplicate the feed on those columns as well as on the conflict target, or submit the colliding rows in separate calls. allowAnyUniqueConflict widens which STORED row a single incoming row may replace; it does not authorise two submitted rows collapsing into one`,\n });\n }\n firstIndexByKey.set(key, index);\n }\n }\n}\n\n// ─── Which equality decides a duplicate ─────────────────────\n\n/**\n * Collations whose equality IS byte equality, lowercased.\n *\n * Membership is decided by each collation's MEASURED comparison and padding\n * semantics on this project's own engines, never by the shape of its name, and\n * the list is enumerated so that an unrecognised name refuses instead of\n * guessing. The specific guess this replaces: a `_bin` SUFFIX proves nothing.\n * On mysql 8.4.11, `SELECT COLLATION_NAME, PAD_ATTRIBUTE FROM\n * information_schema.COLLATIONS` reports `PAD SPACE` for `utf8mb4_bin` and for\n * all 39 other legacy `_bin` collations, and `NO PAD` for only `binary` and\n * `utf8mb4_0900_bin`. Under PAD SPACE the ORM's own upsert statement, binding\n * `'x'` and `'x '` against a `utf8mb4_bin` primary key, stored ONE row and kept\n * the last one. Sqlite's `RTRIM` sequence is case-SENSITIVE and folds a\n * trailing space the same way, which is why it is absent too.\n *\n * The list is not split per dialect, because byte equality is not\n * dialect-relative and `@collation` renders on mysql only (it is inert on\n * postgres and sqlite by design, so one portable schema can carry it across\n * the matrix). Splitting it would refuse a sqlite batch for carrying a mysql\n * collation name that sqlite never applied.\n *\n * Entries and the measurement behind each:\n * - `binary` — mysql's binary-charset collation, `NO PAD`; also sqlite's\n * default collating sequence, which kept `'e'` and `'E'` apart.\n * - `utf8mb4_0900_bin` — mysql `NO PAD`; kept `'e'`/`'E'`, `'cafe'`/`'café'`\n * and `'x'`/`'x '` apart through the ORM's own statement.\n * - `c`, `posix`, `ucs_basic`, `c.utf-8`, `c.utf8` — postgres's byte-ordered\n * collations. Every postgres collation is deterministic unless it was built\n * `deterministic = false`, and a deterministic collation never equates\n * byte-distinct strings; these five are byte-ordered outright.\n */\nconst BYTE_EXACT_COLLATIONS: ReadonlySet<string> = new Set([\n \"binary\",\n \"utf8mb4_0900_bin\",\n \"c\",\n \"posix\",\n \"ucs_basic\",\n \"c.utf-8\",\n \"c.utf8\",\n]);\n\n/**\n * Does this declared `@collation` compare bytes?\n *\n * What this CANNOT do is check the physical column. `@collation` is the\n * SCHEMA's claim about intent; a table or database default, a hand-written\n * ALTER, a restored dump, or a column created before the annotation was added\n * can all leave the real column carrying something else. On mysql that gap is\n * the normal case rather than the exception, because the differ does not\n * compare collations and so never generates the ALTER. Stated in\n * {@link assertConflictKeysAreComparable} and in docs/dialect-notes.md.\n */\nfunction isByteExactCollation(params: { collation: string }): boolean {\n return BYTE_EXACT_COLLATIONS.has(params.collation.trim().replaceAll('\"', \"\").toLowerCase());\n}\n\n/**\n * Native column types (`@db.*`) whose stored value compares exactly as the\n * value the caller sent, on every dialect that renders them.\n *\n * The default is the other way round: a declared native type makes a column\n * OPAQUE. A physical type decides equality before any collation is consulted,\n * and the ways it can do so have nothing to do with character sets — padding,\n * scale, precision, width. Measured on this project's engines:\n *\n * | declared | measured |\n * | --------------------- | --------------------------------------------------- |\n * | `Char(10)` | mysql, WITH `utf8mb4_0900_bin`: `'x'` and `'x '` → ONE row, len 1, last kept. postgres: 21000 in one statement, and ONE row across two |\n * | `Uuid` | postgres compares the parsed 128 bits, so `'A0EE…'` = `'a0ee…'` |\n * | `Timestamp(0)` | drops the sub-second part a JS `Date` carries |\n * | `Date` | drops the time of day entirely |\n * | `Decimal(10, 2)` | `1.001` and `1.004` both round to `1.00` |\n * | `Real` | `1.000000001` <> `1.000000002` as float8, EQUAL as float4 |\n * | `Binary(8)` | mysql right-pads with NUL: `0x41` = `0x4100` |\n * | `Citext` | folds case as a TYPE, with no collation involved |\n * | `Text` | postgres keeps every byte, but mysql cannot index a TEXT column without a PREFIX length, and a prefix index folds (`'abcdefgh'` and `'abcdZZZZ'` → ONE row under `k(4)`). VibeORM's mysql DDL never indexes TEXT at all (packages/migrate/src/ddl/mysql.ts). Not listed: this project could not establish it on every engine that renders it |\n *\n * The two that survived every probe:\n * - `varchar` — `'x'` and `'x '` stayed two rows on postgres `varchar(10)` and\n * on mysql `VARCHAR(10) COLLATE utf8mb4_0900_bin`. It is also the type\n * `@db.VarChar(n)` produces, which is how a Prisma schema ordinarily sizes a\n * string, so excluding it would refuse the common case for no measured\n * reason.\n * - `varbinary` — mysql `0x41` and `0x4100` stayed two rows, where `BINARY(8)`\n * folded them.\n *\n * Each entry has a measured lossy sibling in the table above, which is what\n * makes the list a decision rather than a preference. An unrecognised name is\n * opaque, so a native type nobody here has run cannot become a silent yes.\n */\nconst BYTE_EXACT_NATIVE_TYPES: ReadonlySet<string> = new Set([\"varchar\", \"varbinary\"]);\n\n/**\n * Does this declared `@db.*` type leave value equality alone?\n *\n * Compares the base name only — `VarChar(191)` and `VarChar(64)` are both\n * `varchar`. This classification is valid only after assertConflictKeysFit\n * refuses values beyond the bound: excess trailing spaces are truncated.\n * `Char(10)` and `Char(2)` are both `char` for the same reason, and both are\n * absent from the list.\n */\nfunction isByteExactNativeType(params: { nativeType: string }): boolean {\n const match = /^(varchar|varbinary)(?:\\(\\s*([1-9]\\d*)\\s*\\))?$/i.exec(params.nativeType.trim());\n return match !== null && BYTE_EXACT_NATIVE_TYPES.has((match[1] as string).toLowerCase());\n}\n\n/**\n * Reject values a bounded column would truncate before comparing. PostgreSQL\n * and strict-mode MySQL both silently discard over-width trailing spaces in\n * VARCHAR(n); NO PAD collations do not prevent this storage conversion.\n * SQLite ignores native widths and keeps the original TEXT/BLOB instead.\n */\nfunction assertConflictKeysFit(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n fields: readonly FieldMeta[];\n compiled: readonly Readonly<Record<string, unknown>>[];\n}): void {\n if (params.dialect.name === \"sqlite\") return;\n for (const field of params.fields) {\n const native = field.nativeType === undefined ? null : /^(varchar|varbinary)\\(\\s*([1-9]\\d*)\\s*\\)$/i.exec(field.nativeType.trim());\n const capacity = native !== null\n ? Number(native[2])\n : field.nativeType === undefined && field.scalarType === \"String\"\n ? params.dialect.conflictKeyEquality.defaultStringMaxLength\n : undefined;\n if (capacity === undefined) continue;\n for (let index = 0; index < params.compiled.length; index += 1) {\n const value = params.compiled[index]?.[field.columnName];\n // Counting code points is a capacity check, not a collation approximation.\n const length = typeof value === \"string\" ? Array.from(value).length : value instanceof Uint8Array ? value.byteLength : 0;\n if (length <= capacity) continue;\n throw validationError({\n message: `${params.model.clientName}.upsertMany() row ${index} conflict key \"${field.name}\" exceeds its column capacity ${capacity}. The database can truncate it and merge distinct input keys; shorten the value or migrate to a wider column.`,\n meta: { model: params.model.name, field: field.name, row: index, capacity },\n });\n }\n }\n}\n\n/** How a single conflict-target column's equality can be established. */\nexport type ConflictKeyComparison =\n /** The encoded JavaScript values compare exactly as the column does. */\n | \"byte\"\n /** Only the database knows: a collation, a scale or a precision decides. */\n | \"database\";\n\n/**\n * Which comparison decides whether two rows address the same stored row\n * through this column.\n *\n * A declared `@db.*` native type is read FIRST and outranks everything the\n * scalar implies, because the physical column pads, rounds, narrows or\n * case-folds before a collation is ever consulted — and no annotation\n * elsewhere can undo that. Only the measured types in\n * {@link BYTE_EXACT_NATIVE_TYPES} pass; anything else is opaque, including a\n * type this project has never run.\n *\n * Text (and enum members, which live in a text column on sqlite and mysql)\n * then follows the column's collation: a declared `@collation` is believed on\n * every dialect, because it is the schema's own statement about the column,\n * and an undeclared one falls back to the dialect's default. Other scalars\n * follow the dialect's folding list — `Decimal` is there on postgres and mysql\n * because `numeric`/`DECIMAL` equality ignores trailing zeros while the\n * encoded value is the string the caller wrote.\n *\n * Everything here reads the SCHEMA. It is a claim about what the column was\n * declared to be, never a reading of what it is.\n */\nexport function conflictKeyComparisonOf(params: {\n dialect: SqlDialect;\n field: FieldMeta;\n}): ConflictKeyComparison {\n const { dialect, field } = params;\n const equality = dialect.conflictKeyEquality;\n if (field.nativeType !== undefined && !isByteExactNativeType({ nativeType: field.nativeType })) {\n return \"database\";\n }\n const isTextColumn = field.scalarType === \"String\" || field.enumName !== null;\n if (isTextColumn) {\n if (field.collation !== undefined) {\n return isByteExactCollation({ collation: field.collation }) ? \"byte\" : \"database\";\n }\n return equality.textIsBinaryByDefault ? \"byte\" : \"database\";\n }\n if (field.scalarType !== null && equality.foldingScalars.includes(field.scalarType)) return \"database\";\n return \"byte\";\n}\n\n/**\n * How a caller gets an opaque key comparable again.\n *\n * The advice is chosen by what actually made the key opaque, because the wrong\n * half is worse than none: re-collating a `char(n)` column does not stop it\n * padding, and re-collating a `Decimal` column is advice nobody can follow.\n * The collation branch also separates the two things it does — lifting the\n * refusal is a schema edit, protecting the data needs the physical column to\n * match — rather than implying an ALTER has happened.\n */\nfunction remedyFor(params: { dialect: SqlDialect; fields: readonly FieldMeta[] }): string {\n const pickAnother =\n \"pick a conflict target the ORM can compare itself: an integer, a bytes or a boolean column, or a String column with no @db.* annotation\";\n const native = params.fields.filter((field) => field.nativeType !== undefined);\n if (native.length > 0) {\n const annotations = native.map((field) => `\\`@db.${field.nativeType}\\``).join(\" and \");\n return `drop ${annotations} from the conflict-target column — its padding, precision or width is what makes the stored value differ from the value you sent, and no collation can undo that — or ${pickAnother}`;\n }\n const hasText = params.fields.some((field) => field.scalarType === \"String\" || field.enumName !== null);\n if (!hasText) return pickAnother;\n return params.dialect.name === \"mysql\"\n ? `declare a byte-comparable collation on the column — \\`@collation(\"utf8mb4_0900_bin\")\\`, not \\`utf8mb4_bin\\`, which is PAD SPACE and reads \"a\" and \"a \" as one key. That lifts this refusal; it protects the rows only once the PHYSICAL column carries that collation, which migrate will not do for you — check \\`SHOW FULL COLUMNS\\` and apply the ALTER yourself. Or ${pickAnother}`\n : `drop the folding collation from the column, or ${pickAnother}`;\n}\n\n/**\n * Refuse a batch whose conflict keys neither side can compare.\n *\n * Runs after {@link assertNoDuplicateConflictKeys} and before any statement is\n * executed. Two things make a batch safe, and one of them has to hold:\n *\n * 1. **Every target column compares BYTES.** Then the whole-batch JavaScript\n * check already saw every pair, across parameter chunks, and is the same\n * answer the database would give.\n * 2. **The engine compares the pairs itself, in ONE statement.** Postgres does\n * (SQLSTATE 21000) and it does so under the real collation, scale and\n * precision — including the ones the ORM cannot see, such as a `@db.Char`\n * pad or a `uuid` column's case folding. A SECOND statement breaks it: rows\n * in different statements are never compared, and the second one quietly\n * updates what the first inserted.\n *\n * A named-constraint arbiter hides its column list, so route 1 is unavailable\n * by construction and route 2 is the only one left.\n *\n * **What route 1 does NOT establish.** It reads the SCHEMA. `@collation` and\n * `@db.*` are what the schema intends the column to be, and nothing here reads\n * the live database to confirm either. A table or database default, an ALTER\n * applied outside migrations, a restored dump, or a column created before the\n * annotation was added all leave the physical column carrying something else.\n * On mysql that gap is the normal case rather than the exception for a\n * collation: the differ compares a column's type, nullability and default,\n * never its collation, so adding `@collation` to an existing column generates\n * no migration step at all. Where the schema and the column disagree, route\n * 1's guarantee is the schema's, not the database's.\n *\n * **What route 1 now also refuses.** A conflict-target column carrying a\n * `@db.*` native type is opaque unless that exact type was measured to leave\n * equality alone ({@link BYTE_EXACT_NATIVE_TYPES}). This closes the case where\n * a `@db.Char(10)` or `@db.Uuid` key classified as byte-comparable, took route\n * 1, and let a chunked batch through: measured on postgres, `'pad'` and\n * `'pad '` submitted as two statements against a `char(10)` key stored ONE row\n * and kept the last, with no error, while the same pair inside one statement\n * raised 21000.\n */\nexport function assertConflictKeysAreComparable(params: {\n dialect: SqlDialect;\n model: ModelMeta;\n target: UpsertConflictTarget;\n /** Statements this batch will run; more than one means uncompared pairs. */\n statementCount: number;\n compiled: readonly Readonly<Record<string, unknown>>[];\n}): void {\n const { dialect, model, target, statementCount } = params;\n const engineComparesEveryPair =\n dialect.conflictKeyEquality.duplicatesInOneStatement === \"reject\" && statementCount === 1;\n\n if (target.kind === \"constraint\") {\n if (engineComparesEveryPair) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a ${statementCount > 1 ? \"chunked \" : \"\"}${model.clientName}.upsertMany() batch arbitrated by constraint \"${target.constraint}\"`,\n hint:\n statementCount > 1\n ? `a named constraint hides which columns decide the conflict, so only the engine can tell whether two incoming rows address the same stored row — and it only compares rows inside ONE statement, while this batch of ${model.name} rows needs ${statementCount}. Submit fewer rows per call, or name the unique group's fields instead of the constraint`\n : \"a named constraint hides which columns decide the conflict, so this dialect would silently keep the last of two rows that address the same stored row\",\n });\n }\n\n assertConflictKeysFit({ dialect, model, fields: target.fields, compiled: params.compiled });\n const opaque = target.fields.filter(\n (field) => conflictKeyComparisonOf({ dialect, field }) === \"database\",\n );\n if (opaque.length === 0 || engineComparesEveryPair) return;\n\n const described = opaque\n .map((field) => {\n // Name what made it opaque, so the message is diagnosable without\n // reading the schema back.\n const notes: string[] = [];\n if (field.nativeType !== undefined) notes.push(`@db.${field.nativeType}`);\n if (field.collation !== undefined) notes.push(`@collation(\"${field.collation}\")`);\n return notes.length === 0\n ? `${field.name} (column \"${field.columnName}\")`\n : `${field.name} (column \"${field.columnName}\", ${notes.join(\", \")})`;\n })\n .join(\", \");\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `${model.clientName}.upsertMany() on conflict target ${described}`,\n hint:\n statementCount > 1\n ? `only the database can tell whether two of these keys address the same stored row — its column type, collation, scale or precision decides — and it only compares rows inside ONE statement, while this batch of ${model.name} rows needs ${statementCount}. Submit fewer rows per call, or ${remedyFor({ dialect, fields: opaque })}`\n : `only the database can tell whether two of these keys address the same stored row — its column type, collation, scale or precision decides — and this dialect answers a doubled key by silently keeping the last row instead of refusing it. Deduplicate the feed against the same rule the column uses, or ${remedyFor({ dialect, fields: opaque })}`,\n });\n}\n",
11
+ "/**\n * Sort-aware keyset pagination — the order plan and the opaque position token.\n *\n * A keyset position describes ORDERING VALUES plus a unique tie-breaker, not\n * the identity of one row: the row a token was minted from may since have been\n * deleted or had its sort key changed, and traversal still continues from the\n * right place. That is the whole difference from the legacy `cursor`, which\n * addresses a row by a unique key and is left untouched by this module.\n *\n * Two rules this module exists to enforce:\n * - a position is only meaningful against ONE effective ordering, so the\n * token carries that ordering's signature and a mismatch is refused loudly\n * rather than silently paginating the wrong sequence;\n * - a position's values are encoded LOSSLESSLY per scalar type — never\n * through a float64 detour and never from a rounded display value.\n *\n * The token is ENCODED, not encrypted: anyone holding it can read the ordering\n * values inside. It is also NOT an authorization credential — it selects a\n * position, never a row; every query consuming one still compiles the caller's\n * own `where` and keeps its `$scoped` / `$withPolicy` / RLS filters.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type { FieldMeta, ModelMeta } from \"./model-meta.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport type KeysetDirection = \"asc\" | \"desc\";\nexport type KeysetNulls = \"first\" | \"last\";\n\n/**\n * The caller's assertion that every `DateTime` ordering column holds\n * millisecond-exact values. See {@link compileKeysetOrderPlan}.\n */\nexport type KeysetTimestampPrecision = \"milliseconds\";\n\n/** One order term, already resolved by the query builder. */\nexport type KeysetOrderInput = {\n readonly field: FieldMeta;\n readonly direction: KeysetDirection;\n /** Resolved NULL placement: the explicit request, else the dialect's native one. */\n readonly nulls: KeysetNulls;\n};\n\n/** One key of the effective keyset order. */\nexport type KeysetOrderKey = {\n readonly field: FieldMeta;\n readonly direction: KeysetDirection;\n readonly nulls: KeysetNulls;\n readonly tag: KeysetValueTag;\n};\n\n/** The effective order a token is bound to. */\nexport type KeysetOrderPlan = {\n readonly model: string;\n readonly keys: readonly KeysetOrderKey[];\n /** Plain-text order signature carried inside the token. */\n readonly signature: string;\n};\n\n/** Per-scalar lossless encoding tag stored in the token. */\nexport type KeysetValueTag = \"s\" | \"i\" | \"b\" | \"f\" | \"c\" | \"t\" | \"o\" | \"y\";\n\n// ─── Constants ────────────────────────────────────────────────────\n\n/** Token version. A token from another version is refused, never guessed at. */\nexport const KEYSET_TOKEN_VERSION: number = 1;\n\n/** Token prefix — `vk` for \"vibe keyset\", then the version. */\nexport const KEYSET_TOKEN_PREFIX: string = \"vk1.\";\n\n/** Upper bound on an iterator page — memory is bounded by construction, not by hope. */\nexport const KEYSET_MAX_PAGE_SIZE: number = 10_000;\n\n/**\n * Dialects whose `DateTime` storage may be finer than a JavaScript `Date`.\n *\n * A driver hands the runtime a `Date`, which is millisecond-resolution, and\n * `FieldMeta` carries no declared fractional-seconds precision — so on these\n * dialects the runtime CANNOT obtain a lossless timestamp cursor value, and\n * `plan.md`'s other branch applies: explicitly restrict the ordering. sqlite is\n * absent because VibeORM writes those values itself, in milliseconds.\n *\n * (Ideally this would live beside the other capability declarations in\n * `@vibeorm/sql`; it describes what the RUNTIME can prove about a decoded\n * value rather than what SQL to emit, and the capability tables are\n * coordinator-owned while lanes overlap — see the notes' hand-off.)\n */\nconst DATETIME_NEEDS_PRECISION_ASSERTION: Readonly<Record<string, boolean>> = Object.freeze({\n postgres: true,\n mysql: true,\n sqlite: false,\n});\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction keysetValidation(params: { message: string; meta: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\nfunction keysetUnsupported(params: { message: string; meta: Record<string, unknown> }): VibeError {\n return new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: params.message,\n meta: params.meta,\n });\n}\n\n// ─── base64url (no dependency, no Buffer) ─────────────────────────\n\nconst BASE64URL_ALPHABET: RegExp = /^[A-Za-z0-9_-]*$/;\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction base64UrlToBytes(text: string): Uint8Array | null {\n if (!BASE64URL_ALPHABET.test(text)) return null;\n const padded = text.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = ((): string | null => {\n try {\n return atob(padded + \"=\".repeat((4 - (padded.length % 4)) % 4));\n } catch {\n return null;\n }\n })();\n if (binary === null) return null;\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);\n return bytes;\n}\n\n// ─── Order plan ───────────────────────────────────────────────────\n\n/** The lossless token tag for a field, or `null` when the type has no keyset codec. */\nfunction tagOf(field: FieldMeta): KeysetValueTag | null {\n if (field.isList) return null;\n if (field.enumName !== null) return \"s\";\n switch (field.scalarType) {\n case \"String\":\n return \"s\";\n case \"Int\":\n return \"i\";\n case \"BigInt\":\n return \"b\";\n case \"Float\":\n return \"f\";\n case \"Decimal\":\n return \"c\";\n case \"DateTime\":\n return \"t\";\n case \"Boolean\":\n return \"o\";\n default:\n // Json has no total order; Bytes compares and collates differently on\n // each of the three dialects, so it is refused as an ORDER key even\n // though the token codec can carry it losslessly (tag \"y\").\n return null;\n }\n}\n\n/**\n * Does this set of ordering fields contain a unique key, making the order\n * TOTAL? A single `@id`/`@unique`/single-column-unique-index field, or every\n * member of the composite primary key or of one composite `@@unique` group.\n * Nullable members disqualify a group: a NULL cannot break a tie.\n */\nfunction tieBreakerOf(params: { model: ModelMeta; names: ReadonlySet<string> }): string[] | null {\n const { model, names } = params;\n for (const field of model.fields) {\n if (!names.has(field.name) || field.isOptional) continue;\n if (field.isId || field.isUnique) return [field.name];\n if (model.singleIndexUniques.some((group) => (group.fields[0] as FieldMeta).name === field.name)) {\n return [field.name];\n }\n }\n const groups: (readonly FieldMeta[])[] = [\n ...(model.primaryKey.length > 1 ? [model.primaryKey] : []),\n ...[...model.compoundUniques.values()].map((group) => group.fields),\n ];\n for (const group of groups) {\n if (group.length === 0) continue;\n if (group.every((field) => names.has(field.name) && !field.isOptional)) {\n return group.map((field) => field.name);\n }\n }\n return null;\n}\n\n/**\n * Compile and VALIDATE the effective keyset order.\n *\n * Refuses, at build time and before any statement runs: list/Json/Bytes order\n * keys, an order with no unique tie-breaker, and a `DateTime` key on a dialect\n * that may store sub-millisecond values unless the caller passes\n * `timestampPrecision: \"milliseconds\"` — the caller's explicit assertion that\n * the column is millisecond-exact. That assertion is NOT safe for a\n * `@default(now())` column on postgres, which is microsecond-precise: a\n * truncated cursor value re-admits rows already delivered in that same\n * millisecond, i.e. duplicates.\n */\nexport function compileKeysetOrderPlan(params: {\n model: ModelMeta;\n dialect: SqlDialect;\n terms: readonly KeysetOrderInput[];\n timestampPrecision?: KeysetTimestampPrecision;\n}): KeysetOrderPlan {\n const { model, dialect, terms, timestampPrecision } = params;\n if (terms.length === 0) {\n throw keysetValidation({\n message: `keyset pagination on model \"${model.name}\" needs an orderBy — a position has no meaning without an order`,\n meta: { model: model.name, reason: \"keyset-order-required\" },\n });\n }\n const keys: KeysetOrderKey[] = [];\n const seen = new Set<string>();\n for (const term of terms) {\n const { field } = term;\n if (seen.has(field.name)) {\n throw keysetValidation({\n message: `keyset orderBy on model \"${model.name}\" names \"${field.name}\" twice — an ordering key may appear once`,\n meta: { model: model.name, field: field.name, reason: \"keyset-order-duplicate\" },\n });\n }\n seen.add(field.name);\n const tag = tagOf(field);\n if (tag === null) {\n throw keysetUnsupported({\n message: `keyset pagination cannot order by ${model.name}.${field.name} — no lossless keyset codec exists for this column type`,\n meta: { model: model.name, field: field.name, feature: \"keysetOrderKey\" },\n });\n }\n if (tag === \"t\" && DATETIME_NEEDS_PRECISION_ASSERTION[dialect.name] === true && timestampPrecision === undefined) {\n throw keysetUnsupported({\n message:\n `keyset pagination cannot order by ${model.name}.${field.name} on ${dialect.name}: this engine may store sub-millisecond timestamps, ` +\n \"and a JavaScript Date truncates them, which would re-deliver rows inside the same millisecond. \" +\n 'Pass keyset: { timestampPrecision: \"milliseconds\" } to assert the column is millisecond-exact, or order by a lossless key.',\n meta: { model: model.name, field: field.name, feature: \"keysetTimestampPrecision\", dialect: dialect.name },\n });\n }\n keys.push({ field, direction: term.direction, nulls: term.nulls, tag });\n }\n const tieBreaker = tieBreakerOf({ model, names: seen });\n if (tieBreaker === null) {\n throw keysetUnsupported({\n message:\n `keyset pagination on model \"${model.name}\" needs a unique tie-breaker in its orderBy — ` +\n \"append the primary key (or a non-nullable unique field) so the ordering is total\",\n meta: { model: model.name, orderFields: [...seen], feature: \"keysetTieBreaker\" },\n });\n }\n return { model: model.name, keys, signature: signatureOf({ model: model.name, keys }) };\n}\n\n/**\n * The order signature carried inside a token. `nulls=` appears ONLY for a\n * nullable key: NULL placement is the one dialect-dependent part of an\n * ordering, so a token over non-nullable keys stays portable across dialects\n * while a nullable one is correctly bound to the placement it was minted under.\n */\nfunction signatureOf(params: { model: string; keys: readonly KeysetOrderKey[] }): string {\n const { model, keys } = params;\n const parts = keys.map((key) => {\n const base = `${key.field.name}:${key.direction}`;\n return key.field.isOptional ? `${base}:nulls=${key.nulls}` : base;\n });\n return [model, ...parts].join(\"|\");\n}\n\n// ─── Value codecs ─────────────────────────────────────────────────\n\nfunction encodeValueFor(params: { key: KeysetOrderKey; value: unknown; model: string }): string | null {\n const { key, value, model } = params;\n if (value === null || value === undefined) {\n if (!key.field.isOptional) {\n throw keysetValidation({\n message: `keyset position for ${model}.${key.field.name} is null, but the column is not nullable`,\n meta: { model, field: key.field.name, reason: \"keyset-position-invalid\" },\n });\n }\n return null;\n }\n switch (key.tag) {\n case \"s\":\n if (typeof value !== \"string\") break;\n return value;\n case \"i\": {\n const asNumber = typeof value === \"bigint\" ? Number(value) : typeof value === \"string\" ? Number(value) : value;\n if (typeof asNumber !== \"number\" || !Number.isSafeInteger(asNumber)) break;\n return String(asNumber);\n }\n case \"b\": {\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return String(value);\n if (typeof value === \"string\" && /^-?\\d+$/.test(value)) return value;\n break;\n }\n case \"f\": {\n if (typeof value !== \"number\" || !Number.isFinite(value)) break;\n // Number#toString round-trips float64 exactly; a rounded display value\n // never enters the token.\n return value.toString();\n }\n case \"c\": {\n if (typeof value === \"string\") return value;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\" && Number.isFinite(value)) return value.toString();\n break;\n }\n case \"t\": {\n const time =\n value instanceof Date ? value.getTime() : typeof value === \"string\" ? new Date(value).getTime() : Number(value);\n if (!Number.isFinite(time)) break;\n return String(time);\n }\n case \"o\": {\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n if (value === 0 || value === 1) return value === 1 ? \"1\" : \"0\";\n break;\n }\n case \"y\": {\n if (value instanceof Uint8Array) return bytesToBase64Url(value);\n break;\n }\n }\n throw keysetValidation({\n message: `keyset position value for ${model}.${key.field.name} cannot be encoded losslessly`,\n meta: { model, field: key.field.name, reason: \"keyset-position-invalid\" },\n });\n}\n\nfunction decodeValueFor(params: { key: KeysetOrderKey; tag: string; text: string; model: string }): unknown {\n const { key, tag, text, model } = params;\n const reject = (): never => {\n throw keysetValidation({\n message: `keyset token carries an unreadable value for ${model}.${key.field.name}`,\n meta: { model, field: key.field.name, reason: \"keyset-token-malformed\" },\n });\n };\n if (tag !== key.tag) return reject();\n switch (key.tag) {\n case \"s\":\n return text;\n case \"i\": {\n const value = Number(text);\n return Number.isSafeInteger(value) ? value : reject();\n }\n case \"b\":\n if (!/^-?\\d+$/.test(text)) return reject();\n return BigInt(text);\n case \"f\": {\n const value = Number(text);\n return Number.isFinite(value) ? value : reject();\n }\n case \"c\":\n return text;\n case \"t\": {\n const time = Number(text);\n if (!Number.isSafeInteger(time)) return reject();\n return new Date(time);\n }\n case \"o\":\n return text === \"1\" ? true : text === \"0\" ? false : reject();\n case \"y\": {\n const bytes = base64UrlToBytes(text);\n return bytes === null ? reject() : bytes;\n }\n default:\n return reject();\n }\n}\n\n// ─── Position comparison (the non-advancing guard) ────────────────\n\n/** `null` = these two values cannot be compared faithfully in JavaScript. */\nfunction compareScalar(a: unknown, b: unknown): -1 | 0 | 1 | null {\n const rank = (x: number | bigint, y: number | bigint): -1 | 0 | 1 => (x < y ? -1 : x > y ? 1 : 0);\n if (a instanceof Date && b instanceof Date) return rank(a.getTime(), b.getTime());\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return rank(a ? 1 : 0, b ? 1 : 0);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") return rank(a, b);\n if (typeof a === \"number\" && typeof b === \"number\") return rank(a, b);\n if (typeof a === \"bigint\" && typeof b === \"number\") return rank(a, BigInt(Math.trunc(b)));\n if (typeof a === \"number\" && typeof b === \"bigint\") return rank(BigInt(Math.trunc(a)), b);\n // Strings (and Decimal, which travels as a string) are ordered by the\n // DATABASE's collation, which JavaScript cannot reproduce; Bytes likewise.\n // Saying \"cannot tell\" is the only honest answer, and it keeps the guard\n // below from raising a false alarm on a perfectly good ICU ordering.\n return null;\n}\n\n/**\n * Is `row` strictly after `position` in this ordering? `null` means the\n * comparison is inconclusive in JavaScript (a collated string key), never\n * \"yes\".\n *\n * Used as a LIVENESS guard, not as a filter: the SQL bound does the real work,\n * and this only catches a traversal that fails to advance — which happens when\n * an ordering is not actually total, or when a cursor value was lossy (a\n * truncated sub-millisecond timestamp being the case this codebase can\n * demonstrate). Without it that situation is an infinite page loop.\n */\nexport function keysetRowIsAfter(params: {\n keys: readonly KeysetOrderKey[];\n row: readonly unknown[];\n position: readonly unknown[];\n}): boolean | null {\n const { keys, row, position } = params;\n for (let index = 0; index < keys.length; index++) {\n const key = keys[index] as KeysetOrderKey;\n const a = row[index];\n const b = position[index];\n const aNull = a === null || a === undefined;\n const bNull = b === null || b === undefined;\n if (aNull && bNull) continue;\n if (aNull || bNull) {\n const nullIsLater = key.nulls === \"last\";\n return aNull ? nullIsLater : !nullIsLater;\n }\n const order = compareScalar(a, b);\n if (order === null) return null;\n if (order === 0) continue;\n return key.direction === \"asc\" ? order > 0 : order < 0;\n }\n return false;\n}\n\n/** Read a row's ordering values in plan order. */\nexport function keysetRowValues(params: {\n plan: KeysetOrderPlan;\n row: Readonly<Record<string, unknown>>;\n}): readonly unknown[] {\n const { plan, row } = params;\n return plan.keys.map((key) => row[key.field.name] ?? null);\n}\n\n// ─── Token ────────────────────────────────────────────────────────\n\n/**\n * Mint a continuation token from a row that carries every ordering value.\n *\n * The row must contain each ordering field — a missing one is refused rather\n * than encoded as a null, because a silently null position paginates the wrong\n * sequence. Callers that project a subset (`select`) fetch the ordering\n * columns HIDDEN and strip them from the payload; see `keyset-iterator.ts`.\n */\nexport function encodeKeysetToken(params: {\n plan: KeysetOrderPlan;\n row: Readonly<Record<string, unknown>>;\n}): string {\n const { plan, row } = params;\n const values = plan.keys.map((key) => {\n if (!(key.field.name in row)) {\n throw keysetValidation({\n message: `keyset position cannot be minted: the row does not carry the ordering field \"${key.field.name}\"`,\n meta: { model: plan.model, field: key.field.name, reason: \"keyset-position-missing\" },\n });\n }\n const encoded = encodeValueFor({ key, value: row[key.field.name], model: plan.model });\n return encoded === null ? null : [key.tag, encoded];\n });\n const payload = JSON.stringify([KEYSET_TOKEN_VERSION, plan.signature, values]);\n return KEYSET_TOKEN_PREFIX + bytesToBase64Url(new TextEncoder().encode(payload));\n}\n\n/**\n * Read a token back into ordering values, validating version, model and the\n * effective order. A token minted under a different ordering (or for another\n * model, or by a future version) is refused with a precise, non-guessing\n * error — never used to paginate a sequence it does not describe.\n */\nexport function decodeKeysetToken(params: { plan: KeysetOrderPlan; token: string }): readonly unknown[] {\n const { plan, token } = params;\n const malformed = (detail: string): never => {\n throw keysetValidation({\n message: `keyset token is not readable: ${detail}`,\n meta: { model: plan.model, reason: \"keyset-token-malformed\" },\n });\n };\n if (typeof token !== \"string\" || token.length === 0) return malformed(\"expected a non-empty string\");\n const dot = token.indexOf(\".\");\n const prefix = dot < 0 ? \"\" : token.slice(0, dot + 1);\n if (prefix !== KEYSET_TOKEN_PREFIX) {\n if (/^vk\\d+\\.$/.test(prefix)) {\n throw keysetValidation({\n message: `keyset token was minted by token version ${prefix.slice(2, -1)}; this client reads version ${KEYSET_TOKEN_VERSION}`,\n meta: {\n model: plan.model,\n reason: \"keyset-token-version\",\n tokenVersion: Number(prefix.slice(2, -1)),\n supportedVersion: KEYSET_TOKEN_VERSION,\n },\n });\n }\n return malformed(`expected the \"${KEYSET_TOKEN_PREFIX}\" prefix`);\n }\n const bytes = base64UrlToBytes(token.slice(KEYSET_TOKEN_PREFIX.length));\n if (bytes === null) return malformed(\"the body is not base64url\");\n const parsed = ((): unknown => {\n try {\n return JSON.parse(new TextDecoder().decode(bytes));\n } catch {\n return undefined;\n }\n })();\n if (!Array.isArray(parsed) || parsed.length !== 3) return malformed(\"the body is not a keyset payload\");\n const [version, signature, values] = parsed as [unknown, unknown, unknown];\n if (version !== KEYSET_TOKEN_VERSION) {\n throw keysetValidation({\n message: `keyset token was minted by token version ${String(version)}; this client reads version ${KEYSET_TOKEN_VERSION}`,\n meta: {\n model: plan.model,\n reason: \"keyset-token-version\",\n tokenVersion: version,\n supportedVersion: KEYSET_TOKEN_VERSION,\n },\n });\n }\n if (typeof signature !== \"string\") return malformed(\"the order signature is missing\");\n if (signature !== plan.signature) {\n const sameModel = signature.split(\"|\")[0] === plan.model;\n throw keysetValidation({\n message: sameModel\n ? `keyset token was minted for the ordering \"${signature}\" but this query orders by \"${plan.signature}\" — a position is only valid against the order it came from`\n : `keyset token was minted for model \"${signature.split(\"|\")[0] ?? \"?\"}\" but this query reads \"${plan.model}\"`,\n meta: {\n model: plan.model,\n reason: sameModel ? \"keyset-token-order\" : \"keyset-token-model\",\n tokenSignature: signature,\n expectedSignature: plan.signature,\n },\n });\n }\n if (!Array.isArray(values) || values.length !== plan.keys.length) {\n return malformed(`expected ${plan.keys.length} ordering value(s)`);\n }\n return plan.keys.map((key, index) => {\n const entry = values[index];\n if (entry === null) {\n if (!key.field.isOptional) {\n return malformed(`a null position for the non-nullable column \"${key.field.name}\"`);\n }\n return null;\n }\n if (!Array.isArray(entry) || entry.length !== 2 || typeof entry[0] !== \"string\" || typeof entry[1] !== \"string\") {\n return malformed(`an unreadable value for \"${key.field.name}\"`);\n }\n return decodeValueFor({ key, tag: entry[0], text: entry[1], model: plan.model });\n });\n}\n",
12
+ "/**\n * Relation RESOLUTION: `select`/`include` args → a validated relation tree,\n * plus the structural link (FK fields, join table) each relation loads through.\n *\n * Pure structure — no SQL, no execution. The query builder consumes this to\n * gate strategies and augment projections at build time (the earliest knowable\n * moment); the relation loader consumes it to run and stitch.\n *\n * v1 semantics carried:\n * - `select: { rel: … }` and `include: { rel: … }` both load; `include` wins\n * when both name the same relation.\n * - `_count` uses the v1 shape: `include._count: true | { select: { rel: true } }`\n * (or under `select`) and counts LIST relations only. A count entry may also\n * be `{ where: … }` (EPIC 4): the filter is carried on the resolved node and\n * compiled by the loader through the ordinary where compiler.\n * - Implicit many-to-many resolves through the ONE shared join-table rule\n * (`implicitJoinTable` in @vibeorm/schema) — never re-derived here.\n */\n\nimport { VibeError, implicitJoinTable } from \"@vibeorm/schema\";\nimport type { RelationIR } from \"@vibeorm/schema\";\nimport { getModelMeta } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** How a relation is physically wired. */\nexport type RelationKind =\n /** Children hold the FK (`oneToMany`) — batch `WHERE fk IN (parents)`. */\n | \"toManyFk\"\n /** THIS model holds the FK (`manyToOne` / owning `oneToOne`). */\n | \"toOneOwner\"\n /** The other side holds the FK (non-owning `oneToOne`). */\n | \"toOneInverse\"\n /** Implicit join table (`manyToMany`). */\n | \"manyToMany\";\n\n/** The resolved physical link for one relation. */\nexport type RelationLink = {\n readonly kind: RelationKind;\n readonly relation: RelationIR;\n readonly target: ModelMeta;\n /**\n * ORDERED parent-side correlation fields — index `i` pairs with\n * `childKeys[i]`. A composite foreign key carries every column here; there is\n * deliberately no singular accessor, so no call site can truncate a tuple to\n * its first member.\n */\n readonly parentKeys: readonly FieldMeta[];\n /** ORDERED child-side correlation fields, positionally paired with {@link parentKeys}. */\n readonly childKeys: readonly FieldMeta[];\n /** Join-table wiring; `null` unless kind is `manyToMany`. */\n readonly join: {\n readonly tableName: string;\n readonly parentColumn: \"A\" | \"B\";\n readonly childColumn: \"A\" | \"B\";\n } | null;\n};\n\n/** Nested args for one relation to load, validated. */\nexport type RelationArgs = {\n readonly where: Record<string, unknown> | undefined;\n readonly orderBy: unknown;\n readonly take: number | undefined;\n readonly skip: number | undefined;\n /** Child scalar fields the CALLER asked for, or `null` for all scalars. */\n readonly select: readonly string[] | null;\n /** SQL projection: `select` plus stitching keys — what the child statement fetches. */\n readonly projected: readonly string[] | null;\n /** Fields in `projected` the caller did NOT ask for — deleted after stitching. */\n readonly strip: readonly string[];\n /** Computed fields to attach to loaded children, or `null` — resolved like the top level. */\n readonly computed: readonly string[] | null;\n /** Deeper relation levels under this one. */\n readonly nested: RelationSelection | null;\n};\n\nexport type RelationTreeNode = {\n /** Relation field name on the parent (`posts`). */\n readonly name: string;\n readonly link: RelationLink;\n readonly args: RelationArgs;\n};\n\n/**\n * One relation counted into `_count`, with the filter that narrows it.\n *\n * The link is resolved HERE, once, so no later consumer has to re-derive a\n * relation's ordered key tuples just to count through them.\n */\nexport type RelationCountNode = {\n /** List-relation field name on the parent (`posts`). */\n readonly name: string;\n /** Structural link the count correlates and groups on. */\n readonly link: RelationLink;\n /**\n * Validated `where` narrowing the counted children, or `undefined` for\n * \"count every child\". The loader compiles it with `compileWhere` — the same\n * centralized compiler and codecs an ordinary query where goes through.\n */\n readonly where: Record<string, unknown> | undefined;\n};\n\n/** Everything relation-shaped one query level asked for. */\nexport type RelationSelection = {\n readonly relations: readonly RelationTreeNode[];\n /** List relations to count into `_count`, each with its own filter. */\n readonly counts: readonly RelationCountNode[];\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n// ─── Link resolution ──────────────────────────────────────────────\n\nfunction relationKeyOf(relation: RelationIR): string | null {\n return relation.relationName ?? null;\n}\n\n/**\n * The counterpart of `relation` on the target model: symmetric name match\n * (both unnamed or same name) with self-exclusion — the ONE implicit-pairing\n * rule from LEARNINGS, matching the parser's.\n */\nfunction findReverseRelation(params: { relation: RelationIR; target: ModelMeta }): RelationIR | null {\n const { relation, target } = params;\n const key = relationKeyOf(relation);\n const candidates = target.relations.filter(\n (candidate) =>\n candidate.targetModel === relation.model &&\n relationKeyOf(candidate) === key &&\n // Self-exclusion: on a self-relation, a side must never match itself.\n (relation.model !== relation.targetModel || candidate.name !== relation.name),\n );\n return candidates[0] ?? null;\n}\n\n/**\n * The ORDERED fields one side of a relation correlates through. Order is the\n * schema's own `fields`/`references` order and is load-bearing: member `i` of\n * one side pairs with member `i` of the other, in every predicate this link\n * ever renders.\n */\nfunction keyFields(params: {\n model: ModelMeta;\n names: readonly string[] | undefined;\n relation: RelationIR;\n what: string;\n}): readonly FieldMeta[] {\n const { model, names, relation, what } = params;\n if (names === undefined || names.length === 0) {\n throw validationError({\n message: `relation \"${relation.name}\" on ${relation.model} has no ${what} — the schema cannot be loaded through`,\n meta: { model: relation.model, relation: relation.name },\n });\n }\n return names.map((name) => {\n const field = model.fieldByName.get(name);\n if (field === undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `relation \"${relation.name}\" on ${relation.model} names unknown ${what} field \"${name}\"`,\n meta: { model: relation.model, relation: relation.name },\n });\n }\n return field;\n });\n}\n\n/**\n * The ONE correlation pair of an arity-1 link, for the paths that are single-key\n * by construction (implicit many-to-many, whose join table has one column per\n * side). Refuses a composite link with a typed capability error BEFORE any\n * statement runs — never truncates.\n */\nexport function singleKeyPair(params: {\n link: RelationLink;\n what: string;\n}): { readonly parent: FieldMeta; readonly child: FieldMeta } {\n const { link, what } = params;\n if (link.parentKeys.length !== 1 || link.childKeys.length !== 1) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: `${what} on relation \"${link.relation.name}\" of ${link.relation.model} needs a single-column relation key — this relation links ${link.parentKeys.length} columns; use an explicit junction model`,\n meta: { model: link.relation.model, relation: link.relation.name, arity: link.parentKeys.length },\n });\n }\n return { parent: link.parentKeys[0] as FieldMeta, child: link.childKeys[0] as FieldMeta };\n}\n\nfunction singlePrimaryKey(params: { model: ModelMeta; relation: RelationIR }): FieldMeta {\n const { model, relation } = params;\n const pk = model.primaryKey;\n if (pk.length !== 1) {\n throw validationError({\n message: `implicit many-to-many relation \"${relation.name}\" needs a single-column primary key on ${model.name}`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n return pk[0] as FieldMeta;\n}\n\n/**\n * Link cache: resolution is pure per (meta, relation) — the same RelationIR\n * always resolves against the same RuntimeMeta to the same wiring — and it\n * sits on every relation-load and nested-write path. Keyed on meta first so\n * two clients over the same SchemaIR never share ModelMeta instances.\n */\nconst linkCache = new WeakMap<RuntimeMeta, WeakMap<RelationIR, RelationLink>>();\n\n/** Resolve how one relation is physically wired. */\nexport function resolveRelationLink(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n}): RelationLink {\n const { meta, relation } = params;\n let perMeta = linkCache.get(meta);\n if (perMeta === undefined) {\n perMeta = new WeakMap();\n linkCache.set(meta, perMeta);\n }\n const cached = perMeta.get(relation);\n if (cached !== undefined) return cached;\n const link = resolveRelationLinkUncached(params);\n perMeta.set(relation, link);\n return link;\n}\n\nfunction resolveRelationLinkUncached(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n}): RelationLink {\n const { meta, model, relation } = params;\n const target = getModelMeta({ meta, model: relation.targetModel });\n\n if (relation.type === \"manyToMany\") {\n // An implicit SELF many-to-many has no orientation to resolve:\n // `implicitJoinTable` assigns column \"A\" by sorting the two MODEL names,\n // which are the same string here, so both relation fields would claim \"A\"\n // and read the join table in the same direction.\n //\n // Schema validation refuses this shape first (`implicit-self-many-to-many`),\n // so a generated client, `db push` and every migration stop well before\n // this line: in the ordinary flow it is unreachable. A DYNAMIC client can\n // still be constructed straight from an IR that never passed validation,\n // and this is that backstop. It refuses instead of guessing a direction.\n if (relation.model === relation.targetModel) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message:\n `relation \"${relation.name}\" on ${relation.model} is an implicit self many-to-many: both sides own the ` +\n `same join-table column, so this field and its inverse would read the same rows. Model each direction ` +\n `with an explicit junction model.`,\n meta: { model: relation.model, relation: relation.name, targetModel: relation.targetModel },\n });\n }\n const join = implicitJoinTable({\n modelA: relation.model,\n modelB: relation.targetModel,\n ...(relation.relationName === undefined ? {} : { relationName: relation.relationName }),\n });\n // Two DISTINCT model names, so the sort is meaningful: the side whose\n // name sorts first owns column \"A\" and its inverse owns \"B\". The self case\n // (where the sort decides nothing) was refused above.\n const parentIsA = model.name === join.modelA;\n return {\n kind: \"manyToMany\",\n relation,\n target,\n // plan.md keeps implicit many-to-many single-key in this EPIC: this\n // refusal fires during link resolution, before any statement runs.\n parentKeys: [singlePrimaryKey({ model, relation })],\n childKeys: [singlePrimaryKey({ model: target, relation })],\n join: {\n tableName: join.tableName,\n parentColumn: parentIsA ? \"A\" : \"B\",\n childColumn: parentIsA ? \"B\" : \"A\",\n },\n };\n }\n\n if (relation.fields !== undefined && relation.fields.length > 0) {\n // This side holds the FK — a to-one owner.\n return {\n kind: \"toOneOwner\",\n relation,\n target,\n ...pairedKeys({\n model,\n target,\n relation,\n parentNames: relation.fields,\n childNames: relation.references,\n }),\n join: null,\n };\n }\n\n // FK lives on the other side: find the counterpart carrying it.\n const reverse = findReverseRelation({ relation, target });\n if (reverse === null || reverse.fields === undefined || reverse.fields.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `relation \"${relation.name}\" on ${relation.model} has no foreign-key counterpart on ${relation.targetModel}`,\n meta: { model: relation.model, relation: relation.name, target: relation.targetModel },\n });\n }\n return {\n kind: relation.isList ? \"toManyFk\" : \"toOneInverse\",\n relation,\n target,\n ...pairedKeys({\n model,\n target,\n relation: reverse,\n parentNames: reverse.references,\n childNames: reverse.fields,\n }),\n join: null,\n };\n}\n\n/**\n * Resolve both sides of an explicit foreign key and check they pair up. A\n * mismatched arity is a schema defect the loader must never paper over: a\n * shorter side would silently drop a member from every predicate.\n */\nfunction pairedKeys(params: {\n model: ModelMeta;\n target: ModelMeta;\n relation: RelationIR;\n parentNames: readonly string[] | undefined;\n childNames: readonly string[] | undefined;\n}): { readonly parentKeys: readonly FieldMeta[]; readonly childKeys: readonly FieldMeta[] } {\n const { model, target, relation, parentNames, childNames } = params;\n const parentKeys = keyFields({ model, names: parentNames, relation, what: \"fields\" });\n const childKeys = keyFields({ model: target, names: childNames, relation, what: \"references\" });\n if (parentKeys.length !== childKeys.length) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `relation \"${relation.name}\" on ${relation.model} links ${parentKeys.length} field(s) to ${childKeys.length} reference(s) — a foreign key must pair every column`,\n meta: { model: relation.model, relation: relation.name },\n });\n }\n return { parentKeys, childKeys };\n}\n\n// ─── Selection resolution ─────────────────────────────────────────\n\nconst TO_MANY_ARG_KEYS: readonly string[] = [\"where\", \"orderBy\", \"take\", \"skip\", \"select\", \"include\", \"omit\"];\nconst TO_ONE_ARG_KEYS: readonly string[] = [\"where\", \"select\", \"include\", \"omit\"];\n\nfunction toNonNegativeInteger(params: { value: unknown; what: string; relation: string }): number {\n const { value, what, relation } = params;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n throw validationError({\n message: `${what} on relation \"${relation}\" must be a non-negative integer`,\n meta: { relation, argument: what, value },\n });\n }\n return value;\n}\n\n/**\n * Child scalar projection for a nested `select`: relation keys and `_count`\n * are handled by the recursion, everything else must be a scalar `true`.\n */\nfunction compileChildSelect(params: { model: ModelMeta; select: Record<string, unknown> }): string[] {\n const { model, select } = params;\n const names: string[] = [];\n for (const [name, value] of Object.entries(select)) {\n if (value === undefined || value === false) continue;\n if (name === \"_count\" || model.relationByName.has(name)) continue;\n if (model.computed !== null && model.computed.has(name)) {\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n continue;\n }\n const field = model.fieldByName.get(name);\n if (field === undefined) {\n throw validationError({\n message: `unknown field \"${name}\" on model \"${model.name}\" in select`,\n meta: { model: model.name, field: name },\n });\n }\n if (value !== true) {\n throw validationError({\n message: `select.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, field: name },\n });\n }\n names.push(field.name);\n }\n return names;\n}\n\n/**\n * Child scalar projection for a nested `omit`: every scalar EXCEPT the named\n * ones, in model field order — the same rule the top-level `omit` follows\n * (v1 semantics). Mutually exclusive with the relation's `select`.\n */\nfunction compileChildOmit(params: { model: ModelMeta; omit: unknown; relation: string }): string[] {\n const { model, omit, relation } = params;\n if (!isPlainObject(omit)) {\n throw validationError({\n message: `omit on relation \"${relation}\" must be an object`,\n meta: { model: model.name, relation },\n });\n }\n const omitted = new Set<string>();\n for (const [name, value] of Object.entries(omit)) {\n if (value === undefined || value === false) continue;\n if (value !== true) {\n throw validationError({\n message: `omit.${name} must be true or false on model \"${model.name}\"`,\n meta: { model: model.name, relation, field: name },\n });\n }\n if (model.relationByName.has(name)) {\n throw validationError({\n message: `omit.${name} on model \"${model.name}\" — omit takes scalar fields; a relation is excluded by not including it`,\n meta: { model: model.name, relation, field: name },\n });\n }\n if (model.computed !== null && model.computed.has(name)) continue;\n if (!model.fieldByName.has(name)) {\n throw validationError({\n message: `unknown field \"${name}\" on model \"${model.name}\" in omit`,\n meta: { model: model.name, relation, field: name },\n });\n }\n omitted.add(name);\n }\n const kept = model.fields.filter((field) => !omitted.has(field.name)).map((field) => field.name);\n if (kept.length === 0) {\n throw validationError({\n message: `omit on relation \"${relation}\" removes every field of model \"${model.name}\"`,\n meta: { model: model.name, relation },\n });\n }\n return kept;\n}\n\n/**\n * The parent-side fields a selection needs for stitching: each relation's\n * `parentKey`, and each counted relation's `parentKey`.\n */\nexport function requiredParentFields(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n selection: RelationSelection;\n}): string[] {\n const { meta, model, selection } = params;\n const needed = new Set<string>();\n for (const node of selection.relations) {\n for (const field of node.link.parentKeys) needed.add(field.name);\n }\n for (const node of selection.counts) {\n for (const field of node.link.parentKeys) needed.add(field.name);\n }\n return [...needed];\n}\n\n/** Argument keys a single `_count.select.<relation>` entry may carry. */\nconst COUNT_ENTRY_KEYS: readonly string[] = [\"where\"];\n\n/**\n * Resolve one count entry: the relation must be a LIST relation, and the entry\n * is either a boolean or `{ where }`.\n */\nfunction resolveCountNode(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n name: string;\n where: Record<string, unknown> | undefined;\n}): RelationCountNode {\n const { meta, model, name, where } = params;\n const relation = model.relationByName.get(name);\n if (relation === undefined || !relation.isList) {\n throw validationError({\n message: `_count.select.${name} on model \"${model.name}\" must name a list relation`,\n meta: { model: model.name, relation: name },\n });\n }\n const link = resolveRelationLink({ meta, model, relation });\n // Fail CLOSED on @@policy: the policy layer rewrites args before the builder\n // sees them and cannot merge its predicate into a count filter yet, so a\n // filtered count of a policied model would report rows the policy hides.\n // Boolean counts keep their existing behaviour (policy.ts refuses those).\n if (where !== undefined && link.target.policy !== undefined) {\n throw validationError({\n message: `_count of ${model.name}.${name} cannot take a filter because ${link.target.name} declares @@policy — a filtered count would not apply the policy predicate; count the relation with a scoped child query instead`,\n meta: { model: model.name, relation: name },\n });\n }\n return { name, link, ...(where === undefined ? { where: undefined } : { where }) };\n}\n\nfunction resolveCounts(params: { meta: RuntimeMeta; model: ModelMeta; spec: unknown }): RelationCountNode[] {\n const { meta, model, spec } = params;\n if (spec === true) {\n return model.relations\n .filter((relation) => relation.isList)\n .map((relation) => resolveCountNode({ meta, model, name: relation.name, where: undefined }));\n }\n if (!isPlainObject(spec) || !isPlainObject(spec.select)) {\n throw validationError({\n message: `_count on model \"${model.name}\" must be true or { select: { relation: true } }`,\n meta: { model: model.name },\n });\n }\n const nodes: RelationCountNode[] = [];\n for (const [name, value] of Object.entries(spec.select)) {\n if (value === undefined || value === false) continue;\n if (value === true) {\n nodes.push(resolveCountNode({ meta, model, name, where: undefined }));\n continue;\n }\n if (!isPlainObject(value)) {\n throw validationError({\n message: `_count.select.${name} on model \"${model.name}\" must be true, false, or { where: … }`,\n meta: { model: model.name, relation: name },\n });\n }\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) continue;\n if (!COUNT_ENTRY_KEYS.includes(key)) {\n throw validationError({\n message: `_count.select.${name} on model \"${model.name}\" takes only \"where\" — got \"${key}\"`,\n meta: { model: model.name, relation: name, argument: key },\n });\n }\n }\n const where = value.where;\n if (where !== undefined && !isPlainObject(where)) {\n throw validationError({\n message: `_count.select.${name}.where on model \"${model.name}\" must be an object`,\n meta: { model: model.name, relation: name },\n });\n }\n nodes.push({\n ...resolveCountNode({ meta, model, name, where: where as Record<string, unknown> | undefined }),\n });\n }\n return nodes;\n}\n\nfunction resolveNode(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n relation: RelationIR;\n spec: unknown;\n}): RelationTreeNode {\n const { meta, model, relation, spec } = params;\n const link = resolveRelationLink({ meta, model, relation });\n const raw: Record<string, unknown> = spec === true ? {} : (spec as Record<string, unknown>);\n\n const allowed = relation.isList ? TO_MANY_ARG_KEYS : TO_ONE_ARG_KEYS;\n for (const key of Object.keys(raw)) {\n if (raw[key] === undefined) continue;\n if (!allowed.includes(key)) {\n throw validationError({\n message: `unsupported argument \"${key}\" on relation \"${relation.name}\" — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, relation: relation.name, argument: key },\n });\n }\n }\n if (raw.select !== undefined && raw.include !== undefined) {\n throw validationError({\n message: `relation \"${relation.name}\" cannot use select and include together`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n if (raw.select !== undefined && raw.omit !== undefined) {\n throw validationError({\n message: `relation \"${relation.name}\" cannot use select and omit together — select names fields to keep, omit fields to drop`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n\n const where =\n raw.where === undefined\n ? undefined\n : (() => {\n if (!isPlainObject(raw.where)) {\n throw validationError({\n message: `where on relation \"${relation.name}\" must be an object`,\n meta: { model: model.name, relation: relation.name },\n });\n }\n return raw.where;\n })();\n\n const take =\n raw.take === undefined ? undefined : toNonNegativeInteger({ value: raw.take, what: \"take\", relation: relation.name });\n const skip =\n raw.skip === undefined ? undefined : toNonNegativeInteger({ value: raw.skip, what: \"skip\", relation: relation.name });\n\n // Deeper levels ride the child's own select/include.\n const nested = resolveRelationSelection({\n meta,\n model: link.target,\n select: raw.select,\n include: raw.include,\n });\n\n const select =\n raw.select !== undefined\n ? compileChildSelect({ model: link.target, select: raw.select as Record<string, unknown> })\n : raw.omit !== undefined\n ? compileChildOmit({ model: link.target, omit: raw.omit, relation: relation.name })\n : null;\n\n // Computed fields on the child — resolved with the same select/omit rules\n // as the top level (the codec lesson: children are materialization points).\n const targetComputed = link.target.computed;\n let computed: readonly string[] | null = null;\n if (targetComputed !== null) {\n if (raw.select !== undefined) {\n const names = Object.entries(raw.select as Record<string, unknown>)\n .filter(([name, value]) => targetComputed.has(name) && value === true)\n .map(([name]) => name);\n computed = names.length === 0 ? null : names;\n } else if (raw.omit !== undefined) {\n const names = [...targetComputed.keys()].filter(\n (name) => (raw.omit as Record<string, unknown>)[name] !== true,\n );\n computed = names.length === 0 ? null : names;\n } else {\n computed = [...targetComputed.keys()];\n }\n }\n\n // The child statement must fetch the stitching key plus whatever deeper\n // levels stitch through, plus computed `needs`; anything the caller did not\n // select is stripped after loading (the v1 auto-added-PK rule, structurally).\n let projected: readonly string[] | null = null;\n const strip: string[] = [];\n if (select !== null) {\n const fetch = [...select];\n // EVERY member of the child key is a stitching column, not just the first.\n const additions = new Set<string>(link.childKeys.map((field) => field.name));\n if (nested !== null) {\n for (const name of requiredParentFields({ meta, model: link.target, selection: nested })) {\n additions.add(name);\n }\n }\n if (computed !== null && targetComputed !== null) {\n for (const name of computed) {\n for (const need of targetComputed.get(name)?.needs ?? []) {\n additions.add(need);\n }\n }\n }\n for (const name of additions) {\n if (!fetch.includes(name)) {\n fetch.push(name);\n strip.push(name);\n }\n }\n projected = fetch;\n }\n\n return {\n name: relation.name,\n link,\n args: { where, orderBy: raw.orderBy, take, skip, select, projected, strip, computed, nested },\n };\n}\n\n/**\n * Resolve everything relation-shaped in one level's `select`/`include`.\n * Returns `null` when neither names a relation or `_count`.\n *\n * Scalar keys in `select` are ignored here (the query builder projects them);\n * every key in `include` must be a relation or `_count` — anything else is a\n * loud validation error.\n */\nexport function resolveRelationSelection(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n select: unknown;\n include: unknown;\n}): RelationSelection | null {\n const { meta, model, select, include } = params;\n\n const selectSpec = isPlainObject(select) ? select : null;\n const includeSpec = isPlainObject(include) ? include : null;\n\n if (includeSpec !== null) {\n for (const [key, value] of Object.entries(includeSpec)) {\n if (value === undefined || value === false) continue;\n if (key === \"_count\") continue;\n if (!model.relationByName.has(key)) {\n const isScalar = model.fieldByName.has(key);\n throw validationError({\n message: isScalar\n ? `\"${key}\" on model \"${model.name}\" is a scalar field — include takes relations, use select for scalars`\n : `unknown relation \"${key}\" on model \"${model.name}\" in include`,\n meta: { model: model.name, relation: key },\n });\n }\n if (value !== true && !isPlainObject(value)) {\n throw validationError({\n message: `include.${key} on model \"${model.name}\" must be true or an object`,\n meta: { model: model.name, relation: key },\n });\n }\n }\n }\n\n const specs = new Map<string, unknown>();\n if (selectSpec !== null) {\n for (const relation of model.relations) {\n const value = selectSpec[relation.name];\n if (value === true || isPlainObject(value)) specs.set(relation.name, value);\n }\n }\n // include wins when both name the same relation (v1 precedence).\n if (includeSpec !== null) {\n for (const relation of model.relations) {\n const value = includeSpec[relation.name];\n if (value === true || isPlainObject(value)) specs.set(relation.name, value);\n }\n }\n\n const countSpec = includeSpec?._count ?? selectSpec?._count;\n const counts: readonly RelationCountNode[] =\n countSpec === undefined || countSpec === false ? [] : resolveCounts({ meta, model, spec: countSpec });\n\n if (specs.size === 0 && counts.length === 0) return null;\n\n const relations = [...specs.entries()].map(([name, spec]) =>\n resolveNode({ meta, model, relation: model.relationByName.get(name) as RelationIR, spec }),\n );\n\n return { relations, counts };\n}\n",
13
+ "/**\n * SQL preview: what an operation WOULD send, without sending it (EPIC 5).\n *\n * Preview takes an explicit `{ schema, model, method, args }` input and runs\n * the pure planning path (`buildQuery` → `renderStatement`). It never touches a\n * delegate, so there is no lazy query promise to start, and it needs no\n * database, no adapter and no connection.\n *\n * What it refuses to do: invent a parameter it does not have, or present one\n * statement as the whole operation. A flow whose later statements depend on\n * rows that do not exist yet is REPORTED as such, with the statements that are\n * knowable shown in full and the rest named as a limitation.\n */\n\nimport { getSqlDialect, renderStatement } from \"@vibeorm/sql\";\nimport type { Dialect, SchemaIR } from \"@vibeorm/schema\";\nimport { buildQuery } from \"../query-builder.ts\";\nimport type { BuilderClientOptions, QueryMethod, QueryPlan, RelationStrategy } from \"../query-builder.ts\";\nimport { buildRuntimeMeta, getModelMeta } from \"../model-meta.ts\";\nimport type { ModelMeta } from \"../model-meta.ts\";\nimport { hasNestedWrites } from \"../nested-writes.ts\";\nimport { queryFingerprint } from \"../telemetry/fingerprint.ts\";\nimport type { OperationPreview, PreviewLimitation, PreviewStatement } from \"./types.ts\";\n\n/** Fingerprint length bound, matching EPIC 1's default label budget. */\nconst FINGERPRINT_MAX_LENGTH: number = 512;\n\n/**\n * A redacted description of one parameter: its transport shape, never its\n * value. `previewOperation({ includeParameterValues: true })` opts out.\n */\nexport function parameterTypeTag(params: { value: unknown }): string {\n const { value } = params;\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return \"date\";\n if (value instanceof Uint8Array) return \"bytes\";\n if (Array.isArray(value)) return \"array\";\n const type = typeof value;\n return type === \"object\" ? \"object\" : type;\n}\n\nfunction describeParameters(params: { values: readonly unknown[]; includeValues: boolean }): readonly string[] {\n const { values, includeValues } = params;\n return values.map((value) =>\n includeValues ? (typeof value === \"string\" ? value : String(value)) : parameterTypeTag({ value }),\n );\n}\n\nfunction statementOf(params: {\n index: number;\n role: \"primary\" | \"batch\";\n plan: QueryPlan;\n dialect: ReturnType<typeof getSqlDialect>;\n statement: QueryPlan[\"statement\"];\n model: string;\n method: QueryMethod;\n includeValues: boolean;\n}): PreviewStatement {\n const { index, role, dialect, statement, model, method, includeValues } = params;\n const rendered = renderStatement({ dialect, statement });\n return {\n index,\n role,\n kind: statement.kind,\n sql: rendered.text,\n parameterCount: rendered.values.length,\n parameters: describeParameters({ values: rendered.values, includeValues }),\n fingerprint: queryFingerprint({ model, method, text: rendered.text, maxLength: FINGERPRINT_MAX_LENGTH }),\n };\n}\n\n/** The scalar half of a nested write — what the PARENT statement is built from. */\nfunction withoutRelations(params: { model: ModelMeta; data: unknown }): unknown {\n const { model, data } = params;\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return data;\n const scalars: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (model.relationByName.has(key)) continue;\n scalars[key] = value;\n }\n return scalars;\n}\n\n/**\n * Describe the SQL of one operation without executing anything.\n *\n * @example\n * previewOperation({ schema, dialect: \"postgres\", model: \"User\", method: \"findMany\",\n * args: { where: { email: \"a@b.test\" } } });\n * // → one SELECT with `$1`, parameters reported as [\"string\"]\n */\nexport function previewOperation(params: {\n schema: SchemaIR;\n dialect: Dialect;\n model: string;\n method: QueryMethod;\n args?: Record<string, unknown>;\n relationStrategy?: RelationStrategy;\n clientOptions?: BuilderClientOptions;\n /** Show real parameter values. OFF by default: a preview is not public telemetry. */\n includeParameterValues?: boolean;\n}): OperationPreview {\n const { schema, model, method, args, relationStrategy, clientOptions } = params;\n const includeValues = params.includeParameterValues === true;\n const dialect = getSqlDialect({ dialect: params.dialect });\n const meta = buildRuntimeMeta({ schema });\n const modelMeta = getModelMeta({ meta, model });\n\n // A nested write is a STATEMENT SEQUENCE the client runs in one transaction.\n // The parent statement is built from the scalar half exactly as the client\n // builds it; the nested half is reported as a limitation, never guessed at.\n const writesNested =\n (method === \"create\" || method === \"update\" || method === \"upsert\") &&\n (hasNestedWrites({ model: modelMeta, data: args?.data }) ||\n hasNestedWrites({ model: modelMeta, data: args?.create }) ||\n hasNestedWrites({ model: modelMeta, data: args?.update }));\n const effectiveArgs =\n args === undefined || !writesNested\n ? args\n : {\n ...args,\n ...(args.data === undefined ? {} : { data: withoutRelations({ model: modelMeta, data: args.data }) }),\n ...(args.create === undefined ? {} : { create: withoutRelations({ model: modelMeta, data: args.create }) }),\n ...(args.update === undefined ? {} : { update: withoutRelations({ model: modelMeta, data: args.update }) }),\n };\n\n const build = (): QueryPlan =>\n buildQuery({\n meta,\n dialect,\n model,\n method,\n ...(effectiveArgs === undefined ? {} : { args: effectiveArgs }),\n ...(relationStrategy === undefined ? {} : { defaultRelationStrategy: relationStrategy }),\n ...(clientOptions === undefined ? {} : { clientOptions }),\n });\n\n let plan: QueryPlan | null = null;\n if (writesNested) {\n // The parent of a nested write can be unbuildable on its own — a required\n // foreign key may only exist once a `connect`/`create` has resolved. That\n // is reported as \"not knowable\", never as an invented statement.\n try {\n plan = build();\n } catch {\n plan = null;\n }\n } else {\n plan = build();\n }\n\n const batch = plan?.batch ?? [];\n const statements: PreviewStatement[] =\n plan === null\n ? []\n : [statementOf({ index: 0, role: \"primary\", plan, dialect, statement: plan.statement, model, method, includeValues })];\n // A batch's first entry IS `plan.statement` (the client runs the batch in one\n // transaction), so the siblings start at index 1.\n for (let index = 1; index < batch.length && plan !== null; index++) {\n statements.push(\n statementOf({ index, role: \"batch\", plan, dialect, statement: batch[index]!, model, method, includeValues }),\n );\n }\n\n const limitations: PreviewLimitation[] = [];\n const relationNames: string[] = [];\n\n if (plan !== null && plan.relations !== null && plan.relationStrategy === \"query\") {\n for (const node of plan.relations.relations) relationNames.push(node.name);\n for (const count of plan.relations.counts) relationNames.push(`_count.${count.name}`);\n limitations.push({\n code: \"relation-statements-data-dependent\",\n message:\n `${relationNames.join(\", \")} load with their own follow-up statements after this one returns: ` +\n \"how many run, and which keys they bind, is decided by the rows this statement fetches. \" +\n 'Use the \"join\" relation strategy on postgres to see one fully-knowable statement instead.',\n });\n }\n\n if (writesNested) {\n limitations.push({\n code: \"nested-writes-data-dependent\",\n message:\n \"this write has nested relation writes: the client runs a statement sequence in one transaction, \" +\n \"and the later statements bind keys that only exist once the earlier ones have returned. \" +\n (plan === null\n ? \"The parent statement itself is not knowable without those results, so none is shown.\"\n : \"The statement shown is the parent write alone.\"),\n });\n }\n\n if (method === \"upsert\") {\n limitations.push({\n code: \"upsert-fallback-flow\",\n message:\n \"upsert may run as a native conflict statement or as a find-then-write flow inside a transaction; \" +\n \"which one the client picks depends on the shape of the arguments and the dialect's capabilities.\",\n });\n }\n\n if (batch.length > 1) {\n limitations.push({\n code: \"batched-statements\",\n message: `this operation runs ${batch.length} statements in one transaction (column-set groups or parameter-budget chunks); all of them are shown.`,\n });\n }\n\n if (plan !== null && (plan.resortBy !== null || plan.reverseRows)) {\n limitations.push({\n code: \"client-side-post-processing\",\n message: \"rows are re-ordered in the client after this statement returns, so the SQL order is not the result order.\",\n });\n }\n\n const complete = !writesNested && method !== \"upsert\" && relationNames.length === 0;\n\n return {\n model,\n method,\n dialect: params.dialect,\n statements,\n complete,\n limitations,\n relationStrategy: plan === null || plan.relations === null ? null : plan.relationStrategy,\n relationsLoadedSeparately: relationNames,\n };\n}\n",
14
+ "import { VibeError } from \"@vibeorm/schema\";\n\n/** Compare decoded relation keys by value, including DateTime milliseconds and binary bytes. */\nexport function relationValueKey(params: { value: unknown }): unknown {\n const { value } = params;\n if (value === null || value === undefined) return value;\n switch (typeof value) {\n case \"string\":\n return `s:${value}`;\n case \"number\":\n case \"bigint\":\n return `n:${value.toString()}`;\n case \"boolean\":\n return `t:${value ? 1 : 0}`;\n default:\n break;\n }\n if (value instanceof Date) return `d:${value.getTime()}`;\n if (value instanceof Uint8Array) {\n let hex = \"b:\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n }\n return `o:${String(value)}`;\n}\n\n/**\n * A collision-safe Map key for an ORDERED key tuple, or `null` when the tuple\n * is INCOMPLETE (any member null/undefined) — an incomplete foreign key must\n * never attach a parent, so it gets no key at all rather than a key that could\n * collide with another incomplete tuple.\n *\n * The encoding is `JSON.stringify` over the per-member {@link relationValueKey}\n * tags, NOT a separator join: JSON string escaping is injective, so a member\n * containing the separator of a naive `a + \"\\u0000\" + b` scheme (or `\",\"`, or\n * `\"|\"`) cannot forge another tuple's key.\n *\n * A member whose equality cannot be implemented faithfully — any object that is\n * neither `Date` nor `Uint8Array`, where `String(value)` would be a lossy stand-in\n * — is refused rather than silently mis-grouped.\n */\nexport function relationTupleKey(params: { values: readonly unknown[] }): string | null {\n const { values } = params;\n const tags: string[] = [];\n for (const value of values) {\n if (value === null || value === undefined) return null;\n if (typeof value === \"object\" && !(value instanceof Date) && !(value instanceof Uint8Array)) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message:\n \"a relation key of this type cannot be compared faithfully in memory — relation links support String, Int, BigInt, Boolean, DateTime and Bytes keys\",\n meta: { received: Object.prototype.toString.call(value) },\n });\n }\n tags.push(String(relationValueKey({ value })));\n }\n return JSON.stringify(tags);\n}\n",
15
+ "import type { VibeError } from \"@vibeorm/schema\";\n\n// Internal metadata travels through object spreads, never through Object.entries\n// or SQL parameters. Rewriters attach it before relation resolution; the nested\n// executor checks the actual FK assignment inside the write's transaction.\nconst WRITE_SCOPE: unique symbol = Symbol(\"vibeorm.writeScope\");\n\ntype ScopedData = Record<string, unknown> & {\n readonly [WRITE_SCOPE]?: { readonly field: string; readonly value: unknown; readonly error: VibeError };\n};\n\n/** Carry a protected field's required value through nested-write rewriting. */\nexport function protectWriteScope(params: {\n data: Record<string, unknown>;\n field: string;\n value: unknown;\n error: VibeError;\n}): Record<string, unknown> {\n const { data, field, value, error } = params;\n return { ...data, [WRITE_SCOPE]: { field, value, error } };\n}\n\n/** Refuse a relation-derived assignment before it can overwrite a protected field. */\nexport function assertWriteScope(params: {\n data: Record<string, unknown>;\n assignments: Record<string, unknown>;\n}): void {\n const guard = (params.data as ScopedData)[WRITE_SCOPE];\n if (guard === undefined || !(guard.field in params.assignments)) return;\n if (params.assignments[guard.field] !== guard.value) throw guard.error;\n}\n",
16
+ "import { relationTupleKey } from \"./relation-key.ts\";\nimport { assertWriteScope } from \"./write-scope.ts\";\n/**\n * Nested writes (Prisma-shaped, v1 parity plus implicit-M2M support):\n *\n * create data: relation: { create | connect | connectOrCreate }\n * update data: … plus { update | updateMany | upsert | set | disconnect |\n * delete | deleteMany }\n *\n * STATEMENT ORDER (deterministic, pinned by unit tests):\n * create: [owner-side to-one resolutions: SELECT/INSERT per verb] →\n * parent INSERT → [list/M2M ops in data-key order, item order;\n * each M2M child op is followed immediately by its join-row INSERT].\n * PLAIN multi-item FK-side `create` lists collapse into ONE\n * multi-row INSERT (v1 parity — one fewer round-trip per item) when\n * no item carries nested ops of its own and all items write the\n * same columns (so no NULL-vs-database-default drift can appear).\n * update: parent pre-SELECT (findUnique) → [owner-side to-one resolutions]\n * → parent UPDATE (scalars + FK changes, skipped when empty) →\n * [deferred owner-side child DELETEs] → [list/M2M ops in data-key\n * order] — the returned row is the UPDATE's result (or the\n * pre-SELECT when nothing on the parent changed).\n *\n * TRANSACTIONS: any nested write that produces more than one statement wraps\n * in `adapter.transaction` automatically; inside an outer `$transaction` that\n * nests as a savepoint (the adapter contract). A mid-write failure therefore\n * rolls the whole write back.\n *\n * Implicit M2M goes through the ONE shared join-table rule (`implicitJoinTable`\n * via relation-plan's link resolution); `connect` writes join rows with\n * conflict-skip, so re-connecting an existing pair is a no-op.\n *\n * Unknown verbs are loud: VIBE_VALIDATION naming the verb (v1 silently\n * ignored them — that was a bug class, not a feature).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect, SqlStatement } from \"@vibeorm/sql\";\nimport { encodeValue } from \"./codecs.ts\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport type { QueryMethod } from \"./query-builder.ts\";\nimport { resolveRelationLink, singleKeyPair } from \"./relation-plan.ts\";\nimport type { RelationLink } from \"./relation-plan.ts\";\n\n// ─── Relation key tuples ───────────────────────────────────\n\n/**\n * A relation link is an ORDERED tuple of column pairs. Every nested write goes\n * through these five helpers instead of a single foreign-key name, so a\n * composite key (`(tenantId, customerId)` → `(tenantId, id)`) can never be\n * written, matched or detached one member at a time.\n */\n\n/** The parent row's ordered values for the parent side of the link. */\nfunction parentTupleOf(params: { link: RelationLink; row: ClientRowLike }): unknown[] {\n const { link, row } = params;\n return link.parentKeys.map((field) => row[field.name]);\n}\n\n/** The child row's ordered values for the child side of the link. */\nfunction childTupleOf(params: { link: RelationLink; row: ClientRowLike }): unknown[] {\n const { link, row } = params;\n return link.childKeys.map((field) => row[field.name]);\n}\n\n/** `{ tenantId: …, customerId: … }` — every CHILD-side key column, from a parent tuple. */\nfunction childAssignment(params: { link: RelationLink; values: readonly unknown[] }): Record<string, unknown> {\n const { link, values } = params;\n const out: Record<string, unknown> = {};\n link.childKeys.forEach((field, index) => {\n out[field.name] = values[index];\n });\n return out;\n}\n\n/** `{ tenantId: …, customerId: … }` — every PARENT-side key column (the owning side's FK). */\nfunction parentAssignment(params: { link: RelationLink; values: readonly unknown[] }): Record<string, unknown> {\n const { link, values } = params;\n const out: Record<string, unknown> = {};\n link.parentKeys.forEach((field, index) => {\n out[field.name] = values[index];\n });\n return out;\n}\n\n/** `{ tenantId: true, id: true }` — project the child-side key columns. */\nfunction childKeySelect(params: { link: RelationLink }): Record<string, true> {\n const { link } = params;\n const out: Record<string, true> = {};\n for (const field of link.childKeys) out[field.name] = true;\n return out;\n}\n\n/**\n * Detaching sets the OPTIONAL members of a key to null — that already makes the\n * tuple incomplete, so the relation is gone, while a required member (a tenant\n * discriminator, typically) keeps its NOT NULL value. A key with no optional\n * member cannot be detached at all.\n */\nfunction detachAssignment(params: {\n fields: readonly RelationLink[\"childKeys\"][number][];\n op: NestedOp;\n verb: string;\n target: string;\n}): Record<string, unknown> {\n const { fields, op, verb, target } = params;\n const optional = fields.filter((field) => field.isOptional);\n if (optional.length === 0) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} needs an optional foreign key on ${target}.${fields.map((field) => field.name).join(\", \")} — a required relation cannot be detached`,\n meta: { relation: op.name, verb },\n });\n }\n const out: Record<string, unknown> = {};\n for (const field of optional) out[field.name] = null;\n return out;\n}\n\n// ─── Runner contract (implemented by the client) ──────────────────\n\nexport type ClientRowLike = Record<string, unknown>;\n\n/**\n * Executes ORM statements against ONE adapter (plain or transactional).\n * `single` runs a single-row mutation with the client's full RETURNING /\n * re-select machinery (mysql-safe); `statement` runs a raw AST statement\n * (join-table work has no model).\n */\nexport type StatementRunner = {\n readonly single: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<ClientRowLike>;\n readonly rows: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<ClientRowLike[]>;\n readonly affected: (params: {\n model: string;\n method: QueryMethod;\n args: Record<string, unknown>;\n }) => Promise<number>;\n readonly statement: (params: {\n statement: SqlStatement;\n model: string;\n method: string;\n }) => Promise<ClientRowLike[]>;\n};\n\n/** What the client hands the nested-write orchestrator. */\nexport type WriteContext = {\n readonly meta: RuntimeMeta;\n readonly dialect: SqlDialect;\n /** Runner on the client's current adapter (may already be transactional). */\n readonly run: StatementRunner;\n /** Runs `fn` with a runner bound to a (nested) transaction. */\n readonly transactional: <T>(fn: (run: StatementRunner) => Promise<T>) => Promise<T>;\n};\n\n// ─── Errors & guards ──────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\nfunction notFound(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_NOT_FOUND\", message: params.message, meta: params.meta });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array)\n );\n}\n\nfunction isDirectValue(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n value instanceof Date ||\n value instanceof Uint8Array\n );\n}\n\n// ─── Detection & partitioning ─────────────────────────────────────\n\n/** Does this `data` object carry nested relation operations? */\nexport function hasNestedWrites(params: { model: ModelMeta; data: unknown }): boolean {\n const { model, data } = params;\n if (!isPlainObject(data)) return false;\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n if (model.relationByName.has(key)) return true;\n }\n return false;\n}\n\ntype NestedOp = {\n readonly name: string;\n readonly link: RelationLink;\n readonly verbs: Record<string, unknown>;\n};\n\nconst CREATE_VERBS: readonly string[] = [\"create\", \"connect\", \"connectOrCreate\"];\nconst TO_ONE_UPDATE_VERBS: readonly string[] = [\n ...CREATE_VERBS,\n \"disconnect\",\n \"delete\",\n \"update\",\n \"upsert\",\n];\nconst TO_MANY_UPDATE_VERBS: readonly string[] = [\n ...CREATE_VERBS,\n \"set\",\n \"disconnect\",\n \"delete\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"deleteMany\",\n];\n\nfunction partitionData(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n data: Record<string, unknown>;\n phase: \"create\" | \"update\";\n}): { scalars: Record<string, unknown>; ops: NestedOp[] } {\n const { meta, model, data, phase } = params;\n const scalars: Record<string, unknown> = {};\n const ops: NestedOp[] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const relation = model.relationByName.get(key);\n if (relation === undefined) {\n scalars[key] = value;\n continue;\n }\n if (!isPlainObject(value)) {\n throw validationError({\n message: `relation ${model.name}.${key} in data must be an object of nested-write operations`,\n meta: { model: model.name, relation: key },\n });\n }\n const link = resolveRelationLink({ meta, model, relation });\n const allowed =\n phase === \"create\" ? CREATE_VERBS : relation.isList ? TO_MANY_UPDATE_VERBS : TO_ONE_UPDATE_VERBS;\n // Preserve internal write-scope metadata while validating string-keyed verbs.\n const verbs: Record<string, unknown> = { ...value };\n for (const [verb, operand] of Object.entries(value)) {\n if (operand === undefined) {\n delete verbs[verb];\n continue;\n }\n if (!allowed.includes(verb)) {\n throw validationError({\n message: `unknown nested-write operation \"${verb}\" on ${model.name}.${key} (${phase}) — supported: ${allowed.join(\", \")}`,\n meta: { model: model.name, relation: key, verb, phase },\n });\n }\n verbs[verb] = operand;\n }\n if (Object.keys(verbs).length === 0) {\n throw validationError({\n message: `relation ${model.name}.${key} in data carries no nested-write operation`,\n meta: { model: model.name, relation: key },\n });\n }\n ops.push({ name: key, link, verbs });\n }\n\n return { scalars, ops };\n}\n\nfunction toItems(params: { op: NestedOp; verb: string; operand: unknown }): Record<string, unknown>[] {\n const { op, verb, operand } = params;\n const list = Array.isArray(operand) ? operand : [operand];\n if (!op.link.relation.isList && Array.isArray(operand)) {\n throw validationError({\n message: `nested \"${verb}\" on to-one relation ${op.link.relation.model}.${op.name} cannot take an array`,\n meta: { relation: op.name, verb },\n });\n }\n return list.map((item) => {\n if (!isPlainObject(item)) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} expects object items`,\n meta: { relation: op.name, verb },\n });\n }\n return item;\n });\n}\n\nfunction requireShape(params: {\n op: NestedOp;\n verb: string;\n item: Record<string, unknown>;\n keys: readonly string[];\n}): void {\n const { op, verb, item, keys } = params;\n for (const key of keys) {\n if (!isPlainObject(item[key])) {\n throw validationError({\n message: `nested \"${verb}\" on ${op.link.relation.model}.${op.name} needs an object \"${key}\"`,\n meta: { relation: op.name, verb, missing: key },\n });\n }\n }\n}\n\n// ─── Target-key resolution ────────────────────────────────────────\n\n/**\n * The child-key value a unique `where` identifies. When the where directly\n * provides the referenced field (`connect: { id: 5 }` against `references:\n * [id]`), no SELECT is needed; anything else resolves with one.\n */\nasync function resolveTargetKeys(params: {\n run: StatementRunner;\n link: RelationLink;\n where: Record<string, unknown>;\n what: string;\n}): Promise<unknown[]> {\n const { run, link, where, what } = params;\n const entries = Object.entries(where).filter(([, value]) => value !== undefined);\n const named = new Map(entries);\n // The where states EVERY referenced column directly and nothing else — no\n // SELECT is needed. Partial coverage is not enough: a where naming only one\n // member of a composite key does not identify the tuple.\n if (\n entries.length === link.childKeys.length &&\n link.childKeys.every((field) => named.has(field.name) && isDirectValue(named.get(field.name)))\n ) {\n return link.childKeys.map((field) => named.get(field.name));\n }\n const rows = await run.rows({\n model: link.target.name,\n method: \"findUnique\",\n args: { where, select: childKeySelect({ link }) },\n });\n const row = rows[0];\n if (row === undefined) {\n throw notFound({\n message: `${what}: no ${link.target.name} record matched the unique where`,\n meta: { model: link.target.name, where },\n });\n }\n return childTupleOf({ link, row });\n}\n\n// ─── Join-table statements (implicit M2M) ─────────────────────────\n\nfunction joinValues(params: {\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKey: unknown;\n}): { a: unknown; b: unknown } {\n const { dialect, link, parentKey, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const pair = singleKeyPair({ link, what: \"implicit many-to-many writes\" });\n const parentValue = encodeValue({ dialect: dialect.name, field: pair.parent, value: parentKey });\n const childValue = encodeValue({ dialect: dialect.name, field: pair.child, value: childKey });\n return join.parentColumn === \"A\" ? { a: parentValue, b: childValue } : { a: childValue, b: parentValue };\n}\n\nasync function insertJoinRow(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKey: unknown;\n}): Promise<void> {\n const { run, dialect, link, parentKey, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const { a, b } = joinValues({ dialect, link, parentKey, childKey });\n await run.statement({\n statement: {\n kind: \"insert\",\n table: { name: join.tableName },\n columns: [\"A\", \"B\"],\n rows: [[a, b]],\n // Re-connecting an existing pair is a no-op, not an error.\n onConflict: { columns: [\"A\", \"B\"], doNothing: true },\n },\n model: link.relation.model,\n method: \"nested.connect\",\n });\n}\n\nasync function deleteJoinRows(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n parentKey: unknown;\n childKeys?: readonly unknown[];\n}): Promise<void> {\n const { run, dialect, link, parentKey, childKeys } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const pair = singleKeyPair({ link, what: \"implicit many-to-many writes\" });\n const parentValue = encodeValue({ dialect: dialect.name, field: pair.parent, value: parentKey });\n await run.statement({\n statement: {\n kind: \"delete\",\n table: { name: join.tableName },\n where: {\n kind: \"and\",\n operands: [\n { kind: \"cmp\", op: \"eq\", column: { name: join.parentColumn }, value: parentValue },\n ...(childKeys === undefined\n ? []\n : [\n {\n kind: \"inArray\" as const,\n column: { name: join.childColumn },\n values: childKeys.map((key) => encodeValue({ dialect: dialect.name, field: pair.child, value: key })),\n },\n ]),\n ],\n },\n },\n model: link.relation.model,\n method: \"nested.disconnect\",\n });\n}\n\n/**\n * Refuse a nested mutation whose target is not a member of THIS parent (F08).\n *\n * A many-to-many child is addressed by its own unique key, which says nothing\n * about which parent it belongs to; the sibling nested `update` path already\n * checks membership this way, and `delete`/`upsert` did not.\n */\nasync function assertM2MMember(params: {\n run: StatementRunner;\n ctx: WriteContext;\n link: RelationLink;\n parentKey: unknown;\n childKey: unknown;\n target: string;\n verb: string;\n relation: string;\n}): Promise<void> {\n const { run, ctx, link, parentKey, childKey, target, verb, relation } = params;\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n const pair = singleKeyPair({ link, what: \"implicit many-to-many writes\" });\n const childValue = encodeValue({ dialect: ctx.dialect.name, field: pair.child, value: childKey });\n if (members.some((member) => String(member) === String(childValue))) return;\n throw notFound({\n message: `nested \"${verb}\" on ${link.relation.model}.${relation}: ${target} is not connected`,\n meta: { relation },\n });\n}\n\n/** Remove EVERY join row referencing a child about to be deleted (both columns on self-relations). */\nasync function deleteJoinRowsForChild(params: {\n run: StatementRunner;\n dialect: SqlDialect;\n link: RelationLink;\n childKey: unknown;\n}): Promise<void> {\n const { run, dialect, link, childKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const value = encodeValue({\n dialect: dialect.name,\n field: singleKeyPair({ link, what: \"implicit many-to-many writes\" }).child,\n value: childKey,\n });\n const isSelf = link.relation.model === link.relation.targetModel;\n await run.statement({\n statement: {\n kind: \"delete\",\n table: { name: join.tableName },\n where: isSelf\n ? {\n kind: \"or\",\n operands: [\n { kind: \"cmp\", op: \"eq\", column: { name: \"A\" }, value },\n { kind: \"cmp\", op: \"eq\", column: { name: \"B\" }, value },\n ],\n }\n : { kind: \"cmp\", op: \"eq\", column: { name: join.childColumn }, value },\n },\n model: link.relation.model,\n method: \"nested.delete\",\n });\n}\n\n// ─── CREATE ───────────────────────────────────────────────────────\n\nfunction singleVerb(params: { op: NestedOp }): { verb: string; operand: unknown } {\n const { op } = params;\n const entries = Object.entries(op.verbs);\n if (entries.length !== 1) {\n throw validationError({\n message: `to-one relation ${op.link.relation.model}.${op.name} takes exactly one nested-write operation, got: ${entries\n .map(([verb]) => verb)\n .join(\", \")}`,\n meta: { relation: op.name, verbs: entries.map(([verb]) => verb) },\n });\n }\n return { verb: entries[0]?.[0] as string, operand: entries[0]?.[1] };\n}\n\n/** Resolve an owner-side to-one op at create time into the FK value to write. */\nasync function resolveOwnerCreateVerb(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n}): Promise<unknown[]> {\n const { ctx, run, op } = params;\n const { verb, operand } = singleVerb({ op });\n const [item] = toItems({ op, verb, operand });\n const spec = item as Record<string, unknown>;\n\n switch (verb) {\n case \"connect\":\n return await resolveTargetKeys({ run, link: op.link, where: spec, what: `connect ${op.name}` });\n case \"create\": {\n const child = await runCreate({ ctx, run, model: op.link.target, data: spec });\n return childTupleOf({ link: op.link, row: child });\n }\n default: {\n // connectOrCreate\n requireShape({ op, verb, item: spec, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: op.link.target.name,\n method: \"findUnique\",\n args: { where: spec.where, select: childKeySelect({ link: op.link }) },\n });\n if (found[0] !== undefined) return childTupleOf({ link: op.link, row: found[0] });\n const child = await runCreate({ ctx, run, model: op.link.target, data: spec.create as Record<string, unknown> });\n return childTupleOf({ link: op.link, row: child });\n }\n }\n}\n\n/** Every row defines the same key set — the batching precondition (see below). */\nfunction sameDefinedKeys(rows: readonly Record<string, unknown>[]): boolean {\n const first = rows[0];\n if (first === undefined) return true;\n const keyOf = (row: Record<string, unknown>): string =>\n Object.keys(row)\n .filter((key) => row[key] !== undefined)\n .sort()\n .join(\"\\u0000\");\n const expected = keyOf(first);\n for (let index = 1; index < rows.length; index++) {\n if (keyOf(rows[index] as Record<string, unknown>) !== expected) return false;\n }\n return true;\n}\n\n/** Apply a list-side / M2M op after the parent exists. */\nasync function applyChildCreateOps(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n parentValues: readonly unknown[];\n}): Promise<void> {\n const { ctx, run, op, parentValues } = params;\n const link = op.link;\n const fk = childAssignment({ link, values: parentValues });\n assertWriteScope({ data: op.verbs, assignments: fk });\n const target = link.target;\n const parentKey = parentValues[0];\n\n for (const [verb, operand] of Object.entries(op.verbs)) {\n const items = toItems({ op, verb, operand });\n\n // v1 parity + rule 8: plain multi-item FK-side creates collapse into ONE\n // multi-row INSERT. Batchable only when no item needs statements of its\n // own (nested verbs) and every item writes the SAME columns — a multi-row\n // VALUES binds NULL for a missing column where per-item INSERTs would let\n // a database-side default apply, so heterogeneous shapes stay per-item.\n if (verb === \"create\" && link.kind !== \"manyToMany\" && items.length > 1) {\n const rows = items.map((item) => ({ ...item, ...fk }));\n if (\n rows.every((row) => !hasNestedWrites({ model: target, data: row })) &&\n sameDefinedKeys(rows)\n ) {\n await run.affected({ model: target.name, method: \"createMany\", args: { data: rows } });\n continue;\n }\n }\n\n for (const item of items) {\n if (link.kind === \"manyToMany\") {\n let childKey: unknown;\n if (verb === \"connect\") {\n childKey = (await resolveTargetKeys({ run, link, where: item, what: `connect ${op.name}` }))[0];\n } else if (verb === \"create\") {\n const child = await runCreate({ ctx, run, model: target, data: item });\n childKey = childTupleOf({ link, row: child })[0];\n } else {\n requireShape({ op, verb, item, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: { where: item.where, select: childKeySelect({ link }) },\n });\n childKey =\n found[0] !== undefined\n ? childTupleOf({ link, row: found[0] })[0]\n : childTupleOf({\n link,\n row: await runCreate({ ctx, run, model: target, data: item.create as Record<string, unknown> }),\n })[0];\n }\n await insertJoinRow({ run, dialect: ctx.dialect, link, parentKey, childKey });\n continue;\n }\n\n // FK-side children (oneToMany list, or non-owning oneToOne).\n if (verb === \"create\") {\n await runCreate({ ctx, run, model: target, data: { ...item, ...fk } });\n } else if (verb === \"connect\") {\n await run.single({ model: target.name, method: \"update\", args: { where: item, data: fk } });\n } else {\n requireShape({ op, verb, item, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: { where: item.where, select: childKeySelect({ link }) },\n });\n if (found[0] !== undefined) {\n await run.single({ model: target.name, method: \"update\", args: { where: item.where, data: fk } });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(item.create as Record<string, unknown>), ...fk },\n });\n }\n }\n }\n }\n}\n\n/** The recursive create core — runs on an already-chosen runner (no tx management). */\nasync function runCreate(params: {\n ctx: WriteContext;\n run: StatementRunner;\n model: ModelMeta;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, run, model, data } = params;\n const { scalars, ops } = partitionData({ meta: ctx.meta, model, data, phase: \"create\" });\n\n for (const op of ops) {\n if (op.link.kind !== \"toOneOwner\") continue;\n const values = await resolveOwnerCreateVerb({ ctx, run, op });\n const assignments = parentAssignment({ link: op.link, values });\n assertWriteScope({ data, assignments });\n Object.assign(scalars, assignments);\n }\n\n const parent = await run.single({ model: model.name, method: \"create\", args: { data: scalars } });\n\n for (const op of ops) {\n if (op.link.kind === \"toOneOwner\") continue;\n await applyChildCreateOps({ ctx, run, op, parentValues: parentTupleOf({ link: op.link, row: parent }) });\n }\n\n return parent;\n}\n\n/** Whether a create's nested ops need more than the parent INSERT itself. */\nfunction createNeedsTransaction(params: { ops: readonly NestedOp[] }): boolean {\n const { ops } = params;\n return ops.some((op) => {\n if (op.link.kind !== \"toOneOwner\") return true;\n const { verb, operand } = singleVerb({ op });\n if (verb !== \"connect\" || !isPlainObject(operand)) return true;\n // A direct-key connect resolves without SQL — parent INSERT stays the only statement.\n const entries = Object.entries(operand).filter(([, value]) => value !== undefined);\n const named = new Map(entries);\n return !(\n entries.length === op.link.childKeys.length &&\n op.link.childKeys.every((field) => named.has(field.name) && isDirectValue(named.get(field.name)))\n );\n });\n}\n\n/**\n * `create` with nested relation operations. Returns the parent row as the\n * INSERT produced it (relation loading/projection are the client's follow-up).\n */\nexport async function createWithNested(params: {\n ctx: WriteContext;\n model: ModelMeta;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, model, data } = params;\n const { ops } = partitionData({ meta: ctx.meta, model, data, phase: \"create\" });\n if (createNeedsTransaction({ ops })) {\n return await ctx.transactional((run) => runCreate({ ctx, run, model, data }));\n }\n return await runCreate({ ctx, run: ctx.run, model, data });\n}\n\n// ─── UPDATE ───────────────────────────────────────────────────────\n\n/** `{ update: data }` or `{ update: { where?, data } }` both appear in the wild. */\nfunction updateDataOf(params: { op: NestedOp; operand: Record<string, unknown> }): Record<string, unknown> {\n const { op, operand } = params;\n if (\"data\" in operand && isPlainObject(operand.data)) return operand.data;\n if (\"data\" in operand) {\n throw validationError({\n message: `nested \"update\" on ${op.link.relation.model}.${op.name} needs an object \"data\"`,\n meta: { relation: op.name },\n });\n }\n return operand;\n}\n\n/** The child-side detach assignment, refusing a key with no optional member. */\nfunction childDetach(params: { op: NestedOp; verb: string }): Record<string, unknown> {\n const { op, verb } = params;\n return detachAssignment({ fields: op.link.childKeys, op, verb, target: op.link.target.name });\n}\n\n/** Owner-side to-one verbs at update time → FK assignment + deferred child work. */\nasync function resolveOwnerUpdateVerb(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n pre: ClientRowLike;\n fkSets: Record<string, unknown>;\n deferred: (() => Promise<void>)[];\n}): Promise<void> {\n const { ctx, run, op, pre, fkSets, deferred } = params;\n const link = op.link;\n // The CURRENT target tuple, in child-key order — `null` when the owning row's\n // foreign key is incomplete, which means no target is connected.\n const currentValues = parentTupleOf({ link, row: pre });\n const current = relationTupleKey({ values: currentValues }) === null ? null : currentValues;\n const targetWhere = (): Record<string, unknown> =>\n childAssignment({ link, values: current as readonly unknown[] });\n const { verb, operand } = singleVerb({ op });\n const assign = (values: readonly unknown[]): void => {\n Object.assign(fkSets, parentAssignment({ link, values }));\n };\n\n switch (verb) {\n case \"connect\": {\n const [item] = toItems({ op, verb, operand });\n assign(\n await resolveTargetKeys({\n run,\n link,\n where: item as Record<string, unknown>,\n what: `connect ${op.name}`,\n }),\n );\n return;\n }\n case \"create\": {\n const [item] = toItems({ op, verb, operand });\n const child = await runCreate({ ctx, run, model: link.target, data: item as Record<string, unknown> });\n assign(childTupleOf({ link, row: child }));\n return;\n }\n case \"connectOrCreate\": {\n const [item] = toItems({ op, verb, operand });\n const spec = item as Record<string, unknown>;\n requireShape({ op, verb, item: spec, keys: [\"where\", \"create\"] });\n const found = await run.rows({\n model: link.target.name,\n method: \"findUnique\",\n args: { where: spec.where, select: childKeySelect({ link }) },\n });\n assign(\n childTupleOf({\n link,\n row:\n found[0] ??\n (await runCreate({ ctx, run, model: link.target, data: spec.create as Record<string, unknown> })),\n }),\n );\n return;\n }\n case \"disconnect\": {\n if (operand === false) return;\n if (!link.relation.isOptional) {\n throw validationError({\n message: `nested \"disconnect\" on required relation ${link.relation.model}.${op.name} — connect a replacement instead`,\n meta: { relation: op.name },\n });\n }\n Object.assign(\n fkSets,\n detachAssignment({ fields: link.parentKeys, op, verb, target: link.relation.model }),\n );\n return;\n }\n case \"delete\": {\n if (operand === false) return;\n if (!link.relation.isOptional) {\n throw validationError({\n message: `nested \"delete\" on required relation ${link.relation.model}.${op.name} — the parent cannot exist without it`,\n meta: { relation: op.name },\n });\n }\n if (current === null) {\n throw notFound({\n message: `nested \"delete\" on ${link.relation.model}.${op.name}: no connected ${link.target.name}`,\n meta: { relation: op.name },\n });\n }\n const where = targetWhere();\n Object.assign(\n fkSets,\n detachAssignment({ fields: link.parentKeys, op, verb, target: link.relation.model }),\n );\n // The child DELETE waits until the parent no longer references it.\n deferred.push(async () => {\n await run.single({ model: link.target.name, method: \"delete\", args: { where } });\n });\n return;\n }\n case \"update\": {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"update\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n if (current === null) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${link.target.name}`,\n meta: { relation: op.name },\n });\n }\n const where = targetWhere();\n deferred.push(async () => {\n await run.single({\n model: link.target.name,\n method: \"update\",\n args: { where, data: updateDataOf({ op, operand }) },\n });\n });\n return;\n }\n default: {\n // upsert\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"upsert\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n requireShape({ op, verb, item: operand, keys: [\"create\", \"update\"] });\n if (current === null) {\n const child = await runCreate({ ctx, run, model: link.target, data: operand.create as Record<string, unknown> });\n assign(childTupleOf({ link, row: child }));\n } else {\n const where = targetWhere();\n deferred.push(async () => {\n await run.single({ model: link.target.name, method: \"update\", args: { where, data: operand.update } });\n });\n }\n return;\n }\n }\n}\n\n/** Members of an M2M relation for one parent (decoded child keys). */\nasync function loadMemberKeys(params: {\n run: StatementRunner;\n ctx: WriteContext;\n link: RelationLink;\n parentKey: unknown;\n}): Promise<unknown[]> {\n const { run, ctx, link, parentKey } = params;\n const join = link.join as NonNullable<RelationLink[\"join\"]>;\n const rows = await run.statement({\n statement: {\n kind: \"select\",\n table: { name: join.tableName },\n columns: [{ name: join.childColumn }],\n where: {\n kind: \"cmp\",\n op: \"eq\",\n column: { name: join.parentColumn },\n value: encodeValue({\n dialect: ctx.dialect.name,\n field: singleKeyPair({ link, what: \"implicit many-to-many writes\" }).parent,\n value: parentKey,\n }),\n },\n },\n model: link.relation.model,\n method: \"nested.members\",\n });\n return rows.map((row) => row[join.childColumn]);\n}\n\n/** List-side (FK or M2M) verbs at update time, in declaration order. */\nasync function applyChildUpdateOps(params: {\n ctx: WriteContext;\n run: StatementRunner;\n op: NestedOp;\n parentValues: readonly unknown[];\n}): Promise<void> {\n const { ctx, run, op, parentValues } = params;\n const link = op.link;\n const fk = childAssignment({ link, values: parentValues });\n assertWriteScope({ data: op.verbs, assignments: fk });\n const target = link.target;\n const parentKey = parentValues[0];\n const isM2M = link.kind === \"manyToMany\";\n\n for (const [verb, operand] of Object.entries(op.verbs)) {\n switch (verb) {\n case \"create\":\n case \"connect\":\n case \"connectOrCreate\": {\n await applyChildCreateOps({ ctx, run, op: { ...op, verbs: { [verb]: operand } }, parentValues });\n break;\n }\n\n case \"set\": {\n const items = toItems({ op, verb, operand: operand ?? [] });\n if (isM2M) {\n await deleteJoinRows({ run, dialect: ctx.dialect, link, parentKey });\n for (const item of items) {\n const childKey = (await resolveTargetKeys({ run, link, where: item, what: `set ${op.name}` }))[0];\n await insertJoinRow({ run, dialect: ctx.dialect, link, parentKey, childKey });\n }\n } else {\n const detach = childDetach({ op, verb });\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: fk, data: detach },\n });\n for (const item of items) {\n await run.single({ model: target.name, method: \"update\", args: { where: item, data: fk } });\n }\n }\n break;\n }\n\n case \"disconnect\": {\n if (link.kind === \"toOneInverse\") {\n if (operand === false) break;\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: fk, data: childDetach({ op, verb }) },\n });\n break;\n }\n const items = toItems({ op, verb, operand });\n if (isM2M) {\n const keys: unknown[] = [];\n for (const item of items) {\n keys.push((await resolveTargetKeys({ run, link, where: item, what: `disconnect ${op.name}` }))[0]);\n }\n await deleteJoinRows({ run, dialect: ctx.dialect, link, parentKey, childKeys: keys });\n } else {\n const detach = childDetach({ op, verb });\n for (const item of items) {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item, fk] }, data: detach },\n });\n }\n }\n break;\n }\n\n case \"delete\": {\n if (link.kind === \"toOneInverse\") {\n if (operand === false) break;\n await run.affected({ model: target.name, method: \"deleteMany\", args: { where: fk } });\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n if (isM2M) {\n const childKey = (await resolveTargetKeys({ run, link, where: item, what: `delete ${op.name}` }))[0];\n // F08: without this, deleting through parent A resolved ANY child by\n // its own unique key, cleared its memberships of every OTHER parent\n // and deleted the row.\n await assertM2MMember({ run, ctx, link, parentKey, childKey, target: target.name, verb: \"delete\", relation: op.name });\n await deleteJoinRowsForChild({ run, dialect: ctx.dialect, link, childKey });\n await run.single({\n model: target.name,\n method: \"delete\",\n args: { where: childAssignment({ link, values: [childKey] }) },\n });\n } else {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: { where: { AND: [item, fk] } },\n });\n }\n }\n break;\n }\n\n case \"update\": {\n if (link.kind === \"toOneInverse\") {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"update\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n const affected = await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: fk, data: updateDataOf({ op, operand }) },\n });\n if (affected === 0) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${target.name}`,\n meta: { relation: op.name },\n });\n }\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n requireShape({ op, verb, item, keys: [\"where\", \"data\"] });\n if (isM2M) {\n const childKey = (\n await resolveTargetKeys({\n run,\n link,\n where: item.where as Record<string, unknown>,\n what: `update ${op.name}`,\n })\n )[0];\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n const childValue = encodeValue({\n dialect: ctx.dialect.name,\n field: singleKeyPair({ link, what: \"implicit many-to-many writes\" }).child,\n value: childKey,\n });\n const isMember = members.some((member) => String(member) === String(childValue));\n if (!isMember) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: ${target.name} is not connected`,\n meta: { relation: op.name },\n });\n }\n await run.single({ model: target.name, method: \"update\", args: { where: item.where, data: item.data } });\n } else {\n const affected = await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item.where, fk] }, data: item.data },\n });\n if (affected === 0) {\n throw notFound({\n message: `nested \"update\" on ${link.relation.model}.${op.name}: no connected ${target.name} matched`,\n meta: { relation: op.name },\n });\n }\n }\n }\n break;\n }\n\n case \"updateMany\": {\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n const data = item.data;\n if (!isPlainObject(data)) {\n throw validationError({\n message: `nested \"updateMany\" on ${link.relation.model}.${op.name} needs an object \"data\"`,\n meta: { relation: op.name },\n });\n }\n if (isM2M) {\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: {\n where: { AND: [item.where ?? {}, childAssignment({ link, values: [{ in: members }] })] },\n data,\n },\n });\n } else {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: { AND: [item.where ?? {}, fk] }, data },\n });\n }\n }\n break;\n }\n\n case \"deleteMany\": {\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n if (isM2M) {\n const members = await loadMemberKeys({ run, ctx, link, parentKey });\n const victims = await run.rows({\n model: target.name,\n method: \"findMany\",\n args: {\n where: { AND: [item, childAssignment({ link, values: [{ in: members }] })] },\n select: childKeySelect({ link }),\n },\n });\n for (const victim of victims) {\n await deleteJoinRowsForChild({\n run,\n dialect: ctx.dialect,\n link,\n childKey: childTupleOf({ link, row: victim })[0],\n });\n }\n if (victims.length > 0) {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: {\n where: childAssignment({\n link,\n values: [{ in: victims.map((victim) => childTupleOf({ link, row: victim })[0]) }],\n }),\n },\n });\n }\n } else {\n await run.affected({\n model: target.name,\n method: \"deleteMany\",\n args: { where: { AND: [item, fk] } },\n });\n }\n }\n break;\n }\n\n default: {\n // upsert\n if (link.kind === \"toOneInverse\") {\n if (!isPlainObject(operand)) {\n throw validationError({\n message: `nested \"upsert\" on ${link.relation.model}.${op.name} expects an object`,\n meta: { relation: op.name },\n });\n }\n requireShape({ op, verb, item: operand, keys: [\"create\", \"update\"] });\n const existing = await run.rows({\n model: target.name,\n method: \"findFirst\",\n args: { where: fk, select: childKeySelect({ link }) },\n });\n if (existing[0] !== undefined) {\n await run.affected({\n model: target.name,\n method: \"updateMany\",\n args: { where: fk, data: operand.update },\n });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(operand.create as Record<string, unknown>), ...fk },\n });\n }\n break;\n }\n const items = toItems({ op, verb, operand });\n for (const item of items) {\n requireShape({ op, verb, item, keys: [\"where\", \"create\", \"update\"] });\n const found = await run.rows({\n model: target.name,\n method: \"findUnique\",\n args: {\n where: item.where,\n select: childKeySelect({ link }),\n },\n });\n if (found[0] !== undefined) {\n // F08: the child unique key ALONE addressed any row in the table.\n // An existing row must belong to THIS parent before its update arm\n // may run; connecting a foreign row is `connectOrCreate`'s job.\n if (isM2M) {\n await assertM2MMember({\n run,\n ctx,\n link,\n parentKey,\n childKey: childTupleOf({ link, row: found[0] })[0],\n target: target.name,\n verb: \"upsert\",\n relation: op.name,\n });\n // The whole tuple decides ownership: a row matching only the\n // tenant member of a composite key belongs to another parent.\n } else if (\n relationTupleKey({ values: childTupleOf({ link, row: found[0] }) }) !==\n relationTupleKey({ values: parentValues })\n ) {\n throw notFound({\n message: `nested \"upsert\" on ${link.relation.model}.${op.name}: the matching ${target.name} belongs to another ${link.relation.model}`,\n meta: { relation: op.name },\n });\n }\n await run.single({ model: target.name, method: \"update\", args: { where: item.where, data: item.update } });\n } else if (isM2M) {\n const child = await runCreate({ ctx, run, model: target, data: item.create as Record<string, unknown> });\n await insertJoinRow({\n run,\n dialect: ctx.dialect,\n link,\n parentKey,\n childKey: childTupleOf({ link, row: child })[0],\n });\n } else {\n await runCreate({\n ctx,\n run,\n model: target,\n data: { ...(item.create as Record<string, unknown>), ...fk },\n });\n }\n }\n break;\n }\n }\n }\n}\n\n/**\n * `update` with nested relation operations. Always transactional (the flow is\n * multi-statement by construction). Returns the parent row after its UPDATE\n * (or the pre-read row when only children changed).\n */\nexport async function updateWithNested(params: {\n ctx: WriteContext;\n model: ModelMeta;\n where: Record<string, unknown>;\n data: Record<string, unknown>;\n}): Promise<ClientRowLike> {\n const { ctx, model, where, data } = params;\n const { scalars, ops } = partitionData({ meta: ctx.meta, model, data, phase: \"update\" });\n\n return await ctx.transactional(async (run) => {\n const preRows = await run.rows({ model: model.name, method: \"findUnique\", args: { where } });\n const pre = preRows[0];\n if (pre === undefined) {\n throw notFound({\n message: `no ${model.name} record matched the where clause of update()`,\n meta: { model: model.name },\n });\n }\n\n const fkSets: Record<string, unknown> = {};\n const deferred: (() => Promise<void>)[] = [];\n for (const op of ops) {\n if (op.link.kind !== \"toOneOwner\") continue;\n await resolveOwnerUpdateVerb({ ctx, run, op, pre, fkSets, deferred });\n }\n\n assertWriteScope({ data, assignments: fkSets });\n const updateData = { ...scalars, ...fkSets };\n let parent: ClientRowLike = pre;\n if (Object.keys(updateData).length > 0) {\n parent = await run.single({ model: model.name, method: \"update\", args: { where, data: updateData } });\n }\n\n for (const fn of deferred) await fn();\n\n for (const op of ops) {\n if (op.link.kind === \"toOneOwner\") continue;\n await applyChildUpdateOps({ ctx, run, op, parentValues: parentTupleOf({ link: op.link, row: parent }) });\n }\n\n return parent;\n });\n}\n",
17
+ "/**\n * Stable, normalized query fingerprints for grouping (EPIC 1).\n *\n * A fingerprint is what a metrics backend may safely use as a label: bounded in\n * length, free of literals, free of identifiers that carry data (request ids,\n * tenant ids, URLs), and identical across executions of the same query shape.\n *\n * ORM-rendered SQL is already literal-free (every value is a placeholder), so\n * normalization exists mainly for raw SQL, where a caller may have inlined\n * literals. Normalization removes them BEFORE hashing, so a fingerprint can\n * never leak a value even when raw text is never captured.\n */\n\n// ─── Normalization ────────────────────────────────────────────────\n\nconst NUMERIC = /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g;\nconst PLACEHOLDER = /\\$\\d+/g;\nconst WHITESPACE = /\\s+/g;\n\n/**\n * Reduce SQL text to its shape: comments removed, string and numeric literals\n * replaced by `?`, placeholder numbering flattened, whitespace collapsed.\n *\n * @example\n * normalizeSql({ text: `SELECT * FROM \"User\" WHERE id = 42 AND name = 'bob'` });\n * // 'SELECT * FROM \"User\" WHERE id = ? AND name = ?'\n */\nexport function normalizeSql(params: { text: string }): string {\n const { text } = params;\n let out = \"\";\n let index = 0;\n while (index < text.length) {\n const character = text[index];\n if (character === \"'\") {\n // Read literals before looking for comments. A '--' inside a literal is\n // data, and removing it first can expose the remaining secret prefix.\n index++;\n while (index < text.length) {\n if (text[index] === \"\\\\\") { index += 2; continue; }\n if (text[index] === \"'\") {\n if (text[index + 1] === \"'\") { index += 2; continue; }\n index++;\n break;\n }\n index++;\n }\n out += \"?\";\n } else if (character === \"$\" && /^\\$(?:[A-Za-z_][A-Za-z_0-9]*)?\\$/.test(text.slice(index))) {\n const delimiter = text.slice(index).match(/^\\$(?:[A-Za-z_][A-Za-z_0-9]*)?\\$/)![0];\n const end = text.indexOf(delimiter, index + delimiter.length);\n index = end === -1 ? text.length : end + delimiter.length;\n out += \"?\";\n } else if (character === '\"' || character === \"`\") {\n // Quoted identifiers may contain comment markers too; preserve the token.\n const start = index++;\n while (index < text.length) {\n if (text[index++] !== character) continue;\n if (text[index] === character) { index++; continue; }\n break;\n }\n out += text.slice(start, index);\n } else if (text.startsWith(\"--\", index)) {\n const end = text.indexOf(\"\\n\", index + 2);\n index = end === -1 ? text.length : end;\n out += \" \";\n } else if (text.startsWith(\"/*\", index)) {\n let depth = 1;\n index += 2;\n while (index < text.length && depth > 0) {\n if (text.startsWith(\"/*\", index)) { depth++; index += 2; }\n else if (text.startsWith(\"*/\", index)) { depth--; index += 2; }\n else index++;\n }\n out += \" \";\n } else {\n out += character;\n index++;\n }\n }\n return out.replace(PLACEHOLDER, \"?\").replace(NUMERIC, \"?\").replace(WHITESPACE, \" \").trim();\n}\n\n// ─── Hashing ──────────────────────────────────────────────────────\n\n/** FNV-1a, 32-bit, hex. No dependency, stable across processes and platforms. */\nfunction fnv1a(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index++) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\n/**\n * Build the grouping key for one statement: `model.method#hash` (raw SQL uses\n * `raw` as the model). Always bounded by `maxLength`.\n *\n * @example\n * queryFingerprint({ model: \"User\", method: \"findMany\", text: sql, maxLength: 512 });\n * // 'User.findMany#3d0a91b2'\n */\nexport function queryFingerprint(params: {\n model: string | null;\n method: string;\n text: string;\n maxLength: number;\n}): string {\n const { model, method, text, maxLength } = params;\n const hash = fnv1a(normalizeSql({ text }));\n const prefix = `${model ?? \"raw\"}.${method}`;\n const full = `${prefix}#${hash}`;\n if (full.length <= maxLength) return full;\n const room = Math.max(0, maxLength - hash.length - 1);\n return `${prefix.slice(0, room)}#${hash}`;\n}\n",
18
+ "/**\n * PostgreSQL plan inspection (EPIC 5).\n *\n * Two modes, deliberately far apart:\n *\n * - `estimate` renders `EXPLAIN (FORMAT JSON)`, which does NOT run the\n * statement. It still takes planning locks and still parses and plans, so it\n * is not free and it is not zero-risk on a busy table.\n * - `analyze` renders `EXPLAIN (ANALYZE, FORMAT JSON, BUFFERS)`, which RUNS\n * the statement. It is gated behind an explicit confirmation and trusted\n * input, refuses writes and multi-statement text, and runs inside a\n * read-only transaction. None of that is a proof of safety: a SELECT can\n * call a function with side effects, and a keyword check cannot see that.\n * Never point it at production, and never replay a slow production query\n * automatically.\n *\n * The plan's own numbers are kept in their own units: planner cost units are\n * not milliseconds, and estimated rows are not observed rows.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect, SchemaIR } from \"@vibeorm/schema\";\nimport { NATIVE_RLS, getSqlDialect, renderPostgresExplain, renderPostgresWorkload, renderStatement } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type { SqlExecutor } from \"../adapter.ts\";\nimport { buildQuery } from \"../query-builder.ts\";\nimport type { BuilderClientOptions, QueryMethod, RelationStrategy } from \"../query-builder.ts\";\nimport { buildRuntimeMeta } from \"../model-meta.ts\";\nimport { normalizeSql } from \"../telemetry/fingerprint.ts\";\nimport type { ExplainMode, ParsedPlan, PlanContext, PlanNode, QueryPlanReport } from \"./types.ts\";\n\n// ─── Bounds ───────────────────────────────────────────────────────\n\n/** Defaults for plan inspection; every one of them is a bound, not a preference. */\nexport const PLAN_DEFAULTS: {\n readonly maxNodes: number;\n readonly maxConditionLength: number;\n} = Object.freeze({ maxNodes: 200, maxConditionLength: 2000 });\n\n/** Plan keys whose text can contain literal values substituted by the planner. */\nconst CONDITION_KEYS: readonly string[] = [\n \"Index Cond\",\n \"Recheck Cond\",\n \"Filter\",\n \"Join Filter\",\n \"Hash Cond\",\n \"Merge Cond\",\n \"TID Cond\",\n \"One-Time Filter\",\n \"Cache Key\",\n \"Sort Key\",\n \"Group Key\",\n \"Presorted Key\",\n \"Output\",\n];\n\n// ─── Parsing ──────────────────────────────────────────────────────\n\nfunction planError(params: { message: string }): VibeError {\n return new VibeError({ code: \"VIBE_ADAPTER\", message: params.message, meta: {} });\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction num(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value !== \"\" && Number.isFinite(Number(value))) return Number(value);\n return undefined;\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction conditionsOf(params: { node: Record<string, unknown>; includeLiterals: boolean }): Record<string, string> {\n const { node, includeLiterals } = params;\n const out: Record<string, string> = {};\n for (const key of CONDITION_KEYS) {\n const raw = node[key];\n const value = Array.isArray(raw) ? raw.join(\", \") : raw;\n if (typeof value !== \"string\" || value.length === 0) continue;\n // The planner substitutes the literal even when the statement was\n // parameterized (verified: `Index Cond: (email = 'u42@x.test'::text)` for a\n // `$1` query). Redaction reuses EPIC 1's normalizer — one implementation.\n const shown = includeLiterals ? value : normalizeSql({ text: value });\n out[key] = shown.length > PLAN_DEFAULTS.maxConditionLength ? `${shown.slice(0, PLAN_DEFAULTS.maxConditionLength)}…` : shown;\n }\n return out;\n}\n\n/**\n * Parse one `EXPLAIN (FORMAT JSON)` payload into a bounded node tree.\n *\n * Accepts what the drivers actually hand back: a parsed array, a single object,\n * or the JSON text (bun:sql and pglite differ from node-postgres here).\n */\nexport function parsePostgresPlan(params: {\n payload: unknown;\n mode: ExplainMode;\n maxNodes?: number;\n includeLiterals?: boolean;\n}): ParsedPlan {\n const { payload, mode } = params;\n const maxNodes = params.maxNodes ?? PLAN_DEFAULTS.maxNodes;\n const includeLiterals = params.includeLiterals === true;\n if (!Number.isInteger(maxNodes) || maxNodes < 1) {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: `maxNodes must be a positive integer, got ${String(maxNodes)}`, meta: { maxNodes } });\n }\n\n let parsed: unknown = payload;\n if (typeof payload === \"string\") {\n try {\n parsed = JSON.parse(payload);\n } catch {\n // A parser error may echo private plan literals; do not expose its text or cause.\n throw new VibeError({\n code: \"VIBE_ADAPTER\",\n message: \"EXPLAIN returned malformed JSON\",\n meta: { reason: \"malformed-plan-json\", mode },\n });\n }\n }\n const entry = Array.isArray(parsed) ? parsed[0] : parsed;\n const wrapper = asRecord(entry);\n const rootRaw = wrapper === undefined ? undefined : asRecord(wrapper[\"Plan\"]);\n if (rootRaw === undefined) {\n throw planError({ message: \"EXPLAIN returned a payload without a Plan node — the server did not answer in FORMAT JSON\" });\n }\n\n let count = 0;\n let truncated = false;\n const build = (node: Record<string, unknown>): PlanNode => {\n count++;\n const childrenRaw = Array.isArray(node[\"Plans\"]) ? (node[\"Plans\"] as unknown[]) : [];\n const children: PlanNode[] = [];\n for (const child of childrenRaw) {\n const record = asRecord(child);\n if (record === undefined) continue;\n if (count >= maxNodes) {\n truncated = true;\n break;\n }\n children.push(build(record));\n }\n const actualTime = num(node[\"Actual Total Time\"]);\n const actualRows = num(node[\"Actual Rows\"]);\n return {\n nodeType: text(node[\"Node Type\"]) ?? \"unknown\",\n ...(text(node[\"Relation Name\"]) === undefined ? {} : { relation: text(node[\"Relation Name\"]) as string }),\n ...(text(node[\"Alias\"]) === undefined ? {} : { alias: text(node[\"Alias\"]) as string }),\n ...(text(node[\"Index Name\"]) === undefined ? {} : { indexName: text(node[\"Index Name\"]) as string }),\n ...(text(node[\"Parent Relationship\"]) === undefined ? {} : { parentRelationship: text(node[\"Parent Relationship\"]) as string }),\n estimatedStartupCost: num(node[\"Startup Cost\"]) ?? 0,\n estimatedTotalCost: num(node[\"Total Cost\"]) ?? 0,\n estimatedRows: num(node[\"Plan Rows\"]) ?? 0,\n planWidth: num(node[\"Plan Width\"]) ?? 0,\n ...(mode === \"analyze\" && actualTime !== undefined ? { actualTotalTimeMs: actualTime } : {}),\n ...(mode === \"analyze\" && actualRows !== undefined ? { actualRows } : {}),\n ...(mode === \"analyze\" && num(node[\"Actual Loops\"]) !== undefined ? { actualLoops: num(node[\"Actual Loops\"]) as number } : {}),\n ...(num(node[\"Rows Removed by Filter\"]) === undefined ? {} : { rowsRemovedByFilter: num(node[\"Rows Removed by Filter\"]) as number }),\n ...(num(node[\"Shared Hit Blocks\"]) === undefined ? {} : { sharedBlocksHit: num(node[\"Shared Hit Blocks\"]) as number }),\n ...(num(node[\"Shared Read Blocks\"]) === undefined ? {} : { sharedBlocksRead: num(node[\"Shared Read Blocks\"]) as number }),\n ...(num(node[\"Temp Read Blocks\"]) === undefined ? {} : { tempBlocksRead: num(node[\"Temp Read Blocks\"]) as number }),\n ...(num(node[\"Temp Written Blocks\"]) === undefined ? {} : { tempBlocksWritten: num(node[\"Temp Written Blocks\"]) as number }),\n ...(text(node[\"Sort Method\"]) === undefined ? {} : { sortMethod: text(node[\"Sort Method\"]) as string }),\n conditions: conditionsOf({ node, includeLiterals }),\n children,\n };\n };\n\n const root = build(rootRaw);\n const planningTime = num(wrapper?.[\"Planning Time\"]);\n const executionTime = mode === \"analyze\" ? num(wrapper?.[\"Execution Time\"]) : undefined;\n return {\n root,\n nodeCount: count,\n truncated,\n ...(planningTime === undefined ? {} : { planningTimeMs: planningTime }),\n ...(executionTime === undefined ? {} : { executionTimeMs: executionTime }),\n };\n}\n\n// ─── Safety gates for the executing mode ──────────────────────────\n\nconst WRITE_LEADERS: readonly string[] = [\"INSERT\", \"UPDATE\", \"DELETE\", \"MERGE\", \"TRUNCATE\", \"CREATE\", \"DROP\", \"ALTER\", \"GRANT\", \"REVOKE\", \"COPY\", \"CALL\", \"DO\"];\n\nfunction refuse(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta ?? {} });\n}\n\n/**\n * Structural check before an EXECUTING explain: one statement, and its leading\n * keyword is a read. Deliberately NOT a safety proof — a SELECT can call a\n * function that writes, and this cannot see it.\n */\nfunction assertExecutableRead(params: { text: string }): void {\n const normalized = normalizeSql({ text: params.text });\n const body = normalized.replace(/;\\s*$/, \"\");\n if (body.includes(\";\")) {\n throw refuse({ message: \"EXPLAIN ANALYZE refuses multi-statement text: it would execute every statement in it\", meta: {} });\n }\n const leader = (body.match(/^\\(*\\s*([A-Za-z]+)/)?.[1] ?? \"\").toUpperCase();\n if (WRITE_LEADERS.includes(leader)) {\n throw refuse({ message: `EXPLAIN ANALYZE refuses a ${leader} statement: the executing mode would perform the write`, meta: { statement: leader } });\n }\n if (leader !== \"SELECT\" && leader !== \"WITH\" && leader !== \"TABLE\" && leader !== \"VALUES\") {\n throw refuse({ message: `EXPLAIN ANALYZE only accepts read statements; this one starts with \"${leader || \"?\"}\"`, meta: { statement: leader } });\n }\n}\n\n// ─── Context ──────────────────────────────────────────────────────\n\nasync function readPlanContext(params: {\n executor: SqlExecutor;\n dialect: SqlDialect;\n rlsContextKeys: readonly string[];\n}): Promise<PlanContext> {\n const { executor, dialect, rlsContextKeys } = params;\n const query = renderPostgresWorkload({ dialect, query: \"planContext\" });\n const rows = await executor({ text: query.text, values: query.values });\n const row = rows[0] ?? {};\n const superuser = row[\"superuser\"] === true;\n const bypassRls = row[\"bypassRls\"] === true;\n const representative = !superuser && !bypassRls;\n return {\n currentUser: String(row[\"currentUser\"] ?? \"unknown\"),\n sessionUser: String(row[\"sessionUser\"] ?? \"unknown\"),\n superuser,\n bypassRls,\n serverVersionNum: Number(row[\"serverVersionNum\"] ?? 0),\n rlsContextKeys,\n representative,\n ...(representative\n ? {}\n : {\n reason:\n `the plan was taken as \"${String(row[\"currentUser\"] ?? \"unknown\")}\", which ` +\n `${superuser ? \"is a superuser\" : \"carries BYPASSRLS\"} — row policies do not apply to it, ` +\n \"so this plan is not what a runtime role would see\",\n }),\n };\n}\n\n// ─── Explain ──────────────────────────────────────────────────────\n\nfunction requirePostgres(params: { dialect: Dialect }): SqlDialect {\n if (params.dialect !== \"postgres\") {\n throw unsupportedCapability({\n dialect: params.dialect,\n feature: \"query plan inspection\",\n hint: \"plan inspection is PostgreSQL-shaped; operation tracing (telemetry) works on every dialect\",\n });\n }\n return getSqlDialect({ dialect: params.dialect });\n}\n\n/**\n * Take a plan for already-rendered SQL.\n *\n * @example\n * await explainSql({ executor, dialect: \"postgres\",\n * sql: { text: 'SELECT \"id\" FROM \"User\" WHERE \"email\" = $1', values: [\"a@b.test\"] } });\n */\nexport async function explainSql(params: {\n executor: SqlExecutor;\n dialect: Dialect;\n sql: { readonly text: string; readonly values: readonly unknown[] };\n mode?: ExplainMode;\n /** REQUIRED for `analyze`: that mode executes the statement. */\n confirmExecute?: boolean;\n /** REQUIRED for `analyze`: the caller vouches that this SQL is its own, not a user's. */\n trustedInput?: boolean;\n /** Transaction-local settings, bound exactly as the client binds them. */\n rlsContext?: Readonly<Record<string, unknown>>;\n /** Refuse instead of labelling when the role is not representative. */\n requireRepresentativeContext?: boolean;\n maxNodes?: number;\n includeLiterals?: boolean;\n}): Promise<QueryPlanReport> {\n const { executor, sql, rlsContext } = params;\n const mode: ExplainMode = params.mode ?? \"estimate\";\n const dialect = requirePostgres({ dialect: params.dialect });\n const warnings: string[] = [];\n\n if (mode === \"analyze\") {\n if (params.confirmExecute !== true) {\n throw refuse({\n message:\n \"EXPLAIN ANALYZE EXECUTES the statement — pass confirmExecute: true to accept that, and point it at a test or staging database, never at production\",\n meta: { mode },\n });\n }\n if (params.trustedInput !== true) {\n throw refuse({\n message:\n \"EXPLAIN ANALYZE requires trustedInput: true — the statement is executed, so it must come from your own code, never from user input\",\n meta: { mode },\n });\n }\n assertExecutableRead({ text: sql.text });\n warnings.push(\n \"this statement was EXECUTED to produce observed rows and milliseconds; a read-only transaction and a keyword check are not a proof of safety, because a SELECT can call a function with side effects\",\n );\n }\n\n const contextKeys = rlsContext === undefined ? [] : Object.keys(rlsContext);\n const transactional = contextKeys.length > 0 || mode === \"analyze\";\n const run = async (query: { text: string; values: unknown[] }): Promise<Record<string, unknown>[]> =>\n executor({ text: query.text, values: query.values });\n const session = (query: Parameters<typeof renderPostgresWorkload>[0][\"query\"]): { text: string; values: unknown[] } =>\n renderPostgresWorkload({ dialect, query });\n\n if (transactional) {\n await run(session(\"sessionBegin\"));\n if (mode === \"analyze\") await run(session(\"sessionReadOnly\"));\n }\n try {\n for (const key of contextKeys) {\n const value = rlsContext?.[key];\n const statement = renderPostgresWorkload({\n dialect,\n query: \"setContext\",\n key: `${NATIVE_RLS.settingPrefix}${key}`,\n value: value === null || value === undefined ? null : String(value),\n });\n await run(statement);\n }\n\n const context = await readPlanContext({ executor, dialect, rlsContextKeys: contextKeys });\n if (!context.representative) {\n if (params.requireRepresentativeContext === true) {\n throw new VibeError({\n code: \"VIBE_RLS_CONTEXT\",\n message: `refusing to report a plan taken under a non-representative identity: ${context.reason ?? \"role bypasses row policies\"}`,\n meta: { currentUser: context.currentUser, bypassRls: context.bypassRls, superuser: context.superuser },\n });\n }\n warnings.push(context.reason ?? \"the plan was taken under a role that bypasses row policies\");\n }\n\n const explain = renderPostgresExplain({\n dialect,\n query: { text: sql.text, values: [...sql.values], returning: \"none\" },\n options: mode === \"analyze\" ? { analyze: true, buffers: true } : {},\n });\n const rows = await run(explain);\n const payload = rows[0]?.[\"QUERY PLAN\"] ?? rows[0]?.[\"query plan\"] ?? rows[0]?.[\"queryPlan\"];\n const parsed = parsePostgresPlan({\n payload,\n mode,\n ...(params.maxNodes === undefined ? {} : { maxNodes: params.maxNodes }),\n ...(params.includeLiterals === undefined ? {} : { includeLiterals: params.includeLiterals }),\n });\n if (parsed.truncated) warnings.push(`the plan was truncated at ${parsed.nodeCount} nodes; raise maxNodes to see the rest`);\n if (mode === \"estimate\") {\n warnings.push(\n \"estimated plan: costs are planner cost units (not milliseconds) and rows are estimates (not observations); EXPLAIN still parses, plans and takes planning locks\",\n );\n }\n\n if (transactional) await run(session(\"sessionCommit\"));\n return {\n mode,\n root: parsed.root,\n nodeCount: parsed.nodeCount,\n truncated: parsed.truncated,\n estimatedTotalCostUnits: parsed.root.estimatedTotalCost,\n ...(parsed.planningTimeMs === undefined ? {} : { planningTimeMs: parsed.planningTimeMs }),\n ...(parsed.executionTimeMs === undefined ? {} : { executionTimeMs: parsed.executionTimeMs }),\n literalsRedacted: params.includeLiterals !== true,\n context,\n warnings,\n };\n } catch (error) {\n if (transactional) {\n // Best effort: the diagnostic transaction wrote nothing, and the original\n // failure is what the caller needs to see.\n await run(session(\"sessionRollback\")).catch(() => []);\n }\n throw error;\n }\n}\n\n/**\n * Take a plan for one ORM operation, built through the same pure planning path\n * `previewOperation` uses. Multi-statement and data-dependent flows are refused\n * in the executing mode rather than half-explained.\n */\nexport async function explainOperation(params: {\n executor: SqlExecutor;\n schema: SchemaIR;\n dialect: Dialect;\n model: string;\n method: QueryMethod;\n args?: Record<string, unknown>;\n mode?: ExplainMode;\n confirmExecute?: boolean;\n rlsContext?: Readonly<Record<string, unknown>>;\n requireRepresentativeContext?: boolean;\n relationStrategy?: RelationStrategy;\n clientOptions?: BuilderClientOptions;\n maxNodes?: number;\n includeLiterals?: boolean;\n}): Promise<QueryPlanReport> {\n const { schema, model, method, args } = params;\n const dialect = requirePostgres({ dialect: params.dialect });\n const mode: ExplainMode = params.mode ?? \"estimate\";\n const meta = buildRuntimeMeta({ schema });\n const plan = buildQuery({\n meta,\n dialect,\n model,\n method,\n ...(args === undefined ? {} : { args }),\n ...(params.relationStrategy === undefined ? {} : { defaultRelationStrategy: params.relationStrategy }),\n ...(params.clientOptions === undefined ? {} : { clientOptions: params.clientOptions }),\n });\n if (mode === \"analyze\" && (plan.batch ?? []).length > 1) {\n throw refuse({\n message: `${model}.${method}() runs a multi-statement batch; the executing mode refuses it — preview it instead`,\n meta: { model, method },\n });\n }\n const rendered = renderStatement({ dialect, statement: plan.statement });\n return explainSql({\n executor: params.executor,\n dialect: params.dialect,\n sql: { text: rendered.text, values: rendered.values },\n mode,\n ...(params.confirmExecute === undefined ? {} : { confirmExecute: params.confirmExecute }),\n // The ORM built this statement, so its provenance is the ORM's own.\n trustedInput: true,\n ...(params.rlsContext === undefined ? {} : { rlsContext: params.rlsContext }),\n ...(params.requireRepresentativeContext === undefined ? {} : { requireRepresentativeContext: params.requireRepresentativeContext }),\n ...(params.maxNodes === undefined ? {} : { maxNodes: params.maxNodes }),\n ...(params.includeLiterals === undefined ? {} : { includeLiterals: params.includeLiterals }),\n });\n}\n",
19
+ "/**\n * Optional PostgreSQL workload statistics from `pg_stat_statements` (EPIC 5).\n *\n * Strictly read-only and strictly gated. This module cannot install the\n * extension, cannot change a server setting, cannot restart anything and cannot\n * reset statistics — the SQL to do any of that does not exist in\n * `@vibeorm/sql`. An absent extension is REPORTED, never provisioned.\n *\n * What this source is not: it has no per-call percentiles (its totals are\n * cumulative since the last reset — percentiles come from EPIC 1's operation\n * histograms), and its `queryid` is PostgreSQL's own normalization, which is\n * NOT the application fingerprint. The two are reported side by side with the\n * uncertainty stated, never joined.\n */\n\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect } from \"@vibeorm/schema\";\nimport { getSqlDialect, renderPostgresWorkload } from \"@vibeorm/sql\";\nimport type { SqlExecutor } from \"../adapter.ts\";\nimport { normalizeSql } from \"../telemetry/fingerprint.ts\";\nimport type { WorkloadAvailability, WorkloadReport, WorkloadStatement } from \"./types.ts\";\n\n/** `pg_stat_statements_info` (the reset identity) exists from PostgreSQL 14. */\nconst STATEMENTS_INFO_MIN_VERSION: number = 140000;\n/** `total_exec_time` / `mean_exec_time` are the PostgreSQL 13+ column names. */\nconst STATEMENTS_MIN_VERSION: number = 130000;\n\nconst NOTES: {\n readonly noPercentiles: string;\n readonly noCorrelation: string;\n readonly cumulative: string;\n readonly restrictedText: string;\n readonly notInstalled: string;\n readonly tooOld: string;\n} = Object.freeze({\n noPercentiles:\n \"pg_stat_statements reports cumulative totals per statement shape, not a percentile per call — p50/p95 come from operation telemetry histograms instead\",\n noCorrelation:\n \"PostgreSQL's queryid is its own normalization of the statement; it is NOT the application fingerprint, and nothing here claims the two match\",\n cumulative: \"every number is cumulative since the collection window opened; divide by calls for an average, never for a percentile\",\n restrictedText:\n \"this role is not a member of pg_read_all_stats, so statement text written by other roles reads as <insufficient privilege>\",\n notInstalled:\n \"pg_stat_statements is available on this server but not installed in this database — installing it is a server operator's decision, and VibeORM will not do it\",\n tooOld: \"pg_stat_statements on PostgreSQL below 13 does not expose total_exec_time; this reader does not guess at the older column names\",\n});\n\nfunction num(value: unknown): number {\n return typeof value === \"number\" ? value : Number(value ?? 0);\n}\n\nasync function readAvailability(params: { executor: SqlExecutor; dialect: ReturnType<typeof getSqlDialect> }): Promise<WorkloadAvailability> {\n const query = renderPostgresWorkload({ dialect: params.dialect, query: \"statementExtension\" });\n const rows = await params.executor({ text: query.text, values: query.values });\n const row = rows[0] ?? {};\n const installedVersion = row[\"installedVersion\"] === null || row[\"installedVersion\"] === undefined ? null : String(row[\"installedVersion\"]);\n const schema = row[\"schema\"] === null || row[\"schema\"] === undefined ? null : String(row[\"schema\"]);\n return {\n available: row[\"available\"] === true || installedVersion !== null,\n installed: installedVersion !== null && schema !== null,\n schema,\n installedVersion,\n serverVersionNum: num(row[\"serverVersionNum\"]),\n readAllStats: row[\"readAllStats\"] === true,\n };\n}\n\n/**\n * Read a bounded, read-only snapshot of the database's statement workload.\n *\n * @example\n * const report = await readWorkloadStatistics({ executor, dialect: \"postgres\", limit: 20 });\n * report.availability.installed; // false ⇒ statements is [] and the reason says why\n */\nexport async function readWorkloadStatistics(params: {\n executor: SqlExecutor;\n dialect: Dialect;\n limit?: number;\n /** Include statement text (still normalized). Off by default. */\n includeStatementText?: boolean;\n}): Promise<WorkloadReport> {\n const { executor } = params;\n if (params.dialect !== \"postgres\") {\n throw unsupportedCapability({\n dialect: params.dialect,\n feature: \"workload statistics (pg_stat_statements)\",\n hint: \"server workload statistics are PostgreSQL-only; operation telemetry works on every dialect\",\n });\n }\n const dialect = getSqlDialect({ dialect: params.dialect });\n const notes: string[] = [NOTES.noPercentiles, NOTES.noCorrelation, NOTES.cumulative];\n\n const availability = await readAvailability({ executor, dialect });\n if (!availability.installed || availability.schema === null) {\n notes.push(availability.available ? NOTES.notInstalled : \"pg_stat_statements is not available on this server\");\n return {\n source: \"pg_stat_statements\",\n availability: { ...availability, reason: availability.available ? NOTES.notInstalled : \"extension not available\" },\n collectionWindow: { statsReset: null, known: false },\n statements: [],\n correlation: \"none\",\n notes,\n };\n }\n if (availability.serverVersionNum < STATEMENTS_MIN_VERSION) {\n notes.push(NOTES.tooOld);\n return {\n source: \"pg_stat_statements\",\n availability: { ...availability, reason: NOTES.tooOld },\n collectionWindow: { statsReset: null, known: false },\n statements: [],\n correlation: \"none\",\n notes,\n };\n }\n if (!availability.readAllStats) notes.push(NOTES.restrictedText);\n\n let statsReset: string | null = null;\n if (availability.serverVersionNum >= STATEMENTS_INFO_MIN_VERSION) {\n const info = renderPostgresWorkload({ dialect, query: \"statementInfo\", schema: availability.schema });\n const infoRows = await executor({ text: info.text, values: info.values });\n const value = infoRows[0]?.[\"statsReset\"];\n statsReset = value === null || value === undefined ? null : String(value);\n } else {\n notes.push(\"this server predates pg_stat_statements_info, so the collection window's reset time is unknown\");\n }\n\n const snapshot = renderPostgresWorkload({\n dialect,\n query: \"statementSnapshot\",\n schema: availability.schema,\n ...(params.limit === undefined ? {} : { limit: params.limit }),\n });\n const rows = await executor({ text: snapshot.text, values: snapshot.values });\n const includeText = params.includeStatementText === true;\n const statements: WorkloadStatement[] = rows.map((row) => {\n const raw = String(row[\"query\"] ?? \"\");\n return {\n queryId: row[\"queryId\"] === null || row[\"queryId\"] === undefined ? null : String(row[\"queryId\"]),\n statement: includeText ? raw : normalizeSql({ text: raw }),\n redacted: !includeText,\n calls: num(row[\"calls\"]),\n totalExecTimeMs: num(row[\"totalExecTimeMs\"]),\n meanExecTimeMs: num(row[\"meanExecTimeMs\"]),\n minExecTimeMs: num(row[\"minExecTimeMs\"]),\n maxExecTimeMs: num(row[\"maxExecTimeMs\"]),\n rows: num(row[\"rows\"]),\n sharedBlocksHit: num(row[\"sharedBlocksHit\"]),\n sharedBlocksRead: num(row[\"sharedBlocksRead\"]),\n tempBlocksRead: num(row[\"tempBlocksRead\"]),\n tempBlocksWritten: num(row[\"tempBlocksWritten\"]),\n };\n });\n\n return {\n source: \"pg_stat_statements\",\n availability,\n collectionWindow: { statsReset, known: statsReset !== null },\n statements,\n correlation: \"none\",\n notes,\n };\n}\n",
20
+ "/**\n * Deterministic reading of evidence (EPIC 5): repeated-statement patterns from\n * EPIC 1's operation telemetry, and plan findings from an actual plan.\n *\n * Every claim here is bounded, reproducible and traceable to a number that was\n * measured. What it deliberately does NOT do:\n *\n * - it never calls a repeated statement an N+1 defect. Repetition is a\n * SUSPECTED pattern; a deliberate batch is normal work, and one batched\n * statement with a big `IN` list is never flagged.\n * - it never calls a sequential scan an index defect on its own. On a small\n * table a sequential scan is the correct plan, and it says so.\n * - it never claims to explain a pool wait or a lock wait. Neither is visible\n * in a plan, estimated or actual.\n * - it never creates, ranks or auto-applies an index. A missing-index note is\n * a CANDIDATE, carrying the predicate context, the indexes that already\n * exist and the write/storage cost a human has to weigh.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { TelemetryOperationEvent } from \"../telemetry/types.ts\";\nimport type {\n DiagnosticFinding,\n IndexFacts,\n PlanNode,\n QueryPlanReport,\n SlowOperation,\n SuspectedPattern,\n TableFacts,\n TelemetryDiagnosticReport,\n} from \"./types.ts\";\n\n// ─── Bounds ───────────────────────────────────────────────────────\n\n/** Every window and threshold, in one frozen table. All are bounded. */\nexport const DIAGNOSTIC_THRESHOLDS: {\n readonly repeatThreshold: number;\n readonly minRepeatThreshold: number;\n readonly maxRepeatThreshold: number;\n readonly slowOperationMs: number;\n readonly maxOperations: number;\n readonly maxFindings: number;\n readonly smallTableRows: number;\n readonly filterDiscardRatio: number;\n readonly estimateErrorFactor: number;\n readonly highLoopCount: number;\n} = Object.freeze({\n repeatThreshold: 5,\n minRepeatThreshold: 2,\n maxRepeatThreshold: 10000,\n slowOperationMs: 500,\n maxOperations: 1000,\n maxFindings: 50,\n smallTableRows: 10000,\n filterDiscardRatio: 0.8,\n estimateErrorFactor: 10,\n highLoopCount: 100,\n});\n\nfunction bounded(params: { value: number | undefined; fallback: number; min: number; max: number; name: string }): number {\n const { value, fallback, min, max, name } = params;\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `${name} must be an integer between ${min} and ${max}, got ${String(value)}`,\n meta: { [name]: value },\n });\n }\n return value;\n}\n\n// ─── Telemetry patterns ───────────────────────────────────────────\n\n/**\n * Read a bounded window of operation events for repeated statements and slow\n * operations. Findings are labelled SUSPECTED — this is evidence for a human,\n * not a verdict.\n *\n * @example\n * analyzeOperationTelemetry({ operations: collector.operations, repeatThreshold: 5 });\n */\nexport function analyzeOperationTelemetry(params: {\n operations: readonly TelemetryOperationEvent[];\n repeatThreshold?: number;\n slowOperationMs?: number;\n maxOperations?: number;\n maxFindings?: number;\n}): TelemetryDiagnosticReport {\n const repeatThreshold = bounded({\n value: params.repeatThreshold,\n fallback: DIAGNOSTIC_THRESHOLDS.repeatThreshold,\n min: DIAGNOSTIC_THRESHOLDS.minRepeatThreshold,\n max: DIAGNOSTIC_THRESHOLDS.maxRepeatThreshold,\n name: \"repeatThreshold\",\n });\n const maxOperations = bounded({\n value: params.maxOperations,\n fallback: DIAGNOSTIC_THRESHOLDS.maxOperations,\n min: 1,\n max: 100000,\n name: \"maxOperations\",\n });\n const maxFindings = bounded({\n value: params.maxFindings,\n fallback: DIAGNOSTIC_THRESHOLDS.maxFindings,\n min: 1,\n max: 10000,\n name: \"maxFindings\",\n });\n const slowOperationMs = params.slowOperationMs ?? DIAGNOSTIC_THRESHOLDS.slowOperationMs;\n\n // The window is the most recent `maxOperations` events, never the whole heap.\n const bounded_ = params.operations.length > maxOperations;\n const window = bounded_ ? params.operations.slice(-maxOperations) : [...params.operations];\n\n const slowOperations: SlowOperation[] = [];\n const repeatedStatements: SuspectedPattern[] = [];\n const suspectedNPlusOne: SuspectedPattern[] = [];\n let statementCount = 0;\n\n for (const operation of window) {\n statementCount += operation.statements.length;\n if (operation.durationMs !== undefined && operation.durationMs >= slowOperationMs) {\n slowOperations.push({\n operationId: operation.operationId,\n model: operation.model,\n method: operation.method,\n durationMs: operation.durationMs,\n statementCount: operation.statementCount,\n });\n }\n\n // Grouping key: EPIC 1's fingerprint, already on every statement event.\n const groups = new Map<string, { count: number; totalDurationMs: number; model: string | null; method: string }>();\n for (const statement of operation.statements) {\n const existing = groups.get(statement.fingerprint);\n if (existing === undefined) {\n groups.set(statement.fingerprint, {\n count: 1,\n totalDurationMs: statement.durationMs,\n model: statement.model,\n method: statement.method,\n });\n continue;\n }\n existing.count++;\n existing.totalDurationMs += statement.durationMs;\n }\n\n for (const [fingerprint, group] of groups) {\n if (group.count < repeatThreshold) continue;\n // A repeated CHILD statement inside one parent operation is the shape an\n // N+1 makes; the same statement repeated by the operation's own model is\n // reported as repetition without that label.\n const childOfParent = group.model !== operation.model;\n const finding: SuspectedPattern = {\n kind: childOfParent ? \"suspected-n-plus-one\" : \"repeated-statement\",\n fingerprint,\n count: group.count,\n operationId: operation.operationId,\n model: group.model,\n method: group.method,\n totalDurationMs: group.totalDurationMs,\n evidence:\n `${group.count} statements with the same shape ran inside one ${operation.model ?? \"raw\"}.${operation.method}() ` +\n `operation, ${group.totalDurationMs.toFixed(1)} ms in total` +\n (childOfParent ? ` — they query ${group.model ?? \"another model\"}, which a batched relation load would fetch in one statement` : \"\"),\n suspected: true,\n };\n if (childOfParent) suspectedNPlusOne.push(finding);\n else repeatedStatements.push(finding);\n }\n }\n\n return {\n window: { operations: window.length, statements: statementCount, bounded: bounded_ },\n slowOperations: slowOperations.slice(0, maxFindings),\n repeatedStatements: repeatedStatements.slice(0, maxFindings),\n suspectedNPlusOne: suspectedNPlusOne.slice(0, maxFindings),\n };\n}\n\n// ─── Plan findings ────────────────────────────────────────────────\n\nfunction walk(node: PlanNode, visit: (node: PlanNode) => void): void {\n visit(node);\n for (const child of node.children) walk(child, visit);\n}\n\nfunction predicateOf(node: PlanNode): string {\n const parts: string[] = [];\n for (const key of [\"Filter\", \"Index Cond\", \"Recheck Cond\", \"Hash Cond\", \"Join Filter\"]) {\n const value = node.conditions[key];\n if (value !== undefined) parts.push(`${key}: ${value}`);\n }\n return parts.length === 0 ? \"no predicate was reported on this node\" : parts.join(\" · \");\n}\n\n/**\n * Turn one plan (plus the table facts a plan cannot supply) into deterministic\n * findings. Order is the plan's own walk order, so the same plan always\n * produces the same list.\n *\n * @example\n * recommendFromPlan({ report, tables: [{ table: \"User\", estimatedRows: 5_000_000 }], indexes });\n */\nexport function recommendFromPlan(params: {\n report: QueryPlanReport;\n tables?: readonly TableFacts[];\n indexes?: readonly IndexFacts[];\n maxFindings?: number;\n}): readonly DiagnosticFinding[] {\n const { report } = params;\n const maxFindings = bounded({\n value: params.maxFindings,\n fallback: DIAGNOSTIC_THRESHOLDS.maxFindings,\n min: 1,\n max: 10000,\n name: \"maxFindings\",\n });\n const tables = new Map((params.tables ?? []).map((entry) => [entry.table, entry]));\n const indexesByTable = new Map<string, string[]>();\n for (const index of params.indexes ?? []) {\n const list = indexesByTable.get(index.table) ?? [];\n list.push(index.index);\n indexesByTable.set(index.table, list);\n }\n\n const findings: DiagnosticFinding[] = [];\n walk(report.root, (node) => {\n const relation = node.relation ?? null;\n const facts = relation === null ? undefined : tables.get(relation);\n\n if (node.nodeType === \"Seq Scan\" && relation !== null) {\n if (facts === undefined) {\n // Honest gap: without a row estimate for the table, a sequential scan\n // says nothing at all.\n findings.push({\n code: \"sequential-scan-on-small-table-not-a-defect\",\n severity: \"info\",\n node: node.nodeType,\n relation,\n evidence: `sequential scan on \"${relation}\"; no table statistics were supplied, so whether the table is small enough for this to be the right plan is unknown`,\n candidate: false,\n });\n } else if (facts.estimatedRows < DIAGNOSTIC_THRESHOLDS.smallTableRows) {\n findings.push({\n code: \"sequential-scan-on-small-table-not-a-defect\",\n severity: \"info\",\n node: node.nodeType,\n relation,\n evidence: `\"${relation}\" holds about ${facts.estimatedRows} rows — below ${DIAGNOSTIC_THRESHOLDS.smallTableRows}, PostgreSQL reads the whole table on purpose, and an index would usually be slower`,\n candidate: false,\n });\n } else {\n const removed = node.rowsRemovedByFilter;\n findings.push({\n code: \"sequential-scan-on-large-table\",\n severity: \"warn\",\n node: node.nodeType,\n relation,\n evidence:\n `sequential scan over \"${relation}\" (about ${facts.estimatedRows} rows, planner cost ${node.estimatedTotalCost} cost units)` +\n (removed === undefined ? \"\" : `, discarding ${removed} rows by filter`) +\n (node.actualRows === undefined ? \"\" : `, returning ${node.actualRows}`),\n candidate: true,\n indexCandidate: {\n table: relation,\n predicateContext: predicateOf(node),\n ...(node.conditions[\"Sort Key\"] === undefined ? {} : { orderContext: node.conditions[\"Sort Key\"] }),\n existingIndexes: indexesByTable.get(relation) ?? [],\n tradeoff:\n \"a candidate for human review only: an index on this predicate costs write throughput on every insert, update and delete of this table plus storage, and PostgreSQL may still choose the scan. Nothing here creates it.\",\n },\n });\n }\n }\n\n const removed = node.rowsRemovedByFilter;\n if (report.mode === \"analyze\" && removed !== undefined && node.actualRows !== undefined) {\n const examined = removed + node.actualRows;\n if (examined > 0 && removed / examined >= DIAGNOSTIC_THRESHOLDS.filterDiscardRatio) {\n findings.push({\n code: \"filter-discards-most-rows\",\n severity: \"info\",\n node: node.nodeType,\n relation,\n evidence: `the filter examined ${examined} rows and discarded ${removed} of them, keeping ${node.actualRows}`,\n candidate: false,\n });\n }\n }\n\n if (report.mode === \"analyze\" && node.actualRows !== undefined && node.estimatedRows > 0) {\n const factor = Math.max(node.actualRows, 1) / node.estimatedRows;\n const inverse = node.estimatedRows / Math.max(node.actualRows, 1);\n if (factor >= DIAGNOSTIC_THRESHOLDS.estimateErrorFactor || inverse >= DIAGNOSTIC_THRESHOLDS.estimateErrorFactor) {\n findings.push({\n code: \"row-estimate-off\",\n severity: \"warn\",\n node: node.nodeType,\n relation,\n evidence:\n `the planner estimated ${node.estimatedRows} rows and the node returned ${node.actualRows}` +\n (facts?.lastAnalyze === undefined ? \"\" : ` (last ANALYZE: ${String(facts.lastAnalyze)})`),\n candidate: false,\n });\n }\n }\n\n if (node.nodeType.includes(\"Sort\") && (node.sortMethod?.includes(\"external\") === true || (node.tempBlocksWritten ?? 0) > 0)) {\n findings.push({\n code: \"expensive-sort-spilled-to-disk\",\n severity: \"warn\",\n node: node.nodeType,\n relation,\n evidence: `the sort spilled to disk (${node.sortMethod ?? \"external\"}, ${node.tempBlocksWritten ?? 0} temp blocks written)`,\n candidate: false,\n });\n }\n\n if (node.nodeType === \"Nested Loop\" && (node.actualLoops ?? 0) > DIAGNOSTIC_THRESHOLDS.highLoopCount) {\n findings.push({\n code: \"nested-loop-high-loop-count\",\n severity: \"warn\",\n node: node.nodeType,\n relation,\n evidence: `the inner side of this nested loop ran ${node.actualLoops} times`,\n candidate: false,\n });\n }\n });\n\n // Always last, and always present: the limit of what a plan can answer.\n findings.push({\n code: \"cannot-explain-waits\",\n severity: \"info\",\n node: report.root.nodeType,\n relation: report.root.relation ?? null,\n evidence:\n report.mode === \"estimate\"\n ? \"this is an estimated plan: it contains no measured time at all, and neither an estimated nor an actual plan can show connection-pool waits or lock waits — those need operation telemetry and server activity views\"\n : \"an actual plan measures this statement's own execution; it still cannot show connection-pool waits or lock waits outside the statement\",\n candidate: false,\n });\n\n return findings.slice(0, maxFindings);\n}\n",
21
+ "import { relationTupleKey, relationValueKey } from \"./relation-key.ts\";\n/**\n * Relation LOADING: attach included relations onto already-materialized rows.\n *\n * The portable \"query\" strategy (default, all dialects): one batched statement\n * per relation per level (`WHERE childKey IN (parent keys)`), grouped and\n * stitched in memory — never one query per parent. Implicit M2M loads in ONE\n * statement per level (board #12, v1's shape): children INNER JOINed to their\n * join-table membership rows, the join table's parent-key column projected\n * under a reserved alias and decoded through the PARENT key's codec (rule 6).\n * Deeper levels recurse over the level's loaded children.\n *\n * PER-PARENT take/skip MECHANISM (differs from v1's SQL, matches its\n * semantics): v1 windowed with `ROW_NUMBER() OVER (PARTITION BY fk)`; v2 loads\n * the batch fully ordered (the user's orderBy, or the child PK when paginating\n * without one) and applies each parent's skip/take at stitch time. Same\n * observable result for any deterministic ordering, no window functions in the\n * AST. The trade-off — overfetching children that fall outside a page — is\n * accepted for 2.0 and confined to this module.\n *\n * The \"join\" strategy's rows arrive with `__rel_<name>` JSON columns (built by\n * the query builder's lateral statement); `attachLateralRelations` parses,\n * DECODES (codecs on every child row — to_jsonb strings timestamps and drops\n * BigInt-ness, LEARNINGS) and stitches them, then recurses deeper levels\n * through the query strategy exactly like v1.\n *\n * Statements run SEQUENTIALLY in relation-declaration order, so the statement\n * stream is deterministic (scripted-adapter tests pin it; real adapters get\n * predictable logs).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport { renderStatement } from \"@vibeorm/sql\";\nimport type { ColRef, SelectStatement, SqlDialect, SqlExpr, WireFidelity } from \"@vibeorm/sql\";\nimport { decodeValue, encodeValue, fieldDecoder, materializeJsonRows, materializeRows } from \"./codecs.ts\";\nimport { applyComputedFields } from \"./computed.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { compileOrderBy, compileWhere, lateralColumnAlias, lateralHiddenOrderFields } from \"./query-builder.ts\";\nimport { resolveRelationLink, singleKeyPair } from \"./relation-plan.ts\";\nimport type { RelationCountNode, RelationLink, RelationSelection, RelationTreeNode } from \"./relation-plan.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** A materialized row relations are stitched onto. */\nexport type LoadedRow = Record<string, unknown>;\n\n/**\n * Executes one SELECT and returns RAW driver rows — the loader decodes them\n * itself (the child model's codecs, at every materialization point). The\n * client provides this bound to its adapter + onQuery reporting.\n */\nexport type RelationExecutor = (params: {\n statement: SelectStatement;\n model: string;\n method: string;\n}) => Promise<Record<string, unknown>[]>;\n\ntype LoaderContext = {\n readonly dialect: SqlDialect;\n readonly meta: RuntimeMeta;\n readonly execute: RelationExecutor;\n /** The executing adapter's wire declaration — threads into every child materialization (board #30). */\n readonly wire: WireFidelity | undefined;\n};\n\n/** Internal alias for the grouped-count column — never collides with model columns. */\nconst COUNT_VALUE_ALIAS: string = \"__vibe_count\";\n/** Row-number alias of the per-parent window (F23). */\nconst WINDOW_ROW_ALIAS: string = \"__vibe_rn\";\n/** Derived-table alias enclosing the per-parent window (F23). */\nconst WINDOW_TABLE_ALIAS: string = \"__vibe_win\";\n\n// ─── Small helpers ────────────────────────────────────────────────\n\n/**\n * Append `items` to `target` WITHOUT a function-argument spread (F23).\n * `target.push(...items)` passes one argument per element and throws\n * `RangeError: Maximum call stack size exceeded` once a batch exceeds the\n * engine's argument limit — measured at ~150k–200k on Node/V8 and ~1M on\n * Bun/JSC, both reachable by a real relation batch.\n */\nfunction pushAll<T>(target: T[], items: readonly T[]): void {\n for (const item of items) target.push(item);\n}\n\n/**\n * A stable, VALUE-based Map key for a relation key (F23/F24).\n *\n * Parent rows and child rows are materialized independently, so an\n * object-valued key (`DateTime` → `Date`, `Bytes` → `Uint8Array`) is a\n * DIFFERENT object on each side and a Map keyed on the raw value never\n * matches. Every key is tagged by kind so no two types can collide, and\n * integral `number`/`bigint` unify deliberately — a driver may decode the\n * parent side as one and the child side as the other.\n *\n * Precision: `Date` keys carry the Date's own millisecond resolution (a JS\n * Date holds nothing finer), `Uint8Array` keys are byte-exact, and everything\n * else keys on its exact text.\n */\n\n/**\n * Distinct parent key TUPLES, deduplicated by VALUE (F24) — two equal `Date`s\n * bind ONE membership parameter, not two. The ORIGINAL values are returned so\n * each member's own codec still encodes it.\n *\n * A row whose tuple is INCOMPLETE (any member null/undefined) contributes no\n * key: a partial foreign key matches nothing, and letting its present members\n * through would attach an unrelated parent.\n */\nfunction distinctTuples(params: { rows: readonly LoadedRow[]; fields: readonly string[] }): unknown[][] {\n const { rows, fields } = params;\n const seen = new Set<string>();\n const tuples: unknown[][] = [];\n for (const row of rows) {\n const values = fields.map((field) => row[field]);\n const key = relationTupleKey({ values });\n if (key === null || seen.has(key)) continue;\n seen.add(key);\n tuples.push(values);\n }\n return tuples;\n}\n\n/** The row's tuple for `fields`, or `null` when it is incomplete. */\nfunction tupleKeyOf(params: { row: LoadedRow; fields: readonly { readonly name: string }[] }): string | null {\n const { row, fields } = params;\n return relationTupleKey({ values: fields.map((field) => row[field.name]) });\n}\n\n/**\n * The per-parent page as ROW_NUMBER bounds (F23), or `null` when the relation\n * asked for no page. `take: 0` yields an empty half-open range, honestly.\n */\nfunction windowBounds(params: {\n take: number | undefined;\n skip: number | undefined;\n}): { readonly lower: number | null; readonly upper: number | null } | null {\n const { take, skip } = params;\n if (take === undefined && skip === undefined) return null;\n const from = skip ?? 0;\n return {\n lower: from > 0 ? from : null,\n upper: take === undefined ? null : from + take,\n };\n}\n\n/**\n * Enclose a ROW_NUMBER-projecting select in the derived table that filters the\n * per-parent page (F23). Ordering rides `__vibe_rn` — the window's own\n * intra-partition order — so the outer never has to reference an order column\n * the caller did not project.\n */\nfunction windowedStatement(params: {\n inner: SelectStatement;\n columns: readonly ColRef[];\n bounds: { readonly lower: number | null; readonly upper: number | null };\n}): SelectStatement {\n const { inner, columns, bounds } = params;\n const operands: SqlExpr[] = [];\n if (bounds.lower !== null) {\n operands.push({ kind: \"cmp\", op: \"gt\", column: { name: WINDOW_ROW_ALIAS }, value: bounds.lower });\n }\n if (bounds.upper !== null) {\n operands.push({ kind: \"cmp\", op: \"lte\", column: { name: WINDOW_ROW_ALIAS }, value: bounds.upper });\n }\n return {\n kind: \"select\",\n table: { name: WINDOW_TABLE_ALIAS },\n columns,\n fromSelect: inner,\n where: operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands },\n orderBy: [{ column: { name: WINDOW_ROW_ALIAS }, direction: \"asc\" }],\n };\n}\n\n/** The batched child SELECT for one relation level (single-table statement). */\nfunction buildChildStatement(params: {\n ctx: LoaderContext;\n node: RelationTreeNode;\n membership: SqlExpr;\n /** Per-parent page (F23): partition column + ROW_NUMBER bounds. */\n window?: {\n readonly partitionBy: readonly ColRef[];\n readonly bounds: { readonly lower: number | null; readonly upper: number | null };\n };\n}): SelectStatement {\n const { ctx, node, membership, window } = params;\n const target = node.link.target;\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({ dialect: ctx.dialect, meta: ctx.meta, model: target, where: node.args.where });\n const where: SqlExpr =\n nestedWhere === undefined ? membership : { kind: \"and\", operands: [membership, nestedWhere] };\n\n let orderBy =\n node.args.orderBy === undefined\n ? undefined\n : compileOrderBy({ model: target, orderBy: node.args.orderBy, dialect: ctx.dialect });\n if (orderBy === undefined && (node.args.take !== undefined || node.args.skip !== undefined)) {\n // Pagination without an order is nondeterministic — default to the PK.\n orderBy = target.primaryKey.map((field) => ({\n column: { name: field.columnName },\n direction: \"asc\" as const,\n }));\n }\n\n const projected = node.args.projected;\n const columns =\n projected === null\n ? target.fields.map((field) => ({ name: field.columnName }))\n : projected.map((name) => ({\n name: (target.fieldByName.get(name) as { columnName: string }).columnName,\n }));\n\n if (window === undefined) {\n return {\n kind: \"select\",\n table: { name: target.tableName },\n columns,\n where,\n ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }),\n };\n }\n\n // F23: the page is cut in SQL, per parent. The window's own ORDER BY carries\n // the child ordering, so the inner statement needs no separate sort.\n const inner: SelectStatement = {\n kind: \"select\",\n table: { name: target.tableName },\n columns,\n where,\n rowNumber: { partitionBy: [...window.partitionBy], orderBy: orderBy ?? [], alias: WINDOW_ROW_ALIAS },\n };\n return windowedStatement({ inner, columns, bounds: window.bounds });\n}\n\n/**\n * The batched membership predicate for one relation level.\n *\n * Arity 1 keeps the existing `inArray` shape (postgres keeps its single-array\n * `= ANY($1)` form). Arity ≥ 2 renders an ORDERED-TUPLE predicate: separate\n * `tenantId IN (…) AND customerId IN (…)` terms would match the Cartesian\n * product of the members and pull in other tenants' children.\n *\n * Each member is encoded through ITS OWN field codec.\n */\nfunction membershipExpr(params: {\n ctx: LoaderContext;\n /** Columns the predicate tests, in tuple order. */\n fields: readonly { readonly columnName: string }[];\n /** The field each member ENCODES through (parent side for M2M, child side otherwise). */\n encodeAs: readonly Parameters<typeof encodeValue>[0][\"field\"][];\n /** Table qualifier for the tested columns, when the statement joins. */\n table?: string;\n tuples: readonly (readonly unknown[])[];\n}): SqlExpr {\n const { ctx, fields, encodeAs, table, tuples } = params;\n const columns: ColRef[] = fields.map((field) =>\n table === undefined ? { name: field.columnName } : { table, name: field.columnName },\n );\n const encoded = tuples.map((tuple) =>\n tuple.map((value, index) =>\n encodeValue({ dialect: ctx.dialect.name, field: encodeAs[index] as (typeof encodeAs)[number], value }),\n ),\n );\n if (columns.length === 1) {\n return {\n kind: \"inArray\",\n column: columns[0] as ColRef,\n values: encoded.map((tuple) => tuple[0]),\n };\n }\n return { kind: \"tupleIn\", columns, rows: encoded };\n}\n\n/**\n * M7 (SQL review): dialects that EXPAND `IN (?, ?, …)` bind one parameter per\n * key — sqlite hard-errors past ~32k and mysql caps at 65535, so an unbounded\n * parent batch must chunk to the dialect's conservative budget. Postgres\n * passes ONE array parameter (`= ANY($1)`) and never chunks.\n *\n * Correctness per load kind (SHARED-1, review round 2): the chunk key IS the\n * grouping key for EVERY load kind — FK/to-one chunk by parent key, and the\n * single-statement M2M join (board #12) filters the join table by PARENT key\n * too — so a parent's children always arrive from one statement, in that\n * statement's order, and chunk results simply concatenate.\n */\nfunction chunkKeys(params: {\n ctx: LoaderContext;\n keys: readonly (readonly unknown[])[];\n relation: string;\n /** Builds the statement for one chunk — rendered once to measure the rest of it. */\n build: (chunk: readonly (readonly unknown[])[]) => SelectStatement;\n /** True when the statement binds parameters BEYOND the membership keys. */\n measure: boolean;\n /** Members per tuple — each one binds its own parameter. */\n arity: number;\n}): readonly (readonly (readonly unknown[])[])[] {\n const { ctx, keys, relation, build, measure, arity } = params;\n const budget = ctx.dialect.paramBudget;\n // A composite tuple ALWAYS expands (one parameter per member) — postgres's\n // single-array shortcut only exists for the arity-1 `= ANY($1)` form.\n const expands = arity > 1 || ctx.dialect.inArrayStrategy === \"expand\";\n\n // F26: a nested child predicate and the per-parent window bounds consume the\n // SAME statement's placeholder allowance. Render a ONE-key chunk through the\n // real renderer — the only honest count — and reserve what it needs before\n // any parent key is placed. A statement that cannot hold its own predicate\n // plus a single key is refused; truncating it would silently drop parents.\n let fixed = 0;\n if (measure) {\n const rendered = renderStatement({ dialect: ctx.dialect, statement: build(keys.slice(0, 1)) });\n fixed = rendered.values.length - (expands ? arity : 1);\n if (fixed + arity > budget) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: `relation \"${relation}\" needs ${fixed + arity} bound parameters for its own predicate, more than ${ctx.dialect.name}'s ${budget}-parameter statement budget — narrow the nested filter`,\n meta: { relation, dialect: ctx.dialect.name, required: fixed + arity, budget },\n });\n }\n }\n\n if (!expands) return [keys];\n const available = Math.max(1, Math.floor((budget - fixed) / arity));\n if (keys.length <= available) return [keys];\n const chunks: (readonly (readonly unknown[])[])[] = [];\n for (let start = 0; start < keys.length; start += available) {\n chunks.push(keys.slice(start, start + available));\n }\n return chunks;\n}\n\n\n// ─── Per-kind loaders (query strategy) ────────────────────────────\n\n/** Load + stitch a to-many FK relation; returns the kept children (for recursion). */\nasync function loadToManyFk(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const keys = distinctTuples({ rows, fields: link.parentKeys.map((field) => field.name) });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = [];\n return [];\n }\n\n // F23: a per-parent page is cut by a ROW_NUMBER window in SQL, not by\n // fetching every matching child and slicing in memory. The partition is the\n // WHOLE child key, so a composite relation pages per (tenant, customer).\n const bounds = windowBounds({ take: node.args.take, skip: node.args.skip });\n const build = (chunk: readonly (readonly unknown[])[]): SelectStatement =>\n buildChildStatement({\n ctx,\n node,\n membership: membershipExpr({ ctx, fields: link.childKeys, encodeAs: link.childKeys, tuples: chunk }),\n ...(bounds === null\n ? {}\n : {\n window: {\n partitionBy: link.childKeys.map((field) => ({ name: field.columnName })),\n bounds,\n },\n }),\n });\n\n const raw: Record<string, unknown>[] = [];\n const chunks = chunkKeys({\n ctx,\n keys,\n relation: node.name,\n build,\n measure: node.args.where !== undefined || bounds !== null,\n arity: link.childKeys.length,\n });\n for (const chunk of chunks) {\n const statement = build(chunk);\n pushAll(raw, await ctx.execute({ statement, model: model.name, method: `include.${node.name}` }));\n }\n const children = materializeRows({ dialect: ctx.dialect.name, model: link.target, rows: raw, wire: ctx.wire });\n\n const grouped = new Map<string, LoadedRow[]>();\n for (const child of children) {\n const key = tupleKeyOf({ row: child, fields: link.childKeys });\n if (key === null) continue;\n const group = grouped.get(key);\n if (group === undefined) grouped.set(key, [child]);\n else group.push(child);\n }\n\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n // The window already bounded each parent's page — slicing again would\n // apply skip twice. An incomplete parent tuple matches nothing.\n const key = tupleKeyOf({ row, fields: link.parentKeys });\n const slice = (key === null ? [] : (grouped.get(key) ?? [])).slice();\n row[node.name] = slice;\n pushAll(kept, slice);\n }\n return kept;\n}\n\n/** Load + stitch a to-one relation (either side); returns kept children. */\nasync function loadToOne(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const keys = distinctTuples({ rows, fields: link.parentKeys.map((field) => field.name) });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = null;\n return [];\n }\n\n const build = (chunk: readonly (readonly unknown[])[]): SelectStatement =>\n buildChildStatement({\n ctx,\n node,\n membership: membershipExpr({ ctx, fields: link.childKeys, encodeAs: link.childKeys, tuples: chunk }),\n });\n\n const raw: Record<string, unknown>[] = [];\n const chunks = chunkKeys({\n ctx,\n keys,\n relation: node.name,\n build,\n measure: node.args.where !== undefined,\n arity: link.childKeys.length,\n });\n for (const chunk of chunks) {\n const statement = build(chunk);\n pushAll(raw, await ctx.execute({ statement, model: model.name, method: `include.${node.name}` }));\n }\n const children = materializeRows({ dialect: ctx.dialect.name, model: link.target, rows: raw, wire: ctx.wire });\n\n const byKey = new Map<string, LoadedRow>();\n for (const child of children) {\n const key = tupleKeyOf({ row: child, fields: link.childKeys });\n if (key === null) continue;\n if (!byKey.has(key)) byKey.set(key, child);\n }\n\n // Each parent gets its OWN instance — shared references across parents\n // would make later recursion/strips act at a distance.\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n const parentTuple = tupleKeyOf({ row, fields: link.parentKeys });\n const child = parentTuple === null ? undefined : byKey.get(parentTuple);\n if (child === undefined) {\n row[node.name] = null;\n continue;\n }\n const copy = { ...child };\n row[node.name] = copy;\n kept.push(copy);\n }\n return kept;\n}\n\n/** Join-table alias in the single-statement M2M load. */\nconst M2M_JOIN_ALIAS: string = \"__jt\";\n/** Reserved projection alias for the join table's parent-key column. */\nconst M2M_PARENT_ALIAS: string = \"__vibe_parent\";\n\n/**\n * Load + stitch an implicit M2M relation — ONE statement per parent-key chunk\n * (board #12, v1's single-statement shape): children INNER JOINed to the join\n * table, the parent-key column projected under {@link M2M_PARENT_ALIAS}. Each\n * result row is one (parent, child) membership pair, so distribution needs no\n * separate pair query; a chunk holds ALL of a parent's pairs (chunking is by\n * PARENT key), so per-parent order is chunk-local and needs no re-sort.\n */\nasync function loadManyToMany(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<LoadedRow[]> {\n const { ctx, model, node, rows } = params;\n const link = node.link;\n const join = link.join;\n if (join === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `manyToMany relation \"${node.name}\" resolved without join-table wiring`,\n });\n }\n // Implicit many-to-many stays single-key in this EPIC (plan.md): the join\n // table has ONE column per side. A composite primary key is refused during\n // link resolution, before any statement runs.\n const { parent: parentKey, child: childKey } = singleKeyPair({ link, what: \"implicit many-to-many loading\" });\n const keys = distinctTuples({ rows, fields: [parentKey.name] });\n\n if (keys.length === 0) {\n for (const row of rows) row[node.name] = [];\n return [];\n }\n\n const target = link.target;\n // Child columns are table-qualified: the join table's own column names\n // (`A`/`B`) could collide with child columns.\n const projected = node.args.projected;\n const childColumns: { table: string; name: string }[] = (\n projected === null\n ? target.fields.map((field) => field.columnName)\n : projected.map((name) => (target.fieldByName.get(name) as { columnName: string }).columnName)\n ).map((name) => ({ table: target.tableName, name }));\n\n const nestedWhere =\n node.args.where === undefined\n ? undefined\n : compileWhere({\n dialect: ctx.dialect,\n meta: ctx.meta,\n model: target,\n where: node.args.where,\n qualify: target.tableName,\n });\n let orderBy =\n node.args.orderBy === undefined\n ? undefined\n : compileOrderBy({ model: target, orderBy: node.args.orderBy, qualify: target.tableName, dialect: ctx.dialect });\n if (orderBy === undefined && (node.args.take !== undefined || node.args.skip !== undefined)) {\n // Pagination without an order is nondeterministic — default to the PK.\n orderBy = target.primaryKey.map((field) => ({\n column: { table: target.tableName, name: field.columnName },\n direction: \"asc\" as const,\n }));\n }\n\n // F23: the per-parent page partitions by the JOIN TABLE's parent column —\n // the same column the membership filter and the grouping key use.\n const bounds = windowBounds({ take: node.args.take, skip: node.args.skip });\n const outerColumns: ColRef[] = [\n ...childColumns.map((column) => ({ name: column.name })),\n { name: M2M_PARENT_ALIAS },\n ];\n const build = (chunk: readonly (readonly unknown[])[]): SelectStatement => {\n const membership: SqlExpr = membershipExpr({\n ctx,\n fields: [{ columnName: join.parentColumn }],\n encodeAs: [parentKey],\n table: M2M_JOIN_ALIAS,\n tuples: chunk,\n });\n const where: SqlExpr =\n nestedWhere === undefined ? membership : { kind: \"and\", operands: [membership, nestedWhere] };\n const base: SelectStatement = {\n kind: \"select\",\n table: { name: target.tableName },\n columns: [...childColumns, { table: M2M_JOIN_ALIAS, name: join.parentColumn, alias: M2M_PARENT_ALIAS }],\n innerJoins: [\n {\n table: { name: join.tableName, alias: M2M_JOIN_ALIAS },\n on: [\n {\n left: { table: M2M_JOIN_ALIAS, name: join.childColumn },\n right: { table: target.tableName, name: childKey.columnName },\n },\n ],\n },\n ],\n where,\n };\n if (bounds === null) {\n return { ...base, ...(orderBy === undefined || orderBy.length === 0 ? {} : { orderBy }) };\n }\n const inner: SelectStatement = {\n ...base,\n rowNumber: {\n partitionBy: [{ table: M2M_JOIN_ALIAS, name: join.parentColumn }],\n orderBy: orderBy ?? [],\n alias: WINDOW_ROW_ALIAS,\n },\n };\n return windowedStatement({ inner, columns: outerColumns, bounds });\n };\n\n const raw: Record<string, unknown>[] = [];\n const chunks = chunkKeys({\n ctx,\n keys,\n relation: node.name,\n build,\n measure: node.args.where !== undefined || bounds !== null,\n arity: 1,\n });\n for (const chunk of chunks) {\n const statement = build(chunk);\n pushAll(raw, await ctx.execute({ statement, model: model.name, method: `include.${node.name}` }));\n }\n\n // Children decode through the TARGET model's codecs; the reserved parent\n // column rides the PARENT key's codec (rule 6 — BigInt ids arrive as strings\n // from pg drivers, exactly like everywhere else).\n const pairs = materializeRows({ dialect: ctx.dialect.name, model: target, rows: raw, wire: ctx.wire });\n const decodeParent = fieldDecoder({\n dialect: ctx.dialect.name,\n field: parentKey,\n ...(ctx.wire === undefined ? {} : { wire: ctx.wire }),\n });\n\n const groups = new Map<unknown, LoadedRow[]>();\n for (const pair of pairs) {\n const rawParent = pair[M2M_PARENT_ALIAS];\n delete pair[M2M_PARENT_ALIAS];\n const parentKey =\n decodeParent === null || rawParent === null || rawParent === undefined ? rawParent : decodeParent(rawParent);\n // Each result row is one membership pair — already a per-parent instance.\n const key = relationValueKey({ value: parentKey });\n const group = groups.get(key);\n if (group === undefined) groups.set(key, [pair]);\n else group.push(pair);\n }\n\n const kept: LoadedRow[] = [];\n for (const row of rows) {\n const slice = (groups.get(relationValueKey({ value: row[parentKey.name] })) ?? []).slice();\n row[node.name] = slice;\n pushAll(kept, slice);\n }\n return kept;\n}\n\n// ─── _count ───────────────────────────────────────────────────────\n\n/**\n * Load `_count` for the selected list relations: ONE grouped COUNT per relation\n * for the whole parent batch. Runs for both strategies (the lateral path has\n * no aggregate column — v1 lesson: forgetting this silently dropped `_count`).\n *\n * A count entry may carry a `where` (EPIC 4). The filter is compiled by\n * `compileWhere` — the SAME compiler and codecs an ordinary query where goes\n * through — and AND-ed into the batched membership predicate, so it is applied\n * by the database and the batching property is untouched: still one statement\n * per relation per level, never one per parent.\n *\n * Filtering an implicit many-to-many count is the one shape that changes the\n * statement: the unfiltered count groups the JOIN TABLE alone, while a filtered\n * one must reach the child rows, so it counts the child table INNER JOINed to\n * its membership rows — the same join `loadManyToMany` uses. Join-table pairs\n * are unique, so `COUNT(*)` over that join still counts CHILDREN, not\n * duplicated join rows. The unfiltered shape is left byte-identical.\n */\nasync function loadCounts(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n rows: readonly LoadedRow[];\n counts: readonly RelationCountNode[];\n}): Promise<void> {\n const { ctx, model, rows, counts } = params;\n if (counts.length === 0 || rows.length === 0) return;\n\n for (const row of rows) {\n const bucket: Record<string, number> = {};\n for (const node of counts) bucket[node.name] = 0;\n row._count = bucket;\n }\n\n for (const node of counts) {\n const name = node.name;\n const link = node.link;\n const keys = distinctTuples({ rows, fields: link.parentKeys.map((field) => field.name) });\n if (keys.length === 0) continue;\n\n const join = link.join;\n const target = link.target;\n // Only a FILTERED many-to-many count needs the child table in the\n // statement; everything else counts a single table, unqualified.\n const joinsChildTable = join !== null && node.where !== undefined;\n const childKey = joinsChildTable\n ? singleKeyPair({ link, what: \"implicit many-to-many counting\" }).child\n : null;\n // The grouping key is the WHOLE relation key: grouping on one member of a\n // composite foreign key would sum other tenants' children into the count.\n const groupFields: readonly { readonly columnName: string }[] =\n join === null ? link.childKeys : [{ columnName: join.parentColumn }];\n const encodeAs = join === null ? link.childKeys : [link.parentKeys[0] as (typeof link.parentKeys)[number]];\n const table = join === null ? target.tableName : join.tableName;\n const groupColumns: ColRef[] = groupFields.map((field) =>\n joinsChildTable ? { table: M2M_JOIN_ALIAS, name: field.columnName } : { name: field.columnName },\n );\n // Column the grouped key comes back under: the joined shape aliases it, so\n // a join-table column can never collide with a child column.\n const resultKeys: readonly string[] = joinsChildTable\n ? [M2M_PARENT_ALIAS]\n : groupFields.map((field) => field.columnName);\n const projectedColumns: ColRef[] = joinsChildTable\n ? groupColumns.map((column) => ({ ...column, alias: M2M_PARENT_ALIAS }))\n : groupColumns;\n const filter =\n node.where === undefined\n ? undefined\n : compileWhere({\n dialect: ctx.dialect,\n meta: ctx.meta,\n model: target,\n where: node.where,\n ...(joinsChildTable ? { qualify: target.tableName } : {}),\n });\n const build = (chunk: readonly (readonly unknown[])[]): SelectStatement => {\n const membership = membershipExpr({\n ctx,\n fields: groupFields,\n encodeAs,\n tuples: chunk,\n ...(joinsChildTable ? { table: M2M_JOIN_ALIAS } : {}),\n });\n const where: SqlExpr = filter === undefined ? membership : { kind: \"and\", operands: [membership, filter] };\n const base: SelectStatement = {\n kind: \"select\",\n table: { name: joinsChildTable ? target.tableName : table },\n columns: projectedColumns,\n selectExpr: { kind: \"countAll\", alias: COUNT_VALUE_ALIAS },\n where,\n groupBy: groupColumns,\n };\n if (!joinsChildTable) return base;\n return {\n ...base,\n innerJoins: [\n {\n table: { name: (join as NonNullable<typeof join>).tableName, alias: M2M_JOIN_ALIAS },\n on: [\n {\n left: { table: M2M_JOIN_ALIAS, name: (join as NonNullable<typeof join>).childColumn },\n right: { table: target.tableName, name: (childKey as FieldMeta).columnName },\n },\n ],\n },\n ],\n };\n };\n\n const raw: Record<string, unknown>[] = [];\n const chunks = chunkKeys({\n ctx,\n keys,\n relation: name,\n build,\n measure: node.where !== undefined,\n arity: groupFields.length,\n });\n for (const chunk of chunks) {\n pushAll(raw, await ctx.execute({ statement: build(chunk), model: model.name, method: `_count.${name}` }));\n }\n\n const byKey = new Map<string, number>();\n for (const entry of raw) {\n const decoded = groupFields.map((field, index) =>\n decodeValue({\n dialect: ctx.dialect.name,\n field: encodeAs[index] as (typeof encodeAs)[number],\n value: entry[resultKeys[index] as string],\n }),\n );\n const key = relationTupleKey({ values: decoded });\n if (key !== null) byKey.set(key, Number(entry[COUNT_VALUE_ALIAS] ?? 0));\n }\n for (const row of rows) {\n const key = tupleKeyOf({ row, fields: link.parentKeys });\n const count = key === null ? undefined : byKey.get(key);\n if (count !== undefined) (row._count as Record<string, number>)[name] = count;\n }\n }\n}\n\n// ─── Entry points ─────────────────────────────────────────────────\n\nasync function loadNode(params: {\n ctx: LoaderContext;\n model: ModelMeta;\n node: RelationTreeNode;\n rows: readonly LoadedRow[];\n}): Promise<void> {\n const { ctx, model, node, rows } = params;\n\n let kept: LoadedRow[];\n switch (node.link.kind) {\n case \"toManyFk\":\n kept = await loadToManyFk({ ctx, model, node, rows });\n break;\n case \"manyToMany\":\n kept = await loadManyToMany({ ctx, model, node, rows });\n break;\n case \"toOneOwner\":\n case \"toOneInverse\":\n kept = await loadToOne({ ctx, model, node, rows });\n break;\n }\n\n await finishNode({ ctx, node, kept });\n}\n\n/** Attach computed fields, recurse deeper levels over the kept children, then strip stitching keys. */\nasync function finishNode(params: {\n ctx: LoaderContext;\n node: RelationTreeNode;\n kept: readonly LoadedRow[];\n}): Promise<void> {\n const { ctx, node, kept } = params;\n // BEFORE the strip: computed `needs` may be stitch-fetched fields the\n // caller did not select (both strategies funnel through here — the lateral\n // path's JSON children included).\n if (node.args.computed !== null && kept.length > 0) {\n applyComputedFields({ model: node.link.target, rows: kept, names: node.args.computed });\n }\n if (node.args.nested !== null && kept.length > 0) {\n await attachRelations({\n dialect: ctx.dialect,\n meta: ctx.meta,\n model: node.link.target,\n rows: [...kept],\n selection: node.args.nested,\n execute: ctx.execute,\n ...(ctx.wire === undefined ? {} : { wire: ctx.wire }),\n });\n }\n if (node.args.strip.length > 0) {\n for (const child of kept) {\n for (const name of node.args.strip) delete child[name];\n }\n }\n}\n\n/**\n * \"query\"-strategy loading: batched statements per relation, in declaration\n * order, recursively. Mutates `rows` in place (relations become properties).\n */\nexport async function attachRelations(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n rows: LoadedRow[];\n selection: RelationSelection;\n execute: RelationExecutor;\n /** The executing adapter's wire declaration (board #30). */\n wire?: WireFidelity;\n}): Promise<void> {\n const { dialect, meta, model, rows, selection, execute, wire } = params;\n if (rows.length === 0) return;\n const ctx: LoaderContext = { dialect, meta, execute, wire };\n\n for (const node of selection.relations) {\n await loadNode({ ctx, model, node, rows });\n }\n await loadCounts({ ctx, model, rows, counts: selection.counts });\n}\n\n/**\n * \"join\"-strategy post-processing: parse each row's `__rel_<name>` JSON\n * column, decode the children through the child model's codecs, stitch, then\n * recurse deeper levels through the query strategy (v1 semantics) and load\n * `_count` separately.\n */\nexport async function attachLateralRelations(params: {\n dialect: SqlDialect;\n meta: RuntimeMeta;\n model: ModelMeta;\n rows: LoadedRow[];\n selection: RelationSelection;\n execute: RelationExecutor;\n /** The executing adapter's wire declaration (board #30 — deeper levels recurse through the query strategy). */\n wire?: WireFidelity;\n}): Promise<void> {\n const { dialect, meta, model, rows, selection, execute, wire } = params;\n if (rows.length === 0) return;\n const ctx: LoaderContext = { dialect, meta, execute, wire };\n\n for (const node of selection.relations) {\n const column = lateralColumnAlias({ relation: node.name });\n const isList = node.link.relation.isList;\n // PG-3: order fields the subselect projected HIDDEN (outside the child\n // select, referenced by the aggregate's ORDER BY) — deleted after parse,\n // exactly like the strip list's stitch keys.\n const hiddenOrder = lateralHiddenOrderFields({ node });\n const kept: LoadedRow[] = [];\n\n for (const row of rows) {\n const raw = row[column];\n delete row[column];\n\n let parsed: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n parsed = JSON.parse(raw);\n } catch (cause) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `relation column \"${column}\" returned text that is not valid JSON`,\n meta: { relation: node.name },\n cause,\n });\n }\n }\n\n if (isList) {\n const list = Array.isArray(parsed) ? (parsed as Record<string, unknown>[]) : [];\n // B3: JSON-transport decode — ::text/base64 wire forms, Json pre-parsed.\n const children = materializeJsonRows({ model: node.link.target, rows: list });\n for (const child of children) {\n for (const name of hiddenOrder) delete child[name];\n }\n row[node.name] = children;\n pushAll(kept, children);\n } else {\n if (parsed === null || parsed === undefined || typeof parsed !== \"object\") {\n row[node.name] = null;\n continue;\n }\n const child = materializeJsonRows({\n model: node.link.target,\n rows: [parsed as Record<string, unknown>],\n })[0] as LoadedRow;\n for (const name of hiddenOrder) delete child[name];\n row[node.name] = child;\n kept.push(child);\n }\n }\n\n await finishNode({ ctx, node, kept });\n }\n\n await loadCounts({ ctx, model, rows, counts: selection.counts });\n}\n",
22
+ "/**\n * Runtime side of computed fields (config-declared derived result properties).\n *\n * The runtime stays config-AGNOSTIC the same way it is extension-agnostic:\n * `createClient({ computed })` receives the live spec object plus the baked\n * manifest from the generated client, verifies them against each other\n * (VIBE_STALE_CLIENT before the first query), folds the specs into the model\n * metadata, and `applyComputedFields` runs the compute functions at every row\n * materialization point — top-level rows, mutation returns, and relation-loaded\n * children on BOTH strategies (the codec lesson from LEARNINGS, applied to\n * computes).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ComputedConfig, ComputedManifestEntry } from \"@vibeorm/schema\";\nimport type { ModelMeta } from \"./model-meta.ts\";\n\n// ─── Options ──────────────────────────────────────────────────────\n\n/** Computed-field wiring accepted by `createClient`. */\nexport type ClientComputedOptions = {\n /** The live spec object (`vibeorm.config.ts`'s `computed`) — provides the compute functions. */\n readonly specs?: ComputedConfig;\n /** Manifest baked by the generator — presence turns on the staleness check. */\n readonly manifest?: readonly ComputedManifestEntry[];\n};\n\n// ─── Staleness ────────────────────────────────────────────────────\n\nfunction sameNeeds(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const left = [...a].sort();\n const right = [...b].sort();\n return left.every((value, index) => value === right[index]);\n}\n\n/**\n * Compare the generated client's baked computed manifest against the live\n * config. Any drift — missing, added, type or needs change — throws\n * `VIBE_STALE_CLIENT` at construction instead of an untyped (or missing)\n * property surprise at query time.\n */\nexport function assertComputedManifest(params: {\n manifest: readonly ComputedManifestEntry[];\n specs: ComputedConfig | undefined;\n}): void {\n const { manifest } = params;\n const specs = params.specs ?? {};\n\n const live = new Map<string, { readonly type: string; readonly needs: readonly string[] }>();\n for (const [model, fields] of Object.entries(specs)) {\n for (const [field, spec] of Object.entries(fields)) {\n live.set(`${model}.${field}`, { type: spec.type, needs: spec.needs });\n }\n }\n\n const problems: string[] = [];\n for (const baked of manifest) {\n const key = `${baked.model}.${baked.field}`;\n const current = live.get(key);\n if (current === undefined) {\n problems.push(`\"${key}\" was baked into the client but is missing from the computed config`);\n continue;\n }\n if (current.type !== baked.type) {\n problems.push(`\"${key}\" type changed (generated ${JSON.stringify(baked.type)}, live ${JSON.stringify(current.type)})`);\n } else if (!sameNeeds(current.needs, baked.needs)) {\n problems.push(`\"${key}\" needs changed since generate`);\n }\n live.delete(key);\n }\n for (const key of live.keys()) {\n problems.push(`\"${key}\" is configured but missing from the generated client`);\n }\n\n if (problems.length > 0) {\n throw new VibeError({\n code: \"VIBE_STALE_CLIENT\",\n message: `computed-field config changed since generate; run vibeorm generate — ${problems.join(\"; \")}`,\n meta: { problems },\n });\n }\n}\n\n// ─── Application ──────────────────────────────────────────────────\n\n/**\n * Attach the named computed fields to each row, in place. Runs BEFORE\n * projection narrows rows to `resultFields`, so `needs` scalars are present\n * even when the caller did not select them. `names` is always a concrete list\n * (the builder resolves \"all\" at plan time); `null` means nothing to do.\n */\nexport function applyComputedFields(params: {\n model: ModelMeta;\n rows: readonly Record<string, unknown>[];\n names: readonly string[] | null;\n}): void {\n const { model, rows, names } = params;\n const specs = model.computed;\n if (names === null || names.length === 0 || specs === null || rows.length === 0) return;\n for (const row of rows) {\n for (const name of names) {\n const spec = specs.get(name);\n if (spec === undefined) continue;\n row[name] = spec.compute(row);\n }\n }\n}\n",
12
23
  "/**\n * Runtime side of the extension framework (extensions.md §3).\n *\n * The runtime stays extension-AGNOSTIC: it never imports an extension. What it\n * offers is plumbing —\n * - mounts: generate-time baked surfaces (D9) attached to model delegates\n * and the client on every build, transaction clients included;\n * - a manifest check throwing VIBE_STALE_CLIENT before the first query;\n * - where-operator injection (`{ name: { similarTo: … } }`) compiled through\n * the extension's sql plane into bound fragments;\n * - onConnect session hooks run by `$connect()`.\n */\n\nimport { VibeError, extensionManifestEntry } from \"@vibeorm/schema\";\nimport type {\n Dialect,\n ExtensionManifestEntry,\n Provider,\n VibeExtension,\n} from \"@vibeorm/schema\";\nimport type { SqlDialect, SqlExpr } from \"@vibeorm/sql\";\nimport type { ExtensionOperatorFn, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Mounts ───────────────────────────────────────────────────────\n\n/** What a mounted extension surface gets to work with. */\nexport type ExtensionMountContext = {\n readonly extension: string;\n readonly dialect: SqlDialect;\n readonly provider: Provider;\n readonly meta: RuntimeMeta;\n /** The mount's model, or `null` for client-scope mounts. */\n readonly model: ModelMeta | null;\n /**\n * Execute a row-returning statement on the CURRENT connection (transaction\n * clients re-mount with their tx adapter). Rows decode through the mount\n * model's codec plan; unknown columns (scores, distances) pass verbatim.\n * Reports to `$on(\"query\")` under `method`.\n */\n readonly executeRows: (params: {\n text: string;\n values: readonly unknown[];\n method?: string;\n }) => Promise<Record<string, unknown>[]>;\n /** Compile a user `where` tree for AND-ing into extension SQL. */\n readonly compileWhere: (params: {\n where: Record<string, unknown>;\n model?: string;\n qualify?: string;\n }) => SqlExpr | undefined;\n};\n\n/**\n * One baked client surface: the generated client passes these to\n * `createClient` and the runtime attaches `create(ctx)`'s result under\n * `property` on the model delegate (scope \"model\") or the client (scope\n * \"client\", `$`-prefixed) — on every client build, so `$transaction` callbacks\n * see the same surface.\n */\nexport type ClientExtensionMount = {\n readonly extension: string;\n readonly scope: \"model\" | \"client\";\n /** Model name (IR name) — required for scope \"model\". */\n readonly model?: string;\n readonly property: string;\n readonly create: (ctx: ExtensionMountContext) => unknown;\n};\n\n/** Extension wiring accepted by `createClient`. */\nexport type ClientExtensionsOptions = {\n /**\n * Live extension instances (`[search(), trgm({ … })]`). Provide the where-\n * operator and onConnect planes, and are verified against `manifest`.\n */\n readonly instances?: readonly VibeExtension[];\n /** Manifest baked by the generator — presence turns on the staleness check. */\n readonly manifest?: readonly ExtensionManifestEntry[];\n /** Baked surface mounts emitted by the generator. */\n readonly mounts?: readonly ClientExtensionMount[];\n};\n\n// ─── Staleness (extensions.md §3.2) ───────────────────────────────\n\n/**\n * Compare the generated client's baked manifest against the live extension\n * instances. Any drift — missing, added, version or options change — throws\n * `VIBE_STALE_CLIENT` at construction instead of undefined-method surprises\n * at query time.\n */\nexport function assertExtensionManifest(params: {\n manifest: readonly ExtensionManifestEntry[];\n instances: readonly VibeExtension[] | undefined;\n}): void {\n const { manifest } = params;\n const instances = params.instances ?? [];\n const live = new Map(\n instances.map((extension) => [extension.name, extensionManifestEntry({ extension })]),\n );\n\n const problems: string[] = [];\n for (const baked of manifest) {\n const current = live.get(baked.name);\n if (current === undefined) {\n problems.push(`\"${baked.name}\" was baked into the client but not passed to VibeClient`);\n continue;\n }\n if (current.version !== baked.version) {\n problems.push(\n `\"${baked.name}\" version changed (generated ${baked.version}, live ${current.version})`,\n );\n } else if (current.optionsHash !== baked.optionsHash) {\n problems.push(`\"${baked.name}\" options changed since generate`);\n }\n live.delete(baked.name);\n }\n for (const name of live.keys()) {\n problems.push(`\"${name}\" is configured but missing from the generated client`);\n }\n\n if (problems.length > 0) {\n throw new VibeError({\n code: \"VIBE_STALE_CLIENT\",\n message: `extension list changed since generate; run vibeorm generate — ${problems.join(\"; \")}`,\n meta: { manifest, problems },\n });\n }\n}\n\n// ─── Where operators (sql plane) ──────────────────────────────────\n\n/**\n * Index the configured extensions' where-operators, pre-bound to the dialect\n * and provider. `null` when none contribute any (the common case — keeps the\n * hot path free of an empty-map lookup).\n */\nexport function buildExtensionOperatorMap(params: {\n instances: readonly VibeExtension[];\n dialect: Dialect;\n provider: Provider;\n}): ReadonlyMap<string, ExtensionOperatorFn> | null {\n const { instances, dialect, provider } = params;\n const map = new Map<string, ExtensionOperatorFn>();\n const owner = new Map<string, string>();\n\n for (const extension of instances) {\n for (const operator of extension.sql?.whereOperators ?? []) {\n const existing = owner.get(operator.name);\n if (existing !== undefined) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `where operator \"${operator.name}\" is claimed by both \"${existing}\" and \"${extension.name}\"`,\n meta: { operator: operator.name },\n });\n }\n owner.set(operator.name, extension.name);\n map.set(operator.name, ({ column, operand, model, field }): SqlExpr => {\n const compiled = operator.compile({\n column,\n operand,\n dialect,\n provider,\n options: extension.options,\n });\n if (\"error\" in compiled) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `\"${operator.name}\" on ${model}.${field}: ${compiled.error}`,\n meta: { model, field, operator: operator.name, extension: extension.name },\n });\n }\n return { kind: \"fragment\", fragment: compiled.fragment };\n });\n }\n }\n\n return map.size === 0 ? null : map;\n}\n\n// ─── onConnect (runtime plane) ────────────────────────────────────\n\n/** A prepared onConnect hook — run by `$connect()` after the adapter connects. */\nexport type ConnectHook = (params: {\n execute: (execParams: {\n text: string;\n values?: readonly unknown[];\n }) => Promise<readonly Record<string, unknown>[]>;\n}) => Promise<void>;\n\n/** Collect the configured extensions' onConnect hooks, options pre-bound. */\nexport function buildConnectHooks(params: {\n instances: readonly VibeExtension[];\n dialect: Dialect;\n provider: Provider;\n}): readonly ConnectHook[] {\n const { instances, dialect, provider } = params;\n const hooks: ConnectHook[] = [];\n for (const extension of instances) {\n const onConnect = extension.runtime?.onConnect;\n if (onConnect === undefined) continue;\n hooks.push(({ execute }) =>\n onConnect({\n execute: (execParams) =>\n execute({\n text: execParams.text,\n ...(execParams.values === undefined ? {} : { values: execParams.values }),\n }),\n dialect,\n provider,\n options: extension.options,\n }),\n );\n }\n return hooks;\n}\n",
13
- "/**\n * Field-masking views — the v1 `db.defineView()` surface ported to v2\n * (board #11), renamed `$defineView` per v2's $-prefixed client-name rule.\n *\n * A view is a READ-ONLY scoped client over the models named in its definition.\n * Rows come back as `ViewResult` instances that expose only the definition's\n * fields; `reveal: { field: true }` makes an extra field readable as a\n * property while `JSON.stringify` still excludes it, and `$unsafe()` returns\n * everything. Relations load normally: when the related model is ALSO in the\n * definition its rows are masked recursively; when it is not, they pass\n * through untouched (v1 semantics).\n *\n * Isolated by design: this module wraps the public delegate surface\n * (`client.$models`) and never reaches into the query builder — the same SQL\n * runs, the ARGS are rewritten (definition fields become a `select`) and the\n * RESULT objects are wrapped.\n *\n * v1 → v2 deltas (documented in apps/tests/parity-fragments/views.md):\n * - `defineView` → `$defineView`; errors are `VibeError` codes, not strings.\n * - The definition is validated eagerly (unknown model / unknown field /\n * empty field set throw `VIBE_VALIDATION` at definition time).\n * - Write verbs exist on the view delegate but throw `VIBE_VALIDATION`\n * (mirroring v2's database-view read-only contract) — v1 left them\n * `undefined`.\n * - A nested `include` under a masked relation stays masked (v1 dropped the\n * restriction one level down); `omit` on a view query is refused loudly\n * (v1 stripped it silently).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ClientRow, ModelDelegate } from \"./client.ts\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Public types ─────────────────────────────────────────────────\n\n/**\n * A view definition: client-name model keys → the set of visible fields.\n * Example: `{ user: { id: true, name: true }, post: { id: true, title: true } }`.\n */\nexport type ViewDefinition = Record<string, Record<string, boolean | undefined>>;\n\n/** The read surface of one model under a view — writes throw `VIBE_VALIDATION`. */\nexport type ViewModelDelegate = {\n readonly findMany: (args?: ClientRow) => Promise<ViewResult[]>;\n readonly findFirst: (args?: ClientRow) => Promise<ViewResult | null>;\n readonly findFirstOrThrow: (args?: ClientRow) => Promise<ViewResult>;\n readonly findUnique: (args: ClientRow) => Promise<ViewResult | null>;\n readonly findUniqueOrThrow: (args: ClientRow) => Promise<ViewResult>;\n readonly count: (args?: ClientRow) => Promise<number | Record<string, number>>;\n readonly aggregate: (args: ClientRow) => Promise<ClientRow>;\n readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;\n} & Record<string, unknown>;\n\n/** What `$defineView` returns at the runtime level — the generated d.ts narrows it. */\nexport type ViewClientShape = Record<string, ViewModelDelegate>;\n\n/** The `$defineView` client method (runtime-level shape). */\nexport type DefineViewFn = (options: {\n readonly name: string;\n readonly definition: ViewDefinition;\n}) => ViewClientShape;\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n// ─── ViewResult ───────────────────────────────────────────────────\n\n/**\n * A masked row: visible + revealed fields are enumerable own properties,\n * `toJSON()` (used by `JSON.stringify`) drops revealed fields recursively,\n * `$unsafe()` returns a plain object with everything. Class methods are\n * prototype members, so they never show up in `Object.keys` / spread.\n */\nexport class ViewResult {\n /** Dynamic property access for view/revealed/relation fields. */\n [key: string]: unknown;\n\n /** @internal Field names revealed on this row (non-enumerable). */\n declare readonly _revealed: ReadonlySet<string>;\n\n constructor(params: {\n record: Readonly<Record<string, unknown>>;\n /** Every key to expose as a property (fields + revealed + relations). */\n expose: ReadonlySet<string>;\n revealed: ReadonlySet<string>;\n }) {\n const { record, expose, revealed } = params;\n Object.defineProperty(this, \"_revealed\", {\n value: revealed,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n for (const key of expose) {\n if (key in record) {\n this[key] = record[key];\n }\n }\n }\n\n /** Plain object WITHOUT revealed fields (what `JSON.stringify` sees), recursively. */\n toJSON(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(this)) {\n if (this._revealed.has(key)) continue;\n const value = this[key];\n if (value instanceof ViewResult) {\n out[key] = value.toJSON();\n } else if (Array.isArray(value)) {\n out[key] = value.map((item) => (item instanceof ViewResult ? item.toJSON() : item));\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n\n /** Plain object with ALL fields (view + revealed), recursively — the escape hatch. */\n $unsafe(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(this)) {\n const value = this[key];\n if (value instanceof ViewResult) {\n out[key] = value.$unsafe();\n } else if (Array.isArray(value)) {\n out[key] = value.map((item) => (item instanceof ViewResult ? item.$unsafe() : item));\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n}\n\n// ─── Definition resolution ────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** One model's resolved mask: the model + its visible scalar field names. */\ntype ViewMask = {\n readonly model: ModelMeta;\n readonly fields: ReadonlySet<string>;\n};\n\n/** Definition entries resolved and validated, keyed by the model's CLIENT name. */\ntype ResolvedDefinition = ReadonlyMap<string, ViewMask>;\n\nfunction resolveDefinition(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ViewDefinition;\n}): ResolvedDefinition {\n const { meta, name, definition } = params;\n if (!isPlainObject(definition)) {\n throw validationError({\n message: `view \"${name}\": definition must be an object of { modelKey: { field: true } }`,\n meta: { view: name },\n });\n }\n const resolved = new Map<string, ViewMask>();\n for (const [key, fieldSpec] of Object.entries(definition)) {\n if (fieldSpec === undefined) continue;\n const model = meta.modelByName.get(key);\n if (model === undefined) {\n throw validationError({\n message: `view \"${name}\": unknown model \"${key}\" in the definition`,\n meta: { view: name, model: key },\n });\n }\n if (!isPlainObject(fieldSpec)) {\n throw validationError({\n message: `view \"${name}\": definition.${key} must be an object of { field: true }`,\n meta: { view: name, model: model.name },\n });\n }\n const fields = new Set<string>();\n for (const [field, flag] of Object.entries(fieldSpec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `view \"${name}\": definition.${key}.${field} must be true`,\n meta: { view: name, model: model.name, field },\n });\n }\n if (!model.fieldByName.has(field)) {\n const isRelation = model.relationByName.has(field);\n throw validationError({\n message: isRelation\n ? `view \"${name}\": \"${field}\" on model \"${model.name}\" is a relation — a view definition lists scalar fields; relations are restricted through the related model's own entry`\n : `view \"${name}\": unknown field \"${field}\" on model \"${model.name}\"`,\n meta: { view: name, model: model.name, field },\n });\n }\n fields.add(field);\n }\n if (fields.size === 0) {\n throw validationError({\n message: `view \"${name}\": definition.${key} exposes no fields`,\n meta: { view: name, model: model.name },\n });\n }\n resolved.set(model.clientName, { model, fields });\n }\n if (resolved.size === 0) {\n throw validationError({\n message: `view \"${name}\": the definition names no models`,\n meta: { view: name },\n });\n }\n return resolved;\n}\n\n// ─── Args merging ─────────────────────────────────────────────────\n\n/** Per-level wrap instructions produced alongside the merged args. */\ntype WrapPlan = {\n /** Scalar keys (plus `_count` when requested) to expose on the ViewResult. */\n readonly expose: ReadonlySet<string>;\n readonly revealed: ReadonlySet<string>;\n /** Included relations: a nested plan when masked, `null` for passthrough. */\n readonly relations: ReadonlyMap<string, WrapPlan | null>;\n};\n\n/** Top-level args the merge passes through untouched. */\nconst PASSTHROUGH_ARG_KEYS: readonly string[] = [\n \"where\",\n \"orderBy\",\n \"take\",\n \"skip\",\n \"cursor\",\n \"distinct\",\n \"relationStrategy\",\n];\n\nfunction revealSet(params: {\n name: string;\n mask: ViewMask;\n reveal: unknown;\n}): Set<string> {\n const { name, mask, reveal } = params;\n const revealed = new Set<string>();\n if (reveal === undefined) return revealed;\n if (!isPlainObject(reveal)) {\n throw validationError({\n message: `view \"${name}\": reveal must be an object of { field: true }`,\n meta: { view: name, model: mask.model.name },\n });\n }\n for (const [field, flag] of Object.entries(reveal)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `view \"${name}\": reveal.${field} must be true or false`,\n meta: { view: name, model: mask.model.name, field },\n });\n }\n if (!mask.model.fieldByName.has(field)) {\n throw validationError({\n message: `view \"${name}\": cannot reveal \"${field}\" — not a scalar field of model \"${mask.model.name}\"`,\n meta: { view: name, model: mask.model.name, field },\n });\n }\n // Revealing a field the view already shows is a no-op, not a reveal:\n // it stays visible in JSON output.\n if (!mask.fields.has(field)) revealed.add(field);\n }\n return revealed;\n}\n\n/**\n * Merge ONE level of user args with the view mask: the definition's fields\n * become a `select` (narrowed by the user's own select, widened by `reveal`),\n * relation entries from `include`/`select` are restricted recursively when\n * their target model is in the definition, and everything else passes through.\n */\nfunction mergeLevel(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ResolvedDefinition;\n mask: ViewMask;\n args: Record<string, unknown>;\n}): { merged: Record<string, unknown>; plan: WrapPlan } {\n const { meta, name, definition, mask, args } = params;\n const model = mask.model;\n\n if (args.omit !== undefined) {\n throw validationError({\n message: `view \"${name}\": omit is not available on a view query — the definition already restricts ${model.name}'s fields`,\n meta: { view: name, model: model.name },\n });\n }\n\n const revealed = revealSet({ name, mask, reveal: args.reveal });\n\n // Scalar half of the user's select (relation keys are handled below).\n let scalars: Set<string>;\n const userSelect = args.select;\n if (userSelect !== undefined && !isPlainObject(userSelect)) {\n throw validationError({\n message: `view \"${name}\": select must be an object`,\n meta: { view: name, model: model.name },\n });\n }\n if (isPlainObject(userSelect)) {\n scalars = new Set<string>();\n for (const [key, flag] of Object.entries(userSelect)) {\n if (flag === false || flag === undefined) continue;\n // v1 semantics: select narrows WITHIN the view — outside keys are dropped.\n if (model.fieldByName.has(key) && mask.fields.has(key)) scalars.add(key);\n }\n if (scalars.size === 0) scalars = new Set(mask.fields);\n } else {\n scalars = new Set(mask.fields);\n }\n\n // Relation specs come from include and select alike (include wins on clash).\n const relationSpecs = new Map<string, unknown>();\n let countSpec: unknown;\n const collectRelations = (source: unknown, argName: string): void => {\n if (source === undefined) return;\n if (!isPlainObject(source)) {\n throw validationError({\n message: `view \"${name}\": ${argName} must be an object`,\n meta: { view: name, model: model.name },\n });\n }\n for (const [key, spec] of Object.entries(source)) {\n if (spec === false || spec === undefined) continue;\n if (key === \"_count\") {\n countSpec = spec;\n continue;\n }\n if (model.relationByName.has(key)) relationSpecs.set(key, spec);\n else if (argName === \"include\") {\n throw validationError({\n message: `view \"${name}\": unknown relation \"${key}\" on model \"${model.name}\" in include`,\n meta: { view: name, model: model.name, relation: key },\n });\n }\n }\n };\n collectRelations(args.select, \"select\");\n collectRelations(args.include, \"include\");\n\n // Effective select: scalars + revealed + relation specs (+ _count).\n const select: Record<string, unknown> = {};\n for (const key of scalars) select[key] = true;\n for (const key of revealed) select[key] = true;\n\n const relationPlans = new Map<string, WrapPlan | null>();\n for (const [relationName, spec] of relationSpecs) {\n const relation = model.relationByName.get(relationName);\n if (relation === undefined) continue; // collectRelations guaranteed presence\n const target = meta.modelByName.get(relation.targetModel);\n const targetMask = target === undefined ? undefined : definition.get(target.clientName);\n if (targetMask === undefined) {\n // Related model not in the definition — pass through unrestricted (v1).\n select[relationName] = spec;\n relationPlans.set(relationName, null);\n continue;\n }\n if (spec === true) {\n const child = mergeLevel({ meta, name, definition, mask: targetMask, args: {} });\n select[relationName] = child.merged;\n relationPlans.set(relationName, child.plan);\n continue;\n }\n if (!isPlainObject(spec)) {\n throw validationError({\n message: `view \"${name}\": include.${relationName} must be true or an object`,\n meta: { view: name, model: model.name, relation: relationName },\n });\n }\n const child = mergeLevel({ meta, name, definition, mask: targetMask, args: spec });\n select[relationName] = child.merged;\n relationPlans.set(relationName, child.plan);\n }\n\n const expose = new Set<string>(scalars);\n if (countSpec !== undefined) {\n select._count = countSpec;\n expose.add(\"_count\");\n }\n\n const merged: Record<string, unknown> = {};\n for (const key of PASSTHROUGH_ARG_KEYS) {\n if (args[key] !== undefined) merged[key] = args[key];\n }\n merged.select = select;\n\n return {\n merged,\n plan: { expose, revealed, relations: relationPlans },\n };\n}\n\n// ─── Result wrapping ──────────────────────────────────────────────\n\nfunction wrapRows(params: { rows: readonly ClientRow[]; plan: WrapPlan }): ViewResult[] {\n const { rows, plan } = params;\n return rows.map((row) => {\n const record: Record<string, unknown> = { ...row };\n const expose = new Set(plan.expose);\n for (const [relationName, childPlan] of plan.relations) {\n expose.add(relationName);\n if (childPlan === null) continue; // passthrough relation — leave rows as-is\n const value = record[relationName];\n if (Array.isArray(value)) {\n record[relationName] = wrapRows({ rows: value as ClientRow[], plan: childPlan });\n } else if (isPlainObject(value)) {\n record[relationName] = wrapRows({ rows: [value], plan: childPlan })[0];\n }\n }\n for (const key of plan.revealed) expose.add(key);\n return new ViewResult({ record, expose, revealed: plan.revealed });\n });\n}\n\n// ─── View delegates ───────────────────────────────────────────────\n\nconst VIEW_WRITE_METHODS: readonly string[] = [\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"delete\",\n \"deleteMany\",\n];\n\nfunction createViewDelegate(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ResolvedDefinition;\n mask: ViewMask;\n delegate: ModelDelegate;\n}): ViewModelDelegate {\n const { meta, name, definition, mask, delegate } = params;\n\n const merge = (args: ClientRow | undefined): { merged: Record<string, unknown>; plan: WrapPlan } => {\n const raw = args ?? {};\n if (!isPlainObject(raw)) {\n throw validationError({\n message: `view \"${name}\": query args must be an object`,\n meta: { view: name, model: mask.model.name },\n });\n }\n return mergeLevel({ meta, name, definition, mask, args: raw });\n };\n\n const wrapOne = (row: ClientRow | null, plan: WrapPlan): ViewResult | null => {\n if (row === null) return null;\n return wrapRows({ rows: [row], plan })[0] ?? null;\n };\n\n const view: Record<string, unknown> = {\n findMany: async (args?: ClientRow): Promise<ViewResult[]> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: await delegate.findMany(merged), plan });\n },\n findFirst: async (args?: ClientRow): Promise<ViewResult | null> => {\n const { merged, plan } = merge(args);\n return wrapOne(await delegate.findFirst(merged), plan);\n },\n findFirstOrThrow: async (args?: ClientRow): Promise<ViewResult> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: [await delegate.findFirstOrThrow(merged)], plan })[0] as ViewResult;\n },\n findUnique: async (args: ClientRow): Promise<ViewResult | null> => {\n const { merged, plan } = merge(args);\n return wrapOne(await delegate.findUnique(merged), plan);\n },\n findUniqueOrThrow: async (args: ClientRow): Promise<ViewResult> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: [await delegate.findUniqueOrThrow(merged)], plan })[0] as ViewResult;\n },\n // Aggregations pass through untouched (v1): they return computed values,\n // not rows, so the mask has nothing to hide.\n count: (args?: ClientRow): Promise<number | Record<string, number>> => delegate.count(args),\n aggregate: (args: ClientRow): Promise<ClientRow> => delegate.aggregate(args),\n groupBy: (args: ClientRow): Promise<ClientRow[]> => delegate.groupBy(args),\n };\n\n for (const method of VIEW_WRITE_METHODS) {\n view[method] = (): never => {\n throw validationError({\n message: `view \"${name}\" is read-only — ${method}() is not available on a field-masking view; write through the base client instead`,\n meta: { view: name, model: mask.model.name, method },\n });\n };\n }\n\n return view as ViewModelDelegate;\n}\n\n// ─── Entry points ─────────────────────────────────────────────────\n\n/**\n * Build a field-masking view client over an existing client's delegates.\n *\n * @throws VibeError `VIBE_VALIDATION` on an invalid definition (unknown model,\n * unknown or relation field, empty field set).\n */\nexport function createView(params: {\n meta: RuntimeMeta;\n models: Readonly<Record<string, ModelDelegate>>;\n name: string;\n definition: ViewDefinition;\n}): ViewClientShape {\n const { meta, models, name, definition } = params;\n const resolved = resolveDefinition({ meta, name, definition });\n const view: Record<string, ViewModelDelegate> = {};\n for (const [clientName, mask] of resolved) {\n const delegate = models[clientName];\n if (delegate === undefined) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `view \"${name}\": no delegate for model \"${mask.model.name}\"`,\n meta: { view: name, model: mask.model.name },\n });\n }\n view[clientName] = createViewDelegate({ meta, name, definition: resolved, mask, delegate });\n }\n return view;\n}\n\n/**\n * Attach `$defineView` to a built client (called by `buildClient`; transaction\n * clients get their own attachment because `$transaction` rebuilds the client).\n */\nexport function attachDefineView(params: {\n client: object;\n meta: RuntimeMeta;\n models: Readonly<Record<string, ModelDelegate>>;\n}): void {\n const { client, meta, models } = params;\n const value: DefineViewFn = (options) =>\n createView({ meta, models, name: options.name, definition: options.definition });\n Object.defineProperty(client, \"$defineView\", { value, enumerable: true });\n}\n",
14
- "/**\n * The dynamic client: model delegates over a `DatabaseAdapter`, built from the\n * Schema IR at runtime.\n *\n * This is the engine the generated client wraps in P2 proper. It is deliberately\n * untyped-per-model — the generator emits a `.d.ts` that declares each delegate\n * with precise argument and result types, and casts to it. Nothing about the\n * shape of a query lives here: `query-builder.ts` builds statements,\n * `@vibeorm/sql` renders them, `codecs.ts` moves values across the wire,\n * `relation-loader.ts` attaches included relations, `nested-writes.ts`\n * orchestrates relation verbs inside create/update data.\n *\n * Execution split:\n * - row-returning statements use `adapter.execute` (the cached hot path),\n * - count-returning mutations (createMany/updateMany/deleteMany) use\n * `adapter.executeUnsafe`, the only place the frozen adapter contract\n * surfaces `affectedRows`.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect, SchemaIR } from \"@vibeorm/schema\";\nimport { ParamCollector, getSqlDialect } from \"@vibeorm/sql\";\nimport type { SelectStatement, SqlDialect, SqlStatement } from \"@vibeorm/sql\";\nimport type { DatabaseAdapter, TransactionOptions } from \"./adapter.ts\";\nimport { decodeAggregateValue, materializeRows } from \"./codecs.ts\";\nimport { StatementRenderCache, renderStatementCached } from \"./render-cache.ts\";\nimport { buildRuntimeMeta, getModelMeta } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { COUNT_ALIAS, buildQuery, resolveResultShape, upsertUsesNativeStatement } from \"./query-builder.ts\";\nimport type { AggregateSpec, QueryMethod, QueryPlan, RelationStrategy, ResortKey } from \"./query-builder.ts\";\nimport { attachLateralRelations, attachRelations } from \"./relation-loader.ts\";\nimport type { RelationExecutor } from \"./relation-loader.ts\";\nimport { createWithNested, hasNestedWrites, updateWithNested } from \"./nested-writes.ts\";\nimport type { StatementRunner, WriteContext } from \"./nested-writes.ts\";\nimport type { RelationSelection } from \"./relation-plan.ts\";\nimport {\n assertExtensionManifest,\n buildConnectHooks,\n buildExtensionOperatorMap,\n} from \"./extensions.ts\";\nimport type {\n ClientExtensionMount,\n ClientExtensionsOptions,\n ConnectHook,\n ExtensionMountContext,\n} from \"./extensions.ts\";\nimport { compileWhere } from \"./query-builder.ts\";\nimport { attachDefineView } from \"./views.ts\";\nimport type { DefineViewFn } from \"./views.ts\";\n\n// ─── Public types ─────────────────────────────────────────────────\n\n/** One executed statement, reported to `ClientOptions.onQuery`. */\nexport type QueryEvent = {\n /** Model name, or `null` for raw queries. */\n readonly model: string | null;\n /** ORM method, or `\"$queryRaw\"` / `\"$executeRaw\"`. */\n readonly method: string;\n readonly text: string;\n readonly values: readonly unknown[];\n readonly durationMs: number;\n};\n\nexport type ClientOptions = {\n /** Called after every statement — logging, tracing, test assertions. */\n readonly onQuery?: (event: QueryEvent) => void;\n /**\n * Default relation-loading strategy: `\"query\"` (batched WHERE-IN, portable,\n * the default) or `\"join\"` (LATERAL + JSON aggregation, postgres/pglite\n * only). A per-query `relationStrategy` argument overrides it.\n */\n readonly relationStrategy?: RelationStrategy;\n /**\n * Append the primary key to ORDER BY when a find has no explicit orderBy\n * (default false) — deterministic row order at the cost of a sort. v1 parity.\n */\n readonly defaultOrderByPk?: boolean;\n /**\n * Append the primary key as a tie-breaker to `distinct` ordering (default\n * TRUE) — without it, WHICH row represents each distinct key is unspecified.\n * v1 parity.\n */\n readonly distinctOrderByPk?: boolean;\n};\n\n/** Rows are plain objects keyed by field name; the generated client narrows them. */\nexport type ClientRow = Record<string, unknown>;\n\n/** Result of the count-returning batch methods. */\nexport type BatchResult = { readonly count: number };\n\n/**\n * A model's methods. Arguments and results are intentionally broad here — the\n * generated `.d.ts` replaces this surface with precise per-model types, and\n * keeping the runtime free of inference is what holds the type-cost budget\n * (constitution rule 2).\n */\nexport type ModelDelegate = {\n readonly findMany: (args?: ClientRow) => Promise<ClientRow[]>;\n readonly findFirst: (args?: ClientRow) => Promise<ClientRow | null>;\n readonly findFirstOrThrow: (args?: ClientRow) => Promise<ClientRow>;\n readonly findUnique: (args: ClientRow) => Promise<ClientRow | null>;\n readonly findUniqueOrThrow: (args: ClientRow) => Promise<ClientRow>;\n readonly create: (args: ClientRow) => Promise<ClientRow>;\n readonly createMany: (args: ClientRow) => Promise<BatchResult>;\n readonly createManyAndReturn: (args: ClientRow) => Promise<ClientRow[]>;\n readonly update: (args: ClientRow) => Promise<ClientRow>;\n readonly updateMany: (args: ClientRow) => Promise<BatchResult>;\n readonly upsert: (args: ClientRow) => Promise<ClientRow>;\n readonly delete: (args: ClientRow) => Promise<ClientRow>;\n readonly deleteMany: (args?: ClientRow) => Promise<BatchResult>;\n /** Plain form returns a number; `{ select: { _all, field } }` returns per-key counts. */\n readonly count: (args?: ClientRow) => Promise<number | Record<string, number>>;\n readonly aggregate: (args: ClientRow) => Promise<ClientRow>;\n readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;\n};\n\n/**\n * The client. Delegates are also attached as own properties under their\n * camelCase names (`client.user.findMany()`); the type surfaces them through\n * `$models` because a plain index signature would erase the `$`-methods.\n * Model names can never collide with those: every reserved client name is\n * `$`-prefixed (see `RESERVED_CLIENT_NAMES` in @vibeorm/schema).\n */\nexport type DynamicClient = {\n /** Delegates keyed by BOTH camelCase client name and model name. */\n readonly $models: Readonly<Record<string, ModelDelegate>>;\n /**\n * Subscribe to client events (`\"query\"` fires after every statement, with\n * the same payload as `ClientOptions.onQuery` — both fire). Returns an\n * unsubscribe function. Transaction clients share the parent's listeners.\n */\n readonly $on: (event: \"query\", listener: (event: QueryEvent) => void) => () => void;\n /**\n * Run work in ONE transaction. Callback form: `fn` receives a transaction\n * client; everything it runs rides the same BEGIN/COMMIT and a throw rolls\n * back. Array form (Prisma parity): UN-AWAITED delegate calls — delegate\n * methods return LAZY query promises that only dispatch on await — run\n * SEQUENTIALLY inside one transaction, results returned positionally.\n */\n readonly $transaction: {\n <T>(fn: (tx: DynamicClient) => Promise<T>, options?: TransactionOptions): Promise<T>;\n <T extends readonly unknown[]>(\n operations: readonly [...T],\n options?: TransactionOptions,\n ): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }>;\n };\n /** Tagged template — interpolations become bound parameters, never text. */\n readonly $queryRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<ClientRow[]>;\n /** Tagged template returning the affected-row count. */\n readonly $executeRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<number>;\n readonly $queryRawUnsafe: (text: string, ...values: unknown[]) => Promise<ClientRow[]>;\n readonly $executeRawUnsafe: (text: string, ...values: unknown[]) => Promise<number>;\n readonly $connect: () => Promise<void>;\n readonly $disconnect: () => Promise<void>;\n /**\n * Field-masking views (v1 `defineView` parity, board #11) — a read-only\n * scoped client restricted to the definition's models and fields. Attached\n * by `attachDefineView` after construction (hence optional in the type);\n * it is always present on a built client, transaction clients included.\n */\n readonly $defineView?: DefineViewFn;\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction notFound(params: { model: string; method: QueryMethod | string }): VibeError {\n const { model, method } = params;\n return new VibeError({\n code: \"VIBE_NOT_FOUND\",\n message: `no ${model} record matched the where clause of ${method}()`,\n meta: { model, method },\n });\n}\n\nfunction viewIsReadOnly(params: { model: string; method: string }): VibeError {\n const { model, method } = params;\n return new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `${model} is a view — ${method}() is not available on views (they are read-only); write to the underlying table instead`,\n meta: { model, method },\n });\n}\n\n// ─── Parameter binding ────────────────────────────────────────\n\n/**\n * ORM-path binding: after the codec table has encoded every parameter, the only\n * bare JS arrays left in `rendered.values` are scalar-list params — `inArray`\n * filters and list-column writes (`Json.encode` stringifies, Bytes are\n * `Uint8Array`). Their wire form is the ADAPTER's business (`= ANY($n)` needs a\n * PG array literal on bun:sql, a tagged passthrough on pg/pglite), so each one\n * is handed to `adapter.formatArrayParam` here. Reviewed as fix F1 — the raw\n * paths (`$queryRaw*`) deliberately do NOT bind: drivers take raw arrays there\n * (LEARNINGS: ORM-path vs raw-path array params differ).\n */\nfunction bindValues(params: { adapter: DatabaseAdapter; values: unknown[] }): unknown[] {\n const { adapter, values } = params;\n return values.map((value) => (Array.isArray(value) ? adapter.formatArrayParam(value) : value));\n}\n\n// ─── Row shaping ──────────────────────────────────────────────────\n\n/**\n * Narrow a row to the fields the caller selected (scalars, relation names,\n * `_count`). Mutations RETURNING the primary key and relation loading fetching\n * stitch keys both hand back more than was asked for.\n */\nfunction project(params: { row: ClientRow; fields: readonly string[] | null }): ClientRow {\n const { row, fields } = params;\n if (fields === null) return row;\n const out: ClientRow = {};\n for (const field of fields) out[field] = row[field];\n return out;\n}\n\n/**\n * The N1 re-sort comparator (`QueryPlan.resortBy`): the user's orderBy over\n * DECODED rows, with `nulls` and Decimal ranking resolved at build time to\n * mirror what the SQL order would have produced (B4: Decimal ranks\n * numerically — the SQL side ordered a number).\n */\nfunction resortComparator(keys: readonly ResortKey[]): (a: ClientRow, b: ClientRow) => number {\n const rank = (value: unknown): number | bigint | string => {\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.getTime();\n return value as number | bigint | string;\n };\n return (a, b) => {\n for (const key of keys) {\n const left = a[key.field];\n const right = b[key.field];\n const leftNull = left === null || left === undefined;\n const rightNull = right === null || right === undefined;\n if (leftNull || rightNull) {\n if (leftNull && rightNull) continue;\n return leftNull === (key.nulls === \"first\") ? -1 : 1;\n }\n const rankLeft = key.decimal ? Number(left) : rank(left);\n const rankRight = key.decimal ? Number(right) : rank(right);\n if (rankLeft < rankRight) return key.direction === \"asc\" ? -1 : 1;\n if (rankLeft > rankRight) return key.direction === \"asc\" ? 1 : -1;\n }\n return 0;\n };\n}\n\n/**\n * Client-side leg of the find pipeline, in plan order: the negative-take\n * re-reverse, then the N1 distinct re-sort (the user's orderBy restored over\n * the deduplicated rows — every dialect: DISTINCT ON and the ROW_NUMBER\n * emulation both present rows grouped by the distinct key). The two never\n * combine — distinct refuses a negative take at build time.\n */\nfunction shapeRows(params: { plan: QueryPlan; rows: ClientRow[] }): ClientRow[] {\n const { plan, rows } = params;\n let out = rows;\n if (plan.reverseRows) out = [...out].reverse();\n if (plan.resortBy !== null && plan.resortBy.length > 0) {\n out = [...out].sort(resortComparator(plan.resortBy));\n }\n return out;\n}\n\n// ─── Aggregate result assembly ──────────────────────────────\n\nfunction fieldOf(params: { model: ModelMeta; name: string | null }): FieldMeta | null {\n const { model, name } = params;\n if (name === null) return null;\n return model.fieldByName.get(name) ?? null;\n}\n\n/** `{ _count: 3 | {…}, _avg: {…}, … }` from one aggregate row, by construction. */\nfunction assembleAggregates(params: {\n engine: Engine;\n model: ModelMeta;\n spec: AggregateSpec;\n row: ClientRow;\n into: ClientRow;\n}): ClientRow {\n const { engine, model, spec, row, into } = params;\n for (const selection of spec.selections) {\n const value = decodeAggregateValue({\n dialect: engine.dialect.name,\n key: selection.key,\n field: fieldOf({ model, name: selection.field }),\n value: row[selection.alias],\n });\n if (selection.key === \"_count\" && spec.countShorthand) {\n into._count = value;\n continue;\n }\n const bucket = (into[selection.key] as Record<string, unknown> | undefined) ?? {};\n bucket[selection.field ?? \"_all\"] = value;\n into[selection.key] = bucket;\n }\n return into;\n}\n\n// ─── Engine ───────────────────────────────────────────────────────\n\ntype Engine = {\n readonly meta: RuntimeMeta;\n readonly adapter: DatabaseAdapter;\n readonly dialect: SqlDialect;\n readonly options: ClientOptions;\n /** `$on(\"query\")` subscribers — one shared set across transaction clients. */\n readonly listeners: Set<(event: QueryEvent) => void>;\n /** Compiled-query cache (§9) — shape-keyed SQL texts, shared across transaction clients. */\n readonly renderCache: StatementRenderCache;\n /** Baked extension surface mounts (D9) — re-attached on every client build. */\n readonly extensionMounts?: readonly ClientExtensionMount[];\n /** Extension onConnect hooks — run by `$connect()`. */\n readonly connectHooks?: readonly ConnectHook[];\n};\n\nfunction report(params: {\n engine: Engine;\n model: string | null;\n method: string;\n text: string;\n values: readonly unknown[];\n started: number;\n}): void {\n const { engine, model, method, text, values, started } = params;\n const onQuery = engine.options.onQuery;\n if (onQuery === undefined && engine.listeners.size === 0) return;\n const event: QueryEvent = { model, method, text, values, durationMs: performance.now() - started };\n onQuery?.(event);\n for (const listener of engine.listeners) listener(event);\n}\n\n// ─── Lazy query promises (array $transaction) ─────────────────\n\n/** A claimed array-$transaction operation (see QueryPromise.claim). */\ntype ClaimedOperation = {\n readonly start: (target: Engine) => Promise<unknown>;\n readonly abort: (reason: unknown) => void;\n};\n\n/**\n * The promise every delegate method returns — dispatch is DEFERRED to the end\n * of the creation tick (a microtask): awaiting sooner starts it sooner, and\n * `$transaction([...])` claims still-deferred operations SYNCHRONOUSLY and\n * runs them sequentially against the transaction's own engine inside one\n * BEGIN/COMMIT. At every ordinary call site this is observably an eager\n * promise (v1's delegates were fully eager); the deferral only exists for the\n * array form, so operations must reach `$transaction` in the tick they were\n * created — later, they have already dispatched and the claim fails LOUDLY\n * (silently adopting an in-flight promise would fake atomicity, v1's flaw).\n *\n * A NATIVE Promise subclass, not a bare thenable: test matchers\n * (`expect().rejects`) and user code check `instanceof Promise`, and Bun's\n * matchers await the native state without ever calling `.then` — which is\n * also why dispatch cannot wait for a `.then` that may never come. Species is\n * pinned to the base Promise so `.then` chains produce plain promises.\n */\nclass QueryPromise<T> extends Promise<T> {\n static override get [Symbol.species](): PromiseConstructor {\n return Promise;\n }\n\n private target!: Engine;\n private dispatch!: (target: Engine) => Promise<T>;\n private settle!: { resolve: (value: T | PromiseLike<T>) => void; reject: (reason: unknown) => void };\n private started = false;\n\n /** Build a deferred operation; the constructor itself stays the native one. */\n static create<T>(params: { engine: Engine; run: (target: Engine) => Promise<T> }): QueryPromise<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason: unknown) => void;\n const instance = new QueryPromise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n instance.target = params.engine;\n instance.dispatch = params.run;\n instance.settle = { resolve, reject };\n // Auto-dispatch when the creation tick's synchronous run completes —\n // unless an array $transaction claimed the operation first.\n queueMicrotask(() => {\n instance.start();\n });\n return instance;\n }\n\n private start(): void {\n if (this.started) return;\n this.started = true;\n this.dispatch(this.target).then(this.settle.resolve, this.settle.reject);\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // `catch` and `finally` route through `then` per spec — awaiting starts\n // the dispatch immediately instead of at the microtask.\n this.start();\n return super.then(onfulfilled, onrejected);\n }\n\n /**\n * The array-$transaction entry: claim the operation SYNCHRONOUSLY (before\n * the auto-dispatch microtask can fire), receiving a starter that runs it\n * against the transaction's engine and an aborter that settles it when the\n * transaction dies before its turn — a stray await on it must reject, never\n * hang.\n */\n claim(): ClaimedOperation {\n if (this.started) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message:\n \"$transaction([...]) needs operations that have not dispatched — pass delegate calls in the same tick they are created (this one was awaited or created earlier and already executed outside the transaction)\",\n });\n }\n this.started = true;\n return {\n start: (target: Engine): Promise<unknown> => {\n const running = this.dispatch(target);\n // Settle this promise too (a caller may hold and await it), and mark\n // its rejection handled — the array runner propagates failures.\n running.then(this.settle.resolve, this.settle.reject);\n super.then(undefined, () => {});\n return running as Promise<unknown>;\n },\n abort: (reason: unknown): void => {\n this.settle.reject(reason);\n super.then(undefined, () => {});\n },\n };\n }\n}\n\n/** Render + execute a row-returning statement, decoding through the codec table. */\nasync function runRows(params: { engine: Engine; plan: QueryPlan }): Promise<ClientRow[]> {\n const { engine, plan } = params;\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: plan.statement,\n cache: engine.renderCache,\n });\n const started = performance.now();\n const rows = await engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n });\n report({\n engine,\n model: plan.model.name,\n method: plan.method,\n text: rendered.text,\n values: rendered.values,\n started,\n });\n return materializeRows({ dialect: engine.dialect.name, model: plan.model, rows, wire: engine.adapter.wire });\n}\n\n/** Execute a statement for its affected-row count (`executeUnsafe` exposes it). */\nasync function runAffected(params: { engine: Engine; plan: QueryPlan }): Promise<number> {\n const { engine, plan } = params;\n // M4/M7: a multi-statement batch (sqlite createMany groups, parameter-budget\n // chunks) runs atomically — exactly like the single statement it replaces.\n if (plan.batch !== undefined && plan.batch.length > 1) {\n const batch = plan.batch;\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n let total = 0;\n for (const statement of batch) {\n total += await runAffected({ engine: txEngine, plan: { ...plan, statement, batch: undefined } });\n }\n return total;\n });\n }\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: plan.statement,\n cache: engine.renderCache,\n });\n const started = performance.now();\n const result = await engine.adapter.executeUnsafe({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n });\n report({\n engine,\n model: plan.model.name,\n method: plan.method,\n text: rendered.text,\n values: rendered.values,\n started,\n });\n return result.affectedRows;\n}\n\nfunction plan(params: {\n engine: Engine;\n model: string;\n method: QueryMethod;\n args: ClientRow | undefined;\n}): QueryPlan {\n const { engine, model, method, args } = params;\n return buildQuery({\n meta: engine.meta,\n dialect: engine.dialect,\n model,\n method,\n args,\n ...(engine.options.relationStrategy === undefined\n ? {}\n : { defaultRelationStrategy: engine.options.relationStrategy }),\n clientOptions: {\n ...(engine.options.defaultOrderByPk === undefined\n ? {}\n : { defaultOrderByPk: engine.options.defaultOrderByPk }),\n ...(engine.options.distinctOrderByPk === undefined\n ? {}\n : { distinctOrderByPk: engine.options.distinctOrderByPk }),\n },\n });\n}\n\n/** Re-select the row a mutation touched, on dialects without RETURNING. */\nasync function refetch(params: {\n engine: Engine;\n source: QueryPlan;\n where: Readonly<Record<string, unknown>>;\n /** `SELECT … FOR UPDATE` (where the dialect has a lock clause) — the\n * read-before-write overlays lock the row they are about to write. */\n lock?: boolean;\n}): Promise<ClientRow | null> {\n const { engine, source, where } = params;\n const selectArg = source.selectArg;\n const followUp = plan({\n engine,\n model: source.model.name,\n method: \"findUnique\",\n args: selectArg === null ? { where } : { where, select: selectArg },\n });\n const locked: QueryPlan =\n params.lock === true\n ? { ...followUp, statement: { ...(followUp.statement as SelectStatement), lockForUpdate: true } }\n : followUp;\n const rows = await runRows({ engine, plan: locked });\n return rows[0] ?? null;\n}\n\n/** Shallow record equality — \"is the overlaid refetch key the same key?\". */\nfunction sameRecord(\n a: Readonly<Record<string, unknown>>,\n b: Readonly<Record<string, unknown>>,\n): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const left = a[key];\n const right = b[key];\n if (left === right) continue;\n if (left instanceof Date && right instanceof Date && left.getTime() === right.getTime()) continue;\n return false;\n }\n return true;\n}\n\n/**\n * The WHERE that identifies a freshly inserted row on a dialect without\n * RETURNING: the app-generated key when there is one, else the driver's\n * last-insert-id — which is why the DB-assigned-key path runs inside ONE\n * transaction (see `runSingleMutation`): `LAST_INSERT_ID()` is\n * connection-scoped, and only the transaction contract guarantees the INSERT\n * and the read-back share a connection.\n */\nasync function insertedKeyWhere(params: {\n engine: Engine;\n source: QueryPlan;\n}): Promise<Record<string, unknown>> {\n const { engine, source } = params;\n if (source.refetchWhere !== null) return { ...source.refetchWhere };\n\n const keyField = source.model.primaryKey[0];\n const lastInsertIdSql = engine.dialect.lastInsertIdSql;\n if (lastInsertIdSql === null || source.model.primaryKey.length !== 1 || keyField === undefined) {\n throw unsupportedCapability({\n dialect: engine.dialect.name,\n feature: `${source.method} on ${source.model.name} without RETURNING`,\n hint: \"this model's key is assigned by the database and cannot be read back on this dialect\",\n });\n }\n const started = performance.now();\n const result = await engine.adapter.executeUnsafe({ text: lastInsertIdSql });\n report({\n engine,\n model: source.model.name,\n method: source.method,\n text: lastInsertIdSql,\n values: [],\n started,\n });\n const id = result.rows[0]?.id;\n if (id === undefined || id === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `could not read back the generated key for ${source.model.name}`,\n meta: { model: source.model.name },\n });\n }\n return { [keyField.name]: id };\n}\n\n/**\n * Run a single-row mutation. On dialects with RETURNING the statement carries\n * its own result; otherwise the row is read back with a second statement — for\n * `delete` that read happens BEFORE the write, since afterwards the row is gone.\n *\n * Returns the FULL row (RETURNING includes the primary key and stitch keys);\n * the delegate narrows down to the caller's selection after relation loading.\n */\nasync function runSingleMutation(params: {\n engine: Engine;\n source: QueryPlan;\n readBeforeWrite: boolean;\n}): Promise<ClientRow> {\n const { engine, source, readBeforeWrite } = params;\n\n // Mirrors the renderer's applyReturning verdict WITHOUT rendering — the\n // native path would otherwise render twice per mutation.\n const statement = source.statement;\n const requested = statement.kind === \"select\" ? undefined : statement.returning;\n if (requested !== undefined && requested.length > 0 && engine.dialect.capabilities.returning) {\n const rows = await runRows({ engine, plan: source });\n const row = rows[0];\n if (row === undefined) throw notFound({ model: source.model.name, method: source.method });\n return row;\n }\n\n // RETURNING omitted (mysql): read the row around the write.\n const rendered = renderStatementCached({ dialect: engine.dialect, statement, cache: engine.renderCache });\n // `executeUnsafe` — the only adapter entry point that surfaces the\n // affected-row count, which the overlays below must check (M1/M2): a write\n // that matched nothing is a not-found, never \"re-select and hope\".\n const executeWrite = async (target: Engine): Promise<number> => {\n const started = performance.now();\n const result = await target.adapter.executeUnsafe({\n text: rendered.text,\n values: bindValues({ adapter: target.adapter, values: rendered.values }),\n });\n report({\n engine: target,\n model: source.model.name,\n method: source.method,\n text: rendered.text,\n values: rendered.values,\n started,\n });\n return result.affectedRows;\n };\n\n if (readBeforeWrite) {\n // delete: the read must happen BEFORE the write — and both must observe\n // ONE row: the read locks it (FOR UPDATE) inside a transaction, and a\n // DELETE that then matches nothing is a concurrent-delete not-found, not\n // a success reporting the pre-read row (M1).\n const where = source.refetchWhere;\n if (where === null) throw notFound({ model: source.model.name, method: source.method });\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n const before = await refetch({ engine: txEngine, source, where, lock: true });\n if (before === null) throw notFound({ model: source.model.name, method: source.method });\n const affected = await executeWrite(txEngine);\n if (affected === 0) throw notFound({ model: source.model.name, method: source.method });\n return before;\n });\n }\n\n if (source.refetchWhere !== null) {\n const knownWhere = source.refetchWhere;\n\n if (source.method === \"upsert\") {\n // Which arm ran is only knowable from the read-back. The write and every\n // read ride ONE transaction (the only same-connection guarantee the\n // frozen adapter interface gives). In order:\n // 1. the overlaid unique where — the UPDATE arm's row answers it, and\n // so does the INSERT arm's unless the update arm rewrites the key;\n // 2. the un-overlaid where — the INSERT arm's row always answers it\n // (the B1 gate guarantees create binds the conflict target);\n // 3. LAST_INSERT_ID() — only meaningful when the ODKU statement\n // carries the `id = LAST_INSERT_ID(id)` trick (B2): the update arm\n // then names the row it addressed even when that row was matched\n // through a DIFFERENT unique key than the where names.\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n await executeWrite(txEngine);\n const byWhere = await refetch({ engine: txEngine, source, where: knownWhere });\n if (byWhere !== null) return byWhere;\n const baseWhere = source.refetchWhereBase;\n if (baseWhere !== null && !sameRecord(baseWhere, knownWhere)) {\n const byBase = await refetch({ engine: txEngine, source, where: baseWhere });\n if (byBase !== null) return byBase;\n }\n const insertStatement = source.statement;\n const hasIdTrick =\n insertStatement.kind === \"insert\" &&\n insertStatement.onConflict !== undefined &&\n !(\"doNothing\" in insertStatement.onConflict) &&\n insertStatement.onConflict.lastInsertIdColumn !== undefined;\n if (!hasIdTrick) throw notFound({ model: source.model.name, method: source.method });\n const where = await insertedKeyWhere({ engine: txEngine, source: { ...source, refetchWhere: null } });\n const after = await refetch({ engine: txEngine, source, where });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n }\n\n if (source.method === \"update\") {\n // M2: the write and its read-back observe one row inside a transaction,\n // and a write that MATCHED no row (mysql reports matched — mysql2 sets\n // CLIENT_FOUND_ROWS) is a not-found: re-selecting by the overlaid unique\n // where could otherwise resolve a wrong, unrelated row.\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n const affected = await executeWrite(txEngine);\n if (affected === 0) throw notFound({ model: source.model.name, method: source.method });\n const after = await refetch({ engine: txEngine, source, where: knownWhere });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n }\n\n // create with an app-generated key: the key is known before the write.\n await executeWrite(engine);\n const after = await refetch({ engine, source, where: knownWhere });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n }\n\n // DB-assigned key: INSERT + LAST_INSERT_ID() + re-select must observe ONE\n // connection — the transaction contract is the only guarantee the frozen\n // adapter interface gives us (review work order #7/F5, runtime half).\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n await executeWrite(txEngine);\n const where = await insertedKeyWhere({ engine: txEngine, source });\n const after = await refetch({ engine: txEngine, source, where });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n}\n\n/**\n * The transactional find-then-write upsert — Prisma's own fallback, used\n * whenever the create data does not bind the conflict-target columns with the\n * where's values (`upsertUsesNativeStatement`, SQL review B1): a native\n * INSERT … ON CONFLICT could never fire on the addressed row there, and on\n * postgres/sqlite would silently insert a duplicate-in-spirit row while\n * mysql's ODKU could update an unrelated one.\n *\n * Probe by the unique where (locked, where the dialect has row locks), then\n * run the UPDATE arm on a hit and the CREATE arm on a miss. Both arm plans\n * build BEFORE the transaction — validation stays earliest-moment, exactly as\n * the native statement validates both arms up front. Races stay LOUD: a\n * concurrent insert after a probe miss surfaces the unique violation, a\n * concurrent delete after a probe hit surfaces not-found.\n */\nasync function runUpsertFallback(params: {\n engine: Engine;\n model: ModelMeta;\n args: ClientRow;\n}): Promise<ClientRow> {\n const { engine, model, args } = params;\n const passthrough: ClientRow = {};\n if (args.select !== undefined) passthrough.select = args.select;\n if (args.omit !== undefined) passthrough.omit = args.omit;\n if (args.include !== undefined) passthrough.include = args.include;\n\n const probeSource = plan({ engine, model: model.name, method: \"findUnique\", args: { where: args.where } });\n const probePlan: QueryPlan = {\n ...probeSource,\n statement: { ...(probeSource.statement as SelectStatement), lockForUpdate: true },\n };\n const createSource = plan({\n engine,\n model: model.name,\n method: \"create\",\n args: { ...passthrough, data: args.create },\n });\n const updateSource = plan({\n engine,\n model: model.name,\n method: \"update\",\n args: { ...passthrough, where: args.where, data: args.update },\n });\n\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n const existing = (await runRows({ engine: txEngine, plan: probePlan }))[0];\n const source = existing === undefined ? createSource : updateSource;\n return await runSingleMutation({ engine: txEngine, source, readBeforeWrite: false });\n });\n}\n\n// ─── Relation attachment + result shaping ─────────────────\n\nfunction relationExecutor(params: { engine: Engine }): RelationExecutor {\n const { engine } = params;\n return async ({ statement, model, method }) => {\n const rendered = renderStatementCached({ dialect: engine.dialect, statement, cache: engine.renderCache });\n const started = performance.now();\n const rows = await engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n });\n report({ engine, model, method, text: rendered.text, values: rendered.values, started });\n return rows;\n };\n}\n\ntype ResultShape = {\n readonly relations: RelationSelection | null;\n readonly resultFields: readonly string[] | null;\n readonly relationStrategy: RelationStrategy;\n};\n\n/** Attach relations (per the shape's strategy), then narrow to the caller's selection. */\nasync function finalizeRows(params: {\n engine: Engine;\n model: ModelMeta;\n shape: ResultShape;\n rows: ClientRow[];\n}): Promise<ClientRow[]> {\n const { engine, model, shape, rows } = params;\n if (shape.relations !== null && rows.length > 0) {\n const execute = relationExecutor({ engine });\n if (shape.relationStrategy === \"join\") {\n await attachLateralRelations({\n dialect: engine.dialect,\n meta: engine.meta,\n model,\n rows,\n selection: shape.relations,\n execute,\n wire: engine.adapter.wire,\n });\n } else {\n await attachRelations({\n dialect: engine.dialect,\n meta: engine.meta,\n model,\n rows,\n selection: shape.relations,\n execute,\n wire: engine.adapter.wire,\n });\n }\n }\n if (shape.resultFields === null) return rows;\n return rows.map((row) => project({ row, fields: shape.resultFields }));\n}\n\nasync function finalizeRow(params: {\n engine: Engine;\n model: ModelMeta;\n shape: ResultShape;\n row: ClientRow;\n}): Promise<ClientRow> {\n const { engine, model, shape, row } = params;\n const rows = await finalizeRows({ engine, model, shape, rows: [row] });\n return rows[0] as ClientRow;\n}\n\n// ─── Nested-write plumbing ────────────────────────────────────────\n\nfunction makeRunner(params: { engine: Engine }): StatementRunner {\n const { engine } = params;\n return {\n single: async ({ model, method, args }) =>\n await runSingleMutation({\n engine,\n source: plan({ engine, model, method, args }),\n readBeforeWrite: method === \"delete\",\n }),\n rows: async ({ model, method, args }) => await runRows({ engine, plan: plan({ engine, model, method, args }) }),\n affected: async ({ model, method, args }) =>\n await runAffected({ engine, plan: plan({ engine, model, method, args }) }),\n statement: async ({ statement, model, method }) => {\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: statement as SqlStatement,\n cache: engine.renderCache,\n });\n const started = performance.now();\n const rows = await engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n });\n report({ engine, model, method, text: rendered.text, values: rendered.values, started });\n return rows;\n },\n };\n}\n\nfunction makeWriteContext(params: { engine: Engine }): WriteContext {\n const { engine } = params;\n return {\n meta: engine.meta,\n dialect: engine.dialect,\n run: makeRunner({ engine }),\n transactional: <T>(fn: (run: StatementRunner) => Promise<T>): Promise<T> =>\n engine.adapter.transaction((txAdapter) => fn(makeRunner({ engine: { ...engine, adapter: txAdapter } }))),\n };\n}\n\n// ─── Delegates ────────────────────────────────────────────────────\n\n/**\n * A view's delegate: reads pass through, every write verb is refused before a\n * statement is built. Views are read-only by construction, and leaving the\n * write verbs live is not dialect-honest — a simple projection view is\n * auto-updatable on postgres (the INSERT silently lands in the base table)\n * while sqlite/mysql raise a raw driver error. Applied once per delegate at\n * construction, so the hot path is untouched.\n */\nfunction readOnlyDelegate(params: { delegate: ModelDelegate; model: string }): ModelDelegate {\n const { delegate, model } = params;\n const refuse =\n (method: string) =>\n async (): Promise<never> => {\n throw viewIsReadOnly({ model, method });\n };\n return {\n ...delegate,\n create: refuse(\"create\"),\n createMany: refuse(\"createMany\"),\n createManyAndReturn: refuse(\"createManyAndReturn\"),\n update: refuse(\"update\"),\n updateMany: refuse(\"updateMany\"),\n upsert: refuse(\"upsert\"),\n delete: refuse(\"delete\"),\n deleteMany: refuse(\"deleteMany\"),\n };\n}\n\n/**\n * #7 (v1/Prisma parity): an update `data` object whose every key is undefined\n * is an effectively-empty write — the batch short-circuits to `{ count: 0 }`\n * BEFORE `@updatedAt` injection, so a no-op updateMany never bumps timestamps.\n */\nfunction isEffectivelyEmptyData(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value) || value instanceof Date || value instanceof Uint8Array) return false;\n return Object.values(value).every((entry) => entry === undefined);\n}\n\nfunction createDelegate(params: { engine: Engine; model: string }): ModelDelegate {\n const { engine, model } = params;\n\n const shapeOf = (built: QueryPlan): ResultShape => ({\n relations: built.relations,\n resultFields: built.resultFields,\n relationStrategy: built.relationStrategy,\n });\n\n // ─── Implementations ───\n // Each takes the engine it runs against as a parameter: the delegate wraps\n // them in LAZY query promises bound to this client's engine, and the array\n // form of $transaction re-runs the same closure against the transaction's\n // engine instead (see QueryPromise).\n\n const findMany = async (target: Engine, args?: ClientRow): Promise<ClientRow[]> => {\n const built = plan({ engine: target, model, method: \"findMany\", args });\n const rows = shapeRows({ plan: built, rows: await runRows({ engine: target, plan: built }) });\n return await finalizeRows({ engine: target, model: built.model, shape: shapeOf(built), rows });\n };\n\n const findFirst = async (target: Engine, args?: ClientRow): Promise<ClientRow | null> => {\n const built = plan({ engine: target, model, method: \"findFirst\", args });\n const rows = shapeRows({ plan: built, rows: await runRows({ engine: target, plan: built }) });\n const row = rows[0];\n if (row === undefined) return null;\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const findUnique = async (target: Engine, args: ClientRow): Promise<ClientRow | null> => {\n const built = plan({ engine: target, model, method: \"findUnique\", args });\n const rows = await runRows({ engine: target, plan: built });\n const row = rows[0];\n if (row === undefined) return null;\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const create = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n if (hasNestedWrites({ model: modelMeta, data: args.data })) {\n const shape = resolveResultShape({ meta: target.meta, model: modelMeta, method: \"create\", args });\n const row = await createWithNested({\n ctx: makeWriteContext({ engine: target }),\n model: modelMeta,\n data: args.data as Record<string, unknown>,\n });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"create\", args });\n const row = await runSingleMutation({ engine: target, source: built, readBeforeWrite: false });\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const update = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n if (hasNestedWrites({ model: modelMeta, data: args.data })) {\n const shape = resolveResultShape({ meta: target.meta, model: modelMeta, method: \"update\", args });\n const row = await updateWithNested({\n ctx: makeWriteContext({ engine: target }),\n model: modelMeta,\n where: args.where as Record<string, unknown>,\n data: args.data as Record<string, unknown>,\n });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"update\", args });\n const row = await runSingleMutation({ engine: target, source: built, readBeforeWrite: false });\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const createMany = async (target: Engine, args: ClientRow): Promise<BatchResult> => {\n // #7 (v1/Prisma parity): an empty batch is a normal outcome of\n // `data: rows.filter(…)` — `{ count: 0 }`, NO statement.\n if (Array.isArray(args.data) && args.data.length === 0) return { count: 0 };\n const built = plan({ engine: target, model, method: \"createMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n const createManyAndReturn = async (target: Engine, args: ClientRow): Promise<ClientRow[]> => {\n // #7: empty batch → no rows, no statement.\n if (Array.isArray(args.data) && args.data.length === 0) return [];\n const built = plan({ engine: target, model, method: \"createManyAndReturn\", args });\n // M4/M7: multi-statement batches run atomically; returned rows come in\n // statement order (heterogeneous rows regroup — no input-order promise,\n // matching Prisma's own non-guarantee here).\n const rows =\n built.batch !== undefined && built.batch.length > 1\n ? await target.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...target, adapter: txAdapter };\n const collected: ClientRow[] = [];\n for (const statement of built.batch as readonly SqlStatement[]) {\n collected.push(\n ...(await runRows({ engine: txEngine, plan: { ...built, statement, batch: undefined } })),\n );\n }\n return collected;\n })\n : await runRows({ engine: target, plan: built });\n // #8: the one multi-row returning write loads relations like its siblings\n // (finalizeRows narrows to the caller's selection afterwards, exactly as\n // the bare projection did before).\n return await finalizeRows({ engine: target, model: built.model, shape: shapeOf(built), rows });\n };\n\n const updateMany = async (target: Engine, args: ClientRow): Promise<BatchResult> => {\n // #7 (v1 parity, old/v1 client.ts:957): short-circuit BEFORE @updatedAt\n // injection — auto-managed fields must not turn a no-op into a real UPDATE.\n if (isEffectivelyEmptyData(args.data)) return { count: 0 };\n const built = plan({ engine: target, model, method: \"updateMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n const upsert = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n if (\n hasNestedWrites({ model: modelMeta, data: args.create }) ||\n hasNestedWrites({ model: modelMeta, data: args.update })\n ) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `nested writes are not supported inside upsert arms on ${modelMeta.name} — use create()/update() with nested data`,\n meta: { model: modelMeta.name },\n });\n }\n if (!upsertUsesNativeStatement({ model: modelMeta, args: args as Record<string, unknown> })) {\n // B1: the create row does not bind the conflict target with the\n // where's values — the native statement's conflict clause could never\n // fire on the addressed row. Run the find-then-write flow instead.\n const shape = resolveResultShape({\n meta: target.meta,\n model: modelMeta,\n method: \"upsert\",\n args: args as Record<string, unknown>,\n });\n const row = await runUpsertFallback({ engine: target, model: modelMeta, args });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"upsert\", args });\n const row = await runSingleMutation({ engine: target, source: built, readBeforeWrite: false });\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const deleteOne = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const built = plan({ engine: target, model, method: \"delete\", args });\n const row = await runSingleMutation({ engine: target, source: built, readBeforeWrite: true });\n // #25: relations load like update's — from the returned (or pre-read) row,\n // AFTER the delete: children a cascade removed come back empty.\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const deleteMany = async (target: Engine, args?: ClientRow): Promise<BatchResult> => {\n const built = plan({ engine: target, model, method: \"deleteMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n const count = async (target: Engine, args?: ClientRow): Promise<number | Record<string, number>> => {\n const built = plan({ engine: target, model, method: \"count\", args });\n const rendered = renderStatementCached({\n dialect: target.dialect,\n statement: built.statement,\n cache: target.renderCache,\n });\n const started = performance.now();\n const rows = await target.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: target.adapter, values: rendered.values }),\n });\n report({\n engine: target,\n model,\n method: \"count\",\n text: rendered.text,\n values: rendered.values,\n started,\n });\n // count-with-select: aliases ARE the result keys ({ _all, field, … }).\n if (built.aggregateSpec !== null) {\n const row = rows[0] ?? {};\n const out: Record<string, number> = {};\n for (const selection of built.aggregateSpec.selections) {\n out[selection.alias] = Number(row[selection.alias] ?? 0);\n }\n return out;\n }\n // postgres returns COUNT(*) as a bigint string; Number() normalizes it.\n const raw = rows[0]?.[built.countAlias ?? COUNT_ALIAS];\n return raw === undefined || raw === null ? 0 : Number(raw);\n };\n\n const aggregate = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const built = plan({ engine: target, model, method: \"aggregate\", args });\n const rows = await runRows({ engine: target, plan: built });\n // A non-grouped aggregate always yields exactly one row — even over an\n // empty table (COUNT → 0, the others → SQL NULL → null).\n return assembleAggregates({\n engine: target,\n model: built.model,\n spec: built.aggregateSpec as AggregateSpec,\n row: rows[0] ?? {},\n into: {},\n });\n };\n\n const groupBy = async (target: Engine, args: ClientRow): Promise<ClientRow[]> => {\n const built = plan({ engine: target, model, method: \"groupBy\", args });\n const rows = await runRows({ engine: target, plan: built });\n const by = built.groupByFields as readonly string[];\n const spec = built.aggregateSpec as AggregateSpec;\n return rows.map((row) => {\n const out: ClientRow = {};\n for (const name of by) out[name] = row[name];\n return assembleAggregates({ engine: target, model: built.model, spec, row, into: out });\n });\n };\n\n // ─── Lazy wrappers ───\n\n const lazy = <T>(run: (target: Engine) => Promise<T>): Promise<T> => QueryPromise.create<T>({ engine, run });\n\n const delegate: ModelDelegate = {\n findMany: (args?: ClientRow): Promise<ClientRow[]> => lazy((target) => findMany(target, args)),\n findFirst: (args?: ClientRow): Promise<ClientRow | null> => lazy((target) => findFirst(target, args)),\n findUnique: (args: ClientRow): Promise<ClientRow | null> => lazy((target) => findUnique(target, args)),\n\n findFirstOrThrow: (args?: ClientRow): Promise<ClientRow> =>\n lazy(async (target) => {\n const row = await findFirst(target, args);\n if (row === null) throw notFound({ model, method: \"findFirstOrThrow\" });\n return row;\n }),\n\n findUniqueOrThrow: (args: ClientRow): Promise<ClientRow> =>\n lazy(async (target) => {\n const row = await findUnique(target, args);\n if (row === null) throw notFound({ model, method: \"findUniqueOrThrow\" });\n return row;\n }),\n\n create: (args: ClientRow): Promise<ClientRow> => lazy((target) => create(target, args)),\n createMany: (args: ClientRow): Promise<BatchResult> => lazy((target) => createMany(target, args)),\n createManyAndReturn: (args: ClientRow): Promise<ClientRow[]> =>\n lazy((target) => createManyAndReturn(target, args)),\n update: (args: ClientRow): Promise<ClientRow> => lazy((target) => update(target, args)),\n updateMany: (args: ClientRow): Promise<BatchResult> => lazy((target) => updateMany(target, args)),\n upsert: (args: ClientRow): Promise<ClientRow> => lazy((target) => upsert(target, args)),\n delete: (args: ClientRow): Promise<ClientRow> => lazy((target) => deleteOne(target, args)),\n deleteMany: (args?: ClientRow): Promise<BatchResult> => lazy((target) => deleteMany(target, args)),\n count: (args?: ClientRow): Promise<number | Record<string, number>> => lazy((target) => count(target, args)),\n aggregate: (args: ClientRow): Promise<ClientRow> => lazy((target) => aggregate(target, args)),\n groupBy: (args: ClientRow): Promise<ClientRow[]> => lazy((target) => groupBy(target, args)),\n };\n\n const meta = getModelMeta({ meta: engine.meta, model });\n return meta.isView ? readOnlyDelegate({ delegate, model: meta.name }) : delegate;\n}\n\n// ─── Raw SQL ──────────────────────────────────────────────────────\n\n/**\n * Interleave a tagged template's literals with placeholders. Interpolated\n * values are ALWAYS bound as parameters — a template can never inject text.\n */\nfunction buildRawStatement(params: {\n dialect: SqlDialect;\n strings: TemplateStringsArray;\n values: readonly unknown[];\n}): { text: string; values: unknown[] } {\n const { dialect, strings, values } = params;\n const collector = new ParamCollector(dialect);\n let text = strings[0] ?? \"\";\n for (let index = 0; index < values.length; index++) {\n text += collector.add(values[index]) + (strings[index + 1] ?? \"\");\n }\n return { text, values: collector.values };\n}\n\n// ─── Factory ──────────────────────────────────────────────────────\n\nfunction buildClient(params: { engine: Engine }): DynamicClient {\n const { engine } = params;\n\n const models: Record<string, ModelDelegate> = {};\n for (const model of engine.meta.models) {\n const delegate = createDelegate({ engine, model: model.name });\n models[model.name] = delegate;\n models[model.clientName] = delegate;\n }\n\n const runRaw = async (\n method: string,\n statement: { text: string; values: unknown[] },\n ): Promise<{ rows: ClientRow[]; affectedRows: number }> => {\n const started = performance.now();\n const result = await engine.adapter.executeUnsafe(statement);\n report({\n engine,\n model: null,\n method,\n text: statement.text,\n values: statement.values,\n started,\n });\n return result;\n };\n\n /**\n * The array form: claim every operation SYNCHRONOUSLY (before their\n * auto-dispatch microtask fires), then run them sequentially against ONE\n * transaction engine — statement order is array order, a throw rolls the\n * whole batch back and settles the not-yet-run operations with the same\n * failure, results return positionally. Only un-dispatched QueryPromises\n * may join: anything else is already in flight on the non-transactional\n * adapter and wrapping it would fake atomicity.\n */\n const runOperations = (operations: readonly unknown[], options?: TransactionOptions): Promise<unknown[]> => {\n const claimed: ClaimedOperation[] = [];\n let claimError: unknown = null;\n for (const operation of operations) {\n if (!(operation instanceof QueryPromise)) {\n claimError = new VibeError({\n code: \"VIBE_VALIDATION\",\n message:\n \"$transaction([...]) takes query promises from model delegate calls — a foreign promise is already running and cannot join the transaction\",\n });\n break;\n }\n try {\n claimed.push((operation as QueryPromise<unknown>).claim());\n } catch (error) {\n claimError = error;\n break;\n }\n }\n if (claimError !== null) {\n for (const entry of claimed) entry.abort(claimError);\n return Promise.reject(claimError);\n }\n return engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter };\n const results: unknown[] = [];\n let index = 0;\n try {\n for (; index < claimed.length; index++) {\n results.push(await (claimed[index] as ClaimedOperation).start(txEngine));\n }\n } catch (error) {\n for (let rest = index + 1; rest < claimed.length; rest++) {\n (claimed[rest] as ClaimedOperation).abort(error);\n }\n throw error;\n }\n return results;\n }, options);\n };\n\n const client: DynamicClient = {\n $models: models,\n\n $on: (event: \"query\", listener: (event: QueryEvent) => void): (() => void) => {\n if (event !== \"query\") {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown client event \"${String(event)}\" — supported: \"query\"`,\n meta: { event },\n });\n }\n engine.listeners.add(listener);\n return () => {\n engine.listeners.delete(listener);\n };\n },\n\n $transaction: (<T>(\n fnOrOperations: ((tx: DynamicClient) => Promise<T>) | readonly unknown[],\n options?: TransactionOptions,\n ): Promise<T | unknown[]> =>\n Array.isArray(fnOrOperations)\n ? runOperations(fnOrOperations, options)\n : engine.adapter.transaction(\n (txAdapter) =>\n (fnOrOperations as (tx: DynamicClient) => Promise<T>)(\n buildClient({ engine: { ...engine, adapter: txAdapter } }),\n ),\n options,\n )) as DynamicClient[\"$transaction\"],\n\n // Raw results are NOT decoded: without a model there is no field→column\n // mapping and no codec to apply. Values arrive as the driver produced them.\n $queryRaw: async (strings: TemplateStringsArray, ...values: unknown[]): Promise<ClientRow[]> =>\n (await runRaw(\"$queryRaw\", buildRawStatement({ dialect: engine.dialect, strings, values }))).rows,\n\n $executeRaw: async (strings: TemplateStringsArray, ...values: unknown[]): Promise<number> =>\n (await runRaw(\"$executeRaw\", buildRawStatement({ dialect: engine.dialect, strings, values }))).affectedRows,\n\n $queryRawUnsafe: async (text: string, ...values: unknown[]): Promise<ClientRow[]> =>\n (await runRaw(\"$queryRawUnsafe\", { text, values })).rows,\n\n $executeRawUnsafe: async (text: string, ...values: unknown[]): Promise<number> =>\n (await runRaw(\"$executeRawUnsafe\", { text, values })).affectedRows,\n\n $connect: async (): Promise<void> => {\n await engine.adapter.connect();\n for (const hook of engine.connectHooks ?? []) {\n await hook({\n execute: (execParams) =>\n engine.adapter.execute({ text: execParams.text, values: [...(execParams.values ?? [])] }),\n });\n }\n },\n $disconnect: (): Promise<void> => engine.adapter.disconnect(),\n };\n\n // Ergonomic access (`client.user.findMany()`). The generated client declares\n // these properties with precise types; here they are attached at runtime only.\n for (const model of engine.meta.models) {\n Object.defineProperty(client, model.clientName, {\n value: models[model.clientName],\n enumerable: true,\n });\n }\n\n attachExtensionMounts({ engine, client, models });\n attachDefineView({ client, meta: engine.meta, models });\n\n return client;\n}\n\n// ─── Extension mounts (D9 — baked surfaces) ────────────────────\n\nfunction makeMountContext(params: {\n engine: Engine;\n extension: string;\n model: ModelMeta | null;\n}): ExtensionMountContext {\n const { engine, extension, model } = params;\n return {\n extension,\n dialect: engine.dialect,\n provider: engine.adapter.provider,\n meta: engine.meta,\n model,\n executeRows: async ({ text, values, method }) => {\n const started = performance.now();\n const rows = await engine.adapter.execute({\n text,\n values: bindValues({ adapter: engine.adapter, values: [...values] }),\n });\n report({\n engine,\n model: model?.name ?? null,\n method: method ?? extension,\n text,\n values,\n started,\n });\n return model === null\n ? rows\n : materializeRows({ dialect: engine.dialect.name, model, rows, wire: engine.adapter.wire });\n },\n compileWhere: ({ where, model: modelName, qualify }) => {\n const target =\n modelName === undefined\n ? model\n : getModelMeta({ meta: engine.meta, model: modelName });\n if (target === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `extension \"${extension}\" compiled a where with no model in scope`,\n meta: { extension },\n });\n }\n return compileWhere({\n dialect: engine.dialect,\n meta: engine.meta,\n model: target,\n where,\n ...(qualify === undefined ? {} : { qualify }),\n });\n },\n };\n}\n\n/**\n * Attach the baked extension surfaces. Runs on EVERY client build — the\n * `$transaction` path rebuilds the client over the tx adapter, so mounted\n * surfaces execute on the transaction connection like core delegates do.\n */\nfunction attachExtensionMounts(params: {\n engine: Engine;\n client: DynamicClient;\n models: Record<string, ModelDelegate>;\n}): void {\n const { engine, client, models } = params;\n const mounts = engine.extensionMounts;\n if (mounts === undefined) return;\n\n for (const mount of mounts) {\n if (mount.scope === \"model\") {\n const model = getModelMeta({ meta: engine.meta, model: mount.model ?? \"\" });\n const delegate = models[model.name];\n if (delegate === undefined || mount.property in delegate) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `extension \"${mount.extension}\" cannot mount \"${mount.property}\" on ${model.name} — the name is taken`,\n meta: { extension: mount.extension, model: model.name, property: mount.property },\n });\n }\n const value = mount.create(makeMountContext({ engine, extension: mount.extension, model }));\n Object.defineProperty(delegate, mount.property, { value, enumerable: true });\n continue;\n }\n\n if (!mount.property.startsWith(\"$\") || mount.property in client) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `extension \"${mount.extension}\" cannot mount client property \"${mount.property}\" — root mounts are $-prefixed and must not collide`,\n meta: { extension: mount.extension, property: mount.property },\n });\n }\n const value = mount.create(makeMountContext({ engine, extension: mount.extension, model: null }));\n Object.defineProperty(client, mount.property, { value, enumerable: true });\n }\n}\n\n/**\n * Build a client for a schema over an adapter.\n *\n * The adapter chooses the dialect: the same IR runs on postgres, sqlite or\n * mysql, and every dialect difference is resolved by `@vibeorm/sql` and the\n * codec table rather than by branching here.\n *\n * @example\n * const db = createClient({ schema, adapter });\n * const users = await db.$models.user.findMany({ where: { active: true } });\n */\nexport function createClient(params: {\n schema: SchemaIR;\n adapter: DatabaseAdapter;\n options?: ClientOptions;\n /** Extension wiring — baked mounts + manifest from the generated client, live instances from the caller. */\n extensions?: ClientExtensionsOptions;\n}): DynamicClient {\n const { schema, adapter, options, extensions } = params;\n const dialectName: Dialect = adapter.dialect;\n\n // Staleness gate (extensions.md §3.2): a baked manifest must match the live\n // extension list BEFORE any query runs.\n if (extensions?.manifest !== undefined) {\n assertExtensionManifest({ manifest: extensions.manifest, instances: extensions.instances });\n }\n\n const instances = extensions?.instances ?? [];\n const operatorMap =\n instances.length === 0\n ? null\n : buildExtensionOperatorMap({ instances, dialect: dialectName, provider: adapter.provider });\n const connectHooks =\n instances.length === 0\n ? []\n : buildConnectHooks({ instances, dialect: dialectName, provider: adapter.provider });\n\n const baseMeta = buildRuntimeMeta({ schema });\n const meta: RuntimeMeta =\n operatorMap === null ? baseMeta : { ...baseMeta, extensionOperators: operatorMap };\n\n return buildClient({\n engine: {\n meta,\n adapter,\n dialect: getSqlDialect({ dialect: dialectName }),\n options: options ?? {},\n listeners: new Set(),\n renderCache: new StatementRenderCache(),\n ...(extensions?.mounts === undefined ? {} : { extensionMounts: extensions.mounts }),\n ...(connectHooks.length === 0 ? {} : { connectHooks }),\n },\n });\n}\n",
15
- "/**\n * The compiled-query cache — §9's \"query-shape cache (structural hash → SQL\n * skeleton)\", constitution rule 8 (perf) under rule 3's constraint: the SQL\n * text is ALWAYS the renderer's, byte-identical — this module never builds SQL.\n *\n * How it works: a statement AST is walked ONCE, producing (a) a structural key\n * covering everything that affects the rendered text — kinds, identifiers,\n * operators, flags, literal LIMIT/OFFSET, arity where a dialect expands\n * placeholders per element — and (b) the parameter values in exactly the\n * renderer's collection order. A key hit reuses the cached text with the fresh\n * values; a miss renders for real and caches the text.\n *\n * SAFETY: the walk mirrors @vibeorm/sql's render traversal. Two guards keep a\n * divergence from ever mis-binding parameters:\n * 1. every MISS cross-checks the walked values against the renderer's\n * collected values (element-wise); a mismatch poisons the key so that\n * shape renders uncached forever, and\n * 2. constructs with dialect-conditional value branching that is not worth\n * mirroring (jsonFilter) are declared uncacheable outright.\n * The cache is invalidation-free by construction: the key IS the shape, and\n * equal shapes render equal text (shape-purity). Statement ASTs are treated as\n * immutable by the whole runtime, so cached texts can never go stale.\n */\n\nimport { isListSetOperation, isSetOperation, isSqlDefaultCell, renderStatement, strictMatchPattern } from \"@vibeorm/sql\";\nimport type {\n AggRef,\n ColRef,\n DeleteStatement,\n InsertStatement,\n OrderTerm,\n RenderedQuery,\n SelectStatement,\n SqlDialect,\n SqlExpr,\n SqlStatement,\n TableRef,\n UpdateStatement,\n} from \"@vibeorm/sql\";\n\n// ─── Cache ────────────────────────────────────────────────────────\n\ntype CachedText = {\n readonly text: string;\n readonly returning: \"native\" | \"omitted\" | \"none\";\n};\n\n/** `null` = poisoned: this shape verified unsafe once — never cache it. */\ntype CacheSlot = CachedText | null;\n\nconst MAX_ENTRIES = 512;\n\n/** One per client (dialect-stable); shared across its transaction clients. */\nexport class StatementRenderCache {\n private readonly entries: Map<string, CacheSlot> = new Map();\n\n get(key: string): CacheSlot | undefined {\n return this.entries.get(key);\n }\n\n set(key: string, slot: CacheSlot): void {\n // Crude cap: shape-pure workloads have a few dozen shapes; a runaway\n // (adversarial keys) just degrades to render-per-call after a clear.\n if (this.entries.size >= MAX_ENTRIES && !this.entries.has(key)) this.entries.clear();\n this.entries.set(key, slot);\n }\n}\n\n// ─── Shape walk (key + values, in render order) ───────────────────\n\ntype Walk = {\n key: string;\n readonly values: unknown[];\n};\n\n/** Length-prefixed so adjacent names can never collide across boundaries. */\nfunction addIdent(walk: Walk, name: string): void {\n walk.key += `§${name.length}~${name}`;\n}\n\nfunction addCol(walk: Walk, column: ColRef): void {\n if (column.table !== undefined) addIdent(walk, column.table);\n walk.key += \".\";\n addIdent(walk, column.name);\n // B3/B4 wire transforms change the rendered text — part of the shape.\n if (column.transform !== undefined) walk.key += column.transform === \"castText\" ? \"^t\" : \"^b\";\n if (column.castReal === true) walk.key += \"^r\";\n // Projection alias (`… AS \"__vibe_parent\"`) is rendered text — shape.\n if (column.alias !== undefined) {\n walk.key += \"^a\";\n addIdent(walk, column.alias);\n }\n}\n\nfunction addTable(walk: Walk, table: TableRef): void {\n addIdent(walk, table.name);\n if (table.alias !== undefined) {\n walk.key += \"@\";\n addIdent(walk, table.alias);\n }\n}\n\nfunction addAgg(walk: Walk, agg: AggRef): void {\n walk.key += agg.fn;\n if (agg.fn !== \"countAll\") addCol(walk, agg.column);\n}\n\n/** SET/DO UPDATE SET entry — mirrors renderAssignments' three value forms. */\nfunction addSetEntry(walk: Walk, name: string, value: unknown): void {\n if (isSetOperation(value)) {\n walk.key += `=o${value.__op}`;\n addIdent(walk, name);\n walk.values.push(value.value);\n return;\n }\n if (isListSetOperation(value)) {\n walk.key += `=l${value.__listOp}`;\n addIdent(walk, name);\n walk.values.push(value.value);\n return;\n }\n walk.key += \"=v\";\n addIdent(walk, name);\n walk.values.push(value);\n}\n\nfunction addReturning(walk: Walk, returning: readonly string[] | undefined): void {\n if (returning === undefined || returning.length === 0) {\n walk.key += \"r0\";\n return;\n }\n walk.key += \"r(\";\n for (const name of returning) addIdent(walk, name);\n walk.key += \")\";\n}\n\n/** Mirrors renderExpr; returns false when the expression is uncacheable. */\nfunction walkExpr(walk: Walk, dialect: SqlDialect, expr: SqlExpr): boolean {\n switch (expr.kind) {\n case \"cmp\":\n walk.key += `c${expr.op}`;\n addCol(walk, expr.column);\n walk.values.push(expr.value);\n return true;\n\n case \"cmpCol\":\n walk.key += `k${expr.op}`;\n addCol(walk, expr.left);\n addCol(walk, expr.right);\n return true;\n\n case \"isNull\":\n walk.key += expr.negate === true ? \"n1\" : \"n0\";\n addCol(walk, expr.column);\n return true;\n\n case \"inArray\": {\n if (expr.values.length === 0) {\n walk.key += expr.negate === true ? \"z1\" : \"z0\";\n return true;\n }\n walk.key += expr.negate === true ? \"i1\" : \"i0\";\n addCol(walk, expr.column);\n if (dialect.inArrayStrategy === \"any\") {\n // One array parameter — the renderer copies, so the walk copies too.\n walk.values.push([...expr.values]);\n } else {\n // Expanded placeholders: arity is part of the text.\n walk.key += `#${expr.values.length}`;\n for (const value of expr.values) walk.values.push(value);\n }\n return true;\n }\n\n case \"like\":\n walk.key += `L${expr.insensitive === true ? \"i\" : \"s\"}${expr.negate === true ? \"n\" : \"p\"}`;\n addCol(walk, expr.column);\n walk.values.push(expr.pattern);\n return true;\n\n case \"strictMatch\":\n // #20 — mirrors the renderer's strictMatch case: the text depends on op\n // + strategy (both in the key via op; strategy is fixed per dialect,\n // and the cache is per dialect instance), and the BOUND value is the\n // DERIVED pattern for pattern ops — the shared strictMatchPattern\n // helper keeps this mirror and the renderer from drifting.\n walk.key += `S${expr.op}${expr.negate === true ? \"n\" : \"p\"}`;\n addCol(walk, expr.column);\n walk.values.push(\n expr.op === \"equals\"\n ? expr.value\n : strictMatchPattern({ strategy: dialect.strictMatchStrategy, op: expr.op, value: expr.value }),\n );\n return true;\n\n case \"and\":\n case \"or\": {\n walk.key += `${expr.kind === \"and\" ? \"A\" : \"O\"}${expr.operands.length}(`;\n for (const operand of expr.operands) {\n if (!walkExpr(walk, dialect, operand)) return false;\n }\n walk.key += \")\";\n return true;\n }\n\n case \"not\":\n walk.key += \"!(\";\n if (!walkExpr(walk, dialect, expr.operand)) return false;\n walk.key += \")\";\n return true;\n\n case \"exists\":\n walk.key += expr.negate === true ? \"E1(\" : \"E0(\";\n if (!walkSelect(walk, dialect, expr.select)) return false;\n walk.key += \")\";\n return true;\n\n case \"aggCmp\":\n walk.key += `g${expr.op}`;\n addAgg(walk, expr.agg);\n walk.values.push(expr.value);\n return true;\n\n case \"arrayHas\":\n walk.key += expr.negate === true ? \"h1\" : \"h0\";\n addCol(walk, expr.column);\n walk.values.push(expr.value);\n return true;\n\n case \"arrayContainsAll\":\n walk.key += \"H\";\n addCol(walk, expr.column);\n walk.values.push([...expr.values]);\n return true;\n\n case \"arrayOverlaps\":\n walk.key += \"V\";\n addCol(walk, expr.column);\n walk.values.push([...expr.values]);\n return true;\n\n case \"arrayIsEmpty\":\n walk.key += expr.empty ? \"e1\" : \"e0\";\n addCol(walk, expr.column);\n return true;\n\n case \"jsonFilter\":\n // Value collection branches on dialect json mode AND operand type —\n // deliberately uncacheable rather than mirrored (see module docs).\n return false;\n\n case \"fragment\":\n // Extension-defined part streams (extensions.md §3) — uncacheable, the\n // fragment owns its own text/param interleaving.\n return false;\n\n case \"raw\":\n // Text-only fragment: the text IS the shape.\n walk.key += \"R(\";\n addIdent(walk, expr.text);\n walk.key += \")\";\n return true;\n }\n}\n\n/** One ORDER BY term — column, aggregate, or correlated subquery (relation orderBy). */\nfunction walkOrderTerm(walk: Walk, dialect: SqlDialect, term: OrderTerm): boolean {\n if (\"agg\" in term) {\n walk.key += \"a\";\n addAgg(walk, term.agg);\n } else if (\"select\" in term) {\n // Correlated subquery term: its parameters land in the shared sequence in\n // render order — walk the whole subselect.\n walk.key += \"q(\";\n if (!walkSelect(walk, dialect, term.select)) return false;\n walk.key += \")\";\n } else {\n addCol(walk, term.column);\n walk.key += term.nulls === undefined ? \"-\" : term.nulls === \"first\" ? \"^\" : \"$\";\n }\n walk.key += term.direction === \"asc\" ? \"+\" : \"~\";\n return true;\n}\n\n/**\n * Mirrors renderSelect. Value order there: rowNumber OVER-order subqueries\n * (projection renders first) → fromSelect → lateralJoins → where → having →\n * orderBy subqueries (everything else is parameter-free; LIMIT/OFFSET are\n * literals and therefore live in the KEY).\n */\nfunction walkSelect(walk: Walk, dialect: SqlDialect, statement: SelectStatement): boolean {\n walk.key += \"S{\";\n if (statement.distinctOn !== undefined && statement.distinctOn.length > 0) {\n walk.key += \"d(\";\n for (const column of statement.distinctOn) addCol(walk, column);\n walk.key += \")\";\n }\n walk.key += \"p(\";\n for (const column of statement.columns) addCol(walk, column);\n walk.key += \")\";\n if (statement.selectExpr !== undefined) {\n if (statement.selectExpr.kind === \"one\") {\n walk.key += \"x1\";\n } else {\n walk.key += \"xc\";\n if (statement.selectExpr.alias !== undefined) addIdent(walk, statement.selectExpr.alias);\n }\n }\n if (statement.aggregates !== undefined) {\n for (const selection of statement.aggregates) {\n walk.key += \"a\";\n addAgg(walk, selection.agg);\n addIdent(walk, selection.alias);\n }\n }\n if (statement.rowNumber !== undefined) {\n walk.key += \"W(\";\n for (const column of statement.rowNumber.partitionBy) addCol(walk, column);\n walk.key += \":\";\n for (const term of statement.rowNumber.orderBy) {\n if (!walkOrderTerm(walk, dialect, term)) return false;\n }\n addIdent(walk, statement.rowNumber.alias);\n walk.key += \")\";\n }\n walk.key += \"f\";\n addTable(walk, statement.table);\n if (statement.fromSelect !== undefined) {\n walk.key += \"F(\";\n if (!walkSelect(walk, dialect, statement.fromSelect)) return false;\n walk.key += \")\";\n }\n if (statement.innerJoins !== undefined && statement.innerJoins.length > 0) {\n for (const join of statement.innerJoins) {\n walk.key += \"J(\";\n addTable(walk, join.table);\n for (const pair of join.on) {\n addCol(walk, pair.left);\n walk.key += \"=\";\n addCol(walk, pair.right);\n }\n walk.key += \")\";\n }\n }\n if (statement.lateralJoins !== undefined && statement.lateralJoins.length > 0) {\n for (const join of statement.lateralJoins) {\n walk.key += join.agg === \"jsonArray\" ? \"Ja(\" : \"Jo(\";\n if (!walkSelect(walk, dialect, join.select)) return false;\n addIdent(walk, join.columnAlias);\n addIdent(walk, join.alias);\n walk.key += \")\";\n }\n }\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n if (statement.groupBy !== undefined && statement.groupBy.length > 0) {\n walk.key += \"b(\";\n for (const column of statement.groupBy) addCol(walk, column);\n walk.key += \")\";\n }\n if (statement.having !== undefined) {\n walk.key += \"v\";\n if (!walkExpr(walk, dialect, statement.having)) return false;\n }\n if (statement.orderBy !== undefined && statement.orderBy.length > 0) {\n walk.key += \"o(\";\n for (const term of statement.orderBy) {\n if (!walkOrderTerm(walk, dialect, term)) return false;\n }\n walk.key += \")\";\n }\n if (statement.limit !== undefined) walk.key += `t${statement.limit}`;\n if (statement.offset !== undefined) walk.key += `s${statement.offset}`;\n if (statement.lockForUpdate === true) walk.key += \"u\";\n walk.key += \"}\";\n return true;\n}\n\n/** Mirrors renderInsert: values row-major, then ON CONFLICT update entries. */\nfunction walkInsert(walk: Walk, statement: InsertStatement): boolean {\n walk.key += \"I{\";\n addTable(walk, statement.table);\n walk.key += \"c(\";\n for (const name of statement.columns) addIdent(walk, name);\n walk.key += `)r${statement.rows.length}`;\n const arity = statement.columns.length;\n for (let rowIndex = 0; rowIndex < statement.rows.length; rowIndex++) {\n const row = statement.rows[rowIndex] as readonly unknown[];\n // A malformed row must reach the renderer's own arity error — never a hit.\n if (row.length !== arity) return false;\n for (let cell = 0; cell < row.length; cell++) {\n const value = row[cell];\n // M4: a DEFAULT cell is TEXT, not a parameter — its POSITION is shape.\n if (isSqlDefaultCell(value)) walk.key += `D${rowIndex}:${cell};`;\n else walk.values.push(value);\n }\n }\n const onConflict = statement.onConflict;\n if (onConflict !== undefined) {\n if (\"doNothing\" in onConflict) {\n walk.key += \"N(\";\n if (onConflict.columns !== undefined) {\n for (const name of onConflict.columns) addIdent(walk, name);\n }\n walk.key += \")\";\n } else {\n walk.key += \"U(\";\n for (const name of onConflict.columns) addIdent(walk, name);\n walk.key += \":\";\n for (const [name, value] of Object.entries(onConflict.update)) addSetEntry(walk, name, value);\n if (onConflict.lastInsertIdColumn !== undefined) {\n walk.key += \"@\";\n addIdent(walk, onConflict.lastInsertIdColumn);\n }\n walk.key += \")\";\n }\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\n/** Mirrors renderUpdate: SET entries, then WHERE. */\nfunction walkUpdate(walk: Walk, dialect: SqlDialect, statement: UpdateStatement): boolean {\n walk.key += \"U{\";\n addTable(walk, statement.table);\n for (const [name, value] of Object.entries(statement.set)) addSetEntry(walk, name, value);\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\nfunction walkDelete(walk: Walk, dialect: SqlDialect, statement: DeleteStatement): boolean {\n walk.key += \"D{\";\n addTable(walk, statement.table);\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\nfunction walkStatement(walk: Walk, dialect: SqlDialect, statement: SqlStatement): boolean {\n switch (statement.kind) {\n case \"select\":\n return walkSelect(walk, dialect, statement);\n case \"insert\":\n return walkInsert(walk, statement);\n case \"update\":\n return walkUpdate(walk, dialect, statement);\n case \"delete\":\n return walkDelete(walk, dialect, statement);\n }\n}\n\n// ─── Miss-time verification ───────────────────────────────────────\n\n/**\n * Element-wise identity, with one-level array content equality — the renderer\n * copies array params (`[...values]`), so a fresh copy with identical elements\n * counts as the same value.\n */\nfunction sameValues(walked: readonly unknown[], rendered: readonly unknown[]): boolean {\n if (walked.length !== rendered.length) return false;\n for (let index = 0; index < walked.length; index++) {\n const a = walked[index];\n const b = rendered[index];\n if (a === b) continue;\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n let equal = true;\n for (let element = 0; element < a.length; element++) {\n if (a[element] !== b[element]) {\n equal = false;\n break;\n }\n }\n if (equal) continue;\n }\n return false;\n }\n return true;\n}\n\n// ─── Entry point ──────────────────────────────────────────────────\n\n/**\n * Render through the shape cache: hit = cached text + freshly walked values;\n * miss = real render, cross-checked against the walk before caching. Anything\n * uncacheable (or a verification failure — poisoned) renders directly.\n */\nexport function renderStatementCached(params: {\n dialect: SqlDialect;\n statement: SqlStatement;\n cache: StatementRenderCache;\n}): RenderedQuery {\n const { dialect, statement, cache } = params;\n\n const walk: Walk = { key: \"\", values: [] };\n if (!walkStatement(walk, dialect, statement)) {\n return renderStatement({ dialect, statement });\n }\n\n const slot = cache.get(walk.key);\n if (slot !== undefined) {\n if (slot === null) return renderStatement({ dialect, statement });\n return { text: slot.text, values: walk.values, returning: slot.returning };\n }\n\n const rendered = renderStatement({ dialect, statement });\n cache.set(\n walk.key,\n sameValues(walk.values, rendered.values) ? { text: rendered.text, returning: rendered.returning } : null,\n );\n return rendered;\n}\n"
24
+ "/**\n * Field-masking views — the v1 `db.defineView()` surface ported to v2\n * (board #11), renamed `$defineView` per v2's $-prefixed client-name rule.\n *\n * A view is a READ-ONLY scoped client over the models named in its definition.\n * Rows come back as `ViewResult` instances that expose only the definition's\n * fields; `reveal: { field: true }` makes an extra field readable as a\n * property while `JSON.stringify` still excludes it, and `$unsafe()` returns\n * everything. Relations load normally: when the related model is ALSO in the\n * definition its rows are masked recursively; when it is not, they pass\n * through untouched (v1 semantics).\n *\n * Isolated by design: this module wraps the public delegate surface\n * (`client.$models`) and never reaches into the query builder — the same SQL\n * runs, the ARGS are rewritten (definition fields become a `select`) and the\n * RESULT objects are wrapped.\n *\n * v1 → v2 deltas (documented in apps/tests/parity-fragments/views.md):\n * - `defineView` → `$defineView`; errors are `VibeError` codes, not strings.\n * - The definition is validated eagerly (unknown model / unknown field /\n * empty field set throw `VIBE_VALIDATION` at definition time).\n * - Write verbs exist on the view delegate but throw `VIBE_VALIDATION`\n * (mirroring v2's database-view read-only contract) — v1 left them\n * `undefined`.\n * - A nested `include` under a masked relation stays masked (v1 dropped the\n * restriction one level down); `omit` on a view query is refused loudly\n * (v1 stripped it silently).\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ClientRow, ModelDelegate } from \"./client.ts\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Public types ─────────────────────────────────────────────────\n\n/**\n * A view definition: client-name model keys → the set of visible fields.\n * Example: `{ user: { id: true, name: true }, post: { id: true, title: true } }`.\n */\nexport type ViewDefinition = Record<string, Record<string, boolean | undefined>>;\n\n/** The read surface of one model under a view — writes throw `VIBE_VALIDATION`. */\nexport type ViewModelDelegate = {\n readonly findMany: (args?: ClientRow) => Promise<ViewResult[]>;\n readonly findFirst: (args?: ClientRow) => Promise<ViewResult | null>;\n readonly findFirstOrThrow: (args?: ClientRow) => Promise<ViewResult>;\n readonly findUnique: (args: ClientRow) => Promise<ViewResult | null>;\n readonly findUniqueOrThrow: (args: ClientRow) => Promise<ViewResult>;\n readonly count: (args?: ClientRow) => Promise<number | Record<string, number>>;\n readonly aggregate: (args: ClientRow) => Promise<ClientRow>;\n readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;\n} & Record<string, unknown>;\n\n/** What `$defineView` returns at the runtime level — the generated d.ts narrows it. */\nexport type ViewClientShape = Record<string, ViewModelDelegate>;\n\n/** The `$defineView` client method (runtime-level shape). */\nexport type DefineViewFn = (options: {\n readonly name: string;\n readonly definition: ViewDefinition;\n}) => ViewClientShape;\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction validationError(params: { message: string; meta: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n// ─── ViewResult ───────────────────────────────────────────────────\n\n/**\n * A masked row: visible + revealed fields are enumerable own properties,\n * `toJSON()` (used by `JSON.stringify`) drops revealed fields recursively,\n * `$unsafe()` returns a plain object with everything. Class methods are\n * prototype members, so they never show up in `Object.keys` / spread.\n */\nexport class ViewResult {\n /** Dynamic property access for view/revealed/relation fields. */\n [key: string]: unknown;\n\n /** @internal Field names revealed on this row (non-enumerable). */\n declare readonly _revealed: ReadonlySet<string>;\n\n constructor(params: {\n record: Readonly<Record<string, unknown>>;\n /** Every key to expose as a property (fields + revealed + relations). */\n expose: ReadonlySet<string>;\n revealed: ReadonlySet<string>;\n }) {\n const { record, expose, revealed } = params;\n Object.defineProperty(this, \"_revealed\", {\n value: revealed,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n for (const key of expose) {\n if (key in record) {\n this[key] = record[key];\n }\n }\n }\n\n /** Plain object WITHOUT revealed fields (what `JSON.stringify` sees), recursively. */\n toJSON(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(this)) {\n if (this._revealed.has(key)) continue;\n const value = this[key];\n if (value instanceof ViewResult) {\n out[key] = value.toJSON();\n } else if (Array.isArray(value)) {\n out[key] = value.map((item) => (item instanceof ViewResult ? item.toJSON() : item));\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n\n /** Plain object with ALL fields (view + revealed), recursively — the escape hatch. */\n $unsafe(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(this)) {\n const value = this[key];\n if (value instanceof ViewResult) {\n out[key] = value.$unsafe();\n } else if (Array.isArray(value)) {\n out[key] = value.map((item) => (item instanceof ViewResult ? item.$unsafe() : item));\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n}\n\n// ─── Definition resolution ────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** One model's resolved mask: the model + its visible scalar field names. */\ntype ViewMask = {\n readonly model: ModelMeta;\n readonly fields: ReadonlySet<string>;\n};\n\n/** Definition entries resolved and validated, keyed by the model's CLIENT name. */\ntype ResolvedDefinition = ReadonlyMap<string, ViewMask>;\n\nfunction resolveDefinition(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ViewDefinition;\n}): ResolvedDefinition {\n const { meta, name, definition } = params;\n if (!isPlainObject(definition)) {\n throw validationError({\n message: `view \"${name}\": definition must be an object of { modelKey: { field: true } }`,\n meta: { view: name },\n });\n }\n const resolved = new Map<string, ViewMask>();\n for (const [key, fieldSpec] of Object.entries(definition)) {\n if (fieldSpec === undefined) continue;\n const model = meta.modelByName.get(key);\n if (model === undefined) {\n throw validationError({\n message: `view \"${name}\": unknown model \"${key}\" in the definition`,\n meta: { view: name, model: key },\n });\n }\n if (!isPlainObject(fieldSpec)) {\n throw validationError({\n message: `view \"${name}\": definition.${key} must be an object of { field: true }`,\n meta: { view: name, model: model.name },\n });\n }\n const fields = new Set<string>();\n for (const [field, flag] of Object.entries(fieldSpec)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `view \"${name}\": definition.${key}.${field} must be true`,\n meta: { view: name, model: model.name, field },\n });\n }\n if (!model.fieldByName.has(field)) {\n const isRelation = model.relationByName.has(field);\n throw validationError({\n message: isRelation\n ? `view \"${name}\": \"${field}\" on model \"${model.name}\" is a relation — a view definition lists scalar fields; relations are restricted through the related model's own entry`\n : `view \"${name}\": unknown field \"${field}\" on model \"${model.name}\"`,\n meta: { view: name, model: model.name, field },\n });\n }\n fields.add(field);\n }\n if (fields.size === 0) {\n throw validationError({\n message: `view \"${name}\": definition.${key} exposes no fields`,\n meta: { view: name, model: model.name },\n });\n }\n resolved.set(model.clientName, { model, fields });\n }\n if (resolved.size === 0) {\n throw validationError({\n message: `view \"${name}\": the definition names no models`,\n meta: { view: name },\n });\n }\n return resolved;\n}\n\n// ─── Args merging ─────────────────────────────────────────────────\n\n/** Per-level wrap instructions produced alongside the merged args. */\ntype WrapPlan = {\n /** Scalar keys (plus `_count` when requested) to expose on the ViewResult. */\n readonly expose: ReadonlySet<string>;\n readonly revealed: ReadonlySet<string>;\n /** Included relations: a nested plan when masked, `null` for passthrough. */\n readonly relations: ReadonlyMap<string, WrapPlan | null>;\n};\n\n/** Top-level args the merge passes through untouched. */\nconst PASSTHROUGH_ARG_KEYS: readonly string[] = [\n \"where\",\n \"orderBy\",\n \"take\",\n \"skip\",\n \"cursor\",\n \"distinct\",\n \"relationStrategy\",\n];\n\nfunction revealSet(params: {\n name: string;\n mask: ViewMask;\n reveal: unknown;\n}): Set<string> {\n const { name, mask, reveal } = params;\n const revealed = new Set<string>();\n if (reveal === undefined) return revealed;\n if (!isPlainObject(reveal)) {\n throw validationError({\n message: `view \"${name}\": reveal must be an object of { field: true }`,\n meta: { view: name, model: mask.model.name },\n });\n }\n for (const [field, flag] of Object.entries(reveal)) {\n if (flag === undefined || flag === false) continue;\n if (flag !== true) {\n throw validationError({\n message: `view \"${name}\": reveal.${field} must be true or false`,\n meta: { view: name, model: mask.model.name, field },\n });\n }\n if (!mask.model.fieldByName.has(field)) {\n throw validationError({\n message: `view \"${name}\": cannot reveal \"${field}\" — not a scalar field of model \"${mask.model.name}\"`,\n meta: { view: name, model: mask.model.name, field },\n });\n }\n // Revealing a field the view already shows is a no-op, not a reveal:\n // it stays visible in JSON output.\n if (!mask.fields.has(field)) revealed.add(field);\n }\n return revealed;\n}\n\n/**\n * Merge ONE level of user args with the view mask: the definition's fields\n * become a `select` (narrowed by the user's own select, widened by `reveal`),\n * relation entries from `include`/`select` are restricted recursively when\n * their target model is in the definition, and everything else passes through.\n */\nfunction mergeLevel(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ResolvedDefinition;\n mask: ViewMask;\n args: Record<string, unknown>;\n}): { merged: Record<string, unknown>; plan: WrapPlan } {\n const { meta, name, definition, mask, args } = params;\n const model = mask.model;\n\n if (args.omit !== undefined) {\n throw validationError({\n message: `view \"${name}\": omit is not available on a view query — the definition already restricts ${model.name}'s fields`,\n meta: { view: name, model: model.name },\n });\n }\n\n const revealed = revealSet({ name, mask, reveal: args.reveal });\n\n // Scalar half of the user's select (relation keys are handled below).\n let scalars: Set<string>;\n const userSelect = args.select;\n if (userSelect !== undefined && !isPlainObject(userSelect)) {\n throw validationError({\n message: `view \"${name}\": select must be an object`,\n meta: { view: name, model: model.name },\n });\n }\n if (isPlainObject(userSelect)) {\n scalars = new Set<string>();\n for (const [key, flag] of Object.entries(userSelect)) {\n if (flag === false || flag === undefined) continue;\n // v1 semantics: select narrows WITHIN the view — outside keys are dropped.\n if (model.fieldByName.has(key) && mask.fields.has(key)) scalars.add(key);\n }\n if (scalars.size === 0) scalars = new Set(mask.fields);\n } else {\n scalars = new Set(mask.fields);\n }\n\n // Relation specs come from include and select alike (include wins on clash).\n const relationSpecs = new Map<string, unknown>();\n let countSpec: unknown;\n const collectRelations = (source: unknown, argName: string): void => {\n if (source === undefined) return;\n if (!isPlainObject(source)) {\n throw validationError({\n message: `view \"${name}\": ${argName} must be an object`,\n meta: { view: name, model: model.name },\n });\n }\n for (const [key, spec] of Object.entries(source)) {\n if (spec === false || spec === undefined) continue;\n if (key === \"_count\") {\n countSpec = spec;\n continue;\n }\n if (model.relationByName.has(key)) relationSpecs.set(key, spec);\n else if (argName === \"include\") {\n throw validationError({\n message: `view \"${name}\": unknown relation \"${key}\" on model \"${model.name}\" in include`,\n meta: { view: name, model: model.name, relation: key },\n });\n }\n }\n };\n collectRelations(args.select, \"select\");\n collectRelations(args.include, \"include\");\n\n // Effective select: scalars + revealed + relation specs (+ _count).\n const select: Record<string, unknown> = {};\n for (const key of scalars) select[key] = true;\n for (const key of revealed) select[key] = true;\n\n const relationPlans = new Map<string, WrapPlan | null>();\n for (const [relationName, spec] of relationSpecs) {\n const relation = model.relationByName.get(relationName);\n if (relation === undefined) continue; // collectRelations guaranteed presence\n const target = meta.modelByName.get(relation.targetModel);\n const targetMask = target === undefined ? undefined : definition.get(target.clientName);\n if (targetMask === undefined) {\n // Related model not in the definition — pass through unrestricted (v1).\n select[relationName] = spec;\n relationPlans.set(relationName, null);\n continue;\n }\n if (spec === true) {\n const child = mergeLevel({ meta, name, definition, mask: targetMask, args: {} });\n select[relationName] = child.merged;\n relationPlans.set(relationName, child.plan);\n continue;\n }\n if (!isPlainObject(spec)) {\n throw validationError({\n message: `view \"${name}\": include.${relationName} must be true or an object`,\n meta: { view: name, model: model.name, relation: relationName },\n });\n }\n const child = mergeLevel({ meta, name, definition, mask: targetMask, args: spec });\n select[relationName] = child.merged;\n relationPlans.set(relationName, child.plan);\n }\n\n const expose = new Set<string>(scalars);\n if (countSpec !== undefined) {\n select._count = countSpec;\n expose.add(\"_count\");\n }\n\n const merged: Record<string, unknown> = {};\n for (const key of PASSTHROUGH_ARG_KEYS) {\n if (args[key] !== undefined) merged[key] = args[key];\n }\n merged.select = select;\n\n return {\n merged,\n plan: { expose, revealed, relations: relationPlans },\n };\n}\n\n// ─── Result wrapping ──────────────────────────────────────────────\n\nfunction wrapRows(params: { rows: readonly ClientRow[]; plan: WrapPlan }): ViewResult[] {\n const { rows, plan } = params;\n return rows.map((row) => {\n const record: Record<string, unknown> = { ...row };\n const expose = new Set(plan.expose);\n for (const [relationName, childPlan] of plan.relations) {\n expose.add(relationName);\n if (childPlan === null) continue; // passthrough relation — leave rows as-is\n const value = record[relationName];\n if (Array.isArray(value)) {\n record[relationName] = wrapRows({ rows: value as ClientRow[], plan: childPlan });\n } else if (isPlainObject(value)) {\n record[relationName] = wrapRows({ rows: [value], plan: childPlan })[0];\n }\n }\n for (const key of plan.revealed) expose.add(key);\n return new ViewResult({ record, expose, revealed: plan.revealed });\n });\n}\n\n// ─── View delegates ───────────────────────────────────────────────\n\nconst VIEW_WRITE_METHODS: readonly string[] = [\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"update\",\n \"updateMany\",\n \"updateManyAndReturn\",\n \"upsert\",\n \"upsertMany\",\n \"delete\",\n \"deleteMany\",\n];\n\nfunction createViewDelegate(params: {\n meta: RuntimeMeta;\n name: string;\n definition: ResolvedDefinition;\n mask: ViewMask;\n delegate: ModelDelegate;\n}): ViewModelDelegate {\n const { meta, name, definition, mask, delegate } = params;\n\n const merge = (args: ClientRow | undefined): { merged: Record<string, unknown>; plan: WrapPlan } => {\n const raw = args ?? {};\n if (!isPlainObject(raw)) {\n throw validationError({\n message: `view \"${name}\": query args must be an object`,\n meta: { view: name, model: mask.model.name },\n });\n }\n return mergeLevel({ meta, name, definition, mask, args: raw });\n };\n\n const wrapOne = (row: ClientRow | null, plan: WrapPlan): ViewResult | null => {\n if (row === null) return null;\n return wrapRows({ rows: [row], plan })[0] ?? null;\n };\n\n const view: Record<string, unknown> = {\n findMany: async (args?: ClientRow): Promise<ViewResult[]> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: await delegate.findMany(merged), plan });\n },\n findFirst: async (args?: ClientRow): Promise<ViewResult | null> => {\n const { merged, plan } = merge(args);\n return wrapOne(await delegate.findFirst(merged), plan);\n },\n findFirstOrThrow: async (args?: ClientRow): Promise<ViewResult> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: [await delegate.findFirstOrThrow(merged)], plan })[0] as ViewResult;\n },\n findUnique: async (args: ClientRow): Promise<ViewResult | null> => {\n const { merged, plan } = merge(args);\n return wrapOne(await delegate.findUnique(merged), plan);\n },\n findUniqueOrThrow: async (args: ClientRow): Promise<ViewResult> => {\n const { merged, plan } = merge(args);\n return wrapRows({ rows: [await delegate.findUniqueOrThrow(merged)], plan })[0] as ViewResult;\n },\n // Aggregations pass through untouched (v1): they return computed values,\n // not rows, so the mask has nothing to hide.\n count: (args?: ClientRow): Promise<number | Record<string, number>> => delegate.count(args),\n aggregate: (args: ClientRow): Promise<ClientRow> => delegate.aggregate(args),\n groupBy: (args: ClientRow): Promise<ClientRow[]> => delegate.groupBy(args),\n };\n\n for (const method of VIEW_WRITE_METHODS) {\n view[method] = (): never => {\n throw validationError({\n message: `view \"${name}\" is read-only — ${method}() is not available on a field-masking view; write through the base client instead`,\n meta: { view: name, model: mask.model.name, method },\n });\n };\n }\n\n return view as ViewModelDelegate;\n}\n\n// ─── Entry points ─────────────────────────────────────────────────\n\n/**\n * Build a field-masking view client over an existing client's delegates.\n *\n * @throws VibeError `VIBE_VALIDATION` on an invalid definition (unknown model,\n * unknown or relation field, empty field set).\n */\nexport function createView(params: {\n meta: RuntimeMeta;\n models: Readonly<Record<string, ModelDelegate>>;\n name: string;\n definition: ViewDefinition;\n}): ViewClientShape {\n const { meta, models, name, definition } = params;\n const resolved = resolveDefinition({ meta, name, definition });\n const view: Record<string, ViewModelDelegate> = {};\n for (const [clientName, mask] of resolved) {\n const delegate = models[clientName];\n if (delegate === undefined) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `view \"${name}\": no delegate for model \"${mask.model.name}\"`,\n meta: { view: name, model: mask.model.name },\n });\n }\n view[clientName] = createViewDelegate({ meta, name, definition: resolved, mask, delegate });\n }\n return view;\n}\n\n/**\n * Attach `$defineView` to a built client (called by `buildClient`; transaction\n * clients get their own attachment because `$transaction` rebuilds the client).\n */\nexport function attachDefineView(params: {\n client: object;\n meta: RuntimeMeta;\n models: Readonly<Record<string, ModelDelegate>>;\n}): void {\n const { client, meta, models } = params;\n const value: DefineViewFn = (options) =>\n createView({ meta, models, name: options.name, definition: options.definition });\n Object.defineProperty(client, \"$defineView\", { value, enumerable: true });\n}\n",
25
+ "/**\n * Opt-in write-boundary validation (EPIC 3) — Standard-Schema validators\n * mounted per model × field, run on every write path (nested creates\n * included) BEFORE the data reaches the encoder. Decode-side is deliberately\n * untouched: validation taxes writes the caller opted into, never every row\n * materialization (rule 8; board #30).\n *\n * The interface is the published Standard Schema contract\n * (https://standardschema.dev) — zod, valibot and arktype all implement it —\n * vendored as a minimal type so the runtime takes no dependency.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── Standard Schema (minimal vendored contract) ─────────────────\n\n/** One validation issue as Standard Schema defines it. */\nexport type StandardIssue = {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>;\n};\n\n/** The Standard Schema v1 contract — the only surface the runtime touches. */\nexport type StandardSchemaV1<Input = unknown, Output = Input> = {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) => { value: Output; issues?: undefined } | { issues: readonly StandardIssue[] } | Promise<unknown>;\n };\n};\n\n/** Per-model, per-field validator config: `{ User: { settings: zodSchema } }`. */\nexport type WriteValidators = {\n readonly [model: string]: { readonly [field: string]: StandardSchemaV1 };\n};\n\n// ─── Application ─────────────────────────────────────────────────\n\nfunction validationFailed(params: {\n model: string;\n field: string;\n issues: readonly StandardIssue[];\n}): VibeError {\n return new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `validation failed for ${params.model}.${params.field}: ${params.issues[0]?.message ?? \"invalid value\"}`,\n meta: { model: params.model, field: params.field, issues: params.issues },\n });\n}\n\nfunction validateValue(params: {\n model: string;\n field: string;\n schema: StandardSchemaV1;\n value: unknown;\n}): unknown {\n const result = params.schema[\"~standard\"].validate(params.value);\n if (result instanceof Promise) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `async validator on ${params.model}.${params.field} — write validators must be synchronous (validate before calling the client for async rules)`,\n meta: { model: params.model, field: params.field },\n });\n }\n if (result.issues !== undefined) {\n throw validationFailed({ model: params.model, field: params.field, issues: result.issues });\n }\n return result.value;\n}\n\n/**\n * Field-level write operators the query builder understands. `set` and `push`\n * carry a value that WILL be stored (so the validator sees the inner value);\n * the arithmetic operators carry a delta, not a value, and are passed through.\n */\nconst ATOMIC_OPERATORS: readonly string[] = [\"set\", \"increment\", \"decrement\", \"multiply\", \"divide\", \"push\"];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Which atomic operator this value expresses for this field, or `undefined`\n * when it is a plain value.\n *\n * MIRRORS the query builder exactly (`query-builder.ts`, \"Json values are\n * opaque payloads\"): inside a `Json` column an object is DATA, never an\n * operator, and elsewhere an operator object carries exactly one known key.\n * The old rule — \"any object containing `set`\" — silently truncated a JSON\n * document `{ set: \"chosen\", keep: \"must-survive\" }` down to its `set` member.\n */\nfunction operatorOf(params: { model: ModelMeta; field: string; value: unknown }): string | undefined {\n const { model, field, value } = params;\n if (!isPlainObject(value)) return undefined;\n const meta = model.fieldByName.get(field);\n if (meta === undefined || meta.scalarType === \"Json\") return undefined;\n const keys = Object.keys(value);\n const only = keys.length === 1 ? (keys[0] as string) : undefined;\n return only !== undefined && ATOMIC_OPERATORS.includes(only) ? only : undefined;\n}\n\n/**\n * Validate one data row (create/update shape) for `model`, recursing into\n * every nested write body on every related model. Returns the (possibly\n * transformed) data — Standard Schema allows coercion.\n *\n * Traversal is UNCONDITIONAL (F09): it does not stop at a related model that\n * configures no validators of its own, because a model further down may.\n */\nexport function validateWriteData(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n data: Record<string, unknown>;\n validators: WriteValidators;\n}): Record<string, unknown> {\n const { meta, model, data, validators } = params;\n const fieldSchemas = validators[model.name];\n const out: Record<string, unknown> = { ...data };\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const schema = fieldSchemas?.[key];\n if (schema !== undefined) {\n const operator = operatorOf({ model, field: key, value });\n const check = (inner: unknown): unknown => validateValue({ model: model.name, field: key, schema, value: inner });\n if (operator === \"set\") {\n out[key] = { set: check((value as { set: unknown }).set) };\n } else if (operator === \"push\") {\n const operand = (value as { push: unknown }).push;\n out[key] = { push: Array.isArray(operand) ? operand.map(check) : check(operand) };\n } else if (operator !== undefined) {\n out[key] = value; // arithmetic delta — not a value that gets stored\n } else {\n out[key] = check(value);\n }\n continue;\n }\n\n // Nested relation writes: recurse into every body that CREATEs or UPDATEs.\n const relation = model.relationByName.get(key);\n if (relation === undefined || typeof value !== \"object\" || value === null) continue;\n const target = meta.modelByName.get(relation.targetModel);\n if (target === undefined) continue;\n out[key] = validateNestedVerbs({ meta, target, verbs: value as Record<string, unknown>, validators });\n }\n return out;\n}\n\n/** Walk one relation's nested-write verbs, validating every row body inside. */\nfunction validateNestedVerbs(params: {\n meta: RuntimeMeta;\n target: ModelMeta;\n verbs: Record<string, unknown>;\n validators: WriteValidators;\n}): Record<string, unknown> {\n const { meta, target, verbs, validators } = params;\n const one = (row: unknown): unknown =>\n isPlainObject(row) ? validateWriteData({ meta, model: target, data: row, validators }) : row;\n const many = (value: unknown): unknown => (Array.isArray(value) ? value.map(one) : one(value));\n /** `{ where, data }` / `{ where, create, update }` bodies keep their `where`. */\n const body = (value: unknown, arms: readonly (\"data\" | \"create\" | \"update\")[]): unknown => {\n if (!isPlainObject(value)) return value;\n if (!arms.some((arm) => value[arm] !== undefined)) return one(value);\n const next: Record<string, unknown> = { ...value };\n for (const arm of arms) {\n if (value[arm] !== undefined) next[arm] = many(value[arm]);\n }\n return next;\n };\n const eachBody = (value: unknown, arms: readonly (\"data\" | \"create\" | \"update\")[]): unknown =>\n Array.isArray(value) ? value.map((item) => body(item, arms)) : body(value, arms);\n\n const next: Record<string, unknown> = { ...verbs };\n if (verbs.create !== undefined) next.create = many(verbs.create);\n if (verbs.createMany !== undefined) {\n next.createMany = isPlainObject(verbs.createMany)\n ? { ...verbs.createMany, data: many(verbs.createMany.data) }\n : many(verbs.createMany);\n }\n if (verbs.connectOrCreate !== undefined) {\n const entries = Array.isArray(verbs.connectOrCreate) ? verbs.connectOrCreate : [verbs.connectOrCreate];\n const mapped = entries.map((entry) =>\n isPlainObject(entry) ? { ...entry, create: many(entry.create) } : entry,\n );\n next.connectOrCreate = Array.isArray(verbs.connectOrCreate) ? mapped : mapped[0];\n }\n if (verbs.update !== undefined) next.update = eachBody(verbs.update, [\"data\"]);\n if (verbs.updateMany !== undefined) next.updateMany = eachBody(verbs.updateMany, [\"data\"]);\n if (verbs.upsert !== undefined) next.upsert = eachBody(verbs.upsert, [\"create\", \"update\"]);\n return next;\n}\n\n/** Rewrite a write method's args through the validators; non-write args pass through untouched. */\nexport function applyWriteValidators(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n method: string;\n args: Record<string, unknown>;\n validators: WriteValidators;\n}): Record<string, unknown> {\n const { meta, model, method, args, validators } = params;\n const validate = (row: unknown): unknown =>\n typeof row === \"object\" && row !== null\n ? validateWriteData({ meta, model, data: row as Record<string, unknown>, validators })\n : row;\n\n if (\n method === \"create\" ||\n method === \"update\" ||\n method === \"updateMany\" ||\n method === \"updateManyAndReturn\"\n ) {\n return args.data === undefined ? args : { ...args, data: validate(args.data) };\n }\n if (method === \"createMany\" || method === \"createManyAndReturn\") {\n return Array.isArray(args.data) ? { ...args, data: args.data.map(validate) } : args;\n }\n if (method === \"upsert\") {\n return { ...args, create: validate(args.create), update: validate(args.update) };\n }\n return args;\n}\n",
26
+ "import { internalError } from \"@vibeorm/schema\";\nimport type { DynamicClient } from \"./client.ts\";\n\ntype PolicyOperationFactory = <T>(run: (client: DynamicClient) => Promise<T>) => Promise<T>;\nconst factories = new WeakMap<DynamicClient, PolicyOperationFactory>();\n\n/** Register the engine-owned deferred-operation factory without exposing it on clients. */\nexport function registerPolicyOperations(params: { client: DynamicClient; factory: PolicyOperationFactory }): void {\n factories.set(params.client, params.factory);\n}\n\n/** Defer the whole policy flow; its client is selected by the ordinary array-transaction runner. */\nexport function deferPolicyOperation<T>(params: { client: DynamicClient; run: (client: DynamicClient) => Promise<T> }): Promise<T> {\n const factory = factories.get(params.client);\n if (factory === undefined) throw internalError({ message: \"policy client has no deferred-operation factory\" });\n return factory(params.run);\n}\n",
27
+ "import { deferPolicyOperation } from \"./policy-operation.ts\";\nimport { protectWriteScope } from \"./write-scope.ts\";\nimport { resolveRelationLink } from \"./relation-plan.ts\";\n/**\n * Policy scoping — `$withPolicy` / `$bypassPolicy` (EPIC 4b).\n *\n * Application-level ROW scoping for models declaring `@@policy`, implemented\n * as an args-rewriting layer over the built delegates (the views.ts pattern:\n * ZERO query-builder edits — every emitted statement is a shape the catalogs\n * already pin). Complements `$defineView` (COLUMN masking) and, on postgres,\n * database RLS (the defense-in-depth backstop; see docs/migrations.md).\n *\n * Semantics:\n * - FAIL CLOSED: on a client whose schema declares any @@policy, the base\n * delegates of policied models refuse every method until the caller binds\n * a context (`$withPolicy({ tenant })`) or bypasses deliberately\n * (`$bypassPolicy()` — explicit and greppable).\n * - Reads AND the policy predicate into `where` (findUnique rewrites to\n * findFirst over the flattened unique key). Policied CHILD models are\n * scoped inside include/select at any depth.\n * - `create`/`createMany` FORCE the context value into the data (a\n * conflicting explicit value is VIBE_VALIDATION). Nested `create` on a\n * policied child is forced too.\n * - `update`/`delete`/`upsert` run as lock-read (FOR UPDATE) + write-by-PK\n * inside one transaction; a cross-context target is VIBE_NOT_FOUND.\n * - Nested verbs REFERENCING existing rows of a policied child (connect,\n * connectOrCreate, set, disconnect, nested update/delete/upsert) are\n * REFUSED from a scoped client in this first cut — fail-closed beats a\n * silent hole. `$queryRaw`/`$executeRaw` are outside policy by design.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport type { BatchResult, ClientRow, DynamicClient, ModelDelegate } from \"./client.ts\";\nimport { attachDefineView } from \"./views.ts\";\n\n/** Values a policy context may bind — the scoping column's scalar shape. */\nexport type PolicyContextValue = string | number | bigint;\n\ntype PolicyContext = Readonly<Record<string, PolicyContextValue>>;\n\nfunction policyError(message: string, meta?: Record<string, unknown>): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message, meta: meta ?? {} });\n}\n\nfunction policiedModels(meta: RuntimeMeta): ModelMeta[] {\n return meta.models.filter((model) => model.policy !== undefined);\n}\n\nfunction isPlainObject(value: unknown): value is ClientRow {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Run a synchronous rewrite and hand back the delegate's OWN promise (F06).\n *\n * The wrappers used to be `async`, which wraps the underlying QueryPromise in a\n * fresh native promise: `$transaction([...])` only accepts its own deferred\n * operations, so a policy-scoped write was rejected as \"foreign\" *while the\n * write it wrapped had already dispatched outside the transaction*. Returning\n * the delegate's promise unchanged preserves that identity; a synchronous\n * refusal still surfaces as a REJECTION, never a throw.\n */\nfunction deferred<T>(build: () => Promise<T>): Promise<T> {\n try {\n return build();\n } catch (error) {\n return Promise.reject(error);\n }\n}\n\n/** The policy predicate for a policied model under `context`. */\nfunction predicateFor(params: { model: ModelMeta; context: PolicyContext }): ClientRow {\n const policy = params.model.policy as NonNullable<ModelMeta[\"policy\"]>;\n const value = params.context[policy.context];\n if (value === undefined || value === null) {\n throw policyError(`model ${params.model.name} declares @@policy — bind a context with $withPolicy({ ${policy.context}: ... }) or bypass deliberately with $bypassPolicy()`, { model: params.model.name, context: policy.context });\n }\n return { [policy.field]: value };\n}\n\n// ─── Where / args rewriting ──────────────────────────────────────\n\nfunction mergeWhere(params: { where: unknown; field: string; value: PolicyContextValue }): ClientRow {\n const { where, field, value } = params;\n const predicate: ClientRow = { [field]: value };\n return where === undefined ? predicate : { AND: [where as ClientRow, predicate] };\n}\n\n/** Flatten a unique where ({ id } or { a_b: {...} }) into a plain filter object. */\nfunction uniqueToFilter(params: { model: ModelMeta; where: ClientRow }): ClientRow {\n const out: ClientRow = {};\n for (const [key, value] of Object.entries(params.where)) {\n const isCompound =\n typeof value === \"object\" && value !== null && !Array.isArray(value) &&\n params.model.compoundUniques.has(key);\n if (isCompound) Object.assign(out, value as ClientRow);\n else out[key] = value;\n }\n return out;\n}\n\n/**\n * Merge the policy predicate into RELATION FILTERS inside a `where`, at any\n * depth, so a filter cannot probe rows the caller may not read.\n *\n * Mirrors `scoped.ts`'s proven rewrite rules: `some`/`none` and to-one\n * `is`/`isNot` AND the predicate into the child filter; `every` becomes\n * `none: { AND: [predicate, NOT: filter] }` (\"every VISIBLE child matches\"),\n * because AND-ing a predicate into `every` would silently answer a different\n * question. Traversal continues through UNPOLICIED relations — a global\n * intermediate is a path to a policied model, not a stopping point.\n */\nfunction scopeWhere(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n where: unknown;\n context: PolicyContext;\n}): unknown {\n const { meta, model, where, context } = params;\n if (!isPlainObject(where)) return where;\n const out: ClientRow = {};\n const extra: ClientRow[] = [];\n const walkGroup = (value: unknown): unknown =>\n Array.isArray(value)\n ? value.map((item) => scopeWhere({ meta, model, where: item, context }))\n : scopeWhere({ meta, model, where: value, context });\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n out[key] = walkGroup(value);\n continue;\n }\n const relation = model.relationByName.get(key);\n const target = relation === undefined ? undefined : meta.modelByName.get(relation.targetModel);\n if (relation === undefined || target === undefined) {\n out[key] = value;\n continue;\n }\n const scoped = target.policy !== undefined;\n const pred = (): ClientRow => predicateFor({ model: target, context });\n const walkChild = (child: unknown): unknown =>\n isPlainObject(child) ? scopeWhere({ meta, model: target, where: child, context }) : child;\n const parts: ClientRow[] = [];\n\n if (relation.isList) {\n if (!isPlainObject(value)) {\n out[key] = value; // builder refuses the shape\n continue;\n }\n for (const [op, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if (op === \"some\" || op === \"none\") {\n const walked = walkChild(operand);\n parts.push({ [op]: scoped ? { AND: [walked, pred()] } : walked });\n } else if (op === \"every\") {\n const walked = walkChild(operand);\n parts.push(scoped ? { none: { AND: [pred(), { NOT: [walked] }] } } : { every: walked });\n } else {\n parts.push({ [op]: operand }); // unknown operator — builder refuses\n }\n }\n } else {\n const arms: Array<{ arm: \"is\" | \"isNot\"; operand: unknown }> = [];\n if (value === null) {\n arms.push({ arm: \"is\", operand: null });\n } else if (isPlainObject(value) && (\"is\" in value || \"isNot\" in value)) {\n let mixed = false;\n for (const [op, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if (op === \"is\" || op === \"isNot\") arms.push({ arm: op, operand });\n else mixed = true;\n }\n if (mixed) {\n out[key] = value; // builder refuses mixing is/isNot with other keys\n continue;\n }\n } else if (isPlainObject(value)) {\n arms.push({ arm: \"is\", operand: value });\n } else {\n out[key] = value; // builder refuses the shape\n continue;\n }\n for (const { arm, operand } of arms) {\n if (operand === null) {\n parts.push(scoped ? (arm === \"is\" ? { isNot: pred() } : { is: pred() }) : { [arm]: null });\n } else {\n const walked = walkChild(operand);\n parts.push({ [arm]: scoped ? { AND: [walked, pred()] } : walked });\n }\n }\n }\n\n if (parts.length === 0) {\n out[key] = value;\n continue;\n }\n const combined: ClientRow = {};\n for (const part of parts) {\n const opKey = Object.keys(part)[0] as string;\n if (opKey in combined) extra.push({ [key]: part });\n else combined[opKey] = part[opKey];\n }\n out[key] = combined;\n }\n\n if (extra.length > 0) {\n const existing = out.AND === undefined ? [] : Array.isArray(out.AND) ? out.AND : [out.AND];\n out.AND = [...existing, ...extra];\n }\n return out;\n}\n\n/** Relation ordering has no child-policy predicate slot; refuse that inference channel. */\nfunction assertPolicyOrder(params: { meta: RuntimeMeta; model: ModelMeta; orderBy: unknown }): void {\n const { meta, model, orderBy } = params;\n for (const term of Array.isArray(orderBy) ? orderBy : [orderBy]) {\n if (!isPlainObject(term)) continue;\n for (const [name, spec] of Object.entries(term)) {\n if (spec === undefined) continue;\n const relation = model.relationByName.get(name);\n const target = relation === undefined ? undefined : meta.modelByName.get(relation.targetModel);\n if (target === undefined) continue;\n if (target.policy !== undefined) {\n throw policyError(`orderBy through ${model.name}.${name} cannot enforce @@policy — order by the model's own columns instead`, { model: model.name, relation: name });\n }\n assertPolicyOrder({ meta, model: target, orderBy: spec });\n }\n }\n}\n\n/**\n * Scope policied child models inside include/select relation args, any depth,\n * plus every relation filter in the args' own `where` / `orderBy`-free blocks.\n *\n * F04: traversal continues THROUGH unpolicied (global) intermediates — before,\n * a global model in the middle of an include tree ended the walk and every\n * policied model below it came back unfiltered.\n */\nfunction scopeSelection(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n args: ClientRow;\n context: PolicyContext;\n}): ClientRow {\n const { meta, model, args, context } = params;\n const out: ClientRow = { ...args };\n assertPolicyOrder({ meta, model, orderBy: args.orderBy });\n for (const key of [\"include\", \"select\"] as const) {\n const block = args[key];\n if (!isPlainObject(block)) continue;\n const next: ClientRow = { ...block };\n for (const [name, spec] of Object.entries(block)) {\n if (spec === undefined || spec === false) continue;\n if (name === \"_count\") {\n const names = spec === true\n ? model.relations.filter((relation) => relation.isList).map((relation) => relation.name)\n : isPlainObject(spec) && isPlainObject(spec.select)\n ? Object.keys(spec.select).filter((key) => {\n const entry = (spec.select as ClientRow)[key];\n return entry === true || isPlainObject(entry);\n })\n : [];\n const countSelect = isPlainObject(spec) && isPlainObject(spec.select) ? { ...spec.select } : undefined;\n for (const counted of names) {\n const relation = model.relationByName.get(counted);\n const target = relation === undefined ? undefined : meta.modelByName.get(relation.targetModel);\n if (target?.policy !== undefined) {\n throw policyError(`_count of ${model.name}.${counted} cannot enforce @@policy because relation counts take no filter — use a scoped child count query instead`, { model: model.name, relation: counted });\n }\n const entry = countSelect?.[counted];\n if (target !== undefined && countSelect !== undefined && isPlainObject(entry) && entry.where !== undefined) {\n countSelect[counted] = { ...entry, where: scopeWhere({ meta, model: target, where: entry.where, context }) };\n }\n }\n if (countSelect !== undefined) next[name] = { ...(spec as ClientRow), select: countSelect };\n continue;\n }\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n const target = meta.modelByName.get(relation.targetModel);\n if (target === undefined) continue;\n // `true` on an UNPOLICIED relation loads nothing that needs scoping and\n // has no deeper selection — leave the caller's shorthand alone.\n if (spec === true && target.policy === undefined) continue;\n const spec2: ClientRow = spec === true ? {} : { ...(spec as ClientRow) };\n if (spec2.where !== undefined) {\n spec2.where = scopeWhere({ meta, model: target, where: spec2.where, context });\n }\n if (target.policy !== undefined) {\n const pred = predicateFor({ model: target, context });\n spec2.where = spec2.where === undefined ? pred : { AND: [spec2.where, pred] };\n }\n next[name] = scopeSelection({ meta, model: target, args: spec2, context });\n }\n out[key] = next;\n }\n return out;\n}\n\n/**\n * Selection + relation-filter scoping for ANY model's args (policied or not).\n * The policied model's own root predicate is merged separately by the callers\n * that own a root policy.\n */\nfunction scopeArgs(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n args: ClientRow;\n context: PolicyContext;\n}): ClientRow {\n const { meta, model, args, context } = params;\n const scoped = scopeSelection({ meta, model, args, context });\n return scoped.where === undefined\n ? scoped\n : { ...scoped, where: scopeWhere({ meta, model, where: scoped.where, context }) };\n}\n\nconst REFERENCE_VERBS = [\"connect\", \"connectOrCreate\", \"set\", \"disconnect\", \"update\", \"updateMany\", \"delete\", \"deleteMany\", \"upsert\"];\n\n/**\n * Rewrite write data for one model under the bound context (F02).\n *\n * - `create`: a conflicting explicit policy value is refused, then the context\n * value is FORCED in.\n * - `update`: writing the policy column at all — plainly or through the atomic\n * `{ set }` form — is refused unless it restates the bound value. A scoped\n * handle can never move a row between tenants, and it never silently\n * rewrites the column either.\n * - Both phases refuse the reference verbs on a POLICIED child (the file's\n * documented fail-closed stance, previously enforced on create only).\n * - Traversal continues through UNPOLICIED relations, so a global intermediate\n * cannot be used as a tunnel to a policied grandchild.\n */\nfunction forceWriteData(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n data: ClientRow;\n context: PolicyContext;\n phase: \"create\" | \"update\";\n}): ClientRow {\n const { meta, model, data, context, phase } = params;\n let out: ClientRow = { ...data };\n if (model.policy !== undefined) {\n const value = predicateFor({ model, context })[model.policy.field] as PolicyContextValue;\n const given = data[model.policy.field];\n const explicit = isPlainObject(given) && \"set\" in given ? given.set : given;\n if (explicit !== undefined && explicit !== value) {\n throw policyError(\n `${phase} on ${model.name}: data.${model.policy.field} conflicts with the bound policy context`,\n { model: model.name, field: model.policy.field, phase },\n );\n }\n if (phase === \"create\") out[model.policy.field] = value;\n const field = model.policy.field;\n if (model.relations.some((relation) => relation.fields?.includes(field) && out[relation.name] !== undefined)) {\n out = protectWriteScope({ data: out, field, value,\n error: policyError(`relation resolution cannot change ${model.name}.${field} away from the bound policy context`, { model: model.name, field }),\n });\n }\n }\n for (const [name, spec] of Object.entries(data)) {\n const relation = model.relationByName.get(name);\n if (relation === undefined || !isPlainObject(spec)) continue;\n const target = meta.modelByName.get(relation.targetModel);\n if (target === undefined) continue;\n if (target.policy !== undefined) {\n for (const verb of REFERENCE_VERBS) {\n if (spec[verb] !== undefined) {\n throw policyError(\n `nested ${verb} on policied model ${target.name} is not policy-safe from a scoped client — perform it in an explicit $transaction on the scoped delegate`,\n { model: model.name, relation: name, verb },\n );\n }\n }\n }\n let verbs = forceNestedVerbs({ meta, target, verbs: spec, context });\n if (target.policy !== undefined) {\n const link = resolveRelationLink({ meta, model, relation });\n const policyField = target.policy.field;\n // A COMPOSITE foreign key protects the policy column when ANY of its\n // members is that column — not only when it is the first one.\n if (\n (link.kind === \"toManyFk\" || link.kind === \"toOneInverse\") &&\n link.childKeys.some((member) => member.name === policyField)\n ) {\n const field = policyField;\n verbs = protectWriteScope({ data: verbs, field, value: predicateFor({ model: target, context })[field],\n error: policyError(`relation resolution cannot change ${target.name}.${field} away from the bound policy context`, { model: target.name, field }),\n });\n }\n }\n out[name] = verbs;\n }\n return out;\n}\n\n/** Recurse into every data-carrying arm of one relation's nested-write verbs. */\nfunction forceNestedVerbs(params: {\n meta: RuntimeMeta;\n target: ModelMeta;\n verbs: ClientRow;\n context: PolicyContext;\n}): ClientRow {\n const { meta, target, verbs, context } = params;\n const walk = (row: unknown, phase: \"create\" | \"update\"): unknown =>\n isPlainObject(row) ? forceWriteData({ meta, model: target, data: row, context, phase }) : row;\n const each = (value: unknown, phase: \"create\" | \"update\"): unknown =>\n Array.isArray(value) ? value.map((row) => walk(row, phase)) : walk(value, phase);\n /** `{ where, data }` / `{ where, create, update }` bodies keep their where. */\n const body = (value: unknown, keys: readonly (\"data\" | \"create\" | \"update\")[]): unknown => {\n if (!isPlainObject(value)) return value;\n const hasArm = keys.some((key) => value[key] !== undefined);\n if (!hasArm) return each(value, \"update\");\n const next: ClientRow = { ...value };\n for (const key of keys) {\n if (value[key] === undefined) continue;\n next[key] = each(value[key], key === \"create\" ? \"create\" : \"update\");\n }\n return next;\n };\n\n const out: ClientRow = { ...verbs };\n if (verbs.create !== undefined) out.create = each(verbs.create, \"create\");\n if (verbs.createMany !== undefined && isPlainObject(verbs.createMany)) {\n out.createMany = { ...verbs.createMany, data: each(verbs.createMany.data, \"create\") };\n }\n if (verbs.connectOrCreate !== undefined) {\n const entries = Array.isArray(verbs.connectOrCreate) ? verbs.connectOrCreate : [verbs.connectOrCreate];\n const mapped = entries.map((entry) =>\n isPlainObject(entry) ? { ...entry, create: each(entry.create, \"create\") } : entry,\n );\n out.connectOrCreate = Array.isArray(verbs.connectOrCreate) ? mapped : mapped[0];\n }\n if (verbs.update !== undefined) {\n out.update = Array.isArray(verbs.update)\n ? verbs.update.map((item) => body(item, [\"data\"]))\n : body(verbs.update, [\"data\"]);\n }\n if (verbs.updateMany !== undefined) {\n out.updateMany = Array.isArray(verbs.updateMany)\n ? verbs.updateMany.map((item) => body(item, [\"data\"]))\n : body(verbs.updateMany, [\"data\"]);\n }\n if (verbs.upsert !== undefined) {\n out.upsert = Array.isArray(verbs.upsert)\n ? verbs.upsert.map((item) => body(item, [\"create\", \"update\"]))\n : body(verbs.upsert, [\"create\", \"update\"]);\n }\n return out;\n}\n\n// ─── Scoped delegate ─────────────────────────────────────────────\n\nfunction scopedDelegate(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n base: ModelDelegate & Record<string, unknown>;\n context: PolicyContext;\n operationClient: DynamicClient;\n}): ModelDelegate {\n const { meta, model, base, context, operationClient } = params;\n const defer = <T>(run: (client: DynamicClient) => Promise<T>): Promise<T> => deferPolicyOperation({ client: operationClient, run });\n const policy = model.policy as NonNullable<ModelMeta[\"policy\"]>;\n const value = context[policy.context] as PolicyContextValue;\n const pk = model.primaryKey.map((field) => field.name);\n\n const scopeFind = (args?: ClientRow): ClientRow => {\n const scoped = scopeArgs({ meta, model, args: args ?? {}, context });\n return { ...scoped, where: mergeWhere({ where: scoped.where, field: policy.field, value }) };\n };\n const scopeUnique = (args: ClientRow): ClientRow => {\n const scoped = scopeArgs({ meta, model, args, context });\n const flat = uniqueToFilter({ model, where: (scoped.where ?? {}) as ClientRow });\n return { ...scoped, where: mergeWhere({ where: flat, field: policy.field, value }) };\n };\n /** Selection scoping for a WRITE's row-returning include/select (F04). */\n const scopeWrite = (args: ClientRow): ClientRow => scopeSelection({ meta, model, args, context });\n const writeData = (data: unknown, phase: \"create\" | \"update\"): ClientRow =>\n forceWriteData({ meta, model, data: (data ?? {}) as ClientRow, context, phase });\n /** The client key that addresses the (possibly compound) primary key. */\n const pkClientKey = (): string => {\n for (const [key, group] of model.compoundUniques) {\n const names = group.fields.map((field) => field.name);\n if (names.length === pk.length && names.every((name) => pk.includes(name))) return key;\n }\n return pk.join(\"_\");\n };\n /**\n * Lock-read the policied row, then run `write` addressed by its PK.\n * Deliberately through tx.$bypassPolicy(): the tx client's own delegates are\n * fail-closed guards, and every filter here was ALREADY policy-merged by\n * this wrapper — the bypass unlocks the raw delegate, not the scoping.\n */\n const lockThen = async <T>(raw: DynamicClient, args: ClientRow, write: (raw: DynamicClient, pkWhere: ClientRow) => Promise<T>): Promise<T | null> => {\n const target = await (raw.$models[model.name] as ModelDelegate).findFirst({\n where: scopeUnique(args).where,\n select: Object.fromEntries(pk.map((name) => [name, true])),\n lock: \"update\",\n });\n if (target === null) return null;\n const pkWhere: ClientRow =\n pk.length === 1\n ? { [pk[0] as string]: (target as ClientRow)[pk[0] as string] }\n : { [pkClientKey()]: Object.fromEntries(pk.map((name) => [name, (target as ClientRow)[name]])) };\n return write(raw, pkWhere);\n };\n const notFound = (method: string): VibeError =>\n new VibeError({ code: \"VIBE_NOT_FOUND\", message: `${method} on ${model.name}: no row matches the unique where inside the bound policy context`, meta: { model: model.name, method } });\n\n return {\n findMany: (args?: ClientRow) => base.findMany(scopeFind(args)),\n findFirst: (args?: ClientRow) => base.findFirst(scopeFind(args)),\n findFirstOrThrow: (args?: ClientRow) => base.findFirstOrThrow(scopeFind(args)),\n findUnique: (args: ClientRow) => base.findFirst(scopeUnique(args)),\n findUniqueOrThrow: (args: ClientRow) => base.findFirstOrThrow(scopeUnique(args)),\n // `deferred`, not `async`: refusals still REJECT, but the delegate's own\n // claimable QueryPromise survives so array transactions can own the write.\n create: (args: ClientRow) =>\n deferred(() => base.create({ ...scopeWrite(args), data: writeData(args.data, \"create\") })),\n createMany: (args: ClientRow) =>\n deferred(() =>\n base.createMany({\n ...args,\n data: ((args.data ?? []) as ClientRow[]).map((row) => writeData(row, \"create\")),\n }),\n ),\n createManyAndReturn: (args: ClientRow) =>\n deferred(() =>\n base.createManyAndReturn({\n ...scopeWrite(args),\n data: ((args.data ?? []) as ClientRow[]).map((row) => writeData(row, \"create\")),\n }),\n ),\n update: (args: ClientRow) =>\n defer(async (tx) => {\n const raw = tx.$bypassPolicy === undefined ? tx : tx.$bypassPolicy();\n const data = writeData(args.data, \"update\");\n const row = await lockThen(raw, args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).update({ ...scopeWrite(args), data, where: pkWhere }),\n );\n if (row === null) throw notFound(\"update\");\n return row;\n }),\n updateMany: (args: ClientRow) =>\n deferred(() => base.updateMany({\n ...args,\n data: writeData(args.data, \"update\"),\n where: mergeWhere({\n where: scopeWhere({ meta, model, where: args.where, context }),\n field: policy.field,\n value,\n }),\n })),\n // EPIC 10: deliberately NOT routed — a `conflictTarget` that omits the policy\n // field would let one tenant's feed overwrite another tenant's row. Refuses\n // loudly rather than passing through unpolicied. See notes-epic10.md hand-off 4.\n upsertMany: (): Promise<never> => {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: \"upsertMany is not available on a policy-bound client: its conflict target is not policy-checked yet\",\n meta: { model: model.name },\n });\n },\n updateManyAndReturn: (args: ClientRow) =>\n deferred(() => {\n // Same F06 class as updateMany — ONE statement — so a policied call keeps\n // QueryPromise identity and stays claimable by an array $transaction.\n // The member is optional on ModelDelegate (rewriting handles may lack it),\n // so refuse with a code rather than calling undefined.\n const run = base.updateManyAndReturn;\n if (run === undefined) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: \"updateManyAndReturn is not available on this delegate\",\n meta: { model: model.name },\n });\n }\n return run({\n ...args,\n data: writeData(args.data, \"update\"),\n where: mergeWhere({\n where: scopeWhere({ meta, model, where: args.where, context }),\n field: policy.field,\n value,\n }),\n });\n }),\n upsert: (args: ClientRow) =>\n defer(async (tx) => {\n const raw = tx.$bypassPolicy === undefined ? tx : tx.$bypassPolicy();\n const update = writeData(args.update, \"update\");\n const create = writeData(args.create, \"create\");\n const projection = scopeWrite(\n Object.fromEntries(\n ([\"select\", \"include\"] as const).flatMap((key) => (args[key] === undefined ? [] : [[key, args[key]]])),\n ),\n );\n const row = await lockThen(raw, args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).update({ ...projection, where: pkWhere, data: update }),\n );\n if (row !== null) return row;\n // Miss inside the context → create arm (forced). A concurrent create\n // surfaces VIBE_UNIQUE_VIOLATION — documented, never hidden.\n return (await (raw.$models[model.name] as ModelDelegate).create({ ...projection, data: create })) as ClientRow;\n }),\n delete: (args: ClientRow) =>\n defer(async (tx) => {\n const raw = tx.$bypassPolicy === undefined ? tx : tx.$bypassPolicy();\n const row = await lockThen(raw, args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).delete({ ...scopeWrite(args), where: pkWhere }),\n );\n if (row === null) throw notFound(\"delete\");\n return row;\n }),\n deleteMany: (args?: ClientRow) =>\n deferred(() => base.deleteMany({\n ...(args ?? {}),\n where: mergeWhere({\n where: scopeWhere({ meta, model, where: args?.where, context }),\n field: policy.field,\n value,\n }),\n })) as Promise<BatchResult>,\n count: (args?: ClientRow) => base.count(scopeFind(args)),\n aggregate: (args: ClientRow) => base.aggregate(scopeFind(args)),\n groupBy: (args: ClientRow) => base.groupBy(scopeFind(args)),\n };\n}\n\n/**\n * A delegate for an UNPOLICIED model on a scoped client (F04).\n *\n * The model itself carries no predicate, but every path THROUGH it does: its\n * include/select trees, its relation filters and its nested write payloads can\n * all reach policied models. Before this existed, `$withPolicy` left global\n * models' base delegates in place and a global root was a free read of every\n * tenant's children.\n */\nfunction globalDelegate(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n base: ModelDelegate & Record<string, unknown>;\n context: PolicyContext;\n /** Base global delegates still guard relation traversal, but have no bound policy. */\n policyBound?: boolean;\n}): ModelDelegate & Record<string, unknown> {\n const { meta, model, base, context } = params;\n const readArgs = (args?: ClientRow): ClientRow => scopeArgs({ meta, model, args: args ?? {}, context });\n const sel = (args: ClientRow): ClientRow => {\n const scoped = scopeSelection({ meta, model, args, context });\n return scoped.where === undefined\n ? scoped\n : { ...scoped, where: scopeWhere({ meta, model, where: scoped.where, context }) };\n };\n const payload = (value: unknown, phase: \"create\" | \"update\"): ClientRow =>\n forceWriteData({ meta, model, data: (value ?? {}) as ClientRow, context, phase });\n\n const overrides: Record<string, unknown> = {\n findMany: (args?: ClientRow) => base.findMany(readArgs(args)),\n findFirst: (args?: ClientRow) => base.findFirst(readArgs(args)),\n findFirstOrThrow: (args?: ClientRow) => base.findFirstOrThrow(readArgs(args)),\n findUnique: (args: ClientRow) => base.findUnique(readArgs(args)),\n findUniqueOrThrow: (args: ClientRow) => base.findUniqueOrThrow(readArgs(args)),\n count: (args?: ClientRow) => base.count(readArgs(args)),\n aggregate: (args: ClientRow) => base.aggregate(readArgs(args)),\n groupBy: (args: ClientRow) => base.groupBy(readArgs(args)),\n create: (args: ClientRow) => deferred(() => base.create({ ...sel(args), data: payload(args.data, \"create\") })),\n createMany: (args: ClientRow) =>\n deferred(() => base.createMany({ ...args, data: ((args.data ?? []) as ClientRow[]).map((r) => payload(r, \"create\")) })),\n createManyAndReturn: (args: ClientRow) =>\n deferred(() =>\n base.createManyAndReturn({ ...sel(args), data: ((args.data ?? []) as ClientRow[]).map((r) => payload(r, \"create\")) }),\n ),\n update: (args: ClientRow) => deferred(() => base.update({ ...sel(args), data: payload(args.data, \"update\") })),\n updateMany: (args: ClientRow) => deferred(() => base.updateMany({ ...sel(args), data: payload(args.data, \"update\") })),\n updateManyAndReturn: (args: ClientRow) =>\n deferred(() => {\n const run = base.updateManyAndReturn;\n if (run === undefined) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: \"updateManyAndReturn is not available on this delegate\",\n });\n }\n return run({ ...sel(args), data: payload(args.data, \"update\") });\n }),\n upsert: (args: ClientRow) =>\n deferred(() =>\n base.upsert({ ...sel(args), create: payload(args.create, \"create\"), update: payload(args.update, \"update\") }),\n ),\n upsertMany: (args: ClientRow) => deferred(() => {\n if (params.policyBound === false) return base.upsertMany(args);\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: \"upsertMany is not available on a policy-bound client: its conflict target is not policy-checked yet\",\n });\n }),\n delete: (args: ClientRow) => base.delete(sel(args)),\n deleteMany: (args?: ClientRow) => base.deleteMany(sel(args ?? {})) as Promise<BatchResult>,\n };\n return { ...base, ...overrides } as ModelDelegate & Record<string, unknown>;\n}\n\n/** Wrap extension surfaces: functions taking `{ where }` get the policy AND-ed in. */\nfunction scopeExtensionProps(params: {\n base: Record<string, unknown>;\n delegate: ModelDelegate;\n field: string;\n value: PolicyContextValue;\n}): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, prop] of Object.entries(params.base)) {\n if (key in params.delegate) continue;\n if (typeof prop === \"function\") {\n out[key] = (args?: ClientRow) =>\n (prop as (a?: ClientRow) => unknown)({ ...(args ?? {}), where: mergeWhere({ where: args?.where, field: params.field, value: params.value }) });\n } else if (typeof prop === \"object\" && prop !== null) {\n out[key] = scopeExtensionProps({ base: prop as Record<string, unknown>, delegate: {} as ModelDelegate, field: params.field, value: params.value });\n }\n }\n return out;\n}\n\n// ─── Attach ──────────────────────────────────────────────────────\n\n/**\n * Attach `$withPolicy`/`$bypassPolicy` and fail-close the base delegates of\n * policied models. No-op on schemas without @@policy.\n */\nexport function attachPolicy(params: { client: DynamicClient; meta: RuntimeMeta; wrapDelegate?: (params: { model: string; delegate: ModelDelegate }) => ModelDelegate; }): void {\n const { client, meta } = params;\n const wrap = (model: ModelMeta, delegate: ModelDelegate): ModelDelegate =>\n params.wrapDelegate?.({ model: model.name, delegate }) ?? delegate;\n const policied = policiedModels(meta);\n if (policied.length === 0) return;\n\n const originals = new Map<string, ModelDelegate & Record<string, unknown>>();\n for (const model of meta.models) {\n const original = client.$models[model.name] as ModelDelegate & Record<string, unknown>;\n // Shallow-copy BEFORE guarding: the guards mutate the live delegate in\n // place (top-level props and $models alias the same object), so the saved\n // originals must be a separate object or they would be guarded too.\n originals.set(model.name, { ...original });\n if (model.policy === undefined) {\n const guarded = wrap(model, globalDelegate({ meta, model, base: { ...original }, context: {}, policyBound: false }));\n for (const [key, value] of Object.entries(guarded)) {\n const descriptor = Object.getOwnPropertyDescriptor(original, key);\n if (descriptor?.configurable !== true) continue;\n Object.defineProperty(original, key, { ...descriptor, value });\n }\n continue;\n }\n // Rejects (not throws): delegate methods promise a Promise — a sync throw\n // would bypass `.catch`/`rejects` handling in every caller.\n const guard = (method: string) => (): Promise<never> =>\n Promise.reject(\n policyError(\n `model ${model.name} declares @@policy — bind a context with $withPolicy({ ${model.policy?.context}: ... }) or bypass deliberately with $bypassPolicy()`,\n { model: model.name, method },\n ),\n );\n /**\n * Guard recursively (F05): a NAMESPACE mount (`note.vector.nearest`) is a\n * plain object, and leaving it untouched left an unguarded execution path\n * on the fail-closed base client. Namespaces are rebuilt as fresh objects\n * of guards — the extension's own object is never mutated.\n */\n const guardValue = (value: unknown, key: string): unknown => {\n if (typeof value === \"function\") return guard(key);\n if (!isPlainObject(value)) return value;\n const namespace: Record<string, unknown> = {};\n for (const inner of Object.keys(value)) {\n namespace[inner] = guardValue(value[inner], `${key}.${inner}`);\n }\n return namespace;\n };\n // defineProperty, not Object.assign: extension mounts install their property\n // with defineProperty, so the delegate carries NON-WRITABLE members and an\n // assignment threw `TypeError: Attempted to assign to readonly property`\n // during client construction.\n for (const key of Object.keys(original)) {\n const descriptor = Object.getOwnPropertyDescriptor(original, key);\n if (descriptor === undefined || descriptor.configurable !== true) continue;\n Object.defineProperty(original, key, {\n value: guardValue(original[key], key),\n enumerable: descriptor.enumerable === true,\n writable: true,\n configurable: true,\n });\n }\n }\n\n const buildScoped = (context: PolicyContext): DynamicClient => {\n for (const model of policied) {\n const key = model.policy?.context as string;\n if (context[key] === undefined || context[key] === null) {\n throw policyError(`$withPolicy: missing context value \"${key}\" (required by ${model.name})`, { context: key });\n }\n }\n const scoped = Object.create(client) as DynamicClient & Record<string, unknown>;\n const scopedModels: Record<string, ModelDelegate> = { ...client.$models };\n for (const model of meta.models) {\n if (model.policy !== undefined) continue;\n const base = originals.get(model.name) as ModelDelegate & Record<string, unknown>;\n if (base === undefined) continue;\n const full = wrap(model, globalDelegate({ meta, model, base, context }));\n scopedModels[model.name] = full;\n scopedModels[model.clientName] = full;\n Object.defineProperty(scoped, model.clientName, { value: full, enumerable: true, configurable: true });\n }\n for (const model of policied) {\n const base = originals.get(model.name) as ModelDelegate & Record<string, unknown>;\n const value = context[model.policy?.context as string] as PolicyContextValue;\n const delegate = scopedDelegate({ meta, model, base, context, operationClient: client });\n const full = wrap(model, { ...delegate, ...scopeExtensionProps({ base, delegate, field: model.policy?.field as string, value }) });\n scopedModels[model.name] = full as ModelDelegate;\n scopedModels[model.clientName] = full as ModelDelegate;\n // defineProperty, not assignment: the base client's delegate props are\n // non-writable, and [[Set]] through the prototype chain honors that.\n Object.defineProperty(scoped, model.clientName, { value: full, enumerable: true });\n }\n Object.defineProperty(scoped, \"$models\", { value: scopedModels, enumerable: true });\n // The prototype's $defineView closes over the GUARDED base delegates —\n // rebuild views over the scoped map so masking composes with the policy.\n attachDefineView({ client: scoped, meta, models: scopedModels });\n Object.defineProperty(scoped, \"$transaction\", {\n value: (arg: unknown, options?: unknown) =>\n typeof arg === \"function\"\n ? client.$transaction((tx) => (arg as (t: DynamicClient) => Promise<unknown>)(buildScopedOver(tx, context)), options as never)\n : client.$transaction(arg as never, options as never),\n enumerable: true,\n });\n return scoped;\n };\n\n // Scoped view over a TRANSACTION client: same rewrite, the tx client's RAW\n // delegates underneath (its own attachPolicy has guarded them — bypass).\n const buildScopedOver = (tx: DynamicClient, context: PolicyContext): DynamicClient => {\n const rawTx = tx.$bypassPolicy === undefined ? tx : tx.$bypassPolicy();\n const inner = Object.create(tx) as DynamicClient & Record<string, unknown>;\n const scopedModels: Record<string, ModelDelegate> = { ...tx.$models };\n for (const model of meta.models) {\n if (model.policy !== undefined) continue;\n const base = rawTx.$models[model.name] as ModelDelegate & Record<string, unknown>;\n if (base === undefined) continue;\n const full = wrap(model, globalDelegate({ meta, model, base, context }));\n scopedModels[model.name] = full;\n scopedModels[model.clientName] = full;\n Object.defineProperty(inner, model.clientName, { value: full, enumerable: true, configurable: true });\n }\n for (const model of policied) {\n const base = rawTx.$models[model.name] as ModelDelegate & Record<string, unknown>;\n const delegate = scopedDelegate({ meta, model, base, context, operationClient: tx });\n const full = wrap(model, { ...delegate, ...scopeExtensionProps({ base, delegate, field: model.policy?.field as string, value: context[model.policy?.context as string] as PolicyContextValue }) });\n scopedModels[model.name] = full;\n scopedModels[model.clientName] = full;\n Object.defineProperty(inner, model.clientName, { value: full, enumerable: true });\n }\n Object.defineProperty(inner, \"$models\", { value: scopedModels, enumerable: true });\n attachDefineView({ client: inner, meta, models: scopedModels });\n // F07: a nested $transaction inside a scoped callback must stay scoped.\n // Without this the inner client came from the RAW tx (fail-closed guards),\n // so `tx.$transaction(inner => inner.note.create(...))` refused for want of\n // a context the caller had already bound.\n Object.defineProperty(inner, \"$transaction\", {\n value: (arg: unknown, options?: unknown) =>\n typeof arg === \"function\"\n ? tx.$transaction((nested) => (arg as (t: DynamicClient) => Promise<unknown>)(buildScopedOver(nested, context)), options as never)\n : tx.$transaction(arg as never, options as never),\n enumerable: true,\n configurable: true,\n });\n return inner;\n };\n\n Object.defineProperty(client, \"$withPolicy\", { value: (context: PolicyContext) => buildScoped(context), enumerable: true });\n Object.defineProperty(client, \"$bypassPolicy\", {\n value: (): DynamicClient => {\n const bypass = Object.create(client) as DynamicClient & Record<string, unknown>;\n const models: Record<string, ModelDelegate> = { ...client.$models };\n for (const model of meta.models) {\n const original = originals.get(model.name) as ModelDelegate;\n models[model.name] = original;\n models[model.clientName] = original;\n Object.defineProperty(bypass, model.clientName, { value: original, enumerable: true });\n }\n Object.defineProperty(bypass, \"$models\", { value: models, enumerable: true });\n attachDefineView({ client: bypass, meta, models });\n return bypass;\n },\n enumerable: true,\n });\n}\n",
28
+ "import { protectWriteScope } from \"./write-scope.ts\";\n/**\n * Tenant scoping — `$scoped` (framework handoff: one scoped handle per request).\n *\n * A CALLER-CONFIGURED row-scoping layer: the base client plus a total\n * per-model tenancy map plus a scope value produce a NEW handle whose every\n * query is structurally confined to that tenant. Complements `@@policy`\n * (schema-declared, fail-closed) — the two do NOT combine: `$scoped` refuses\n * on a client whose schema declares any `@@policy`.\n *\n * Implemented as PURE args rewriting over the built delegates (the views.ts /\n * policy.ts pattern — ZERO query-builder edits; every emitted statement is a\n * shape the catalogs already pin). The rewrite relies on three verified\n * builder properties:\n * 1. findUnique/connect wheres compile their FULL where object — extra\n * fields and `AND` groups become filters (query-builder findUnique,\n * nested-writes resolveTargetKey), so injecting the tenant predicate\n * into a unique where IS the verified lookup, inside whatever\n * transaction the write already runs.\n * 2. A guard field beyond the conflict target forces upsert onto the\n * transactional find-then-write fallback (PG-2), whose probe honors the\n * full where — so an injected upsert can never fire ON CONFLICT against\n * another tenant's row.\n * 3. Cursors compile from caller-supplied values only (no row lookup), so\n * cursor pagination needs no rewrite to stay leak-free.\n *\n * Deny-by-default: every argument node that touches a scoped model either\n * gets the predicate injected where semantics allow, or the call REFUSES with\n * a typed `ScopedQueryError { model, path, reason }` before any SQL runs.\n * Raw SQL is absent from the scoped surface; the deliberate escape is the\n * BASE client, which this layer never mutates.\n */\n\nimport { ScopedQueryError, VibeError } from \"@vibeorm/schema\";\nimport type { RelationIR, ScopedRefusalReason } from \"@vibeorm/schema\";\nimport { getModelMeta } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { resolveRelationLink } from \"./relation-plan.ts\";\nimport type { BatchResult, ClientRow, DynamicClient, ModelDelegate } from \"./client.ts\";\nimport { attachDefineView } from \"./views.ts\";\n\n// ─── Public types ─────────────────────────────────────────────────\n\n/** Scope values a tenant column can carry (matches String / Int / BigInt columns). */\nexport type ScopeValue = string | number | bigint;\n\n/**\n * What happens when a scoped model appears as a CHILD inside another model's\n * nested write: `\"verify\"` (default) rewrites reference verbs into\n * tenant-verified lookups; `\"refuse\"` rejects every reference verb (nested\n * `create` stays allowed under both — it is forced into the tenant).\n */\nexport type ScopedNestedMode = \"verify\" | \"refuse\";\n\n/** One model's classification in the tenancy map. */\nexport type ScopedModelEntry =\n | \"none\"\n | { readonly column: string; readonly nested?: ScopedNestedMode }\n | { readonly through: string; readonly nested?: ScopedNestedMode };\n\n/** The per-model tenancy map — must classify EVERY model (totality). */\nexport type ScopedModelsMap = Readonly<Record<string, ScopedModelEntry>>;\n\n/** The `$scoped` argument. */\nexport type ScopedClientConfig = {\n readonly scope: ScopeValue | null;\n readonly models: ScopedModelsMap;\n};\n\n// ─── Resolution ───────────────────────────────────────────────────\n\ntype ResolvedEntry =\n | { readonly kind: \"none\" }\n | { readonly kind: \"column\"; readonly field: FieldMeta; readonly nested: ScopedNestedMode }\n | {\n readonly kind: \"through\";\n readonly relation: RelationIR;\n readonly targetModel: string;\n readonly nested: ScopedNestedMode;\n };\n\ntype ResolvedScopedModels = ReadonlyMap<string, ResolvedEntry>;\n\nfunction refusal(params: {\n model: string;\n path: string;\n reason: ScopedRefusalReason;\n message: string;\n}): ScopedQueryError {\n return new ScopedQueryError(params);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array)\n );\n}\n\nconst SCOPEABLE_COLUMN_TYPES: readonly string[] = [\"String\", \"Int\", \"BigInt\"];\n\n/** Cache: models-map object identity × runtime meta → resolved classification. */\nconst resolvedCache = new WeakMap<ScopedModelsMap, WeakMap<RuntimeMeta, ResolvedScopedModels>>();\n\nfunction nestedModeOf(params: { entry: Record<string, unknown>; model: string }): ScopedNestedMode {\n const raw = params.entry.nested;\n if (raw === undefined) return \"verify\";\n if (raw === \"verify\" || raw === \"refuse\") return raw;\n throw refusal({\n model: params.model,\n path: \"models\",\n reason: \"invalid_entry\",\n message: `$scoped: models.${params.model}.nested must be \"verify\" or \"refuse\", got ${String(raw)}`,\n });\n}\n\n/**\n * Validate the models map against the runtime meta: totality, known\n * columns/relations, scopeable column types, acyclic through-chains ending on\n * a { column } model. Cached by (map, meta) object identity — the framework\n * holds one map constant and calls `$scoped` per request.\n */\nexport function resolveScopedModels(params: {\n meta: RuntimeMeta;\n models: ScopedModelsMap;\n}): ResolvedScopedModels {\n const { meta, models } = params;\n const byMap = resolvedCache.get(models) ?? new WeakMap<RuntimeMeta, ResolvedScopedModels>();\n const cached = byMap.get(meta);\n if (cached !== undefined) return cached;\n\n // Unknown keys refuse first — a typo must never silently unscope a model.\n for (const key of Object.keys(models)) {\n if (!meta.modelByName.has(key)) {\n throw refusal({\n model: key,\n path: \"models\",\n reason: \"unknown_model\",\n message: `$scoped: models map names unknown model \"${key}\"`,\n });\n }\n }\n\n const resolved = new Map<string, ResolvedEntry>();\n const missing: string[] = [];\n for (const model of meta.models) {\n const entry = models[model.name] ?? models[model.clientName];\n if (entry === undefined) {\n missing.push(model.name);\n continue;\n }\n if (entry === \"none\") {\n resolved.set(model.name, { kind: \"none\" });\n continue;\n }\n if (!isPlainObject(entry)) {\n throw refusal({\n model: model.name,\n path: \"models\",\n reason: \"invalid_entry\",\n message: `$scoped: models.${model.name} must be \"none\", { column } or { through }`,\n });\n }\n const keys = Object.keys(entry).filter((key) => entry[key as keyof typeof entry] !== undefined);\n const extras = keys.filter((key) => key !== \"column\" && key !== \"through\" && key !== \"nested\");\n if (extras.length > 0 || (\"column\" in entry) === (\"through\" in entry)) {\n throw refusal({\n model: model.name,\n path: \"models\",\n reason: \"invalid_entry\",\n message: `$scoped: models.${model.name} must carry exactly one of column/through (plus optional nested)${\n extras.length > 0 ? ` — unknown propert${extras.length === 1 ? \"y\" : \"ies\"}: ${extras.join(\", \")}` : \"\"\n }`,\n });\n }\n const nested = nestedModeOf({ entry, model: model.name });\n if (\"column\" in entry) {\n const field = model.fieldByName.get(String(entry.column));\n if (field === undefined) {\n throw refusal({\n model: model.name,\n path: \"models\",\n reason: \"unknown_column\",\n message: `$scoped: models.${model.name}.column names unknown field \"${String(entry.column)}\"`,\n });\n }\n if (field.isList || field.scalarType === null || !SCOPEABLE_COLUMN_TYPES.includes(field.scalarType)) {\n throw refusal({\n model: model.name,\n path: \"models\",\n reason: \"column_not_scopeable\",\n message: `$scoped: models.${model.name}.column \"${field.name}\" must be a non-list String, Int or BigInt field`,\n });\n }\n resolved.set(model.name, { kind: \"column\", field, nested });\n continue;\n }\n const relation = model.relationByName.get(String(entry.through));\n if (relation === undefined || relation.isList) {\n throw refusal({\n model: model.name,\n path: \"models\",\n reason: \"unknown_relation\",\n message: `$scoped: models.${model.name}.through must name a to-one relation — \"${String(entry.through)}\" ${\n relation === undefined ? \"does not exist\" : \"is a list relation\"\n }`,\n });\n }\n // Resolvability check now (fails loudly at construction, not mid-write).\n resolveRelationLink({ meta, model, relation });\n resolved.set(model.name, { kind: \"through\", relation, targetModel: relation.targetModel, nested });\n }\n\n if (missing.length > 0) {\n throw refusal({\n model: missing[0] as string,\n path: \"models\",\n reason: \"unclassified_model\",\n message: `$scoped: the models map must classify EVERY model — missing: ${missing.join(\", \")} (use \"none\" for global models)`,\n });\n }\n\n // Through-chains must terminate on a { column } model without cycling.\n for (const [name, entry] of resolved) {\n if (entry.kind !== \"through\") continue;\n const seen = new Set<string>([name]);\n let current: ResolvedEntry = entry;\n while (current.kind === \"through\") {\n const nextName: string = current.targetModel;\n if (seen.has(nextName)) {\n throw refusal({\n model: name,\n path: \"models\",\n reason: \"through_chain_invalid\",\n message: `$scoped: models.${name} through-chain cycles (${[...seen, nextName].join(\" → \")})`,\n });\n }\n seen.add(nextName);\n const next = resolved.get(nextName);\n if (next === undefined || next.kind === \"none\") {\n throw refusal({\n model: name,\n path: \"models\",\n reason: \"through_chain_invalid\",\n message: `$scoped: models.${name} through-chain must end on a { column } model — \"${nextName}\" is ${\n next === undefined ? \"unclassified\" : '\"none\"'\n }`,\n });\n }\n current = next;\n }\n }\n\n byMap.set(meta, resolved);\n resolvedCache.set(models, byMap);\n return resolved;\n}\n\n/** Assert the scope value's runtime type matches every scoped column's declared type. */\nfunction assertScopeType(params: {\n meta: RuntimeMeta;\n resolved: ResolvedScopedModels;\n scope: ScopeValue;\n}): void {\n const { resolved, scope } = params;\n for (const [name, entry] of resolved) {\n if (entry.kind !== \"column\") continue;\n const scalar = entry.field.scalarType;\n const ok =\n scalar === \"String\"\n ? typeof scope === \"string\"\n : scalar === \"Int\"\n ? typeof scope === \"number\"\n : typeof scope === \"bigint\" || typeof scope === \"number\"; // BigInt columns take both\n if (!ok) {\n throw refusal({\n model: name,\n path: \"scope\",\n reason: \"scope_type_mismatch\",\n message: `$scoped: scope value (${typeof scope}) does not match ${name}.${entry.field.name} (${scalar})`,\n });\n }\n }\n}\n\n// ─── Rewrite context ──────────────────────────────────────────────\n\ntype ScopeContext = {\n wrapDelegate?: (params: { model: string; delegate: ModelDelegate }) => ModelDelegate;\n readonly meta: RuntimeMeta;\n readonly resolved: ResolvedScopedModels;\n readonly scope: ScopeValue | null;\n /** Per-model tenant predicate as a where object; `null` for \"none\" models. */\n readonly preds: ReadonlyMap<string, ClientRow | null>;\n};\n\nfunction buildPreds(params: {\n meta: RuntimeMeta;\n resolved: ResolvedScopedModels;\n scope: ScopeValue;\n}): ReadonlyMap<string, ClientRow | null> {\n const { resolved, scope } = params;\n const preds = new Map<string, ClientRow | null>();\n const predOf = (name: string): ClientRow | null => {\n const known = preds.get(name);\n if (known !== undefined) return known;\n const entry = resolved.get(name) as ResolvedEntry;\n const value: ClientRow | null =\n entry.kind === \"none\"\n ? null\n : entry.kind === \"column\"\n ? { [entry.field.name]: scope }\n : { [entry.relation.name]: predOf(entry.targetModel) as ClientRow };\n preds.set(name, value);\n return value;\n };\n for (const name of resolved.keys()) predOf(name);\n return preds;\n}\n\nfunction entryOf(ctx: ScopeContext, model: ModelMeta): ResolvedEntry {\n return ctx.resolved.get(model.name) as ResolvedEntry;\n}\n\n/** The tenant predicate for a SCOPED model — refuses on a null scope (fail closed). */\nfunction requirePred(params: { ctx: ScopeContext; model: ModelMeta; path: string }): ClientRow {\n const { ctx, model, path } = params;\n if (ctx.scope === null) {\n throw refusal({\n model: model.name,\n path,\n reason: \"null_scope\",\n message: `$scoped: scope is null — calls touching scoped model ${model.name} refuse until a scope is bound`,\n });\n }\n return ctx.preds.get(model.name) as ClientRow;\n}\n\n/** AND-merge a (possibly absent) where with the tenant predicate. */\nfunction mergeWhere(params: { where: unknown; pred: ClientRow }): ClientRow {\n const { where, pred } = params;\n if (where === undefined) return pred;\n return { AND: [where as ClientRow, pred] };\n}\n\n/**\n * Inject the predicate into a UNIQUE where without disturbing its top-level\n * unique members (assertUniqueWhere reads them there): the predicate joins an\n * `AND` group, which the builder compiles as an extra filter.\n */\nfunction injectUniqueWhere(params: { where: unknown; pred: ClientRow }): ClientRow {\n const { where, pred } = params;\n if (!isPlainObject(where)) return { AND: [pred] };\n const existing = where.AND === undefined ? [] : Array.isArray(where.AND) ? where.AND : [where.AND];\n return { ...where, AND: [...existing, pred] };\n}\n\n/** Flatten compound-key sugar ({ a_b: {…} }) into a plain filter object. */\nfunction flattenUniqueWhere(params: { model: ModelMeta; where: ClientRow }): ClientRow {\n const { model, where } = params;\n if (model.compoundUniques.size === 0) return where;\n const out: ClientRow = {};\n for (const [key, value] of Object.entries(where)) {\n if (isPlainObject(value) && model.compoundUniques.has(key)) Object.assign(out, value);\n else out[key] = value;\n }\n return out;\n}\n\n/**\n * Is `relation` (on `model`, targeting a through-scoped model) the INVERSE of\n * that target's tenancy edge? Then every child reachable through it derives\n * its tenancy from THIS parent row — implicit-target verbs and unfiltered\n * counts are safe on exactly these edges. Pairing follows the one shared\n * rule: same model pair, symmetric relation name, self-pair excluded.\n */\nfunction isTenancyInverse(params: { ctx: ScopeContext; model: ModelMeta; relation: RelationIR }): boolean {\n const { ctx, model, relation } = params;\n const targetEntry = ctx.resolved.get(relation.targetModel);\n if (targetEntry === undefined || targetEntry.kind !== \"through\") return false;\n const through = targetEntry.relation;\n return (\n through.targetModel === model.name &&\n (through.relationName ?? null) === (relation.relationName ?? null) &&\n !(relation.model === relation.targetModel && through.name === relation.name)\n );\n}\n\n// ─── WHERE walking ────────────────────────────────────────────────\n\n/**\n * Rewrite a filter where: recurse boolean groups, and inject the tenant\n * predicate into every relation filter that targets a scoped model so other\n * tenants' rows are as-if-nonexistent on every operator:\n * some p → some (p ∧ t) none p → none (p ∧ t)\n * every p → none (t ∧ ¬p) is p → is (p ∧ t)\n * isNot p → isNot (p ∧ t) is null → isNot t isNot null → is t\n * Scalar filters pass through; unknown shapes are left for the builder's own\n * loud refusal (never silently unscoped — the predicate needs no injection\n * where no scoped model is referenced).\n */\nfunction walkWhere(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n where: ClientRow;\n path: string;\n}): ClientRow {\n const { ctx, model, where, path } = params;\n const out: ClientRow = {};\n const extra: ClientRow[] = [];\n\n const walkGroup = (value: unknown, key: string): unknown => {\n const walkItem = (item: unknown): unknown =>\n isPlainObject(item) ? walkWhere({ ctx, model, where: item, path: `${path}.${key}` }) : item;\n return Array.isArray(value) ? value.map(walkItem) : walkItem(value);\n };\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n out[key] = walkGroup(value, key);\n continue;\n }\n const relation = model.relationByName.get(key);\n if (relation === undefined) {\n out[key] = value;\n continue;\n }\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n const scoped = targetEntry.kind !== \"none\";\n const childPath = `${path}.${key}`;\n const pred = (): ClientRow => requirePred({ ctx, model: target, path: childPath });\n const walkChild = (child: unknown, op: string): unknown =>\n isPlainObject(child) ? walkWhere({ ctx, model: target, where: child, path: `${childPath}.${op}` }) : child;\n\n /** Collect single-op filter parts; colliding keys spill into a where-level AND. */\n const parts: ClientRow[] = [];\n\n if (relation.isList) {\n if (!isPlainObject(value)) {\n out[key] = value; // builder refuses the shape\n continue;\n }\n for (const [op, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if (op === \"some\" || op === \"none\") {\n const walked = walkChild(operand, op);\n parts.push({ [op]: scoped ? { AND: [walked, pred()] } : walked });\n } else if (op === \"every\") {\n const walked = walkChild(operand, op);\n parts.push(scoped ? { none: { AND: [pred(), { NOT: [walked] }] } } : { every: walked });\n } else {\n parts.push({ [op]: operand }); // unknown operator — builder refuses\n }\n }\n } else {\n const arms: Array<{ arm: \"is\" | \"isNot\"; operand: unknown }> = [];\n if (value === null) {\n arms.push({ arm: \"is\", operand: null });\n } else if (isPlainObject(value) && (\"is\" in value || \"isNot\" in value)) {\n let mixed = false;\n for (const [op, operand] of Object.entries(value)) {\n if (operand === undefined) continue;\n if (op === \"is\" || op === \"isNot\") arms.push({ arm: op, operand });\n else mixed = true;\n }\n if (mixed) {\n out[key] = value; // builder refuses mixing is/isNot with other keys\n continue;\n }\n } else if (isPlainObject(value)) {\n arms.push({ arm: \"is\", operand: value });\n } else {\n out[key] = value; // builder refuses the shape\n continue;\n }\n for (const { arm, operand } of arms) {\n if (operand === null) {\n // Null checks flip onto the predicate: \"no VISIBLE parent\" / \"a VISIBLE parent exists\".\n parts.push(scoped ? (arm === \"is\" ? { isNot: pred() } : { is: pred() }) : { [arm]: null });\n } else {\n const walked = walkChild(operand, arm);\n parts.push({ [arm]: scoped ? { AND: [walked, pred()] } : walked });\n }\n }\n }\n\n if (parts.length === 0) {\n out[key] = value;\n continue;\n }\n const combined: ClientRow = {};\n for (const part of parts) {\n const opKey = Object.keys(part)[0] as string;\n if (opKey in combined) extra.push({ [key]: part });\n else combined[opKey] = part[opKey];\n }\n out[key] = combined;\n }\n\n if (extra.length > 0) {\n const existing = out.AND === undefined ? [] : Array.isArray(out.AND) ? out.AND : [out.AND];\n out.AND = [...existing, ...extra];\n }\n return out;\n}\n\n// ─── ORDER BY walking ─────────────────────────────────────────────\n\n/**\n * Refuse orderBy terms that reach INTO a scoped model through a relation —\n * a correlated order subquery would leak a foreign row's values into row\n * ordering. The one safe edge is a through-scoped model ordering by its OWN\n * tenancy parent (a visible row's through-parent is in-tenant by definition).\n */\nfunction walkOrderTerm(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n term: ClientRow;\n path: string;\n}): void {\n const { ctx, model, term, path } = params;\n const entry = entryOf(ctx, model);\n for (const [key, spec] of Object.entries(term)) {\n if (spec === undefined) continue;\n const relation = model.relationByName.get(key);\n if (relation === undefined) continue;\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n const tenancyEdge = entry.kind === \"through\" && entry.relation.name === key;\n if (targetEntry.kind !== \"none\" && !tenancyEdge) {\n throw refusal({\n model: target.name,\n path: `${path}.${key}`,\n reason: \"relation_orderby_on_scoped\",\n message: `$scoped: orderBy through ${model.name}.${key} reaches scoped model ${target.name} — ordering by a foreign row's values would leak; order by own columns instead`,\n });\n }\n if (isPlainObject(spec)) {\n walkOrderTerm({ ctx, model: target, term: spec, path: `${path}.${key}` });\n }\n }\n}\n\nfunction walkOrderBy(params: { ctx: ScopeContext; model: ModelMeta; orderBy: unknown; path: string }): void {\n const { ctx, model, orderBy, path } = params;\n const terms = Array.isArray(orderBy) ? orderBy : [orderBy];\n for (const term of terms) {\n if (isPlainObject(term)) walkOrderTerm({ ctx, model, term, path });\n }\n}\n\n// ─── Selection (include/select/_count) walking ────────────────────\n\nfunction walkCountSpec(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n spec: unknown;\n path: string;\n}): unknown {\n const { ctx, model, spec, path } = params;\n const guard = (relation: RelationIR): void => {\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n if (targetEntry.kind === \"none\") return;\n if (isTenancyInverse({ ctx, model, relation })) return; // children ARE this row's tenants\n throw refusal({\n model: target.name,\n path: `${path}.${relation.name}`,\n reason: \"count_on_scoped_relation\",\n message: `$scoped: _count of ${model.name}.${relation.name} would count ${target.name} rows across tenants (relation counts take no filter) — select the relation with a where instead`,\n });\n };\n if (spec === true) {\n for (const relation of model.relations) {\n if (relation.isList) guard(relation);\n }\n return spec;\n }\n if (!isPlainObject(spec) || !isPlainObject(spec.select)) return spec; // builder validates shape\n const select = { ...spec.select };\n for (const [name, flag] of Object.entries(select)) {\n if (flag === undefined || flag === false) continue;\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n guard(relation);\n if (isPlainObject(flag) && isPlainObject(flag.where)) {\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n select[name] = { ...flag, where: walkWhere({ ctx, model: target, where: flag.where, path: `${path}.${name}.where` }) };\n }\n }\n return { ...spec, select };\n}\n\n/**\n * Rewrite include/select so every scoped CHILD model loads with the tenant\n * predicate AND-ed into its relation args, at any depth.\n */\nfunction walkSelection(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n args: ClientRow;\n path: string;\n}): void {\n const { ctx, model, args, path } = params;\n for (const blockKey of [\"include\", \"select\"] as const) {\n const block = args[blockKey];\n if (!isPlainObject(block)) continue;\n const next: ClientRow = { ...block };\n for (const [name, spec] of Object.entries(block)) {\n if (spec === undefined || spec === false) continue;\n const blockPath = `${path}.${blockKey}`;\n if (name === \"_count\") {\n next[name] = walkCountSpec({ ctx, model, spec, path: `${blockPath}._count` });\n continue;\n }\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n const scoped = targetEntry.kind !== \"none\";\n const childPath = `${blockPath}.${name}`;\n if (spec === true && !scoped) continue;\n const child: ClientRow = spec === true ? {} : isPlainObject(spec) ? { ...spec } : (spec as ClientRow);\n if (!isPlainObject(child)) continue; // builder refuses the shape\n const walkedWhere = isPlainObject(child.where)\n ? walkWhere({ ctx, model: target, where: child.where, path: `${childPath}.where` })\n : child.where;\n if (scoped) {\n child.where = mergeWhere({ where: walkedWhere, pred: requirePred({ ctx, model: target, path: childPath }) });\n } else if (walkedWhere !== undefined) {\n child.where = walkedWhere;\n }\n if (child.orderBy !== undefined) {\n walkOrderBy({ ctx, model: target, orderBy: child.orderBy, path: `${childPath}.orderBy` });\n }\n walkSelection({ ctx, model: target, args: child, path: childPath });\n next[name] = child;\n }\n args[blockKey] = next;\n }\n}\n\n// ─── Write-data walking ───────────────────────────────────────────\n\nconst REFERENCE_VERBS: readonly string[] = [\n \"connect\",\n \"connectOrCreate\",\n \"set\",\n \"disconnect\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"delete\",\n \"deleteMany\",\n];\n\nfunction nestedModeFor(entry: ResolvedEntry): ScopedNestedMode {\n return entry.kind === \"none\" ? \"verify\" : entry.nested;\n}\n\n/** Mark own and inverse protected foreign keys for checks at final resolution. */\nfunction protectScopedData(params: { ctx: ScopeContext; model: ModelMeta; data: ClientRow; path: string }): ClientRow {\n const { ctx, model, path } = params;\n let out = params.data;\n const protect = (data: ClientRow, target: ModelMeta, field: string): ClientRow => {\n requirePred({ ctx, model: target, path });\n return protectWriteScope({ data, field, value: ctx.scope, error: refusal({\n model: target.name, path, reason: \"explicit_scope_mismatch\",\n message: `$scoped: relation resolution cannot change ${target.name}.${field} away from the bound scope`,\n }) });\n };\n const entry = entryOf(ctx, model);\n if (entry.kind === \"column\" && model.relations.some((relation) => relation.fields?.includes(entry.field.name) && out[relation.name] !== undefined)) {\n out = protect(out, model, entry.field.name);\n }\n for (const [name, verbs] of Object.entries(out)) {\n const relation = model.relationByName.get(name);\n if (relation === undefined || !isPlainObject(verbs)) continue;\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n if (targetEntry.kind !== \"column\") continue;\n const link = resolveRelationLink({ meta: ctx.meta, model, relation });\n if (\n (link.kind === \"toManyFk\" || link.kind === \"toOneInverse\") &&\n link.childKeys.some((member) => member.name === targetEntry.field.name)\n ) {\n out[name] = protect(verbs, target, targetEntry.field.name);\n }\n }\n return out;\n}\n\n/** items normalizer that PRESERVES the original single-vs-array shape. */\nfunction mapItems(value: unknown, fn: (item: unknown) => unknown): unknown {\n return Array.isArray(value) ? value.map(fn) : fn(value);\n}\n\n/**\n * Rewrite create data: force the tenant column, guard the through edge, and\n * recurse into nested relation verbs — connects become tenant-verified\n * lookups (the injected predicate rides the existing resolution query, inside\n * the write's own transaction), creates are forced recursively.\n *\n * `viaTenancyEdge`: this data creates a child whose tenancy DERIVES from the\n * parent being written (nested create under the through-inverse relation) —\n * the through-parent requirement is satisfied structurally there.\n */\nfunction walkCreateData(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n data: unknown;\n path: string;\n viaTenancyEdge?: boolean;\n}): unknown {\n const { ctx, model, data, path } = params;\n if (!isPlainObject(data)) return data; // builder refuses the shape\n const entry = entryOf(ctx, model);\n const out: ClientRow = { ...data };\n\n if (entry.kind === \"column\") {\n requirePred({ ctx, model, path }); // null-scope fails closed before any force\n const given = out[entry.field.name];\n if (given !== undefined && given !== ctx.scope) {\n throw refusal({\n model: model.name,\n path: `${path}.${entry.field.name}`,\n reason: \"explicit_scope_mismatch\",\n message: `$scoped: create on ${model.name} sets ${entry.field.name} to ${given === null ? \"null\" : \"a different tenant\"} — the scoped handle owns that column`,\n });\n }\n out[entry.field.name] = ctx.scope;\n }\n\n if (entry.kind === \"through\" && params.viaTenancyEdge !== true) {\n requirePred({ ctx, model, path });\n const link = resolveRelationLink({ meta: ctx.meta, model, relation: entry.relation });\n // A COMPOSITE tenancy foreign key is bypassed by writing ANY of its\n // members directly, not just the first one.\n const writtenFk = link.parentKeys.find((member) => out[member.name] !== undefined);\n if (link.kind === \"toOneOwner\" && writtenFk !== undefined) {\n throw refusal({\n model: model.name,\n path: `${path}.${writtenFk.name}`,\n reason: \"through_fk_write\",\n message: `$scoped: writing ${model.name}.${writtenFk.name} directly would bypass tenant verification — use ${entry.relation.name}: { connect: … } instead`,\n });\n }\n if (out[entry.relation.name] === undefined) {\n throw refusal({\n model: model.name,\n path,\n reason: \"through_fk_write\",\n message: `$scoped: create on ${model.name} must bind its tenancy parent — provide ${entry.relation.name}: { connect | create | connectOrCreate: … }`,\n });\n }\n }\n\n for (const [key, value] of Object.entries(out)) {\n const relation = model.relationByName.get(key);\n if (relation === undefined || !isPlainObject(value)) continue;\n out[key] = walkNestedVerbs({ ctx, model, relation, verbs: value, path: `${path}.${key}`, phase: \"create\" });\n }\n return protectScopedData({ ctx, model, data: out, path });\n}\n\n/** Rewrite update data: tenant-column writes verified, nested verbs classified. */\nfunction walkUpdateData(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n data: unknown;\n path: string;\n}): unknown {\n const { ctx, model, data, path } = params;\n if (!isPlainObject(data)) return data;\n const entry = entryOf(ctx, model);\n const out: ClientRow = { ...data };\n\n if (entry.kind === \"column\") {\n const given = out[entry.field.name];\n if (given !== undefined) {\n const setValue = isPlainObject(given) && Object.keys(given).length === 1 ? given.set : given;\n if (setValue !== ctx.scope) {\n throw refusal({\n model: model.name,\n path: `${path}.${entry.field.name}`,\n reason: \"explicit_scope_mismatch\",\n message: `$scoped: update on ${model.name} writes ${entry.field.name} — a scoped handle cannot move rows between tenants`,\n });\n }\n }\n }\n\n if (entry.kind === \"through\") {\n const link = resolveRelationLink({ meta: ctx.meta, model, relation: entry.relation });\n // A COMPOSITE tenancy foreign key is bypassed by writing ANY of its\n // members directly, not just the first one.\n const writtenFk = link.parentKeys.find((member) => out[member.name] !== undefined);\n if (link.kind === \"toOneOwner\" && writtenFk !== undefined) {\n throw refusal({\n model: model.name,\n path: `${path}.${writtenFk.name}`,\n reason: \"through_fk_write\",\n message: `$scoped: writing ${model.name}.${writtenFk.name} directly would bypass tenant verification — use ${entry.relation.name}: { connect: … } instead`,\n });\n }\n }\n\n for (const [key, value] of Object.entries(out)) {\n const relation = model.relationByName.get(key);\n if (relation === undefined || !isPlainObject(value)) continue;\n out[key] = walkNestedVerbs({ ctx, model, relation, verbs: value, path: `${path}.${key}`, phase: \"update\" });\n }\n return protectScopedData({ ctx, model, data: out, path });\n}\n\n/**\n * Classify + rewrite ONE relation's nested-write verbs.\n *\n * Explicit-where verbs (connect, connectOrCreate, set/disconnect/delete/\n * update/upsert items, updateMany/deleteMany filters) get the predicate\n * injected — the existing resolution/filter queries then ARE the verification.\n * Implicit-target verbs (to-one update/delete/upsert/disconnect without a\n * where; non-M2M set's clearing phase) write rows this layer cannot filter,\n * so they are allowed ONLY on tenancy edges (where the target's tenant is the\n * row being written, by definition) and refused everywhere else. M2M `set`\n * refuses: its clearing phase would silently unlink foreign children.\n *\n * Unscoped (\"none\") targets skip injection and guards but their payloads and\n * wheres are STILL walked — a relation filter buried in a nested where can\n * reach a scoped model from anywhere.\n */\nfunction walkNestedVerbs(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n relation: RelationIR;\n verbs: Record<string, unknown>;\n path: string;\n phase: \"create\" | \"update\";\n}): ClientRow {\n const { ctx, model, relation, verbs, path, phase } = params;\n const target = ctx.meta.modelByName.get(relation.targetModel) as ModelMeta;\n const targetEntry = entryOf(ctx, target);\n const scoped = targetEntry.kind !== \"none\";\n const modelEntry = entryOf(ctx, model);\n /** Parent→child tenancy edge (children derive tenancy from this row)… */\n const pairedDown = scoped && isTenancyInverse({ ctx, model, relation });\n /** …or child→parent tenancy edge (this relation IS the model's own through edge). */\n const tenancyEdge = modelEntry.kind === \"through\" && modelEntry.relation.name === relation.name;\n const implicitSafe = pairedDown || tenancyEdge;\n const mode = nestedModeFor(targetEntry);\n const out: ClientRow = { ...verbs };\n\n const pred = (verbPath: string): ClientRow => requirePred({ ctx, model: target, path: verbPath });\n const refuse = (verb: string, why: string): never => {\n throw refusal({\n model: target.name,\n path: `${path}.${verb}`,\n reason: \"nested_refused\",\n message: `$scoped: nested \"${verb}\" on ${model.name}.${relation.name} (${target.name}) ${why}`,\n });\n };\n /** Walk a where object against the target model (relation filters inside get injected). */\n const walkTargetWhere = (where: unknown, verbPath: string): unknown =>\n isPlainObject(where) ? walkWhere({ ctx, model: target, where, path: verbPath }) : where;\n /** Unique-where treatment: walk, then AND the predicate in when the target is scoped. */\n const uniqueWhere = (where: unknown, verbPath: string): unknown => {\n const walked = walkTargetWhere(where, verbPath);\n return scoped ? injectUniqueWhere({ where: walked, pred: pred(verbPath) }) : walked;\n };\n /** Filter-where treatment for updateMany/deleteMany operands. */\n const filterWhere = (where: unknown, verbPath: string): unknown => {\n const walked = walkTargetWhere(where, verbPath);\n return scoped ? mergeWhere({ where: walked ?? {}, pred: pred(verbPath) }) : walked;\n };\n const walkChildCreate = (item: unknown, verbPath: string): unknown =>\n walkCreateData({ ctx, model: target, data: item, path: verbPath, viaTenancyEdge: pairedDown });\n const walkChildUpdate = (item: unknown, verbPath: string): unknown =>\n walkUpdateData({ ctx, model: target, data: item, path: verbPath });\n const link = (): ReturnType<typeof resolveRelationLink> =>\n resolveRelationLink({ meta: ctx.meta, model, relation });\n\n for (const [verb, operand] of Object.entries(verbs)) {\n if (operand === undefined) continue;\n const verbPath = `${path}.${verb}`;\n\n if (verb === \"create\") {\n out[verb] = mapItems(operand, (item) => walkChildCreate(item, verbPath));\n continue;\n }\n\n if (scoped && mode === \"refuse\" && REFERENCE_VERBS.includes(verb)) {\n refuse(verb, `is disabled — ${target.name} is configured nested: \"refuse\"; go through the base client or its own delegate`);\n }\n\n switch (verb) {\n case \"connect\":\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item) ? uniqueWhere(item, verbPath) : item,\n );\n break;\n case \"connectOrCreate\":\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item)\n ? { ...item, where: uniqueWhere(item.where, verbPath), create: walkChildCreate(item.create, verbPath) }\n : item,\n );\n break;\n case \"set\": {\n if (phase === \"create\") break; // not a create-phase verb; builder refuses\n if (scoped) {\n const kind = link().kind;\n if (kind === \"manyToMany\") refuse(verb, \"clears the whole join set — unlinking other tenants' rows cannot be verified; disconnect explicit rows instead\");\n if (!implicitSafe) refuse(verb, \"first detaches EVERY current child, which cannot be tenant-filtered on this edge; disconnect explicit rows instead\");\n }\n out[verb] = mapItems(operand ?? [], (item) =>\n isPlainObject(item) ? uniqueWhere(item, verbPath) : item,\n );\n break;\n }\n case \"disconnect\": {\n if (!relation.isList) {\n if (scoped) {\n const kind = link().kind;\n if (kind === \"toOneOwner\") {\n if (tenancyEdge) {\n refuse(verb, \"would orphan the row out of its tenant (through-parent set to null) — delete it or connect a replacement\");\n }\n // Writes only this row's own FK — safe.\n } else if (!implicitSafe) {\n refuse(verb, \"targets whatever row currently points here — not tenant-verifiable on this edge\");\n }\n }\n break;\n }\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item) ? uniqueWhere(item, verbPath) : item,\n );\n break;\n }\n case \"delete\": {\n if (!relation.isList) {\n if (scoped && !implicitSafe) {\n refuse(verb, \"targets whatever row is currently connected — not tenant-verifiable on this edge\");\n }\n break;\n }\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item) ? uniqueWhere(item, verbPath) : item,\n );\n break;\n }\n case \"update\": {\n if (!relation.isList) {\n if (scoped && !implicitSafe) {\n refuse(verb, \"targets whatever row is currently connected — not tenant-verifiable on this edge; update it through its own delegate\");\n }\n out[verb] = isPlainObject(operand)\n ? \"data\" in operand && isPlainObject(operand.data)\n ? { ...operand, data: walkChildUpdate(operand.data, verbPath) }\n : walkChildUpdate(operand, verbPath)\n : operand;\n break;\n }\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item)\n ? { ...item, where: uniqueWhere(item.where, verbPath), data: walkChildUpdate(item.data, verbPath) }\n : item,\n );\n break;\n }\n case \"updateMany\":\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item)\n ? { ...item, where: filterWhere(item.where, verbPath), data: walkChildUpdate(item.data, verbPath) }\n : item,\n );\n break;\n case \"deleteMany\":\n out[verb] = mapItems(operand, (item) => filterWhere(item, verbPath));\n break;\n case \"upsert\": {\n if (!relation.isList) {\n if (scoped && !implicitSafe) {\n refuse(verb, \"updates whatever row is currently connected — not tenant-verifiable on this edge\");\n }\n out[verb] = isPlainObject(operand)\n ? {\n ...operand,\n create: walkChildCreate(operand.create, verbPath),\n update: walkChildUpdate(operand.update, verbPath),\n }\n : operand;\n break;\n }\n out[verb] = mapItems(operand, (item) =>\n isPlainObject(item)\n ? {\n ...item,\n where: uniqueWhere(item.where, verbPath),\n create: walkChildCreate(item.create, verbPath),\n update: walkChildUpdate(item.update, verbPath),\n }\n : item,\n );\n break;\n }\n default:\n break; // unknown verbs: nested-writes refuses loudly\n }\n }\n return out;\n}\n\n// ─── The pure per-call rewriter ───────────────────────────────────\n\n/** A rewritten call: which base-delegate method to run, with which args. */\nexport type RewrittenScopedCall = {\n readonly model: string;\n readonly method: string;\n readonly args: ClientRow | undefined;\n};\n\n/** A validated, scope-bound rewriter — the pure core a binding's tests drive. */\nexport type ScopeRewriter = {\n readonly rewrite: (call: { model: string; method: string; args?: ClientRow }) => RewrittenScopedCall;\n};\n\n/**\n * Validate a models map + scope against the runtime meta and return the pure\n * per-call rewriter (`ScopedQueryError` on refusals). This is `$scoped`'s\n * engine without the client plumbing — conformance rewrite-vectors run here.\n */\nexport function createScopeRewriter(params: {\n meta: RuntimeMeta;\n models: ScopedModelsMap;\n scope: ScopeValue | null;\n}): ScopeRewriter {\n const { meta, models, scope } = params;\n const resolved = resolveScopedModels({ meta, models });\n if (scope !== null) assertScopeType({ meta, resolved, scope });\n const preds =\n scope === null ? new Map<string, ClientRow | null>() : buildPreds({ meta, resolved, scope });\n return {\n rewrite: (call) =>\n rewriteScopedCall({\n meta,\n resolved,\n scope,\n preds,\n model: call.model,\n method: call.method,\n args: call.args,\n }),\n };\n}\n\nconst FIND_LIKE: readonly string[] = [\"findMany\", \"findFirst\", \"findFirstOrThrow\", \"count\", \"aggregate\", \"groupBy\"];\n\n/**\n * Rewrite ONE delegate call for a scoped handle — pure: same inputs, same\n * output; refusals throw `ScopedQueryError` before any SQL could run. This is\n * the function the conformance rewrite-vectors pin.\n */\nexport function rewriteScopedCall(params: {\n meta: RuntimeMeta;\n resolved: ResolvedScopedModels;\n scope: ScopeValue | null;\n preds: ReadonlyMap<string, ClientRow | null>;\n model: string;\n method: string;\n args: ClientRow | undefined;\n}): RewrittenScopedCall {\n const { meta, resolved, scope, preds, method } = params;\n const ctx: ScopeContext = { meta, resolved, scope, preds };\n const model = getModelMeta({ meta, model: params.model });\n const entry = entryOf(ctx, model);\n const scoped = entry.kind !== \"none\";\n const root = `${model.clientName}.${method}`;\n const args: ClientRow = { ...(params.args ?? {}) };\n const ownPred = (): ClientRow => requirePred({ ctx, model, path: root });\n\n const walkOwnWhere = (where: unknown, path: string): unknown =>\n isPlainObject(where) ? walkWhere({ ctx, model, where, path }) : where;\n\n if (FIND_LIKE.includes(method)) {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n if (scoped) args.where = mergeWhere({ where: walked, pred: ownPred() });\n else if (walked !== undefined) args.where = walked;\n if (args.orderBy !== undefined) walkOrderBy({ ctx, model, orderBy: args.orderBy, path: `${root}.orderBy` });\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n switch (method) {\n case \"findUnique\":\n case \"findUniqueOrThrow\": {\n walkSelection({ ctx, model, args, path: root });\n if (!scoped) {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n if (walked !== undefined) args.where = walked;\n return { model: model.name, method, args };\n }\n // Contract: rewritten to findFirst over the flattened key + predicate —\n // a foreign row is indistinguishable from a missing one.\n const flat = isPlainObject(args.where)\n ? flattenUniqueWhere({ model, where: args.where })\n : (args.where as ClientRow);\n const walked = isPlainObject(flat) ? walkWhere({ ctx, model, where: flat, path: `${root}.where` }) : flat;\n args.where = mergeWhere({ where: walked, pred: ownPred() });\n return {\n model: model.name,\n method: method === \"findUnique\" ? \"findFirst\" : \"findFirstOrThrow\",\n args,\n };\n }\n\n case \"create\": {\n args.data = walkCreateData({ ctx, model, data: args.data ?? {}, path: `${root}.data` });\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"createMany\":\n case \"createManyAndReturn\": {\n const rows = args.data;\n args.data = Array.isArray(rows)\n ? rows.map((row) => walkCreateData({ ctx, model, data: row, path: `${root}.data` }))\n : walkCreateData({ ctx, model, data: rows ?? {}, path: `${root}.data` });\n if (method === \"createManyAndReturn\") walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"update\": {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n args.where = scoped ? injectUniqueWhere({ where: walked, pred: ownPred() }) : (walked as ClientRow);\n args.data = walkUpdateData({ ctx, model, data: args.data ?? {}, path: `${root}.data` });\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"updateMany\": {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n if (scoped) args.where = mergeWhere({ where: walked, pred: ownPred() });\n else if (walked !== undefined) args.where = walked;\n args.data = walkUpdateData({ ctx, model, data: args.data ?? {}, path: `${root}.data` });\n return { model: model.name, method, args };\n }\n\n case \"updateManyAndReturn\": {\n // updateMany's tenant MERGE (a filter, not a unique selector) plus update's\n // projection walk — this method returns rows, so the selection must be\n // masked exactly as `update`'s is.\n const walked = walkOwnWhere(args.where, `${root}.where`);\n if (scoped) args.where = mergeWhere({ where: walked, pred: ownPred() });\n else if (walked !== undefined) args.where = walked;\n args.data = walkUpdateData({ ctx, model, data: args.data ?? {}, path: `${root}.data` });\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"upsert\": {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n // The injected predicate is a guard field beyond the conflict target —\n // the client's find-then-write fallback probes with the FULL where, so\n // the update arm can only ever address an in-tenant row.\n args.where = scoped ? injectUniqueWhere({ where: walked, pred: ownPred() }) : (walked as ClientRow);\n args.create = walkCreateData({ ctx, model, data: args.create ?? {}, path: `${root}.create` });\n args.update = walkUpdateData({ ctx, model, data: args.update ?? {}, path: `${root}.update` });\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"delete\": {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n args.where = scoped ? injectUniqueWhere({ where: walked, pred: ownPred() }) : (walked as ClientRow);\n walkSelection({ ctx, model, args, path: root });\n return { model: model.name, method, args };\n }\n\n case \"deleteMany\": {\n const walked = walkOwnWhere(args.where, `${root}.where`);\n if (scoped) args.where = mergeWhere({ where: walked, pred: ownPred() });\n else if (walked !== undefined) args.where = walked;\n return { model: model.name, method, args };\n }\n\n default:\n return { model: model.name, method, args: params.args };\n }\n}\n\n// ─── Scoped delegates + client assembly ───────────────────────────\n\ntype AnyFn = (...args: unknown[]) => unknown;\n\nfunction scopedDelegate(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n base: ModelDelegate & Record<string, unknown>;\n}): ModelDelegate {\n const { ctx, model, base } = params;\n\n const run = <T>(method: string, args: ClientRow | undefined): Promise<T> => {\n let rewritten: RewrittenScopedCall;\n try {\n rewritten = rewriteScopedCall({\n meta: ctx.meta,\n resolved: ctx.resolved,\n scope: ctx.scope,\n preds: ctx.preds,\n model: model.name,\n method,\n args,\n });\n } catch (error) {\n // Reject (not throw): delegate methods promise a Promise, and a lazy\n // QueryPromise from the base delegate stays claimable by $transaction([...]).\n return Promise.reject(error);\n }\n const target = base[rewritten.method] as (a?: ClientRow) => Promise<T>;\n return target(rewritten.args);\n };\n\n return {\n findMany: (args?: ClientRow) => run(\"findMany\", args),\n findFirst: (args?: ClientRow) => run(\"findFirst\", args),\n findFirstOrThrow: (args?: ClientRow) => run(\"findFirstOrThrow\", args),\n findUnique: (args: ClientRow) => run(\"findUnique\", args),\n findUniqueOrThrow: (args: ClientRow) => run(\"findUniqueOrThrow\", args),\n create: (args: ClientRow) => run(\"create\", args),\n createMany: (args: ClientRow) => run<BatchResult>(\"createMany\", args),\n createManyAndReturn: (args: ClientRow) => run(\"createManyAndReturn\", args),\n update: (args: ClientRow) => run(\"update\", args),\n updateMany: (args: ClientRow) => run<BatchResult>(\"updateMany\", args),\n updateManyAndReturn: (args: ClientRow) => run(\"updateManyAndReturn\", args),\n upsert: (args: ClientRow) => run(\"upsert\", args),\n // EPIC 10: deliberately NOT routed. A `conflictTarget` that omits the scope\n // column would let one tenant's feed overwrite another tenant's row, so this\n // refuses loudly instead of passing through unscoped. Routing it needs a\n // per-row scope merge PLUS a conflict-target check that the scope column is\n // part of the target — see notes-epic10.md hand-off 4.\n upsertMany: (): Promise<never> => {\n throw forbidden({ method: \"upsertMany\" });\n },\n delete: (args: ClientRow) => run(\"delete\", args),\n deleteMany: (args?: ClientRow) => run<BatchResult>(\"deleteMany\", args),\n count: (args?: ClientRow) => run(\"count\", args),\n aggregate: (args: ClientRow) => run(\"aggregate\", args),\n groupBy: (args: ClientRow) => run(\"groupBy\", args),\n } as ModelDelegate;\n}\n\n/**\n * Wrap extension surfaces (search/vector/… mounted per model): functions\n * taking `{ where }` get the tenant predicate AND-ed in and the where walked;\n * nested namespaces recurse.\n */\nfunction scopeExtensionProps(params: {\n ctx: ScopeContext;\n model: ModelMeta;\n base: Record<string, unknown>;\n delegate: ModelDelegate;\n}): Record<string, unknown> {\n const { ctx, model, base, delegate } = params;\n const entry = entryOf(ctx, model);\n const out: Record<string, unknown> = {};\n for (const [key, prop] of Object.entries(base)) {\n if (key in delegate) continue;\n if (typeof prop === \"function\") {\n out[key] = (args?: ClientRow): unknown => {\n try {\n const path = `${model.clientName}.${key}`;\n const walked = isPlainObject(args?.where)\n ? walkWhere({ ctx, model, where: args.where, path: `${path}.where` })\n : args?.where;\n const where =\n entry.kind === \"none\"\n ? walked\n : mergeWhere({ where: walked, pred: requirePred({ ctx, model, path }) });\n return (prop as AnyFn)({ ...(args ?? {}), ...(where === undefined ? {} : { where }) });\n } catch (error) {\n return Promise.reject(error);\n }\n };\n } else if (isPlainObject(prop)) {\n out[key] = scopeExtensionProps({\n ctx,\n model,\n base: prop as Record<string, unknown>,\n delegate: {} as ModelDelegate,\n });\n }\n }\n return out;\n}\n\nfunction forbidden(params: { method: string }): ScopedQueryError {\n return refusal({\n model: \"*\",\n path: params.method,\n reason: \"raw_forbidden\",\n message: `$scoped: ${params.method} is not available on a scoped handle — raw SQL cannot be tenant-verified; run it on the BASE client (the deliberate unscoped escape)`,\n });\n}\n\nconst RAW_METHODS: readonly string[] = [\"$queryRaw\", \"$executeRaw\", \"$queryRawUnsafe\", \"$executeRawUnsafe\"];\n\n/** Build the scoped view over one underlying client (base or transaction). */\nfunction buildScopedOver(params: { ctx: ScopeContext; client: DynamicClient }): DynamicClient {\n const { ctx, client } = params;\n const scoped = Object.create(client) as DynamicClient & Record<string, unknown>;\n const scopedModels: Record<string, ModelDelegate> = { ...client.$models };\n\n for (const model of ctx.meta.models) {\n const base = client.$models[model.name] as ModelDelegate & Record<string, unknown>;\n const delegate = scopedDelegate({ ctx, model, base });\n const unwrapped = { ...delegate, ...scopeExtensionProps({ ctx, model, base, delegate }) };\n const full = ctx.wrapDelegate?.({ model: model.name, delegate: unwrapped }) ?? unwrapped;\n scopedModels[model.name] = full as ModelDelegate;\n scopedModels[model.clientName] = full as ModelDelegate;\n Object.defineProperty(scoped, model.clientName, { value: full, enumerable: true });\n }\n Object.defineProperty(scoped, \"$models\", { value: scopedModels, enumerable: true });\n attachDefineView({ client: scoped, meta: ctx.meta, models: scopedModels });\n\n Object.defineProperty(scoped, \"$transaction\", {\n value: (arg: unknown, options?: unknown) =>\n typeof arg === \"function\"\n ? client.$transaction(\n (tx) => (arg as (t: DynamicClient) => Promise<unknown>)(buildScopedOver({ ctx, client: tx })),\n options as never,\n )\n : // Array form: the operations came from SCOPED delegates, so their\n // args are already rewritten — the underlying client claims and\n // runs them in one transaction exactly like unscoped operations.\n client.$transaction(arg as never, options as never),\n enumerable: true,\n });\n\n for (const method of RAW_METHODS) {\n Object.defineProperty(scoped, method, {\n value: (): Promise<never> => Promise.reject(forbidden({ method })),\n enumerable: true,\n });\n }\n Object.defineProperty(scoped, \"$scoped\", {\n value: (): never => {\n throw refusal({\n model: \"*\",\n path: \"$scoped\",\n reason: \"rescope_forbidden\",\n message: \"$scoped: this handle is already scoped — build a differently-scoped handle from the BASE client\",\n });\n },\n enumerable: true,\n });\n\n return scoped;\n}\n\n/**\n * Attach `$scoped` to a built client. Validation happens per call:\n * `@@policy` schemas refuse (the two scoping layers do not combine), the\n * models map is resolved against the schema (cached by object identity), and\n * the scope value is type-checked against every scoped column.\n */\nexport function attachScoped(params: { client: DynamicClient; meta: RuntimeMeta; wrapDelegate?: (params: { model: string; delegate: ModelDelegate }) => ModelDelegate; }): void {\n const { client, meta } = params;\n Object.defineProperty(client, \"$scoped\", {\n value: (config: ScopedClientConfig): DynamicClient => {\n if (!isPlainObject(config) || !isPlainObject(config.models)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"$scoped takes { scope: string | number | bigint | null, models: { <Model>: … } }\",\n });\n }\n const policied = meta.models.filter((model) => model.policy !== undefined);\n if (policied.length > 0) {\n throw refusal({\n model: policied[0]?.name as string,\n path: \"$scoped\",\n reason: \"policy_conflict\",\n message: `$scoped: the schema declares @@policy on ${policied\n .map((model) => model.name)\n .join(\", \")} — use $withPolicy for policied schemas; the two scoping layers do not combine`,\n });\n }\n const scope = config.scope;\n if (scope !== null && typeof scope !== \"string\" && typeof scope !== \"number\" && typeof scope !== \"bigint\") {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `$scoped: scope must be a string, number, bigint or null — got ${typeof scope}`,\n });\n }\n const resolved = resolveScopedModels({ meta, models: config.models });\n if (scope !== null) assertScopeType({ meta, resolved, scope });\n const preds =\n scope === null\n ? new Map<string, ClientRow | null>()\n : buildPreds({ meta, resolved, scope });\n const ctx: ScopeContext = { meta, resolved, scope, preds, ...(params.wrapDelegate === undefined ? {} : { wrapDelegate: params.wrapDelegate }) };\n return buildScopedOver({ ctx, client });\n },\n enumerable: true,\n });\n}\n",
29
+ "/**\n * Native-RLS readiness — verify the ACTUAL runtime privileges and the ACTUAL\n * policy state of the live database (plan contracts 9, 11, 12, 16).\n *\n * What this module refuses to do is as important as what it does:\n * - it never trusts a migration record, a policy NAME or a policy COMMENT\n * (lane 3S proved a rewritten comment can make a comment check green while\n * the policy itself is tampered);\n * - it compares policy expressions as PostgreSQL's OWN deparse of a probe\n * policy created on a same-named TEMP clone under an empty `search_path`\n * — never as normalized text. Only desired deparse is cached by the client;\n * live expressions and privileges are read again every transaction;\n * - a database that will not let it verify reports `\"unavailable\"`, which is\n * NOT ready. There is no path from \"could not check\" to \"ready\".\n *\n * Cost and blast radius: no DDL on any live table (only `pg_temp` clones, so\n * the live table sees an AccessShareLock, never AccessExclusiveLock), no role\n * switch, no context binding, no schema or role provisioning of any kind, and\n * `search_path` saved and restored inside the probe's own savepoint. Nothing\n * about live readiness is cached. Reconnect invalidates desired deparse too.\n * Within one backend generation, desired deparse may be stale after privileged\n * dependency changes that leave identical expression text; this is not an\n * instantaneous-revocation guarantee. Standalone doctor checks never cache.\n */\n\nimport { VibeError, assertValidSchemaIR, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { ModelIR, Provider, SchemaIR } from \"@vibeorm/schema\";\nimport { NATIVE_RLS, getSqlDialect, renderRlsPolicy, renderRlsRole, NATIVE_RLS_PROBE_POLICY, renderRlsReadinessQuery, renderRlsProbeTable } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type { DatabaseAdapter } from \"./adapter.ts\";\n\n// ─── Public shape ─────────────────────────────────────────────────\n\n/** Stable identifier of one readiness check; callers branch on this, never on text. */\nexport type NativeRlsCheckName =\n | \"runtime-role-identity\"\n | \"runtime-role-privileges\"\n | \"elevated-role-membership\"\n | \"schema-control\"\n | \"table-ownership\"\n | \"table-truncate-privilege\"\n | \"row-level-security-enabled\"\n | \"row-level-security-forced\"\n | \"managed-policy-present\"\n | \"managed-policy-shape\"\n | \"unexpected-policy\"\n | \"managed-policy-expression\"\n | \"unsafe-objects\";\n\n/**\n * `\"unavailable\"` means the database would not let this check run (no TEMP\n * privilege, an unreadable catalog flag). It blocks readiness exactly like\n * `\"fail\"` — the two differ only in what a human should do about them.\n * `\"warn\"` is a reported limitation that does not block: the PGlite session\n * role, and the presence of unsafe objects (contract 16 reports them).\n */\nexport type NativeRlsCheckStatus = \"pass\" | \"warn\" | \"fail\" | \"unavailable\";\n\n/** One verified fact about the live database. */\nexport type NativeRlsCheck = {\n readonly name: NativeRlsCheckName;\n readonly status: NativeRlsCheckStatus;\n readonly detail: string;\n /** Offending tables, roles or objects — never a context or identity VALUE. */\n readonly subjects: readonly string[];\n};\n\n/** An object that can execute with an authority other than the caller's. */\nexport type NativeRlsUnsafeObject = {\n readonly kind: \"view\" | \"materializedView\" | \"securityDefinerRoutine\" | \"trigger\";\n /** `public.order_report`, `public.escalate`, `public.orders.audit_orders`. */\n readonly name: string;\n readonly owner: string;\n readonly detail: string;\n};\n\n/** The full readiness verdict. Built fresh on every call — never cached. */\nexport type NativeRlsReport = {\n /** True only when every check is `\"pass\"` or `\"warn\"`. */\n readonly ready: boolean;\n readonly currentRole: string;\n readonly sessionRole: string;\n readonly provider: Provider;\n readonly serverVersionNum: number | null;\n /** Physical tables of every model carrying a rule other than `\"unprotected\"`. */\n readonly tables: readonly string[];\n readonly checks: readonly NativeRlsCheck[];\n /** The `\"fail\"` / `\"unavailable\"` subset — what makes `ready` false. */\n readonly problems: readonly NativeRlsCheck[];\n readonly unsafeObjects: readonly NativeRlsUnsafeObject[];\n};\n\n// Compatibility exports; all statement text belongs to the SQL dialect layer.\nexport { RLS_READINESS_SQL, NATIVE_RLS_PROBE_POLICY } from \"@vibeorm/sql\";\n\n// ─── Row readers (strict: a fact is read, never coerced) ──────────\n\ntype CatalogRow = Record<string, unknown>;\n\nfunction textOf(params: { row: CatalogRow; key: string }): string {\n const value = params.row[params.key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction nullableTextOf(params: { row: CatalogRow; key: string }): string | null {\n const value = params.row[params.key];\n return typeof value === \"string\" ? value : null;\n}\n\n/**\n * A database boolean is accepted ONLY as `true`/`false`. Anything else leaves\n * the fact unknown (`undefined`), which makes its check `\"unavailable\"` — a\n * permissive `String(value) === \"t\"` would turn an unreadable security flag\n * into a silent pass, which is the whole class of bug this feature must not\n * have.\n */\nfunction flagOf(params: { row: CatalogRow; key: string }): boolean | undefined {\n const value = params.row[params.key];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction intOf(params: { row: CatalogRow; key: string }): number | null {\n const value = params.row[params.key];\n if (typeof value === \"number\" && Number.isInteger(value)) return value;\n if (typeof value !== \"string\" || !/^\\d+$/.test(value)) return null;\n return Number.parseInt(value, 10);\n}\n\n// ─── Internal catalog shapes ──────────────────────────────────────\n\ntype IdentityFacts = {\n readonly currentRole: string;\n readonly sessionRole: string;\n readonly superuser: boolean | undefined;\n readonly bypassRls: boolean | undefined;\n readonly createDb: boolean | undefined;\n readonly createRole: boolean | undefined;\n readonly serverVersionNum: number | null;\n};\n\ntype TableFacts = {\n readonly table: string;\n readonly rlsEnabled: boolean | undefined;\n readonly rlsForced: boolean | undefined;\n readonly owner: string;\n readonly ownerAccess: boolean | undefined;\n readonly truncate: boolean | undefined;\n};\n\ntype PolicyFacts = {\n readonly table: string;\n readonly name: string;\n readonly permissive: boolean | undefined;\n readonly command: string;\n readonly toPublic: boolean | undefined;\n readonly hasUsing: boolean | undefined;\n readonly hasWithCheck: boolean | undefined;\n};\n\ntype ExpressionFacts = {\n readonly table: string;\n readonly probe: boolean | undefined;\n readonly using: string | null;\n readonly withCheck: string | null;\n};\n\ntype SchemaControlFacts = {\n readonly schema: string;\n readonly database: string;\n readonly ownerAccess: boolean | undefined;\n readonly create: boolean | undefined;\n readonly databaseOwnerAccess: boolean | undefined;\n};\n\n/** One protected model, with the physical table its policy lives on. */\ntype ProtectedTable = { readonly model: string; readonly table: string };\n\ntype ProbeOutcome =\n | { readonly available: true; readonly expressions: readonly ExpressionFacts[] }\n | { readonly available: false; readonly reason: string };\n\n/** Bounded per-client cache: evicting a backend only costs a fresh probe. */\nconst EXPRESSION_CACHE_LIMITS: { readonly connections: number } = Object.freeze({ connections: 64 });\nconst expressionCaches: WeakMap<object, { readonly schema: SchemaIR; readonly connections: Map<string, readonly ExpressionFacts[]> }> = new WeakMap();\n\n// ─── Findings ─────────────────────────────────────────────────────\n\ntype Finding = { readonly subject: string; readonly severity: \"fail\" | \"unavailable\" | \"warn\" };\n\nfunction buildCheck(params: {\n name: NativeRlsCheckName;\n detail: string;\n findings: readonly Finding[];\n}): NativeRlsCheck {\n const { name, detail, findings } = params;\n const status: NativeRlsCheckStatus = findings.some((finding) => finding.severity === \"fail\")\n ? \"fail\"\n : findings.some((finding) => finding.severity === \"unavailable\")\n ? \"unavailable\"\n : findings.some((finding) => finding.severity === \"warn\")\n ? \"warn\"\n : \"pass\";\n return { name, status, detail, subjects: [...new Set(findings.map((finding) => finding.subject))] };\n}\n\n/** An unknown flag is unavailable; a known flag that deviates is a failure. */\nfunction flagFinding(params: {\n subject: string;\n flag: boolean | undefined;\n expected: boolean;\n}): Finding | undefined {\n const { subject, flag, expected } = params;\n if (flag === undefined) return { subject, severity: \"unavailable\" };\n return flag === expected ? undefined : { subject, severity: \"fail\" };\n}\n\nfunction present(findings: readonly (Finding | undefined)[]): Finding[] {\n return findings.filter((finding): finding is Finding => finding !== undefined);\n}\n\n// ─── Schema helpers ───────────────────────────────────────────────\n\nfunction physicalTable(params: { model: ModelIR }): string {\n return params.model.dbName ?? params.model.name;\n}\n\nfunction protectedTablesOf(params: { schema: SchemaIR }): ProtectedTable[] {\n return params.schema.models\n .filter((model) => model.rls !== undefined && model.rls !== \"unprotected\")\n .map((model) => ({ model: model.name, table: physicalTable({ model }) }));\n}\n\nfunction unprotectedTablesOf(params: { schema: SchemaIR }): string[] {\n return params.schema.models\n .filter((model) => model.rls === \"unprotected\")\n .map((model) => physicalTable({ model }));\n}\n\n/**\n * Both entry points refuse the same two impossibilities before touching the\n * database: a dialect without native RLS, and a schema that never declared it.\n */\nfunction requireNativeRls(params: { adapter: DatabaseAdapter; schema: SchemaIR }): SqlDialect {\n const dialect = getSqlDialect({ dialect: params.adapter.dialect });\n if (!dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"nativeRowLevelSecurity\" });\n }\n if (params.schema.rls === undefined) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: \"Native row-level security readiness requires a schema that declares native RLS\",\n });\n }\n assertValidSchemaIR({ schema: params.schema });\n return dialect;\n}\n\nfunction describeFailure(params: { error: unknown }): string {\n const { error } = params;\n return error instanceof Error ? error.message : String(error);\n}\n\n// ─── The expression probe ─────────────────────────────────────────\n\n/**\n * Compare-by-deparse, the lock-free half of lane 3S's answer 2: clone each\n * protected table's column set into a TEMP table of the SAME NAME (the deparse\n * prints outer column references as `\"<relname>\".\"<col>\"` and casts against the\n * real column types, so both must match), put the DESIRED policy on the clone,\n * and let the server print both expressions in one read.\n *\n * It runs in its OWN savepoint for three reasons: a refusal cannot poison the\n * caller's transaction; the empty `search_path` cannot leak into the caller's\n * statements; and if anything fails, the rollback removes the clones — which\n * MATTERS, because a surviving `pg_temp.\"User\"` would shadow the live table\n * for every unqualified statement the ORM issues afterwards.\n */\nasync function probeExpressions(params: {\n adapter: DatabaseAdapter;\n dialect: SqlDialect;\n schema: SchemaIR;\n tables: readonly ProtectedTable[];\n desired?: readonly ExpressionFacts[];\n}): Promise<ProbeOutcome> {\n const { adapter, dialect, schema, tables } = params;\n if (tables.length === 0) return { available: true, expressions: [] };\n\n return adapter\n .transaction(async (tx): Promise<ProbeOutcome> => {\n const current = await tx.execute(renderRlsReadinessQuery({ dialect, query: \"readSearchPath\" }));\n const searchPath = current[0] === undefined ? \"\" : textOf({ row: current[0], key: \"searchPath\" });\n await tx.execute(renderRlsReadinessQuery({ dialect, query: \"setSearchPath\", searchPath: \"\" }));\n\n for (const entry of params.desired === undefined ? tables : []) {\n await tx.executeUnsafe(renderRlsProbeTable({ dialect, table: entry.table, action: \"create\" }));\n await tx.executeUnsafe(\n renderRlsPolicy({\n dialect,\n schema,\n model: entry.model,\n policyName: NATIVE_RLS_PROBE_POLICY,\n targetSchema: \"pg_temp\",\n }),\n );\n }\n\n const rows = await tx.execute(renderRlsReadinessQuery({ dialect, query: \"expressions\" }));\n\n for (const entry of params.desired === undefined ? tables : []) {\n await tx.executeUnsafe(renderRlsProbeTable({ dialect, table: entry.table, action: \"drop\" }));\n }\n await tx.execute(renderRlsReadinessQuery({ dialect, query: \"setSearchPath\", searchPath }));\n\n return {\n available: true,\n expressions: [...rows.filter((row) => params.desired === undefined || row.probe === false).map((row) => ({\n table: textOf({ row, key: \"table\" }),\n probe: flagOf({ row, key: \"probe\" }),\n using: nullableTextOf({ row, key: \"using\" }),\n withCheck: nullableTextOf({ row, key: \"withCheck\" }),\n })), ...(params.desired ?? [])],\n };\n })\n .catch((error: unknown): ProbeOutcome => ({ available: false, reason: describeFailure({ error }) }));\n}\n\n// ─── Checks ───────────────────────────────────────────────────────\n\nfunction identityChecks(params: {\n identity: IdentityFacts;\n provider: Provider;\n runtimeRole: string | undefined;\n}): NativeRlsCheck[] {\n const { identity, provider, runtimeRole } = params;\n const embedded = provider === \"pglite\";\n\n const identityFindings: Finding[] = [];\n if (runtimeRole !== undefined && identity.currentRole !== runtimeRole) {\n identityFindings.push({ subject: identity.currentRole, severity: \"fail\" });\n }\n if (identity.sessionRole !== identity.currentRole) {\n // On a server the login role IS the runtime role, so a switched session is\n // a deployment mistake. PGlite has only its privileged embedded session,\n // so the transaction-local switch is expected — and is host-process\n // discipline, never a boundary against that process.\n identityFindings.push({ subject: identity.sessionRole, severity: embedded ? \"warn\" : \"fail\" });\n }\n\n return [\n buildCheck({\n name: \"runtime-role-identity\",\n detail: embedded\n ? \"PGlite binds the runtime role transaction-locally; its session role stays privileged, which is a limitation of the embedded engine, not a boundary\"\n : \"the connection must log in AS the runtime role, never switch into it\",\n findings: identityFindings,\n }),\n buildCheck({\n name: \"runtime-role-privileges\",\n detail: \"the runtime role must not be a superuser and must not hold BYPASSRLS, CREATEDB or CREATEROLE\",\n findings: present([\n flagFinding({ subject: \"superuser\", flag: identity.superuser, expected: false }),\n flagFinding({ subject: \"bypassrls\", flag: identity.bypassRls, expected: false }),\n flagFinding({ subject: \"createdb\", flag: identity.createDb, expected: false }),\n flagFinding({ subject: \"createrole\", flag: identity.createRole, expected: false }),\n ]),\n }),\n ];\n}\n\nfunction schemaControlCheck(params: { control: SchemaControlFacts | undefined }): NativeRlsCheck {\n const { control } = params;\n if (control === undefined) {\n return buildCheck({\n name: \"schema-control\",\n detail: \"the schema holding the protected tables could not be read\",\n findings: [{ subject: NATIVE_RLS.tableSchema, severity: \"unavailable\" }],\n });\n }\n const findings = present([\n flagFinding({ subject: control.schema, flag: control.ownerAccess, expected: false }),\n flagFinding({ subject: control.database, flag: control.databaseOwnerAccess, expected: false }),\n ]);\n // CREATE on the schema is NOT a policy bypass — it cannot disable RLS, which\n // needs table ownership — but it lets the runtime add objects to a protected\n // schema, and it is the default for PUBLIC on PostgreSQL 14 and earlier.\n // Reported, deliberately not a refusal.\n if (control.create === undefined) findings.push({ subject: control.schema, severity: \"unavailable\" });\n else if (control.create) findings.push({ subject: `CREATE on ${control.schema}`, severity: \"warn\" });\n\n return buildCheck({\n name: \"schema-control\",\n detail:\n \"the runtime role must not own (or be able to SET ROLE into the owner of) the protected schema or the database — a schema owner can DROP SCHEMA ... CASCADE\",\n findings,\n });\n}\n\nfunction tableChecks(params: {\n tables: readonly TableFacts[];\n protectedTables: readonly ProtectedTable[];\n}): NativeRlsCheck[] {\n const { protectedTables } = params;\n const byName = new Map(params.tables.map((row) => [row.table, row]));\n\n const ownership: Finding[] = [];\n const truncate: Finding[] = [];\n const enabled: Finding[] = [];\n const forced: Finding[] = [];\n\n for (const entry of protectedTables) {\n const row = byName.get(entry.table);\n if (row === undefined) {\n // A protected table the runtime cannot see at all: its RLS state is not\n // \"fine\", it is unknown. Enabled/forced FAIL (a table that is not there\n // is certainly not protecting anything); ownership and TRUNCATE are\n // reported unavailable rather than passing on a table nobody could read.\n enabled.push({ subject: entry.table, severity: \"fail\" });\n forced.push({ subject: entry.table, severity: \"fail\" });\n ownership.push({ subject: entry.table, severity: \"unavailable\" });\n truncate.push({ subject: entry.table, severity: \"unavailable\" });\n continue;\n }\n const own = flagFinding({ subject: entry.table, flag: row.ownerAccess, expected: false });\n if (own !== undefined) ownership.push(own);\n const trunc = flagFinding({ subject: entry.table, flag: row.truncate, expected: false });\n if (trunc !== undefined) truncate.push(trunc);\n const on = flagFinding({ subject: entry.table, flag: row.rlsEnabled, expected: true });\n if (on !== undefined) enabled.push(on);\n const force = flagFinding({ subject: entry.table, flag: row.rlsForced, expected: true });\n if (force !== undefined) forced.push(force);\n }\n\n return [\n buildCheck({\n name: \"table-ownership\",\n detail:\n \"the runtime role must not own a protected table, nor be a member of (or able to SET ROLE into) its owner — an owner can ALTER TABLE ... DISABLE ROW LEVEL SECURITY\",\n findings: ownership,\n }),\n buildCheck({\n name: \"table-truncate-privilege\",\n detail: \"no role the runtime can reach may hold TRUNCATE on a protected table — TRUNCATE is not filtered by a policy\",\n findings: truncate,\n }),\n buildCheck({\n name: \"row-level-security-enabled\",\n detail: \"every protected table must exist and have ROW LEVEL SECURITY enabled\",\n findings: enabled,\n }),\n buildCheck({\n name: \"row-level-security-forced\",\n detail: \"every protected table must FORCE ROW LEVEL SECURITY, so its owner is not exempt from its own policy\",\n findings: forced,\n }),\n ];\n}\n\nfunction policyChecks(params: {\n policies: readonly PolicyFacts[];\n protectedTables: readonly ProtectedTable[];\n unprotected: readonly string[];\n}): NativeRlsCheck[] {\n const { policies, protectedTables, unprotected } = params;\n const protectedNames = new Set(protectedTables.map((entry) => entry.table));\n\n const missing: Finding[] = [];\n const shape: Finding[] = [];\n const unexpected: Finding[] = [];\n\n for (const entry of protectedTables) {\n const managed = policies.filter((policy) => policy.table === entry.table && policy.name === NATIVE_RLS.policyName);\n if (managed.length === 0) {\n missing.push({ subject: entry.table, severity: \"fail\" });\n continue;\n }\n for (const policy of managed) {\n shape.push(\n ...present([\n flagFinding({ subject: entry.table, flag: policy.permissive, expected: true }),\n flagFinding({ subject: entry.table, flag: policy.toPublic, expected: true }),\n flagFinding({ subject: entry.table, flag: policy.hasUsing, expected: true }),\n flagFinding({ subject: entry.table, flag: policy.hasWithCheck, expected: true }),\n ]),\n );\n // polcmd '*' is FOR ALL. Anything narrower leaves the other commands\n // unfiltered by this policy.\n if (policy.command !== \"*\") shape.push({ subject: entry.table, severity: \"fail\" });\n }\n }\n\n for (const policy of policies) {\n // PostgreSQL ORs permissive policies, so ANY unknown policy on a managed\n // table can widen access; and our own managed name on a table the schema\n // declares unprotected means the deployment disagrees with the schema.\n if (protectedNames.has(policy.table) && policy.name !== NATIVE_RLS.policyName) {\n unexpected.push({ subject: policy.table, severity: \"fail\" });\n }\n if (!protectedNames.has(policy.table) && policy.name === NATIVE_RLS.policyName && unprotected.includes(policy.table)) {\n unexpected.push({ subject: policy.table, severity: \"fail\" });\n }\n }\n\n return [\n buildCheck({\n name: \"managed-policy-present\",\n detail: `every protected table must carry the managed policy \"${NATIVE_RLS.policyName}\"`,\n findings: missing,\n }),\n buildCheck({\n name: \"managed-policy-shape\",\n detail: \"the managed policy must be PERMISSIVE, FOR ALL, TO PUBLIC, and carry BOTH a USING and a WITH CHECK clause\",\n findings: shape,\n }),\n buildCheck({\n name: \"unexpected-policy\",\n detail: \"managed tables are managed exclusively: no unknown policy on a protected table, and no managed policy on an unprotected one\",\n findings: unexpected,\n }),\n ];\n}\n\nfunction expressionCheck(params: {\n probe: ProbeOutcome;\n protectedTables: readonly ProtectedTable[];\n}): NativeRlsCheck {\n const { probe, protectedTables } = params;\n const detail =\n \"the live policy expression must equal the desired one, both deparsed by this server under an empty search_path\";\n\n if (!probe.available) {\n return buildCheck({\n name: \"managed-policy-expression\",\n detail: `${detail} — the probe could not run (${probe.reason})`,\n findings: protectedTables.map((entry) => ({ subject: entry.table, severity: \"unavailable\" as const })),\n });\n }\n\n const findings: Finding[] = [];\n for (const entry of protectedTables) {\n const live = probe.expressions.find((row) => row.table === entry.table && row.probe === false);\n const desired = probe.expressions.find((row) => row.table === entry.table && row.probe === true);\n if (desired === undefined) {\n // The probe policy was created but its deparse did not come back: the\n // comparison did not happen, so it did not pass.\n findings.push({ subject: entry.table, severity: \"unavailable\" });\n continue;\n }\n if (live === undefined) {\n findings.push({ subject: entry.table, severity: \"fail\" });\n continue;\n }\n // A NULL clause on either side means there is nothing to compare — the\n // managed policy always carries both, so this is never a pass.\n if (live.using === null || live.withCheck === null || desired.using === null || desired.withCheck === null) {\n findings.push({ subject: entry.table, severity: \"fail\" });\n continue;\n }\n if (live.using !== desired.using || live.withCheck !== desired.withCheck) {\n findings.push({ subject: entry.table, severity: \"fail\" });\n }\n }\n\n return buildCheck({ name: \"managed-policy-expression\", detail, findings });\n}\n\nfunction unsafeObjectsOf(params: {\n views: readonly CatalogRow[];\n routines: readonly CatalogRow[];\n triggers: readonly CatalogRow[];\n protectedTables: readonly ProtectedTable[];\n}): { readonly objects: NativeRlsUnsafeObject[]; readonly findings: Finding[] } {\n const objects: NativeRlsUnsafeObject[] = [];\n const findings: Finding[] = [];\n const protectedNames = new Set(params.protectedTables.map((entry) => entry.table));\n\n for (const row of params.views) {\n const name = `${textOf({ row, key: \"schema\" })}.${textOf({ row, key: \"name\" })}`;\n const owner = textOf({ row, key: \"owner\" });\n const materialized = flagOf({ row, key: \"materialized\" });\n const invoker = flagOf({ row, key: \"securityInvoker\" });\n if (materialized === undefined || invoker === undefined) {\n findings.push({ subject: name, severity: \"unavailable\" });\n continue;\n }\n if (materialized) {\n objects.push({\n kind: \"materializedView\",\n name,\n owner,\n detail: \"a materialized view holds rows collected with its owner's authority\",\n });\n continue;\n }\n if (!invoker) {\n objects.push({ kind: \"view\", name, owner, detail: \"the view runs with its owner's authority (no security_invoker)\" });\n }\n }\n\n for (const row of params.routines) {\n const name = `${textOf({ row, key: \"schema\" })}.${textOf({ row, key: \"name\" })}`;\n objects.push({\n kind: \"securityDefinerRoutine\",\n name,\n owner: textOf({ row, key: \"owner\" }),\n detail: \"a SECURITY DEFINER routine the runtime role may execute runs with its owner's authority\",\n });\n }\n\n for (const row of params.triggers) {\n const table = textOf({ row, key: \"table\" });\n const name = `${NATIVE_RLS.tableSchema}.${table}.${textOf({ row, key: \"name\" })}`;\n const definer = flagOf({ row, key: \"securityDefiner\" });\n if (definer === undefined) {\n findings.push({ subject: name, severity: \"unavailable\" });\n continue;\n }\n if (!definer) continue;\n objects.push({\n kind: \"trigger\",\n name,\n owner: textOf({ row, key: \"owner\" }),\n detail: protectedNames.has(table)\n ? \"a SECURITY DEFINER trigger on a protected table runs with its owner's authority\"\n : \"a SECURITY DEFINER trigger runs with its owner's authority\",\n });\n }\n\n for (const object of objects) findings.push({ subject: object.name, severity: \"warn\" });\n return { objects, findings };\n}\n\n// ─── Entry points ─────────────────────────────────────────────────\n\n/**\n * Verify readiness inside a transaction that is ALREADY bound — the role is\n * bound (PGlite) or logged in (server), the context settings are set, and the\n * caller's own statements will run in this same transaction.\n *\n * Binds nothing itself: no role switch, no context setting, and the\n * `search_path` it needs is emptied and restored inside its own savepoint, so\n * the caller's statements are unaffected. Safe to call twice in one\n * transaction — the temp clones are dropped before it returns.\n *\n * @param runtimeRole Compared against `current_user` when supplied. NEVER used\n * to switch role: that binding belongs to the caller.\n */\nexport async function inspectNativeRlsTransaction(params: {\n adapter: DatabaseAdapter;\n schema: SchemaIR;\n runtimeRole?: string;\n /** Client identity scopes desired-expression reuse; omit for a fresh doctor probe.\n * Live facts are never cached. Reuse requires a readable backend pid/start time. */\n cacheKey?: object;\n}): Promise<NativeRlsReport> {\n const { adapter, schema } = params;\n const dialect = requireNativeRls({ adapter, schema });\n const protectedTables = protectedTablesOf({ schema });\n const unprotected = unprotectedTablesOf({ schema });\n\n const identityRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"identity\" }));\n const identityRow: CatalogRow = identityRows[0] ?? {};\n const identity: IdentityFacts = {\n currentRole: textOf({ row: identityRow, key: \"currentUser\" }),\n sessionRole: textOf({ row: identityRow, key: \"sessionUser\" }),\n superuser: flagOf({ row: identityRow, key: \"super\" }),\n bypassRls: flagOf({ row: identityRow, key: \"bypassRls\" }),\n createDb: flagOf({ row: identityRow, key: \"createDb\" }),\n createRole: flagOf({ row: identityRow, key: \"createRole\" }),\n serverVersionNum: intOf({ row: identityRow, key: \"serverVersionNum\" }),\n };\n\n const elevatedRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"elevatedRoles\" }));\n const controlRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"schemaControl\" }));\n const tableRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"tables\" }));\n const policyRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"policies\" }));\n const viewRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"views\" }));\n const routineRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"routines\" }));\n const triggerRows = await adapter.execute(renderRlsReadinessQuery({ dialect, query: \"triggers\" }));\n\n const controlRow = controlRows[0];\n const control: SchemaControlFacts | undefined =\n controlRow === undefined\n ? undefined\n : {\n schema: textOf({ row: controlRow, key: \"schema\" }),\n database: textOf({ row: controlRow, key: \"database\" }),\n ownerAccess: flagOf({ row: controlRow, key: \"ownerAccess\" }),\n create: flagOf({ row: controlRow, key: \"create\" }),\n databaseOwnerAccess: flagOf({ row: controlRow, key: \"databaseOwnerAccess\" }),\n };\n\n const tables: TableFacts[] = tableRows.map((row) => ({\n table: textOf({ row, key: \"table\" }),\n rlsEnabled: flagOf({ row, key: \"rlsEnabled\" }),\n rlsForced: flagOf({ row, key: \"rlsForced\" }),\n owner: textOf({ row, key: \"owner\" }),\n ownerAccess: flagOf({ row, key: \"ownerAccess\" }),\n truncate: flagOf({ row, key: \"truncate\" }),\n }));\n\n const policies: PolicyFacts[] = policyRows.map((row) => ({\n table: textOf({ row, key: \"table\" }),\n name: textOf({ row, key: \"name\" }),\n permissive: flagOf({ row, key: \"permissive\" }),\n command: textOf({ row, key: \"command\" }),\n toPublic: flagOf({ row, key: \"toPublic\" }),\n hasUsing: flagOf({ row, key: \"hasUsing\" }),\n hasWithCheck: flagOf({ row, key: \"hasWithCheck\" }),\n }));\n\n const backendPid = textOf({ row: identityRow, key: \"backendPid\" });\n // PGlite is single-user PostgreSQL: pg_stat_activity has no backend row.\n // Its engine startup time changes when the adapter creates a new instance.\n const backendStart = textOf({ row: identityRow, key: adapter.provider === \"pglite\" ? \"instanceStart\" : \"backendStart\" });\n const generation = JSON.stringify([backendPid, backendStart, identity.currentRole, identity.sessionRole, identity.serverVersionNum]);\n let connections: Map<string, readonly ExpressionFacts[]> | undefined;\n if (params.cacheKey !== undefined && backendPid !== \"\" && backendStart !== \"\") {\n let cache = expressionCaches.get(params.cacheKey);\n if (cache === undefined || cache.schema !== schema) {\n cache = { schema, connections: new Map() };\n expressionCaches.set(params.cacheKey, cache);\n }\n connections = cache.connections;\n }\n const desired = connections?.get(generation);\n const tempPrivilege = flagOf({ row: identityRow, key: \"tempPrivilege\" });\n const probe: ProbeOutcome = desired !== undefined && tempPrivilege !== true\n ? { available: false, reason: \"TEMP privilege is absent or unavailable\" }\n : await probeExpressions({ adapter, dialect, schema, tables: protectedTables, ...(desired === undefined ? {} : { desired }) });\n const unsafe = unsafeObjectsOf({\n views: viewRows,\n routines: routineRows,\n triggers: triggerRows,\n protectedTables,\n });\n\n const checks: NativeRlsCheck[] = [\n ...identityChecks({ identity, provider: adapter.provider, runtimeRole: params.runtimeRole }),\n buildCheck({\n name: \"elevated-role-membership\",\n detail:\n \"the runtime role must not be a member of any role carrying SUPERUSER, BYPASSRLS, CREATEROLE or CREATEDB, nor of a predefined pg_* role\",\n findings: elevatedRows.map((row) => ({ subject: textOf({ row, key: \"role\" }), severity: \"fail\" as const })),\n }),\n schemaControlCheck({ control }),\n ...tableChecks({ tables, protectedTables }),\n ...policyChecks({ policies, protectedTables, unprotected }),\n expressionCheck({ probe, protectedTables }),\n buildCheck({\n name: \"unsafe-objects\",\n detail:\n \"views, routines and triggers that execute with another owner's authority are reported, not analysed — RLS does not constrain them\",\n findings: unsafe.findings,\n }),\n ];\n\n const problems = checks.filter((check) => check.status === \"fail\" || check.status === \"unavailable\");\n if (connections !== undefined) {\n if (problems.length === 0 && probe.available) {\n if (!connections.has(generation) && connections.size >= EXPRESSION_CACHE_LIMITS.connections) {\n connections.delete(connections.keys().next().value!);\n }\n connections.set(generation, probe.expressions.filter((row) => row.probe === true));\n } else connections.delete(generation);\n }\n return {\n ready: problems.length === 0,\n currentRole: identity.currentRole,\n sessionRole: identity.sessionRole,\n provider: adapter.provider,\n serverVersionNum: identity.serverVersionNum,\n tables: protectedTables.map((entry) => entry.table),\n checks,\n problems,\n unsafeObjects: unsafe.objects,\n };\n}\n\n/**\n * Verify readiness on an adapter that is not already inside a bound\n * transaction — `vibeorm doctor`, or a one-off connection check. Opens one\n * transaction and, on PGlite only, binds the configured runtime role as its\n * first statement. A server connection is never switched: its login role IS\n * the runtime role, and a supplied `runtimeRole` is only compared with it.\n */\nexport async function inspectNativeRls(params: {\n adapter: DatabaseAdapter;\n schema: SchemaIR;\n runtimeRole?: string;\n}): Promise<NativeRlsReport> {\n const { adapter, schema } = params;\n requireNativeRls({ adapter, schema });\n\n const embeddedRole: string | undefined =\n adapter.provider === \"pglite\" ? requireEmbeddedRole({ role: params.runtimeRole }) : undefined;\n\n return adapter.transaction(async (tx) => {\n if (embeddedRole !== undefined) {\n await tx.executeUnsafe(renderRlsRole({ dialect: getSqlDialect({ dialect: adapter.dialect }), role: embeddedRole }));\n }\n return inspectNativeRlsTransaction({\n adapter: tx,\n schema,\n ...(params.runtimeRole === undefined ? {} : { runtimeRole: params.runtimeRole }),\n });\n });\n}\n\n/** PGlite's default session is privileged, so a role to bind is mandatory there. */\nfunction requireEmbeddedRole(params: { role: string | undefined }): string {\n const { role } = params;\n if (typeof role !== \"string\" || role.length === 0 || role.includes(\"\\0\")) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message:\n \"PGlite native row-level security requires a pre-existing restricted runtime role (nativeRls.runtimeRole) — its default embedded session is privileged and bypasses every policy\",\n meta: { provider: \"pglite\" },\n });\n }\n return role;\n}\n\n/**\n * Refuse to proceed on a database that is not ready. `meta.checks` names every\n * check that failed or could not be run — callers branch on those stable\n * names, never on this message.\n */\nexport function assertNativeRlsReady(params: { report: NativeRlsReport }): void {\n const { report } = params;\n if (report.ready) return;\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `Native row-level security is not ready on this database: ${report.problems\n .map((problem) => `${problem.name} (${problem.status})`)\n .join(\", \")}`,\n meta: {\n checks: report.problems.map((problem) => problem.name),\n currentRole: report.currentRole,\n provider: report.provider,\n },\n });\n}\n\n/** One line per check plus one per unsafe object — `vibeorm doctor`'s output. */\nexport function formatNativeRlsReport(params: { report: NativeRlsReport }): string[] {\n const { report } = params;\n const lines: string[] = [\n `Native RLS: ${report.ready ? \"ready\" : \"NOT READY\"}${report.unsafeObjects.length === 0 ? \"\" : `, ${report.unsafeObjects.length} unsafe object(s) reported — RLS does not constrain them`} as ${report.currentRole} (session ${report.sessionRole}, ${report.provider}), ${report.tables.length} protected table(s)`,\n ];\n for (const check of report.checks) {\n const subjects = check.subjects.length === 0 ? \"\" : ` [${check.subjects.join(\", \")}]`;\n lines.push(` ${check.name}: ${check.status}${subjects} — ${check.detail}`);\n }\n for (const object of report.unsafeObjects) {\n lines.push(` unsafe ${object.kind}: ${object.name} owned by ${object.owner} — ${object.detail}`);\n }\n return lines;\n}\n",
30
+ "import { registerPolicyOperations } from \"./policy-operation.ts\";\n/**\n * The dynamic client: model delegates over a `DatabaseAdapter`, built from the\n * Schema IR at runtime.\n *\n * This is the engine the generated client wraps in P2 proper. It is deliberately\n * untyped-per-model — the generator emits a `.d.ts` that declares each delegate\n * with precise argument and result types, and casts to it. Nothing about the\n * shape of a query lives here: `query-builder.ts` builds statements,\n * `@vibeorm/sql` renders them, `codecs.ts` moves values across the wire,\n * `relation-loader.ts` attaches included relations, `nested-writes.ts`\n * orchestrates relation verbs inside create/update data.\n *\n * Execution split:\n * - row-returning statements use `adapter.execute` (the cached hot path),\n * - count-returning mutations (createMany/updateMany/deleteMany) use\n * `adapter.executeUnsafe`, the only place the frozen adapter contract\n * surfaces `affectedRows`.\n */\n\nimport { RlsContextError, VibeError, assertValidSchemaIR, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect, SchemaIR } from \"@vibeorm/schema\";\nimport { ParamCollector, getSqlDialect, renderRlsContext, renderRlsPolicy, renderRlsRole } from \"@vibeorm/sql\";\nimport type { SelectStatement, SqlDialect, SqlStatement } from \"@vibeorm/sql\";\nimport type { DatabaseAdapter, QueryResult, TransactionOptions } from \"./adapter.ts\";\nimport { decodeAggregateValue, materializeRows } from \"./codecs.ts\";\nimport { StatementRenderCache, renderStatementCached } from \"./render-cache.ts\";\nimport { buildRuntimeMeta, getModelMeta } from \"./model-meta.ts\";\nimport type { FieldMeta, ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\nimport { COUNT_ALIAS, buildQuery, resolveResultShape, upsertUsesNativeStatement } from \"./query-builder.ts\";\nimport type { AggregateSpec, QueryMethod, QueryPlan, RelationStrategy, ResortKey } from \"./query-builder.ts\";\nimport { attachLateralRelations, attachRelations } from \"./relation-loader.ts\";\nimport type { RelationExecutor } from \"./relation-loader.ts\";\nimport { createWithNested, hasNestedWrites, updateWithNested } from \"./nested-writes.ts\";\nimport type { StatementRunner, WriteContext } from \"./nested-writes.ts\";\nimport type { RelationSelection } from \"./relation-plan.ts\";\nimport { applyComputedFields, assertComputedManifest } from \"./computed.ts\";\nimport type { ClientComputedOptions } from \"./computed.ts\";\nimport {\n assertExtensionManifest,\n buildConnectHooks,\n buildExtensionOperatorMap,\n} from \"./extensions.ts\";\nimport type {\n ClientExtensionMount,\n ClientExtensionsOptions,\n ConnectHook,\n ExtensionMountContext,\n} from \"./extensions.ts\";\nimport { compileWhere } from \"./query-builder.ts\";\nimport { attachDefineView } from \"./views.ts\";\nimport type { DefineViewFn } from \"./views.ts\";\nimport { checkStrictArguments } from \"./strict-args.ts\";\nimport { applyWriteValidators } from \"./validators.ts\";\nimport type { WriteValidators } from \"./validators.ts\";\nimport { attachPolicy } from \"./policy.ts\";\nimport type { PolicyContextValue } from \"./policy.ts\";\nimport { attachScoped } from \"./scoped.ts\";\nimport type { ScopedClientConfig } from \"./scoped.ts\";\nimport { bindRlsContext } from \"./rls-context.ts\";\nimport type { BoundRlsContext } from \"./rls-context.ts\";\nimport { assertNativeRlsReady, inspectNativeRlsTransaction } from \"./rls-readiness.ts\";\nimport { affectedRowsAreRowCounts } from \"./bulk-upsert.ts\";\nimport type { UpsertManyResult } from \"./bulk-upsert.ts\";\nimport { createTelemetryRecorder } from \"./telemetry/recorder.ts\";\nimport type { TelemetryOperationScope, TelemetryRecorder } from \"./telemetry/recorder.ts\";\nimport { instrumentStatement } from \"./telemetry/statement.ts\";\nimport type { StatementReport } from \"./telemetry/statement.ts\";\nimport type { TelemetryOperationKind, TelemetryOptions, TelemetryStatementKind } from \"./telemetry/types.ts\";\n\n// ─── Public types ─────────────────────────────────────────────────\n\n/** One executed statement, reported to `ClientOptions.onQuery`. */\nexport type QueryEvent = {\n /** Model name, or `null` for raw queries. */\n readonly model: string | null;\n /** ORM method, or `\"$queryRaw\"` / `\"$executeRaw\"`. */\n readonly method: string;\n readonly text: string;\n readonly values: readonly unknown[];\n readonly durationMs: number;\n};\n\nexport type ClientOptions = {\n /** Trusted infrastructure configuration. PGlite requires a pre-existing restricted role;\n * embedded role binding is not a security boundary against the host process.\n * Desired policy deparse is probed once per backend generation (bounded cache);\n * live expressions/privileges are still checked every transaction. Privileged\n * dependency changes retaining identical deparse need a fresh client/doctor check. */\n readonly nativeRls?: { readonly runtimeRole?: string };\n /** Called after every statement — logging, tracing, test assertions. */\n readonly onQuery?: (event: QueryEvent) => void;\n /**\n * Default relation-loading strategy: `\"query\"` (batched WHERE-IN, portable,\n * the default) or `\"join\"` (LATERAL + JSON aggregation, postgres/pglite\n * only). A per-query `relationStrategy` argument overrides it.\n */\n readonly relationStrategy?: RelationStrategy;\n /**\n * Append the primary key to ORDER BY when a find has no explicit orderBy\n * (default false) — deterministic row order at the cost of a sort. v1 parity.\n */\n readonly defaultOrderByPk?: boolean;\n /**\n * Append the primary key as a tie-breaker to `distinct` ordering (default\n * TRUE) — without it, WHICH row represents each distinct key is unspecified.\n * v1 parity.\n */\n readonly distinctOrderByPk?: boolean;\n /**\n * Opt-in write-boundary validators (Standard Schema, per model × field):\n * `{ User: { settings: zodSchema } }`. Run on every write path (nested\n * creates included) before encoding; failure throws VIBE_VALIDATION with\n * the validator's issues in `meta`. Reads are never taxed.\n */\n readonly validate?: WriteValidators;\n /**\n * Opt-in operation tracing. One event per public ORM call, with the\n * statements it ran; parameter values are redacted and raw SQL text is not\n * captured unless separately asked for. The exporter is the host's — a throw\n * from it can never change a database outcome, and `$disconnect()` flushes it\n * but never shuts it down.\n */\n readonly telemetry?: TelemetryOptions;\n /**\n * Strict argument handling (EPIC 2), **on by default**: an explicit\n * `undefined` anywhere in ORM argument syntax is refused BEFORE a statement\n * is built, instead of silently dropping the property (which widens a filter\n * or loses a write). `SKIP` (`@vibeorm/runtime`) omits a property\n * deliberately.\n *\n * Set `false` to opt OUT and restore legacy/Prisma semantics, where an\n * explicit `undefined` member simply vanishes. Only an explicit `false` does\n * that: an options object that does not mention this stays strict.\n */\n readonly strictArguments?: boolean;\n};\n\n/** Rows are plain objects keyed by field name; the generated client narrows them. */\nexport type ClientRow = Record<string, unknown>;\n\n/** Result of the count-returning batch methods. */\nexport type BatchResult = { readonly count: number };\n\n/**\n * A model's methods. Arguments and results are intentionally broad here — the\n * generated `.d.ts` replaces this surface with precise per-model types, and\n * keeping the runtime free of inference is what holds the type-cost budget\n * (constitution rule 2).\n */\nexport type ModelDelegate = {\n readonly findMany: (args?: ClientRow) => Promise<ClientRow[]>;\n readonly findFirst: (args?: ClientRow) => Promise<ClientRow | null>;\n readonly findFirstOrThrow: (args?: ClientRow) => Promise<ClientRow>;\n readonly findUnique: (args: ClientRow) => Promise<ClientRow | null>;\n readonly findUniqueOrThrow: (args: ClientRow) => Promise<ClientRow>;\n readonly create: (args: ClientRow) => Promise<ClientRow | null>;\n readonly createMany: (args: ClientRow) => Promise<BatchResult>;\n readonly createManyAndReturn: (args: ClientRow) => Promise<ClientRow[]>;\n readonly update: (args: ClientRow) => Promise<ClientRow>;\n readonly updateMany: (args: ClientRow) => Promise<BatchResult>;\n /**\n * Bulk update that returns the rows it changed (dialects with RETURNING).\n *\n * OPTIONAL on purpose: the base client always provides it, but the rewriting\n * handles (`$scoped`, `$withPolicy`) build explicit delegate literals and do\n * not implement it yet, and a required member would make the type claim a\n * method those handles do not have. See notes-epic2.md `## Hand-off`.\n */\n readonly updateManyAndReturn: (args: ClientRow) => Promise<ClientRow[]>;\n readonly upsertMany: (args: ClientRow) => Promise<UpsertManyResult>;\n readonly upsert: (args: ClientRow) => Promise<ClientRow>;\n readonly delete: (args: ClientRow) => Promise<ClientRow>;\n readonly deleteMany: (args?: ClientRow) => Promise<BatchResult>;\n /** Plain form returns a number; `{ select: { _all, field } }` returns per-key counts. */\n readonly count: (args?: ClientRow) => Promise<number | Record<string, number>>;\n readonly aggregate: (args: ClientRow) => Promise<ClientRow>;\n readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;\n};\n\n/**\n * The client. Delegates are also attached as own properties under their\n * camelCase names (`client.user.findMany()`); the type surfaces them through\n * `$models` because a plain index signature would erase the `$`-methods.\n * Model names can never collide with those: every reserved client name is\n * `$`-prefixed (see `RESERVED_CLIENT_NAMES` in @vibeorm/schema).\n */\nexport type DynamicClient = {\n /** Copy and freeze the required native-RLS identity without acquiring a connection. */\n readonly $withContext?: (context: Readonly<Record<string, unknown>>) => DynamicClient;\n /** Delegates keyed by BOTH camelCase client name and model name. */\n readonly $models: Readonly<Record<string, ModelDelegate>>;\n /**\n * Subscribe to client events (`\"query\"` fires after every statement, with\n * the same payload as `ClientOptions.onQuery` — both fire). Returns an\n * unsubscribe function. Transaction clients share the parent's listeners.\n */\n readonly $on: (event: \"query\", listener: (event: QueryEvent) => void) => () => void;\n /**\n * Run work in ONE transaction. Callback form: `fn` receives a transaction\n * client; everything it runs rides the same BEGIN/COMMIT and a throw rolls\n * back. Array form (Prisma parity): UN-AWAITED delegate calls — delegate\n * methods return LAZY query promises that only dispatch on await — run\n * SEQUENTIALLY inside one transaction, results returned positionally.\n */\n readonly $transaction: {\n <T>(fn: (tx: DynamicClient) => Promise<T>, options?: TransactionOptions): Promise<T>;\n <T extends readonly unknown[]>(\n operations: readonly [...T],\n options?: TransactionOptions,\n ): Promise<{ -readonly [K in keyof T]: Awaited<T[K]> }>;\n };\n /** Tagged template — interpolations become bound parameters, never text. */\n readonly $queryRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<ClientRow[]>;\n /** Tagged template returning the affected-row count. */\n readonly $executeRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<number>;\n readonly $queryRawUnsafe: (text: string, ...values: unknown[]) => Promise<ClientRow[]>;\n readonly $executeRawUnsafe: (text: string, ...values: unknown[]) => Promise<number>;\n readonly $connect: () => Promise<void>;\n readonly $disconnect: () => Promise<void>;\n /**\n * Field-masking views (v1 `defineView` parity, board #11) — a read-only\n * scoped client restricted to the definition's models and fields. Attached\n * by `attachDefineView` after construction (hence optional in the type);\n * it is always present on a built client, transaction clients included.\n */\n readonly $defineView?: DefineViewFn;\n /**\n * Row scoping (@@policy): bind a per-request context — the returned client\n * AND-s the policy predicate into every query on policied models and forces\n * it into creates. Attached only when the schema declares @@policy.\n */\n readonly $withPolicy?: (context: Readonly<Record<string, PolicyContextValue>>) => DynamicClient;\n /** Deliberate, greppable full-access escape from policy scoping. */\n readonly $bypassPolicy?: () => DynamicClient;\n /**\n * Tenant scoping (framework handoff): base client + total per-model tenancy\n * map + scope value → a NEW handle whose every call is confined to that\n * tenant (raw SQL refused). Always attached; refuses on @@policy schemas.\n */\n readonly $scoped?: (config: ScopedClientConfig) => DynamicClient;\n};\n\n// ─── Errors ───────────────────────────────────────────────────────\n\nfunction notFound(params: { model: string; method: QueryMethod | string }): VibeError {\n const { model, method } = params;\n return new VibeError({\n code: \"VIBE_NOT_FOUND\",\n message: `no ${model} record matched the where clause of ${method}()`,\n meta: { model, method },\n });\n}\n\nfunction viewIsReadOnly(params: { model: string; method: string }): VibeError {\n const { model, method } = params;\n return new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `${model} is a view — ${method}() is not available on views (they are read-only); write to the underlying table instead`,\n meta: { model, method },\n });\n}\n\n// ─── Parameter binding ────────────────────────────────────────\n\n/**\n * ORM-path binding: after the codec table has encoded every parameter, the only\n * bare JS arrays left in `rendered.values` are scalar-list params — `inArray`\n * filters and list-column writes (`Json.encode` stringifies, Bytes are\n * `Uint8Array`). Their wire form is the ADAPTER's business (`= ANY($n)` needs a\n * PG array literal on bun:sql, a tagged passthrough on pg/pglite), so each one\n * is handed to `adapter.formatArrayParam` here. Reviewed as fix F1 — the raw\n * paths (`$queryRaw*`) deliberately do NOT bind: drivers take raw arrays there\n * (LEARNINGS: ORM-path vs raw-path array params differ).\n */\nfunction bindValues(params: { adapter: DatabaseAdapter; values: unknown[] }): unknown[] {\n const { adapter, values } = params;\n return values.map((value) => (Array.isArray(value) ? adapter.formatArrayParam(value) : value));\n}\n\n// ─── Row shaping ──────────────────────────────────────────────────\n\n/**\n * Narrow a row to the fields the caller selected (scalars, relation names,\n * `_count`). Mutations RETURNING the primary key and relation loading fetching\n * stitch keys both hand back more than was asked for.\n */\nfunction project(params: { row: ClientRow; fields: readonly string[] | null }): ClientRow {\n const { row, fields } = params;\n if (fields === null) return row;\n const out: ClientRow = {};\n for (const field of fields) out[field] = row[field];\n return out;\n}\n\n/**\n * The N1 re-sort comparator (`QueryPlan.resortBy`): the user's orderBy over\n * DECODED rows, with `nulls` and Decimal ranking resolved at build time to\n * mirror what the SQL order would have produced (B4: Decimal ranks\n * numerically — the SQL side ordered a number).\n */\nfunction resortComparator(keys: readonly ResortKey[]): (a: ClientRow, b: ClientRow) => number {\n const rank = (value: unknown): number | bigint | string => {\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.getTime();\n return value as number | bigint | string;\n };\n return (a, b) => {\n for (const key of keys) {\n const left = a[key.field];\n const right = b[key.field];\n const leftNull = left === null || left === undefined;\n const rightNull = right === null || right === undefined;\n if (leftNull || rightNull) {\n if (leftNull && rightNull) continue;\n return leftNull === (key.nulls === \"first\") ? -1 : 1;\n }\n const rankLeft = key.decimal ? Number(left) : rank(left);\n const rankRight = key.decimal ? Number(right) : rank(right);\n if (rankLeft < rankRight) return key.direction === \"asc\" ? -1 : 1;\n if (rankLeft > rankRight) return key.direction === \"asc\" ? 1 : -1;\n }\n return 0;\n };\n}\n\n/**\n * Client-side leg of the find pipeline, in plan order: the negative-take\n * re-reverse, then the N1 distinct re-sort (the user's orderBy restored over\n * the deduplicated rows — every dialect: DISTINCT ON and the ROW_NUMBER\n * emulation both present rows grouped by the distinct key). The two never\n * combine — distinct refuses a negative take at build time.\n */\nfunction shapeRows(params: { plan: QueryPlan; rows: ClientRow[] }): ClientRow[] {\n const { plan, rows } = params;\n let out = rows;\n if (plan.reverseRows) out = [...out].reverse();\n if (plan.resortBy !== null && plan.resortBy.length > 0) {\n out = [...out].sort(resortComparator(plan.resortBy));\n }\n return out;\n}\n\n// ─── Aggregate result assembly ──────────────────────────────\n\nfunction fieldOf(params: { model: ModelMeta; name: string | null }): FieldMeta | null {\n const { model, name } = params;\n if (name === null) return null;\n return model.fieldByName.get(name) ?? null;\n}\n\n/** `{ _count: 3 | {…}, _avg: {…}, … }` from one aggregate row, by construction. */\nfunction assembleAggregates(params: {\n engine: Engine;\n model: ModelMeta;\n spec: AggregateSpec;\n row: ClientRow;\n into: ClientRow;\n}): ClientRow {\n const { engine, model, spec, row, into } = params;\n for (const selection of spec.selections) {\n const value = decodeAggregateValue({\n dialect: engine.dialect.name,\n key: selection.key,\n field: fieldOf({ model, name: selection.field }),\n value: row[selection.alias],\n });\n if (selection.key === \"_count\" && spec.countShorthand) {\n into._count = value;\n continue;\n }\n const bucket = (into[selection.key] as Record<string, unknown> | undefined) ?? {};\n bucket[selection.field ?? \"_all\"] = value;\n into[selection.key] = bucket;\n }\n return into;\n}\n\n// ─── Engine ───────────────────────────────────────────────────────\n\ntype TransactionLifetime = { active: boolean; readonly parent?: TransactionLifetime };\n\ntype Engine = {\n readonly rootIdentity: object;\n readonly rlsSchema?: SchemaIR;\n readonly context?: BoundRlsContext;\n readonly lifetime?: TransactionLifetime;\n readonly meta: RuntimeMeta;\n readonly adapter: DatabaseAdapter;\n readonly dialect: SqlDialect;\n readonly options: ClientOptions;\n /** True on engines bound to an open transaction — gates `lock` (FOR UPDATE). */\n readonly inTransaction?: boolean;\n /** `$on(\"query\")` subscribers — one shared set across transaction clients. */\n readonly listeners: Set<(event: QueryEvent) => void>;\n /** Compiled-query cache (§9) — shape-keyed SQL texts, shared across transaction clients. */\n readonly renderCache: StatementRenderCache;\n /** Baked extension surface mounts (D9) — re-attached on every client build. */\n readonly extensionMounts?: readonly ClientExtensionMount[];\n /** Extension onConnect hooks — run by `$connect()`. */\n readonly connectHooks?: readonly ConnectHook[];\n /** Telemetry recorder (§EPIC 1) — one per client, shared across transaction engines. */\n readonly telemetry?: TelemetryRecorder;\n /** The operation this engine is executing inside; statements attach to it. */\n readonly operation?: TelemetryOperationScope;\n};\n\nfunction engineStateError(params: { engine: Engine; requireContext?: boolean }): RlsContextError | undefined {\n const { engine } = params;\n for (let frame = engine.lifetime; frame !== undefined; frame = frame.parent) {\n if (!frame.active) return new RlsContextError({ reason: \"expired\" });\n }\n if (params.requireContext !== false && engine.rlsSchema !== undefined && engine.context === undefined) {\n return new RlsContextError({ reason: \"missing\" });\n }\n return undefined;\n}\n\nfunction assertEngineActive(params: { engine: Engine; requireContext?: boolean }): void {\n const error = engineStateError(params);\n if (error !== undefined) throw error;\n}\n\n/** Own the complete operation, including relation loads and refetches, on one connection. */\nasync function engineTransaction<T>(params: {\n engine: Engine;\n run: (target: Engine) => Promise<T>;\n options?: TransactionOptions;\n requireContext?: boolean;\n}): Promise<T> {\n const { engine, run, options } = params;\n assertEngineActive({ engine, requireContext: params.requireContext });\n if (options?.deadline !== undefined) {\n const support = engine.adapter.budgets?.transactionDeadline;\n const requested = options.deadline.enforcement ?? \"between-statements\";\n if (support === undefined || support === \"unsupported\" ||\n (requested === \"cancel-running-statements\" && support !== \"cancel-running-statements\")) {\n throw new VibeError({\n code: \"VIBE_UNSUPPORTED_CAPABILITY\",\n message: \"the adapter does not declare support for the requested transaction deadline\",\n meta: { provider: engine.adapter.provider, feature: \"transactionDeadline\", requested, supported: support ?? \"undeclared\" },\n });\n }\n }\n return engine.adapter.transaction(async (adapter) => {\n const lifetime: TransactionLifetime = { active: true, ...(engine.lifetime === undefined ? {} : { parent: engine.lifetime }) };\n const target: Engine = { ...engine, adapter, inTransaction: true, lifetime };\n const execute = async (): Promise<T> => {\n if (engine.rlsSchema !== undefined && engine.inTransaction !== true) {\n if (adapter.provider === \"pglite\") {\n await adapter.executeUnsafe(renderRlsRole({ dialect: engine.dialect, role: engine.options.nativeRls!.runtimeRole! }));\n }\n if (engine.context !== undefined && Object.keys(engine.rlsSchema.rls!.context).length > 0) {\n await adapter.executeUnsafe(renderRlsContext({ dialect: engine.dialect, context: engine.rlsSchema.rls!.context, values: engine.context.settings }));\n }\n const readiness = await inspectNativeRlsTransaction({ adapter, schema: engine.rlsSchema, runtimeRole: engine.options.nativeRls?.runtimeRole, cacheKey: engine.rootIdentity });\n assertNativeRlsReady({ report: readiness });\n }\n return run(target);\n };\n return execute().finally(() => { lifetime.active = false; });\n }, options);\n}\n\nasync function executeOperation<T>(params: { engine: Engine; run: (target: Engine) => Promise<T> }): Promise<T> {\n const { engine, run } = params;\n assertEngineActive({ engine });\n if (engine.rlsSchema !== undefined && engine.inTransaction !== true) return engineTransaction({ engine, run });\n return run(engine);\n}\n\n/**\n * The legacy `onQuery` + `$on(\"query\")` sink, or `undefined` when nobody is\n * listening. Semantics are unchanged: it fires only after the adapter succeeds,\n * before row materialization, with the same payload, and a listener that throws\n * still propagates into the caller. Resolved once per statement, immediately\n * before it runs.\n */\nfunction legacySink(params: { engine: Engine }): ((report: StatementReport) => void) | undefined {\n const { engine } = params;\n const onQuery = engine.options.onQuery;\n if (onQuery === undefined && engine.listeners.size === 0) return undefined;\n return (statement: StatementReport): void => {\n const event: QueryEvent = statement;\n onQuery?.(event);\n for (const listener of engine.listeners) listener(event);\n };\n}\n\n/**\n * Rows an operation is KNOWN to have produced. Anything the shape cannot answer\n * (an aggregate number, a scalar) returns undefined — never a fabricated zero.\n */\nfunction knownRowCount(value: unknown): number | undefined {\n if (Array.isArray(value)) return value.length;\n if (value === null) return 0;\n if (typeof value !== \"object\") return undefined;\n const count = (value as { count?: unknown }).count;\n return typeof count === \"number\" ? count : 1;\n}\n\n/** Begin an operation on the engine's recorder, parented to whatever it runs inside. */\nfunction beginOperation(params: {\n engine: Engine;\n kind: TelemetryOperationKind;\n model: string | null;\n method: string;\n}): TelemetryOperationScope | undefined {\n const { engine, kind, model, method } = params;\n const recorder = engine.telemetry;\n if (recorder === undefined) return undefined;\n return recorder.begin({\n kind,\n model,\n method,\n dialect: engine.dialect.name,\n provider: engine.adapter.provider,\n ...(engine.operation === undefined ? {} : { parentOperationId: engine.operation.id }),\n });\n}\n\n/**\n * ONE instrumented adapter call: the legacy `onQuery` report on success (same\n * payload, same moment as before) plus the telemetry statement record, which\n * also covers the failures the legacy path has never seen.\n */\nfunction runStatement<T>(params: {\n engine: Engine;\n kind: TelemetryStatementKind;\n model: string | null;\n method: string;\n text: string;\n values: readonly unknown[];\n renderMs?: number;\n rowCount?: (value: T) => number | undefined;\n run: () => Promise<T>;\n}): Promise<T> {\n const { engine } = params;\n return instrumentStatement<T>({\n scope: engine.operation,\n legacy: legacySink({ engine }),\n kind: params.kind,\n model: params.model,\n method: params.method,\n text: params.text,\n values: params.values,\n inTransaction: engine.inTransaction === true,\n ...(params.renderMs === undefined ? {} : { renderMs: params.renderMs }),\n ...(params.rowCount === undefined ? {} : { rowCount: params.rowCount }),\n run: params.run,\n });\n}\n\n/** Clock read only when detailed timings were asked for. */\nfunction renderClock(params: { engine: Engine }): number | undefined {\n return params.engine.telemetry?.config.detailedTimings === true ? performance.now() : undefined;\n}\n\n/** Settle a scope from a promise's outcome, exactly once. */\nfunction settleWith(params: { scope: TelemetryOperationScope; running: Promise<unknown> }): void {\n const { scope, running } = params;\n running.then(\n (value: unknown) => {\n const rowCount = knownRowCount(value);\n scope.settle({ outcome: \"success\", ...(rowCount === undefined ? {} : { rowCount }) });\n },\n (error: unknown) => {\n scope.settle({ outcome: \"failure\", error });\n },\n );\n}\n\n// ─── Lazy query promises (array $transaction) ─────────────────\n\n/** A claimed array-$transaction operation (see QueryPromise.claim). */\ntype ClaimedOperation = {\n readonly start: (target: Engine) => Promise<unknown>;\n readonly abort: (reason: unknown) => void;\n};\n\n/**\n * The promise every delegate method returns — dispatch is DEFERRED to the end\n * of the creation tick (a microtask): awaiting sooner starts it sooner, and\n * `$transaction([...])` claims still-deferred operations SYNCHRONOUSLY and\n * runs them sequentially against the transaction's own engine inside one\n * BEGIN/COMMIT. At every ordinary call site this is observably an eager\n * promise (v1's delegates were fully eager); the deferral only exists for the\n * array form, so operations must reach `$transaction` in the tick they were\n * created — later, they have already dispatched and the claim fails LOUDLY\n * (silently adopting an in-flight promise would fake atomicity, v1's flaw).\n *\n * A NATIVE Promise subclass, not a bare thenable: test matchers\n * (`expect().rejects`) and user code check `instanceof Promise`, and Bun's\n * matchers await the native state without ever calling `.then` — which is\n * also why dispatch cannot wait for a `.then` that may never come. Species is\n * pinned to the base Promise so `.then` chains produce plain promises.\n */\nclass QueryPromise<T> extends Promise<T> {\n static override get [Symbol.species](): PromiseConstructor {\n return Promise;\n }\n\n private target!: Engine;\n private dispatch!: (target: Engine) => Promise<T>;\n private settle!: { resolve: (value: T | PromiseLike<T>) => void; reject: (reason: unknown) => void };\n private started = false;\n /** This call's telemetry operation, opened at CREATION so the host's parent context is captured in the caller's frame. */\n private scope: TelemetryOperationScope | undefined;\n\n /** Build a deferred operation; the constructor itself stays the native one. */\n static create<T>(params: {\n engine: Engine;\n run: (target: Engine) => Promise<T>;\n model?: string | null;\n method?: string;\n kind?: TelemetryOperationKind;\n }): QueryPromise<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason: unknown) => void;\n const instance = new QueryPromise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n instance.target = params.engine;\n instance.dispatch = params.run;\n instance.settle = { resolve, reject };\n instance.scope = beginOperation({\n engine: params.engine,\n kind: params.kind ?? \"model\",\n model: params.model ?? null,\n method: params.method ?? \"unknown\",\n });\n // Auto-dispatch when the creation tick's synchronous run completes —\n // unless an array $transaction claimed the operation first.\n queueMicrotask(() => {\n instance.start();\n });\n return instance;\n }\n\n private start(): void {\n if (this.started) return;\n this.started = true;\n const scope = this.scope;\n scope?.dispatch();\n const target = scope === undefined ? this.target : { ...this.target, operation: scope };\n const running = target.rlsSchema === undefined && target.lifetime === undefined\n ? this.dispatch(target)\n : executeOperation({ engine: target, run: this.dispatch });\n if (scope !== undefined) settleWith({ scope, running });\n running.then(this.settle.resolve, this.settle.reject);\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // `catch` and `finally` route through `then` per spec — awaiting starts\n // the dispatch immediately instead of at the microtask.\n this.start();\n return super.then(onfulfilled, onrejected);\n }\n\n /**\n * The array-$transaction entry: claim the operation SYNCHRONOUSLY (before\n * the auto-dispatch microtask can fire), receiving a starter that runs it\n * against the transaction's engine and an aborter that settles it when the\n * transaction dies before its turn — a stray await on it must reject, never\n * hang.\n */\n /** Check source identity BEFORE any array member is claimed or retargeted. */\n ownerError(params: { engine: Engine }): RlsContextError | undefined {\n const { engine } = params;\n const state = engineStateError({ engine: this.target });\n if (state !== undefined) return state;\n if (engine.rlsSchema === undefined && this.target.rlsSchema === undefined) return undefined;\n if (\n this.target.rootIdentity !== engine.rootIdentity ||\n this.target.lifetime !== engine.lifetime ||\n !sameRecord(this.target.context?.settings ?? {}, engine.context?.settings ?? {})\n ) return new RlsContextError({ reason: \"conflicting\" });\n return undefined;\n }\n\n /** A refused batch must not auto-dispatch its still-deferred members later. */\n refuse(params: { reason: unknown }): void {\n if (this.started) return;\n this.started = true;\n // Refused before dispatch (F06 included): a terminal outcome is still owed,\n // and it must NOT claim a duration it never spent.\n this.scope?.settle({ outcome: \"failure\", stage: \"refused\", error: params.reason });\n this.settle.reject(params.reason);\n super.then(undefined, () => {});\n }\n\n claim(): ClaimedOperation {\n if (this.started) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message:\n \"$transaction([...]) needs operations that have not dispatched — pass delegate calls in the same tick they are created (this one was awaited or created earlier and already executed outside the transaction)\",\n });\n }\n this.started = true;\n const scope = this.scope;\n return {\n start: (target: Engine): Promise<unknown> => {\n // The operation attaches to the TRANSACTION that executes it, not to the\n // context it was created in.\n if (scope !== undefined && target.operation !== undefined) {\n scope.reparent({ parentOperationId: target.operation.id });\n }\n scope?.dispatch();\n const running = executeOperation({\n engine: scope === undefined ? target : { ...target, operation: scope },\n run: this.dispatch,\n });\n if (scope !== undefined) settleWith({ scope, running });\n // Settle this promise too (a caller may hold and await it), and mark\n // its rejection handled — the array runner propagates failures.\n running.then(this.settle.resolve, this.settle.reject);\n super.then(undefined, () => {});\n return running as Promise<unknown>;\n },\n abort: (reason: unknown): void => {\n // Idempotent: an already-started operation settled on its own outcome.\n scope?.settle({ outcome: \"failure\", stage: \"refused\", error: reason });\n this.settle.reject(reason);\n super.then(undefined, () => {});\n },\n };\n }\n}\n\n/** Render + execute a row-returning statement, decoding through the codec table. */\nasync function runRows(params: { engine: Engine; plan: QueryPlan }): Promise<ClientRow[]> {\n const { engine, plan } = params;\n const renderStarted = renderClock({ engine });\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: plan.statement,\n cache: engine.renderCache,\n });\n const rows = await runStatement<ClientRow[]>({\n engine,\n kind: \"rows\",\n model: plan.model.name,\n method: plan.method,\n text: rendered.text,\n values: rendered.values,\n ...(renderStarted === undefined ? {} : { renderMs: performance.now() - renderStarted }),\n rowCount: (value: ClientRow[]): number => value.length,\n run: (): Promise<ClientRow[]> =>\n engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n }),\n });\n return materializeRows({ dialect: engine.dialect.name, model: plan.model, rows, wire: engine.adapter.wire });\n}\n\n/**\n * Run a statement for its affected-row count on the PARAMETER-BOUND path.\n *\n * F01: `executeUnsafe` is the raw path, and an adapter may implement it with\n * client-side text escaping (mysql2's `pool.query` does). Escaping done in the\n * client cannot know the server's `sql_mode`, so under `NO_BACKSLASH_ESCAPES` a\n * generated statement carrying a hostile string predicate matched — and\n * deleted — rows it must not. Generated statements therefore prefer\n * `executeAffected` (bound, same protocol as `execute`) and fall back to\n * `executeUnsafe` only for an adapter that does not implement it, all of which\n * bind their raw path already.\n */\nasync function runBoundAffected(params: {\n adapter: DatabaseAdapter;\n text: string;\n values: unknown[];\n}): Promise<QueryResult> {\n const { adapter, text, values } = params;\n const bound = adapter.executeAffected;\n if (bound !== undefined) return await bound.call(adapter, { text, values });\n return await adapter.executeUnsafe({ text, values });\n}\n\n/** Execute a statement for its affected-row count (`executeUnsafe` exposes it). */\nasync function runAffected(params: { engine: Engine; plan: QueryPlan }): Promise<number> {\n const { engine, plan } = params;\n // M4/M7: a multi-statement batch (sqlite createMany groups, parameter-budget\n // chunks) runs atomically — exactly like the single statement it replaces.\n if (plan.batch !== undefined && plan.batch.length > 1) {\n const batch = plan.batch;\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n let total = 0;\n for (const statement of batch) {\n total += await runAffected({ engine: txEngine, plan: { ...plan, statement, batch: undefined } });\n }\n return total;\n });\n }\n const renderStarted = renderClock({ engine });\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: plan.statement,\n cache: engine.renderCache,\n });\n const result = await runStatement<QueryResult>({\n engine,\n kind: \"affected\",\n model: plan.model.name,\n method: plan.method,\n text: rendered.text,\n values: rendered.values,\n ...(renderStarted === undefined ? {} : { renderMs: performance.now() - renderStarted }),\n rowCount: (value: QueryResult): number => value.affectedRows,\n run: (): Promise<QueryResult> =>\n runBoundAffected({\n adapter: engine.adapter,\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n }),\n });\n return result.affectedRows;\n}\n\nfunction plan(params: {\n engine: Engine;\n model: string;\n method: QueryMethod;\n args: ClientRow | undefined;\n}): QueryPlan {\n const { engine, model, method, args } = params;\n // `lock` is a row lock held to COMMIT — outside a transaction the lock\n // releases at statement end, a silent no-op. The engine knows which client\n // it is (the builder cannot), so the refusal lives here.\n if (args !== undefined && args[\"lock\"] !== undefined && engine.inTransaction !== true) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `lock on ${model}.${method}() requires a transaction — call it on the client $transaction hands its callback (outside one, the lock would release at statement end)`,\n meta: { model, method },\n });\n }\n return buildQuery({\n meta: engine.meta,\n dialect: engine.dialect,\n model,\n method,\n args,\n ...(engine.options.relationStrategy === undefined\n ? {}\n : { defaultRelationStrategy: engine.options.relationStrategy }),\n clientOptions: {\n ...(engine.options.defaultOrderByPk === undefined\n ? {}\n : { defaultOrderByPk: engine.options.defaultOrderByPk }),\n ...(engine.options.distinctOrderByPk === undefined\n ? {}\n : { distinctOrderByPk: engine.options.distinctOrderByPk }),\n },\n });\n}\n\n/** Re-select the row a mutation touched, on dialects without RETURNING. */\nasync function refetch(params: {\n engine: Engine;\n source: QueryPlan;\n where: Readonly<Record<string, unknown>>;\n /** `SELECT … FOR UPDATE` (where the dialect has a lock clause) — the\n * read-before-write overlays lock the row they are about to write. */\n lock?: boolean;\n}): Promise<ClientRow | null> {\n const { engine, source, where } = params;\n const selectArg = source.selectArg;\n const followUp = plan({\n engine,\n model: source.model.name,\n method: \"findUnique\",\n args: selectArg === null ? { where } : { where, select: selectArg },\n });\n const locked: QueryPlan =\n params.lock === true\n ? { ...followUp, statement: { ...(followUp.statement as SelectStatement), lockForUpdate: true } }\n : followUp;\n const rows = await runRows({ engine, plan: locked });\n return rows[0] ?? null;\n}\n\n/** Shallow record equality — \"is the overlaid refetch key the same key?\". */\nfunction sameRecord(\n a: Readonly<Record<string, unknown>>,\n b: Readonly<Record<string, unknown>>,\n): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const left = a[key];\n const right = b[key];\n if (left === right) continue;\n if (left instanceof Date && right instanceof Date && left.getTime() === right.getTime()) continue;\n return false;\n }\n return true;\n}\n\n/**\n * The WHERE that identifies a freshly inserted row on a dialect without\n * RETURNING: the app-generated key when there is one, else the driver's\n * last-insert-id — which is why the DB-assigned-key path runs inside ONE\n * transaction (see `runSingleMutation`): `LAST_INSERT_ID()` is\n * connection-scoped, and only the transaction contract guarantees the INSERT\n * and the read-back share a connection.\n */\nasync function insertedKeyWhere(params: {\n engine: Engine;\n source: QueryPlan;\n}): Promise<Record<string, unknown>> {\n const { engine, source } = params;\n if (source.refetchWhere !== null) return { ...source.refetchWhere };\n\n const keyField = source.model.primaryKey[0];\n const lastInsertIdSql = engine.dialect.lastInsertIdSql;\n if (lastInsertIdSql === null || source.model.primaryKey.length !== 1 || keyField === undefined) {\n throw unsupportedCapability({\n dialect: engine.dialect.name,\n feature: `${source.method} on ${source.model.name} without RETURNING`,\n hint: \"this model's key is assigned by the database and cannot be read back on this dialect\",\n });\n }\n const result = await runStatement<QueryResult>({\n engine,\n kind: \"rows\",\n model: source.model.name,\n method: source.method,\n text: lastInsertIdSql,\n values: [],\n rowCount: (value: QueryResult): number => value.rows.length,\n run: (): Promise<QueryResult> => engine.adapter.executeUnsafe({ text: lastInsertIdSql }),\n });\n const id = result.rows[0]?.id;\n if (id === undefined || id === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `could not read back the generated key for ${source.model.name}`,\n meta: { model: source.model.name },\n });\n }\n return { [keyField.name]: id };\n}\n\n/**\n * Run a single-row mutation. On dialects with RETURNING the statement carries\n * its own result; otherwise the row is read back with a second statement — for\n * `delete` that read happens BEFORE the write, since afterwards the row is gone.\n *\n * Returns the FULL row (RETURNING includes the primary key and stitch keys);\n * the delegate narrows down to the caller's selection after relation loading.\n */\nasync function runSingleMutation(params: {\n engine: Engine;\n source: QueryPlan;\n readBeforeWrite: boolean;\n /**\n * `create({ onConflict })`: zero written rows is the SKIPPED verdict —\n * return null instead of not-found (RETURNING presence / affected count is\n * the truth of who won the conflict).\n */\n allowZeroRows?: boolean;\n}): Promise<ClientRow | null> {\n const { engine, source, readBeforeWrite } = params;\n\n // Mirrors the renderer's applyReturning verdict WITHOUT rendering — the\n // native path would otherwise render twice per mutation.\n const statement = source.statement;\n // `in` narrowing, not a select-vs-mutation dichotomy: the RLS statement\n // variants carry no RETURNING either, and neither does a select.\n const requested = \"returning\" in statement ? statement.returning : undefined;\n if (requested !== undefined && requested.length > 0 && engine.dialect.capabilities.returning) {\n const rows = await runRows({ engine, plan: source });\n const row = rows[0];\n if (row === undefined) {\n if (params.allowZeroRows === true) return null;\n throw notFound({ model: source.model.name, method: source.method });\n }\n return row;\n }\n\n // RETURNING omitted (mysql): read the row around the write.\n const rendered = renderStatementCached({ dialect: engine.dialect, statement, cache: engine.renderCache });\n // `executeUnsafe` — the only adapter entry point that surfaces the\n // affected-row count, which the overlays below must check (M1/M2): a write\n // that matched nothing is a not-found, never \"re-select and hope\".\n const executeWrite = async (target: Engine): Promise<number> => {\n const result = await runStatement<QueryResult>({\n engine: target,\n kind: \"affected\",\n model: source.model.name,\n method: source.method,\n text: rendered.text,\n values: rendered.values,\n rowCount: (value: QueryResult): number => value.affectedRows,\n run: (): Promise<QueryResult> =>\n runBoundAffected({\n adapter: target.adapter,\n text: rendered.text,\n values: bindValues({ adapter: target.adapter, values: rendered.values }),\n }),\n });\n return result.affectedRows;\n };\n\n if (readBeforeWrite) {\n // delete: the read must happen BEFORE the write — and both must observe\n // ONE row: the read locks it (FOR UPDATE) inside a transaction, and a\n // DELETE that then matches nothing is a concurrent-delete not-found, not\n // a success reporting the pre-read row (M1).\n const where = source.refetchWhere;\n if (where === null) throw notFound({ model: source.model.name, method: source.method });\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n const before = await refetch({ engine: txEngine, source, where, lock: true });\n if (before === null) throw notFound({ model: source.model.name, method: source.method });\n const affected = await executeWrite(txEngine);\n if (affected === 0) throw notFound({ model: source.model.name, method: source.method });\n return before;\n });\n }\n\n if (source.refetchWhere !== null) {\n const knownWhere = source.refetchWhere;\n\n if (source.method === \"upsert\") {\n // Which arm ran is only knowable from the read-back. The write and every\n // read ride ONE transaction (the only same-connection guarantee the\n // frozen adapter interface gives). In order:\n // 1. the overlaid unique where — the UPDATE arm's row answers it, and\n // so does the INSERT arm's unless the update arm rewrites the key;\n // 2. the un-overlaid where — the INSERT arm's row always answers it\n // (the B1 gate guarantees create binds the conflict target);\n // 3. LAST_INSERT_ID() — only meaningful when the ODKU statement\n // carries the `id = LAST_INSERT_ID(id)` trick (B2): the update arm\n // then names the row it addressed even when that row was matched\n // through a DIFFERENT unique key than the where names.\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n await executeWrite(txEngine);\n const byWhere = await refetch({ engine: txEngine, source, where: knownWhere });\n if (byWhere !== null) return byWhere;\n const baseWhere = source.refetchWhereBase;\n if (baseWhere !== null && !sameRecord(baseWhere, knownWhere)) {\n const byBase = await refetch({ engine: txEngine, source, where: baseWhere });\n if (byBase !== null) return byBase;\n }\n const insertStatement = source.statement;\n const hasIdTrick =\n insertStatement.kind === \"insert\" &&\n insertStatement.onConflict !== undefined &&\n !(\"doNothing\" in insertStatement.onConflict) &&\n insertStatement.onConflict.lastInsertIdColumn !== undefined;\n if (!hasIdTrick) throw notFound({ model: source.model.name, method: source.method });\n const where = await insertedKeyWhere({ engine: txEngine, source: { ...source, refetchWhere: null } });\n const after = await refetch({ engine: txEngine, source, where });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n }\n\n if (source.method === \"update\") {\n // M2: the write and its read-back observe one row inside a transaction,\n // and a write that MATCHED no row (mysql reports matched — mysql2 sets\n // CLIENT_FOUND_ROWS) is a not-found: re-selecting by the overlaid unique\n // where could otherwise resolve a wrong, unrelated row.\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n const affected = await executeWrite(txEngine);\n if (affected === 0) throw notFound({ model: source.model.name, method: source.method });\n const after = await refetch({ engine: txEngine, source, where: knownWhere });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n }\n\n // create with an app-generated key: the key is known before the write.\n const affected = await executeWrite(engine);\n if (affected === 0 && params.allowZeroRows === true) return null;\n const after = await refetch({ engine, source, where: knownWhere });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n }\n\n // DB-assigned key: INSERT + LAST_INSERT_ID() + re-select must observe ONE\n // connection — the transaction contract is the only guarantee the frozen\n // adapter interface gives us (review work order #7/F5, runtime half).\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n const affected = await executeWrite(txEngine);\n if (affected === 0 && params.allowZeroRows === true) return null;\n const where = await insertedKeyWhere({ engine: txEngine, source });\n const after = await refetch({ engine: txEngine, source, where });\n if (after === null) throw notFound({ model: source.model.name, method: source.method });\n return after;\n });\n}\n\n/** Narrow a mutation result the caller KNOWS cannot be null (no allowZeroRows). */\nfunction requireRow(params: { row: ClientRow | null; model: string; method: string }): ClientRow {\n if (params.row === null) throw notFound({ model: params.model, method: params.method });\n return params.row;\n}\n\n/**\n * The transactional find-then-write upsert — Prisma's own fallback, used\n * whenever the create data does not bind the conflict-target columns with the\n * where's values (`upsertUsesNativeStatement`, SQL review B1): a native\n * INSERT … ON CONFLICT could never fire on the addressed row there, and on\n * postgres/sqlite would silently insert a duplicate-in-spirit row while\n * mysql's ODKU could update an unrelated one.\n *\n * Probe by the unique where (locked, where the dialect has row locks), then\n * run the UPDATE arm on a hit and the CREATE arm on a miss. Both arm plans\n * build BEFORE the transaction — validation stays earliest-moment, exactly as\n * the native statement validates both arms up front. Races stay LOUD: a\n * concurrent insert after a probe miss surfaces the unique violation, a\n * concurrent delete after a probe hit surfaces not-found.\n */\nasync function runUpsertFallback(params: {\n engine: Engine;\n model: ModelMeta;\n args: ClientRow;\n}): Promise<ClientRow> {\n const { engine, model, args } = params;\n const passthrough: ClientRow = {};\n if (args.select !== undefined) passthrough.select = args.select;\n if (args.omit !== undefined) passthrough.omit = args.omit;\n if (args.include !== undefined) passthrough.include = args.include;\n\n const probeSource = plan({ engine, model: model.name, method: \"findUnique\", args: { where: args.where } });\n const probePlan: QueryPlan = {\n ...probeSource,\n statement: { ...(probeSource.statement as SelectStatement), lockForUpdate: true },\n };\n const createSource = plan({\n engine,\n model: model.name,\n method: \"create\",\n args: { ...passthrough, data: args.create },\n });\n const updateSource = plan({\n engine,\n model: model.name,\n method: \"update\",\n args: { ...passthrough, where: args.where, data: args.update },\n });\n\n return await engine.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...engine, adapter: txAdapter, inTransaction: true };\n const existing = (await runRows({ engine: txEngine, plan: probePlan }))[0];\n const source = existing === undefined ? createSource : updateSource;\n return requireRow({\n row: await runSingleMutation({ engine: txEngine, source, readBeforeWrite: false }),\n model: model.name,\n method: \"upsert\",\n });\n });\n}\n\n// ─── Relation attachment + result shaping ─────────────────\n\nfunction relationExecutor(params: { engine: Engine }): RelationExecutor {\n const { engine } = params;\n return async ({ statement, model, method }) => {\n const rendered = renderStatementCached({ dialect: engine.dialect, statement, cache: engine.renderCache });\n return await runStatement<ClientRow[]>({\n engine,\n kind: \"rows\",\n model,\n method,\n text: rendered.text,\n values: rendered.values,\n rowCount: (value: ClientRow[]): number => value.length,\n run: (): Promise<ClientRow[]> =>\n engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n }),\n });\n };\n}\n\ntype ResultShape = {\n readonly relations: RelationSelection | null;\n readonly resultFields: readonly string[] | null;\n readonly relationStrategy: RelationStrategy;\n /** Computed fields to attach before projection, or `null` (see QueryPlan.computed). */\n readonly computed: readonly string[] | null;\n};\n\n/** Attach relations (per the shape's strategy), then narrow to the caller's selection. */\nasync function finalizeRows(params: {\n engine: Engine;\n model: ModelMeta;\n shape: ResultShape;\n rows: ClientRow[];\n}): Promise<ClientRow[]> {\n const { engine, model, shape, rows } = params;\n if (shape.relations !== null && rows.length > 0) {\n const execute = relationExecutor({ engine });\n if (shape.relationStrategy === \"join\") {\n await attachLateralRelations({\n dialect: engine.dialect,\n meta: engine.meta,\n model,\n rows,\n selection: shape.relations,\n execute,\n wire: engine.adapter.wire,\n });\n } else {\n await attachRelations({\n dialect: engine.dialect,\n meta: engine.meta,\n model,\n rows,\n selection: shape.relations,\n execute,\n wire: engine.adapter.wire,\n });\n }\n }\n // Computed fields attach BEFORE projection: their `needs` are still on the\n // row here, and are narrowed away next unless selected themselves.\n if (shape.computed !== null && rows.length > 0) {\n applyComputedFields({ model, rows, names: shape.computed });\n }\n if (shape.resultFields === null) return rows;\n return rows.map((row) => project({ row, fields: shape.resultFields }));\n}\n\nasync function finalizeRow(params: {\n engine: Engine;\n model: ModelMeta;\n shape: ResultShape;\n row: ClientRow;\n}): Promise<ClientRow> {\n const { engine, model, shape, row } = params;\n const rows = await finalizeRows({ engine, model, shape, rows: [row] });\n return rows[0] as ClientRow;\n}\n\n// ─── Nested-write plumbing ────────────────────────────────────────\n\nfunction makeRunner(params: { engine: Engine }): StatementRunner {\n const { engine } = params;\n return {\n single: async ({ model, method, args }) =>\n requireRow({\n row: await runSingleMutation({\n engine,\n source: plan({ engine, model, method, args }),\n readBeforeWrite: method === \"delete\",\n }),\n model,\n method,\n }),\n rows: async ({ model, method, args }) => await runRows({ engine, plan: plan({ engine, model, method, args }) }),\n affected: async ({ model, method, args }) =>\n await runAffected({ engine, plan: plan({ engine, model, method, args }) }),\n statement: async ({ statement, model, method }) => {\n const rendered = renderStatementCached({\n dialect: engine.dialect,\n statement: statement as SqlStatement,\n cache: engine.renderCache,\n });\n return await runStatement<ClientRow[]>({\n engine,\n kind: \"rows\",\n model,\n method,\n text: rendered.text,\n values: rendered.values,\n rowCount: (value: ClientRow[]): number => value.length,\n run: (): Promise<ClientRow[]> =>\n engine.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: engine.adapter, values: rendered.values }),\n }),\n });\n },\n };\n}\n\nfunction makeWriteContext(params: { engine: Engine }): WriteContext {\n const { engine } = params;\n return {\n meta: engine.meta,\n dialect: engine.dialect,\n run: makeRunner({ engine }),\n transactional: <T>(fn: (run: StatementRunner) => Promise<T>): Promise<T> =>\n engine.adapter.transaction((txAdapter) => fn(makeRunner({ engine: { ...engine, adapter: txAdapter, inTransaction: true } }))),\n };\n}\n\n// ─── Delegates ────────────────────────────────────────────────────\n\n/**\n * A view's delegate: reads pass through, every write verb is refused before a\n * statement is built. Views are read-only by construction, and leaving the\n * write verbs live is not dialect-honest — a simple projection view is\n * auto-updatable on postgres (the INSERT silently lands in the base table)\n * while sqlite/mysql raise a raw driver error. Applied once per delegate at\n * construction, so the hot path is untouched.\n */\nfunction readOnlyDelegate(params: { delegate: ModelDelegate; model: string }): ModelDelegate {\n const { delegate, model } = params;\n const refuse =\n (method: string) =>\n async (): Promise<never> => {\n throw viewIsReadOnly({ model, method });\n };\n return {\n ...delegate,\n create: refuse(\"create\"),\n createMany: refuse(\"createMany\"),\n createManyAndReturn: refuse(\"createManyAndReturn\"),\n update: refuse(\"update\"),\n updateMany: refuse(\"updateMany\"),\n updateManyAndReturn: refuse(\"updateManyAndReturn\"),\n upsert: refuse(\"upsert\"),\n upsertMany: refuse(\"upsertMany\"),\n delete: refuse(\"delete\"),\n deleteMany: refuse(\"deleteMany\"),\n };\n}\n\n/**\n * #7 (v1/Prisma parity): an update `data` object whose every key is undefined\n * is an effectively-empty write — the batch short-circuits to `{ count: 0 }`\n * BEFORE `@updatedAt` injection, so a no-op updateMany never bumps timestamps.\n */\nfunction isEffectivelyEmptyData(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value) || value instanceof Date || value instanceof Uint8Array) return false;\n return Object.values(value).every((entry) => entry === undefined);\n}\n\nfunction createDelegate(params: { engine: Engine; model: string }): ModelDelegate {\n const { engine, model } = params;\n\n const shapeOf = (built: QueryPlan): ResultShape => ({\n relations: built.relations,\n resultFields: built.resultFields,\n relationStrategy: built.relationStrategy,\n computed: built.computed,\n });\n\n // ─── Implementations ───\n // Each takes the engine it runs against as a parameter: the delegate wraps\n // them in LAZY query promises bound to this client's engine, and the array\n // form of $transaction re-runs the same closure against the transaction's\n // engine instead (see QueryPromise).\n\n const findMany = async (target: Engine, args?: ClientRow): Promise<ClientRow[]> => {\n const built = plan({ engine: target, model, method: \"findMany\", args });\n const rows = shapeRows({ plan: built, rows: await runRows({ engine: target, plan: built }) });\n return await finalizeRows({ engine: target, model: built.model, shape: shapeOf(built), rows });\n };\n\n const findFirst = async (target: Engine, args?: ClientRow): Promise<ClientRow | null> => {\n const built = plan({ engine: target, model, method: \"findFirst\", args });\n const rows = shapeRows({ plan: built, rows: await runRows({ engine: target, plan: built }) });\n const row = rows[0];\n if (row === undefined) return null;\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const findUnique = async (target: Engine, args: ClientRow): Promise<ClientRow | null> => {\n const built = plan({ engine: target, model, method: \"findUnique\", args });\n const rows = await runRows({ engine: target, plan: built });\n const row = rows[0];\n if (row === undefined) return null;\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const create = async (target: Engine, args: ClientRow): Promise<ClientRow | null> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n // `onConflict` → insert-or-skip: zero written rows returns null (the\n // truthful \"another writer won\" verdict), never not-found.\n const skipping = args.onConflict !== undefined;\n if (hasNestedWrites({ model: modelMeta, data: args.data })) {\n if (skipping) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `onConflict cannot combine with nested writes on ${modelMeta.name}.create() — insert the parent row alone, then connect relations`,\n meta: { model: modelMeta.name },\n });\n }\n const shape = resolveResultShape({ meta: target.meta, model: modelMeta, method: \"create\", args });\n const row = await createWithNested({\n ctx: makeWriteContext({ engine: target }),\n model: modelMeta,\n data: args.data as Record<string, unknown>,\n });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"create\", args });\n const row = await runSingleMutation({\n engine: target,\n source: built,\n readBeforeWrite: false,\n ...(skipping ? { allowZeroRows: true } : {}),\n });\n if (row === null) return null;\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const update = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n if (hasNestedWrites({ model: modelMeta, data: args.data })) {\n const shape = resolveResultShape({ meta: target.meta, model: modelMeta, method: \"update\", args });\n const row = await updateWithNested({\n ctx: makeWriteContext({ engine: target }),\n model: modelMeta,\n where: args.where as Record<string, unknown>,\n data: args.data as Record<string, unknown>,\n });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"update\", args });\n const row = requireRow({\n row: await runSingleMutation({ engine: target, source: built, readBeforeWrite: false }),\n model: built.model.name,\n method: \"update\",\n });\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const createMany = async (target: Engine, args: ClientRow): Promise<BatchResult> => {\n // #7 (v1/Prisma parity): an empty batch is a normal outcome of\n // `data: rows.filter(…)` — `{ count: 0 }`, NO statement.\n if (Array.isArray(args.data) && args.data.length === 0) return { count: 0 };\n const built = plan({ engine: target, model, method: \"createMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n /**\n * EPIC 10: bounded bulk upsert. `count` is the rows submitted after\n * duplicate-key validation — every one was inserted or updated, because there\n * is no skip arm and the chunks run atomically. The driver's own number rides\n * along ONLY where it is a row count (never on mysql, whose ON DUPLICATE KEY\n * counts an insert as 1, a changed update as 2 and an unchanged update as 0).\n */\n const upsertMany = async (target: Engine, args: ClientRow): Promise<UpsertManyResult> => {\n // #7 parity with createMany: an empty feed is a normal outcome, no statement.\n if (Array.isArray(args.data) && args.data.length === 0) return { count: 0, affectedRows: 0 };\n const built = plan({ engine: target, model, method: \"upsertMany\", args });\n const affected = await runAffected({ engine: target, plan: built });\n return {\n count: built.upsertRowCount ?? 0,\n affectedRows: affectedRowsAreRowCounts({ dialect: target.dialect }) ? affected : null,\n };\n };\n\n const createManyAndReturn = async (target: Engine, args: ClientRow): Promise<ClientRow[]> => {\n // #7: empty batch → no rows, no statement.\n if (Array.isArray(args.data) && args.data.length === 0) return [];\n const built = plan({ engine: target, model, method: \"createManyAndReturn\", args });\n // M4/M7: multi-statement batches run atomically; returned rows come in\n // statement order (heterogeneous rows regroup — no input-order promise,\n // matching Prisma's own non-guarantee here).\n const rows =\n built.batch !== undefined && built.batch.length > 1\n ? await target.adapter.transaction(async (txAdapter) => {\n const txEngine: Engine = { ...target, adapter: txAdapter };\n const collected: ClientRow[] = [];\n for (const statement of built.batch as readonly SqlStatement[]) {\n collected.push(\n ...(await runRows({ engine: txEngine, plan: { ...built, statement, batch: undefined } })),\n );\n }\n return collected;\n })\n : await runRows({ engine: target, plan: built });\n // #8: the one multi-row returning write loads relations like its siblings\n // (finalizeRows narrows to the caller's selection afterwards, exactly as\n // the bare projection did before).\n return await finalizeRows({ engine: target, model: built.model, shape: shapeOf(built), rows });\n };\n\n const updateMany = async (target: Engine, args: ClientRow): Promise<BatchResult> => {\n // #7 (v1 parity, old/v1 client.ts:957): short-circuit BEFORE @updatedAt\n // injection — auto-managed fields must not turn a no-op into a real UPDATE.\n if (isEffectivelyEmptyData(args.data)) return { count: 0 };\n const built = plan({ engine: target, model, method: \"updateMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n /**\n * EPIC 2: the bulk update that reports WHICH rows changed. One statement —\n * `UPDATE … RETURNING` — so the returned rows are the rows this write\n * changed, not whatever a follow-up SELECT would find. Dialects without\n * RETURNING refuse at build time (mysql); relations are refused by\n * `ALLOWED_ARGS`, so the shape only ever carries scalars.\n */\n const updateManyAndReturn = async (target: Engine, args: ClientRow): Promise<ClientRow[]> => {\n // Parity with updateMany (#7): a data object with no defined keys writes\n // nothing — and therefore returns nothing — BEFORE @updatedAt injection.\n if (isEffectivelyEmptyData(args.data)) return [];\n const built = plan({ engine: target, model, method: \"updateManyAndReturn\", args });\n const rows = await runRows({ engine: target, plan: built });\n return await finalizeRows({ engine: target, model: built.model, shape: shapeOf(built), rows });\n };\n\n const upsert = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const modelMeta = getModelMeta({ meta: target.meta, model });\n if (\n hasNestedWrites({ model: modelMeta, data: args.create }) ||\n hasNestedWrites({ model: modelMeta, data: args.update })\n ) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `nested writes are not supported inside upsert arms on ${modelMeta.name} — use create()/update() with nested data`,\n meta: { model: modelMeta.name },\n });\n }\n if (!upsertUsesNativeStatement({ model: modelMeta, args: args as Record<string, unknown> })) {\n if (args.onConflict !== undefined) {\n // An explicit conflict target only exists in the native single\n // statement; the find-then-write fallback has no ON CONFLICT clause\n // to attach it to — refuse instead of silently ignoring it.\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `onConflict on ${modelMeta.name}.upsert() needs the native single-statement path — this shape (a guard field beyond the conflict target, or create data not binding the where's key) runs the find-then-write fallback, which cannot honor an explicit conflict target`,\n meta: { model: modelMeta.name },\n });\n }\n // B1: the create row does not bind the conflict target with the\n // where's values — the native statement's conflict clause could never\n // fire on the addressed row. Run the find-then-write flow instead.\n const shape = resolveResultShape({\n meta: target.meta,\n model: modelMeta,\n method: \"upsert\",\n args: args as Record<string, unknown>,\n });\n const row = await runUpsertFallback({ engine: target, model: modelMeta, args });\n return await finalizeRow({\n engine: target,\n model: modelMeta,\n shape: { ...shape, relationStrategy: \"query\" },\n row,\n });\n }\n const built = plan({ engine: target, model, method: \"upsert\", args });\n const row = requireRow({\n row: await runSingleMutation({ engine: target, source: built, readBeforeWrite: false }),\n model: built.model.name,\n method: \"upsert\",\n });\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const deleteOne = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const built = plan({ engine: target, model, method: \"delete\", args });\n const row = requireRow({\n row: await runSingleMutation({ engine: target, source: built, readBeforeWrite: true }),\n model: built.model.name,\n method: \"delete\",\n });\n // #25: relations load like update's — from the returned (or pre-read) row,\n // AFTER the delete: children a cascade removed come back empty.\n return await finalizeRow({ engine: target, model: built.model, shape: shapeOf(built), row });\n };\n\n const deleteMany = async (target: Engine, args?: ClientRow): Promise<BatchResult> => {\n const built = plan({ engine: target, model, method: \"deleteMany\", args });\n return { count: await runAffected({ engine: target, plan: built }) };\n };\n\n const count = async (target: Engine, args?: ClientRow): Promise<number | Record<string, number>> => {\n const built = plan({ engine: target, model, method: \"count\", args });\n const rendered = renderStatementCached({\n dialect: target.dialect,\n statement: built.statement,\n cache: target.renderCache,\n });\n const rows = await runStatement<ClientRow[]>({\n engine: target,\n kind: \"rows\",\n model,\n method: \"count\",\n text: rendered.text,\n values: rendered.values,\n rowCount: (value: ClientRow[]): number => value.length,\n run: (): Promise<ClientRow[]> =>\n target.adapter.execute({\n text: rendered.text,\n values: bindValues({ adapter: target.adapter, values: rendered.values }),\n }),\n });\n // count-with-select: aliases ARE the result keys ({ _all, field, … }).\n if (built.aggregateSpec !== null) {\n const row = rows[0] ?? {};\n const out: Record<string, number> = {};\n for (const selection of built.aggregateSpec.selections) {\n out[selection.alias] = Number(row[selection.alias] ?? 0);\n }\n return out;\n }\n // postgres returns COUNT(*) as a bigint string; Number() normalizes it.\n const raw = rows[0]?.[built.countAlias ?? COUNT_ALIAS];\n return raw === undefined || raw === null ? 0 : Number(raw);\n };\n\n const aggregate = async (target: Engine, args: ClientRow): Promise<ClientRow> => {\n const built = plan({ engine: target, model, method: \"aggregate\", args });\n const rows = await runRows({ engine: target, plan: built });\n // A non-grouped aggregate always yields exactly one row — even over an\n // empty table (COUNT → 0, the others → SQL NULL → null).\n return assembleAggregates({\n engine: target,\n model: built.model,\n spec: built.aggregateSpec as AggregateSpec,\n row: rows[0] ?? {},\n into: {},\n });\n };\n\n const groupBy = async (target: Engine, args: ClientRow): Promise<ClientRow[]> => {\n const built = plan({ engine: target, model, method: \"groupBy\", args });\n const rows = await runRows({ engine: target, plan: built });\n const by = built.groupByFields as readonly string[];\n const spec = built.aggregateSpec as AggregateSpec;\n return rows.map((row) => {\n const out: ClientRow = {};\n for (const name of by) out[name] = row[name];\n return assembleAggregates({ engine: target, model: built.model, spec, row, into: out });\n });\n };\n\n // ─── Lazy wrappers ───\n\n // `method` names the operation for telemetry; it is the delegate key, so a\n // sibling call is never confused with another one.\n const lazy = <T>(method: string, run: (target: Engine) => Promise<T>): Promise<T> =>\n QueryPromise.create<T>({ engine, run, model, method });\n\n const delegate: ModelDelegate = {\n findMany: (args?: ClientRow): Promise<ClientRow[]> => lazy(\"findMany\", (target) => findMany(target, args)),\n findFirst: (args?: ClientRow): Promise<ClientRow | null> => lazy(\"findFirst\", (target) => findFirst(target, args)),\n findUnique: (args: ClientRow): Promise<ClientRow | null> => lazy(\"findUnique\", (target) => findUnique(target, args)),\n\n findFirstOrThrow: (args?: ClientRow): Promise<ClientRow> =>\n lazy(\"findFirstOrThrow\", async (target) => {\n const row = await findFirst(target, args);\n if (row === null) throw notFound({ model, method: \"findFirstOrThrow\" });\n return row;\n }),\n\n findUniqueOrThrow: (args: ClientRow): Promise<ClientRow> =>\n lazy(\"findUniqueOrThrow\", async (target) => {\n const row = await findUnique(target, args);\n if (row === null) throw notFound({ model, method: \"findUniqueOrThrow\" });\n return row;\n }),\n\n create: (args: ClientRow): Promise<ClientRow | null> => lazy(\"create\", (target) => create(target, args)),\n createMany: (args: ClientRow): Promise<BatchResult> => lazy(\"createMany\", (target) => createMany(target, args)),\n createManyAndReturn: (args: ClientRow): Promise<ClientRow[]> =>\n lazy(\"createManyAndReturn\", (target) => createManyAndReturn(target, args)),\n update: (args: ClientRow): Promise<ClientRow> => lazy(\"update\", (target) => update(target, args)),\n updateMany: (args: ClientRow): Promise<BatchResult> => lazy(\"updateMany\", (target) => updateMany(target, args)),\n updateManyAndReturn: (args: ClientRow): Promise<ClientRow[]> =>\n lazy(\"updateManyAndReturn\", (target) => updateManyAndReturn(target, args)),\n upsert: (args: ClientRow): Promise<ClientRow> => lazy(\"upsert\", (target) => upsert(target, args)),\n upsertMany: (args: ClientRow): Promise<UpsertManyResult> =>\n lazy(\"upsertMany\", (target) => upsertMany(target, args)),\n delete: (args: ClientRow): Promise<ClientRow> => lazy(\"delete\", (target) => deleteOne(target, args)),\n deleteMany: (args?: ClientRow): Promise<BatchResult> => lazy(\"deleteMany\", (target) => deleteMany(target, args)),\n count: (args?: ClientRow): Promise<number | Record<string, number>> =>\n lazy(\"count\", (target) => count(target, args)),\n aggregate: (args: ClientRow): Promise<ClientRow> => lazy(\"aggregate\", (target) => aggregate(target, args)),\n groupBy: (args: ClientRow): Promise<ClientRow[]> => lazy(\"groupBy\", (target) => groupBy(target, args)),\n };\n\n const meta = getModelMeta({ meta: engine.meta, model });\n return meta.isView ? readOnlyDelegate({ delegate, model: meta.name }) : delegate;\n}\n\n// ─── Write validation wrapper ────────────────────────────────────\n\nconst WRITE_METHODS = [\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"update\",\n \"updateMany\",\n \"updateManyAndReturn\",\n \"upsert\",\n \"upsertMany\",\n] as const;\n\n/** Wrap a delegate's write methods through the Standard-Schema validators. */\nfunction withWriteValidation(params: {\n engine: Engine;\n delegate: ModelDelegate;\n model: string;\n validators: WriteValidators;\n}): ModelDelegate {\n const { engine, delegate, model, validators } = params;\n const meta = getModelMeta({ meta: engine.meta, model });\n const wrapped: Record<string, unknown> = { ...delegate };\n for (const method of WRITE_METHODS) {\n const original = delegate[method] as (args: ClientRow) => Promise<unknown>;\n wrapped[method] = (args: ClientRow): Promise<unknown> =>\n original(applyWriteValidators({ meta: engine.meta, model: meta, method, args, validators }) as ClientRow);\n }\n return wrapped as ModelDelegate;\n}\n\n// ─── Strict argument checking (opt-in) ──────────────────────\n\n/**\n * Wrap every delegate method in the strict-argument check (EPIC 2), installed\n * OUTSIDE the write-validation wrapper so it sees exactly what the caller\n * passed — before any wrapper rewrites, merges or drops a member.\n *\n * Refusals REJECT rather than throw synchronously: delegate methods promise a\n * Promise (`scoped.ts` does the same), and a refused root operation dispatches\n * no statement at all.\n */\nfunction withStrictArguments(params: { engine: Engine; delegate: ModelDelegate; model: string }): ModelDelegate {\n const { engine, delegate, model } = params;\n const meta = getModelMeta({ meta: engine.meta, model });\n const wrapped: Record<string, unknown> = { ...delegate };\n for (const [method, value] of Object.entries(wrapped)) {\n if (typeof value !== \"function\") continue;\n const original = value as (args?: ClientRow) => Promise<unknown>;\n wrapped[method] = (args?: ClientRow): Promise<unknown> => {\n let checked: ClientRow | undefined;\n try {\n checked = checkStrictArguments({ meta: engine.meta, model: meta, method, args });\n } catch (error) {\n return Promise.reject(error);\n }\n return original(checked);\n };\n }\n return wrapped as ModelDelegate;\n}\n\n// ─── Raw SQL ──────────────────────────────────────────────────────\n\n/**\n * Interleave a tagged template's literals with placeholders. Interpolated\n * values are ALWAYS bound as parameters — a template can never inject text.\n */\nfunction buildRawStatement(params: {\n dialect: SqlDialect;\n strings: TemplateStringsArray;\n values: readonly unknown[];\n}): { text: string; values: unknown[] } {\n const { dialect, strings, values } = params;\n const collector = new ParamCollector(dialect);\n let text = strings[0] ?? \"\";\n for (let index = 0; index < values.length; index++) {\n text += collector.add(values[index]) + (strings[index + 1] ?? \"\");\n }\n return { text, values: collector.values };\n}\n\n// ─── Factory ──────────────────────────────────────────────────────\n\nfunction buildClient(params: { engine: Engine }): DynamicClient {\n const { engine } = params;\n\n const models: Record<string, ModelDelegate> = {};\n for (const model of engine.meta.models) {\n let delegate = createDelegate({ engine, model: model.name });\n const validators = engine.options?.validate;\n // Wrap whenever ANY model configures validators (F09): a root with none of\n // its own can still carry a nested write into a model that has them.\n if (validators !== undefined && Object.keys(validators).length > 0) {\n delegate = withWriteValidation({ engine, delegate, model: model.name, validators });\n }\n // Outermost wrapper: the strict check must see the caller's own arguments.\n // ON unless explicitly opted out — `undefined` (no options at all, or an\n // options object that never mentions it) is the strict default.\n if (engine.options?.strictArguments !== false) {\n delegate = withStrictArguments({ engine, delegate, model: model.name });\n }\n models[model.name] = delegate;\n models[model.clientName] = delegate;\n }\n\n const runRaw = async (\n method: string,\n statement: { text: string; values: unknown[] },\n ): Promise<{ rows: ClientRow[]; affectedRows: number }> => {\n const scope = beginOperation({ engine, kind: \"raw\", model: null, method });\n scope?.dispatch();\n const running = executeOperation({\n engine: scope === undefined ? engine : { ...engine, operation: scope },\n run: async (target) => {\n // A raw call CARRYING PARAMETERS is bound like any generated statement\n // (F01); a parameterless one keeps the raw path, whose script semantics\n // callers depend on (DDL, PRAGMA batches — see `executeUnsafe`'s doc).\n return await runStatement<QueryResult>({\n engine: target,\n kind: \"raw\",\n model: null,\n method,\n text: statement.text,\n values: statement.values,\n rowCount: (value: QueryResult): number =>\n method.startsWith(\"$query\") ? value.rows.length : value.affectedRows,\n run: (): Promise<QueryResult> =>\n statement.values.length > 0\n ? runBoundAffected({ adapter: target.adapter, text: statement.text, values: statement.values })\n : target.adapter.executeUnsafe(statement),\n });\n },\n });\n if (scope === undefined) return await running;\n running.then(\n (value: QueryResult) => {\n scope.settle({\n outcome: \"success\",\n rowCount: method.startsWith(\"$query\") ? value.rows.length : value.affectedRows,\n });\n },\n (error: unknown) => {\n scope.settle({ outcome: \"failure\", error });\n },\n );\n return await running;\n };\n\n /**\n * The array form: claim every operation SYNCHRONOUSLY (before their\n * auto-dispatch microtask fires), then run them sequentially against ONE\n * transaction engine — statement order is array order, a throw rolls the\n * whole batch back and settles the not-yet-run operations with the same\n * failure, results return positionally. Only un-dispatched QueryPromises\n * may join: anything else is already in flight on the non-transactional\n * adapter and wrapping it would fake atomicity.\n */\n const runOperations = (operations: readonly unknown[], options?: TransactionOptions): Promise<unknown[]> => {\n const scope = beginOperation({ engine, kind: \"transaction\", model: null, method: \"$transaction\" });\n const claimed: ClaimedOperation[] = [];\n let claimError: unknown = null;\n // Preflight ALL identities synchronously, before claiming even the first entry.\n let identityError = engineStateError({ engine });\n for (const operation of operations) {\n if (identityError === undefined && operation instanceof QueryPromise) identityError = operation.ownerError({ engine });\n }\n if (identityError !== undefined) {\n for (const operation of operations) {\n if (operation instanceof QueryPromise) operation.refuse({ reason: identityError });\n }\n scope?.settle({ outcome: \"failure\", stage: \"refused\", error: identityError });\n return Promise.reject(identityError);\n }\n for (const operation of operations) {\n if (!(operation instanceof QueryPromise)) {\n claimError = new VibeError({\n code: \"VIBE_VALIDATION\",\n message:\n \"$transaction([...]) takes query promises from model delegate calls — a foreign promise is already running and cannot join the transaction\",\n });\n break;\n }\n try {\n claimed.push((operation as QueryPromise<unknown>).claim());\n } catch (error) {\n claimError = error;\n break;\n }\n }\n if (claimError !== null) {\n for (const entry of claimed) entry.abort(claimError);\n for (const operation of operations) {\n if (operation instanceof QueryPromise) operation.refuse({ reason: claimError });\n }\n // F06: a refused batch dispatches NOTHING. Telemetry must not resurrect it\n // — one honest terminal outcome, no statements, no duration.\n scope?.settle({ outcome: \"failure\", stage: \"refused\", error: claimError });\n return Promise.reject(claimError);\n }\n scope?.dispatch();\n const batch = engineTransaction({ engine: scope === undefined ? engine : { ...engine, operation: scope }, options, run: async (txEngine) => {\n const results: unknown[] = [];\n let index = 0;\n try {\n for (; index < claimed.length; index++) {\n results.push(await (claimed[index] as ClaimedOperation).start(txEngine));\n }\n } catch (error) {\n for (let rest = index + 1; rest < claimed.length; rest++) {\n (claimed[rest] as ClaimedOperation).abort(error);\n }\n throw error;\n }\n return results;\n } }).catch((error: unknown) => {\n for (const entry of claimed) entry.abort(error);\n throw error;\n });\n if (scope !== undefined) settleWith({ scope, running: batch });\n return batch;\n };\n\n /** The callback form: one transaction operation, with every call inside it as a child. */\n const runCallbackTransaction = <T>(\n fn: (tx: DynamicClient) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> => {\n const scope = beginOperation({ engine, kind: \"transaction\", model: null, method: \"$transaction\" });\n if (scope === undefined) {\n return engineTransaction({ engine, run: (target) => fn(buildClient({ engine: target })), options });\n }\n scope.dispatch();\n const running = engineTransaction({\n engine: { ...engine, operation: scope },\n run: (target) => fn(buildClient({ engine: { ...target, operation: scope } })),\n options,\n });\n // Commit/rollback failure is the TRANSACTION's outcome; a statement that\n // succeeded inside it never claimed the commit.\n settleWith({ scope, running });\n return running;\n };\n\n const client: DynamicClient = {\n $models: models,\n\n $on: (event: \"query\", listener: (event: QueryEvent) => void): (() => void) => {\n if (event !== \"query\") {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `unknown client event \"${String(event)}\" — supported: \"query\"`,\n meta: { event },\n });\n }\n engine.listeners.add(listener);\n return () => {\n engine.listeners.delete(listener);\n };\n },\n\n $transaction: (<T>(\n fnOrOperations: ((tx: DynamicClient) => Promise<T>) | readonly unknown[],\n options?: TransactionOptions,\n ): Promise<T | unknown[]> =>\n Array.isArray(fnOrOperations)\n ? runOperations(fnOrOperations, options)\n : runCallbackTransaction(fnOrOperations as (tx: DynamicClient) => Promise<T>, options)) as DynamicClient[\"$transaction\"],\n\n // Raw results are NOT decoded: without a model there is no field→column\n // mapping and no codec to apply. Values arrive as the driver produced them.\n $queryRaw: async (strings: TemplateStringsArray, ...values: unknown[]): Promise<ClientRow[]> =>\n (await runRaw(\"$queryRaw\", buildRawStatement({ dialect: engine.dialect, strings, values }))).rows,\n\n $executeRaw: async (strings: TemplateStringsArray, ...values: unknown[]): Promise<number> =>\n (await runRaw(\"$executeRaw\", buildRawStatement({ dialect: engine.dialect, strings, values }))).affectedRows,\n\n $queryRawUnsafe: async (text: string, ...values: unknown[]): Promise<ClientRow[]> =>\n (await runRaw(\"$queryRawUnsafe\", { text, values })).rows,\n\n $executeRawUnsafe: async (text: string, ...values: unknown[]): Promise<number> =>\n (await runRaw(\"$executeRawUnsafe\", { text, values })).affectedRows,\n\n $connect: async (): Promise<void> => {\n assertEngineActive({ engine, requireContext: false });\n if (engine.rlsSchema !== undefined) {\n if (engine.inTransaction) throw new RlsContextError({ reason: \"conflicting\" });\n await engine.adapter.connect();\n await engineTransaction({ engine, requireContext: false, run: async (target) => {\n for (const hook of engine.connectHooks ?? []) {\n await hook({ execute: (query) => target.adapter.execute({ text: query.text, values: [...(query.values ?? [])] }) });\n }\n } });\n return;\n }\n await engine.adapter.connect();\n for (const hook of engine.connectHooks ?? []) {\n await hook({\n execute: (execParams) =>\n engine.adapter.execute({ text: execParams.text, values: [...(execParams.values ?? [])] }),\n });\n }\n },\n $disconnect: async (): Promise<void> => {\n assertEngineActive({ engine, requireContext: false });\n if (engine.rlsSchema !== undefined && engine.inTransaction) throw new RlsContextError({ reason: \"conflicting\" });\n await engine.adapter.disconnect();\n // Flush what we buffered — and NOTHING else. The provider behind a shared\n // exporter belongs to the host; disconnecting a database client must never\n // shut it down.\n await engine.telemetry?.flush();\n },\n };\n\n // Ergonomic access (`client.user.findMany()`). The generated client declares\n // these properties with precise types; here they are attached at runtime only.\n for (const model of engine.meta.models) {\n Object.defineProperty(client, model.clientName, {\n value: models[model.clientName],\n enumerable: true,\n });\n }\n\n attachExtensionMounts({ engine, client, models });\n attachDefineView({ client, meta: engine.meta, models });\n // Tenant scoping ($scoped) reads client.$models lazily at CALL time, so it\n // sees the final delegates too; on @@policy schemas it refuses outright,\n // which keeps the two scoping layers from ever composing silently.\n const wrapDelegate = engine.options?.strictArguments !== false\n ? (params: { model: string; delegate: ModelDelegate }): ModelDelegate => withStrictArguments({ engine, ...params })\n : undefined;\n if (engine.rlsSchema === undefined) attachScoped({ client, meta: engine.meta, ...(wrapDelegate === undefined ? {} : { wrapDelegate }) });\n // Policy scoping LAST: it must see the final delegates (extension mounts\n // included) so scoped extension surfaces inherit the rewrite; fail-closed\n // guards then land on the finished base client. No-op without @@policy.\n if (engine.rlsSchema === undefined) {\n registerPolicyOperations({ client, factory: (run) => QueryPromise.create({\n engine,\n model: null,\n method: \"$policyOperation\",\n kind: \"transaction\",\n run: (target) => engineTransaction({ engine: target, run: (transactionEngine) => run(buildClient({ engine: transactionEngine })) }),\n }) });\n attachPolicy({ client, meta: engine.meta, ...(wrapDelegate === undefined ? {} : { wrapDelegate }) });\n }\n else {\n const refuseLegacy = (): never => {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Native row-level security cannot be combined with application policy or tenant scoping\" });\n };\n Object.defineProperties(client, {\n $withContext: { enumerable: true, value: (context: Readonly<Record<string, unknown>>): DynamicClient => {\n assertEngineActive({ engine, requireContext: false });\n if (engine.inTransaction) throw new RlsContextError({ reason: \"conflicting\" });\n return buildClient({ engine: { ...engine, context: bindRlsContext({ schema: engine.rlsSchema!, dialect: engine.dialect, context }) } });\n } },\n $scoped: { value: refuseLegacy },\n $withPolicy: { value: refuseLegacy },\n $bypassPolicy: { value: refuseLegacy },\n });\n for (const delegate of Object.values(models)) Object.freeze(delegate);\n Object.freeze(models);\n Object.freeze(client);\n }\n\n return client;\n}\n\n// ─── Extension mounts (D9 — baked surfaces) ────────────────────\n\nfunction makeMountContext(params: {\n engine: Engine;\n extension: string;\n model: ModelMeta | null;\n}): ExtensionMountContext {\n const { engine, extension, model } = params;\n return {\n extension,\n dialect: engine.dialect,\n provider: engine.adapter.provider,\n meta: engine.meta,\n model,\n executeRows: async ({ text, values, method }) => {\n const scope = beginOperation({\n engine,\n kind: \"extension\",\n model: model?.name ?? null,\n method: method ?? extension,\n });\n scope?.dispatch();\n const running = executeOperation({\n engine: scope === undefined ? engine : { ...engine, operation: scope },\n run: async (target) => {\n const rows = await runStatement<ClientRow[]>({\n engine: target,\n kind: \"extension\",\n model: model?.name ?? null,\n method: method ?? extension,\n text,\n values,\n rowCount: (value: ClientRow[]): number => value.length,\n run: (): Promise<ClientRow[]> =>\n target.adapter.execute({\n text,\n values: bindValues({ adapter: target.adapter, values: [...values] }),\n }),\n });\n return model === null\n ? rows\n : materializeRows({ dialect: target.dialect.name, model, rows, wire: target.adapter.wire });\n },\n });\n if (scope !== undefined) settleWith({ scope, running });\n return await running;\n },\n compileWhere: ({ where, model: modelName, qualify }) => {\n const target =\n modelName === undefined\n ? model\n : getModelMeta({ meta: engine.meta, model: modelName });\n if (target === null) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `extension \"${extension}\" compiled a where with no model in scope`,\n meta: { extension },\n });\n }\n return compileWhere({\n dialect: engine.dialect,\n meta: engine.meta,\n model: target,\n where,\n ...(qualify === undefined ? {} : { qualify }),\n });\n },\n };\n}\n\n/** Recreate a mount on the operation engine, so all of a method's statements share its identity. */\nfunction createMountSurface(params: { engine: Engine; mount: ClientExtensionMount; model: ModelMeta | null }): unknown {\n const { engine, mount, model } = params;\n const original = mount.create(makeMountContext({ engine, extension: mount.extension, model }));\n if (engine.rlsSchema === undefined) return original;\n const wrap = (value: unknown, path: readonly PropertyKey[]): unknown => {\n if (typeof value === \"function\") {\n return (...args: unknown[]): Promise<unknown> => QueryPromise.create({ engine, run: async (target) => {\n let current = mount.create(makeMountContext({ engine: target, extension: mount.extension, model }));\n let receiver: unknown = undefined;\n for (const key of path) {\n receiver = current;\n if (current === null || (typeof current !== \"object\" && typeof current !== \"function\")) throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Extension mount changed its method shape\" });\n current = Reflect.get(current, key);\n }\n if (typeof current !== \"function\") throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Extension mount changed its method shape\" });\n return Reflect.apply(current, receiver, args);\n } });\n }\n if (value === null || typeof value !== \"object\") return value;\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Native RLS extension mounts must expose plain objects and methods\" });\n }\n const result: Record<PropertyKey, unknown> = {};\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)!;\n if (!(\"value\" in descriptor)) throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Native RLS extension mount accessors are unsupported\" });\n Object.defineProperty(result, key, { value: wrap(descriptor.value, [...path, key]), enumerable: descriptor.enumerable });\n }\n return Object.freeze(result);\n };\n return wrap(original, []);\n}\n\n/**\n * Attach the baked extension surfaces. Runs on EVERY client build — the\n * `$transaction` path rebuilds the client over the tx adapter, so mounted\n * surfaces execute on the transaction connection like core delegates do.\n */\nfunction attachExtensionMounts(params: {\n engine: Engine;\n client: DynamicClient;\n models: Record<string, ModelDelegate>;\n}): void {\n const { engine, client, models } = params;\n const mounts = engine.extensionMounts;\n if (mounts === undefined) return;\n\n for (const mount of mounts) {\n if (mount.scope === \"model\") {\n const model = getModelMeta({ meta: engine.meta, model: mount.model ?? \"\" });\n const delegate = models[model.name];\n if (delegate === undefined || mount.property in delegate) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `extension \"${mount.extension}\" cannot mount \"${mount.property}\" on ${model.name} — the name is taken`,\n meta: { extension: mount.extension, model: model.name, property: mount.property },\n });\n }\n const value = createMountSurface({ engine, mount, model });\n // configurable: a LATER layer (attachPolicy's fail-closed guards) must be\n // able to redefine this property on the same delegate object. The client's\n // own `client.<model>` property is non-configurable and holds this exact\n // object, so guarding can only happen in place (F05).\n Object.defineProperty(delegate, mount.property, { value, enumerable: true, configurable: true });\n continue;\n }\n\n if (!mount.property.startsWith(\"$\") || mount.property in client) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `extension \"${mount.extension}\" cannot mount client property \"${mount.property}\" — root mounts are $-prefixed and must not collide`,\n meta: { extension: mount.extension, property: mount.property },\n });\n }\n const value = createMountSurface({ engine, mount, model: null });\n Object.defineProperty(client, mount.property, { value, enumerable: true });\n }\n}\n\n/**\n * Build a client for a schema over an adapter.\n *\n * The adapter chooses the dialect: the same IR runs on postgres, sqlite or\n * mysql, and every dialect difference is resolved by `@vibeorm/sql` and the\n * codec table rather than by branching here.\n *\n * @example\n * const db = createClient({ schema, adapter });\n * const users = await db.$models.user.findMany({ where: { active: true } });\n */\nexport function createClient(params: {\n schema: SchemaIR;\n adapter: DatabaseAdapter;\n options?: ClientOptions;\n /** Extension wiring — baked mounts + manifest from the generated client, live instances from the caller. */\n extensions?: ClientExtensionsOptions;\n /** Computed-field wiring — baked manifest from the generated client, live specs from the caller. */\n computed?: ClientComputedOptions;\n}): DynamicClient {\n const { schema, adapter, options, extensions, computed } = params;\n const dialectName: Dialect = adapter.dialect;\n // Built once per client and shared with every transaction engine; invalid\n // telemetry configuration fails here, not at the first query.\n const telemetry =\n options?.telemetry === undefined ? undefined : createTelemetryRecorder({ options: options.telemetry });\n if (schema.rls !== undefined) {\n const dialect = getSqlDialect({ dialect: dialectName });\n if (!dialect.capabilities.nativeRowLevelSecurity) throw unsupportedCapability({ dialect: dialectName, feature: \"nativeRowLevelSecurity\" });\n assertValidSchemaIR({ schema });\n for (const model of schema.models) {\n if (model.rls !== \"unprotected\") renderRlsPolicy({ dialect, schema, model: model.name });\n }\n const role = options?.nativeRls?.runtimeRole;\n if (adapter.provider === \"pglite\") {\n if (typeof role !== \"string\" || role.length === 0 || role.includes(\"\\0\")) throw new VibeError({ code: \"VIBE_CONFIG\", message: \"PGlite native row-level security requires a pre-existing restricted runtimeRole; embedded binding is not a boundary against the host process\" });\n } else if (role !== undefined) {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Server native row-level security must use the runtime login role, not a runtimeRole switch\" });\n }\n }\n\n // Staleness gate (extensions.md §3.2): a baked manifest must match the live\n // extension list BEFORE any query runs.\n if (extensions?.manifest !== undefined) {\n assertExtensionManifest({ manifest: extensions.manifest, instances: extensions.instances });\n }\n // Same gate for computed fields: the generated .d.ts promised these types.\n if (computed?.manifest !== undefined) {\n assertComputedManifest({ manifest: computed.manifest, specs: computed.specs });\n }\n // A client generated WITHOUT computed fields spreads a stray `computed`\n // option into ClientOptions — refuse it instead of silently ignoring it.\n if (\n computed === undefined &&\n options !== undefined &&\n (options as Record<string, unknown>)[\"computed\"] !== undefined\n ) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message:\n \"this client was generated without computed fields — declare them in vibeorm.config.ts and re-run vibeorm generate\",\n meta: {},\n });\n }\n\n const instances = extensions?.instances ?? [];\n const operatorMap =\n instances.length === 0\n ? null\n : buildExtensionOperatorMap({ instances, dialect: dialectName, provider: adapter.provider });\n const connectHooks =\n instances.length === 0\n ? []\n : buildConnectHooks({ instances, dialect: dialectName, provider: adapter.provider });\n\n const baseMeta = buildRuntimeMeta({\n schema,\n ...(computed?.specs === undefined ? {} : { computed: computed.specs }),\n });\n const meta: RuntimeMeta =\n operatorMap === null ? baseMeta : { ...baseMeta, extensionOperators: operatorMap };\n\n return buildClient({\n engine: {\n rootIdentity: Object.freeze({}),\n ...(schema.rls === undefined ? {} : { rlsSchema: schema }),\n meta,\n adapter,\n dialect: getSqlDialect({ dialect: dialectName }),\n options: schema.rls === undefined ? options ?? {} : Object.freeze({ ...options, nativeRls: Object.freeze({ ...options?.nativeRls }) }),\n listeners: new Set(),\n renderCache: new StatementRenderCache(),\n ...(telemetry === undefined ? {} : { telemetry }),\n ...(extensions?.mounts === undefined ? {} : { extensionMounts: extensions.mounts }),\n ...(connectHooks.length === 0 ? {} : { connectHooks }),\n },\n });\n}\n",
31
+ "/**\n * The compiled-query cache — §9's \"query-shape cache (structural hash → SQL\n * skeleton)\", constitution rule 8 (perf) under rule 3's constraint: the SQL\n * text is ALWAYS the renderer's, byte-identical — this module never builds SQL.\n *\n * How it works: a statement AST is walked ONCE, producing (a) a structural key\n * covering everything that affects the rendered text — kinds, identifiers,\n * operators, flags, literal LIMIT/OFFSET, arity where a dialect expands\n * placeholders per element — and (b) the parameter values in exactly the\n * renderer's collection order. A key hit reuses the cached text with the fresh\n * values; a miss renders for real and caches the text.\n *\n * SAFETY: the walk mirrors @vibeorm/sql's render traversal. Two guards keep a\n * divergence from ever mis-binding parameters:\n * 1. every MISS cross-checks the walked values against the renderer's\n * collected values (element-wise); a mismatch poisons the key so that\n * shape renders uncached forever, and\n * 2. constructs with dialect-conditional value branching that is not worth\n * mirroring (jsonFilter) are declared uncacheable outright.\n * The cache is invalidation-free by construction: the key IS the shape, and\n * equal shapes render equal text (shape-purity). Statement ASTs are treated as\n * immutable by the whole runtime, so cached texts can never go stale.\n */\n\nimport {\n isDbNowMarker,\n isJsonParamCell,\n isListSetOperation,\n isSetOperation,\n isSqlDefaultCell,\n renderStatement,\n strictMatchPattern,\n} from \"@vibeorm/sql\";\nimport type {\n AggRef,\n ColRef,\n DeleteStatement,\n InsertStatement,\n OrderTerm,\n RenderedQuery,\n SelectStatement,\n SqlDialect,\n SqlExpr,\n SqlStatement,\n TableRef,\n UpdateStatement,\n} from \"@vibeorm/sql\";\n\n// ─── Cache ────────────────────────────────────────────────────────\n\ntype CachedText = {\n readonly text: string;\n readonly returning: \"native\" | \"omitted\" | \"none\";\n};\n\n/** `null` = poisoned: this shape verified unsafe once — never cache it. */\ntype CacheSlot = CachedText | null;\n\nconst MAX_ENTRIES = 512;\n\n/** One per client (dialect-stable); shared across its transaction clients. */\nexport class StatementRenderCache {\n private readonly entries: Map<string, CacheSlot> = new Map();\n\n get(key: string): CacheSlot | undefined {\n return this.entries.get(key);\n }\n\n set(key: string, slot: CacheSlot): void {\n // Crude cap: shape-pure workloads have a few dozen shapes; a runaway\n // (adversarial keys) just degrades to render-per-call after a clear.\n if (this.entries.size >= MAX_ENTRIES && !this.entries.has(key)) this.entries.clear();\n this.entries.set(key, slot);\n }\n}\n\n// ─── Shape walk (key + values, in render order) ───────────────────\n\ntype Walk = {\n key: string;\n readonly values: unknown[];\n};\n\n/** Length-prefixed so adjacent names can never collide across boundaries. */\nfunction addIdent(walk: Walk, name: string): void {\n walk.key += `§${name.length}~${name}`;\n}\n\nfunction addCol(walk: Walk, column: ColRef): void {\n if (column.table !== undefined) addIdent(walk, column.table);\n walk.key += \".\";\n addIdent(walk, column.name);\n // B3/B4 wire transforms change the rendered text — part of the shape.\n if (column.transform !== undefined) walk.key += column.transform === \"castText\" ? \"^t\" : \"^b\";\n if (column.castReal === true) walk.key += \"^r\";\n // Projection alias (`… AS \"__vibe_parent\"`) is rendered text — shape.\n if (column.alias !== undefined) {\n walk.key += \"^a\";\n addIdent(walk, column.alias);\n }\n}\n\nfunction addTable(walk: Walk, table: TableRef): void {\n addIdent(walk, table.name);\n if (table.alias !== undefined) {\n walk.key += \"@\";\n addIdent(walk, table.alias);\n }\n}\n\nfunction addAgg(walk: Walk, agg: AggRef): void {\n walk.key += agg.fn;\n if (agg.fn !== \"countAll\") addCol(walk, agg.column);\n}\n\n/** SET/DO UPDATE SET entry — mirrors renderAssignments' value forms. */\nfunction addSetEntry(walk: Walk, name: string, value: unknown): void {\n if (isJsonParamCell(value)) {\n // F11: the renderer binds the cell's TEXT and appends the dialect's json\n // param cast — both are shape. Without the `=j` marker a null-first write\n // (`=v`) and a JSON write collide on one key, and without `.text` the\n // internal cell object itself would be bound as the parameter.\n walk.key += \"=j\";\n addIdent(walk, name);\n walk.values.push(value.text);\n return;\n }\n if (isSetOperation(value)) {\n walk.key += `=o${value.__op}`;\n addIdent(walk, name);\n walk.values.push(value.value);\n return;\n }\n if (isDbNowMarker(value)) {\n // Text differs between zero and non-zero offsets; only the non-zero form\n // binds the offset as a parameter.\n walk.key += value.offsetSeconds === 0 ? \"=N0\" : \"=N1\";\n addIdent(walk, name);\n if (value.offsetSeconds !== 0) walk.values.push(value.offsetSeconds);\n return;\n }\n if (isListSetOperation(value)) {\n walk.key += `=l${value.__listOp}`;\n addIdent(walk, name);\n walk.values.push(value.value);\n return;\n }\n walk.key += \"=v\";\n addIdent(walk, name);\n walk.values.push(value);\n}\n\nfunction addReturning(walk: Walk, returning: readonly string[] | undefined): void {\n if (returning === undefined || returning.length === 0) {\n walk.key += \"r0\";\n return;\n }\n walk.key += \"r(\";\n for (const name of returning) addIdent(walk, name);\n walk.key += \")\";\n}\n\n/** Mirrors renderExpr; returns false when the expression is uncacheable. */\nfunction walkExpr(walk: Walk, dialect: SqlDialect, expr: SqlExpr): boolean {\n switch (expr.kind) {\n case \"cmp\":\n if (isDbNowMarker(expr.value)) {\n walk.key += `cN${expr.op}${expr.value.offsetSeconds === 0 ? \"0\" : \"1\"}`;\n addCol(walk, expr.column);\n if (expr.value.offsetSeconds !== 0) walk.values.push(expr.value.offsetSeconds);\n return true;\n }\n walk.key += `c${expr.op}`;\n addCol(walk, expr.column);\n walk.values.push(expr.value);\n return true;\n\n case \"cmpCol\":\n walk.key += `k${expr.op}`;\n addCol(walk, expr.left);\n addCol(walk, expr.right);\n return true;\n\n case \"isNull\":\n walk.key += expr.negate === true ? \"n1\" : \"n0\";\n addCol(walk, expr.column);\n return true;\n\n case \"inArray\": {\n if (expr.values.length === 0) {\n walk.key += expr.negate === true ? \"z1\" : \"z0\";\n return true;\n }\n walk.key += expr.negate === true ? \"i1\" : \"i0\";\n addCol(walk, expr.column);\n if (dialect.inArrayStrategy === \"any\") {\n // One array parameter — the renderer copies, so the walk copies too.\n walk.values.push([...expr.values]);\n } else {\n // Expanded placeholders: arity is part of the text.\n walk.key += `#${expr.values.length}`;\n for (const value of expr.values) walk.values.push(value);\n }\n return true;\n }\n\n case \"tupleIn\": {\n // Mirrors renderExpr's tupleIn case. The TEXT is decided by `negate`, the\n // column identifiers and the two arities (values per tuple, tuples); the\n // VALUES are collected row by row, each row in column order — the same\n // sequence under BOTH `rowValue` (one addMany per row) and `expand` (one\n // add per member, ascending index). Strategy itself is fixed per dialect\n // and the cache is per dialect instance, so it stays out of the key.\n if (expr.columns.length === 0) return false; // renderer throws on this shape\n walk.key += `Tu${expr.negate === true ? \"1\" : \"0\"}${expr.columns.length}#${expr.rows.length}(`;\n for (const column of expr.columns) addCol(walk, column);\n walk.key += \")\";\n // Empty membership renders the constant `1 = 1` / `1 = 0` and binds nothing.\n if (expr.rows.length === 0) return true;\n for (const row of expr.rows) {\n // Ragged rows make the renderer throw — never key such a shape.\n if (row.length !== expr.columns.length) return false;\n for (const value of row) walk.values.push(value);\n }\n return true;\n }\n\n case \"like\":\n walk.key += `L${expr.insensitive === true ? \"i\" : \"s\"}${expr.negate === true ? \"n\" : \"p\"}`;\n addCol(walk, expr.column);\n walk.values.push(expr.pattern);\n return true;\n\n case \"strictMatch\":\n // #20 — mirrors the renderer's strictMatch case: the text depends on op\n // + strategy (both in the key via op; strategy is fixed per dialect,\n // and the cache is per dialect instance), and the BOUND value is the\n // DERIVED pattern for pattern ops — the shared strictMatchPattern\n // helper keeps this mirror and the renderer from drifting.\n walk.key += `S${expr.op}${expr.negate === true ? \"n\" : \"p\"}`;\n addCol(walk, expr.column);\n walk.values.push(\n expr.op === \"equals\"\n ? expr.value\n : strictMatchPattern({ strategy: dialect.strictMatchStrategy, op: expr.op, value: expr.value }),\n );\n return true;\n\n case \"and\":\n case \"or\": {\n walk.key += `${expr.kind === \"and\" ? \"A\" : \"O\"}${expr.operands.length}(`;\n for (const operand of expr.operands) {\n if (!walkExpr(walk, dialect, operand)) return false;\n }\n walk.key += \")\";\n return true;\n }\n\n case \"not\":\n walk.key += \"!(\";\n if (!walkExpr(walk, dialect, expr.operand)) return false;\n walk.key += \")\";\n return true;\n\n case \"exists\":\n walk.key += expr.negate === true ? \"E1(\" : \"E0(\";\n if (!walkSelect(walk, dialect, expr.select)) return false;\n walk.key += \")\";\n return true;\n\n case \"aggCmp\":\n walk.key += `g${expr.op}`;\n addAgg(walk, expr.agg);\n walk.values.push(expr.value);\n return true;\n\n case \"arrayHas\":\n walk.key += expr.negate === true ? \"h1\" : \"h0\";\n addCol(walk, expr.column);\n walk.values.push(expr.value);\n return true;\n\n case \"arrayContainsAll\":\n walk.key += \"H\";\n addCol(walk, expr.column);\n walk.values.push([...expr.values]);\n return true;\n\n case \"arrayOverlaps\":\n walk.key += \"V\";\n addCol(walk, expr.column);\n walk.values.push([...expr.values]);\n return true;\n\n case \"arrayIsEmpty\":\n walk.key += expr.empty ? \"e1\" : \"e0\";\n addCol(walk, expr.column);\n return true;\n\n case \"jsonFilter\":\n // Value collection branches on dialect json mode AND operand type —\n // deliberately uncacheable rather than mirrored (see module docs).\n return false;\n\n case \"fragment\":\n // Extension-defined part streams (extensions.md §3) — uncacheable, the\n // fragment owns its own text/param interleaving.\n return false;\n\n case \"raw\":\n // Text-only fragment: the text IS the shape.\n walk.key += \"R(\";\n addIdent(walk, expr.text);\n walk.key += \")\";\n return true;\n }\n}\n\n/** One ORDER BY term — column, aggregate, or correlated subquery (relation orderBy). */\nfunction walkOrderTerm(walk: Walk, dialect: SqlDialect, term: OrderTerm): boolean {\n if (\"agg\" in term) {\n walk.key += \"a\";\n addAgg(walk, term.agg);\n } else if (\"select\" in term) {\n // Correlated subquery term: its parameters land in the shared sequence in\n // render order — walk the whole subselect.\n walk.key += \"q(\";\n if (!walkSelect(walk, dialect, term.select)) return false;\n walk.key += \")\";\n } else {\n addCol(walk, term.column);\n walk.key += term.nulls === undefined ? \"-\" : term.nulls === \"first\" ? \"^\" : \"$\";\n }\n walk.key += term.direction === \"asc\" ? \"+\" : \"~\";\n return true;\n}\n\n/**\n * Mirrors renderSelect. Value order there: rowNumber OVER-order subqueries\n * (projection renders first) → fromSelect → lateralJoins → where → having →\n * orderBy subqueries (everything else is parameter-free; LIMIT/OFFSET are\n * literals and therefore live in the KEY).\n */\nfunction walkSelect(walk: Walk, dialect: SqlDialect, statement: SelectStatement): boolean {\n walk.key += \"S{\";\n if (statement.distinctOn !== undefined && statement.distinctOn.length > 0) {\n walk.key += \"d(\";\n for (const column of statement.distinctOn) addCol(walk, column);\n walk.key += \")\";\n }\n walk.key += \"p(\";\n for (const column of statement.columns) addCol(walk, column);\n walk.key += \")\";\n if (statement.selectExpr !== undefined) {\n if (statement.selectExpr.kind === \"one\") {\n walk.key += \"x1\";\n } else {\n walk.key += \"xc\";\n if (statement.selectExpr.alias !== undefined) addIdent(walk, statement.selectExpr.alias);\n }\n }\n if (statement.aggregates !== undefined) {\n for (const selection of statement.aggregates) {\n walk.key += \"a\";\n addAgg(walk, selection.agg);\n addIdent(walk, selection.alias);\n }\n }\n if (statement.rowNumber !== undefined) {\n walk.key += \"W(\";\n for (const column of statement.rowNumber.partitionBy) addCol(walk, column);\n walk.key += \":\";\n for (const term of statement.rowNumber.orderBy) {\n if (!walkOrderTerm(walk, dialect, term)) return false;\n }\n addIdent(walk, statement.rowNumber.alias);\n walk.key += \")\";\n }\n walk.key += \"f\";\n addTable(walk, statement.table);\n if (statement.fromSelect !== undefined) {\n walk.key += \"F(\";\n if (!walkSelect(walk, dialect, statement.fromSelect)) return false;\n walk.key += \")\";\n }\n if (statement.innerJoins !== undefined && statement.innerJoins.length > 0) {\n for (const join of statement.innerJoins) {\n walk.key += \"J(\";\n addTable(walk, join.table);\n for (const pair of join.on) {\n addCol(walk, pair.left);\n walk.key += \"=\";\n addCol(walk, pair.right);\n }\n walk.key += \")\";\n }\n }\n if (statement.lateralJoins !== undefined && statement.lateralJoins.length > 0) {\n for (const join of statement.lateralJoins) {\n walk.key += join.agg === \"jsonArray\" ? \"Ja(\" : \"Jo(\";\n if (!walkSelect(walk, dialect, join.select)) return false;\n addIdent(walk, join.columnAlias);\n addIdent(walk, join.alias);\n walk.key += \")\";\n }\n }\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n if (statement.groupBy !== undefined && statement.groupBy.length > 0) {\n walk.key += \"b(\";\n for (const column of statement.groupBy) addCol(walk, column);\n walk.key += \")\";\n }\n if (statement.having !== undefined) {\n walk.key += \"v\";\n if (!walkExpr(walk, dialect, statement.having)) return false;\n }\n if (statement.orderBy !== undefined && statement.orderBy.length > 0) {\n walk.key += \"o(\";\n for (const term of statement.orderBy) {\n if (!walkOrderTerm(walk, dialect, term)) return false;\n }\n walk.key += \")\";\n }\n if (statement.limit !== undefined) walk.key += `t${statement.limit}`;\n if (statement.offset !== undefined) walk.key += `s${statement.offset}`;\n if (statement.lockForUpdate === true) walk.key += \"u\";\n walk.key += \"}\";\n return true;\n}\n\n/** Mirrors renderInsert: values row-major, then ON CONFLICT update entries. */\nfunction walkInsert(walk: Walk, dialect: SqlDialect, statement: InsertStatement): boolean {\n walk.key += \"I{\";\n addTable(walk, statement.table);\n walk.key += \"c(\";\n for (const name of statement.columns) addIdent(walk, name);\n walk.key += `)r${statement.rows.length}`;\n const arity = statement.columns.length;\n for (let rowIndex = 0; rowIndex < statement.rows.length; rowIndex++) {\n const row = statement.rows[rowIndex] as readonly unknown[];\n // A malformed row must reach the renderer's own arity error — never a hit.\n if (row.length !== arity) return false;\n for (let cell = 0; cell < row.length; cell++) {\n const value = row[cell];\n // M4: a DEFAULT cell is TEXT, not a parameter — its POSITION is shape.\n if (isSqlDefaultCell(value)) walk.key += `D${rowIndex}:${cell};`;\n else if (isJsonParamCell(value)) {\n // F11: json cell — cast text at this POSITION, bound to the cell's text.\n walk.key += `J${rowIndex}:${cell};`;\n walk.values.push(value.text);\n } else if (isDbNowMarker(value)) {\n // Database-clock cell: expression text (zero offset) or one bound param.\n walk.key += `T${rowIndex}:${cell}:${value.offsetSeconds === 0 ? \"0\" : \"1\"};`;\n if (value.offsetSeconds !== 0) walk.values.push(value.offsetSeconds);\n } else walk.values.push(value);\n }\n }\n const onConflict = statement.onConflict;\n if (onConflict !== undefined) {\n if (\"doNothing\" in onConflict) {\n walk.key += \"N(\";\n if (onConflict.constraint !== undefined) {\n walk.key += \"K\";\n addIdent(walk, onConflict.constraint);\n }\n if (onConflict.columns !== undefined) {\n for (const name of onConflict.columns) addIdent(walk, name);\n }\n if (onConflict.conflictWhere !== undefined) {\n // Raw predicate text — part of the SHAPE, no parameters.\n walk.key += \"w\";\n addIdent(walk, onConflict.conflictWhere);\n }\n walk.key += \")\";\n } else {\n walk.key += \"U(\";\n if (onConflict.constraint !== undefined) {\n walk.key += \"K\";\n addIdent(walk, onConflict.constraint);\n }\n for (const name of onConflict.columns) addIdent(walk, name);\n walk.key += \":\";\n for (const [name, value] of Object.entries(onConflict.update)) addSetEntry(walk, name, value);\n if (onConflict.lastInsertIdColumn !== undefined) {\n walk.key += \"@\";\n addIdent(walk, onConflict.lastInsertIdColumn);\n }\n walk.key += \")\";\n }\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\n/** Mirrors renderUpdate: SET entries, then WHERE. */\nfunction walkUpdate(walk: Walk, dialect: SqlDialect, statement: UpdateStatement): boolean {\n walk.key += \"U{\";\n addTable(walk, statement.table);\n for (const [name, value] of Object.entries(statement.set)) addSetEntry(walk, name, value);\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\nfunction walkDelete(walk: Walk, dialect: SqlDialect, statement: DeleteStatement): boolean {\n walk.key += \"D{\";\n addTable(walk, statement.table);\n if (statement.where !== undefined) {\n walk.key += \"w\";\n if (!walkExpr(walk, dialect, statement.where)) return false;\n }\n addReturning(walk, statement.returning);\n walk.key += \"}\";\n return true;\n}\n\nfunction walkStatement(walk: Walk, dialect: SqlDialect, statement: SqlStatement): boolean {\n switch (statement.kind) {\n case \"select\":\n return walkSelect(walk, dialect, statement);\n case \"insert\":\n return walkInsert(walk, dialect, statement);\n case \"update\":\n return walkUpdate(walk, dialect, statement);\n case \"delete\":\n return walkDelete(walk, dialect, statement);\n // RLS statements are DDL/session shapes rendered once per migration or per\n // transaction, never in a hot loop — declared uncacheable rather than\n // walked, per the render-cache mirror rule (an unmirrored branch would\n // reuse cached SQL and silently drop params).\n case \"rlsEnable\":\n case \"rlsForce\":\n case \"rlsDisable\":\n case \"rlsNoForce\":\n case \"rlsDropPolicy\":\n case \"rlsPolicy\":\n case \"rlsContext\":\n case \"rlsRole\":\n return false;\n }\n}\n\n// ─── Miss-time verification ───────────────────────────────────────\n\n/**\n * Element-wise identity, with one-level array content equality — the renderer\n * copies array params (`[...values]`), so a fresh copy with identical elements\n * counts as the same value.\n */\nfunction sameValues(walked: readonly unknown[], rendered: readonly unknown[]): boolean {\n if (walked.length !== rendered.length) return false;\n for (let index = 0; index < walked.length; index++) {\n const a = walked[index];\n const b = rendered[index];\n if (a === b) continue;\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n let equal = true;\n for (let element = 0; element < a.length; element++) {\n if (a[element] !== b[element]) {\n equal = false;\n break;\n }\n }\n if (equal) continue;\n }\n return false;\n }\n return true;\n}\n\n// ─── Entry point ──────────────────────────────────────────────────\n\n/**\n * Render through the shape cache: hit = cached text + freshly walked values;\n * miss = real render, cross-checked against the walk before caching. Anything\n * uncacheable (or a verification failure — poisoned) renders directly.\n */\nexport function renderStatementCached(params: {\n dialect: SqlDialect;\n statement: SqlStatement;\n cache: StatementRenderCache;\n}): RenderedQuery {\n const { dialect, statement, cache } = params;\n\n const walk: Walk = { key: \"\", values: [] };\n if (!walkStatement(walk, dialect, statement)) {\n return renderStatement({ dialect, statement });\n }\n\n const slot = cache.get(walk.key);\n if (slot !== undefined) {\n if (slot === null) return renderStatement({ dialect, statement });\n return { text: slot.text, values: walk.values, returning: slot.returning };\n }\n\n const rendered = renderStatement({ dialect, statement });\n cache.set(\n walk.key,\n sameValues(walk.values, rendered.values) ? { text: rendered.text, returning: rendered.returning } : null,\n );\n return rendered;\n}\n",
32
+ "/**\n * Strict argument handling (EPIC 2) — ON BY DEFAULT.\n *\n * Legacy (and Prisma's own default) semantics treat `where: { tenantId: undefined }`\n * exactly like `where: {}`: the member vanishes and a bulk write silently widens\n * to every row. That is the single most expensive footgun in an ORM argument\n * object, and it is invisible in review because the *code* names the filter.\n *\n * So an explicit `undefined` anywhere in ORM argument SYNTAX is refused before a\n * statement is built, and `SKIP` is the deliberate way to say \"omit this\n * property\". `strictArguments: false` on the client opts out and restores the\n * legacy behaviour; only that explicit `false` does — an options object that\n * never mentions the flag stays strict.\n *\n * What is NOT argument syntax, and is therefore never inspected:\n * - anything under a `Json`-typed field (a JSON document's own keys are data,\n * exactly as `validators.ts` and the query builder already treat them);\n * - non-plain objects (`Date`, `Uint8Array`, `Decimal`, any class instance);\n * - symbol-keyed properties.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ModelMeta, RuntimeMeta } from \"./model-meta.ts\";\n\n// ─── The omission sentinel ────────────────────────────────────────\n\n/**\n * Omit a property deliberately: `{ where: { tenantId: SKIP } }` compiles exactly\n * like `{ where: {} }`, in strict mode and in legacy mode alike.\n *\n * A globally registered symbol, so a consumer that cannot import the runtime\n * (a generated-client-only app, a serialized argument builder) can name the very\n * same value with `Symbol.for(\"vibeorm.skip\")`.\n *\n * Named `SKIP`, not `skip`: `skip` is already a pagination argument, and\n * `{ take: 10, skip: SKIP }` must not read as two meanings of one word.\n */\nexport const SKIP: unique symbol = Symbol.for(\"vibeorm.skip\") as typeof SKIP;\n\n/** The type of the {@link SKIP} sentinel. */\nexport type Skip = typeof SKIP;\n\n// ─── Walk ─────────────────────────────────────────────────────────\n\nfunction explicitUndefined(params: { model: string; method: string; path: string }): VibeError {\n const { model, method, path } = params;\n return new VibeError({\n code: \"VIBE_VALIDATION\",\n message:\n `${model}.${method}(): explicit undefined at ${path} — an undefined value is refused ` +\n `because it would silently drop the property (widening a filter or losing a write). ` +\n `Omit the property, or pass SKIP to omit it deliberately; ` +\n `VibeClient({ strictArguments: false }) restores the legacy behaviour.`,\n meta: { model, method, path },\n });\n}\n\n/**\n * A plain data object: `{}` or `Object.create(null)`. A `Date`, a `Uint8Array`,\n * a Decimal instance or any other class carries values, not argument syntax.\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\ntype WalkContext = {\n readonly meta: RuntimeMeta;\n readonly model: string;\n readonly method: string;\n};\n\n/**\n * The model a subtree is written against, and whether that subtree is a JSON\n * document (in which case it is left completely alone).\n */\nfunction descend(params: { ctx: WalkContext; model: ModelMeta; key: string }): ModelMeta | \"json\" {\n const { ctx, model, key } = params;\n const field = model.fieldByName.get(key);\n if (field !== undefined) return field.scalarType === \"Json\" ? \"json\" : model;\n const relation = model.relationByName.get(key);\n if (relation === undefined) return model;\n return ctx.meta.modelByName.get(relation.targetModel) ?? model;\n}\n\nfunction walkArray(params: {\n ctx: WalkContext;\n model: ModelMeta;\n value: readonly unknown[];\n path: string;\n filter: boolean;\n}): readonly unknown[] {\n const { ctx, model, value, path, filter } = params;\n let changed = false;\n const out = value.map((item, index) => {\n const next = walkNode({ ctx, model, value: item, path: `${path}[${index}]`, filter });\n if (next !== item) changed = true;\n return next;\n });\n return changed ? out : value;\n}\n\n/**\n * Refuse explicit `undefined`, strip `SKIP`. Returns the SAME reference when\n * nothing was stripped, so the common path allocates nothing.\n */\nfunction walkNode(params: { ctx: WalkContext; model: ModelMeta; value: unknown; path: string; filter?: boolean }): unknown {\n const { ctx, model, value, path } = params;\n const filter = params.filter === true;\n if (Array.isArray(value)) return walkArray({ ctx, model, value, path, filter });\n if (!isPlainObject(value)) return value;\n\n let out: Record<string, unknown> | null = null;\n for (const key of Object.keys(value)) {\n const child = value[key];\n const childPath = `${path}.${key}`;\n if (child === undefined) {\n throw explicitUndefined({ model: ctx.model, method: ctx.method, path: childPath });\n }\n if (child === SKIP) {\n out ??= { ...value };\n delete out[key];\n continue;\n }\n const target = descend({ ctx, model, key });\n if (target === \"json\") {\n // A filter's operator bag is ORM syntax; only its operands are documents.\n if (filter && isPlainObject(child)) {\n let filtered: Record<string, unknown> | null = null;\n for (const operator of Object.keys(child)) {\n if (child[operator] === undefined) {\n throw explicitUndefined({ model: ctx.model, method: ctx.method, path: `${childPath}.${operator}` });\n }\n if (child[operator] === SKIP) {\n filtered ??= { ...child };\n delete filtered[operator];\n }\n }\n if (filtered !== null) {\n out ??= { ...value };\n out[key] = filtered;\n }\n }\n continue;\n }\n const next = walkNode({ ctx, model: target, value: child, path: childPath,\n filter: key === \"where\" || key === \"having\" ? true\n : key === \"data\" || key === \"create\" || key === \"update\" ? false : filter,\n });\n if (next !== child) {\n out ??= { ...value };\n out[key] = next;\n }\n }\n return out ?? value;\n}\n\n/**\n * Check one public call's arguments. Runs BEFORE any wrapper can discard an\n * undefined member and before a statement is built, so a refused root operation\n * dispatches nothing at all.\n */\nexport function checkStrictArguments(params: {\n readonly meta: RuntimeMeta;\n readonly model: ModelMeta;\n readonly method: string;\n readonly args: Record<string, unknown> | undefined;\n}): Record<string, unknown> | undefined {\n const { meta, model, method, args } = params;\n if (args === undefined) return undefined;\n const ctx: WalkContext = { meta, model: model.clientName, method };\n const walked = walkNode({ ctx, model, value: args, path: \"args\" });\n return walked as Record<string, unknown>;\n}\n",
33
+ "import { RlsContextError } from \"@vibeorm/schema\";\nimport type { RlsContextScalar, SchemaIR } from \"@vibeorm/schema\";\nimport { renderRlsColumnType } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport { getCodec } from \"./codecs.ts\";\n\n/** Private, copied identity and its total transaction-settings transport. */\nexport type BoundRlsContext = {\n readonly values: Readonly<Record<string, unknown>>;\n readonly settings: Readonly<Record<string, string | null>>;\n};\n\nconst RLS_SCALAR_LIMITS = Object.freeze({\n smallIntMin: -32768,\n smallIntMax: 32767,\n intMin: -2147483648,\n intMax: 2147483647,\n bigIntMin: -9223372036854775808n,\n bigIntMax: 9223372036854775807n,\n decimal: /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/,\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\n});\n\nfunction validScalar(params: { type: RlsContextScalar; value: unknown }): boolean {\n const { type, value } = params;\n switch (type) {\n case \"String\": return typeof value === \"string\" && value.length > 0 && !value.includes(\"\\0\");\n case \"Boolean\": return typeof value === \"boolean\";\n case \"Int\": return typeof value === \"number\" && Number.isInteger(value) && value >= RLS_SCALAR_LIMITS.intMin && value <= RLS_SCALAR_LIMITS.intMax;\n case \"BigInt\": return typeof value === \"bigint\" && value >= RLS_SCALAR_LIMITS.bigIntMin && value <= RLS_SCALAR_LIMITS.bigIntMax;\n case \"Float\": return typeof value === \"number\" && Number.isFinite(value);\n case \"Decimal\": return typeof value === \"string\" && RLS_SCALAR_LIMITS.decimal.test(value) && Number.isFinite(Number(value));\n case \"DateTime\": return value instanceof Date && Number.isFinite(Date.prototype.getTime.call(value));\n }\n}\n\n/** Validate before serialization; missing nullable slots are still missing keys. */\nexport function bindRlsContext(params: { schema: SchemaIR; dialect: SqlDialect; context: unknown }): BoundRlsContext {\n const { schema, dialect, context } = params;\n if (context === null || typeof context !== \"object\" || Array.isArray(context)) {\n throw new RlsContextError({ reason: \"invalid\" });\n }\n const declaration = schema.rls!.context;\n const values: Record<string, unknown> = Object.create(null);\n const settings: Record<string, string | null> = Object.create(null);\n for (const key of Object.keys(declaration)) {\n if (!Object.hasOwn(context, key)) throw new RlsContextError({ reason: \"missing\", key });\n }\n for (const key of Reflect.ownKeys(context)) {\n if (typeof key !== \"string\" || !Object.hasOwn(declaration, key)) throw new RlsContextError({ reason: \"invalid\" });\n }\n for (const [key, slot] of Object.entries(declaration)) {\n const descriptor = Object.getOwnPropertyDescriptor(context, key)!;\n if (!(\"value\" in descriptor) || descriptor.enumerable !== true) throw new RlsContextError({ reason: \"invalid\", key });\n const value: unknown = descriptor.value;\n if (value === null && slot.nullable) {\n values[key] = null;\n settings[key] = null;\n continue;\n }\n if (!validScalar({ type: slot.type, value })) throw new RlsContextError({ reason: \"invalid\", key });\n const copied = value instanceof Date ? Object.freeze(new Date(Date.prototype.getTime.call(value))) : value;\n values[key] = copied;\n const encoded = getCodec({ dialect: dialect.name, type: slot.type }).encode(copied);\n settings[key] = encoded instanceof Date ? Date.prototype.toISOString.call(encoded) : String(encoded);\n }\n // Validate context against every direct ownership column, not only its logical scalar.\n for (const model of schema.models) {\n if (typeof model.rls !== \"object\" || !(\"where\" in model.rls)) continue;\n for (const [name, ref] of Object.entries(model.rls.where)) {\n const field = model.fields.find((candidate) => candidate.name === name)!;\n const type = renderRlsColumnType({ dialect, field });\n const value = values[ref.context];\n if (value === null) continue;\n if (\n (type === \"uuid\" && (typeof value !== \"string\" || !RLS_SCALAR_LIMITS.uuid.test(value))) ||\n (type === \"smallint\" && typeof value === \"number\" && (value < RLS_SCALAR_LIMITS.smallIntMin || value > RLS_SCALAR_LIMITS.smallIntMax)) ||\n (type === \"real\" && typeof value === \"number\" && Math.fround(value) !== value)\n ) throw new RlsContextError({ reason: \"invalid\", key: ref.context });\n }\n }\n return Object.freeze({ values: Object.freeze(values), settings: Object.freeze(settings) });\n}\n",
34
+ "/**\n * The recorder: one per client, owning operation identity, sampling, bounded\n * buffering, drop accounting, metrics and every guarded exporter call.\n *\n * Three invariants this module exists to hold:\n *\n * 1. **Exactly one terminal operation outcome.** `settle()` is idempotent —\n * success, refusal before dispatch, validation failure, adapter failure,\n * decode failure and commit/rollback failure all end in one event, and a\n * later duplicate settle is ignored rather than emitting a second span.\n * 2. **The database never depends on the exporter.** Every exporter callback\n * runs inside a guard; a throw is reported to `onExporterError` (itself\n * guarded) and swallowed. No exporter can change a query's arguments, its\n * results or whether it committed.\n * 3. **Nothing unknown is invented.** Absent row counts, absent durations and\n * absent timing subdivisions stay absent.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { Dialect, Provider, VibeErrorCode } from \"@vibeorm/schema\";\nimport { resolveTelemetryConfig } from \"./config.ts\";\nimport type { ResolvedTelemetryConfig } from \"./config.ts\";\nimport { queryFingerprint } from \"./fingerprint.ts\";\nimport type {\n TelemetryDropEvent,\n TelemetryExportPhase,\n TelemetryExporter,\n TelemetryHistogram,\n TelemetryMetricsSnapshot,\n TelemetryOperationEvent,\n TelemetryOperationKind,\n TelemetryOptions,\n TelemetryOutcome,\n TelemetryParentContext,\n TelemetryStage,\n TelemetryStatementEvent,\n TelemetryStatementKind,\n TelemetryTimingDetail,\n} from \"./types.ts\";\n\n// ─── Inputs ───────────────────────────────────────────────────────\n\n/** What starting an operation needs to know. */\nexport type TelemetryBeginInput = {\n readonly kind: TelemetryOperationKind;\n readonly model: string | null;\n readonly method: string;\n readonly dialect: Dialect;\n readonly provider: Provider;\n /** The enclosing transaction/extension operation, when there is one. */\n readonly parentOperationId?: string;\n};\n\n/** One finished statement, reported by the execution path that ran it. */\nexport type TelemetryStatementInput = {\n readonly kind: TelemetryStatementKind;\n readonly model: string | null;\n readonly method: string;\n readonly text: string;\n readonly values: readonly unknown[];\n readonly inTransaction: boolean;\n readonly durationMs: number;\n readonly outcome: TelemetryOutcome;\n /** Absent when this path cannot know it. */\n readonly rowCount?: number;\n readonly error?: unknown;\n /** Time spent rendering this statement, when measured. */\n readonly renderMs?: number;\n};\n\n/** How an operation ended. */\nexport type TelemetrySettleInput = {\n readonly outcome: TelemetryOutcome;\n /** Named only where the caller genuinely knows better than the derivation below. */\n readonly stage?: TelemetryStage;\n readonly error?: unknown;\n /** Rows the operation is known to have produced or affected. */\n readonly rowCount?: number;\n};\n\n/**\n * Where a failure happened, derived from what actually ran — never guessed from\n * an error message. A caller that knows better passes `stage` explicitly.\n */\nfunction deriveStage(params: {\n outcome: TelemetryOutcome;\n kind: TelemetryOperationKind;\n dispatched: boolean;\n statementCount: number;\n failedStatements: number;\n code: VibeErrorCode | undefined;\n}): TelemetryStage {\n const { outcome, kind, dispatched, statementCount, failedStatements, code } = params;\n if (outcome === \"success\") return \"completed\";\n if (!dispatched) return \"refused\";\n if (failedStatements > 0) return \"statement\";\n // A transaction operation runs no statements of its OWN — its children do — so\n // an empty statement list is not evidence of a pre-SQL refusal here.\n if (kind === \"transaction\") return \"transaction\";\n if (statementCount === 0) return \"validation\";\n if (code === \"VIBE_TRANSACTION\") return \"transaction\";\n return \"decode\";\n}\n\n/** The per-operation handle the client threads through its engine. */\nexport type TelemetryOperationScope = {\n readonly id: string;\n /** False when sampling declined this operation: statements and the span are skipped, counters are not. */\n readonly sampled: boolean;\n /** Mark ACTUAL dispatch. Idempotent; the first call starts the operation clock. */\n readonly dispatch: () => void;\n /**\n * Re-attach this operation to the parent that actually executes it. An array\n * `$transaction` member is created in one context and executed by another;\n * the executing transaction is the truthful parent.\n */\n readonly reparent: (params: { parentOperationId: string }) => void;\n readonly statement: (input: TelemetryStatementInput) => void;\n /** Terminal outcome. Idempotent — only the first call emits. */\n readonly settle: (input: TelemetrySettleInput) => void;\n};\n\n/** One client's telemetry. */\nexport type TelemetryRecorder = {\n readonly config: ResolvedTelemetryConfig;\n readonly begin: (input: TelemetryBeginInput) => TelemetryOperationScope;\n /** Drain buffered operations and ask the exporter to flush. Never shuts anything down. */\n readonly flush: () => Promise<void>;\n /** Host-owned: drains, then calls `exporter.shutdown`. The client never calls this. */\n readonly shutdown: () => Promise<void>;\n readonly metrics: () => TelemetryMetricsSnapshot;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────\n\n/** Only a VibeError carries a stable code; anything else reports no code rather than a made-up one. */\nfunction errorCodeOf(error: unknown): VibeErrorCode | undefined {\n return error instanceof VibeError ? error.code : undefined;\n}\n\ntype MutableHistogram = { readonly counts: number[]; sum: number; count: number };\n\nfunction newHistogram(bounds: readonly number[]): MutableHistogram {\n return { counts: new Array<number>(bounds.length + 1).fill(0), sum: 0, count: 0 };\n}\n\nfunction observe(histogram: MutableHistogram, bounds: readonly number[], value: number): void {\n let bucket = bounds.length;\n for (let index = 0; index < bounds.length; index++) {\n if (value <= (bounds[index] as number)) {\n bucket = index;\n break;\n }\n }\n histogram.counts[bucket] = (histogram.counts[bucket] as number) + 1;\n histogram.sum += value;\n histogram.count += 1;\n}\n\nfunction freezeHistogram(histogram: MutableHistogram, bounds: readonly number[]): TelemetryHistogram {\n return { bounds, counts: [...histogram.counts], sum: histogram.sum, count: histogram.count };\n}\n\n// ─── Recorder ─────────────────────────────────────────────────────\n\n/**\n * Build a recorder from validated options.\n *\n * @throws VibeError VIBE_CONFIG when the options are invalid (see `resolveTelemetryConfig`).\n */\nexport function createTelemetryRecorder(params: { options: TelemetryOptions }): TelemetryRecorder {\n const config = resolveTelemetryConfig({ options: params.options });\n const exporter: TelemetryExporter = params.options.exporter;\n const onExporterError = params.options.onExporterError;\n const buckets = config.latencyBucketsMs;\n\n const prefix = Math.random().toString(36).slice(2, 10);\n let sequence = 0;\n\n let sampledOperations = 0;\n let totalOperations = 0;\n let failedOperations = 0;\n let refusedOperations = 0;\n let totalStatements = 0;\n let failedStatements = 0;\n let rowsKnown = 0;\n let rowsTotal = 0;\n let droppedOperations = 0;\n let droppedStatements = 0;\n const operationLatency = newHistogram(buckets);\n const statementLatency = newHistogram(buckets);\n const buffer: TelemetryOperationEvent[] = [];\n\n /** Every exporter entry point goes through here. A throw never escapes. */\n const guard = (phase: TelemetryExportPhase, run: () => void): void => {\n try {\n run();\n } catch (error) {\n if (onExporterError === undefined) return;\n try {\n onExporterError({ error, phase });\n } catch {\n // An error handler that throws is out of options; the query is unaffected.\n }\n }\n };\n\n /** The async twin of `guard`, for `flush`/`shutdown` which may return a promise. */\n const guardAsync = async (phase: TelemetryExportPhase, run: () => void | Promise<void>): Promise<void> => {\n try {\n await run();\n } catch (error) {\n if (onExporterError === undefined) return;\n try {\n onExporterError({ error, phase });\n } catch {\n // An error handler that throws is out of options; the query is unaffected.\n }\n }\n };\n\n const reportDrop = (event: TelemetryDropEvent): void => {\n const onDrop = exporter.onDrop;\n if (onDrop === undefined) return;\n guard(\"drop\", () => {\n onDrop(event);\n });\n };\n\n const deliver = (event: TelemetryOperationEvent): void => {\n if (config.delivery === \"buffered\") {\n buffer.push(event);\n if (buffer.length > config.maxBufferedOperations) {\n const dropped = buffer.length - config.maxBufferedOperations;\n buffer.splice(0, dropped);\n droppedOperations += dropped;\n reportDrop({ reason: \"buffer_full\", count: dropped });\n }\n return;\n }\n const onOperation = exporter.onOperation;\n if (onOperation === undefined) return;\n guard(\"operation\", () => {\n onOperation(event);\n });\n };\n\n const drain = (): void => {\n if (buffer.length === 0) return;\n const pending = buffer.splice(0, buffer.length);\n const onOperation = exporter.onOperation;\n if (onOperation === undefined) return;\n for (const event of pending) {\n guard(\"operation\", () => {\n onOperation(event);\n });\n }\n };\n\n const decideSampling = (input: TelemetryBeginInput, context: TelemetryParentContext): boolean => {\n const sampler = config.sampler;\n if (sampler !== undefined) {\n let keep = false;\n guard(\"sampler\", () => {\n keep = sampler({\n kind: input.kind,\n model: input.model,\n method: input.method,\n ...(context === undefined ? {} : { context }),\n });\n });\n return keep;\n }\n if (config.sampleRate >= 1) return true;\n if (config.sampleRate <= 0) return false;\n return Math.random() < config.sampleRate;\n };\n\n const begin = (input: TelemetryBeginInput): TelemetryOperationScope => {\n sequence += 1;\n const id = `${prefix}-${sequence}`;\n const createdAt = performance.now();\n\n let context: TelemetryParentContext;\n const readContext = config.context;\n if (readContext !== undefined) {\n guard(\"context\", () => {\n context = readContext();\n });\n }\n\n const sampled = decideSampling(input, context);\n if (sampled) sampledOperations += 1;\n\n const statements: TelemetryStatementEvent[] = [];\n let statementCount = 0;\n let failedStatementsHere = 0;\n let statementDurationMs = 0;\n let renderMs = 0;\n let renderMeasured = false;\n let statementsDroppedHere = 0;\n let startedAtEpoch: number | undefined;\n let startedAt: number | undefined;\n let settled = false;\n let parentOperationId = input.parentOperationId;\n\n const dispatch = (): void => {\n if (startedAt !== undefined) return;\n startedAt = performance.now();\n startedAtEpoch = Date.now();\n };\n\n const statement = (statementInput: TelemetryStatementInput): void => {\n // Counters cover every execution, sampled or not.\n totalStatements += 1;\n if (statementInput.outcome === \"failure\") {\n failedStatements += 1;\n failedStatementsHere += 1;\n }\n observe(statementLatency, buckets, statementInput.durationMs);\n\n statementCount += 1;\n statementDurationMs += statementInput.durationMs;\n if (statementInput.renderMs !== undefined) {\n renderMs += statementInput.renderMs;\n renderMeasured = true;\n }\n if (!sampled) return;\n if (statements.length >= config.maxStatementsPerOperation) {\n statementsDroppedHere += 1;\n droppedStatements += 1;\n reportDrop({ reason: \"statement_limit\", count: 1 });\n return;\n }\n const code = errorCodeOf(statementInput.error);\n const event: TelemetryStatementEvent = {\n operationId: id,\n index: statements.length,\n kind: statementInput.kind,\n model: statementInput.model,\n method: statementInput.method,\n dialect: input.dialect,\n provider: input.provider,\n fingerprint: queryFingerprint({\n model: statementInput.model,\n method: statementInput.method,\n text: statementInput.text,\n maxLength: config.maxFingerprintLength,\n }),\n outcome: statementInput.outcome,\n durationMs: statementInput.durationMs,\n parameterCount: statementInput.values.length,\n inTransaction: statementInput.inTransaction,\n ...(statementInput.rowCount === undefined ? {} : { rowCount: statementInput.rowCount }),\n ...(code === undefined ? {} : { errorCode: code }),\n ...(statementInput.durationMs >= config.slowStatementMs ? { slow: true } : {}),\n ...(config.captureSql ? { sql: statementInput.text } : {}),\n ...(config.captureParameterValues ? { parameters: [...statementInput.values] } : {}),\n };\n statements.push(event);\n const onStatement = exporter.onStatement;\n if (onStatement === undefined) return;\n guard(\"statement\", () => {\n onStatement(event);\n });\n };\n\n const settle = (settleInput: TelemetrySettleInput): void => {\n if (settled) return;\n settled = true;\n\n const dispatched = startedAt !== undefined;\n const durationMs = startedAt === undefined ? undefined : performance.now() - startedAt;\n\n // Counters cover every execution, sampled or not.\n totalOperations += 1;\n if (settleInput.outcome === \"failure\") failedOperations += 1;\n if (!dispatched) refusedOperations += 1;\n if (durationMs !== undefined) observe(operationLatency, buckets, durationMs);\n if (settleInput.rowCount !== undefined) {\n rowsKnown += 1;\n rowsTotal += settleInput.rowCount;\n }\n if (!sampled) return;\n\n const code = errorCodeOf(settleInput.error);\n const stage =\n settleInput.stage ??\n deriveStage({\n outcome: settleInput.outcome,\n kind: input.kind,\n dispatched,\n statementCount,\n failedStatements: failedStatementsHere,\n code,\n });\n let detail: TelemetryTimingDetail | undefined;\n if (config.detailedTimings) {\n const adapterMs = statementCount === 0 ? undefined : statementDurationMs;\n const processingMs =\n durationMs === undefined ? undefined : Math.max(0, durationMs - statementDurationMs);\n detail = {\n ...(renderMeasured ? { renderMs } : {}),\n ...(adapterMs === undefined ? {} : { adapterMs }),\n ...(processingMs === undefined ? {} : { processingMs }),\n };\n }\n\n const event: TelemetryOperationEvent = {\n operationId: id,\n ...(parentOperationId === undefined ? {} : { parentOperationId }),\n ...(context === undefined ? {} : { context }),\n kind: input.kind,\n model: input.model,\n method: input.method,\n dialect: input.dialect,\n provider: input.provider,\n outcome: settleInput.outcome,\n stage,\n dispatched,\n ...(startedAtEpoch === undefined ? {} : { startedAt: startedAtEpoch }),\n ...(durationMs === undefined ? {} : { durationMs }),\n ...(startedAt === undefined ? {} : { queueWaitMs: startedAt - createdAt }),\n statementCount,\n ...(statementCount === 0 ? {} : { statementDurationMs }),\n ...(settleInput.rowCount === undefined ? {} : { rowCount: settleInput.rowCount }),\n ...(code === undefined ? {} : { errorCode: code }),\n ...(detail === undefined ? {} : { detail }),\n statements: [...statements],\n ...(statementsDroppedHere === 0 ? {} : { droppedStatements: statementsDroppedHere }),\n ...(durationMs !== undefined && durationMs >= config.slowOperationMs ? { slow: true } : {}),\n sampled: true,\n };\n deliver(event);\n };\n\n const reparent = (reparentParams: { parentOperationId: string }): void => {\n if (settled) return;\n parentOperationId = reparentParams.parentOperationId;\n };\n\n return { id, sampled, dispatch, reparent, statement, settle };\n };\n\n const flush = async (): Promise<void> => {\n drain();\n const exporterFlush = exporter.flush;\n if (exporterFlush === undefined) return;\n await guardAsync(\"flush\", () => exporterFlush());\n };\n\n const recorder: TelemetryRecorder = {\n config,\n begin,\n flush,\n shutdown: async (): Promise<void> => {\n await flush();\n const exporterShutdown = exporter.shutdown;\n if (exporterShutdown === undefined) return;\n await guardAsync(\"shutdown\", () => exporterShutdown());\n },\n metrics: (): TelemetryMetricsSnapshot => ({\n countsRepresent: \"all\",\n sampleRate: config.sampleRate,\n sampledOperations,\n operations: { total: totalOperations, failed: failedOperations, refused: refusedOperations },\n statements: { total: totalStatements, failed: failedStatements },\n rows: { known: rowsKnown, total: rowsTotal },\n operationLatencyMs: freezeHistogram(operationLatency, buckets),\n statementLatencyMs: freezeHistogram(statementLatency, buckets),\n dropped: { operations: droppedOperations, statements: droppedStatements },\n }),\n };\n\n const onReady = params.options.onReady;\n if (onReady !== undefined) {\n guard(\"operation\", () => {\n onReady({ metrics: recorder.metrics, flush: recorder.flush, shutdown: recorder.shutdown });\n });\n }\n return recorder;\n}\n",
35
+ "/**\n * THE telemetry config module (EPIC 1). Every threshold, limit and sampling\n * default lives here and nowhere else — no magic literal for telemetry may\n * appear in the recorder, the client or an adapter.\n *\n * Invalid configuration fails loudly at client construction with\n * `VIBE_CONFIG`, not silently at the first query.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { TelemetryDelivery, TelemetryOptions, TelemetrySamplerInput } from \"./types.ts\";\n\n// ─── Defaults ─────────────────────────────────────────────────────\n\n/** Documented defaults. Privacy-conservative: nothing sensitive is captured unless asked for. */\nexport type TelemetryDefaults = {\n readonly captureSql: false;\n readonly captureParameterValues: false;\n readonly detailedTimings: false;\n readonly sampleRate: 1;\n readonly delivery: \"immediate\";\n readonly maxBufferedOperations: 1024;\n readonly maxStatementsPerOperation: 256;\n readonly slowStatementMs: 200;\n readonly slowOperationMs: 500;\n /** Longest fingerprint kept; longer normalized text is truncated with a stable suffix. */\n readonly maxFingerprintLength: 512;\n /** Histogram bucket bounds in milliseconds (upper-inclusive), plus an overflow bucket. */\n readonly latencyBucketsMs: readonly [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000];\n};\n\nexport const TELEMETRY_DEFAULTS: TelemetryDefaults = Object.freeze({\n captureSql: false,\n captureParameterValues: false,\n detailedTimings: false,\n sampleRate: 1,\n delivery: \"immediate\",\n maxBufferedOperations: 1024,\n maxStatementsPerOperation: 256,\n slowStatementMs: 200,\n slowOperationMs: 500,\n maxFingerprintLength: 512,\n latencyBucketsMs: Object.freeze([1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]) as readonly [\n 1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000,\n ],\n});\n\n// ─── Resolution ───────────────────────────────────────────────────\n\n/** Every option resolved to a concrete value — what the recorder reads. */\nexport type ResolvedTelemetryConfig = {\n readonly captureSql: boolean;\n readonly captureParameterValues: boolean;\n readonly detailedTimings: boolean;\n readonly sampleRate: number;\n readonly sampler?: (input: TelemetrySamplerInput) => boolean;\n readonly context?: () => unknown;\n readonly delivery: TelemetryDelivery;\n readonly maxBufferedOperations: number;\n readonly maxStatementsPerOperation: number;\n readonly slowStatementMs: number;\n readonly slowOperationMs: number;\n readonly maxFingerprintLength: number;\n readonly latencyBucketsMs: readonly number[];\n};\n\nfunction configError(params: { message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({\n code: \"VIBE_CONFIG\",\n message: `telemetry: ${params.message}`,\n ...(params.meta === undefined ? {} : { meta: params.meta }),\n });\n}\n\nfunction positiveInteger(params: { name: string; value: number | undefined; fallback: number }): number {\n const { name, value, fallback } = params;\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < 1) {\n throw configError({ message: `${name} must be a positive integer, received ${String(value)}`, meta: { option: name } });\n }\n return value;\n}\n\nfunction nonNegativeNumber(params: { name: string; value: number | undefined; fallback: number }): number {\n const { name, value, fallback } = params;\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value < 0) {\n throw configError({ message: `${name} must be a finite number >= 0, received ${String(value)}`, meta: { option: name } });\n }\n return value;\n}\n\n/**\n * Validate and resolve `ClientOptions.telemetry`.\n *\n * @throws VibeError VIBE_CONFIG when the exporter is missing, the sample rate is\n * outside 0..1, a limit is not a positive integer, a threshold is negative, or\n * `delivery` is not one of the two documented modes.\n */\nexport function resolveTelemetryConfig(params: { options: TelemetryOptions }): ResolvedTelemetryConfig {\n const { options } = params;\n if (options.exporter === undefined || options.exporter === null || typeof options.exporter !== \"object\") {\n throw configError({ message: \"an exporter is required — telemetry has nowhere to send events without one\" });\n }\n const sampleRate = options.sampleRate ?? TELEMETRY_DEFAULTS.sampleRate;\n if (!Number.isFinite(sampleRate) || sampleRate < 0 || sampleRate > 1) {\n throw configError({ message: `sampleRate must be between 0 and 1, received ${String(sampleRate)}`, meta: { option: \"sampleRate\" } });\n }\n const delivery = options.delivery ?? TELEMETRY_DEFAULTS.delivery;\n if (delivery !== \"immediate\" && delivery !== \"buffered\") {\n throw configError({ message: `delivery must be \"immediate\" or \"buffered\", received ${JSON.stringify(delivery)}`, meta: { option: \"delivery\" } });\n }\n return {\n captureSql: options.captureSql ?? TELEMETRY_DEFAULTS.captureSql,\n captureParameterValues: options.captureParameterValues ?? TELEMETRY_DEFAULTS.captureParameterValues,\n detailedTimings: options.detailedTimings ?? TELEMETRY_DEFAULTS.detailedTimings,\n sampleRate,\n ...(options.sampler === undefined ? {} : { sampler: options.sampler }),\n ...(options.context === undefined ? {} : { context: options.context }),\n delivery,\n maxBufferedOperations: positiveInteger({\n name: \"maxBufferedOperations\",\n value: options.maxBufferedOperations,\n fallback: TELEMETRY_DEFAULTS.maxBufferedOperations,\n }),\n maxStatementsPerOperation: positiveInteger({\n name: \"maxStatementsPerOperation\",\n value: options.maxStatementsPerOperation,\n fallback: TELEMETRY_DEFAULTS.maxStatementsPerOperation,\n }),\n slowStatementMs: nonNegativeNumber({\n name: \"slowStatementMs\",\n value: options.slowStatementMs,\n fallback: TELEMETRY_DEFAULTS.slowStatementMs,\n }),\n slowOperationMs: nonNegativeNumber({\n name: \"slowOperationMs\",\n value: options.slowOperationMs,\n fallback: TELEMETRY_DEFAULTS.slowOperationMs,\n }),\n maxFingerprintLength: TELEMETRY_DEFAULTS.maxFingerprintLength,\n latencyBucketsMs: TELEMETRY_DEFAULTS.latencyBucketsMs,\n };\n}\n",
36
+ "/**\n * The single statement-instrumentation seam.\n *\n * Every SQL execution in the client goes through here so that the legacy\n * `onQuery` / `$on(\"query\")` contract and the new telemetry path are reported\n * from ONE place with unchanged semantics:\n *\n * - the legacy report still fires only after the adapter SUCCEEDS, before row\n * materialization, with the same payload it always had;\n * - telemetry additionally records FAILED statements, which the legacy path\n * has never seen;\n * - with neither observer present nothing is measured at all — no clock read,\n * no allocation.\n */\n\nimport type { TelemetryOperationScope, TelemetryStatementInput } from \"./recorder.ts\";\nimport type { TelemetryStatementKind } from \"./types.ts\";\n\n/**\n * The legacy per-statement payload. Structurally identical to the client's\n * `QueryEvent`; declared here so the telemetry module never imports the client\n * (which imports this one).\n */\nexport type StatementReport = {\n readonly model: string | null;\n readonly method: string;\n readonly text: string;\n readonly values: readonly unknown[];\n readonly durationMs: number;\n};\n\n/** What `instrumentStatement` needs; `run` is the adapter call itself. */\nexport type InstrumentStatementInput<T> = {\n readonly scope: TelemetryOperationScope | undefined;\n /** Legacy `onQuery`/`$on` sink, or `undefined` when nobody is listening. */\n readonly legacy: ((report: StatementReport) => void) | undefined;\n readonly kind: TelemetryStatementKind;\n readonly model: string | null;\n readonly method: string;\n readonly text: string;\n readonly values: readonly unknown[];\n readonly inTransaction: boolean;\n /** Rendering time for this statement, when it was measured. */\n readonly renderMs?: number;\n /** Reads a known row count off the adapter result; return `undefined` when unknowable. */\n readonly rowCount?: (value: T) => number | undefined;\n readonly run: () => Promise<T>;\n};\n\n/**\n * Run one statement with observation attached.\n *\n * The adapter's own result and its rejection are passed through untouched: an\n * observer can never change what a query returns or whether it fails.\n */\nexport async function instrumentStatement<T>(params: InstrumentStatementInput<T>): Promise<T> {\n const { scope, legacy, run } = params;\n if (scope === undefined && legacy === undefined) return await run();\n\n const started = performance.now();\n let value: T;\n try {\n value = await run();\n } catch (error) {\n if (scope !== undefined) {\n const failure: TelemetryStatementInput = {\n kind: params.kind,\n model: params.model,\n method: params.method,\n text: params.text,\n values: params.values,\n inTransaction: params.inTransaction,\n durationMs: performance.now() - started,\n outcome: \"failure\",\n error,\n ...(params.renderMs === undefined ? {} : { renderMs: params.renderMs }),\n };\n scope.statement(failure);\n }\n throw error;\n }\n const durationMs = performance.now() - started;\n legacy?.({\n model: params.model,\n method: params.method,\n text: params.text,\n values: params.values,\n durationMs,\n });\n if (scope !== undefined) {\n const rowCount = params.rowCount?.(value);\n const success: TelemetryStatementInput = {\n kind: params.kind,\n model: params.model,\n method: params.method,\n text: params.text,\n values: params.values,\n inTransaction: params.inTransaction,\n durationMs,\n outcome: \"success\",\n ...(rowCount === undefined ? {} : { rowCount }),\n ...(params.renderMs === undefined ? {} : { renderMs: params.renderMs }),\n };\n scope.statement(success);\n }\n return value;\n}\n",
37
+ "/**\n * Bounded-memory export: a sequential async iterator over keyset pages.\n *\n * One page is held at a time and the next one is fetched only when the\n * consumer asks for a row the buffer cannot serve. There is no prefetch, no\n * look-ahead and no unbounded accumulation — `pagesFetched()` is the receipt.\n *\n * What this deliberately is NOT:\n * - **not a snapshot.** No transaction is opened, so the traversal is a LIVE\n * view: concurrent inserts, deletes and sort-key updates change what a\n * later page sees. A row that moves behind the position is missed; one\n * that moves ahead of it is seen twice. A consistent export means running\n * the whole iteration inside `$transaction` at an explicit isolation\n * level, paying its connection and deadline cost — never a secretly\n * long-lived transaction.\n * - **not exactly-once.** `checkpoint()` records the last row the consumer\n * came BACK for, so a `break` or an exception leaves the in-flight row\n * uncheckpointed and resuming re-delivers it. At-least-once. The consumer\n * owns acknowledgement and de-duplication; this is not a durable job\n * engine.\n * - **not statement cancellation.** Aborting the signal stops FUTURE page\n * fetches. A page query already in flight keeps running: per EPIC 6 only\n * `adapter-pg` / `adapter-bun` can cancel a running statement, and only\n * inside a transaction carrying a deadline — which this iterator does not\n * open.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport {\n KEYSET_MAX_PAGE_SIZE,\n compileKeysetOrderPlan,\n decodeKeysetToken,\n encodeKeysetToken,\n keysetRowIsAfter,\n keysetRowValues,\n} from \"./keyset.ts\";\nimport type { KeysetOrderPlan, KeysetTimestampPrecision } from \"./keyset.ts\";\nimport { getModelMeta } from \"./model-meta.ts\";\nimport type { RuntimeMeta } from \"./model-meta.ts\";\nimport { compileKeysetOrderInputs } from \"./query-builder.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/** The one method this iterator needs — a model delegate satisfies it. */\nexport type KeysetPageSource = {\n readonly findMany: (args: Record<string, unknown>) => Promise<Record<string, unknown>[]>;\n};\n\nexport type KeysetIterateOptions = {\n readonly source: KeysetPageSource;\n readonly meta: RuntimeMeta;\n readonly dialect: SqlDialect;\n readonly model: string;\n readonly orderBy: unknown;\n /** Bounded and required, 1…{@link KEYSET_MAX_PAGE_SIZE}. There is no unbounded default. */\n readonly pageSize: number;\n readonly where?: Record<string, unknown>;\n readonly select?: Record<string, unknown>;\n readonly omit?: Record<string, unknown>;\n readonly include?: Record<string, unknown>;\n /** Resume from a checkpoint minted by a previous run over the SAME ordering. */\n readonly after?: string;\n /** Consumer cancellation: stops future page fetches; ends iteration cleanly. */\n readonly signal?: AbortSignal;\n readonly timestampPrecision?: KeysetTimestampPrecision;\n};\n\nexport type KeysetIterator = AsyncIterableIterator<Record<string, unknown>> & {\n /** Always present: `break` and an exception both have to be able to release the traversal. */\n readonly return: (value?: unknown) => Promise<IteratorResult<Record<string, unknown>>>;\n readonly throw: (error?: unknown) => Promise<IteratorResult<Record<string, unknown>>>;\n /** Token for the last SUCCESSFULLY CONSUMED row; `null` before the first one settles. */\n readonly checkpoint: () => string | null;\n /** Pages fetched so far — the bounded-fetch receipt. */\n readonly pagesFetched: () => number;\n /** True when the signal aborted the traversal. */\n readonly cancelled: () => boolean;\n};\n\n// ─── Implementation ───────────────────────────────────────────────\n\nfunction validation(params: { message: string; meta: Record<string, unknown> }): VibeError {\n return new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n/**\n * Order fields the page must fetch but the caller did not ask for, plus the\n * projection arguments that carry them. They ride the SQL projection like a\n * stitch key and are deleted from every yielded row, so the payload is exactly\n * what `select`/`omit` asked for and no caller ever selects a private\n * ordering field to paginate.\n */\nfunction projectionFor(params: {\n plan: KeysetOrderPlan;\n select: Record<string, unknown> | undefined;\n omit: Record<string, unknown> | undefined;\n}): { select?: Record<string, unknown>; omit?: Record<string, unknown>; hidden: readonly string[] } {\n const { plan, select, omit } = params;\n const names = plan.keys.map((key) => key.field.name);\n if (select !== undefined) {\n const hidden = names.filter((name) => select[name] !== true);\n if (hidden.length === 0) return { select, hidden };\n const widened: Record<string, unknown> = { ...select };\n for (const name of hidden) widened[name] = true;\n return { select: widened, hidden };\n }\n if (omit !== undefined) {\n const hidden = names.filter((name) => omit[name] === true);\n if (hidden.length === 0) return { omit, hidden };\n const narrowed: Record<string, unknown> = { ...omit };\n for (const name of hidden) narrowed[name] = false;\n return { omit: narrowed, hidden };\n }\n return { hidden: [] };\n}\n\n/**\n * Iterate a model in keyset order, one bounded page at a time.\n *\n * @example\n * const rows = iterateKeyset({ source: db.$models.product, meta, dialect,\n * model: \"Product\", orderBy: [{ price: \"asc\" }, { id: \"asc\" }], pageSize: 500 });\n * for await (const row of rows) { … }\n * const resumeFrom = rows.checkpoint();\n */\nexport function iterateKeyset(options: KeysetIterateOptions): KeysetIterator {\n const { source, meta, dialect, orderBy, pageSize, signal } = options;\n if (!Number.isSafeInteger(pageSize) || pageSize < 1 || pageSize > KEYSET_MAX_PAGE_SIZE) {\n throw validation({\n message: `keyset pageSize must be an integer between 1 and ${KEYSET_MAX_PAGE_SIZE}, got ${String(pageSize)}`,\n meta: { model: options.model, pageSize, reason: \"keyset-page-size\" },\n });\n }\n const model = getModelMeta({ meta, model: options.model });\n const plan = compileKeysetOrderPlan({\n model,\n dialect,\n terms: compileKeysetOrderInputs({ dialect, meta, model, orderBy }),\n ...(options.timestampPrecision === undefined ? {} : { timestampPrecision: options.timestampPrecision }),\n });\n const projection = projectionFor({ plan, select: options.select, omit: options.omit });\n const keysetArg =\n options.timestampPrecision === undefined ? {} : { keyset: { timestampPrecision: options.timestampPrecision } };\n\n let buffer: Record<string, unknown>[] = [];\n let position: string | null = options.after ?? null;\n let consumed: string | null = null;\n let pending: string | null = null;\n let exhausted = false;\n let finished = false;\n let aborted = false;\n let pages = 0;\n let tail: Promise<unknown> = Promise.resolve();\n\n const stop = (): void => {\n finished = true;\n exhausted = true;\n buffer = [];\n };\n\n const fetchPage = async (): Promise<void> => {\n const rows = await source.findMany({\n ...(options.where === undefined ? {} : { where: options.where }),\n ...(projection.select === undefined ? {} : { select: projection.select }),\n ...(projection.omit === undefined ? {} : { omit: projection.omit }),\n ...(options.include === undefined ? {} : { include: options.include }),\n ...keysetArg,\n orderBy,\n take: pageSize,\n ...(position === null ? {} : { after: position }),\n });\n pages++;\n // LIVENESS: a page whose first row does not sort strictly after the\n // position it was fetched from means the traversal is not advancing —\n // a non-total ordering, or a lossy cursor value (a sub-millisecond\n // timestamp asserted to be millisecond-exact does exactly this). Without\n // this check that situation is an infinite page loop, which is a far worse\n // failure than a typed error. Inconclusive comparisons (collated strings)\n // never raise it.\n const first = rows[0];\n if (position !== null && first !== undefined) {\n const advanced = keysetRowIsAfter({\n keys: plan.keys,\n row: keysetRowValues({ plan, row: first }),\n position: decodeKeysetToken({ plan, token: position }),\n });\n if (advanced === false) {\n stop();\n throw new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message:\n `keyset traversal of \"${options.model}\" is not advancing: the engine returned a row that does not sort after the previous position. ` +\n \"The ordering is not total, or a cursor value lost precision — a DateTime column finer than milliseconds asserted as millisecond-exact does this.\",\n meta: { model: options.model, order: plan.signature, reason: \"keyset-position-not-advancing\" },\n });\n }\n }\n buffer = [...rows];\n // A short page is the end of the sequence: no further fetch is possible,\n // so the iterator never issues a \"one more, just in case\" query.\n if (rows.length < pageSize) exhausted = true;\n };\n\n const step = async (): Promise<IteratorResult<Record<string, unknown>>> => {\n // A row counts as CONSUMED once the consumer comes back for the next one.\n if (pending !== null) {\n consumed = pending;\n pending = null;\n }\n if (finished) return { done: true, value: undefined };\n if (signal?.aborted === true) {\n aborted = true;\n stop();\n return { done: true, value: undefined };\n }\n if (buffer.length === 0) {\n if (exhausted) {\n finished = true;\n return { done: true, value: undefined };\n }\n await fetchPage();\n if (buffer.length === 0) {\n finished = true;\n return { done: true, value: undefined };\n }\n }\n const raw = buffer.shift() as Record<string, unknown>;\n pending = encodeKeysetToken({ plan, row: raw });\n position = pending;\n if (projection.hidden.length === 0) return { done: false, value: raw };\n const shaped: Record<string, unknown> = { ...raw };\n for (const name of projection.hidden) delete shaped[name];\n return { done: false, value: shaped };\n };\n\n const serialize = (run: () => Promise<IteratorResult<Record<string, unknown>>>) => {\n const next = tail.then(run, run);\n tail = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n };\n\n const iterator: KeysetIterator = {\n [Symbol.asyncIterator](): KeysetIterator {\n return iterator;\n },\n next: (): Promise<IteratorResult<Record<string, unknown>>> => serialize(step),\n return: (): Promise<IteratorResult<Record<string, unknown>>> =>\n serialize(async () => {\n stop();\n return { done: true, value: undefined };\n }),\n throw: (error?: unknown): Promise<IteratorResult<Record<string, unknown>>> =>\n serialize(async () => {\n stop();\n throw error;\n }),\n checkpoint: (): string | null => consumed,\n pagesFetched: (): number => pages,\n cancelled: (): boolean => aborted,\n };\n return iterator;\n}\n",
38
+ "/**\n * An in-memory collector — the ONLY exporter this repository ships.\n *\n * Its purpose is tests and local inspection: assert the emitted operation tree,\n * the statement records and the database outcome together. It is deliberately\n * not a monitoring integration; a real deployment writes its own exporter (or a\n * future, separately decided OpenTelemetry bridge).\n *\n * `throwOn` makes it hostile on demand — the fixture that proves a throwing\n * exporter cannot change a database outcome.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type {\n TelemetryDropEvent,\n TelemetryExportPhase,\n TelemetryExporter,\n TelemetryOperationEvent,\n TelemetryStatementEvent,\n} from \"./types.ts\";\n\n/** One operation with the operations that ran inside it. */\nexport type TelemetryOperationNode = {\n readonly event: TelemetryOperationEvent;\n readonly children: readonly TelemetryOperationNode[];\n};\n\n/** The collector handle: the exporter to pass to the client, plus what it saw. */\nexport type TelemetryCollector = {\n /** Pass this as `telemetry.exporter`. */\n readonly exporter: TelemetryExporter;\n readonly operations: readonly TelemetryOperationEvent[];\n readonly statements: readonly TelemetryStatementEvent[];\n readonly drops: readonly TelemetryDropEvent[];\n readonly flushes: () => number;\n readonly shutdowns: () => number;\n readonly reset: () => void;\n /** Operations as a parent/child tree, roots first, each level in emission order. */\n readonly tree: () => readonly TelemetryOperationNode[];\n /** Every operation whose `parentOperationId` is the given id, in emission order. */\n readonly childrenOf: (params: { operationId: string }) => readonly TelemetryOperationEvent[];\n /** The single operation for a model method, or `undefined`; throws VIBE_VALIDATION when several match. */\n readonly operationFor: (params: { model?: string; method: string }) => TelemetryOperationEvent | undefined;\n};\n\n/**\n * Build a collector.\n *\n * @example\n * const collector = createTelemetryCollector();\n * const db = VibeClient({ adapter, telemetry: { exporter: collector.exporter } });\n * await db.user.findMany();\n * expect(collector.operations).toHaveLength(1);\n */\nexport function createTelemetryCollector(params?: {\n /** Callbacks that inject VIBE_INTERNAL, to prove the database outcome does not depend on the exporter. */\n readonly throwOn?: readonly TelemetryExportPhase[];\n}): TelemetryCollector {\n const throwOn = new Set<TelemetryExportPhase>(params?.throwOn ?? []);\n const operations: TelemetryOperationEvent[] = [];\n const statements: TelemetryStatementEvent[] = [];\n const drops: TelemetryDropEvent[] = [];\n let flushes = 0;\n let shutdowns = 0;\n\n const hostile = (phase: TelemetryExportPhase): void => {\n if (throwOn.has(phase)) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: `telemetry collector: deliberate ${phase} failure`,\n meta: { reason: \"telemetry-collector-deliberate-failure\", phase },\n });\n }\n };\n\n const exporter: TelemetryExporter = {\n onOperation: (event: TelemetryOperationEvent): void => {\n operations.push(event);\n hostile(\"operation\");\n },\n onStatement: (event: TelemetryStatementEvent): void => {\n statements.push(event);\n hostile(\"statement\");\n },\n onDrop: (event: TelemetryDropEvent): void => {\n drops.push(event);\n hostile(\"drop\");\n },\n flush: (): void => {\n flushes += 1;\n hostile(\"flush\");\n },\n shutdown: (): void => {\n shutdowns += 1;\n hostile(\"shutdown\");\n },\n };\n\n const childrenOf = (childParams: { operationId: string }): readonly TelemetryOperationEvent[] =>\n operations.filter((event) => event.parentOperationId === childParams.operationId);\n\n const build = (event: TelemetryOperationEvent): TelemetryOperationNode => ({\n event,\n children: childrenOf({ operationId: event.operationId }).map(build),\n });\n\n return {\n exporter,\n operations,\n statements,\n drops,\n flushes: (): number => flushes,\n shutdowns: (): number => shutdowns,\n reset: (): void => {\n operations.length = 0;\n statements.length = 0;\n drops.length = 0;\n flushes = 0;\n shutdowns = 0;\n },\n tree: (): readonly TelemetryOperationNode[] => {\n const ids = new Set(operations.map((event) => event.operationId));\n return operations\n .filter((event) => event.parentOperationId === undefined || !ids.has(event.parentOperationId))\n .map(build);\n },\n childrenOf,\n operationFor: (lookup: { model?: string; method: string }): TelemetryOperationEvent | undefined => {\n const matches = operations.filter(\n (event) => event.method === lookup.method && (lookup.model === undefined || event.model === lookup.model),\n );\n if (matches.length > 1) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `telemetry collector: ${matches.length} operations match ${lookup.model ?? \"*\"}.${lookup.method}`,\n meta: {\n reason: \"telemetry-collector-ambiguous-operation\",\n ...(lookup.model === undefined ? {} : { model: lookup.model }),\n method: lookup.method,\n matches: matches.length,\n },\n });\n }\n return matches[0];\n },\n };\n}\n"
16
39
  ],
17
- "mappings": "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",
18
- "debugId": "E85807B9EEEC573F64756E2164756E21",
40
+ "mappings": "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",
41
+ "debugId": "933EF9F58AC0667F64756E2164756E21",
19
42
  "names": []
20
43
  }