@vibeorm/runtime 2.0.0-alpha.7 → 2.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/adapter.ts", "../src/db-now.ts", "../src/model-meta.ts", "../src/codecs.ts", "../src/query-builder.ts", "../src/relation-plan.ts", "../src/relation-loader.ts", "../src/computed.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/relation-plan.ts", "../src/relation-loader.ts", "../src/computed.ts", "../src/nested-writes.ts", "../src/extensions.ts", "../src/views.ts", "../src/validators.ts", "../src/policy.ts", "../src/client.ts", "../src/render-cache.ts"],
4
4
  "sourcesContent": [
5
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 /**\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
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, isEnumType, validateComputedConfig } from \"@vibeorm/schema\";\nimport type {\n ComputedConfig,\n ComputedFieldSpec,\n DefaultValueIR,\n FieldIR,\n FieldType,\n ModelIR,\n RelationIR,\n ScalarType,\n SchemaIR,\n} 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/** 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 /** 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: { 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: {\n model: ModelIR;\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({ 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, 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 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 models = schema.models.map((model) => {\n const specs = computed?.[model.name];\n return buildModelMeta({ model, ...(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",
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, isEnumType, validateComputedConfig } from \"@vibeorm/schema\";\nimport type {\n ComputedConfig,\n ComputedFieldSpec,\n DefaultValueIR,\n FieldIR,\n FieldType,\n ModelIR,\n RelationIR,\n ScalarType,\n SchemaIR,\n} 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 /** Explicit column collation (@collation, board #36) — mysql insensitive-filter rendering reads it. */\n readonly collation?: 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/** 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: { field: FieldIR }): FieldMeta {\n // (collation spread below rides the same shape as the other optionals)\n const { field } = params;\n const enumRef = isEnumType(field.type);\n return {\n name: field.name,\n columnName: field.dbName ?? field.name,\n ...(field.collation === undefined ? {} : { collation: field.collation }),\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: {\n model: ModelIR;\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({ 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, 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 models = schema.models.map((model) => {\n const specs = computed?.[model.name];\n return buildModelMeta({ model, ...(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
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// ─── 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",
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 jsonParamCell,\n startsWithPattern,\n} from \"@vibeorm/sql\";\nimport type {\n AggRef,\n AggSelect,\n ColRef,\n JsonFilterOp,\n LateralJoin,\n OnConflictClause,\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 { 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 { 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 /**\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 /** 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\", \"lock\"],\n findFirst: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"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 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 /** 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: 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 });\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 */\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 // 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/** 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}): 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 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\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 // 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 }\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 \"update\":\n case \"updateMany\": {\n const isUnique = method === \"update\";\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 refetchWhere: isUnique ? overlayRefetchWhere({ 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 ...(isUnique ? { 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",
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 jsonParamCell,\n startsWithPattern,\n} from \"@vibeorm/sql\";\nimport type {\n AggRef,\n AggSelect,\n ColRef,\n JsonFilterOp,\n LateralJoin,\n OnConflictClause,\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 { 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 { 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 /**\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 /** 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\", \"lock\"],\n findFirst: [\"where\", \"orderBy\", \"take\", \"skip\", \"cursor\", \"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 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 */\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 // 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/** 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}): 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 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\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 // 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 }\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 \"update\":\n case \"updateMany\": {\n const isUnique = method === \"update\";\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 refetchWhere: isUnique ? overlayRefetchWhere({ 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 ...(isUnique ? { 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
10
  "/**\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 /** 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/** 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 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 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 // 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 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 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 = 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",
11
11
  "/**\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 { applyComputedFields } from \"./computed.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/** 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 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",
12
12
  "/**\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",
13
13
  "/**\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",
14
14
  "/**\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",
15
15
  "/**\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",
