@querykitjs/prisma-pg 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/fields.ts","../src/internal/diagnostics.ts","../src/internal/projection.ts","../src/internal/cursor.ts","../src/internal/order-by.ts","../src/internal/coerce.ts","../src/internal/operators.ts","../src/internal/where.ts","../src/repository.ts","../src/internal/context.ts","../src/registry.ts","../src/filters.ts"],"names":["f","QueryKitError","TEXT_FILTER_OPERATORS","cast","AsyncLocalStorage","DEFAULT_PER_PAGE","DEFAULT_LIMIT","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","coreCreateFilters"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Model metadata — the Prisma counterpart of drizzle's `columns.ts` and\n * mongoose's `fields.ts`.\n *\n * Prisma's `where` is keyed by **model field name** (camelCase), never by the DB\n * column — but a client may well send `created_at`, which drizzle-pg accepts. So\n * each field's `@map`ped column is recorded as an alias and `resolveField`\n * translates it back, keeping the two Postgres adapters interchangeable.\n *\n * Getting the field list without importing the generated client is the other\n * half of the job: this package must typecheck with no generated client present,\n * so metadata is read off the client **instance** at runtime, through a fallback\n * chain.\n */\n\n/** One model field, normalized across every metadata source. */\nexport interface FieldMeta {\n name: string;\n /** Prisma type name: `\"Int\"`, `\"String\"`, `\"DateTime\"`, an enum or model name, … */\n type: string;\n kind: \"scalar\" | \"enum\" | \"object\" | \"unsupported\";\n isId: boolean;\n /** `@updatedAt` — Prisma bumps these itself, so the adapter must not. */\n isUpdatedAt: boolean;\n isList: boolean;\n /** The `@map`ped database column, when it differs from the field name. */\n dbName?: string;\n}\n\n/** Everything the repository needs to know about one model. */\nexport interface ModelMeta {\n /** Prisma model name (`\"User\"`) — used as the diagnostics `source`. */\n name: string;\n fields: Map<string, FieldMeta>;\n /** `@map`ped DB column → Prisma field name, so `created_at` also resolves. */\n byDbName: Map<string, string>;\n /** The `@id` field name; undefined for a composite `@@id`. */\n idField: string | undefined;\n /** Fields that uniquely address a row — one `@id`, or every `@@id` field. */\n primaryKey: string[];\n /** Prisma's name for a composite key (`@@id(name:)`), else the joined fields. */\n primaryKeyName: string | undefined;\n hasDeletedAt: boolean;\n /** Present only when the field exists **and** is not `@updatedAt`-managed. */\n stampUpdatedAt: string | undefined;\n hasCreatedAt: boolean;\n}\n\n/** Structural shape of a Prisma model delegate (`prisma.user`). */\nexport interface AnyDelegate {\n findMany(args?: unknown): Promise<unknown>;\n findFirst(args?: unknown): Promise<unknown>;\n count(args?: unknown): Promise<unknown>;\n}\n\n/**\n * Whether a client property is a model delegate.\n *\n * ⚠️ Filtering by a `$`/`_` name prefix is **not** enough: `Object.keys(prisma)`\n * also yields `\"constructor\"`. The check is therefore structural.\n */\nexport function isDelegate(value: unknown): value is AnyDelegate {\n if (typeof value !== \"object\" || value === null) return false;\n const d = value as Record<string, unknown>;\n return typeof d.findMany === \"function\" && typeof d.findFirst === \"function\" && typeof d.count === \"function\";\n}\n\n/** Model delegate keys of a Prisma client (`[\"user\", \"post\"]`). */\nexport function delegateKeys(client: Record<string, unknown>): string[] {\n return Object.keys(client).filter(key => !key.startsWith(\"$\") && !key.startsWith(\"_\") && key !== \"constructor\" && isDelegate(client[key]));\n}\n\nconst uncapitalize = (name: string): string => (name ? name[0]!.toLowerCase() + name.slice(1) : name);\n\n/* -------------------------- metadata sources ------------------------------ */\n\ninterface RuntimeField {\n name?: unknown;\n kind?: unknown;\n type?: unknown;\n isId?: unknown;\n isUpdatedAt?: unknown;\n isList?: unknown;\n dbName?: unknown;\n}\n\nconst KINDS = new Set([\"scalar\", \"enum\", \"object\", \"unsupported\"]);\n\nconst normalizeKind = (kind: unknown): FieldMeta[\"kind\"] => (typeof kind === \"string\" && KINDS.has(kind) ? (kind as FieldMeta[\"kind\"]) : \"scalar\");\n\n/**\n * Source 1 — `client._runtimeDataModel` (Prisma 5/6). Internal, but the only\n * source that carries `isId` / `isUpdatedAt`, which soft-delete, id aliasing and\n * the `updatedAt` bump all depend on.\n */\nfunction fromRuntimeDataModel(\n client: Record<string, unknown>,\n delegateKey: string,\n): { name: string; fields: FieldMeta[]; primaryKey?: { name?: unknown; fields?: unknown } | null } | undefined {\n const rdm = client._runtimeDataModel as\n { models?: Record<string, { fields?: RuntimeField[]; primaryKey?: { name?: unknown; fields?: unknown } | null }> } | undefined;\n const models = rdm?.models;\n if (!models || typeof models !== \"object\") return undefined;\n\n const modelName = Object.keys(models).find(name => uncapitalize(name) === delegateKey);\n if (!modelName) return undefined;\n\n const raw = models[modelName]?.fields;\n if (!Array.isArray(raw)) return undefined;\n\n const fields: FieldMeta[] = [];\n for (const field of raw) {\n if (typeof field?.name !== \"string\") continue;\n fields.push({\n name: field.name,\n type: typeof field.type === \"string\" ? field.type : \"\",\n kind: normalizeKind(field.kind),\n isId: field.isId === true,\n isUpdatedAt: field.isUpdatedAt === true,\n isList: field.isList === true,\n ...(typeof field.dbName === \"string\" && field.dbName ? { dbName: field.dbName } : {}),\n });\n }\n return fields.length ? { name: modelName, fields, primaryKey: models[modelName]?.primaryKey ?? null } : undefined;\n}\n\n/**\n * Source 2 — `delegate.fields`, Prisma's public field-reference API. It exposes\n * `{ modelName, name, typeName, isList, isEnum }` but **no** `isId`/`isUpdatedAt`,\n * so a model whose primary key is not literally named `id` needs `fields`\n * (source 3) for `findById` to work off the wire's `\"id\"` key.\n */\nfunction fromDelegateFields(delegate: unknown, delegateKey: string): { name: string; fields: FieldMeta[] } | undefined {\n const refs = (delegate as { fields?: Record<string, unknown> } | undefined)?.fields;\n if (!refs || typeof refs !== \"object\") return undefined;\n\n const fields: FieldMeta[] = [];\n let modelName: string | undefined;\n for (const ref of Object.values(refs)) {\n const r = ref as { name?: unknown; typeName?: unknown; modelName?: unknown; isList?: unknown; isEnum?: unknown };\n if (typeof r.name !== \"string\") continue;\n if (typeof r.modelName === \"string\") modelName ??= r.modelName;\n fields.push({\n name: r.name,\n type: typeof r.typeName === \"string\" ? r.typeName : \"\",\n kind: r.isEnum === true ? \"enum\" : \"scalar\",\n isId: r.name === \"id\",\n isUpdatedAt: false,\n isList: r.isList === true,\n });\n }\n return fields.length ? { name: modelName ?? delegateKey, fields } : undefined;\n}\n\n/* ------------------------------ public API -------------------------------- */\n\n/**\n * Read a model's metadata off a live Prisma client, trying, in order:\n * `_runtimeDataModel` → `delegate.fields` → the caller-supplied `override`.\n *\n * Throws when none of them work — the same reasoning as drizzle's \"table not in\n * schema\" error: a repository built on unknown metadata would silently skip\n * *every* filter key and return the whole table.\n */\nexport function readModelMeta(client: Record<string, unknown>, delegateKey: string, override?: readonly FieldMeta[]): ModelMeta {\n const delegate = client[delegateKey];\n if (!isDelegate(delegate)) {\n const available = delegateKeys(client);\n throw new Error(\n `createRegistry: \"${delegateKey}\" is not a model delegate on this Prisma client. ` +\n `Available models: ${available.join(\", \") || \"(none)\"}. Note the key is camelCase — model \"LegalEntity\" is \"legalEntity\".`,\n );\n }\n\n const discovered = fromRuntimeDataModel(client, delegateKey) ?? fromDelegateFields(delegate, delegateKey);\n // An explicit `fields` override replaces the field list, but the model name is\n // still worth discovering — it is what diagnostics report as `source`.\n const source = override?.length ? { name: discovered?.name ?? delegateKey, fields: [...override] } : discovered;\n\n if (!source) {\n throw new Error(\n `createRegistry: could not read field metadata for model \"${delegateKey}\". ` +\n `This adapter reads it from the Prisma client at runtime (\\`_runtimeDataModel\\`, then \\`delegate.fields\\`); ` +\n `both were unavailable, which usually means an unsupported @prisma/client version (>=5 expected). ` +\n `Pass \\`fields\\` in the repository options to supply it explicitly.`,\n );\n }\n\n const fields = new Map<string, FieldMeta>();\n const byDbName = new Map<string, string>();\n for (const field of source.fields) {\n fields.set(field.name, field);\n // A `@map`ped column is registered as an alias, so a client sending\n // `created_at` resolves exactly as it does on the drizzle-pg adapter. A real\n // field name always wins (registered below), so an alias can never shadow one.\n if (field.dbName && field.dbName !== field.name) byDbName.set(field.dbName, field.name);\n }\n for (const name of fields.keys()) byDbName.delete(name);\n\n const idField = fields.get(\"id\")?.name ?? [...fields.values()].find(f => f.isId)?.name;\n const updatedAt = fields.get(\"updatedAt\");\n\n // A composite `@@id` addresses a row through Prisma's compound key, so those\n // models get the same by-id write methods as single-`@id` ones.\n const compositeRaw = (source as { primaryKey?: { name?: unknown; fields?: unknown } | null }).primaryKey;\n const compositeFields = Array.isArray(compositeRaw?.fields) ? (compositeRaw.fields as unknown[]).filter((f): f is string => typeof f === \"string\") : [];\n const primaryKey = idField ? [idField] : compositeFields.filter(f => fields.has(f));\n const primaryKeyName = idField\n ? undefined\n : (typeof compositeRaw?.name === \"string\" && compositeRaw.name ? compositeRaw.name : primaryKey.join(\"_\")) || undefined;\n\n return {\n name: source.name,\n fields,\n byDbName,\n primaryKey,\n primaryKeyName,\n idField,\n hasDeletedAt: fields.has(\"deletedAt\"),\n // Prisma maintains `@updatedAt` itself; stamping it again would be redundant\n // (mongoose does the same dance around schema `timestamps`).\n stampUpdatedAt: updatedAt && !updatedAt.isUpdatedAt ? updatedAt.name : undefined,\n hasCreatedAt: fields.has(\"createdAt\"),\n };\n}\n\n/**\n * Map a public field key to a real Prisma field name. `\"id\"` resolves to the\n * model's `@id` field when no field is literally called `id`, so the wire\n * contract stays identical across adapters. Unknown keys return `undefined` and\n * the caller skips them silently (drizzle/mongoose parity).\n */\nexport function resolveField(meta: ModelMeta, key: string): string | undefined {\n if (key === \"id\") return meta.fields.has(\"id\") ? \"id\" : meta.idField;\n if (meta.fields.has(key)) return key;\n // Fall back to the `@map`ped database column (`created_at` → `createdAt`), so\n // a payload written against the drizzle-pg adapter resolves here too.\n return meta.byDbName.get(key);\n}\n\n/** Field metadata by resolved name. */\nexport function fieldMeta(meta: ModelMeta, field: string): FieldMeta | undefined {\n return meta.fields.get(field);\n}\n\n/** Whether a field stores a `DateTime` — the only type this adapter casts locally. */\nexport function isDateField(meta: ModelMeta, field: string): boolean {\n return meta.fields.get(field)?.type === \"DateTime\";\n}\n\n/** Whether a field stores a `String` — `mode: \"insensitive\"` is only valid there. */\nexport function isStringField(meta: ModelMeta, field: string): boolean {\n return meta.fields.get(field)?.type === \"String\";\n}\n\n/**\n * Cast a wire (JSON) value to the field's type — an ISO string / epoch number\n * becomes a `Date` on a `DateTime` field. An unparseable value is returned\n * unchanged (Prisma reports it); see `coerceCondition` for the operator-aware\n * wrapper. Mirrors the drizzle/mongoose `castValue` contract.\n */\nexport function castValue(meta: ModelMeta, field: string, value: unknown): unknown {\n if (!isDateField(meta, field)) return value;\n if (value === null || value === undefined || value instanceof Date) return value;\n if (typeof value !== \"string\" && typeof value !== \"number\") return value;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date;\n}\n","import { QueryKitError, type SkippedCondition } from \"@querykitjs/core\";\n\n/**\n * Per-repository diagnostics channel. The compilers (`where`, `order-by`) drop\n * conditions they cannot resolve — good for db-service parity, but a typo in a\n * filter key then makes an endpoint return **more** rows than intended, silently.\n * This makes each drop either visible (`onSkipped`) or fatal (`strict`).\n *\n * Identical to the drizzle-pg and mongoose adapters' `Diagnostics`, and\n * `SkippedCondition` / `QueryKitError` come from core — so all three backends\n * report identically.\n */\nexport interface Diagnostics {\n /** Prisma model name (drizzle: table name, mongoose: model name), for the report. */\n source: string;\n /** Throw `QueryKitError` instead of dropping the condition. Default `false`. */\n strict: boolean;\n onSkipped?: (info: SkippedCondition) => void;\n}\n\n/**\n * Report a dropped condition. `strict` turns it into a `QueryKitError` the\n * backend can map to a 400; otherwise the hook is called and the condition is\n * dropped exactly as before.\n */\nexport function reportSkip(diag: Diagnostics | undefined, info: Omit<SkippedCondition, \"source\">): void {\n if (!diag) return;\n const full: SkippedCondition = { ...info, source: diag.source };\n if (diag.strict) throw new QueryKitError(full);\n diag.onSkipped?.(full);\n}\n","import { resolveField, type ModelMeta } from \"./fields\";\n\n/**\n * A Prisma projection. ⚠️ Prisma rejects `select` and `include` **at the same\n * level**, so when a caller asks for both columns and relations they are\n * composed into a single `select` (relations are legal keys inside a `select`).\n */\nexport interface Projection {\n select?: Record<string, unknown>;\n include?: Record<string, unknown>;\n}\n\n/** Read/aggregate projection guards — identical semantics to the other adapters. */\nexport interface ProjectionGuard {\n /** Forced selection: the caller's `columns` is ignored entirely. */\n forcedKeys?: string[];\n /** Allowlist: the caller's `columns` is intersected with it. */\n allowed?: Set<string>;\n}\n\n/** Inclusion-only: `{ a: true, b: false }` selects `a`; `false` values are dropped. */\nexport function truthyKeys(selection: Record<string, boolean | undefined>): string[] {\n return Object.entries(selection)\n .filter(([, on]) => on)\n .map(([key]) => key);\n}\n\n/**\n * Resolve the effective column keys for a request.\n *\n * With `forcedKeys` the caller's selection is ignored outright. With `allowed`\n * it is intersected, and an empty intersection falls back to the allowlist —\n * **never** to the full row, which is what makes a request for a forbidden\n * column safe instead of catastrophic. Identical to drizzle-pg's `pickColumns`\n * and mongoose's `projection`.\n */\nexport function pickColumns(guard: ProjectionGuard, columns?: Record<string, boolean | undefined>): string[] | undefined {\n if (guard.forcedKeys) return guard.forcedKeys;\n\n const requested = columns ? truthyKeys(columns) : [];\n if (!guard.allowed) return requested.length > 0 ? requested : undefined;\n\n const intersection = requested.filter(key => guard.allowed!.has(key));\n return intersection.length > 0 ? intersection : [...guard.allowed];\n}\n\n/**\n * Build the Prisma `select` / `include` for a request.\n *\n * @param forceKeys - fields the query needs regardless of the caller's selection\n * (the cursor key). Only applied when a `select` is actually being built.\n */\nexport function buildProjection(\n meta: ModelMeta,\n guard: ProjectionGuard,\n columns?: Record<string, boolean | undefined>,\n withRelations?: Record<string, unknown>,\n forceKeys: string[] = [],\n): Projection {\n // Relations the caller actually asked for (`false`/`null` entries dropped).\n const relations: Record<string, unknown> = {};\n if (withRelations) {\n for (const [key, value] of Object.entries(withRelations)) {\n if (value) relations[key] = value;\n }\n }\n const hasRelations = Object.keys(relations).length > 0;\n\n const keys = pickColumns(guard, columns);\n const select: Record<string, unknown> = {};\n if (keys) {\n for (const key of [...keys, ...forceKeys]) {\n const field = resolveField(meta, key);\n // Unknown keys are dropped, matching the filter/sort compilers.\n if (field) select[field] = true;\n }\n }\n const hasSelect = Object.keys(select).length > 0;\n\n // No usable selection → full row (plus `include` if relations were requested).\n if (!hasSelect) return hasRelations ? { include: relations } : {};\n\n // Both → one `select` carrying the relations (Prisma forbids select+include).\n if (hasRelations) return { select: { ...select, ...relations } };\n return { select };\n}\n","/**\n * Opaque cursor tokens for keyset pagination. A token is the base64url encoding\n * of `{ v: <cursor field value> }`. Dates are preserved via ISO strings.\n *\n * ⚠️ Byte-for-byte identical to `@querykitjs/drizzle-pg` and `@querykitjs/mongoose`\n * — a token issued by one adapter must be readable by another, so this file is\n * deliberately kept unchanged across the three backends (see PARITY.md).\n */\n\ninterface CursorPayload {\n v: unknown;\n}\n\nexport function encodeCursor(value: unknown): string {\n const normalized = value instanceof Date ? value.toISOString() : value;\n const json = JSON.stringify({ v: normalized } satisfies CursorPayload);\n return Buffer.from(json, \"utf8\").toString(\"base64url\");\n}\n\nexport function decodeCursor(cursor?: string | null): unknown | undefined {\n if (!cursor) return undefined;\n try {\n const json = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const payload = JSON.parse(json) as CursorPayload;\n return payload.v;\n } catch {\n return undefined;\n }\n}\n","import type { Sort, SortDirection } from \"../types\";\nimport { reportSkip, type Diagnostics } from \"./diagnostics\";\nimport { resolveField, type ModelMeta } from \"./fields\";\n\n/** A Prisma `orderBy` list, e.g. `[{ name: \"asc\" }, { createdAt: \"desc\" }]`. */\nexport type OrderBy = Array<Record<string, SortDirection>>;\n\ninterface NormalizedSort {\n key: string;\n direction: SortDirection;\n}\n\nfunction normalize(sort?: Sort): NormalizedSort[] {\n if (!sort) return [];\n return sort.filter(item => item && item.key).map(item => ({ key: item.key, direction: item.direction ?? \"asc\" }));\n}\n\n/**\n * Build an `orderBy` list. Unknown keys are skipped; when no valid sort remains,\n * falls back to `createdAt desc`, then to `<id> desc` — a deterministic order so\n * pagination is stable (identical to the drizzle-pg and mongoose adapters;\n * without it Postgres returns rows in arbitrary order).\n */\nexport function buildOrderBy(meta: ModelMeta, sort?: Sort, diag?: Diagnostics): OrderBy {\n const orderBy: OrderBy = [];\n\n for (const { key, direction } of normalize(sort)) {\n const field = resolveField(meta, key);\n if (field) orderBy.push({ [field]: direction });\n // An unknown sort key falls back to the default order, so the list looks\n // \"unsorted\" to the caller with nothing in the log to explain it.\n else reportSkip(diag, { site: \"sort\", key, reason: \"unknown-key\" });\n }\n\n if (orderBy.length > 0) return orderBy;\n\n if (meta.hasCreatedAt) return [{ createdAt: \"desc\" }];\n return meta.idField ? [{ [meta.idField]: \"desc\" }] : [];\n}\n","import { TEXT_FILTER_OPERATORS } from \"@querykitjs/core\";\n\nimport type { FilterOperator, FilterValue } from \"../types\";\nimport { castValue, fieldMeta, type ModelMeta } from \"./fields\";\n\n/**\n * Operators whose value is a text pattern — never cast. Otherwise\n * `contains(dateField, \"2026\")` would receive `String(Date)`\n * (`\"Mon Jul 28 2026 …\"`) instead of the string the caller sent. The list lives\n * in `@querykitjs/core` so all three adapters share it.\n */\nconst TEXT_OPERATORS: ReadonlySet<FilterOperator> = new Set(TEXT_FILTER_OPERATORS);\n\n/**\n * Returned when a value cannot be represented in the field's type (e.g. the\n * string `\"not-a-date\"` on a `DateTime` field). Callers drop the condition — the\n * same symbol-based contract the drizzle-pg and mongoose adapters use.\n */\nexport const INVALID_VALUE = Symbol(\"querykit.invalid-value\");\n\n/** Whether this operator compares against a text pattern (`like`, `contains`, …). */\nexport const isTextOperator = (operator: FilterOperator): boolean => TEXT_OPERATORS.has(operator);\n\n/**\n * Cast a single wire value to the field's type, or report it as uncastable.\n *\n * **Why this covers more types than the drizzle-pg adapter's `castForColumn`.**\n * A JSON/query-string payload carries `\"18\"`, not `18`. drizzle hands that\n * straight to Postgres, which casts it, so `{ key: \"age\", value: \"18\" }` just\n * works; mongoose casts it against the schema for the same reason. Prisma does\n * neither — it type-checks arguments in the client and throws\n * `PrismaClientValidationError`, which would surface as a **500 where the other\n * two adapters return rows**. So the adapter performs the cast Postgres would\n * have performed, and a value that genuinely cannot be represented is dropped\n * and reported instead of crashing the request.\n */\nexport function castForField(meta: ModelMeta, field: string, value: unknown): unknown | typeof INVALID_VALUE {\n if (value === null || value === undefined) return value;\n const type = fieldMeta(meta, field)?.type;\n\n if (type === \"DateTime\") {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? INVALID_VALUE : value;\n const cast = castValue(meta, field, value);\n if (cast instanceof Date) return Number.isNaN(cast.getTime()) ? INVALID_VALUE : cast;\n return INVALID_VALUE; // a string/number that could not be parsed, or a wrong-typed value\n }\n\n if (type === \"Int\" || type === \"BigInt\") {\n if (typeof value === \"number\") return Number.isInteger(value) ? value : INVALID_VALUE;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value);\n return Number.isInteger(n) ? n : INVALID_VALUE;\n }\n return INVALID_VALUE;\n }\n\n if (type === \"Float\" || type === \"Decimal\") {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : INVALID_VALUE;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value);\n return Number.isFinite(n) ? n : INVALID_VALUE;\n }\n return INVALID_VALUE;\n }\n\n if (type === \"Boolean\") {\n if (typeof value === \"boolean\") return value;\n if (value === \"true\" || value === \"1\" || value === 1) return true;\n if (value === \"false\" || value === \"0\" || value === 0) return false;\n return INVALID_VALUE;\n }\n\n // String / enum / Json / everything else: left alone. Postgres would not have\n // cast an int to text either, so this matches drizzle-pg's behaviour.\n return value;\n}\n\n/**\n * Bring one condition's value in line with the field's type before it reaches an\n * operator builder. Scalars, arrays (`in`/`notIn`) and tuples\n * (`between`/`notBetween`) are all covered because coercion sits **before** the\n * operator, in a single place. A single uncastable element invalidates the whole\n * condition — a half-applied `in` list would silently widen the result set.\n */\nexport function coerceCondition(\n meta: ModelMeta,\n field: string,\n operator: FilterOperator,\n value: FilterValue | undefined,\n): FilterValue | undefined | typeof INVALID_VALUE {\n if (value === undefined || TEXT_OPERATORS.has(operator)) return value;\n\n if (Array.isArray(value)) {\n const items: unknown[] = [];\n for (const item of value) {\n const cast = castForField(meta, field, item);\n if (cast === INVALID_VALUE) return INVALID_VALUE;\n items.push(cast);\n }\n return items as FilterValue;\n }\n\n const cast = castForField(meta, field, value);\n return cast === INVALID_VALUE ? INVALID_VALUE : (cast as FilterValue);\n}\n","import type { FilterOperator, FilterValue } from \"../types\";\n\n/**\n * A field-level Prisma filter fragment, e.g. `{ gte: 18 }` or\n * `{ contains: \"ali\", mode: \"insensitive\" }`. `undefined` = drop the condition.\n */\nexport type Fragment = Record<string, unknown> | undefined;\n\n/**\n * Some conditions cannot be expressed as a single field fragment — an exact\n * `LIKE` translation may need two predicates on the same field, and Prisma has\n * no field-level `AND`. Such a builder returns this instead, and `where.ts`\n * expands it into a full `where` node once the field name is known.\n */\nexport interface WhereFragment {\n buildFor(field: string): Record<string, unknown>;\n}\n\nexport const isWhereFragment = (value: unknown): value is WhereFragment => typeof (value as WhereFragment | undefined)?.buildFor === \"function\";\n\n/** Per-condition facts the builders need (see `where.ts`). */\nexport interface OperatorContext {\n /** Whether the target field is a `String` — `mode: \"insensitive\"` is only valid there. */\n isString: boolean;\n}\n\ntype Builder = (value: FilterValue | undefined, ctx: OperatorContext) => Fragment | WhereFragment;\n\nconst text = (value: FilterValue | undefined): string => String(value ?? \"\");\n\nconst asTuple = (value: FilterValue | undefined): [unknown, unknown] | undefined =>\n Array.isArray(value) && value.length === 2 ? [value[0], value[1]] : undefined;\n\n/** Case-insensitive matching, but only where Prisma accepts it. */\nconst insensitive = (fragment: Record<string, unknown>, ctx: OperatorContext): Record<string, unknown> =>\n ctx.isString ? { ...fragment, mode: \"insensitive\" } : fragment;\n\n/* ----------------------------- LIKE patterns ------------------------------ */\n\n/**\n * Prisma has no raw SQL `LIKE` inside `where`, so a `like`/`ilike` pattern is\n * translated into the equivalent `equals`/`contains`/`startsWith`/`endsWith`\n * filter. This keeps exact drizzle-pg parity for the patterns that actually\n * travel over the wire:\n *\n * ```\n * \"%ali%\" → contains \"ali\" \"ali%\" → startsWith \"ali\"\n * \"%ali\" → endsWith \"ali\" \"ali\" → equals \"ali\"\n * \"%\" → endsWith \"\" (i.e. every non-NULL row, exactly like SQL)\n * ```\n *\n * Patterns Prisma has no direct filter for — an interior `%`, a `_` wildcard, or\n * an escaped literal `%`/`_` inside a substring match — are still translated\n * **exactly**, via {@link rawLikePlan}, so every SQL `LIKE` pattern drizzle-pg\n * accepts returns the same rows here.\n */\nexport interface LikeShape {\n op: \"equals\" | \"contains\" | \"startsWith\" | \"endsWith\";\n value: string;\n}\n\n/** One character of a LIKE pattern: a wildcard, or a literal (possibly escaped). */\ninterface LikeToken {\n kind: \"any\" | \"one\" | \"lit\";\n char: string;\n}\n\n/** Split a SQL LIKE pattern into tokens, resolving `\\` escapes. */\nfunction tokenizeLike(pattern: string): LikeToken[] | undefined {\n const tokens: LikeToken[] = [];\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === \"\\\\\") {\n const next = pattern[i + 1];\n if (next === undefined) return undefined; // dangling escape — not a valid pattern\n tokens.push({ kind: \"lit\", char: next });\n i++;\n continue;\n }\n if (ch === \"%\") tokens.push({ kind: \"any\", char: \"%\" });\n else if (ch === \"_\") tokens.push({ kind: \"one\", char: \"_\" });\n else tokens.push({ kind: \"lit\", char: ch });\n }\n return tokens;\n}\n\n/** Render tokens back to a SQL LIKE pattern, re-escaping literal `%`, `_` and `\\`. */\nconst renderPattern = (tokens: LikeToken[]): string =>\n tokens.map(t => (t.kind === \"lit\" && (t.char === \"%\" || t.char === \"_\" || t.char === \"\\\\\") ? `\\\\${t.char}` : t.char)).join(\"\");\n\n/**\n * The simple shape of a pattern whose wildcards are only leading/trailing `%`\n * and whose literal part contains no `%`/`_` — i.e. the forms that map onto a\n * plain `equals`/`contains`/`startsWith`/`endsWith`. Returns `undefined` when\n * the pattern needs the exact construction in {@link rawLikePlan}.\n *\n * This path is preferred because it never relies on how Prisma treats wildcard\n * characters inside a filter value.\n */\nexport function parseLikePattern(pattern: string): LikeShape | undefined {\n const tokens = tokenizeLike(pattern);\n if (!tokens) return undefined;\n\n let start = 0;\n let end = tokens.length;\n let leading = false;\n let trailing = false;\n while (start < end && tokens[start]!.kind === \"any\") {\n leading = true;\n start++;\n }\n while (end > start && tokens[end - 1]!.kind === \"any\") {\n trailing = true;\n end--;\n }\n\n const core = tokens.slice(start, end);\n if (core.some(t => t.kind !== \"lit\")) return undefined; // interior wildcard\n\n const value = core.map(t => t.char).join(\"\");\n const op = leading && trailing ? \"contains\" : leading ? \"endsWith\" : trailing ? \"startsWith\" : \"equals\";\n\n // A literal `%`/`_` would be re-read as a wildcard by LIKE, so anything but a\n // pure `equals` has to go through the exact construction instead.\n if (op !== \"equals\" && /[%_]/.test(value)) return undefined;\n\n return { op, value };\n}\n\n/**\n * Exact translation for every remaining pattern.\n *\n * Prisma renders `startsWith: X` as `LIKE 'X%'`, `endsWith: X` as `LIKE '%X'`\n * and `contains: X` as `LIKE '%X%'`, and it does **not** escape `%`/`_` inside\n * the value — so a raw pattern can be pushed through. Two identities then make\n * an arbitrary pattern expressible:\n *\n * - `LIKE 'A%S'` ≡ `LIKE 'A%S%' AND LIKE '%S'` — where `S` is the (fixed-length)\n * tail after the last `%`. Anchoring the tail pins the final `S` to the end of\n * the string, so nothing over-matches.\n * - `LIKE 'P'` with no `%` at all ≡ `LIKE 'P%' AND NOT LIKE 'P_%'` — the first\n * fixes the prefix and a minimum length, the second forbids any extra\n * character, which together pin the length exactly.\n *\n * A pattern that already ends in `%` needs neither: `startsWith` alone is exact.\n */\nexport function rawLikePlan(pattern: string, ctx: OperatorContext, caseInsensitive: boolean): WhereFragment | undefined {\n const tokens = tokenizeLike(pattern);\n if (!tokens) return undefined;\n\n const mode = (fragment: Record<string, unknown>) => (caseInsensitive ? insensitive(fragment, ctx) : fragment);\n const raw = renderPattern(tokens);\n\n return {\n buildFor(field: string) {\n // `LIKE 'X%'` — the trailing wildcard is already there, so one filter does it.\n if (tokens[tokens.length - 1]?.kind === \"any\") {\n return { [field]: mode({ startsWith: raw.replace(/%$/, \"\") }) };\n }\n\n const lastAny = tokens.map(t => t.kind).lastIndexOf(\"any\");\n if (lastAny >= 0) {\n // …%S → LIKE 'pattern%' AND LIKE '%S'\n const tail = renderPattern(tokens.slice(lastAny + 1));\n return { AND: [{ [field]: mode({ startsWith: raw }) }, { [field]: mode({ endsWith: tail }) }] };\n }\n\n // No `%` at all: pin the length with `NOT LIKE 'pattern_%'`.\n return { AND: [{ [field]: mode({ startsWith: raw }) }, { NOT: { [field]: mode({ startsWith: `${raw}_` }) } }] };\n },\n };\n}\n\nconst likeFragment = (value: FilterValue | undefined, ctx: OperatorContext, caseInsensitive: boolean): Fragment | WhereFragment => {\n const pattern = text(value);\n const shape = parseLikePattern(pattern);\n if (shape) {\n const fragment: Record<string, unknown> = { [shape.op]: shape.value };\n return caseInsensitive ? insensitive(fragment, ctx) : fragment;\n }\n return rawLikePlan(pattern, ctx, caseInsensitive);\n};\n\n/* ------------------------------- operators -------------------------------- */\n\n/**\n * Operator → Prisma fragment map. Mirrors `@querykitjs/drizzle-pg` semantics\n * exactly: both token (`\"%_%\"`) and name-alias (`\"contains\"`) forms are handled;\n * `contains`/`startsWith`/`endsWith` are case-**insensitive**, `like` is\n * case-**sensitive**, `ilike` is insensitive; invalid values (a non-array `in`,\n * a non-2-tuple `between`) drop the condition (`undefined`).\n *\n * Negations carry **no** extra NULL guard: Postgres' three-valued logic already\n * excludes NULL rows from `NOT`/`!=`/`NOT IN`, so this matches drizzle-pg\n * natively. (The mongoose adapter's `$ne: null` guards exist only to make\n * MongoDB's two-valued logic behave like SQL.)\n */\nexport const operators: Record<FilterOperator, Builder> = {\n \"=\": v => ({ equals: v }),\n eq: v => ({ equals: v }),\n \"!=\": v => ({ not: v }),\n ne: v => ({ not: v }),\n \">\": v => ({ gt: v }),\n gt: v => ({ gt: v }),\n \">=\": v => ({ gte: v }),\n gte: v => ({ gte: v }),\n \"<\": v => ({ lt: v }),\n lt: v => ({ lt: v }),\n \"<=\": v => ({ lte: v }),\n lte: v => ({ lte: v }),\n\n contains: (v, ctx) => insensitive({ contains: text(v) }, ctx),\n \"%_%\": (v, ctx) => insensitive({ contains: text(v) }, ctx),\n startsWith: (v, ctx) => insensitive({ startsWith: text(v) }, ctx),\n \"%_\": (v, ctx) => insensitive({ startsWith: text(v) }, ctx),\n endsWith: (v, ctx) => insensitive({ endsWith: text(v) }, ctx),\n \"_%\": (v, ctx) => insensitive({ endsWith: text(v) }, ctx),\n\n like: (v, ctx) => likeFragment(v, ctx, false),\n ilike: (v, ctx) => likeFragment(v, ctx, true),\n notLike: (v, ctx) => {\n const inner = likeFragment(v, ctx, false);\n if (!inner) return undefined;\n // Negation lives at the `where` level when the positive form needed more\n // than one predicate. SQL `NOT (…)` drops NULL rows either way, matching\n // drizzle-pg's `NOT LIKE`.\n if (isWhereFragment(inner)) return { buildFor: (field: string) => ({ NOT: inner.buildFor(field) }) };\n return { not: inner };\n },\n\n in: v => (Array.isArray(v) ? { in: v } : undefined),\n notIn: v => (Array.isArray(v) ? { notIn: v } : undefined),\n\n between: v => {\n const t = asTuple(v);\n return t ? { gte: t[0], lte: t[1] } : undefined;\n },\n notBetween: v => {\n const t = asTuple(v);\n // Field-level negation uses lowercase `not` (uppercase `NOT` is where-level).\n return t ? { not: { gte: t[0], lte: t[1] } } : undefined;\n },\n\n isNull: () => ({ equals: null }),\n isNotNull: () => ({ not: null }),\n};\n","import type { FieldCondition, Filter, FilterNode } from \"../types\";\nimport { coerceCondition, INVALID_VALUE, isTextOperator } from \"./coerce\";\nimport { reportSkip, type Diagnostics } from \"./diagnostics\";\nimport { isStringField, resolveField, type ModelMeta } from \"./fields\";\nimport { isWhereFragment, operators } from \"./operators\";\n\n/** A Prisma `where` object (`Prisma.<Model>WhereInput` at the type level). */\nexport type Where = Record<string, unknown>;\n\nconst isObject = (node: unknown): node is Record<string, unknown> => typeof node === \"object\" && node !== null;\n\nconst isFieldCondition = (node: unknown): node is FieldCondition => isObject(node) && \"key\" in node && !(\"and\" in node) && !(\"or\" in node) && !(\"not\" in node);\n\n/** Combine parts (dropping `undefined`): 0 → undefined, 1 → the part, else `AND`/`OR`. */\nfunction combine(kind: \"AND\" | \"OR\", parts: Array<Where | undefined>): Where | undefined {\n const valid = parts.filter((part): part is Where => part !== undefined);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n return { [kind]: valid };\n}\n\nfunction buildCondition(meta: ModelMeta, condition: FieldCondition, diag?: Diagnostics): Where | undefined {\n const operator = condition.operation ?? \"=\";\n const build = operators[operator];\n if (!build) throw new Error(`Unsupported filter operator: \"${operator}\"`);\n\n const field = resolveField(meta, condition.key);\n if (!field) {\n // Unknown field → skip. Usually a typo, and a dropped filter widens the\n // result set rather than narrowing it, so it is worth reporting.\n reportSkip(diag, { site: \"filter\", key: condition.key, operation: operator, reason: \"unknown-key\" });\n return undefined;\n }\n\n const isString = isStringField(meta, field);\n\n // A text pattern cannot be matched against a non-String field: Prisma rejects\n // `contains`/`mode` on `Int`/`DateTime`, which would surface as a 500. Postgres\n // (via drizzle) *can* do it by rendering the value as text, so exact parity is\n // not reachable here — skipping keeps the adapter non-crashing and makes the\n // difference observable through `onSkippedCondition` instead of a stack trace.\n // (Same trade-off the mongoose adapter makes for `$regex` on a Date path.)\n if (isTextOperator(operator) && !isString) {\n reportSkip(diag, { site: \"filter\", key: condition.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n // Wire values are always JSON (no Date), so cast to the field's type first.\n // Covers scalars, `in` arrays and `between` tuples at once.\n const value = coerceCondition(meta, field, operator, condition.value);\n if (value === INVALID_VALUE) {\n reportSkip(diag, { site: \"filter\", key: condition.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n const fragment = build(value, { isString });\n if (fragment === undefined) {\n // The operator rejected the value shape (a non-array `in`, a non-2-tuple\n // `between`, a malformed LIKE pattern) — same class of problem as an\n // uncastable value.\n reportSkip(diag, { site: \"filter\", key: condition.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n // An exact LIKE translation can need two predicates on one field, and Prisma\n // has no field-level `AND` — such builders emit the whole `where` node.\n if (isWhereFragment(fragment)) return fragment.buildFor(field);\n return { [field]: fragment };\n}\n\nfunction buildNode(meta: ModelMeta, node: FilterNode, diag?: Diagnostics): Where | undefined {\n if (isFieldCondition(node)) return buildCondition(meta, node, diag);\n if (!isObject(node)) return undefined;\n\n if (\"and\" in node) {\n return combine(\n \"AND\",\n (node.and as FilterNode[]).map(child => buildNode(meta, child, diag)),\n );\n }\n if (\"or\" in node) {\n return combine(\n \"OR\",\n (node.or as FilterNode[]).map(child => buildNode(meta, child, diag)),\n );\n }\n if (\"not\" in node) {\n const inner = buildNode(meta, node.not as FilterNode, diag);\n // No extra NULL guard: SQL `NOT(pred)` already drops NULL rows under\n // three-valued logic, so this matches drizzle-pg natively. (mongoose needs a\n // `$ne: null` guard only because Mongo's `$nor` keeps null/missing.)\n return inner ? { NOT: inner } : undefined;\n }\n\n // Raw escape hatch — a plain Prisma `where` object, used as-is.\n return node as Where;\n}\n\n/**\n * Compile a public {@link Filter} into a single Prisma `where` object.\n * A flat array is treated as implicit AND (db-service compatibility).\n * Returns `undefined` when nothing meaningful remains (an empty `where`).\n *\n * `diag` is optional: without it, unresolvable conditions are dropped silently;\n * with it they are reported (or, in strict mode, throw).\n */\nexport function buildWhere(meta: ModelMeta, filter?: Filter, diag?: Diagnostics): Where | undefined {\n if (filter === undefined) return undefined;\n // Array elements go through buildNode (not buildCondition) so a flat array may\n // also hold logical groups / raw nodes (implicit AND), matching drizzle/mongoose.\n if (Array.isArray(filter)) {\n return combine(\n \"AND\",\n filter.map(node => buildNode(meta, node as FilterNode, diag)),\n );\n }\n return buildNode(meta, filter as FilterNode, diag);\n}\n\n/** Merge parts into one `where` with AND (used by the repository's composeWhere). */\nexport function andWhere(parts: Array<Where | undefined>): Where | undefined {\n return combine(\"AND\", parts);\n}\n","import { QueryKitError, type SkippedCondition } from \"@querykitjs/core\";\n\nimport type {\n AggregateRow,\n AggregateSpec,\n ByIdParams,\n ColumnSelection,\n CursorParams,\n CursorResult,\n FieldCondition,\n Filter,\n Id,\n InfiniteParams,\n InfiniteResult,\n Insert,\n OffsetParams,\n OffsetResult,\n QueryParams,\n Repository,\n RepositoryOptions,\n Row,\n Scope,\n SortDirection,\n UpsertOptions,\n} from \"./types\";\nimport type { AnyExecutor } from \"./internal/context\";\nimport { castValue, readModelMeta, resolveField, type ModelMeta } from \"./internal/fields\";\nimport { reportSkip, type Diagnostics } from \"./internal/diagnostics\";\nimport { buildProjection, pickColumns, truthyKeys, type Projection, type ProjectionGuard } from \"./internal/projection\";\nimport { encodeCursor, decodeCursor } from \"./internal/cursor\";\nimport { buildOrderBy } from \"./internal/order-by\";\nimport { andWhere, buildWhere, type Where } from \"./internal/where\";\n\n/** Shared, registry-level runtime injected into every repository. */\nexport interface RepoRuntime {\n /** Base (non-transactional) Prisma client. */\n baseClient: AnyExecutor;\n /** Current executor — the active transaction client if any, else `baseClient`. */\n getExecutor: () => AnyExecutor;\n /** Default page size for `findList` when `perPage` is omitted. */\n defaultPerPage: number;\n /** Default `limit` for `findInfinite`/`findCursor` when omitted. */\n defaultLimit: number;\n /** Upper bound for `perPage`, applied even when validation was bypassed. */\n maxPerPage: number;\n /** Upper bound for `limit` (`findInfinite`/`findCursor`). */\n maxLimit: number;\n /** Throw `QueryKitError` instead of dropping an unresolvable condition. */\n strict: boolean;\n /** Called for every dropped condition (also when `strict` is off). */\n onSkippedCondition?: (info: SkippedCondition) => void;\n}\n\n/** The delegate methods this adapter drives, kept structural on purpose. */\ninterface RuntimeDelegate {\n findMany(args?: Record<string, unknown>): Promise<Record<string, unknown>[]>;\n findFirst(args?: Record<string, unknown>): Promise<Record<string, unknown> | null>;\n count(args?: Record<string, unknown>): Promise<number>;\n create(args: Record<string, unknown>): Promise<Record<string, unknown>>;\n createManyAndReturn?(args: Record<string, unknown>): Promise<Record<string, unknown>[]>;\n update(args: Record<string, unknown>): Promise<Record<string, unknown>>;\n updateMany(args: Record<string, unknown>): Promise<{ count: number }>;\n delete(args: Record<string, unknown>): Promise<Record<string, unknown>>;\n deleteMany(args: Record<string, unknown>): Promise<{ count: number }>;\n upsert(args: Record<string, unknown>): Promise<Record<string, unknown>>;\n aggregate(args: Record<string, unknown>): Promise<Record<string, unknown>>;\n groupBy(args: Record<string, unknown>): Promise<Record<string, unknown>[]>;\n}\n\nconst CHUNK_SIZE = 1000;\n\n/**\n * Clamp a requested page size into `[1, max]`, falling back to the default when\n * omitted. Applied in the repository as well as in validation, so a bypassed or\n * mis-configured schema still cannot ask for the whole table.\n */\nconst clampPageSize = (requested: number | undefined, fallback: number, max: number): number => Math.min(max, Math.max(1, Math.trunc(requested ?? fallback)));\n\nconst toArray = <T>(value: T | T[] | undefined): T[] => (value === undefined ? [] : Array.isArray(value) ? value : [value]);\n\n/**\n * Build a model-scoped repository. `runtime` (client + ambient transaction\n * context) comes from the registry, so this file never touches the app's\n * database handle directly.\n */\nexport function buildRepository<TDelegate>(runtime: RepoRuntime, modelKey: string, config: RepositoryOptions<TDelegate> = {}): Repository<TDelegate> {\n const meta: ModelMeta = readModelMeta(runtime.baseClient, modelKey, config.fields);\n\n /** Resolved per call so repositories inside `registry.transaction` use the tx client. */\n const delegate = (): RuntimeDelegate => runtime.getExecutor()[modelKey] as RuntimeDelegate;\n\n /* Diagnostics channel — built once, threaded into the filter/sort compilers. */\n const diag: Diagnostics = {\n source: meta.name,\n strict: runtime.strict,\n onSkipped: runtime.onSkippedCondition,\n };\n\n /**\n * Several write paths need to address a row by its primary key: Prisma's\n * `update`/`delete` accept only a unique `where`, while querykit's filters are\n * arbitrary predicates (they also carry the scope and soft-delete guards). So\n * the row is located first, then written by key. Works for a single `@id` and\n * for a composite `@@id` alike.\n */\n const requirePrimaryKey = (method: string): string[] => {\n if (meta.primaryKey.length === 0) {\n throw new Error(\n `${method}: model \"${meta.name}\" has no primary key, so a row cannot be addressed individually. ` +\n `Use updateWhere/deleteWhere with an explicit filter instead.`,\n );\n }\n return meta.primaryKey;\n };\n\n /** `select` that fetches just the key fields. */\n const keySelect = (key: string[]): Record<string, true> => Object.fromEntries(key.map(field => [field, true]));\n\n /**\n * Prisma's unique `where` for one row. A composite `@@id` is addressed through\n * its compound key (`{ a_b: { a, b } }`), the name Prisma generates from the\n * field list unless `@@id(name:)` says otherwise.\n */\n const uniqueWhere = (key: string[], row: Record<string, unknown>): Record<string, unknown> => {\n if (key.length === 1) return { [key[0]!]: row[key[0]!] };\n return { [meta.primaryKeyName ?? key.join(\"_\")]: Object.fromEntries(key.map(field => [field, row[field]])) };\n };\n\n /** A `where` matching exactly the given rows by key (used for bulk re-reads). */\n const keyedIn = (key: string[], rows: Record<string, unknown>[]): Where => {\n if (key.length === 1) return { [key[0]!]: { in: rows.map(row => row[key[0]!]) } };\n return { OR: rows.map(row => Object.fromEntries(key.map(field => [field, row[field]]))) };\n };\n\n // Precomputed base filter from the scope (equality on each field).\n const scopeConditions: FieldCondition[] = config.scope\n ? Object.entries(config.scope).map(([key, value]) => ({ key, operation: \"=\" as const, value: value as never }))\n : [];\n // A scope is the server's own RBAC / tenancy filter, so a key that does not\n // resolve must never be dropped: that would silently widen every query on this\n // repository. Fail when it is configured, not per request, and regardless of\n // `strict` — this is a programming error, not bad input.\n for (const condition of scopeConditions) {\n if (!resolveField(meta, condition.key)) {\n throw new QueryKitError({ source: meta.name, site: \"filter\", key: condition.key, reason: \"unknown-key\" });\n }\n }\n const scopeWhere = scopeConditions.length ? buildWhere(meta, scopeConditions) : undefined;\n\n /** Compose user filter + scope + soft-delete guard into one `where`. */\n const composeWhere = (userFilter?: Filter<TDelegate>, withDeleted?: boolean): Where | undefined =>\n andWhere([buildWhere(meta, userFilter as Filter, diag), scopeWhere, meta.hasDeletedAt && !withDeleted ? { deletedAt: null } : undefined]);\n\n /**\n * Merge an id predicate into a filter as AND.\n *\n * An unresolvable `idKey` is **fatal**, never skipped: the normal \"drop the\n * condition\" path would leave `updateById`/`deleteById` with no predicate at\n * all and let them hit an arbitrary row. Same reasoning (and same error) as an\n * unknown `cursorKey`.\n */\n const withId = (filter: Filter<TDelegate> | undefined, idKey: string, id: Id): Filter<TDelegate> => {\n if (!resolveField(meta, idKey)) {\n throw new QueryKitError({ source: meta.name, site: \"filter\", key: idKey, reason: \"unknown-key\" });\n }\n const idCondition = { key: idKey, operation: \"=\" as const, value: id };\n if (!filter) return [idCondition] as Filter<TDelegate>;\n if (Array.isArray(filter)) return [...filter, idCondition] as Filter<TDelegate>;\n return { and: [filter, idCondition] } as Filter<TDelegate>;\n };\n\n /* ------------------------- projection guards --------------------------- */\n /* `columns` may arrive straight from the wire, so the safe selection belongs\n * here rather than in every route — the same reasoning as `scope`. Both\n * options are validated once, at build time, so a misconfiguration surfaces in\n * development instead of quietly returning full rows in production. */\n\n const forcedKeys = config.forcedColumns ? truthyKeys(config.forcedColumns as Record<string, boolean>) : undefined;\n if (config.forcedColumns && forcedKeys!.length === 0) {\n throw new Error(\"buildRepository: forcedColumns must select at least one field (an empty selection would return the full row).\");\n }\n\n const allowed = config.allowedColumns ? new Set<string>(config.allowedColumns as readonly string[]) : undefined;\n if (config.allowedColumns && allowed!.size === 0) {\n throw new Error(\"buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full row).\");\n }\n\n const guard: ProjectionGuard = { forcedKeys, allowed };\n const guarded = Boolean(forcedKeys ?? allowed);\n /** Whether a field may appear in a result at all. */\n const permits = (key: string): boolean => (forcedKeys ? forcedKeys.includes(key) : allowed ? allowed.has(key) : true);\n\n const projection = (columns?: QueryParams<TDelegate>[\"columns\"], withRelations?: QueryParams<TDelegate>[\"with\"], forceKeys?: string[]): Projection =>\n buildProjection(meta, guard, columns as Record<string, boolean> | undefined, withRelations, forceKeys);\n\n /** Apply scope defaults to insert values — scope wins (can't be overridden). */\n const forInsert = (values: object): Record<string, unknown> => ({\n ...(config.scope as object),\n ...values,\n ...(config.scope as object),\n });\n\n /**\n * Bump `updatedAt` on update when the model has one. Prisma maintains\n * `@updatedAt` fields itself, so those are left alone (`stampUpdatedAt` is\n * only set for a plain `updatedAt` field) — matching drizzle-pg's `forUpdate`\n * and mongoose's `timestamps` handling.\n */\n const forUpdate = (patch: object): Record<string, unknown> => {\n const stamped: Record<string, unknown> = { ...patch };\n if (meta.stampUpdatedAt) stamped[meta.stampUpdatedAt] = new Date();\n return stamped;\n };\n\n const countWhere = (where?: Where): Promise<number> => delegate().count({ where });\n\n /**\n * The conflict `where` for `upsert`. Prisma addresses a compound unique\n * constraint by its generated name — the target field names joined with `_`\n * (`@@unique([a, b])` → `where: { a_b: { a, b } }`). A constraint declared with\n * an explicit `name:` must be targeted through the raw client.\n */\n const upsertWhere = (targets: string[], values: Record<string, unknown>): Record<string, unknown> => {\n const fields = targets.map(key => {\n const field = resolveField(meta, key);\n if (!field) throw new Error(`upsert: unknown target field \"${key}\".`);\n return field;\n });\n if (fields.length === 1) return { [fields[0]!]: values[fields[0]!] };\n return { [fields.join(\"_\")]: Object.fromEntries(fields.map(field => [field, values[field]])) };\n };\n\n /** Default update-on-conflict set: the inserted values minus target/creation fields. */\n const defaultConflictSet = (values: Record<string, unknown>, targetKeys: string[]): Record<string, unknown> => {\n const skip = new Set([...targetKeys, \"createdAt\"]);\n const set: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(values)) {\n if (!skip.has(key)) set[key] = value;\n }\n return forUpdate(set);\n };\n\n const repository = {\n get delegate() {\n return delegate() as unknown as TDelegate;\n },\n\n async findAll(params: QueryParams<TDelegate> = {}) {\n const rows = await delegate().findMany({\n where: composeWhere(params.filter, params.withDeleted),\n orderBy: buildOrderBy(meta, params.sort as never, diag),\n ...projection(params.columns, params.with),\n });\n return rows as never;\n },\n\n async findOne(params: QueryParams<TDelegate> = {}) {\n const row = await delegate().findFirst({\n where: composeWhere(params.filter, params.withDeleted),\n orderBy: buildOrderBy(meta, params.sort as never, diag),\n ...projection(params.columns, params.with),\n });\n return (row ?? undefined) as never;\n },\n\n async findById(id: Id, params: ByIdParams<TDelegate> = {}) {\n const { idKey = \"id\", filter } = params;\n const row = await delegate().findFirst({\n where: composeWhere(withId(filter, idKey as string, id), params.withDeleted),\n ...projection(params.columns, params.with),\n });\n return (row ?? undefined) as never;\n },\n\n async findList(params: OffsetParams<TDelegate> = {}) {\n const page = Math.max(1, Math.trunc(params.page ?? 1));\n const perPage = clampPageSize(params.perPage, runtime.defaultPerPage, runtime.maxPerPage);\n const where = composeWhere(params.filter, params.withDeleted);\n\n const [data, total_items] = await Promise.all([\n delegate().findMany({\n where,\n orderBy: buildOrderBy(meta, params.sort as never, diag),\n take: perPage,\n skip: (page - 1) * perPage,\n ...projection(params.columns, params.with),\n }),\n countWhere(where),\n ]);\n\n const total_pages = Math.ceil(total_items / perPage);\n return {\n data,\n meta: {\n total_items,\n total_pages,\n current_page: page,\n per_page: perPage,\n has_next: page < total_pages,\n has_prev: page > 1,\n },\n } as OffsetResult<never>;\n },\n\n async findInfinite(params: InfiniteParams<TDelegate> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const offset = Math.max(0, Math.trunc(params.offset ?? 0));\n\n const rows = await delegate().findMany({\n where: composeWhere(params.filter, params.withDeleted),\n orderBy: buildOrderBy(meta, params.sort as never, diag),\n take: limit + 1,\n skip: offset,\n ...projection(params.columns, params.with),\n });\n\n const has_more = rows.length > limit;\n const data = has_more ? rows.slice(0, limit) : rows;\n return {\n data,\n meta: { limit, offset, count: data.length, has_more, next_offset: has_more ? offset + limit : null },\n } as InfiniteResult<never>;\n },\n\n async findCursor(params: CursorParams<TDelegate> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const cursorKey = (params.cursorKey ?? \"id\") as string;\n const order: SortDirection = params.order ?? \"asc\";\n const direction = params.direction ?? \"forward\";\n\n const field = resolveField(meta, cursorKey);\n // Always fatal: without a usable cursor field there is no pagination to\n // fall back to. Reported as a `QueryKitError` so the backend maps it to a\n // 400 the same way as any other bad condition (all three adapters agree).\n if (!field) throw new QueryKitError({ source: diag.source, site: \"cursorKey\", key: cursorKey, reason: \"unknown-key\" });\n\n // A cursor token carries dates as ISO strings, so re-cast to the field's\n // type — otherwise Prisma rejects `gt(dateTimeField, \"2026-…\")` and page 2\n // of a date-keyed feed 500s. A token that does not fit is treated as \"no\n // cursor\" (like an undecodable one).\n const decoded = decodeCursor(params.cursor);\n const cursorValue = decoded === undefined ? undefined : castValue(meta, field, decoded);\n const baseWhere = composeWhere(params.filter, params.withDeleted);\n\n // Keyset via WHERE (not Prisma's native `cursor`+`skip`) so the token stays\n // interchangeable with the drizzle-pg and mongoose adapters.\n const ascInQuery = direction === \"forward\" ? order === \"asc\" : order === \"desc\";\n const seek: Where | undefined = cursorValue !== undefined ? { [field]: ascInQuery ? { gt: cursorValue } : { lt: cursorValue } } : undefined;\n const where = andWhere([baseWhere, seek]);\n\n // Force-include the cursor field when a selection is given — otherwise its\n // value is missing and next/prev tokens break. `cursorKey` is\n // client-supplied, so under a projection guard this would be a way to read\n // a forbidden field: keep it in the query (pagination needs it) but strip\n // it from the rows we hand back.\n const selected = pickColumns(guard, params.columns as Record<string, boolean> | undefined);\n const leaksCursorField = guarded && selected !== undefined && !permits(cursorKey) && !permits(field);\n\n const rows = await delegate().findMany({\n where,\n orderBy: [{ [field]: ascInQuery ? \"asc\" : \"desc\" }],\n take: limit + 1,\n ...projection(params.columns, params.with, [field]),\n });\n\n const hasExtra = rows.length > limit;\n let page = hasExtra ? rows.slice(0, limit) : rows;\n if (direction === \"backward\") page = [...page].reverse();\n\n const first = page[0];\n const last = page[page.length - 1];\n\n const has_next = direction === \"forward\" ? hasExtra : cursorValue !== undefined;\n const has_prev = direction === \"forward\" ? cursorValue !== undefined : hasExtra;\n\n const meta_ = {\n limit,\n has_next,\n has_prev,\n next_cursor: has_next && last ? encodeCursor(last[field]) : null,\n prev_cursor: has_prev && first ? encodeCursor(first[field]) : null,\n };\n\n // Cursor values are read above, so the field can go now.\n if (leaksCursorField) {\n page = page.map(row => {\n const { [field]: _cursor, ...rest } = row;\n return rest;\n });\n }\n\n return { data: page, meta: meta_ } as CursorResult<never>;\n },\n\n count(filter?: Filter<TDelegate>) {\n return countWhere(composeWhere(filter));\n },\n\n async exists(filter?: Filter<TDelegate>) {\n return (await countWhere(composeWhere(filter))) > 0;\n },\n\n /* ------------------------------- writes ------------------------------- */\n\n async create(values: Insert<TDelegate>) {\n const row = await delegate().create({ data: forInsert(values as object) });\n return row as Row<TDelegate>;\n },\n\n async createMany(values: Insert<TDelegate>[]) {\n if (values.length === 0) return [];\n const data = values.map(v => forInsert(v as object));\n const d = delegate();\n // Prisma's `createMany` returns only a count. `createManyAndReturn` (5.14+,\n // Postgres) returns the rows; without it, fall back to sequential creates\n // so the `Row[]` contract — which drizzle's `.returning()` and mongoose's\n // `insertMany` both honour — still holds.\n if (typeof d.createManyAndReturn === \"function\") {\n return (await d.createManyAndReturn({ data })) as Row<TDelegate>[];\n }\n const out: Row<TDelegate>[] = [];\n for (const item of data) out.push((await d.create({ data: item })) as Row<TDelegate>);\n return out;\n },\n\n async upsert(values: Insert<TDelegate>, options: UpsertOptions<TDelegate>) {\n const targetKeys = toArray(options.target) as string[];\n const inserted = forInsert(values as object);\n const update = options.set ? forUpdate(options.set as object) : defaultConflictSet(inserted, targetKeys);\n const row = await delegate().upsert({\n where: upsertWhere(targetKeys, inserted),\n create: inserted,\n update,\n });\n return row as Row<TDelegate>;\n },\n\n async upsertMany(values: Insert<TDelegate>[], options: UpsertOptions<TDelegate>) {\n if (values.length === 0) return [];\n const targetKeys = toArray(options.target) as string[];\n const out: Row<TDelegate>[] = [];\n // Prisma has no bulk upsert, so this is a sequential loop (chunked only to\n // keep the promise pressure bounded). Input order is preserved, matching\n // the other adapters' return contract.\n for (let i = 0; i < values.length; i += CHUNK_SIZE) {\n for (const value of values.slice(i, i + CHUNK_SIZE)) {\n const inserted = forInsert(value as object);\n const update = options.set ? forUpdate(options.set as object) : defaultConflictSet(inserted, targetKeys);\n out.push(\n (await delegate().upsert({\n where: upsertWhere(targetKeys, inserted),\n create: inserted,\n update,\n })) as Row<TDelegate>,\n );\n }\n }\n return out;\n },\n\n async updateById(id: Id, patch: Partial<Insert<TDelegate>>, idKey: string = \"id\") {\n return updateOne(composeWhere(withId(undefined, idKey, id)), forUpdate(patch as object), \"updateById\");\n },\n\n async updateWhere(filter: Filter<TDelegate>, patch: Partial<Insert<TDelegate>>) {\n const key = requirePrimaryKey(\"updateWhere\");\n const where = composeWhere(filter);\n const d = delegate();\n // Prisma's `updateMany` returns a count, so the affected keys are collected\n // first and re-read afterwards (the same shape the mongoose adapter uses).\n const found = await d.findMany({ where, select: keySelect(key) });\n if (found.length === 0) return [];\n const keyed = keyedIn(key, found);\n await d.updateMany({ where: keyed, data: forUpdate(patch as object) });\n return (await d.findMany({ where: keyed })) as Row<TDelegate>[];\n },\n\n async deleteById(id: Id, idKey: string = \"id\") {\n const key = requirePrimaryKey(\"deleteById\");\n const d = delegate();\n const target = await d.findFirst({ where: composeWhere(withId(undefined, idKey, id)) });\n if (!target) return undefined;\n return (await d.delete({ where: uniqueWhere(key, target) })) as Row<TDelegate>;\n },\n\n async deleteWhere(filter: Filter<TDelegate>) {\n const key = requirePrimaryKey(\"deleteWhere\");\n const d = delegate();\n const where = composeWhere(filter);\n const rows = await d.findMany({ where });\n if (rows.length === 0) return [];\n await d.deleteMany({ where: keyedIn(key, rows) });\n return rows as Row<TDelegate>[];\n },\n\n async softDelete(id: Id, idKey: string = \"id\") {\n if (!meta.hasDeletedAt) throw new Error(\"softDelete: model has no deletedAt field.\");\n return updateOne(composeWhere(withId(undefined, idKey, id), false), forUpdate({ deletedAt: new Date() }), \"softDelete\");\n },\n\n async restore(id: Id, idKey: string = \"id\") {\n if (!meta.hasDeletedAt) throw new Error(\"restore: model has no deletedAt field.\");\n return updateOne(composeWhere(withId(undefined, idKey, id), true), forUpdate({ deletedAt: null }), \"restore\");\n },\n\n async aggregate(spec: AggregateSpec<TDelegate>): Promise<AggregateRow[]> {\n // An aggregate spec can also come from a request, and `min(password)` or a\n // `groupBy` on a hidden field leaks just as much as a projection — so the\n // same guard applies here (matching drizzle-pg and mongoose).\n const aggregable = (key: string): string | undefined => {\n const field = permits(key) ? resolveField(meta, key) : undefined;\n if (!field) reportSkip(diag, { site: \"aggregate\", key, reason: \"unknown-key\" });\n return field;\n };\n\n const groupFields = toArray(spec.groupBy as string | string[] | undefined)\n .map(aggregable)\n .filter((field): field is string => Boolean(field));\n\n const selectionFor = (keys: string[]): Record<string, true> | undefined => {\n const picked: Record<string, true> = {};\n for (const key of keys) {\n const field = aggregable(key);\n if (field) picked[field] = true;\n }\n return Object.keys(picked).length ? picked : undefined;\n };\n\n const sum = selectionFor(toArray(spec.sum as string | string[] | undefined));\n const avg = selectionFor(toArray(spec.avg as string | string[] | undefined));\n const min = selectionFor(toArray(spec.min as string | string[] | undefined));\n const max = selectionFor(toArray(spec.max as string | string[] | undefined));\n\n const args: Record<string, unknown> = { where: composeWhere(spec.filter as Filter<TDelegate> | undefined, spec.withDeleted) };\n if (spec.count) args._count = true;\n if (sum) args._sum = sum;\n if (avg) args._avg = avg;\n if (min) args._min = min;\n if (max) args._max = max;\n\n /** Flatten Prisma's `{_count, _sum: {x}}` into drizzle's `{count, sum_x}` shape. */\n const flatten = (row: Record<string, unknown>): AggregateRow => {\n const out: AggregateRow = {};\n for (const [key, value] of Object.entries(row)) {\n if (!key.startsWith(\"_\")) {\n out[key] = value;\n continue;\n }\n if (key === \"_count\") {\n if (typeof value === \"number\") out.count = value;\n continue;\n }\n const prefix = key.slice(1); // \"_sum\" → \"sum\"\n for (const [field, aggregated] of Object.entries((value ?? {}) as Record<string, unknown>)) {\n if (aggregated !== undefined) out[`${prefix}_${field}`] = aggregated;\n }\n }\n return out;\n };\n\n if (groupFields.length > 0) {\n const rows = await delegate().groupBy({ ...args, by: groupFields });\n return rows.map(flatten);\n }\n return [flatten(await delegate().aggregate(args))];\n },\n\n scoped(scope: Scope<TDelegate>) {\n return buildRepository<TDelegate>(runtime, modelKey, { ...config, scope: { ...config.scope, ...scope } });\n },\n };\n\n /**\n * Update the single row matching an arbitrary predicate. Prisma's `update`\n * only accepts a unique `where`, while querykit's predicate also carries the\n * scope and soft-delete guards — so the row is located first, then updated by\n * its primary key.\n */\n async function updateOne(where: Where | undefined, data: Record<string, unknown>, method: string): Promise<Row<TDelegate> | undefined> {\n const key = requirePrimaryKey(method);\n const d = delegate();\n const target = await d.findFirst({ where, select: keySelect(key) });\n if (!target) return undefined;\n return (await d.update({ where: uniqueWhere(key, target), data })) as Row<TDelegate>;\n }\n\n return repository as unknown as Repository<TDelegate>;\n}\n\n/** Re-exported for tests and advanced use. */\nexport type { ColumnSelection };\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\n/**\n * A Prisma client or interactive-transaction client. The adapter only ever needs\n * model delegates off it, so it is kept structural — this file never imports\n * `@prisma/client` (see the package README: the generated client is a peer).\n */\nexport type AnyExecutor = Record<string, unknown>;\n\n/**\n * Per-transaction ambient state. Lets repositories pick up the active\n * transaction client without threading it through every call. Set by\n * `registry.transaction`.\n */\nexport interface RepoContext {\n executor?: AnyExecutor;\n}\n\nexport interface ContextStore {\n /** Read the current ambient context (undefined outside any `run`). */\n get(): RepoContext | undefined;\n /** Run `fn` with `patch` merged over the current context. */\n run<T>(patch: RepoContext, fn: () => T): T;\n}\n\nexport function createContextStore(): ContextStore {\n const als = new AsyncLocalStorage<RepoContext>();\n return {\n get: () => als.getStore(),\n run: (patch, fn) => als.run({ ...als.getStore(), ...patch }, fn),\n };\n}\n","import { DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_MAX_PER_PAGE, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\n\nimport type { AnyClient, AnyDelegate, DelegateOf, ModelKey, Registry, RegistryOptions, Repository, RepositoryExtender, RepositoryOptions } from \"./types\";\nimport { buildRepository, type RepoRuntime } from \"./repository\";\nimport { createContextStore, type AnyExecutor } from \"./internal/context\";\nimport { delegateKeys } from \"./internal/fields\";\n\n/** A Prisma client's interactive-transaction method. */\ninterface Transactional {\n $transaction<T>(fn: (tx: AnyExecutor) => Promise<T>): Promise<T>;\n}\n\n/**\n * Accept either the delegate key (`\"user\"`) or the delegate itself\n * (`prisma.user`) and return the key.\n *\n * A repository always addresses its model **by key**, never by holding on to a\n * delegate object: inside `registry.transaction(...)` the model has to be looked\n * up on the transaction client, and a captured delegate would quietly keep\n * writing outside the transaction. The lookup is by object identity, the same\n * way the drizzle-pg adapter finds a table's key in the schema.\n */\nfunction resolveModelKey(client: AnyClient, model: string | AnyDelegate): string {\n if (typeof model === \"string\") return model;\n const keys = delegateKeys(client);\n const found = keys.find(key => client[key] === model);\n if (!found) {\n throw new Error(\n `createRegistry: the given delegate does not belong to this Prisma client. ` +\n `Pass a model from the same client you passed to createRegistry (available: ${keys.join(\", \") || \"(none)\"}), or use its name, e.g. repository(\"user\").`,\n );\n }\n return found;\n}\n\n/**\n * Create the DB **registry** once. It holds the Prisma client (for transactions)\n * and yields a {@link Repository} per model. Transactions flow ambiently via\n * AsyncLocalStorage — repositories used inside `registry.transaction(...)`\n * automatically run on that transaction client, with no `tx` threading.\n *\n * Framework-agnostic by design: this package knows nothing about HTTP, so the\n * same registry serves Express, Hono, NestJS or a background worker. Parse and\n * validate the request in your app (`@querykitjs/zod` or\n * `@querykitjs/class-validator`), then hand the params straight to a repository.\n *\n * @param prisma - your `PrismaClient` instance.\n * @param options - pagination defaults/bounds and diagnostics; defaults come\n * from `@querykitjs/core` (`DEFAULT_PER_PAGE`/`DEFAULT_LIMIT` = 20).\n * @example\n * ```ts\n * // registry.ts (once)\n * export const registry = createRegistry(prisma);\n *\n * // users.repository.ts — with custom methods\n * export const usersRepository = registry.repository(\"user\", base => ({\n * findByEmail: (email: string) => base.findOne({ filter: [{ key: \"email\", value: email }] }),\n * }));\n * ```\n */\nexport function createRegistry<TClient extends AnyClient>(prisma: TClient, options: RegistryOptions = {}): Registry<TClient> {\n const ctx = createContextStore();\n const runtime: RepoRuntime = {\n baseClient: prisma as AnyExecutor,\n getExecutor: () => ctx.get()?.executor ?? (prisma as AnyExecutor),\n defaultPerPage: options.defaultPerPage ?? DEFAULT_PER_PAGE,\n defaultLimit: options.defaultLimit ?? DEFAULT_LIMIT,\n maxPerPage: options.maxPerPage ?? DEFAULT_MAX_PER_PAGE,\n maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,\n strict: options.strict ?? false,\n onSkippedCondition: options.onSkippedCondition,\n };\n\n /* A model is addressed either by its delegate key (`\"user\"`) or by the delegate\n * itself (`prisma.user`) — the latter mirrors how the drizzle-pg and mongoose\n * registries take a table/model handle, so all three read identically. */\n\n function repository<TKey extends ModelKey<TClient>>(model: TKey): Repository<DelegateOf<TClient, TKey>>;\n function repository<TKey extends ModelKey<TClient>, TExt extends Record<string, unknown>>(\n model: TKey,\n extend: RepositoryExtender<DelegateOf<TClient, TKey>, TExt>,\n ): Repository<DelegateOf<TClient, TKey>> & TExt;\n function repository<TKey extends ModelKey<TClient>>(\n model: TKey,\n options: RepositoryOptions<DelegateOf<TClient, TKey>>,\n ): Repository<DelegateOf<TClient, TKey>>;\n function repository<TKey extends ModelKey<TClient>, TExt extends Record<string, unknown>>(\n model: TKey,\n options: RepositoryOptions<DelegateOf<TClient, TKey>>,\n extend: RepositoryExtender<DelegateOf<TClient, TKey>, TExt>,\n ): Repository<DelegateOf<TClient, TKey>> & TExt;\n\n function repository<TDelegate extends AnyDelegate>(model: TDelegate): Repository<TDelegate>;\n function repository<TDelegate extends AnyDelegate, TExt extends Record<string, unknown>>(\n model: TDelegate,\n extend: RepositoryExtender<TDelegate, TExt>,\n ): Repository<TDelegate> & TExt;\n function repository<TDelegate extends AnyDelegate>(model: TDelegate, options: RepositoryOptions<TDelegate>): Repository<TDelegate>;\n function repository<TDelegate extends AnyDelegate, TExt extends Record<string, unknown>>(\n model: TDelegate,\n options: RepositoryOptions<TDelegate>,\n extend: RepositoryExtender<TDelegate, TExt>,\n ): Repository<TDelegate> & TExt;\n\n function repository(model: string | AnyDelegate, arg2?: RepositoryOptions<any> | RepositoryExtender<any, any>, arg3?: RepositoryExtender<any, any>) {\n // 2nd arg is either the options object or the extender fn (same dispatch as\n // the drizzle-pg and mongoose adapters, so all three registries read alike).\n const repoOptions = typeof arg2 === \"function\" ? undefined : arg2;\n const extend = typeof arg2 === \"function\" ? arg2 : arg3;\n const base = buildRepository(runtime, resolveModelKey(prisma, model), repoOptions);\n return extend ? { ...base, ...extend(base) } : base;\n }\n\n const transaction = <T>(fn: () => Promise<T>): Promise<T> => {\n // Prisma has no savepoints, so a nested call reuses the ambient transaction\n // rather than opening a second one (the mongoose adapter does the same;\n // drizzle-pg can create a real savepoint there).\n if (ctx.get()?.executor) return fn();\n return (prisma as unknown as Transactional).$transaction(tx => ctx.run({ executor: tx }, fn));\n };\n\n return { client: prisma, repository, transaction };\n}\n","import { createFilters as coreCreateFilters, f } from \"@querykitjs/core\";\n\nimport type { FieldKey, RawWhere } from \"./types\";\n\n/**\n * Typed, ergonomic filter builders for a model (field-name autocomplete). A thin\n * wrapper over `@querykitjs/core`'s builder — the key type is the model's field\n * key, the raw escape hatch is that model's native `WhereInput`.\n *\n * @example\n * ```ts\n * const uf = createFilters<typeof prisma.user>();\n * await usersRepository.findAll({ filter: uf.and(uf.eq(\"status\", \"active\"), uf.gte(\"age\", 18)) });\n * ```\n */\nexport function createFilters<TDelegate>() {\n return coreCreateFilters<FieldKey<TDelegate>, RawWhere<TDelegate>>();\n}\n\n/** Untyped filter helpers for quick use. */\nexport { f };\n"]}