16
- "/**\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 { 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\";\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 | 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 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 /** 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};\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, 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 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 // `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 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 /**\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 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) {\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 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, 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 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 /** 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 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, 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 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 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 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 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 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 | null> => 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, inTransaction: true };\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, inTransaction: true } }),\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 /** 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\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 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",
16
+ "/**\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 * Validate one data row (create/update shape) for `model`, recursing into\n * nested `create`/`createMany`/`connectOrCreate.create`/`upsert.create` and\n * nested `update` bodies on related models that carry validators. Returns the\n * (possibly transformed) data — Standard Schema allows coercion.\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 // Atomic operators ({ set: v }) validate the inner value.\n const isOperator =\n typeof value === \"object\" && value !== null && !Array.isArray(value) && \"set\" in (value as object);\n if (isOperator) {\n const inner = (value as { set: unknown }).set;\n out[key] = { set: validateValue({ model: model.name, field: key, schema, value: inner }) };\n } else {\n out[key] = validateValue({ model: model.name, field: key, schema, value });\n }\n continue;\n }\n\n // Nested relation writes: recurse into bodies that CREATE or UPDATE rows.\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 || validators[target.name] === undefined) continue;\n\n const verbs = value as Record<string, unknown>;\n const recurse = (row: unknown): unknown =>\n typeof row === \"object\" && row !== null\n ? validateWriteData({ meta, model: target, data: row as Record<string, unknown>, validators })\n : row;\n const next: Record<string, unknown> = { ...verbs };\n if (verbs.create !== undefined) {\n next.create = Array.isArray(verbs.create) ? verbs.create.map(recurse) : recurse(verbs.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 const pair = entry as { where: unknown; create: unknown };\n return { ...pair, create: recurse(pair.create) };\n });\n next.connectOrCreate = Array.isArray(verbs.connectOrCreate) ? mapped : mapped[0];\n }\n if (verbs.update !== undefined && !Array.isArray(verbs.update)) {\n const body = verbs.update as { where?: unknown; data?: unknown };\n next.update = body.data !== undefined ? { ...body, data: recurse(body.data) } : recurse(body);\n }\n if (verbs.upsert !== undefined && !Array.isArray(verbs.upsert)) {\n const body = verbs.upsert as { where: unknown; create: unknown; update: unknown };\n next.upsert = { ...body, create: recurse(body.create), update: recurse(body.update) };\n }\n out[key] = next;\n }\n return out;\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 (method === \"create\" || method === \"update\" || method === \"updateMany\") {\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",
17
+ "/**\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\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/** Scope policied child models inside include/select relation args, any depth. */\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 for (const key of [\"include\", \"select\"] as const) {\n const block = args[key];\n if (typeof block !== \"object\" || block === null) continue;\n const next: ClientRow = { ...(block as ClientRow) };\n for (const [name, spec] of Object.entries(block as ClientRow)) {\n const relation = model.relationByName.get(name);\n if (relation === undefined) continue;\n const target = meta.modelByName.get(relation.targetModel);\n if (target?.policy === undefined) continue;\n const value = context[target.policy.context] as PolicyContextValue;\n const spec2: ClientRow = spec === true ? {} : { ...(spec as ClientRow) };\n spec2.where = mergeWhere({ where: spec2.where, field: target.policy.field, value });\n next[name] = scopeSelection({ meta, model: target, args: spec2, context });\n }\n out[key] = next;\n }\n return out;\n}\n\nconst REFERENCE_VERBS = [\"connect\", \"connectOrCreate\", \"set\", \"disconnect\", \"update\", \"updateMany\", \"delete\", \"deleteMany\", \"upsert\"];\n\n/** Force the context into create data; recurse into nested creates; refuse reference verbs on policied children. */\nfunction forceCreateData(params: {\n meta: RuntimeMeta;\n model: ModelMeta;\n data: ClientRow;\n context: PolicyContext;\n}): ClientRow {\n const { meta, model, data, context } = params;\n const out: ClientRow = { ...data };\n if (model.policy !== undefined) {\n const value = context[model.policy.context] as PolicyContextValue;\n const given = data[model.policy.field];\n if (given !== undefined && given !== value) {\n throw policyError(\n `create on ${model.name}: data.${model.policy.field} conflicts with the bound policy context`,\n { model: model.name, field: model.policy.field },\n );\n }\n out[model.policy.field] = value;\n }\n for (const [name, spec] of Object.entries(data)) {\n const relation = model.relationByName.get(name);\n if (relation === undefined || typeof spec !== \"object\" || spec === null) continue;\n const target = meta.modelByName.get(relation.targetModel);\n if (target?.policy === undefined) continue;\n const verbs = spec as ClientRow;\n for (const verb of REFERENCE_VERBS) {\n if (verbs[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 if (verbs.create !== undefined) {\n const recurse = (row: unknown): unknown =>\n forceCreateData({ meta, model: target, data: row as ClientRow, context });\n out[name] = { ...verbs, create: Array.isArray(verbs.create) ? verbs.create.map(recurse) : recurse(verbs.create) };\n }\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 transaction: DynamicClient[\"$transaction\"];\n}): ModelDelegate {\n const { meta, model, base, context, transaction } = params;\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 = scopeSelection({ 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 = scopeSelection({ meta, model, args, context });\n const flat = uniqueToFilter({ model, where: (args.where ?? {}) as ClientRow });\n return { ...scoped, where: mergeWhere({ where: flat, field: policy.field, value }) };\n };\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 = <T>(args: ClientRow, write: (raw: DynamicClient, pkWhere: ClientRow) => Promise<T>): Promise<T | null> =>\n transaction(async (tx) => {\n const raw = tx.$bypassPolicy === undefined ? tx : tx.$bypassPolicy();\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 }) as Promise<T | null>;\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 // async on purpose: forceCreateData's refusals must surface as REJECTIONS.\n create: async (args: ClientRow) =>\n base.create({ ...args, data: forceCreateData({ meta, model, data: (args.data ?? {}) as ClientRow, context }) }),\n createMany: async (args: ClientRow) =>\n base.createMany({\n ...args,\n data: ((args.data ?? []) as ClientRow[]).map((row) => forceCreateData({ meta, model, data: row, context })),\n }),\n createManyAndReturn: async (args: ClientRow) =>\n base.createManyAndReturn({\n ...args,\n data: ((args.data ?? []) as ClientRow[]).map((row) => forceCreateData({ meta, model, data: row, context })),\n }),\n update: async (args: ClientRow) => {\n const row = await lockThen(args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).update({ ...args, where: pkWhere }),\n );\n if (row === null) throw notFound(\"update\");\n return row;\n },\n updateMany: (args: ClientRow) =>\n base.updateMany({ ...args, where: mergeWhere({ where: args.where, field: policy.field, value }) }),\n upsert: async (args: ClientRow) => {\n const row = await lockThen(args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).update({ where: pkWhere, data: args.update, ...(args.select === undefined ? {} : { select: args.select }) }),\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 base.create({\n data: forceCreateData({ meta, model, data: (args.create ?? {}) as ClientRow, context }),\n ...(args.select === undefined ? {} : { select: args.select }),\n })) as ClientRow;\n },\n delete: async (args: ClientRow) => {\n const row = await lockThen(args, (raw, pkWhere) =>\n (raw.$models[model.name] as ModelDelegate).delete({ ...args, where: pkWhere }),\n );\n if (row === null) throw notFound(\"delete\");\n return row;\n },\n deleteMany: (args?: ClientRow) =>\n base.deleteMany({ ...(args ?? {}), where: mergeWhere({ where: args?.where, field: policy.field, value }) }) 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/** 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 }): void {\n const { client, meta } = params;\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 policied) {\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 // 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 const guarded: Record<string, unknown> = {};\n for (const key of Object.keys(original)) {\n guarded[key] = typeof original[key] === \"function\" ? guard(key) : original[key];\n }\n Object.assign(original as object, guarded);\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 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, transaction: client.$transaction });\n const full = { ...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 policied) {\n const base = rawTx.$models[model.name] as ModelDelegate & Record<string, unknown>;\n const delegate = scopedDelegate({ meta, model, base, context, transaction: tx.$transaction });\n scopedModels[model.name] = delegate;\n scopedModels[model.clientName] = delegate;\n Object.defineProperty(inner, model.clientName, { value: delegate, enumerable: true });\n }\n Object.defineProperty(inner, \"$models\", { value: scopedModels, enumerable: true });\n attachDefineView({ client: inner, meta, models: scopedModels });\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 policied) {\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",
18
+ "/**\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 { 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 { applyWriteValidators } from \"./validators.ts\";\nimport type { WriteValidators } from \"./validators.ts\";\nimport { attachPolicy } from \"./policy.ts\";\nimport type { PolicyContextValue } from \"./policy.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 * 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\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 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 * 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\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 /** 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};\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, 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 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 // `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 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 /**\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 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) {\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 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, 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 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 /** 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 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, 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 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 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 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 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 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 | null> => 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// ─── Write validation wrapper ────────────────────────────────────\n\nconst WRITE_METHODS = [\"create\", \"createMany\", \"createManyAndReturn\", \"update\", \"updateMany\", \"upsert\"] 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// ─── 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 if (validators?.[model.name] !== undefined) {\n delegate = withWriteValidation({ engine, delegate, model: model.name, validators });\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 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, inTransaction: true };\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, inTransaction: true } }),\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 // 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 attachPolicy({ client, meta: engine.meta });\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 /** 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\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 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",
17
19
  "/**\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 { isDbNowMarker, 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' 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 (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 \"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 (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 }\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"
18
20
  ],
19
- "mappings": "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",
20
- "debugId": "96AA73705B84E72364756E2164756E21",
21
+ "mappings": "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",
22
+ "debugId": "EC61C00B9601D9AD64756E2164756E21",
21
23
  "names": []
22
24
  }