{"version":3,"file":"index.mjs","names":["parsePostgresArray","cuid2","#driver","#log","#initDone","#destroyPromise","#initPromise","#connections","#needsLogging","#addLogging","#txConnections","#logError","#logQuery","#calculateDurationMillis","BuiltinFunctions","z"],"sources":["../src/utils/zod-utils.ts","../src/utils/object-utils.ts","../src/client/executor/error-processor.ts","../src/client/errors.ts","../src/client/query-utils.ts","../src/client/constants.ts","../src/client/contract.ts","../src/client/crud/dialects/base-dialect.ts","../src/client/crud/dialects/lateral-join-dialect-base.ts","../src/client/crud/dialects/mysql.ts","../src/client/crud/dialects/postgresql.ts","../src/client/crud/dialects/sqlite.ts","../src/client/crud/dialects/index.ts","../src/client/zod/cache-decorator.ts","../src/client/zod/factory.ts","../src/client/crud/validator/validator.ts","../src/client/crud/operations/base.ts","../src/client/crud/operations/aggregate.ts","../src/client/crud/operations/count.ts","../src/client/crud/operations/create.ts","../src/client/crud/operations/delete.ts","../src/client/crud/operations/exists.ts","../src/client/crud/operations/find.ts","../src/client/crud/operations/group-by.ts","../src/client/crud/operations/update.ts","../src/client/executor/zenstack-driver.ts","../src/client/executor/name-mapper.ts","../src/client/executor/temp-alias-transformer.ts","../src/client/executor/zenstack-query-executor.ts","../src/client/functions.ts","../src/client/helpers/schema-db-pusher.ts","../src/client/promise.ts","../src/client/result-processor.ts","../src/client/client-impl.ts","../src/client/plugin.ts","../src/utils/kysely-utils.ts","../src/utils/schema-utils.ts"],"sourcesContent":["import { ZodError } from 'zod';\nimport { fromError } from 'zod-validation-error/v4';\n\n/**\n * Format ZodError into a readable string\n */\nexport function formatError(error: ZodError): string {\n    return fromError(error).toString();\n}\n","import { isPlainObject } from '@zenstackhq/common-helpers';\n\n/**\n * Extract fields from an object.\n */\nexport function extractFields(obj: any, fields: readonly string[]) {\n    return Object.fromEntries(Object.entries(obj).filter(([key]) => fields.includes(key)));\n}\n\n/**\n * Create an object with fields as keys and true values.\n */\nexport function fieldsToSelectObject(fields: readonly string[]): Record<string, boolean> {\n    return Object.fromEntries(fields.map((f) => [f, true]));\n}\n\n/**\n * Checks if the given value is an empty plain object.\n */\nexport function isEmptyObject(x: unknown) {\n    return isPlainObject(x) && Object.keys(x as object).length === 0;\n}\n","/**\n * Extracts database error code from an error thrown by the database driver.\n *\n * @todo currently assumes the error has a code field\n */\nexport function getDbErrorCode(error: unknown): unknown | undefined {\n    if (error instanceof Error && 'code' in error) {\n        return error.code;\n    } else {\n        return undefined;\n    }\n}\n","import { getDbErrorCode } from './executor/error-processor';\n\n/**\n * Reason code for ORM errors.\n */\nexport enum ORMErrorReason {\n    /**\n     * ORM client configuration error.\n     */\n    CONFIG_ERROR = 'config-error',\n\n    /**\n     * Invalid input error.\n     */\n    INVALID_INPUT = 'invalid-input',\n\n    /**\n     * The specified record was not found.\n     */\n    NOT_FOUND = 'not-found',\n\n    /**\n     * Operation is rejected by access policy.\n     */\n    REJECTED_BY_POLICY = 'rejected-by-policy',\n\n    /**\n     * Error was thrown by the underlying database driver.\n     */\n    DB_QUERY_ERROR = 'db-query-error',\n\n    /**\n     * The requested operation is not supported.\n     */\n    NOT_SUPPORTED = 'not-supported',\n\n    /**\n     * An internal error occurred.\n     */\n    INTERNAL_ERROR = 'internal-error',\n}\n\n/**\n * Reason code for policy rejection.\n */\nexport enum RejectedByPolicyReason {\n    /**\n     * Rejected because the operation is not allowed by policy.\n     */\n    NO_ACCESS = 'no-access',\n\n    /**\n     * Rejected because the result cannot be read back after mutation due to policy.\n     */\n    CANNOT_READ_BACK = 'cannot-read-back',\n\n    /**\n     * Other reasons.\n     */\n    OTHER = 'other',\n}\n\n/**\n * ZenStack ORM error.\n */\nexport class ORMError extends Error {\n    constructor(\n        public reason: ORMErrorReason,\n        message?: string,\n        options?: ErrorOptions,\n    ) {\n        super(message, options);\n    }\n\n    /**\n     * The name of the model that the error pertains to.\n     */\n    public model?: string;\n\n    /**\n     * The error code given by the underlying database driver.\n     */\n    public dbErrorCode?: unknown;\n\n    /**\n     * The error message given by the underlying database driver.\n     */\n    public dbErrorMessage?: string;\n\n    /**\n     * The reason code for policy rejection. Only available when `reason` is `REJECTED_BY_POLICY`.\n     */\n    public rejectedByPolicyReason?: RejectedByPolicyReason;\n\n    /**\n     * The SQL query that was executed. Only available when `reason` is `DB_QUERY_ERROR`.\n     */\n    public sql?: string;\n\n    /**\n     * The parameters used in the SQL query. Only available when `reason` is `DB_QUERY_ERROR`.\n     */\n    public sqlParams?: readonly unknown[];\n}\n\nexport function createConfigError(message: string, options?: ErrorOptions) {\n    return new ORMError(ORMErrorReason.CONFIG_ERROR, message, options);\n}\n\nexport function createNotFoundError(model: string, message?: string, options?: ErrorOptions) {\n    const error = new ORMError(ORMErrorReason.NOT_FOUND, message ?? 'Record not found', options);\n    error.model = model;\n    return error;\n}\n\nexport function createInvalidInputError(message: string, model?: string, options?: ErrorOptions) {\n    const error = new ORMError(ORMErrorReason.INVALID_INPUT, message, options);\n    error.model = model;\n    return error;\n}\n\nexport function createDBQueryError(message: string, dbError: unknown, sql: string, parameters: readonly unknown[]) {\n    const error = new ORMError(ORMErrorReason.DB_QUERY_ERROR, message, { cause: dbError });\n    error.dbErrorCode = getDbErrorCode(dbError);\n    error.dbErrorMessage = dbError instanceof Error ? dbError.message : undefined;\n    error.sql = sql;\n    error.sqlParams = parameters;\n    return error;\n}\n\nexport function createRejectedByPolicyError(\n    model: string,\n    reason: RejectedByPolicyReason,\n    message: string,\n    options?: ErrorOptions,\n) {\n    const error = new ORMError(ORMErrorReason.REJECTED_BY_POLICY, message, options);\n    error.model = model;\n    error.rejectedByPolicyReason = reason;\n    return error;\n}\n\nexport function createNotSupportedError(message: string, options?: ErrorOptions) {\n    return new ORMError(ORMErrorReason.NOT_SUPPORTED, message, options);\n}\n\nexport function createInternalError(message: string, model?: string, options?: ErrorOptions) {\n    const error = new ORMError(ORMErrorReason.INTERNAL_ERROR, message, options);\n    error.model = model;\n    return error;\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { ExpressionUtils, type FieldDef, type GetModels, type ModelDef, type SchemaDef } from '@zenstackhq/schema';\nimport {\n    AliasNode,\n    ColumnNode,\n    ReferenceNode,\n    TableNode,\n    type Expression,\n    type ExpressionBuilder,\n    type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport { extractFields } from '../utils/object-utils';\nimport type { AggregateOperators } from './constants';\nimport { createInternalError } from './errors';\n\nexport function hasModel(schema: SchemaDef, model: string) {\n    return Object.keys(schema.models)\n        .map((k) => k.toLowerCase())\n        .includes(model.toLowerCase());\n}\n\n/**\n * Structural lookups derived purely from the (immutable) schema. The schema does not\n * change for a client's lifetime, so these results are memoized per-schema and shared\n * across every consumer (orm query building + plugins). Keyed by the schema object so\n * the cache dies with the schema and never leaks across schemas. See issue #2715.\n */\ninterface SchemaLookupCache {\n    model: Map<string, ModelDef | undefined>;\n    m2mRelation: Map<string, ReturnType<typeof computeManyToManyRelation>>;\n    m2mJoinTable?: Map<string, ManyToManyJoinTableEndpoints | undefined>;\n}\n\nconst schemaLookupCache = new WeakMap<SchemaDef, SchemaLookupCache>();\n\nfunction getSchemaLookupCache(schema: SchemaDef): SchemaLookupCache {\n    let cache = schemaLookupCache.get(schema);\n    if (!cache) {\n        cache = { model: new Map(), m2mRelation: new Map() };\n        schemaLookupCache.set(schema, cache);\n    }\n    return cache;\n}\n\nexport function getModel(schema: SchemaDef, model: string) {\n    const cache = getSchemaLookupCache(schema);\n    const key = model.toLowerCase();\n    if (cache.model.has(key)) {\n        return cache.model.get(key);\n    }\n    const result = Object.values(schema.models).find((m) => m.name.toLowerCase() === key);\n    cache.model.set(key, result);\n    return result;\n}\n\nexport function getTypeDef(schema: SchemaDef, type: string) {\n    return schema.typeDefs?.[type];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n    const modelDef = getModel(schema, model);\n    if (!modelDef) {\n        throw createInternalError(`Model \"${model}\" not found in schema`, model);\n    }\n    return modelDef;\n}\n\nexport function requireTypeDef(schema: SchemaDef, type: string) {\n    const typeDef = getTypeDef(schema, type);\n    if (!typeDef) {\n        throw createInternalError(`Type \"${type}\" not found in schema`, type);\n    }\n    return typeDef;\n}\n\nexport function getField(schema: SchemaDef, model: string, field: string) {\n    const modelDef = getModel(schema, model);\n    return modelDef?.fields[field];\n}\n\nexport function requireField(schema: SchemaDef, modelOrType: string, field: string) {\n    const modelDef = getModel(schema, modelOrType);\n    if (modelDef) {\n        if (!modelDef.fields[field]) {\n            throw createInternalError(`Field \"${field}\" not found in model \"${modelOrType}\"`, modelOrType);\n        } else {\n            return modelDef.fields[field];\n        }\n    }\n    const typeDef = getTypeDef(schema, modelOrType);\n    if (typeDef) {\n        if (!typeDef.fields[field]) {\n            throw createInternalError(`Field \"${field}\" not found in type \"${modelOrType}\"`, modelOrType);\n        } else {\n            return typeDef.fields[field];\n        }\n    }\n    throw createInternalError(`Model or type \"${modelOrType}\" not found in schema`, modelOrType);\n}\n\n/**\n * Gets all model fields, by default non-relation, non-computed, non-inherited, non-unsupported fields only.\n */\nexport function getModelFields(\n    schema: SchemaDef,\n    model: string,\n    options?: { relations?: boolean; computed?: boolean; inherited?: boolean; unsupported?: boolean },\n) {\n    const modelDef = requireModel(schema, model);\n    return Object.values(modelDef.fields).filter((f) => {\n        if (f.relation && !options?.relations) {\n            return false;\n        }\n        if (f.computed && !options?.computed) {\n            return false;\n        }\n        if (f.originModel && !options?.inherited) {\n            return false;\n        }\n        if (f.type === 'Unsupported' && !options?.unsupported) {\n            return false;\n        }\n        return true;\n    });\n}\n\n/**\n * Checks if a field is of `Unsupported` type.\n */\nexport function isUnsupportedField(fieldDef: FieldDef) {\n    return fieldDef.type === 'Unsupported';\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n    const modelDef = getModel(schema, model);\n    return modelDef?.idFields;\n}\n\nexport function requireIdFields(schema: SchemaDef, model: string) {\n    const modelDef = requireModel(schema, model);\n    const result = modelDef?.idFields;\n    if (!result) {\n        throw createInternalError(`Model \"${model}\" does not have ID field(s)`, model);\n    }\n    return result;\n}\n\nexport function getRelationForeignKeyFieldPairs(schema: SchemaDef, model: string, relationField: string) {\n    const fieldDef = requireField(schema, model, relationField);\n\n    if (!fieldDef?.relation) {\n        throw createInternalError(`Field \"${relationField}\" is not a relation`, model);\n    }\n\n    if (fieldDef.relation.fields) {\n        if (!fieldDef.relation.references) {\n            throw createInternalError(`Relation references not defined for field \"${relationField}\"`, model);\n        }\n        // this model owns the fk\n        return {\n            keyPairs: fieldDef.relation.fields.map((f, i) => ({\n                fk: f,\n                pk: fieldDef.relation!.references![i]!,\n            })),\n            ownedByModel: true,\n        };\n    } else {\n        if (!fieldDef.relation.opposite) {\n            throw createInternalError(`Opposite relation not defined for field \"${relationField}\"`, model);\n        }\n\n        const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n        if (!oppositeField.relation) {\n            throw createInternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`, model);\n        }\n        if (!oppositeField.relation.fields) {\n            throw createInternalError(`Relation fields not defined for field \"${relationField}\"`, model);\n        }\n        if (!oppositeField.relation.references) {\n            throw createInternalError(`Relation references not defined for field \"${relationField}\"`, model);\n        }\n\n        // the opposite model owns the fk\n        return {\n            keyPairs: oppositeField.relation.fields.map((f, i) => ({\n                fk: f,\n                pk: oppositeField.relation!.references![i]!,\n            })),\n            ownedByModel: false,\n        };\n    }\n}\n\nexport function isScalarField(schema: SchemaDef, model: string, field: string): boolean {\n    const fieldDef = getField(schema, model, field);\n    return !fieldDef?.relation && !fieldDef?.foreignKeyFor;\n}\n\nexport function isForeignKeyField(schema: SchemaDef, model: string, field: string): boolean {\n    const fieldDef = getField(schema, model, field);\n    return !!fieldDef?.foreignKeyFor;\n}\n\nexport function isRelationField(schema: SchemaDef, model: string, field: string): boolean {\n    const fieldDef = getField(schema, model, field);\n    return !!fieldDef?.relation;\n}\n\nexport function isInheritedField(schema: SchemaDef, model: string, field: string): boolean {\n    const fieldDef = getField(schema, model, field);\n    return !!fieldDef?.originModel;\n}\n\nexport function getUniqueFields(schema: SchemaDef, model: string) {\n    const modelDef = requireModel(schema, model);\n    const result: Array<\n        // single field unique\n        | { name: string; def: FieldDef }\n        // multi-field unique\n        | { name: string; defs: Record<string, FieldDef> }\n    > = [];\n    for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n        if (typeof value !== 'object') {\n            throw createInternalError(`Invalid unique field definition for \"${key}\"`, model);\n        }\n\n        if (typeof value.type === 'string') {\n            // singular unique field\n            result.push({ name: key, def: requireField(schema, model, key) });\n        } else {\n            // compound unique field\n            result.push({\n                name: key,\n                defs: Object.fromEntries(Object.keys(value).map((k) => [k, requireField(schema, model, k)])),\n            });\n        }\n    }\n    return result;\n}\n\nexport function getIdValues(schema: SchemaDef, model: string, data: any): Record<string, any> {\n    const idFields = getIdFields(schema, model);\n    if (!idFields) {\n        throw createInternalError(`ID fields not defined for model \"${model}\"`, model);\n    }\n    return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function fieldHasDefaultValue(fieldDef: FieldDef) {\n    return fieldDef.default !== undefined || fieldDef.updatedAt;\n}\n\nexport function isEnum(schema: SchemaDef, type: string) {\n    return !!schema.enums?.[type];\n}\n\nexport function getEnum(schema: SchemaDef, type: string) {\n    return schema.enums?.[type];\n}\n\nexport function isTypeDef(schema: SchemaDef, type: string) {\n    return !!schema.typeDefs?.[type];\n}\n\nexport function buildJoinPairs(\n    schema: SchemaDef,\n    model: string,\n    modelAlias: string,\n    relationField: string,\n    relationModelAlias: string,\n): [string, string][] {\n    const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(schema, model, relationField);\n\n    return keyPairs.map(({ fk, pk }) => {\n        if (ownedByModel) {\n            // the parent model owns the fk\n            return [`${relationModelAlias}.${pk}`, `${modelAlias}.${fk}`];\n        } else {\n            // the relation side owns the fk\n            return [`${relationModelAlias}.${fk}`, `${modelAlias}.${pk}`];\n        }\n    });\n}\n\nexport function makeDefaultOrderBy(schema: SchemaDef, model: string) {\n    const idFields = requireIdFields(schema, model);\n    return idFields.map((f) => ({ [f]: 'asc' }) as const);\n}\n\nexport function getManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n    const cache = getSchemaLookupCache(schema);\n    const key = `${model} ${field}`;\n    if (cache.m2mRelation.has(key)) {\n        return cache.m2mRelation.get(key);\n    }\n    const result = computeManyToManyRelation(schema, model, field);\n    cache.m2mRelation.set(key, result);\n    return result;\n}\n\n/**\n * Endpoints of an implicit many-to-many relation, identified by its join table name.\n */\nexport interface ManyToManyJoinTableEndpoints {\n    model: string;\n    field: string;\n    otherModel: string;\n    otherField: string;\n}\n\n/**\n * Resolve the relation endpoints for an implicit many-to-many join table by its table\n * name, or `undefined` if the table is not an implicit m2m join table. The join-table\n * index is built once per schema (single pass) and reused, making this an O(1) lookup.\n * See issue #2715.\n */\nexport function getManyToManyJoinTable(\n    schema: SchemaDef,\n    joinTableName: string,\n): ManyToManyJoinTableEndpoints | undefined {\n    const cache = getSchemaLookupCache(schema);\n    if (!cache.m2mJoinTable) {\n        const map = new Map<string, ManyToManyJoinTableEndpoints>();\n        for (const model of Object.values(schema.models)) {\n            for (const field of Object.values(model.fields)) {\n                const m2m = getManyToManyRelation(schema, model.name, field.name);\n                if (m2m?.joinTable && !map.has(m2m.joinTable)) {\n                    map.set(m2m.joinTable, {\n                        model: model.name,\n                        field: field.name,\n                        otherModel: m2m.otherModel,\n                        otherField: m2m.otherField,\n                    });\n                }\n            }\n        }\n        cache.m2mJoinTable = map;\n    }\n    return cache.m2mJoinTable.get(joinTableName);\n}\n\nfunction computeManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n    const fieldDef = requireField(schema, model, field);\n    if (!fieldDef.array || !fieldDef.relation?.opposite) {\n        return undefined;\n    }\n\n    // in case the m2m relation field is inherited from a delegate base, get the base model\n    const realModel = fieldDef.originModel ?? model;\n\n    const oppositeFieldDef = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n    if (oppositeFieldDef.array) {\n        // Prisma's convention for many-to-many relation:\n        // - model are sorted alphabetically by name\n        // - join table is named _<model1>To<model2>, unless an explicit name is provided by `@relation`\n        // - foreign keys are named A and B (based on the order of the model)\n        const sortedModelNames = [realModel, fieldDef.type].sort();\n\n        let orderedFK: [string, string];\n        if (realModel !== fieldDef.type) {\n            // not a self-relation, model name's sort order determines fk order\n            orderedFK = sortedModelNames[0] === realModel ? ['A', 'B'] : ['B', 'A'];\n        } else {\n            // for self-relations, since model names are identical, relation field name's\n            // sort order determines fk order\n            const sortedFieldNames = [field, oppositeFieldDef.name].sort();\n            orderedFK = sortedFieldNames[0] === field ? ['A', 'B'] : ['B', 'A'];\n        }\n\n        const modelIdFields = requireIdFields(schema, realModel);\n        invariant(modelIdFields.length === 1, 'Only single-field ID is supported for many-to-many relation');\n        const otherIdFields = requireIdFields(schema, fieldDef.type);\n        invariant(otherIdFields.length === 1, 'Only single-field ID is supported for many-to-many relation');\n\n        return {\n            parentFkName: orderedFK[0],\n            parentPKName: modelIdFields[0]!,\n            otherModel: fieldDef.type,\n            otherField: fieldDef.relation.opposite,\n            otherFkName: orderedFK[1],\n            otherPKName: otherIdFields[0]!,\n            joinTable: fieldDef.relation.name\n                ? `_${fieldDef.relation.name}`\n                : `_${sortedModelNames[0]}To${sortedModelNames[1]}`,\n        };\n    } else {\n        return undefined;\n    }\n}\n\n/**\n * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`\n */\nexport function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) {\n    if (typeof filter !== 'object' || !filter) {\n        return filter;\n    }\n\n    const uniqueFields = getUniqueFields(schema, model);\n    const compoundUniques = uniqueFields.filter((u) => 'defs' in u);\n    if (compoundUniques.length === 0) {\n        return filter;\n    }\n\n    const flattenedResult: any = {};\n    const restFilter: any = {};\n\n    for (const [key, value] of Object.entries(filter)) {\n        if (compoundUniques.some(({ name }) => name === key)) {\n            // flatten the compound field\n            Object.assign(flattenedResult, value);\n        } else {\n            restFilter[key] = value;\n        }\n    }\n\n    if (Object.keys(flattenedResult).length === 0) {\n        // nothing flattened\n        return filter;\n    } else if (Object.keys(restFilter).length === 0) {\n        // all flattened\n        return flattenedResult;\n    } else {\n        const flattenedKeys = Object.keys(flattenedResult);\n        const restKeys = Object.keys(restFilter);\n        if (flattenedKeys.some((k) => restKeys.includes(k))) {\n            // keys overlap, cannot merge directly, build an AND clause\n            return {\n                AND: [flattenedResult, restFilter],\n            };\n        } else {\n            // safe to merge directly\n            return { ...flattenedResult, ...restFilter };\n        }\n    }\n}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n    if (Array.isArray(value)) {\n        return value;\n    } else {\n        return [value];\n    }\n}\n\nexport function extractIdFields(entity: any, schema: SchemaDef, model: string) {\n    const idFields = requireIdFields(schema, model);\n    return extractFields(entity, idFields);\n}\n\nexport function getDiscriminatorField(schema: SchemaDef, model: string) {\n    const modelDef = requireModel(schema, model);\n    const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n    if (!delegateAttr) {\n        return undefined;\n    }\n    const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n    if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n        throw createInternalError(`Discriminator field not defined for model \"${model}\"`, model);\n    }\n    return discriminator.value.field;\n}\n\nexport function getDelegateDiscriminatorValue(schema: SchemaDef, model: string) {\n    const modelDef = requireModel(schema, model);\n    return modelDef.delegateMap ?? modelDef.name;\n}\n\nexport function getDelegateDescendantModels(\n    schema: SchemaDef,\n    model: string,\n    collected: Set<ModelDef> = new Set<ModelDef>(),\n): ModelDef[] {\n    const subModels = Object.values(schema.models).filter((m) => m.baseModel === model);\n    subModels.forEach((def) => {\n        if (!collected.has(def)) {\n            collected.add(def);\n            getDelegateDescendantModels(schema, def.name, collected);\n        }\n    });\n    return [...collected];\n}\n\nexport function aggregate(eb: ExpressionBuilder<any, any>, expr: Expression<any>, op: AggregateOperators) {\n    return match(op)\n        .with('_count', () => eb.fn.count(expr))\n        .with('_sum', () => eb.fn.sum(expr))\n        .with('_avg', () => eb.fn.avg(expr))\n        .with('_min', () => eb.fn.min(expr))\n        .with('_max', () => eb.fn.max(expr))\n        .exhaustive();\n}\n\n/**\n * Strips alias from the node if it exists.\n */\nexport function stripAlias(node: OperationNode) {\n    if (AliasNode.is(node)) {\n        return { alias: node.alias, node: node.node };\n    } else {\n        return { alias: undefined, node };\n    }\n}\n\n/**\n * Extracts model name from an OperationNode.\n */\nexport function extractModelName(node: OperationNode) {\n    const { node: innerNode } = stripAlias(node);\n    return TableNode.is(innerNode!) ? innerNode!.table.identifier.name : undefined;\n}\n\n/**\n * Extracts field name from an OperationNode.\n */\nexport function extractFieldName(node: OperationNode) {\n    if (ReferenceNode.is(node) && ColumnNode.is(node.column)) {\n        return node.column.column.name;\n    } else if (ColumnNode.is(node)) {\n        return node.column.name;\n    } else {\n        return undefined;\n    }\n}\n\nexport const TEMP_ALIAS_PREFIX = '$$_';\n\n/**\n * Create an alias name for a temporary table or column name.\n */\nexport function tmpAlias(name: string) {\n    if (!name.startsWith(TEMP_ALIAS_PREFIX)) {\n        return `${TEMP_ALIAS_PREFIX}${name}`;\n    } else {\n        return name;\n    }\n}\n","// /**\n//  * The comment prefix for annotation generated Kysely queries with context information.\n//  */\n// export const CONTEXT_COMMENT_PREFIX = '-- $$context:';\n\n/**\n * The types of fields that are numeric.\n */\nexport const NUMERIC_FIELD_TYPES = ['Int', 'Float', 'BigInt', 'Decimal'];\n\n/**\n * Client API methods that are not supported in transactions.\n */\nexport const TRANSACTION_UNSUPPORTED_METHODS = ['$transaction', '$connect', '$disconnect', '$use'] as const;\n\n/**\n * Prefix for JSON field used to store joined delegate rows.\n */\nexport const DELEGATE_JOINED_FIELD_PREFIX = '$delegate$';\n\n/**\n * Logical combinators used in filters.\n */\nexport const LOGICAL_COMBINATORS = ['AND', 'OR', 'NOT'] as const;\n\n/**\n * Aggregation operators.\n */\nexport const AggregateOperators = ['_count', '_sum', '_avg', '_min', '_max'] as const;\nexport type AggregateOperators = (typeof AggregateOperators)[number];\n\n/**\n * Mapping of filter operators to their corresponding filter kind categories.\n */\nexport const FILTER_PROPERTY_TO_KIND = {\n    // Equality operators\n    equals: 'Equality',\n    not: 'Equality',\n    in: 'Equality',\n    notIn: 'Equality',\n\n    // Range operators\n    lt: 'Range',\n    lte: 'Range',\n    gt: 'Range',\n    gte: 'Range',\n    between: 'Range',\n\n    // Like operators\n    contains: 'Like',\n    startsWith: 'Like',\n    endsWith: 'Like',\n    mode: 'Like',\n\n    // Relation operators\n    is: 'Relation',\n    isNot: 'Relation',\n    some: 'Relation',\n    every: 'Relation',\n    none: 'Relation',\n\n    // Json operators\n    path: 'Json',\n    string_contains: 'Json',\n    string_starts_with: 'Json',\n    string_ends_with: 'Json',\n    array_contains: 'Json',\n    array_starts_with: 'Json',\n    array_ends_with: 'Json',\n\n    // Fuzzy search operators\n    fuzzy: 'Fuzzy',\n\n    // Full-text search operators\n    fts: 'FullText',\n\n    // List operators\n    has: 'List',\n    hasEvery: 'List',\n    hasSome: 'List',\n    isEmpty: 'List',\n} as const;\n\n/**\n * Mapping of filter operators to their corresponding filter kind categories.\n */\nexport type FilterPropertyToKind = typeof FILTER_PROPERTY_TO_KIND;\n","import {\n    type FieldIsArray,\n    type GetModels,\n    type GetTypeDefs,\n    type ProcedureDef,\n    type RelationFields,\n    type RelationFieldType,\n    type SchemaDef,\n} from '@zenstackhq/schema';\nimport type { AnyKysely } from '../utils/kysely-utils';\nimport type { Simplify, UnwrapTuplePromises } from '../utils/type-utils';\nimport type { TRANSACTION_UNSUPPORTED_METHODS } from './constants';\nimport type {\n    CrudArgsType,\n    CrudReturnType,\n    DefaultModelResult,\n    ProcedureFunc,\n    SelectSubset,\n    Subset,\n    TypeDefResult,\n} from './crud-types';\nimport type { Diagnostics } from './diagnostics';\nimport type { ClientOptions, QueryOptions, QueryRelevantOptions } from './options';\nimport type {\n    ExtClientMembersBase,\n    ExtQueryArgsBase,\n    ExtResultBase,\n    ExtResultInferenceArgs,\n    RuntimePlugin,\n} from './plugin';\nimport type { ZenStackPromise } from './promise';\nimport type { ToKysely } from './query-builder';\nimport type { GetSlicedModels, GetSlicedOperations, GetSlicedProcedures, ModelAllowsCreate } from './type-utils';\nimport type { ZodSchemaFactory } from './zod/factory';\n\ntype TransactionUnsupportedMethods = (typeof TRANSACTION_UNSUPPORTED_METHODS)[number];\n\n/**\n * Transaction isolation levels.\n */\nexport enum TransactionIsolationLevel {\n    ReadUncommitted = 'read uncommitted',\n    ReadCommitted = 'read committed',\n    RepeatableRead = 'repeatable read',\n    Serializable = 'serializable',\n    Snapshot = 'snapshot',\n}\n\n/**\n * Symbol used as a type-only key on `ClientContract` to brand the `ExtQueryArgs`\n * generic slot. Hidden from member-access autocomplete since symbol keys are\n * not surfaced. Consumed by `InferExtQueryArgs` to recover the slot.\n * @internal\n */\nexport const ExtQueryArgsMarker: unique symbol = Symbol('zenstack.client.extQueryArgs');\n\n/**\n * Symbol used as a type-only key on `ClientContract` to brand the `ExtResult`\n * generic slot. Consumed by `InferExtResult` to recover the slot.\n * @internal\n */\nexport const ExtResultMarker: unique symbol = Symbol('zenstack.client.extResult');\n\n/**\n * ZenStack client interface.\n *\n * Note: this alias resolves to an intersection, so it cannot carry variance annotations itself\n * (TS2637). It doesn't need them - measuring its variance recurses into {@link ModelOperations},\n * whose annotations short-circuit the expensive cascade. See {@link CommonModelOperations}.\n */\nexport type ClientContract<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema> = ClientOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase = {},\n    ExtClientMembers extends ExtClientMembersBase = {},\n    ExtResult extends ExtResultBase<Schema> = {},\n> = {\n    /**\n     * The schema definition.\n     */\n    readonly $schema: Schema;\n\n    /**\n     * The client options.\n     */\n    readonly $options: Options;\n\n    /** @internal type-only brand carrying the `ExtQueryArgs` slot for inference. */\n    readonly [ExtQueryArgsMarker]?: ExtQueryArgs;\n\n    /** @internal type-only brand carrying the `ExtResult` slot for inference. */\n    readonly [ExtResultMarker]?: ExtResult;\n\n    /**\n     * Executes a prepared raw query and returns the number of affected rows.\n     * @example\n     * ```\n     * const result = await db.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n     * ```\n     */\n    $executeRaw(query: TemplateStringsArray, ...values: any[]): ZenStackPromise<number>;\n\n    /**\n     * Executes a raw query and returns the number of affected rows.\n     * This method is susceptible to SQL injections.\n     * @example\n     * ```\n     * const result = await db.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n     * ```\n     */\n    $executeRawUnsafe(query: string, ...values: any[]): ZenStackPromise<number>;\n\n    /**\n     * Performs a prepared raw query and returns the `SELECT` data.\n     * @example\n     * ```\n     * const result = await db.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n     * ```\n     */\n    $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: any[]): ZenStackPromise<T>;\n\n    /**\n     * Performs a raw query and returns the `SELECT` data.\n     * This method is susceptible to SQL injections.\n     * @example\n     * ```\n     * const result = await db.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n     * ```\n     */\n    $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): ZenStackPromise<T>;\n\n    /**\n     * The current user identity. If the client is not bound to any user context, returns `undefined`.\n     */\n    get $auth(): AuthType<Schema> | undefined;\n\n    /**\n     * Returns a new client bound to the specified user identity. The original client remains unchanged.\n     * Pass `undefined` to return a client without any user context.\n     *\n     * @example\n     * ```\n     * const userClient = db.$setAuth({ id: 'user-id' });\n     * ```\n     */\n    $setAuth(\n        auth: AuthType<Schema> | undefined,\n    ): ClientContract<Schema, Options, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\n    /**\n     * Returns a new client with new options applied. The original client remains unchanged.\n     *\n     * @example\n     * ```\n     * const dbNoValidation = db.$setOptions({ ...db.$options, validateInput: false });\n     * ```\n     */\n    $setOptions<NewOptions extends ClientOptions<Schema>>(\n        options: NewOptions,\n    ): ClientContract<Schema, NewOptions, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\n    /**\n     * Returns a new client enabling/disabling query args validation. The original client remains unchanged.\n     *\n     * @deprecated Use {@link $setOptions} instead.\n     */\n    $setInputValidation(enable: boolean): ClientContract<Schema, Options, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\n    /**\n     * The Kysely query builder instance.\n     *\n     * @example\n     * ```\n     * db.$qb.selectFrom('User').selectAll().where('id', '=', 1).execute();\n     * ```\n     */\n    readonly $qb: ToKysely<Schema>;\n\n    /**\n     * The raw Kysely query builder without any ZenStack enhancements.\n     */\n    readonly $qbRaw: AnyKysely;\n\n    /**\n     * Starts an interactive transaction.\n     *\n     * @example\n     * ```\n     * await db.$transaction(async (tx) => {\n     *   const user = await tx.user.update({ where: { id: 1 }, data: { name: 'Alice' } });\n     *   const post = await tx.post.create({ data: { title: 'Hello World', authorId: user.id } });\n     *   return { user, posts: [post] };\n     * ```\n     */\n    $transaction<T>(\n        callback: (\n            tx: TransactionClientContract<Schema, Options, ExtQueryArgs, ExtClientMembers, ExtResult>,\n        ) => Promise<T>,\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ): Promise<T>;\n\n    /**\n     * Starts a sequential transaction that runs the provided operations in order.\n     *\n     * @example\n     * ```\n     * await db.$transaction([\n     *   db.user.update({ where: { id: 1 }, data: { name: 'Alice' } }),\n     *   db.post.create({ data: { title: 'Hello World', authorId: 1 } }),\n     * ]);\n     */\n    $transaction<P extends ZenStackPromise<any>[]>(\n        arg: [...P],\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ): Promise<UnwrapTuplePromises<P>>;\n\n    /**\n     * Returns a new client with the specified plugin installed. The original client remains unchanged.\n     *\n     * @see {@link https://zenstack.dev/docs/orm/plugins/|Plugin Documentation}\n     */\n    $use<\n        PluginSchema extends SchemaDef = Schema,\n        PluginExtQueryArgs extends ExtQueryArgsBase = {},\n        PluginExtClientMembers extends ExtClientMembersBase = {},\n        PluginExtResult extends ExtResultBase<PluginSchema> = {},\n        _R = {}, // auxiliary type for inferring precise typing for `PluginExtResult`\n    >(\n        plugin: RuntimePlugin<PluginSchema, PluginExtQueryArgs, PluginExtClientMembers, PluginExtResult> & {\n            // intersect with the `result` extension field for precise typing\n            result?: ExtResultInferenceArgs<Schema, _R>;\n        },\n    ): ClientContract<\n        Schema,\n        Options,\n        ExtQueryArgs & PluginExtQueryArgs,\n        ExtClientMembers & PluginExtClientMembers,\n        ExtResult & PluginExtResult\n    >;\n\n    /**\n     * Returns a new client with the specified plugin removed. The original client remains unchanged.\n     */\n    $unuse(pluginId: string): ClientContract<Schema, Options, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\n    /**\n     * Returns a new client with all plugins removed. The original client remains unchanged.\n     */\n    $unuseAll(): ClientContract<Schema, Options>;\n\n    /**\n     * Eagerly connects to the database.\n     */\n    $connect(): Promise<void>;\n\n    /**\n     * Explicitly disconnects from the database.\n     */\n    $disconnect(): Promise<void>;\n\n    /**\n     * Factory for creating zod schemas to validate query args.\n     */\n    get $zod(): ZodSchemaFactory<Schema, QueryRelevantOptions<Schema, Options>, ExtQueryArgs>;\n\n    /**\n     * Pushes the schema to the database. For testing purposes only.\n     * @private\n     */\n    $pushSchema(): Promise<void>;\n\n    /**\n     * Returns diagnostics information such as cache and slow query statistics.\n     */\n    get $diagnostics(): Promise<Diagnostics>;\n} & {\n    // Project `Options` to its query-relevant subset before fanning out across every model. This\n    // strips the heavy `computedFields`/`procedures` function types (never read by these types) so\n    // the 30+ `ModelOperations` instantiations stay cheap. See {@link QueryRelevantOptions}.\n    [Key in GetSlicedModels<Schema, QueryRelevantOptions<Schema, Options>> as Uncapitalize<Key>]: ModelOperations<\n        Schema,\n        Key,\n        QueryRelevantOptions<Schema, Options>,\n        ExtQueryArgs,\n        ExtResult\n    >;\n} & ProcedureOperations<Schema, Options> &\n    ExtClientMembers;\n\n/**\n * The contract for a client in a transaction.\n */\nexport type TransactionClientContract<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase,\n    ExtClientMembers extends ExtClientMembersBase,\n    ExtResult extends ExtResultBase<Schema> = {},\n> = Omit<ClientContract<Schema, Options, ExtQueryArgs, ExtClientMembers, ExtResult>, TransactionUnsupportedMethods>;\n\nexport type ProcedureOperations<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema> = ClientOptions<Schema>,\n> =\n    Schema['procedures'] extends Record<string, ProcedureDef>\n        ? {\n              /**\n               * Custom procedures.\n               */\n              $procs: {\n                  [Key in GetSlicedProcedures<Schema, Options>]: ProcedureFunc<Schema, Key>;\n              };\n          }\n        : {};\n\n/**\n * Creates a new ZenStack client instance.\n */\nexport interface ClientConstructor {\n    new <Schema extends SchemaDef, Options extends ClientOptions<Schema> = ClientOptions<Schema>>(\n        schema: Schema,\n        options: Options,\n    ): ClientContract<Schema, Options>;\n}\n\n/**\n * CRUD operations.\n */\nexport type CRUD = 'create' | 'read' | 'update' | 'delete';\n\n/**\n * Extended CRUD operations including 'post-update'.\n */\nexport type CRUD_EXT = CRUD | 'post-update';\n\n/**\n * CRUD operations.\n */\nexport const CRUD = ['create', 'read', 'update', 'delete'] as const;\n\n/**\n * Extended CRUD operations including 'post-update'.\n */\nexport const CRUD_EXT = [...CRUD, 'post-update'] as const;\n\n// #region Model operations\n\ntype SliceOperations<\n    T extends Record<string, unknown>,\n    Schema extends SchemaDef,\n    Model extends GetModels<Schema>,\n    Options extends QueryOptions<Schema>,\n> = Omit<\n    {\n        // keep only operations included by slicing options\n        [Key in keyof T as Key extends GetSlicedOperations<Schema, Model, Options> ? Key : never]: T[Key];\n    },\n    // exclude create operations for models that don't allow create (delegate models, required Unsupported fields)\n    ModelAllowsCreate<Schema, Model> extends true ? never : OperationsRequiringCreate\n>;\n\nexport type AllModelOperations<\n    Schema extends SchemaDef,\n    Model extends GetModels<Schema>,\n    Options extends QueryOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase,\n    ExtResult extends ExtResultBase<Schema> = {},\n> = CommonModelOperations<Schema, Model, Options, ExtQueryArgs, ExtResult> &\n    // provider-specific operations\n    (Schema['provider']['type'] extends 'mysql'\n        ? {}\n        : {\n              /**\n               * Creates multiple entities and returns them.\n               * @param args - create args. See {@link createMany} for input. Use\n               * `select` and `omit` to control the fields returned.\n               * @returns the created entities\n               *\n               * @example\n               * ```ts\n               * // create multiple entities and return selected fields\n               * await db.user.createManyAndReturn({\n               *     data: [\n               *         { name: 'Alex', email: 'alex@zenstack.dev' },\n               *         { name: 'John', email: 'john@zenstack.dev' }\n               *     ],\n               *     select: { id: true, email: true }\n               * });\n               * ```\n               */\n              createManyAndReturn<\n                  T extends CrudArgsType<Schema, Model, 'createManyAndReturn', Options, ExtQueryArgs, ExtResult>,\n              >(\n                  args?: SelectSubset<\n                      T,\n                      CrudArgsType<Schema, Model, 'createManyAndReturn', Options, ExtQueryArgs, ExtResult>\n                  >,\n              ): ZenStackPromise<CrudReturnType<Schema, Model, 'createManyAndReturn', T, Options, ExtResult>>;\n\n              /**\n               * Updates multiple entities and returns them.\n               * @param args - update args. Only scalar fields are allowed for data.\n               * @returns the updated entities\n               *\n               * @example\n               * ```ts\n               * // update many entities and return selected fields\n               * await db.user.updateManyAndReturn({\n               *     where: { email: { endsWith: '@zenstack.dev' } },\n               *     data: { role: 'ADMIN' },\n               *     select: { id: true, email: true }\n               * }); // result: `Array<{ id: string; email: string }>`\n               *\n               * // limit the number of updated entities\n               * await db.user.updateManyAndReturn({\n               *     where: { email: { endsWith: '@zenstack.dev' } },\n               *     data: { role: 'ADMIN' },\n               *     limit: 10\n               * });\n               * ```\n               */\n              updateManyAndReturn<\n                  T extends CrudArgsType<Schema, Model, 'updateManyAndReturn', Options, ExtQueryArgs, ExtResult>,\n              >(\n                  args: Subset<T, CrudArgsType<Schema, Model, 'updateManyAndReturn', Options, ExtQueryArgs, ExtResult>>,\n              ): ZenStackPromise<CrudReturnType<Schema, Model, 'updateManyAndReturn', T, Options, ExtResult>>;\n          });\n\n// Explicit variance annotations bypass TypeScript's structural variance *measurement* for this\n// large, deeply-recursive generic. Measurement here comes back \"unreliable\" (the type recurses\n// across related models) and is pure wasted work - it dominated type-check time. The annotations\n// below match the measured variance and let the checker skip that probing entirely.\ntype CommonModelOperations<\n    in out Schema extends SchemaDef,\n    in out Model extends GetModels<Schema>,\n    // `Options` is invariant (it is read for `omit`/`slicing` in both arg and result positions).\n    // Annotating it keeps the variance-measurement skip. Note: a client built with an explicit\n    // `omit`/`slicing` literal is then no longer assignable to the bare `ClientContract<Schema>`\n    // (default options) - schema-agnostic call sites that take `ClientContract<SchemaDef>` should\n    // accept the client via a cast. This is a rare pattern and worth the type-check speedup.\n    in out Options extends QueryOptions<Schema>,\n    in out ExtQueryArgs extends ExtQueryArgsBase,\n    out ExtResult extends ExtResultBase<Schema> = {},\n> = {\n    /**\n     * Returns a list of entities.\n     * @param args - query args\n     * @returns a list of entities\n     *\n     * @example\n     * ```ts\n     * // find all users and return all scalar fields\n     * await db.user.findMany();\n     *\n     * // find all users with name 'Alex'\n     * await db.user.findMany({\n     *     where: {\n     *         name: 'Alex'\n     *     }\n     * });\n     *\n     * // select fields\n     * await db.user.findMany({\n     *     select: {\n     *         name: true,\n     *         email: true,\n     *     }\n     * }); // result: `Array<{ name: string, email: string }>`\n     *\n     * // omit fields\n     * await db.user.findMany({\n     *     omit: {\n     *         name: true,\n     *     }\n     * }); // result: `Array<{ id: number; email: string; ... }>`\n     *\n     * // include relations (and all scalar fields)\n     * await db.user.findMany({\n     *     include: {\n     *         posts: true,\n     *     }\n     * }); // result: `Array<{ ...; posts: Post[] }>`\n     *\n     * // include relations with filter\n     * await db.user.findMany({\n     *     include: {\n     *         posts: {\n     *             where: {\n     *                 published: true\n     *             }\n     *         }\n     *     }\n     * });\n     *\n     * // pagination and sorting\n     * await db.user.findMany({\n     *     skip: 10,\n     *     take: 10,\n     *     orderBy: [{ name: 'asc' }, { email: 'desc' }],\n     * });\n     *\n     * // pagination with cursor (https://www.prisma.io/docs/orm/prisma-client/queries/pagination#cursor-based-pagination)\n     * await db.user.findMany({\n     *     cursor: { id: 10 },\n     *     skip: 1,\n     *     take: 10,\n     *     orderBy: { id: 'asc' },\n     * });\n     *\n     * // distinct\n     * await db.user.findMany({\n     *     distinct: ['name']\n     * });\n     *\n     * // count all relations\n     * await db.user.findMany({\n     *     _count: true,\n     * }); // result: `{ _count: { posts: number; ... } }`\n     *\n     * // count selected relations\n     * await db.user.findMany({\n     *     _count: { select: { posts: true } },\n     * }); // result: `{ _count: { posts: number } }`\n     * ```\n     */\n    findMany<T extends CrudArgsType<Schema, Model, 'findMany', Options, ExtQueryArgs, ExtResult>>(\n        args?: SelectSubset<T, CrudArgsType<Schema, Model, 'findMany', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'findMany', T, Options, ExtResult>>;\n\n    /**\n     * Returns a uniquely identified entity.\n     * @param args - query args\n     * @returns a single entity or null if not found\n     * @see {@link findMany}\n     */\n    findUnique<T extends CrudArgsType<Schema, Model, 'findUnique', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'findUnique', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'findUnique', T, Options, ExtResult>>;\n\n    /**\n     * Returns a uniquely identified entity or throws `NotFoundError` if not found.\n     * @param args - query args\n     * @returns a single entity\n     * @see {@link findMany}\n     */\n    findUniqueOrThrow<T extends CrudArgsType<Schema, Model, 'findUniqueOrThrow', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'findUniqueOrThrow', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'findUniqueOrThrow', T, Options, ExtResult>>;\n\n    /**\n     * Returns the first entity.\n     * @param args - query args\n     * @returns a single entity or null if not found\n     * @see {@link findMany}\n     */\n    findFirst<T extends CrudArgsType<Schema, Model, 'findFirst', Options, ExtQueryArgs, ExtResult>>(\n        args?: SelectSubset<T, CrudArgsType<Schema, Model, 'findFirst', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'findFirst', T, Options, ExtResult>>;\n\n    /**\n     * Returns the first entity or throws `NotFoundError` if not found.\n     * @param args - query args\n     * @returns a single entity\n     * @see {@link findMany}\n     */\n    findFirstOrThrow<T extends CrudArgsType<Schema, Model, 'findFirstOrThrow', Options, ExtQueryArgs, ExtResult>>(\n        args?: SelectSubset<T, CrudArgsType<Schema, Model, 'findFirstOrThrow', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'findFirstOrThrow', T, Options, ExtResult>>;\n\n    /**\n     * Creates a new entity.\n     * @param args - create args\n     * @returns the created entity\n     *\n     * @example\n     * ```ts\n     * // simple create\n     * await db.user.create({\n     *    data: { name: 'Alex', email: 'alex@zenstack.dev' }\n     * });\n     *\n     * // nested create with relation\n     * await db.user.create({\n     *    data: {\n     *        email: 'alex@zenstack.dev',\n     *        posts: { create: { title: 'Hello World' } }\n     *    }\n     * });\n     *\n     * // you can use `select`, `omit`, and `include` to control\n     * // the fields returned by the query, as with `findMany`\n     * await db.user.create({\n     *    data: {\n     *        email: 'alex@zenstack.dev',\n     *        posts: { create: { title: 'Hello World' } }\n     *    },\n     *    include: { posts: true }\n     * }); // result: `{ id: number; posts: Post[] }`\n     *\n     * // connect relations\n     * await db.user.create({\n     *    data: {\n     *        email: 'alex@zenstack.dev',\n     *        posts: { connect: { id: 1 } }\n     *    }\n     * });\n     *\n     * // connect relations, and create if not found\n     * await db.user.create({\n     *    data: {\n     *        email: 'alex@zenstack.dev',\n     *        posts: {\n     *            connectOrCreate: {\n     *                where: { id: 1 },\n     *                create: { title: 'Hello World' }\n     *            }\n     *        }\n     *    }\n     * });\n     * ```\n     */\n    create<T extends CrudArgsType<Schema, Model, 'create', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'create', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'create', T, Options, ExtResult>>;\n\n    /**\n     * Creates multiple entities. Only scalar fields are allowed.\n     * @param args - create args\n     * @returns count of created entities: `{ count: number }`\n     *\n     * @example\n     * ```ts\n     * // create multiple entities\n     * await db.user.createMany({\n     *     data: [\n     *         { name: 'Alex', email: 'alex@zenstack.dev' },\n     *         { name: 'John', email: 'john@zenstack.dev' }\n     *     ]\n     * });\n     *\n     * // skip items that cause unique constraint violation\n     * await db.user.createMany({\n     *     data: [\n     *         { name: 'Alex', email: 'alex@zenstack.dev' },\n     *         { name: 'John', email: 'john@zenstack.dev' }\n     *     ],\n     *     skipDuplicates: true\n     * });\n     * ```\n     */\n    createMany<T extends CrudArgsType<Schema, Model, 'createMany', Options, ExtQueryArgs, ExtResult>>(\n        args?: SelectSubset<T, CrudArgsType<Schema, Model, 'createMany', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'createMany', T, Options, ExtResult>>;\n\n    /**\n     * Updates a uniquely identified entity.\n     * @param args - update args. See {@link findMany} for how to control\n     * fields and relations returned.\n     * @returns the updated entity. Throws `NotFoundError` if the entity is not found.\n     *\n     * @example\n     * ```ts\n     * // update fields\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { name: 'Alex' }\n     * });\n     *\n     * // connect a relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { posts: { connect: { id: 1 } } }\n     * });\n     *\n     * // connect relation, and create if not found\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *            connectOrCreate: {\n     *                where: { id: 1 },\n     *                create: { title: 'Hello World' }\n     *            }\n     *         }\n     *     }\n     * });\n     *\n     * // create many related entities (only available for one-to-many relations)\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *             createMany: {\n     *                 data: [{ title: 'Hello World' }, { title: 'Hello World 2' }],\n     *             }\n     *         }\n     *     }\n     * });\n     *\n     * // disconnect a one-to-many relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { posts: { disconnect: { id: 1 } } }\n     * });\n     *\n     * // disconnect a one-to-one relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { profile: { disconnect: true } }\n     * });\n     *\n     * // replace a relation (only available for one-to-many relations)\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *             set: [{ id: 1 }, { id: 2 }]\n     *         }\n     *     }\n     * });\n     *\n     * // update a relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *             update: { where: { id: 1 }, data: { title: 'Hello World' } }\n     *         }\n     *     }\n     * });\n     *\n     * // upsert a relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *             upsert: {\n     *                 where: { id: 1 },\n     *                 create: { title: 'Hello World' },\n     *                 update: { title: 'Hello World' }\n     *             }\n     *         }\n     *     }\n     * });\n     *\n     * // update many related entities (only available for one-to-many relations)\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: {\n     *         posts: {\n     *             updateMany: {\n     *                 where: { published: true },\n     *                 data: { title: 'Hello World' }\n     *             }\n     *         }\n     *     }\n     * });\n     *\n     * // delete a one-to-many relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { posts: { delete: { id: 1 } } }\n     * });\n     *\n     * // delete a one-to-one relation\n     * await db.user.update({\n     *     where: { id: 1 },\n     *     data: { profile: { delete: true } }\n     * });\n     * ```\n     */\n    update<T extends CrudArgsType<Schema, Model, 'update', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'update', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'update', T, Options, ExtResult>>;\n\n    /**\n     * Updates multiple entities.\n     * @param args - update args. Only scalar fields are allowed for data.\n     * @returns count of updated entities: `{ count: number }`\n     *\n     * @example\n     * ```ts\n     * // update many entities\n     * await db.user.updateMany({\n     *     where: { email: { endsWith: '@zenstack.dev' } },\n     *     data: { role: 'ADMIN' }\n     * });\n     *\n     * // limit the number of updated entities\n     * await db.user.updateMany({\n     *     where: { email: { endsWith: '@zenstack.dev' } },\n     *     data: { role: 'ADMIN' },\n     *     limit: 10\n     * });\n     */\n    updateMany<T extends CrudArgsType<Schema, Model, 'updateMany', Options, ExtQueryArgs, ExtResult>>(\n        args: Subset<T, CrudArgsType<Schema, Model, 'updateMany', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'updateMany', T, Options, ExtResult>>;\n\n    /**\n     * Creates or updates an entity.\n     * @param args - upsert args\n     * @returns the upserted entity\n     *\n     * @example\n     * ```ts\n     * // upsert an entity\n     * await db.user.upsert({\n     *     // `where` clause is used to find the entity\n     *     where: { id: 1 },\n     *     // `create` clause is used if the entity is not found\n     *     create: { email: 'alex@zenstack.dev', name: 'Alex' },\n     *     // `update` clause is used if the entity is found\n     *     update: { name: 'Alex-new' },\n     *     // `select` and `omit` can be used to control the returned fields\n     *     ...\n     * });\n     * ```\n     */\n    upsert<T extends CrudArgsType<Schema, Model, 'upsert', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'upsert', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'upsert', T, Options, ExtResult>>;\n\n    /**\n     * Deletes a uniquely identifiable entity.\n     * @param args - delete args\n     * @returns the deleted entity. Throws `NotFoundError` if the entity is not found.\n     *\n     * @example\n     * ```ts\n     * // delete an entity\n     * await db.user.delete({\n     *     where: { id: 1 }\n     * });\n     *\n     * // delete an entity and return selected fields\n     * await db.user.delete({\n     *     where: { id: 1 },\n     *     select: { id: true, email: true }\n     * }); // result: `{ id: string; email: string }`\n     * ```\n     */\n    delete<T extends CrudArgsType<Schema, Model, 'delete', Options, ExtQueryArgs, ExtResult>>(\n        args: SelectSubset<T, CrudArgsType<Schema, Model, 'delete', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'delete', T, Options, ExtResult>>;\n\n    /**\n     * Deletes multiple entities.\n     * @param args - delete args\n     * @returns count of deleted entities: `{ count: number }`\n     *\n     * @example\n     * ```ts\n     * // delete many entities\n     * await db.user.deleteMany({\n     *     where: { email: { endsWith: '@zenstack.dev' } }\n     * });\n     *\n     * // limit the number of deleted entities\n     * await db.user.deleteMany({\n     *     where: { email: { endsWith: '@zenstack.dev' } },\n     *     limit: 10\n     * });\n     * ```\n     */\n    deleteMany<T extends CrudArgsType<Schema, Model, 'deleteMany', Options, ExtQueryArgs, ExtResult>>(\n        args?: Subset<T, CrudArgsType<Schema, Model, 'deleteMany', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'deleteMany', T, Options, ExtResult>>;\n\n    /**\n     * Counts rows or field values.\n     * @param args - count args\n     * @returns `number`, or an object containing count of selected relations\n     *\n     * @example\n     * ```ts\n     * // count all\n     * await db.user.count();\n     *\n     * // count with a filter\n     * await db.user.count({ where: { email: { endsWith: '@zenstack.dev' } } });\n     *\n     * // count rows and field values\n     * await db.user.count({\n     *     select: { _all: true, email: true }\n     * }); // result: `{ _all: number, email: number }`\n     */\n    count<T extends CrudArgsType<Schema, Model, 'count', Options, ExtQueryArgs, ExtResult>>(\n        args?: Subset<T, CrudArgsType<Schema, Model, 'count', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<Simplify<CrudReturnType<Schema, Model, 'count', T, Options, ExtResult>>>;\n\n    /**\n     * Aggregates rows.\n     * @param args - aggregation args\n     * @returns an object containing aggregated values\n     *\n     * @example\n     * ```ts\n     * // aggregate rows\n     * await db.profile.aggregate({\n     *     where: { email: { endsWith: '@zenstack.dev' } },\n     *     _count: true,\n     *     _avg: { age: true },\n     *     _sum: { age: true },\n     *     _min: { age: true },\n     *     _max: { age: true }\n     * }); // result: `{ _count: number, _avg: { age: number }, ... }`\n     */\n    aggregate<T extends CrudArgsType<Schema, Model, 'aggregate', Options, ExtQueryArgs, ExtResult>>(\n        args: Subset<T, CrudArgsType<Schema, Model, 'aggregate', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<Simplify<CrudReturnType<Schema, Model, 'aggregate', T, Options, ExtResult>>>;\n\n    /**\n     * Groups rows by columns.\n     * @param args - groupBy args\n     * @returns an object containing grouped values\n     *\n     * @example\n     * ```ts\n     * // group by a field\n     * await db.profile.groupBy({\n     *     by: 'country',\n     *     _count: true\n     * }); // result: `Array<{ country: string, _count: number }>`\n     *\n     * // group by multiple fields\n     * await db.profile.groupBy({\n     *     by: ['country', 'city'],\n     *     _count: true\n     * }); // result: `Array<{ country: string, city: string, _count: number }>`\n     *\n     * // group by with sorting, the `orderBy` fields must be either an aggregation\n     * // or a field used in the `by` list\n     * await db.profile.groupBy({\n     *     by: 'country',\n     *     orderBy: { country: 'desc' }\n     * });\n     *\n     * // group by with having (post-aggregation filter), the fields used in `having` must\n     * // be either an aggregation, or a field used in the `by` list\n     * await db.profile.groupBy({\n     *     by: 'country',\n     *     having: { country: 'US', age: { _avg: { gte: 18 } } }\n     * });\n     */\n    groupBy<T extends CrudArgsType<Schema, Model, 'groupBy', Options, ExtQueryArgs, ExtResult>>(\n        args: Subset<T, CrudArgsType<Schema, Model, 'groupBy', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<Simplify<CrudReturnType<Schema, Model, 'groupBy', T, Options, ExtResult>>>;\n\n    /**\n     * Checks if an entity exists.\n     * @param args - exists args\n     * @returns whether a matching entity was found\n     *\n     * @example\n     * ```ts\n     * // check if a user exists\n     * await db.user.exists({\n     *     where: { id: 1 },\n     * }); // result: `boolean`\n     *\n     * // check with a relation\n     * await db.user.exists({\n     *     where: { posts: { some: { published: true } } },\n     * }); // result: `boolean`\n     */\n    exists<T extends CrudArgsType<Schema, Model, 'exists', Options, ExtQueryArgs, ExtResult>>(\n        args?: Subset<T, CrudArgsType<Schema, Model, 'exists', Options, ExtQueryArgs, ExtResult>>,\n    ): ZenStackPromise<CrudReturnType<Schema, Model, 'exists', T, Options, ExtResult>>;\n};\n\nexport type OperationsRequiringCreate = 'create' | 'createMany' | 'createManyAndReturn' | 'upsert';\n\n// See the note on `CommonModelOperations` - explicit variance annotations skip the expensive,\n// \"unreliable\" variance measurement of this recursive type.\nexport type ModelOperations<\n    in out Schema extends SchemaDef,\n    in out Model extends GetModels<Schema>,\n    // `Options` is invariant - see the note on {@link CommonModelOperations}.\n    in out Options extends QueryOptions<Schema> = ClientOptions<Schema>,\n    in out ExtQueryArgs extends ExtQueryArgsBase = {},\n    out ExtResult extends ExtResultBase<Schema> = {},\n> = SliceOperations<AllModelOperations<Schema, Model, Options, ExtQueryArgs, ExtResult>, Schema, Model, Options>;\n\n//#endregion\n\n//#region Supporting types\n\n/**\n * Type for auth context that includes both scalar and relation fields.\n * Relations are recursively included to allow nested auth data like { user: { profile: { ... } } }\n */\ntype AuthModelType<Schema extends SchemaDef, Model extends GetModels<Schema>> = Partial<\n    DefaultModelResult<Schema, Model>\n> & {\n    [Key in RelationFields<Schema, Model>]?: FieldIsArray<Schema, Model, Key> extends true\n        ? AuthModelType<Schema, RelationFieldType<Schema, Model, Key>>[]\n        : AuthModelType<Schema, RelationFieldType<Schema, Model, Key>>;\n};\n\nexport type AuthType<Schema extends SchemaDef> =\n    Schema['authType'] extends GetModels<Schema>\n        ? AuthModelType<Schema, Schema['authType']>\n        : Schema['authType'] extends GetTypeDefs<Schema>\n          ? TypeDefResult<Schema, Schema['authType'], true>\n          : Record<string, unknown>;\n\n//#endregion\n","import { enumerate, invariant, isPlainObject, lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type { BuiltinType, DataSourceProviderType, FieldDef, GetModels, ModelDef, SchemaDef } from '@zenstackhq/schema';\nimport type { AliasableExpression, Expression, ExpressionBuilder, ExpressionWrapper, SqlBool, ValueNode } from 'kysely';\nimport { expressionBuilder, sql, type SelectQueryBuilder } from 'kysely';\nimport { match, P } from 'ts-pattern';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { OrArray } from '../../../utils/type-utils';\nimport { AggregateOperators, DELEGATE_JOINED_FIELD_PREFIX, LOGICAL_COMBINATORS } from '../../constants';\nimport type {\n    BooleanFilter,\n    BytesFilter,\n    DateTimeFilter,\n    FindArgs,\n    OrderBy,\n    SortOrder,\n    StringFilter,\n} from '../../crud-types';\nimport { createConfigError, createInvalidInputError, createNotSupportedError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n    aggregate,\n    buildJoinPairs,\n    ensureArray,\n    flattenCompoundUniqueFilters,\n    getDelegateDescendantModels,\n    getManyToManyRelation,\n    getModelFields,\n    getRelationForeignKeyFieldPairs,\n    isEnum,\n    isTypeDef,\n    makeDefaultOrderBy,\n    requireField,\n    requireIdFields,\n    requireModel,\n    requireTypeDef,\n    tmpAlias,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\n    protected eb = expressionBuilder<any, any>();\n\n    constructor(\n        protected readonly schema: Schema,\n        protected readonly options: ClientOptions<Schema>,\n    ) {}\n\n    // #region capability flags\n\n    /**\n     * Whether the dialect supports updating with a limit on the number of updated rows.\n     */\n    abstract get supportsUpdateWithLimit(): boolean;\n\n    /**\n     * Whether the dialect supports deleting with a limit on the number of deleted rows.\n     */\n    abstract get supportsDeleteWithLimit(): boolean;\n\n    /**\n     * Whether the dialect supports DISTINCT ON.\n     */\n    abstract get supportsDistinctOn(): boolean;\n\n    /**\n     * Whether the dialect support inserting with `DEFAULT` as field value.\n     */\n    abstract get supportsDefaultAsFieldValue(): boolean;\n\n    /**\n     * Whether the dialect supports the RETURNING clause in INSERT/UPDATE/DELETE statements.\n     */\n    abstract get supportsReturning(): boolean;\n\n    /**\n     * Whether the dialect supports `INSERT INTO ... DEFAULT VALUES` syntax.\n     */\n    abstract get supportsInsertDefaultValues(): boolean;\n\n    /**\n     * How to perform insert ignore operation.\n     */\n    abstract get insertIgnoreMethod(): 'onConflict' | 'ignore';\n\n    // #endregion\n\n    // #region value transformation\n\n    /**\n     * Transforms input value before sending to database.\n     *\n     * `fieldDef` is optional so existing callers that don't have it stay\n     * source-compatible. Dialects can use it to inspect `@db.*` native-type\n     * attributes (e.g. to format `@db.Time` values as `HH:MM:SS` rather than\n     * full ISO timestamps).\n     */\n    transformInput(value: unknown, _type: BuiltinType, _forArrayField: boolean, _fieldDef?: FieldDef) {\n        return value;\n    }\n\n    /**\n     * Transforms output value received from database.\n     */\n    transformOutput(value: unknown, _type: BuiltinType, _array: boolean) {\n        return value;\n    }\n\n    // #endregion\n\n    // #region common query builders\n\n    buildSelectModel(model: string, modelAlias: string) {\n        const modelDef = requireModel(this.schema, model);\n        let result = this.eb.selectFrom(model === modelAlias ? model : `${model} as ${modelAlias}`);\n        // join all delegate bases\n        let joinBase = modelDef.baseModel;\n        while (joinBase) {\n            result = this.buildDelegateJoin(model, modelAlias, joinBase, result);\n            joinBase = requireModel(this.schema, joinBase).baseModel;\n        }\n        return result;\n    }\n\n    buildFilterSortTake(\n        model: string,\n        args: FindArgs<Schema, GetModels<Schema>, any, true>,\n        query: SelectQueryBuilder<any, any, {}>,\n        modelAlias: string,\n    ) {\n        let result = query;\n\n        // where\n        if (args.where) {\n            result = result.where(() => this.buildFilter(model, modelAlias, args?.where));\n        }\n\n        // skip && take\n        let negateOrderBy = false;\n        const skip = args.skip;\n        let take = args.take;\n        if (take !== undefined && take < 0) {\n            negateOrderBy = true;\n            take = -take;\n        }\n        result = this.buildSkipTake(result, skip, take);\n\n        // distinct\n        let distinctFields: string[] = [];\n        if ('distinct' in args && (args as any).distinct) {\n            distinctFields = ensureArray((args as any).distinct) as string[];\n            if (this.supportsDistinctOn) {\n                result = result.distinctOn(distinctFields.map((f) => this.eb.ref(`${modelAlias}.${f}`)));\n            } else {\n                throw createNotSupportedError(`\"distinct\" is not supported by \"${this.schema.provider.type}\" provider`);\n            }\n        }\n\n        // orderBy\n        // Some dialects (e.g., postgres) requires DISTINCT ON expressions to match the leftmost ORDER BY expressions.\n        // Prepend distinct fields only when the user-supplied orderBy doesn't already satisfy this.\n        let effectiveOrderBy = args.orderBy;\n        if (distinctFields.length > 0 && this.supportsDistinctOn) {\n            const existingOrderBy = enumerate(args.orderBy).filter((o) => Object.keys(o as object).length > 0);\n            const alreadySatisfied = distinctFields.every(\n                (f, i) => i < existingOrderBy.length && Object.keys(existingOrderBy[i] as object)[0] === f,\n            );\n            if (existingOrderBy.length > 0 && !alreadySatisfied) {\n                const prependedOrderBy = distinctFields.map((f) => ({ [f]: 'asc' })) as any[];\n                effectiveOrderBy = [...prependedOrderBy, ...existingOrderBy];\n            }\n        }\n        result = this.buildOrderBy(result, model, modelAlias, effectiveOrderBy, negateOrderBy, take);\n\n        if (args.cursor) {\n            if (effectiveOrderBy) {\n                const offendingKey = enumerate(effectiveOrderBy)\n                    .map((ob: any) => {\n                        if (typeof ob !== 'object' || ob === null) return undefined;\n                        if ('_fuzzyRelevance' in ob) return '_fuzzyRelevance';\n                        if ('_ftsRelevance' in ob) return '_ftsRelevance';\n                        return undefined;\n                    })\n                    .find((k) => k !== undefined);\n                if (offendingKey) {\n                    // TODO: revisit this limitation\n                    throw createNotSupportedError(\n                        `cursor pagination cannot be combined with \"${offendingKey}\" ordering`,\n                    );\n                }\n            }\n            result = this.buildCursorFilter(\n                model,\n                result,\n                args.cursor,\n                effectiveOrderBy as OrArray<Record<string, SortOrder>> | undefined,\n                negateOrderBy,\n                modelAlias,\n            );\n        }\n        return result;\n    }\n\n    buildFilter(model: string, modelAlias: string, where: boolean | object | undefined) {\n        if (where === true || where === undefined) {\n            return this.true();\n        }\n\n        if (where === false) {\n            return this.false();\n        }\n\n        let result = this.true();\n        const _where = flattenCompoundUniqueFilters(this.schema, model, where);\n\n        for (const [key, payload] of Object.entries(_where)) {\n            if (payload === undefined) {\n                continue;\n            }\n\n            if (key.startsWith('$')) {\n                continue;\n            }\n\n            if (this.isLogicalCombinator(key)) {\n                result = this.and(result, this.buildCompositeFilter(model, modelAlias, key, payload));\n                continue;\n            }\n\n            const fieldDef = requireField(this.schema, model, key);\n\n            if (fieldDef.relation) {\n                result = this.and(result, this.buildRelationFilter(model, modelAlias, key, fieldDef, payload));\n            } else {\n                // if the field is from a base model, build a reference from that model\n                const fieldRef = this.fieldRef(fieldDef.originModel ?? model, key, fieldDef.originModel ?? modelAlias);\n                if (fieldDef.array) {\n                    result = this.and(result, this.buildArrayFilter(fieldRef, fieldDef, payload));\n                } else {\n                    result = this.and(result, this.buildPrimitiveFilter(fieldRef, fieldDef, payload));\n                }\n            }\n        }\n\n        // call expression builder and combine the results\n        if ('$expr' in _where && typeof _where['$expr'] === 'function') {\n            result = this.and(result, _where['$expr'](this.eb));\n        }\n\n        return result;\n    }\n\n    private buildCursorFilter(\n        model: string,\n        query: SelectQueryBuilder<any, any, any>,\n        cursor: object,\n        orderBy: OrArray<Record<string, SortOrder>> | undefined,\n        negateOrderBy: boolean,\n        modelAlias: string,\n    ) {\n        const _orderBy = orderBy ?? makeDefaultOrderBy(this.schema, model);\n\n        const orderByItems = ensureArray(_orderBy).flatMap((obj) => Object.entries<SortOrder>(obj));\n\n        const subQueryAlias = `${model}$cursor$sub`;\n        const cursorFilter = this.buildFilter(model, subQueryAlias, cursor);\n\n        let result = query;\n        const filters: ExpressionWrapper<any, any, any>[] = [];\n\n        for (let i = orderByItems.length - 1; i >= 0; i--) {\n            const andFilters: ExpressionWrapper<any, any, any>[] = [];\n\n            for (let j = 0; j <= i; j++) {\n                const [field, order] = orderByItems[j]!;\n                const _order = negateOrderBy ? (order === 'asc' ? 'desc' : 'asc') : order;\n                const op = j === i ? (_order === 'asc' ? '>=' : '<=') : '=';\n                // Fields inherited from a delegate base live on the base table, which is\n                // joined with its model name as alias. See buildSelectModel/buildDelegateJoin.\n                const fieldDef = requireField(this.schema, model, field);\n                const outerAlias = fieldDef.originModel ?? modelAlias;\n                const subSelectAlias = fieldDef.originModel ?? subQueryAlias;\n                andFilters.push(\n                    this.eb(\n                        this.eb.ref(`${outerAlias}.${field}`),\n                        op,\n                        this.buildSelectModel(model, subQueryAlias)\n                            .select(`${subSelectAlias}.${field}`)\n                            .where(cursorFilter),\n                    ),\n                );\n            }\n\n            filters.push(this.eb.and(andFilters));\n        }\n\n        result = result.where((eb) => eb.or(filters));\n\n        return result;\n    }\n\n    private isLogicalCombinator(key: string): key is (typeof LOGICAL_COMBINATORS)[number] {\n        return LOGICAL_COMBINATORS.includes(key as any);\n    }\n\n    protected buildCompositeFilter(\n        model: string,\n        modelAlias: string,\n        key: (typeof LOGICAL_COMBINATORS)[number],\n        payload: any,\n    ): Expression<SqlBool> {\n        // Normalize payload: ensure array, remove empty objects and objects with\n        // only undefined fields values\n        const normalizedPayload = enumerate(payload).filter((el) => {\n            if (typeof el === 'object' && el !== null && !Array.isArray(el)) {\n                const entries = Object.entries(el);\n                return entries.some(([, v]) => v !== undefined);\n            } else {\n                return true;\n            }\n        });\n\n        const normalizedFilters = normalizedPayload.map((el) => this.buildFilter(model, modelAlias, el));\n\n        return match(key)\n            .with('AND', () => {\n                if (normalizedFilters.length === 0) {\n                    // AND of no conditions is a no-op, return true\n                    return this.true();\n                }\n                return this.and(...normalizedFilters);\n            })\n            .with('OR', () => {\n                if (normalizedFilters.length === 0) {\n                    // OR of no conditions is always false, return false\n                    return this.false();\n                }\n                return this.or(...normalizedFilters);\n            })\n            .with('NOT', () => {\n                if (normalizedFilters.length === 0) {\n                    // NOT of no conditions is a no-op, return true\n                    return this.true();\n                }\n                return this.not(...normalizedFilters);\n            })\n            .exhaustive();\n    }\n\n    private buildRelationFilter(model: string, modelAlias: string, field: string, fieldDef: FieldDef, payload: any) {\n        if (!fieldDef.array) {\n            return this.buildToOneRelationFilter(model, modelAlias, field, fieldDef, payload);\n        } else {\n            return this.buildToManyRelationFilter(model, modelAlias, field, fieldDef, payload);\n        }\n    }\n\n    private buildToOneRelationFilter(\n        model: string,\n        modelAlias: string,\n        field: string,\n        fieldDef: FieldDef,\n        payload: any,\n    ): Expression<SqlBool> {\n        if (payload === null) {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n            if (ownedByModel && !fieldDef.originModel) {\n                // can be short-circuited to FK null check\n                return this.and(...keyPairs.map(({ fk }) => this.eb(this.eb.ref(`${modelAlias}.${fk}`), 'is', null)));\n            } else {\n                // translate it to `{ is: null }` filter\n                return this.buildToOneRelationFilter(model, modelAlias, field, fieldDef, { is: null });\n            }\n        }\n\n        const joinAlias = tmpAlias(`${modelAlias}$${field}`);\n        const joinPairs = buildJoinPairs(\n            this.schema,\n            model,\n            // if field is from a base, use the base model to join\n            fieldDef.originModel ?? modelAlias,\n            field,\n            joinAlias,\n        );\n        const baseJoin = this.eb\n            .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n            .select(this.eb.lit(1).as('_'))\n            .where(() =>\n                this.and(...joinPairs.map(([left, right]) => this.eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n            );\n\n        const existsSelect = (extraFilter?: () => Expression<SqlBool>) => {\n            const q = extraFilter ? baseJoin.where(extraFilter) : baseJoin;\n            return this.buildExistsExpression(q);\n        };\n\n        const conditions: Expression<SqlBool>[] = [];\n\n        if ('is' in payload || 'isNot' in payload) {\n            if ('is' in payload) {\n                if (payload.is === null) {\n                    // check if not found\n                    conditions.push(this.eb.not(existsSelect()));\n                } else {\n                    // check if found that matches the filter\n                    conditions.push(existsSelect(() => this.buildFilter(fieldDef.type, joinAlias, payload.is)));\n                }\n            }\n\n            if ('isNot' in payload) {\n                if (payload.isNot === null) {\n                    // check if found\n                    conditions.push(existsSelect());\n                } else {\n                    conditions.push(\n                        this.or(\n                            // no related row\n                            this.eb.not(existsSelect()),\n                            // related row exists but doesn't match the filter\n                            this.eb.not(existsSelect(() => this.buildFilter(fieldDef.type, joinAlias, payload.isNot))),\n                        ),\n                    );\n                }\n            }\n        } else {\n            conditions.push(existsSelect(() => this.buildFilter(fieldDef.type, joinAlias, payload)));\n        }\n\n        return this.and(...conditions);\n    }\n\n    private buildToManyRelationFilter(\n        model: string,\n        modelAlias: string,\n        field: string,\n        fieldDef: FieldDef,\n        payload: any,\n    ) {\n        // null check needs to be converted to fk \"is null\" checks\n        if (payload === null) {\n            return this.eb(this.eb.ref(`${modelAlias}.${field}`), 'is', null);\n        }\n\n        const relationModel = fieldDef.type;\n\n        // evaluating the filter involves creating an inner select,\n        // give it an alias to avoid conflict\n        const relationFilterSelectAlias = tmpAlias(`${modelAlias}$${field}$flt`);\n\n        const buildPkFkWhereRefs = (eb: ExpressionBuilder<any, any>) => {\n            const m2m = getManyToManyRelation(this.schema, model, field);\n            if (m2m) {\n                // many-to-many relation\n\n                const modelIdFields = requireIdFields(this.schema, model);\n                invariant(modelIdFields.length === 1, 'many-to-many relation must have exactly one id field');\n                const relationIdFields = requireIdFields(this.schema, relationModel);\n                invariant(relationIdFields.length === 1, 'many-to-many relation must have exactly one id field');\n\n                return eb(\n                    this.eb.ref(`${relationFilterSelectAlias}.${relationIdFields[0]}`),\n                    'in',\n                    eb\n                        .selectFrom(m2m.joinTable)\n                        .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n                        .whereRef(\n                            this.eb.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n                            '=',\n                            this.eb.ref(`${modelAlias}.${modelIdFields[0]}`),\n                        ),\n                );\n            } else {\n                const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n                let result = this.true();\n                for (const { fk, pk } of relationKeyPairs.keyPairs) {\n                    if (relationKeyPairs.ownedByModel) {\n                        result = this.and(\n                            result,\n                            eb(\n                                this.eb.ref(`${modelAlias}.${fk}`),\n                                '=',\n                                this.eb.ref(`${relationFilterSelectAlias}.${pk}`),\n                            ),\n                        );\n                    } else {\n                        result = this.and(\n                            result,\n                            eb(\n                                this.eb.ref(`${modelAlias}.${pk}`),\n                                '=',\n                                this.eb.ref(`${relationFilterSelectAlias}.${fk}`),\n                            ),\n                        );\n                    }\n                }\n                return result;\n            }\n        };\n\n        let result = this.true();\n\n        for (const [key, subPayload] of Object.entries(payload)) {\n            if (!subPayload) {\n                continue;\n            }\n\n            const existsSelect = (negate: boolean) => {\n                const filter = this.buildFilter(relationModel, relationFilterSelectAlias, subPayload);\n                const innerQuery = this.buildSelectModel(relationModel, relationFilterSelectAlias)\n                    .select(this.eb.lit(1).as('_'))\n                    .where(buildPkFkWhereRefs(this.eb))\n                    .where(() => (negate ? this.eb.not(filter) : filter));\n                return this.buildExistsExpression(innerQuery);\n            };\n\n            switch (key) {\n                case 'some': {\n                    result = this.and(result, existsSelect(false));\n                    break;\n                }\n\n                case 'every': {\n                    result = this.and(result, this.eb.not(existsSelect(true)));\n                    break;\n                }\n\n                case 'none': {\n                    result = this.and(result, this.eb.not(existsSelect(false)));\n                    break;\n                }\n            }\n        }\n\n        return result;\n    }\n\n    private buildArrayFilter(fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n        const clauses: Expression<SqlBool>[] = [];\n        const fieldType = fieldDef.type as BuiltinType;\n\n        for (const [key, _value] of Object.entries(payload)) {\n            if (_value === undefined) {\n                continue;\n            }\n\n            invariant(fieldDef.array, 'Field must be an array type to build array filter');\n            const value = this.transformInput(_value, fieldType, true, fieldDef);\n\n            let receiver = fieldRef;\n            if (isEnum(this.schema, fieldType)) {\n                // cast enum array to `text[]` for type compatibility\n                receiver = this.eb.cast(fieldRef, sql.raw('text[]'));\n            }\n\n            const buildArray = (value: unknown) => {\n                invariant(Array.isArray(value), 'Array filter value must be an array');\n                return this.buildArrayValue(\n                    value.map((v) => this.eb.val(v)),\n                    fieldType,\n                );\n            };\n\n            switch (key) {\n                case 'equals': {\n                    clauses.push(this.eb(receiver, '=', buildArray(value)));\n                    break;\n                }\n\n                case 'has': {\n                    clauses.push(this.buildArrayContains(receiver, this.eb.val(value), fieldType));\n                    break;\n                }\n\n                case 'hasEvery': {\n                    clauses.push(this.buildArrayHasEvery(receiver, buildArray(value)));\n                    break;\n                }\n\n                case 'hasSome': {\n                    clauses.push(this.buildArrayHasSome(receiver, buildArray(value)));\n                    break;\n                }\n\n                case 'isEmpty': {\n                    clauses.push(this.eb(fieldRef, value === true ? '=' : '!=', this.eb.val([])));\n                    break;\n                }\n\n                default: {\n                    throw createInvalidInputError(`Invalid array filter key: ${key}`);\n                }\n            }\n        }\n\n        return this.and(...clauses);\n    }\n\n    buildPrimitiveFilter(fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n        if (payload === null) {\n            return this.eb(fieldRef, 'is', null);\n        }\n\n        if (isEnum(this.schema, fieldDef.type)) {\n            return this.buildEnumFilter(fieldRef, fieldDef, payload);\n        }\n\n        if (isTypeDef(this.schema, fieldDef.type)) {\n            if (payload instanceof DbNullClass || payload instanceof JsonNullClass || payload instanceof AnyNullClass) {\n                // null sentinel passed directly (e.g. where: { field: DbNull }) — treat like { equals: sentinel }\n                return this.buildJsonValueFilterClause(fieldRef, payload);\n            }\n            return this.buildJsonFilter(fieldRef, payload, fieldDef);\n        }\n\n        return match(fieldDef.type as BuiltinType)\n            .with('String', () => this.buildStringFilter(fieldRef, payload, fieldDef))\n            .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n                this.buildNumberFilter(fieldRef, type, payload),\n            )\n            .with('Boolean', () => this.buildBooleanFilter(fieldRef, payload))\n            .with('DateTime', () => this.buildDateTimeFilter(fieldRef, payload))\n            .with('Bytes', () => this.buildBytesFilter(fieldRef, payload))\n            .with('Json', () => this.buildJsonFilter(fieldRef, payload, fieldDef))\n            .with('Unsupported', () => {\n                throw createInvalidInputError(`Unsupported field cannot be used in filters`);\n            })\n            .exhaustive();\n    }\n\n    private buildJsonFilter(receiver: Expression<any>, filter: any, fieldDef: FieldDef): any {\n        invariant(filter && typeof filter === 'object', 'Json filter payload must be an object');\n\n        if (\n            [\n                'path',\n                'equals',\n                'not',\n                'string_contains',\n                'string_starts_with',\n                'string_ends_with',\n                'array_contains',\n                'array_starts_with',\n                'array_ends_with',\n            ].some((k) => k in filter)\n        ) {\n            return this.buildPlainJsonFilter(receiver, filter);\n        } else if (isTypeDef(this.schema, fieldDef.type)) {\n            return this.buildTypedJsonFilter(receiver, filter, fieldDef.type, !!fieldDef.array);\n        } else {\n            throw createInvalidInputError(`Invalid JSON filter payload`);\n        }\n    }\n\n    private buildPlainJsonFilter(receiver: Expression<any>, filter: any) {\n        const clauses: Expression<SqlBool>[] = [];\n\n        const path = filter.path;\n        const jsonReceiver = this.buildJsonPathSelection(receiver, path);\n        const stringReceiver = this.castText(jsonReceiver);\n\n        const mode = filter.mode ?? 'default';\n        invariant(mode === 'default' || mode === 'insensitive', 'Invalid JSON filter mode');\n\n        for (const [key, value] of Object.entries(filter)) {\n            switch (key) {\n                case 'equals': {\n                    clauses.push(this.buildJsonValueFilterClause(jsonReceiver, value));\n                    break;\n                }\n                case 'not': {\n                    clauses.push(this.eb.not(this.buildJsonValueFilterClause(jsonReceiver, value)));\n                    break;\n                }\n                case 'string_contains': {\n                    invariant(typeof value === 'string', 'string_contains value must be a string');\n                    clauses.push(this.buildJsonStringFilter(stringReceiver, key, value, mode));\n                    break;\n                }\n                case 'string_starts_with': {\n                    invariant(typeof value === 'string', 'string_starts_with value must be a string');\n                    clauses.push(this.buildJsonStringFilter(stringReceiver, key, value, mode));\n                    break;\n                }\n                case 'string_ends_with': {\n                    invariant(typeof value === 'string', 'string_ends_with value must be a string');\n                    clauses.push(this.buildJsonStringFilter(stringReceiver, key, value, mode));\n                    break;\n                }\n                case 'array_contains': {\n                    clauses.push(this.buildJsonArrayFilter(jsonReceiver, key, value));\n                    break;\n                }\n                case 'array_starts_with': {\n                    clauses.push(this.buildJsonArrayFilter(jsonReceiver, key, value));\n                    break;\n                }\n                case 'array_ends_with': {\n                    clauses.push(this.buildJsonArrayFilter(jsonReceiver, key, value));\n                    break;\n                }\n                case 'path':\n                case 'mode':\n                    // already handled\n                    break;\n                default:\n                    throw createInvalidInputError(`Invalid JSON filter key: ${key}`);\n            }\n        }\n        return this.and(...clauses);\n    }\n\n    private buildTypedJsonFilter(receiver: Expression<any>, filter: any, typeDefName: string, array: boolean) {\n        if (array) {\n            return this.buildTypedJsonArrayFilter(receiver, filter, typeDefName);\n        } else {\n            return this.buildTypeJsonNonArrayFilter(receiver, filter, typeDefName);\n        }\n    }\n\n    private buildTypedJsonArrayFilter(receiver: Expression<any>, filter: any, typeDefName: string) {\n        invariant(filter && typeof filter === 'object', 'Typed JSON array filter payload must be an object');\n\n        const makeExistsPred = (filter: any) =>\n            this.buildJsonArrayExistsPredicate(receiver, (elem) =>\n                this.buildTypedJsonFilter(elem, filter, typeDefName, false),\n            );\n\n        const makeExistsNegatedPred = (filter: any) =>\n            this.buildJsonArrayExistsPredicate(receiver, (elem) =>\n                this.eb.not(this.buildTypedJsonFilter(elem, filter, typeDefName, false)),\n            );\n\n        const clauses: Expression<SqlBool>[] = [];\n\n        for (const [key, value] of Object.entries(filter)) {\n            if (!value || typeof value !== 'object') {\n                continue;\n            }\n            switch (key) {\n                case 'some':\n                    clauses.push(makeExistsPred(value));\n                    break;\n\n                case 'none':\n                    clauses.push(this.eb.not(makeExistsPred(value)));\n                    break;\n\n                case 'every':\n                    clauses.push(this.eb.not(makeExistsNegatedPred(value)));\n                    break;\n\n                default:\n                    invariant(false, `Invalid typed JSON array filter key: ${key}`);\n            }\n        }\n        return this.and(...clauses);\n    }\n\n    private buildTypeJsonNonArrayFilter(\n        receiver: Expression<any>,\n        filter: any,\n        typeDefName: string,\n    ): Expression<SqlBool> {\n        const clauses: Expression<SqlBool>[] = [];\n\n        if (filter === null) {\n            return this.eb(receiver, '=', this.transformInput(null, 'Json', false));\n        }\n\n        invariant(filter && typeof filter === 'object', 'Typed JSON filter payload must be an object');\n\n        if ('is' in filter || 'isNot' in filter) {\n            // is / isNot filters\n            if ('is' in filter && filter.is && typeof filter.is === 'object') {\n                clauses.push(this.buildTypedJsonFilter(receiver, filter.is, typeDefName, false));\n            }\n\n            if ('isNot' in filter && filter.isNot && typeof filter.isNot === 'object') {\n                clauses.push(this.eb.not(this.buildTypedJsonFilter(receiver, filter.isNot, typeDefName, false)));\n            }\n        } else {\n            // direct field filters\n            const typeDef = requireTypeDef(this.schema, typeDefName);\n            for (const [key, value] of Object.entries(filter)) {\n                const fieldDef = typeDef.fields[key];\n                invariant(fieldDef, `Field \"${key}\" not found in type definition \"${typeDefName}\"`);\n                const fieldReceiver = this.buildJsonPathSelection(receiver, `$.${key}`);\n                if (isTypeDef(this.schema, fieldDef.type)) {\n                    clauses.push(this.buildTypedJsonFilter(fieldReceiver, value, fieldDef.type, !!fieldDef.array));\n                } else {\n                    if (fieldDef.array) {\n                        clauses.push(this.buildArrayFilter(fieldReceiver, fieldDef, value));\n                    } else {\n                        let _receiver = fieldReceiver;\n                        if (fieldDef.type === 'String') {\n                            // trim quotes for string fields\n                            _receiver = this.trimTextQuotes(this.castText(fieldReceiver));\n                        }\n                        clauses.push(this.buildPrimitiveFilter(_receiver, fieldDef, value));\n                    }\n                }\n            }\n        }\n        return this.and(...clauses);\n    }\n\n    private buildJsonValueFilterClause(lhs: Expression<any>, value: unknown) {\n        if (value instanceof DbNullClass) {\n            return this.eb(lhs, 'is', null);\n        } else if (value instanceof JsonNullClass) {\n            return this.eb.and([\n                this.eb(lhs, '=', this.transformInput(null, 'Json', false)),\n                this.eb(lhs, 'is not', null),\n            ]);\n        } else if (value instanceof AnyNullClass) {\n            // AnyNull matches both DB NULL and JSON null\n            return this.eb.or([this.eb(lhs, 'is', null), this.eb(lhs, '=', this.transformInput(null, 'Json', false))]);\n        } else {\n            return this.buildJsonEqualityFilter(lhs, value);\n        }\n    }\n\n    protected buildJsonEqualityFilter(lhs: Expression<any>, rhs: unknown) {\n        return this.buildValueFilter(lhs, 'Json', rhs);\n    }\n\n    private buildValueFilter(lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n        if (rhs === undefined) {\n            // undefined filter is no-op, always true\n            return this.true();\n        }\n\n        if (rhs === null) {\n            // null comparison\n            return this.eb(lhs, 'is', null);\n        }\n\n        return this.eb(lhs, '=', this.transformInput(rhs, type, false));\n    }\n\n    private buildStandardFilter(\n        type: BuiltinType,\n        payload: any,\n        lhs: Expression<any>,\n        getRhs: (value: unknown) => any,\n        recurse: (value: unknown) => Expression<SqlBool>,\n        throwIfInvalid = false,\n        onlyForKeys: string[] | undefined = undefined,\n        excludeKeys: string[] = [],\n    ) {\n        if (payload === null || !isPlainObject(payload)) {\n            return {\n                conditions: [this.buildValueFilter(lhs, type, payload)],\n                consumedKeys: [],\n            };\n        }\n\n        const conditions: Expression<SqlBool>[] = [];\n        const consumedKeys: string[] = [];\n\n        for (const [op, value] of Object.entries(payload)) {\n            if (onlyForKeys && !onlyForKeys.includes(op)) {\n                continue;\n            }\n            if (excludeKeys.includes(op)) {\n                continue;\n            }\n            if (value === undefined) {\n                continue;\n            }\n            const rhs = Array.isArray(value) ? value.map(getRhs) : getRhs(value);\n            const condition = match(op)\n                .with('equals', () => (rhs === null ? this.eb(lhs, 'is', null) : this.eb(lhs, '=', rhs)))\n                .with('in', () => {\n                    invariant(Array.isArray(rhs), 'right hand side must be an array');\n                    if (rhs.length === 0) {\n                        return this.false();\n                    } else {\n                        return this.eb(lhs, 'in', rhs);\n                    }\n                })\n                .with('notIn', () => {\n                    invariant(Array.isArray(rhs), 'right hand side must be an array');\n                    if (rhs.length === 0) {\n                        return this.true();\n                    } else {\n                        return this.eb.not(this.eb(lhs, 'in', rhs));\n                    }\n                })\n                .with('lt', () => this.eb(lhs, '<', rhs))\n                .with('lte', () => this.eb(lhs, '<=', rhs))\n                .with('gt', () => this.eb(lhs, '>', rhs))\n                .with('gte', () => this.eb(lhs, '>=', rhs))\n                .with('between', () => {\n                    invariant(Array.isArray(rhs), 'right hand side must be an array');\n                    invariant(rhs.length === 2, 'right hand side must have a length of 2');\n                    const [start, end] = rhs;\n                    return this.eb.and([this.eb(lhs, '>=', start), this.eb(lhs, '<=', end)]);\n                })\n                .with('not', () => this.eb.not(recurse(value)))\n                // aggregations\n                .with(P.union(...AggregateOperators), (op) => {\n                    const innerResult = this.buildStandardFilter(\n                        type,\n                        value,\n                        aggregate(this.eb, lhs, op),\n                        getRhs,\n                        recurse,\n                        throwIfInvalid,\n                    );\n                    consumedKeys.push(...innerResult.consumedKeys);\n                    return this.and(...innerResult.conditions);\n                })\n                .otherwise(() => {\n                    if (throwIfInvalid) {\n                        throw createInvalidInputError(`Invalid filter key: ${op}`);\n                    } else {\n                        return undefined;\n                    }\n                });\n\n            if (condition) {\n                conditions.push(condition);\n                consumedKeys.push(op);\n            }\n        }\n\n        return { conditions, consumedKeys };\n    }\n\n    private buildStringFilter(fieldRef: Expression<any>, payload: StringFilter<true, boolean>, fieldDef?: FieldDef) {\n        let mode: 'default' | 'insensitive' | undefined;\n        if (payload && typeof payload === 'object' && 'mode' in payload) {\n            mode = payload.mode;\n        }\n\n        const { conditions, consumedKeys } = this.buildStandardFilter(\n            'String',\n            payload,\n            mode === 'insensitive' ? this.eb.fn('lower', [fieldRef]) : fieldRef,\n            (value) => this.prepStringCasing(this.eb, value, mode),\n            (value) => this.buildStringFilter(fieldRef, value as StringFilter<true, boolean>, fieldDef),\n        );\n\n        if (payload && typeof payload === 'object') {\n            for (const [key, value] of Object.entries(payload)) {\n                if (key === 'mode' || consumedKeys.includes(key)) {\n                    continue;\n                }\n\n                if (value === undefined) {\n                    continue;\n                }\n\n                if (key === 'fuzzy') {\n                    invariant(\n                        fieldDef?.fuzzy === true,\n                        `field \"${fieldDef?.name ?? '<unknown>'}\" is not fuzzy-searchable; add the \\`@fuzzy\\` attribute to use the \\`fuzzy\\` filter`,\n                    );\n                    conditions.push(this.buildFuzzyFilter(fieldRef, this.normalizeFuzzyOptions(value)));\n                    continue;\n                }\n\n                if (key === 'fts') {\n                    invariant(\n                        fieldDef?.fullText === true,\n                        `field \"${fieldDef?.name ?? '<unknown>'}\" is not full-text-searchable; add the \\`@fullText\\` attribute to use the \\`fts\\` filter`,\n                    );\n                    conditions.push(this.buildFullTextFilter(fieldRef, value));\n                    continue;\n                }\n\n                invariant(typeof value === 'string', `${key} value must be a string`);\n\n                const escapedValue = this.escapeLikePattern(value);\n                const condition = match(key)\n                    .with('contains', () => this.buildStringLike(fieldRef, `%${escapedValue}%`, mode === 'insensitive'))\n                    .with('startsWith', () =>\n                        this.buildStringLike(fieldRef, `${escapedValue}%`, mode === 'insensitive'),\n                    )\n                    .with('endsWith', () => this.buildStringLike(fieldRef, `%${escapedValue}`, mode === 'insensitive'))\n                    .otherwise(() => {\n                        throw createInvalidInputError(`Invalid string filter key: ${key}`);\n                    });\n\n                if (condition) {\n                    conditions.push(condition);\n                }\n            }\n        }\n\n        return this.and(...conditions);\n    }\n\n    private buildJsonStringFilter(\n        receiver: Expression<any>,\n        operation: 'string_contains' | 'string_starts_with' | 'string_ends_with',\n        value: string,\n        mode: 'default' | 'insensitive',\n    ) {\n        // build LIKE pattern based on operation, note that receiver is quoted\n        const escapedValue = this.escapeLikePattern(value);\n        const pattern = match(operation)\n            .with('string_contains', () => `\"%${escapedValue}%\"`)\n            .with('string_starts_with', () => `\"${escapedValue}%\"`)\n            .with('string_ends_with', () => `\"%${escapedValue}\"`)\n            .exhaustive();\n\n        return this.buildStringLike(receiver, pattern, mode === 'insensitive');\n    }\n\n    private escapeLikePattern(pattern: string) {\n        return pattern.replace(/\\\\/g, '\\\\\\\\').replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n    }\n\n    private buildStringLike(receiver: Expression<any>, pattern: string, insensitive: boolean) {\n        const { supportsILike } = this.getStringCasingBehavior();\n        const op = insensitive && supportsILike ? 'ilike' : 'like';\n        return sql<SqlBool>`${receiver} ${sql.raw(op)} ${sql.val(pattern)} escape ${sql.val('\\\\')}`;\n    }\n\n    private prepStringCasing(\n        eb: ExpressionBuilder<any, any>,\n        value: unknown,\n        mode: 'default' | 'insensitive' | undefined,\n    ): any {\n        if (!mode || mode === 'default') {\n            return value === null ? value : sql.val(value);\n        }\n\n        if (typeof value === 'string') {\n            return eb.fn('lower', [sql.val(value)]);\n        } else if (Array.isArray(value)) {\n            return value.map((v) => this.prepStringCasing(eb, v, mode));\n        } else {\n            return value === null ? null : sql.val(value);\n        }\n    }\n\n    private buildNumberFilter(fieldRef: Expression<any>, type: BuiltinType, payload: any) {\n        const { conditions } = this.buildStandardFilter(\n            type,\n            payload,\n            fieldRef,\n            (value) => this.transformInput(value, type, false),\n            (value) => this.buildNumberFilter(fieldRef, type, value),\n        );\n        return this.and(...conditions);\n    }\n\n    private buildBooleanFilter(fieldRef: Expression<any>, payload: BooleanFilter<boolean, boolean>) {\n        const { conditions } = this.buildStandardFilter(\n            'Boolean',\n            payload,\n            fieldRef,\n            (value) => this.transformInput(value, 'Boolean', false),\n            (value) => this.buildBooleanFilter(fieldRef, value as BooleanFilter<boolean, boolean>),\n            true,\n            ['equals', 'not'],\n        );\n        return this.and(...conditions);\n    }\n\n    private buildDateTimeFilter(fieldRef: Expression<any>, payload: DateTimeFilter<boolean, boolean>) {\n        const { conditions } = this.buildStandardFilter(\n            'DateTime',\n            payload,\n            fieldRef,\n            (value) => this.transformInput(value, 'DateTime', false),\n            (value) => this.buildDateTimeFilter(fieldRef, value as DateTimeFilter<boolean, boolean>),\n            true,\n        );\n        return this.and(...conditions);\n    }\n\n    private buildBytesFilter(fieldRef: Expression<any>, payload: BytesFilter<boolean, boolean>) {\n        const conditions = this.buildStandardFilter(\n            'Bytes',\n            payload,\n            fieldRef,\n            (value) => this.transformInput(value, 'Bytes', false),\n            (value) => this.buildBytesFilter(fieldRef, value as BytesFilter<boolean, boolean>),\n            true,\n            ['equals', 'in', 'notIn', 'not'],\n        );\n        return this.and(...conditions.conditions);\n    }\n\n    private buildEnumFilter(fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n        const conditions = this.buildStandardFilter(\n            'String',\n            payload,\n            fieldRef,\n            (value) => value,\n            (value) => this.buildEnumFilter(fieldRef, fieldDef, value),\n            true,\n            ['equals', 'in', 'notIn', 'not'],\n        );\n        return this.and(...conditions.conditions);\n    }\n\n    buildOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        orderBy: OrArray<OrderBy<Schema, GetModels<Schema>, boolean, boolean>> | undefined,\n        negated: boolean,\n        take: number | undefined,\n    ) {\n        if (!orderBy) {\n            return query;\n        }\n\n        let result = query;\n\n        const buildFieldRef = (model: string, field: string, modelAlias: string) => {\n            const fieldDef = requireField(this.schema, model, field);\n            return fieldDef.originModel\n                ? this.fieldRef(fieldDef.originModel, field, fieldDef.originModel)\n                : this.fieldRef(model, field, modelAlias);\n        };\n\n        enumerate(orderBy).forEach((orderBy, index) => {\n            for (const [field, value] of Object.entries<any>(orderBy)) {\n                if (!value) {\n                    continue;\n                }\n\n                // _fuzzyRelevance ordering\n                if (field === '_fuzzyRelevance') {\n                    result = this.applyFuzzyRelevanceOrderBy(result, model, modelAlias, value, negated, buildFieldRef);\n                    continue;\n                }\n\n                // _ftsRelevance ordering\n                if (field === '_ftsRelevance') {\n                    result = this.applyFtsRelevanceOrderBy(result, model, modelAlias, value, negated, buildFieldRef);\n                    continue;\n                }\n\n                // aggregations\n                if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n                    result = this.applyAggregationOrderBy(\n                        result,\n                        model,\n                        modelAlias,\n                        field as AggregateOperators,\n                        value,\n                        negated,\n                        buildFieldRef,\n                    );\n                    continue;\n                }\n\n                const fieldDef = requireField(this.schema, model, field);\n\n                if (!fieldDef.relation) {\n                    result = this.applyScalarOrderBy(result, model, modelAlias, field, value, negated, buildFieldRef);\n                } else {\n                    result = this.applyRelationOrderBy(\n                        result,\n                        model,\n                        modelAlias,\n                        field,\n                        fieldDef,\n                        value,\n                        negated,\n                        take,\n                        index,\n                    );\n                }\n            }\n        });\n\n        return result;\n    }\n\n    private applyRelationOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        field: string,\n        fieldDef: FieldDef,\n        value: any,\n        negated: boolean,\n        take: number | undefined,\n        index: number,\n    ): SelectQueryBuilder<any, any, any> {\n        const relationModel = fieldDef.type;\n\n        if (fieldDef.array) {\n            // order by to-many relation\n            if (typeof value !== 'object') {\n                throw createInvalidInputError(`invalid orderBy value for field \"${field}\"`);\n            }\n            if ('_count' in value) {\n                invariant(\n                    value._count === 'asc' || value._count === 'desc',\n                    'invalid orderBy value for field \"_count\"',\n                );\n                const sort = this.negateSort(value._count, negated);\n                return query.orderBy((eb) => {\n                    const subQueryAlias = tmpAlias(`${modelAlias}$ob$${field}$ct`);\n                    let subQuery = this.buildSelectModel(relationModel, subQueryAlias);\n                    const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n                    subQuery = subQuery.where(() =>\n                        this.and(...joinPairs.map(([left, right]) => eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n                    );\n                    subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n                    return subQuery;\n                }, sort);\n            }\n            return query;\n        }\n\n        // order by to-one relation\n        const joinAlias = tmpAlias(`${modelAlias}$ob$${index}`);\n        const joined = query.leftJoin(`${relationModel} as ${joinAlias}`, (join) => {\n            const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, joinAlias);\n            return join.on((eb) =>\n                this.and(...joinPairs.map(([left, right]) => eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n            );\n        });\n        return this.buildOrderBy(joined, relationModel, joinAlias, value, negated, take);\n    }\n\n    private applyScalarOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        field: string,\n        value: any,\n        negated: boolean,\n        buildFieldRef: (model: string, field: string, modelAlias: string) => Expression<any>,\n    ): SelectQueryBuilder<any, any, any> {\n        const fieldRef = buildFieldRef(model, field, modelAlias);\n        if (value === 'asc' || value === 'desc') {\n            return query.orderBy(fieldRef, this.negateSort(value, negated));\n        }\n        if (typeof value === 'object' && 'sort' in value && (value.sort === 'asc' || value.sort === 'desc')) {\n            const sort = this.negateSort(value.sort, negated);\n            if (value.nulls === 'first' || value.nulls === 'last') {\n                return this.buildOrderByField(query, fieldRef, sort, value.nulls);\n            } else {\n                return query.orderBy(fieldRef, sort);\n            }\n        }\n        return query;\n    }\n\n    private applyAggregationOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        field: AggregateOperators,\n        value: any,\n        negated: boolean,\n        buildFieldRef: (model: string, field: string, modelAlias: string) => Expression<any>,\n    ): SelectQueryBuilder<any, any, any> {\n        invariant(typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\n        let result = query;\n        for (const [k, v] of Object.entries<SortOrder>(value)) {\n            invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n            result = result.orderBy(\n                (eb) => aggregate(eb, buildFieldRef(model, k, modelAlias), field),\n                this.negateSort(v, negated),\n            );\n        }\n        return result;\n    }\n\n    private applyFuzzyRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        value: any,\n        negated: boolean,\n        buildFieldRef: (model: string, field: string, modelAlias: string) => Expression<any>,\n    ): SelectQueryBuilder<any, any, any> {\n        invariant(\n            typeof value === 'object' && 'fields' in value && 'search' in value && 'sort' in value,\n            'invalid orderBy value for \"_fuzzyRelevance\"',\n        );\n        invariant(\n            Array.isArray(value.fields) && value.fields.length > 0,\n            '_fuzzyRelevance.fields must be a non-empty array',\n        );\n        invariant(value.sort === 'asc' || value.sort === 'desc', 'invalid sort value for \"_fuzzyRelevance\"');\n        invariant(\n            typeof value.search === 'string' && value.search.length > 0,\n            '_fuzzyRelevance.search must be a non-empty string',\n        );\n        const mode = value.mode ?? 'simple';\n        invariant(\n            mode === 'simple' || mode === 'word' || mode === 'strictWord',\n            '_fuzzyRelevance.mode must be \"simple\", \"word\" or \"strictWord\"',\n        );\n        const unaccent = value.unaccent ?? false;\n        invariant(typeof unaccent === 'boolean', '_fuzzyRelevance.unaccent must be a boolean');\n        for (const fieldName of value.fields as string[]) {\n            const fieldDef = requireField(this.schema, model, fieldName);\n            invariant(\n                fieldDef.fuzzy === true,\n                `field \"${fieldName}\" is not fuzzy-searchable; add the \\`@fuzzy\\` attribute to use it in \\`_fuzzyRelevance\\``,\n            );\n        }\n        const fieldRefs = (value.fields as string[]).map((f) => buildFieldRef(model, f, modelAlias));\n        return this.buildFuzzyRelevanceOrderBy(\n            query,\n            fieldRefs,\n            value.search,\n            this.negateSort(value.sort, negated),\n            mode,\n            unaccent,\n        );\n    }\n\n    private applyFtsRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        value: any,\n        negated: boolean,\n        buildFieldRef: (model: string, field: string, modelAlias: string) => Expression<any>,\n    ): SelectQueryBuilder<any, any, any> {\n        invariant(\n            typeof value === 'object' && 'fields' in value && 'search' in value && 'sort' in value,\n            'invalid orderBy value for \"_ftsRelevance\"',\n        );\n        invariant(\n            Array.isArray(value.fields) && value.fields.length > 0,\n            '_ftsRelevance.fields must be a non-empty array',\n        );\n        invariant(value.sort === 'asc' || value.sort === 'desc', 'invalid sort value for \"_ftsRelevance\"');\n        invariant(\n            typeof value.search === 'string' && value.search.length > 0,\n            '_ftsRelevance.search must be a non-empty string',\n        );\n        if (value.config !== undefined) {\n            invariant(\n                typeof value.config === 'string' && value.config.length > 0,\n                '_ftsRelevance.config must be a non-empty string',\n            );\n        }\n        const config = value.config as string | undefined;\n        for (const fieldName of value.fields as string[]) {\n            const fieldDef = requireField(this.schema, model, fieldName);\n            invariant(\n                fieldDef.fullText === true,\n                `field \"${fieldName}\" is not full-text-searchable; add the \\`@fullText\\` attribute to use it in \\`_ftsRelevance\\``,\n            );\n        }\n        const fieldRefs = (value.fields as string[]).map((f) => buildFieldRef(model, f, modelAlias));\n        return this.buildFtsRelevanceOrderBy(\n            query,\n            fieldRefs,\n            value.search,\n            config,\n            this.negateSort(value.sort, negated),\n        );\n    }\n\n    buildSelectAllFields(\n        model: string,\n        query: SelectQueryBuilder<any, any, any>,\n        omit: Record<string, boolean | undefined> | undefined | null,\n        modelAlias: string,\n    ) {\n        let result = query;\n\n        for (const fieldDef of getModelFields(this.schema, model, { inherited: true, computed: true })) {\n            if (this.shouldOmitField(omit, model, fieldDef.name)) {\n                continue;\n            }\n            result = this.buildSelectField(result, model, modelAlias, fieldDef.name);\n        }\n\n        // select all fields from delegate descendants and pack into a JSON field `$delegate$Model`\n        const descendants = getDelegateDescendantModels(this.schema, model);\n        for (const subModel of descendants) {\n            result = this.buildDelegateJoin(model, modelAlias, subModel.name, result);\n            result = result.select(() => {\n                const jsonObject: Record<string, Expression<any>> = {};\n                for (const fieldDef of getModelFields(this.schema, subModel.name, { computed: true })) {\n                    if (this.shouldOmitField(omit, subModel.name, fieldDef.name)) {\n                        continue;\n                    }\n                    jsonObject[fieldDef.name] = this.fieldRef(subModel.name, fieldDef.name, subModel.name);\n                }\n                return this.buildJsonObject(jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);\n            });\n        }\n\n        return result;\n    }\n\n    shouldOmitField(omit: unknown, model: string, field: string) {\n        // query-level\n        if (omit && typeof omit === 'object' && typeof (omit as any)[field] === 'boolean') {\n            return (omit as any)[field];\n        }\n\n        // client-level: check both uncapitalized (current) and original (backward compat) model name\n        const uncapModel = lowerCaseFirst(model);\n        const omitConfig =\n            (this.options.omit as Record<string, any> | undefined)?.[uncapModel] ??\n            (this.options.omit as Record<string, any> | undefined)?.[model];\n        if (omitConfig && typeof omitConfig === 'object' && typeof omitConfig[field] === 'boolean') {\n            return omitConfig[field];\n        }\n\n        // schema-level\n        const fieldDef = requireField(this.schema, model, field);\n        return !!fieldDef.omit;\n    }\n\n    protected buildModelSelect(\n        model: GetModels<Schema>,\n        subQueryAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n        selectAllFields: boolean,\n    ) {\n        let subQuery = this.buildSelectModel(model, subQueryAlias);\n\n        if (selectAllFields) {\n            subQuery = this.buildSelectAllFields(\n                model,\n                subQuery,\n                typeof payload === 'object' ? payload?.omit : undefined,\n                subQueryAlias,\n            );\n        }\n\n        if (payload && typeof payload === 'object') {\n            subQuery = this.buildFilterSortTake(model, payload, subQuery, subQueryAlias);\n        }\n\n        return subQuery;\n    }\n\n    buildSelectField(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        modelAlias: string,\n        field: string,\n    ): SelectQueryBuilder<any, any, any> {\n        const fieldDef = requireField(this.schema, model, field);\n\n        // if field is defined on a delegate base, the base model is joined with its\n        // model name from outer query, so we should use it directly as the alias\n        const fieldModel = fieldDef.originModel ?? model;\n        const alias = fieldDef.originModel ?? modelAlias;\n\n        return query.select(() => this.fieldRef(fieldModel, field, alias).as(field));\n    }\n\n    buildDelegateJoin(\n        thisModel: string,\n        thisModelAlias: string,\n        otherModelAlias: string,\n        query: SelectQueryBuilder<any, any, any>,\n    ) {\n        const idFields = requireIdFields(this.schema, thisModel);\n        query = query.leftJoin(otherModelAlias, (qb) => {\n            for (const idField of idFields) {\n                qb = qb.onRef(`${thisModelAlias}.${idField}`, '=', `${otherModelAlias}.${idField}`);\n            }\n            return qb;\n        });\n        return query;\n    }\n\n    buildCountJson(model: string, eb: ExpressionBuilder<any, any>, parentAlias: string, payload: any) {\n        const modelDef = requireModel(this.schema, model);\n        const toManyRelations = Object.entries(modelDef.fields).filter(([, field]) => field.relation && field.array);\n\n        const selections =\n            payload === true\n                ? {\n                      select: toManyRelations.reduce(\n                          (acc, [field]) => {\n                              acc[field] = true;\n                              return acc;\n                          },\n                          {} as Record<string, boolean>,\n                      ),\n                  }\n                : payload;\n\n        const jsonObject: Record<string, Expression<any>> = {};\n\n        for (const [field, value] of Object.entries(selections.select)) {\n            const fieldDef = requireField(this.schema, model, field);\n            const fieldModel = fieldDef.type as GetModels<Schema>;\n            let fieldCountQuery: SelectQueryBuilder<any, any, any>;\n\n            // Use a unique alias for the subquery to avoid ambiguous references when\n            // fieldModel === model (self-referential relation on a delegate model)\n            const subQueryAlias = tmpAlias(`${parentAlias}$_${field}$count`);\n\n            // join conditions\n            const m2m = getManyToManyRelation(this.schema, model, field);\n            if (m2m) {\n                // many-to-many relation, count the join table\n                fieldCountQuery = this.buildModelSelect(fieldModel, subQueryAlias, value as any, false)\n                    .innerJoin(m2m.joinTable, (join) =>\n                        join\n                            .onRef(`${m2m.joinTable}.${m2m.otherFkName}`, '=', `${subQueryAlias}.${m2m.otherPKName}`)\n                            .onRef(`${m2m.joinTable}.${m2m.parentFkName}`, '=', `${parentAlias}.${m2m.parentPKName}`),\n                    )\n                    .select(eb.fn.countAll().as(`_count$${field}`));\n            } else {\n                // build a nested query to count the number of records in the relation\n                fieldCountQuery = this.buildModelSelect(fieldModel, subQueryAlias, value as any, false).select(\n                    eb.fn.countAll().as(`_count$${field}`),\n                );\n\n                // join conditions\n                const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, subQueryAlias);\n                for (const [left, right] of joinPairs) {\n                    fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n                }\n            }\n\n            jsonObject[field] = fieldCountQuery;\n        }\n\n        return this.buildJsonObject(jsonObject);\n    }\n\n    // #endregion\n\n    // #region utils\n\n    protected negateSort(sort: SortOrder, negated: boolean) {\n        return negated ? (sort === 'asc' ? 'desc' : 'asc') : sort;\n    }\n\n    public true(): Expression<SqlBool> {\n        return this.eb.lit<SqlBool>(this.transformInput(true, 'Boolean', false) as boolean);\n    }\n\n    public false(): Expression<SqlBool> {\n        return this.eb.lit<SqlBool>(this.transformInput(false, 'Boolean', false) as boolean);\n    }\n\n    public isTrue(expression: Expression<SqlBool>) {\n        const node = expression.toOperationNode();\n        if (node.kind !== 'ValueNode') {\n            return false;\n        }\n        return (node as ValueNode).value === true || (node as ValueNode).value === 1;\n    }\n\n    public isFalse(expression: Expression<SqlBool>) {\n        const node = expression.toOperationNode();\n        if (node.kind !== 'ValueNode') {\n            return false;\n        }\n        return (node as ValueNode).value === false || (node as ValueNode).value === 0;\n    }\n\n    and(...args: Expression<SqlBool>[]) {\n        const nonTrueArgs = args.filter((arg) => !this.isTrue(arg));\n        if (nonTrueArgs.length === 0) {\n            return this.true();\n        } else if (nonTrueArgs.length === 1) {\n            return nonTrueArgs[0]!;\n        } else {\n            return this.eb.and(nonTrueArgs);\n        }\n    }\n\n    or(...args: Expression<SqlBool>[]) {\n        const nonFalseArgs = args.filter((arg) => !this.isFalse(arg));\n        if (nonFalseArgs.length === 0) {\n            return this.false();\n        } else if (nonFalseArgs.length === 1) {\n            return nonFalseArgs[0]!;\n        } else {\n            return this.eb.or(nonFalseArgs);\n        }\n    }\n\n    not(...args: Expression<SqlBool>[]) {\n        return this.eb.not(this.and(...args));\n    }\n\n    fieldRef(model: string, field: string, modelAlias?: string, inlineComputedField = true) {\n        const fieldDef = requireField(this.schema, model, field);\n\n        if (!fieldDef.computed) {\n            // regular field\n            return this.eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n        } else {\n            // computed field\n            if (!inlineComputedField) {\n                return this.eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n            }\n            let computer: Function | undefined;\n            if ('computedFields' in this.options) {\n                const computedFields = this.options.computedFields as Record<string, any>;\n                // check both uncapitalized (current) and original (backward compat) model name\n                const computedModel = fieldDef.originModel ?? model;\n                computer =\n                    computedFields?.[lowerCaseFirst(computedModel)]?.[field] ??\n                    computedFields?.[computedModel]?.[field];\n            }\n            if (!computer) {\n                throw createConfigError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n            }\n            return computer(this.eb, { modelAlias });\n        }\n    }\n\n    protected canJoinWithoutNestedSelect(\n        modelDef: ModelDef,\n        payload: boolean | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ) {\n        if (modelDef.computedFields) {\n            // computed fields requires explicit select\n            return false;\n        }\n\n        if (modelDef.baseModel || modelDef.isDelegate) {\n            // delegate models require upward/downward joins\n            return false;\n        }\n\n        if (\n            typeof payload === 'object' &&\n            (payload.orderBy ||\n                payload.skip !== undefined ||\n                payload.take !== undefined ||\n                payload.cursor ||\n                (payload as any).distinct)\n        ) {\n            // ordering/pagination/distinct needs to be handled before joining\n            return false;\n        }\n\n        return true;\n    }\n\n    // #endregion\n\n    /**\n     * Builds an EXISTS expression from an inner SELECT query.\n     * Can be overridden by dialects that need special handling (e.g., MySQL wraps\n     * in a derived table to avoid \"can't specify target table for update in FROM clause\").\n     */\n    protected buildExistsExpression(innerQuery: SelectQueryBuilder<any, any, any>): Expression<SqlBool> {\n        return this.eb.exists(innerQuery);\n    }\n\n    // #region abstract methods\n\n    abstract get provider(): DataSourceProviderType;\n\n    /**\n     * Builds selection for a relation field.\n     */\n    abstract buildRelationSelection(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        relationField: string,\n        parentAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ): SelectQueryBuilder<any, any, any>;\n\n    /**\n     * Builds skip and take clauses.\n     */\n    abstract buildSkipTake(\n        query: SelectQueryBuilder<any, any, any>,\n        skip: number | undefined,\n        take: number | undefined,\n    ): SelectQueryBuilder<any, any, any>;\n\n    /**\n     * Builds an Kysely expression that returns a JSON object for the given key-value pairs.\n     */\n    abstract buildJsonObject(value: Record<string, Expression<unknown>>): AliasableExpression<unknown>;\n\n    /**\n     * Builds an Kysely expression that returns the length of an array.\n     */\n    abstract buildArrayLength(array: Expression<unknown>): AliasableExpression<number>;\n\n    /**\n     * Builds an array value expression.\n     */\n    abstract buildArrayValue(values: Expression<unknown>[], elemType: string): AliasableExpression<unknown>;\n\n    /**\n     * Builds an expression that checks if an array contains a single value.\n     */\n    abstract buildArrayContains(\n        field: Expression<unknown>,\n        value: Expression<unknown>,\n        elemType?: string,\n    ): AliasableExpression<SqlBool>;\n\n    /**\n     * Builds an expression that checks if an array contains all values from another array.\n     */\n    abstract buildArrayHasEvery(field: Expression<unknown>, values: Expression<unknown>): AliasableExpression<SqlBool>;\n\n    /**\n     * Builds an expression that checks if an array overlaps with another array.\n     */\n    abstract buildArrayHasSome(field: Expression<unknown>, values: Expression<unknown>): AliasableExpression<SqlBool>;\n\n    /**\n     * Casts the given expression to an integer type.\n     */\n    abstract castInt<T extends Expression<any>>(expression: T): T;\n\n    /**\n     * Casts the given expression to a text type.\n     */\n    abstract castText<T extends Expression<any>>(expression: T): T;\n\n    /**\n     * Trims double quotes from the start and end of a text expression.\n     */\n    abstract trimTextQuotes<T extends Expression<string>>(expression: T): T;\n\n    /*\n     * Gets the string casing behavior for the dialect.\n     */\n    abstract getStringCasingBehavior(): { supportsILike: boolean; likeCaseSensitive: boolean };\n\n    /**\n     * Builds a VALUES table and select all fields from it.\n     */\n    abstract buildValuesTableSelect(fields: FieldDef[], rows: unknown[][]): SelectQueryBuilder<any, any, any>;\n\n    /**\n     * Builds a binary comparison expression between two operands.\n     */\n    buildComparison(\n        left: Expression<unknown>,\n        _leftFieldDef: FieldDef | undefined,\n        op: string,\n        right: Expression<unknown>,\n        _rightFieldDef: FieldDef | undefined,\n    ): Expression<SqlBool> {\n        return this.eb(left, op as any, right) as Expression<SqlBool>;\n    }\n\n    /**\n     * Builds a JSON path selection expression.\n     */\n    protected abstract buildJsonPathSelection(receiver: Expression<any>, path: string | undefined): Expression<any>;\n\n    /**\n     * Builds a JSON array filter expression.\n     */\n    protected abstract buildJsonArrayFilter(\n        receiver: Expression<any>,\n        operation: 'array_contains' | 'array_starts_with' | 'array_ends_with',\n        value: unknown,\n    ): Expression<SqlBool>;\n\n    /**\n     * Builds a JSON array exists predicate (returning if any element matches the filter).\n     */\n    protected abstract buildJsonArrayExistsPredicate(\n        receiver: Expression<any>,\n        buildFilter: (elem: Expression<any>) => Expression<SqlBool>,\n    ): Expression<SqlBool>;\n\n    /**\n     * Builds an ORDER BY clause for a field with NULLS FIRST/LAST support.\n     */\n    protected abstract buildOrderByField(\n        query: SelectQueryBuilder<any, any, any>,\n        field: Expression<unknown>,\n        sort: SortOrder,\n        nulls: 'first' | 'last',\n    ): SelectQueryBuilder<any, any, any>;\n\n    /**\n     * Builds a fuzzy search filter for a string field using PostgreSQL `pg_trgm`.\n     * The selected SQL form (operator vs. function, with/without `unaccent`) depends\n     * on the resolved options.\n     */\n    abstract buildFuzzyFilter(fieldRef: Expression<any>, options: FuzzyFilterOptions): Expression<SqlBool>;\n\n    /**\n     * Builds an ORDER BY clause that sorts by fuzzy relevance to a search term.\n     */\n    abstract buildFuzzyRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        fieldRefs: Expression<any>[],\n        search: string,\n        sort: SortOrder,\n        mode: FuzzyFilterOptions['mode'],\n        unaccent: boolean,\n    ): SelectQueryBuilder<any, any, any>;\n\n    /**\n     * Validate the user-provided fuzzy filter payload and apply defaults so dialects\n     * always receive a fully-resolved {@link FuzzyFilterOptions} value.\n     */\n    protected normalizeFuzzyOptions(value: unknown): FuzzyFilterOptions {\n        invariant(\n            value !== null && typeof value === 'object' && !Array.isArray(value),\n            'fuzzy filter must be an object with at least a \"search\" field',\n        );\n        const raw = value as Record<string, unknown>;\n        invariant(\n            typeof raw['search'] === 'string' && raw['search'].length > 0,\n            'fuzzy.search must be a non-empty string',\n        );\n        const mode = raw['mode'] ?? 'simple';\n        invariant(\n            mode === 'simple' || mode === 'word' || mode === 'strictWord',\n            'fuzzy.mode must be \"simple\", \"word\" or \"strictWord\"',\n        );\n        const threshold = raw['threshold'];\n        if (threshold !== undefined) {\n            invariant(\n                typeof threshold === 'number' && threshold >= 0 && threshold <= 1,\n                'fuzzy.threshold must be a number between 0 and 1',\n            );\n        }\n        const unaccent = raw['unaccent'] ?? false;\n        invariant(typeof unaccent === 'boolean', 'fuzzy.unaccent must be a boolean');\n        return {\n            search: raw['search'],\n            mode: mode as FuzzyFilterOptions['mode'],\n            threshold: threshold as number | undefined,\n            unaccent,\n        };\n    }\n\n    /**\n     * Builds a full-text-search filter for a string field. Receives the raw\n     * user-supplied filter payload — dialects validate/normalize it themselves\n     * (the shape is provider-specific; only Postgres supports this filter).\n     */\n    abstract buildFullTextFilter(fieldRef: Expression<any>, payload: unknown): Expression<SqlBool>;\n\n    /**\n     * Builds an ORDER BY clause that sorts by full-text-search relevance to a search term.\n     */\n    abstract buildFtsRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        fieldRefs: Expression<any>[],\n        search: string,\n        config: string | undefined,\n        sort: SortOrder,\n    ): SelectQueryBuilder<any, any, any>;\n\n    // #endregion\n}\n\n/**\n * Resolved options for a fuzzy filter passed to a dialect. `mode` and `unaccent`\n * are always populated (defaults: `mode='simple'`, `unaccent=false`, applied by\n * `normalizeFuzzyOptions`); `threshold` is optional and switches the SQL from\n * operator form (`%`, `<%`, `<<%`) to function form (`similarity() > threshold`).\n */\nexport type FuzzyFilterOptions = {\n    search: string;\n    mode: 'simple' | 'word' | 'strictWord';\n    threshold?: number;\n    unaccent: boolean;\n};\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { FieldDef, GetModels, SchemaDef } from '@zenstackhq/schema';\nimport { type AliasableExpression, type Expression, type ExpressionBuilder, type SelectQueryBuilder } from 'kysely';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs, NullsOrder, SortOrder } from '../../crud-types';\nimport {\n    buildJoinPairs,\n    ensureArray,\n    getDelegateDescendantModels,\n    getManyToManyRelation,\n    isRelationField,\n    requireField,\n    requireIdFields,\n    requireModel,\n    tmpAlias,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\n\n/**\n * Base class for dialects that support lateral joins (MySQL and PostgreSQL).\n * Contains common logic for building relation selections using lateral joins and JSON aggregation.\n */\nexport abstract class LateralJoinDialectBase<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n    /**\n     * Builds an array aggregation expression.\n     */\n    protected abstract buildArrayAgg(\n        arg: Expression<any>,\n        orderBy?: { expr: Expression<any>; sort: SortOrder; nulls?: NullsOrder }[],\n    ): AliasableExpression<any>;\n\n    override buildRelationSelection(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        relationField: string,\n        parentAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ): SelectQueryBuilder<any, any, any> {\n        const relationResultName = tmpAlias(`${parentAlias}$${relationField}`);\n        const joinedQuery = this.buildRelationJSON(\n            model,\n            query,\n            relationField,\n            parentAlias,\n            payload,\n            relationResultName,\n        );\n        return joinedQuery.select(`${relationResultName}.$data as ${relationField}`);\n    }\n\n    private buildRelationJSON(\n        model: string,\n        qb: SelectQueryBuilder<any, any, any>,\n        relationField: string,\n        parentAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n        resultName: string,\n    ) {\n        const relationFieldDef = requireField(this.schema, model, relationField);\n        const relationModel = relationFieldDef.type as GetModels<Schema>;\n\n        return qb.leftJoinLateral(\n            (eb) => {\n                const relationSelectName = tmpAlias(`${resultName}$sub`);\n                const relationModelDef = requireModel(this.schema, relationModel);\n\n                let tbl: SelectQueryBuilder<any, any, any>;\n\n                if (this.canJoinWithoutNestedSelect(relationModelDef, payload)) {\n                    // build join directly\n                    tbl = this.buildModelSelect(relationModel, relationSelectName, payload, false);\n\n                    // parent join filter\n                    tbl = this.buildRelationJoinFilter(\n                        tbl,\n                        model,\n                        relationField,\n                        relationModel,\n                        relationSelectName,\n                        parentAlias,\n                    );\n                } else {\n                    // join with a nested query\n                    tbl = eb.selectFrom(() => {\n                        let subQuery = this.buildModelSelect(relationModel, `${relationSelectName}$t`, payload, true);\n\n                        // parent join filter\n                        subQuery = this.buildRelationJoinFilter(\n                            subQuery,\n                            model,\n                            relationField,\n                            relationModel,\n                            `${relationSelectName}$t`,\n                            parentAlias,\n                        );\n\n                        if (typeof payload !== 'object' || payload.take === undefined) {\n                            // force adding a limit otherwise the ordering is ignored by some databases\n                            // during JSON array aggregation\n                            subQuery = subQuery.limit(Number.MAX_SAFE_INTEGER);\n                        }\n\n                        return subQuery.as(relationSelectName);\n                    });\n                }\n\n                // select relation result\n                tbl = this.buildRelationObjectSelect(\n                    relationModel,\n                    relationSelectName,\n                    relationFieldDef,\n                    tbl,\n                    payload,\n                    resultName,\n                );\n\n                // add nested joins for each relation\n                tbl = this.buildRelationJoins(tbl, relationModel, relationSelectName, payload, resultName);\n\n                // alias the join table\n                return tbl.as(resultName);\n            },\n            (join) => join.onTrue(),\n        );\n    }\n\n    private buildRelationJoinFilter(\n        query: SelectQueryBuilder<any, any, {}>,\n        model: string,\n        relationField: string,\n        relationModel: GetModels<Schema>,\n        relationModelAlias: string,\n        parentAlias: string,\n    ) {\n        const m2m = getManyToManyRelation(this.schema, model, relationField);\n        if (m2m) {\n            // many-to-many relation\n            const parentIds = requireIdFields(this.schema, model);\n            const relationIds = requireIdFields(this.schema, relationModel);\n            invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n            invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n            query = query.where((eb) =>\n                eb(\n                    eb.ref(`${relationModelAlias}.${relationIds[0]}`),\n                    'in',\n                    eb\n                        .selectFrom(m2m.joinTable)\n                        .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n                        .whereRef(`${parentAlias}.${parentIds[0]}`, '=', `${m2m.joinTable}.${m2m.parentFkName}`),\n                ),\n            );\n        } else {\n            const joinPairs = buildJoinPairs(this.schema, model, parentAlias, relationField, relationModelAlias);\n            query = query.where((eb) =>\n                this.and(...joinPairs.map(([left, right]) => eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n            );\n        }\n        return query;\n    }\n\n    private buildRelationObjectSelect(\n        relationModel: string,\n        relationModelAlias: string,\n        relationFieldDef: FieldDef,\n        qb: SelectQueryBuilder<any, any, any>,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n        parentResultName: string,\n    ) {\n        qb = qb.select((eb) => {\n            const objArgs = this.buildRelationObjectArgs(\n                relationModel,\n                relationModelAlias,\n                eb,\n                payload,\n                parentResultName,\n            );\n\n            if (relationFieldDef.array) {\n                const orderBy = this.buildRelationOrderByExpressions(relationModel, relationModelAlias, payload);\n                return this.buildArrayAgg(this.buildJsonObject(objArgs), orderBy).as('$data');\n            } else {\n                return this.buildJsonObject(objArgs).as('$data');\n            }\n        });\n\n        return qb;\n    }\n\n    /**\n     * Extracts scalar `orderBy` clauses from the relation payload and maps them to\n     * the array-aggregation ordering format.\n     *\n     * For to-many relations aggregated into a JSON array (via lateral joins), this\n     * lets us preserve a stable ordering by passing `{ expr, sort, nulls? }` into\n     * the dialect's `buildArrayAgg` implementation.\n     */\n    private buildRelationOrderByExpressions(\n        model: string,\n        modelAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ): { expr: Expression<any>; sort: SortOrder; nulls?: NullsOrder }[] | undefined {\n        if (payload === true || !payload.orderBy) {\n            return undefined;\n        }\n\n        type ScalarSortValue = SortOrder | { sort: SortOrder; nulls?: NullsOrder };\n        const items: { expr: Expression<any>; sort: SortOrder; nulls?: NullsOrder }[] = [];\n\n        for (const orderBy of ensureArray(payload.orderBy)) {\n            for (const [field, value] of Object.entries(orderBy) as [string, ScalarSortValue | undefined][]) {\n                if (!value || requireField(this.schema, model, field).relation) {\n                    continue;\n                }\n\n                const expr = this.fieldRef(model, field, modelAlias);\n                let sort = typeof value === 'string' ? value : value.sort;\n                if (payload.take !== undefined && payload.take < 0) {\n                    // negative `take` requires negated sorting, and the result order\n                    // will be corrected during post-read processing\n                    sort = this.negateSort(sort, true);\n                }\n                if (typeof value === 'string') {\n                    items.push({ expr, sort });\n                } else {\n                    items.push({ expr, sort, nulls: value.nulls });\n                }\n            }\n        }\n\n        return items.length > 0 ? items : undefined;\n    }\n\n    private buildRelationObjectArgs(\n        relationModel: string,\n        relationModelAlias: string,\n        eb: ExpressionBuilder<any, any>,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n        parentResultName: string,\n    ) {\n        const relationModelDef = requireModel(this.schema, relationModel);\n        const objArgs: Record<string, Expression<unknown>> = {};\n\n        const descendantModels = getDelegateDescendantModels(this.schema, relationModel);\n        if (descendantModels.length > 0) {\n            // select all JSONs built from delegate descendants\n            Object.assign(\n                objArgs,\n                ...descendantModels.map((subModel) => ({\n                    [`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`]: eb.ref(\n                        `${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`,\n                    ),\n                })),\n            );\n        }\n\n        if (payload === true || !payload.select) {\n            // select all scalar fields except for omitted\n            const omit = typeof payload === 'object' ? payload.omit : undefined;\n\n            Object.assign(\n                objArgs,\n                ...Object.entries(relationModelDef.fields)\n                    .filter(([, value]) => !value.relation)\n                    .filter(([name]) => !this.shouldOmitField(omit, relationModel, name))\n                    .map(([field]) => ({\n                        [field]: this.fieldRef(relationModel, field, relationModelAlias, false),\n                    })),\n            );\n        } else if (payload.select) {\n            // select specific fields\n            Object.assign(\n                objArgs,\n                ...Object.entries<any>(payload.select)\n                    .filter(([, value]) => value)\n                    .map(([field, value]) => {\n                        if (field === '_count') {\n                            const subJson = this.buildCountJson(\n                                relationModel as GetModels<Schema>,\n                                eb,\n                                relationModelAlias,\n                                value,\n                            );\n                            return { [field]: subJson };\n                        } else {\n                            const fieldDef = requireField(this.schema, relationModel, field);\n                            const fieldValue = fieldDef.relation\n                                ? // reference the synthesized JSON field\n                                  eb.ref(`${parentResultName}$${field}.$data`)\n                                : // reference a plain field\n                                  this.fieldRef(relationModel, field, relationModelAlias, false);\n                            return { [field]: fieldValue };\n                        }\n                    }),\n            );\n        }\n\n        if (typeof payload === 'object' && (payload as any).include && typeof (payload as any).include === 'object') {\n            // include relation fields\n\n            Object.assign(\n                objArgs,\n                ...Object.entries<any>((payload as any).include)\n                    .filter(([, value]) => value)\n                    .map(([field, value]) => {\n                        if (field === '_count') {\n                            return {\n                                [field]: this.buildCountJson(\n                                    relationModel as GetModels<Schema>,\n                                    eb,\n                                    relationModelAlias,\n                                    value,\n                                ),\n                            };\n                        }\n                        return { [field]: eb.ref(`${parentResultName}$${field}.$data`) };\n                    }),\n            );\n        }\n\n        return objArgs;\n    }\n\n    private buildRelationJoins(\n        query: SelectQueryBuilder<any, any, any>,\n        relationModel: string,\n        relationModelAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n        parentResultName: string,\n    ) {\n        let result = query;\n        if (typeof payload === 'object') {\n            const selectInclude = (payload as any).include ?? payload.select;\n            if (selectInclude && typeof selectInclude === 'object') {\n                Object.entries<any>(selectInclude)\n                    .filter(([, value]) => value)\n                    .filter(([field]) => isRelationField(this.schema, relationModel, field))\n                    .forEach(([field, value]) => {\n                        result = this.buildRelationJSON(\n                            relationModel,\n                            result,\n                            field,\n                            relationModelAlias,\n                            value,\n                            `${parentResultName}$${field}`,\n                        );\n                    });\n            }\n        }\n        return result;\n    }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { BuiltinType, FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport Decimal from 'decimal.js';\nimport type { AliasableExpression, TableExpression } from 'kysely';\nimport {\n    expressionBuilder,\n    ExpressionWrapper,\n    sql,\n    ValueListNode,\n    type Expression,\n    type SelectQueryBuilder,\n    type SqlBool,\n} from 'kysely';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { NullsOrder, SortOrder } from '../../crud-types';\nimport { createInvalidInputError, createNotSupportedError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport { isTypeDef } from '../../query-utils';\nimport type { FuzzyFilterOptions } from './base-dialect';\nimport { LateralJoinDialectBase } from './lateral-join-dialect-base';\n\nexport class MySqlCrudDialect<Schema extends SchemaDef> extends LateralJoinDialectBase<Schema> {\n    constructor(schema: Schema, options: ClientOptions<Schema>) {\n        super(schema, options);\n    }\n\n    override get provider() {\n        return 'mysql' as const;\n    }\n\n    // #region capabilities\n\n    override get supportsUpdateWithLimit(): boolean {\n        return true;\n    }\n\n    override get supportsDeleteWithLimit(): boolean {\n        return true;\n    }\n\n    override get supportsDistinctOn(): boolean {\n        return false;\n    }\n\n    override get supportsReturning(): boolean {\n        return false;\n    }\n\n    override get supportsInsertDefaultValues(): boolean {\n        return false;\n    }\n\n    override get supportsDefaultAsFieldValue() {\n        return true;\n    }\n\n    override get insertIgnoreMethod() {\n        return 'ignore' as const;\n    }\n\n    // #endregion\n\n    // #region value transformation\n\n    override transformInput(value: unknown, type: BuiltinType, forArrayField: boolean): unknown {\n        if (value === undefined) {\n            return value;\n        }\n\n        // Handle special null classes for JSON fields\n        if (value instanceof JsonNullClass) {\n            return this.eb.cast(sql.lit('null'), 'json');\n        } else if (value instanceof DbNullClass) {\n            return null;\n        } else if (value instanceof AnyNullClass) {\n            invariant(false, 'should not reach here: AnyNull is not a valid input value');\n        }\n\n        if (isTypeDef(this.schema, type)) {\n            // type-def fields (regardless array or scalar) are stored as scalar `Json` and\n            // their input values need to be stringified if not already (i.e., provided in\n            // default values)\n            if (typeof value !== 'string') {\n                return this.transformInput(value, 'Json', forArrayField);\n            } else {\n                return value;\n            }\n        } else if (Array.isArray(value)) {\n            if (type === 'Json') {\n                // type-def arrays reach here\n                return JSON.stringify(value);\n            } else {\n                throw createNotSupportedError(`MySQL does not support array literals`);\n            }\n        } else {\n            switch (type) {\n                case 'Boolean':\n                    return value ? 1 : 0;\n                case 'DateTime':\n                    // MySQL DATETIME format: 'YYYY-MM-DD HH:MM:SS.mmm'\n                    if (value instanceof Date) {\n                        // force UTC\n                        return value.toISOString().replace('Z', '+00:00');\n                    } else if (typeof value === 'string') {\n                        // parse and force UTC\n                        return new Date(value).toISOString().replace('Z', '+00:00');\n                    } else {\n                        return value;\n                    }\n                case 'Decimal':\n                    return value !== null ? value.toString() : value;\n                case 'Json':\n                    return this.eb.cast(this.eb.val(JSON.stringify(value)), 'json');\n                case 'Bytes':\n                    return Buffer.isBuffer(value) ? value : value instanceof Uint8Array ? Buffer.from(value) : value;\n                default:\n                    return value;\n            }\n        }\n    }\n\n    override transformOutput(value: unknown, type: BuiltinType, array: boolean) {\n        if (value === null || value === undefined) {\n            return value;\n        }\n\n        switch (type) {\n            case 'Boolean':\n                return this.transformOutputBoolean(value);\n            case 'DateTime':\n                return this.transformOutputDate(value);\n            case 'Bytes':\n                return this.transformOutputBytes(value);\n            case 'BigInt':\n                return this.transformOutputBigInt(value);\n            case 'Decimal':\n                return this.transformDecimal(value);\n            default:\n                return super.transformOutput(value, type, array);\n        }\n    }\n\n    private transformOutputBoolean(value: unknown) {\n        return !!value;\n    }\n\n    private transformOutputBigInt(value: unknown) {\n        if (typeof value === 'bigint') {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number',\n            `Expected string or number, got ${typeof value}`,\n        );\n        return BigInt(value);\n    }\n\n    private transformDecimal(value: unknown) {\n        if (value instanceof Decimal) {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number' || value instanceof Decimal,\n            `Expected string, number or Decimal, got ${typeof value}`,\n        );\n        return new Decimal(value);\n    }\n\n    private transformOutputDate(value: unknown) {\n        if (typeof value !== 'string') {\n            return value;\n        }\n\n        // MySQL `TIME` columns return bare time strings (\"09:30:00\") that `new Date`\n        // can't parse on their own — anchor at the Unix epoch. Detect by shape rather\n        // than the schema attribute so the runtime stays decoupled from `@db.*`\n        // (which is migration/db-push only): TIME starts with `HH:`, DATE/DATETIME\n        // values always start with `YYYY-`.\n        const anchored = /^\\d{2}:/.test(value) ? `1970-01-01T${value}` : value;\n\n        // MySQL DateTime columns are returned as strings (non-ISO but parsable as JS Date),\n        // convert to ISO Date by appending 'Z' if not present\n        return new Date(!anchored.endsWith('Z') ? anchored + 'Z' : anchored);\n    }\n\n    private transformOutputBytes(value: unknown) {\n        return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\n    }\n\n    // #endregion\n\n    // #region other overrides\n\n    protected override buildExistsExpression(innerQuery: SelectQueryBuilder<any, any, any>): Expression<SqlBool> {\n        // MySQL doesn't allow referencing the target table of a DELETE/UPDATE in a subquery\n        // directly within the same statement. Wrapping in a derived table materializes the\n        // subquery, making it a separate virtual table that MySQL accepts.\n        return this.eb.exists(this.eb.selectFrom(innerQuery.as('$exists_sub')).select(this.eb.lit(1).as('_')));\n    }\n\n    protected buildArrayAgg(\n        arg: Expression<any>,\n        _orderBy?: { expr: Expression<any>; sort: SortOrder; nulls?: NullsOrder }[],\n    ): AliasableExpression<any> {\n        // MySQL doesn't support ORDER BY inside JSON_ARRAYAGG.\n        // For relation queries that need deterministic ordering, ordering is applied\n        // by the input subquery before aggregation.\n        return this.eb.fn.coalesce(sql`JSON_ARRAYAGG(${arg})`, sql`JSON_ARRAY()`);\n    }\n\n    override buildSkipTake(\n        query: SelectQueryBuilder<any, any, any>,\n        skip: number | undefined,\n        take: number | undefined,\n    ) {\n        if (take !== undefined) {\n            query = query.limit(take);\n        }\n        if (skip !== undefined) {\n            query = query.offset(skip);\n            if (take === undefined) {\n                // MySQL requires offset to be used with limit\n                query = query.limit(Number.MAX_SAFE_INTEGER);\n            }\n        }\n        return query;\n    }\n\n    override buildJsonObject(value: Record<string, Expression<unknown>>) {\n        return this.eb.fn(\n            'JSON_OBJECT',\n            Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n        );\n    }\n\n    override castInt<T extends Expression<any>>(expression: T): T {\n        return this.eb.cast(expression, sql.raw('unsigned')) as unknown as T;\n    }\n\n    override castText<T extends Expression<any>>(expression: T): T {\n        // Use utf8mb4 character set collation to match MySQL 8.0+ default and avoid\n        // collation conflicts when comparing with VALUES ROW columns\n        return sql`CAST(${expression} AS CHAR CHARACTER SET utf8mb4)` as unknown as T;\n    }\n\n    override trimTextQuotes<T extends Expression<string>>(expression: T): T {\n        return sql`TRIM(BOTH ${sql.lit('\"')} FROM ${expression})` as unknown as T;\n    }\n\n    override buildArrayLength(array: Expression<unknown>): AliasableExpression<number> {\n        return this.eb.fn('JSON_LENGTH', [array]);\n    }\n\n    override buildArrayValue(values: Expression<unknown>[], _elemType: string): AliasableExpression<unknown> {\n        return new ExpressionWrapper(ValueListNode.create(values.map((v) => v.toOperationNode())));\n    }\n\n    override buildArrayContains(\n        _field: Expression<unknown>,\n        _value: Expression<unknown>,\n        _elemType?: string,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('MySQL does not support native array operations');\n    }\n\n    override buildArrayHasEvery(\n        _field: Expression<unknown>,\n        _values: Expression<unknown>,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('MySQL does not support native array operations');\n    }\n\n    override buildArrayHasSome(\n        _field: Expression<unknown>,\n        _values: Expression<unknown>,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('MySQL does not support native array operations');\n    }\n\n    protected override buildJsonEqualityFilter(\n        lhs: Expression<any>,\n        rhs: unknown,\n    ): ExpressionWrapper<any, any, SqlBool> {\n        // MySQL's JSON equality comparison is key-order sensitive, use bi-directional JSON_CONTAINS\n        // instead to achieve key-order insensitive comparison\n        return this.eb.and([\n            this.eb.fn('JSON_CONTAINS', [lhs, this.eb.val(JSON.stringify(rhs))]),\n            this.eb.fn('JSON_CONTAINS', [this.eb.val(JSON.stringify(rhs)), lhs]),\n        ]);\n    }\n\n    protected override buildJsonPathSelection(receiver: Expression<any>, path: string | undefined) {\n        if (path) {\n            return this.eb.fn('JSON_EXTRACT', [receiver, this.eb.val(path)]);\n        } else {\n            return receiver;\n        }\n    }\n\n    protected override buildJsonArrayFilter(\n        lhs: Expression<any>,\n        operation: 'array_contains' | 'array_starts_with' | 'array_ends_with',\n        value: unknown,\n    ) {\n        switch (operation) {\n            case 'array_contains': {\n                const v = Array.isArray(value) ? value : [value];\n                return sql<SqlBool>`JSON_CONTAINS(${lhs}, ${sql.val(JSON.stringify(v))})`;\n            }\n\n            case 'array_starts_with': {\n                return this.eb(\n                    this.eb.fn('JSON_EXTRACT', [lhs, this.eb.val('$[0]')]),\n                    '=',\n                    this.transformInput(value, 'Json', false),\n                );\n            }\n\n            case 'array_ends_with': {\n                return this.eb(\n                    sql`JSON_EXTRACT(${lhs}, CONCAT('$[', JSON_LENGTH(${lhs}) - 1, ']'))`,\n                    '=',\n                    this.transformInput(value, 'Json', false),\n                );\n            }\n\n            default:\n                throw createInvalidInputError(`Unsupported array filter operation: ${operation}`);\n        }\n    }\n\n    protected override buildJsonArrayExistsPredicate(\n        receiver: Expression<any>,\n        buildFilter: (elem: Expression<any>) => Expression<SqlBool>,\n    ) {\n        // MySQL doesn't have a direct json_array_elements, we need to use JSON_TABLE or a different approach\n        // For simplicity, we'll use EXISTS with a subquery that unnests the JSON array\n        return this.eb.exists(\n            this.eb\n                .selectFrom(sql`JSON_TABLE(${receiver}, '$[*]' COLUMNS(value JSON PATH '$'))`.as('$items'))\n                .select(this.eb.lit(1).as('_'))\n                .where(buildFilter(this.eb.ref('$items.value'))),\n        );\n    }\n\n    override getStringCasingBehavior() {\n        // MySQL LIKE is case-insensitive by default (depends on collation), no ILIKE support\n        return { supportsILike: false, likeCaseSensitive: false };\n    }\n\n    override buildValuesTableSelect(fields: FieldDef[], rows: unknown[][]) {\n        const cols = rows[0]?.length ?? 0;\n\n        if (fields.length !== cols) {\n            throw createInvalidInputError('Number of fields must match number of columns in each row');\n        }\n\n        // check all rows have the same length\n        for (const row of rows) {\n            if (row.length !== cols) {\n                throw createInvalidInputError('All rows must have the same number of columns');\n            }\n        }\n\n        // build final alias name as `$values(f1, f2, ...)`\n        const aliasWithColumns = `$values(${fields.map((f) => f.name).join(', ')})`;\n\n        const eb = expressionBuilder<any, any>();\n\n        return eb\n            .selectFrom(\n                sql`(VALUES ${sql.join(\n                    rows.map((row) => sql`ROW(${sql.join(row.map((v) => sql.val(v)))})`),\n                    sql.raw(', '),\n                )}) as ${sql.raw(aliasWithColumns)}` as unknown as TableExpression<any, any>,\n            )\n            .selectAll();\n    }\n\n    protected override buildOrderByField(\n        query: SelectQueryBuilder<any, any, any>,\n        field: Expression<unknown>,\n        sort: SortOrder,\n        nulls: 'first' | 'last',\n    ) {\n        let result = query;\n        if (nulls === 'first') {\n            // NULLS FIRST: order by IS NULL DESC (nulls=1 first), then the actual field\n            result = result.orderBy(sql`${field} IS NULL`, 'desc');\n            result = result.orderBy(field, sort);\n        } else {\n            // NULLS LAST: order by IS NULL ASC (nulls=0 last), then the actual field\n            result = result.orderBy(sql`${field} IS NULL`, 'asc');\n            result = result.orderBy(field, sort);\n        }\n        return result;\n    }\n\n    // #endregion\n\n    // #region fuzzy search\n\n    override buildFuzzyFilter(_fieldRef: Expression<any>, _options: FuzzyFilterOptions): Expression<SqlBool> {\n        throw createNotSupportedError('\"fuzzy\" filter is not supported by the \"mysql\" provider');\n    }\n\n    override buildFuzzyRelevanceOrderBy(\n        _query: SelectQueryBuilder<any, any, any>,\n        _fieldRefs: Expression<any>[],\n        _search: string,\n        _sort: SortOrder,\n        _mode: FuzzyFilterOptions['mode'],\n        _unaccent: boolean,\n    ): SelectQueryBuilder<any, any, any> {\n        throw createNotSupportedError('\"_fuzzyRelevance\" ordering is not supported by the \"mysql\" provider');\n    }\n\n    // #endregion\n\n    // #region full-text search\n\n    override buildFullTextFilter(_fieldRef: Expression<any>, _payload: unknown): Expression<SqlBool> {\n        throw createNotSupportedError('\"fts\" filter is not supported by the \"mysql\" provider');\n    }\n\n    override buildFtsRelevanceOrderBy(\n        _query: SelectQueryBuilder<any, any, any>,\n        _fieldRefs: Expression<any>[],\n        _search: string,\n        _config: string | undefined,\n        _sort: SortOrder,\n    ): SelectQueryBuilder<any, any, any> {\n        throw createNotSupportedError('\"_ftsRelevance\" ordering is not supported by the \"mysql\" provider');\n    }\n\n    // #endregion\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { BuiltinType, FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport Decimal from 'decimal.js';\nimport {\n    expressionBuilder,\n    sql,\n    type AliasableExpression,\n    type Expression,\n    type SelectQueryBuilder,\n    type SqlBool,\n} from 'kysely';\nimport { parse as parsePostgresArray } from 'postgres-array';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { NullsOrder, SortOrder } from '../../crud-types';\nimport { createInvalidInputError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport { isEnum, isTypeDef } from '../../query-utils';\nimport type { FuzzyFilterOptions } from './base-dialect';\nimport { LateralJoinDialectBase } from './lateral-join-dialect-base';\n\n/**\n * Formats a JS `Date` as a Postgres TIME / TIMETZ literal (`HH:MM:SS.fff`,\n * optionally with `+ZZ:ZZ` for TIMETZ). Reads UTC components so the value\n * round-trips with ISO-input parsing — callers anchor time-only inputs to\n * the Unix epoch.\n */\nfunction formatTimeOfDay(date: Date, withTimezone: boolean): string {\n    const pad = (n: number, w = 2) => String(n).padStart(w, '0');\n    const time = `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}.${pad(date.getUTCMilliseconds(), 3)}`;\n    return withTimezone ? `${time}+00:00` : time;\n}\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends LateralJoinDialectBase<Schema> {\n    private static typeParserOverrideApplied = false;\n\n    private readonly zmodelToSqlTypeMap: Record<string, string> = {\n        String: 'text',\n        Boolean: 'boolean',\n        Int: 'integer',\n        BigInt: 'bigint',\n        Float: 'double precision',\n        Decimal: 'decimal',\n        DateTime: 'timestamp',\n        Bytes: 'bytea',\n        Json: 'jsonb',\n    };\n\n    // Maps @db.* attribute names to PostgreSQL SQL types for use in VALUES table casts\n    private static readonly dbAttributeToSqlTypeMap: Record<string, string> = {\n        '@db.Uuid': 'uuid',\n        '@db.Citext': 'citext',\n        '@db.Inet': 'inet',\n        '@db.Bit': 'bit',\n        '@db.VarBit': 'varbit',\n        '@db.Xml': 'xml',\n        '@db.Json': 'json',\n        '@db.JsonB': 'jsonb',\n        '@db.ByteA': 'bytea',\n        '@db.Text': 'text',\n        '@db.Char': 'bpchar',\n        '@db.VarChar': 'varchar',\n        '@db.Date': 'date',\n        '@db.Time': 'time',\n        '@db.Timetz': 'timetz',\n        '@db.Timestamp': 'timestamp',\n        '@db.Timestamptz': 'timestamptz',\n        '@db.SmallInt': 'smallint',\n        '@db.Integer': 'integer',\n        '@db.BigInt': 'bigint',\n        '@db.Real': 'real',\n        '@db.DoublePrecision': 'double precision',\n        '@db.Decimal': 'decimal',\n        '@db.Boolean': 'boolean',\n    };\n\n    constructor(schema: Schema, options: ClientOptions<Schema>) {\n        super(schema, options);\n        this.overrideTypeParsers();\n    }\n\n    override get provider() {\n        return 'postgresql' as const;\n    }\n\n    private overrideTypeParsers() {\n        if (this.options.fixPostgresTimezone !== false && !PostgresCrudDialect.typeParserOverrideApplied) {\n            PostgresCrudDialect.typeParserOverrideApplied = true;\n\n            const fixTimezone = (value: unknown) => {\n                if (typeof value !== 'string') {\n                    return value;\n                }\n                if (!this.hasTimezoneOffset(value)) {\n                    // force UTC if no offset\n                    value += 'Z';\n                }\n                const result = new Date(value);\n                return isNaN(result.getTime())\n                    ? value // fallback to original value if parsing fails\n                    : result;\n            };\n\n            // override node-pg's default type parser to resolve the timezone handling issue\n            // with \"TIMESTAMP WITHOUT TIME ZONE\" fields\n            // https://github.com/brianc/node-postgres/issues/429\n            import(/* webpackIgnore: true */ 'pg') // suppress bundler analysis warnings\n                .then((pg) => {\n                    // timestamp\n                    pg.types.setTypeParser(pg.types.builtins.TIMESTAMP, fixTimezone);\n                    // timestamp array\n                    pg.types.setTypeParser(1115, (value) => {\n                        if (typeof value !== 'string') {\n                            return value;\n                        }\n                        try {\n                            const arr = parsePostgresArray(value);\n                            return arr.map(fixTimezone);\n                        } catch {\n                            // fallback to original value if parsing fails\n                            return value;\n                        }\n                    });\n                    // date\n                    pg.types.setTypeParser(\n                        pg.types.builtins.DATE,\n                        // append time and UTC offset to force a valid UTC date time\n                        (v) => new Date(`${v}T00:00:00Z`),\n                    );\n                })\n                .catch(() => {\n                    // ignore\n                });\n        }\n    }\n\n    // #region capabilities\n\n    override get supportsUpdateWithLimit(): boolean {\n        return false;\n    }\n\n    override get supportsDeleteWithLimit(): boolean {\n        return false;\n    }\n\n    override get supportsDistinctOn(): boolean {\n        return true;\n    }\n\n    override get supportsReturning(): boolean {\n        return true;\n    }\n\n    override get supportsDefaultAsFieldValue() {\n        return true;\n    }\n\n    override get supportsInsertDefaultValues(): boolean {\n        return true;\n    }\n\n    override get insertIgnoreMethod() {\n        return 'onConflict' as const;\n    }\n\n    // #endregion\n\n    // #region value transformation\n\n    override transformInput(value: unknown, type: BuiltinType, forArrayField: boolean, fieldDef?: FieldDef): unknown {\n        if (value === undefined) {\n            return value;\n        }\n\n        // Handle special null classes for JSON fields\n        if (value instanceof JsonNullClass) {\n            return 'null';\n        } else if (value instanceof DbNullClass) {\n            return null;\n        } else if (value instanceof AnyNullClass) {\n            invariant(false, 'should not reach here: AnyNull is not a valid input value');\n        }\n\n        // node-pg incorrectly handles array values passed to non-array JSON fields,\n        // the workaround is to JSON stringify the value\n        // https://github.com/brianc/node-postgres/issues/374\n\n        if (isTypeDef(this.schema, type)) {\n            // type-def fields (regardless array or scalar) are stored as scalar `Json` and\n            // their input values need to be stringified if not already (i.e., provided in\n            // default values)\n            if (typeof value !== 'string') {\n                return JSON.stringify(value);\n            } else {\n                return value;\n            }\n        } else if (Array.isArray(value)) {\n            if (type === 'Json' && !forArrayField) {\n                // scalar `Json` fields need their input stringified\n                return JSON.stringify(value);\n            } else {\n                return value.map((v) => this.transformInput(v, type, false, fieldDef));\n            }\n        } else {\n            switch (type) {\n                case 'DateTime': {\n                    const date = value instanceof Date ? value : typeof value === 'string' ? new Date(value) : null;\n                    if (date === null || isNaN(date.getTime())) return value;\n                    // Postgres TIME / TIMETZ columns reject ISO datetime input —\n                    // they expect `HH:MM:SS[.fff][+ZZ:ZZ]`. Detect those native\n                    // types via the field's @db.* attribute and format\n                    // accordingly. All other DateTime fields keep the existing\n                    // ISO behaviour (TIMESTAMP / TIMESTAMPTZ / DATE all accept\n                    // it natively).\n                    const dbAttrName = fieldDef?.attributes?.find((a) => a.name.startsWith('@db.'))?.name;\n                    if (dbAttrName === '@db.Time' || dbAttrName === '@db.Timetz') {\n                        return formatTimeOfDay(date, dbAttrName === '@db.Timetz');\n                    }\n                    return date.toISOString();\n                }\n                case 'Decimal':\n                    return value !== null ? value.toString() : value;\n                case 'Json':\n                    if (\n                        value === null ||\n                        typeof value === 'string' ||\n                        typeof value === 'number' ||\n                        typeof value === 'boolean'\n                    ) {\n                        // postgres requires simple JSON values to be stringified\n                        return JSON.stringify(value);\n                    } else {\n                        return value;\n                    }\n                default:\n                    return value;\n            }\n        }\n    }\n\n    override transformOutput(value: unknown, type: BuiltinType, array: boolean) {\n        if (value === null || value === undefined) {\n            return value;\n        }\n\n        switch (type) {\n            case 'DateTime':\n                return this.transformOutputDate(value);\n            case 'Bytes':\n                return this.transformOutputBytes(value);\n            case 'BigInt':\n                return this.transformOutputBigInt(value);\n            case 'Decimal':\n                return this.transformDecimal(value);\n            default:\n                if (isEnum(this.schema, type)) {\n                    return this.transformOutputEnum(value, array);\n                } else {\n                    return super.transformOutput(value, type, array);\n                }\n        }\n    }\n\n    private transformOutputBigInt(value: unknown) {\n        if (typeof value === 'bigint') {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number',\n            `Expected string or number, got ${typeof value}`,\n        );\n        return BigInt(value);\n    }\n\n    private transformDecimal(value: unknown) {\n        if (value instanceof Decimal) {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number' || value instanceof Decimal,\n            `Expected string, number or Decimal, got ${typeof value}`,\n        );\n        return new Decimal(value);\n    }\n\n    private transformOutputDate(value: unknown) {\n        if (typeof value !== 'string') {\n            return value;\n        }\n\n        // PG `time` / `timetz` values come back as bare time strings (\"09:30:00\" or\n        // \"09:30:00+00\") that `new Date` can't parse on their own — anchor at the\n        // Unix epoch and expand `timetz`'s minute-less offset (`+HH` -> `+HH:00`).\n        // Detect by shape rather than the schema attribute so the runtime stays\n        // decoupled from `@db.*` (which is migration/db-push only): time-only\n        // values start with `HH:`, anything date-bearing starts with `YYYY-`.\n        const isTimeOnly = /^\\d{2}:/.test(value);\n        const anchored = isTimeOnly ? `1970-01-01T${value}`.replace(/([+-]\\d{2})$/, '$1:00') : value;\n\n        // PostgreSQL's jsonb_build_object serializes timestamp as ISO 8601 strings,\n        // we force interpret them as UTC dates here if the value does not carry timezone\n        // offset (this happens with \"TIMESTAMP WITHOUT TIME ZONE\" field type)\n        const normalized = this.hasTimezoneOffset(anchored) ? anchored : `${anchored}Z`;\n        const parsed = new Date(normalized);\n        return Number.isNaN(parsed.getTime())\n            ? value // fallback to original value if parsing fails\n            : parsed;\n    }\n\n    private hasTimezoneOffset(value: string) {\n        return value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value);\n    }\n\n    private transformOutputBytes(value: unknown) {\n        return Buffer.isBuffer(value)\n            ? Uint8Array.from(value)\n            : // node-pg encode bytea as hex string prefixed with \\x when embedded in JSON\n              typeof value === 'string' && value.startsWith('\\\\x')\n              ? Uint8Array.from(Buffer.from(value.slice(2), 'hex'))\n              : value;\n    }\n\n    private transformOutputEnum(value: unknown, array: boolean) {\n        if (array && typeof value === 'string') {\n            try {\n                // postgres returns enum arrays as `{\"val 1\",val2}` strings, parse them back\n                // to string arrays here\n                return parsePostgresArray(value);\n            } catch {\n                // fall through - return as-is if parsing fails\n            }\n        }\n        return value;\n    }\n\n    // #endregion\n\n    // #region other overrides\n\n    protected buildArrayAgg(\n        arg: Expression<any>,\n        orderBy?: { expr: Expression<any>; sort: SortOrder; nulls?: NullsOrder }[],\n    ) {\n        if (!orderBy || orderBy.length === 0) {\n            return this.eb.fn.coalesce(sql`jsonb_agg(${arg})`, sql`'[]'::jsonb`);\n        }\n\n        const orderBySql = sql.join(\n            orderBy.map(({ expr, sort, nulls }) => {\n                const dir = sql.raw(sort.toUpperCase());\n                const nullsSql = nulls ? sql` NULLS ${sql.raw(nulls.toUpperCase())}` : sql``;\n                return sql`${expr} ${dir}${nullsSql}`;\n            }),\n            sql.raw(', '),\n        );\n\n        return this.eb.fn.coalesce(sql`jsonb_agg(${arg} ORDER BY ${orderBySql})`, sql`'[]'::jsonb`);\n    }\n\n    override buildSkipTake(\n        query: SelectQueryBuilder<any, any, any>,\n        skip: number | undefined,\n        take: number | undefined,\n    ) {\n        if (take !== undefined) {\n            query = query.limit(take);\n        }\n        if (skip !== undefined) {\n            query = query.offset(skip);\n        }\n        return query;\n    }\n\n    override buildJsonObject(value: Record<string, Expression<unknown>>) {\n        const entries = Object.entries(value);\n\n        // PostgreSQL's FUNC_MAX_ARGS limit is 100. jsonb_build_object takes key-value pairs,\n        // so at most 50 pairs (100 args) fit in one call. Split larger objects and merge with ||.\n        const MAX_PAIRS = 50;\n\n        const buildChunk = (chunk: [string, Expression<unknown>][]) =>\n            this.eb.fn(\n                'jsonb_build_object',\n                chunk.flatMap(([k, v]) => [sql.lit(k), v]),\n            );\n\n        if (entries.length <= MAX_PAIRS) {\n            return buildChunk(entries);\n        }\n\n        const chunks: Expression<unknown>[] = [];\n        for (let i = 0; i < entries.length; i += MAX_PAIRS) {\n            chunks.push(buildChunk(entries.slice(i, i + MAX_PAIRS)));\n        }\n\n        return chunks.reduce((acc, chunk) => sql`${acc} || ${chunk}`) as AliasableExpression<unknown>;\n    }\n\n    override castInt<T extends Expression<any>>(expression: T): T {\n        return this.eb.cast(expression, 'integer') as unknown as T;\n    }\n\n    override castText<T extends Expression<any>>(expression: T): T {\n        return this.eb.cast(expression, 'text') as unknown as T;\n    }\n\n    override trimTextQuotes<T extends Expression<string>>(expression: T): T {\n        return this.eb.fn('trim', [expression, sql.lit('\"')]) as unknown as T;\n    }\n\n    override buildArrayLength(array: Expression<unknown>): AliasableExpression<number> {\n        return this.eb.fn('array_length', [array, sql.lit(1)]);\n    }\n\n    override buildArrayValue(values: Expression<unknown>[], elemType: string): AliasableExpression<unknown> {\n        const arr = sql`ARRAY[${sql.join(values, sql.raw(','))}]`;\n        const mappedType = this.getSqlType(elemType);\n        return this.eb.cast(arr, sql`${sql.raw(mappedType)}[]`);\n    }\n\n    override buildArrayContains(\n        field: Expression<unknown>,\n        value: Expression<unknown>,\n        elemType?: string,\n    ): AliasableExpression<SqlBool> {\n        // PostgreSQL @> operator expects array on both sides, so wrap single value in a typed array\n        const arrayExpr = sql`ARRAY[${value}]`;\n        if (elemType) {\n            const mappedType = this.getSqlType(elemType);\n            const typedArray = this.eb.cast(arrayExpr, sql`${sql.raw(mappedType)}[]`);\n            return this.eb(field, '@>', typedArray);\n        } else {\n            return this.eb(field, '@>', arrayExpr);\n        }\n    }\n\n    override buildArrayHasEvery(field: Expression<unknown>, values: Expression<unknown>): AliasableExpression<SqlBool> {\n        // PostgreSQL @> operator: field contains all elements in values\n        return this.eb(field, '@>', values);\n    }\n\n    override buildArrayHasSome(field: Expression<unknown>, values: Expression<unknown>): AliasableExpression<SqlBool> {\n        // PostgreSQL && operator: arrays have any elements in common\n        return this.eb(field, '&&', values);\n    }\n\n    protected override buildJsonPathSelection(receiver: Expression<any>, path: string | undefined) {\n        if (path) {\n            return this.eb.fn('jsonb_path_query_first', [receiver, this.eb.val(path)]);\n        } else {\n            return receiver;\n        }\n    }\n\n    protected override buildJsonArrayFilter(\n        lhs: Expression<any>,\n        operation: 'array_contains' | 'array_starts_with' | 'array_ends_with',\n        value: unknown,\n    ) {\n        switch (operation) {\n            case 'array_contains': {\n                const v = Array.isArray(value) ? value : [value];\n                return sql<SqlBool>`${lhs} @> ${sql.val(JSON.stringify(v))}::jsonb`;\n            }\n            case 'array_starts_with':\n                return this.eb(\n                    this.eb.fn('jsonb_extract_path', [lhs, this.eb.val('0')]),\n                    '=',\n                    this.transformInput(value, 'Json', false),\n                );\n            case 'array_ends_with':\n                return this.eb(\n                    this.eb.fn('jsonb_extract_path', [lhs, sql`(jsonb_array_length(${lhs}) - 1)::text`]),\n                    '=',\n                    this.transformInput(value, 'Json', false),\n                );\n        }\n    }\n\n    protected override buildJsonArrayExistsPredicate(\n        receiver: Expression<any>,\n        buildFilter: (elem: Expression<any>) => Expression<SqlBool>,\n    ) {\n        return this.eb.exists(\n            this.eb\n                .selectFrom(this.eb.fn('jsonb_array_elements', [receiver]).as('$items'))\n                .select(this.eb.lit(1).as('_'))\n                .where(buildFilter(this.eb.ref('$items.value'))),\n        );\n    }\n\n    private getSqlType(zmodelType: string, attributes?: FieldDef['attributes']) {\n        // Check @db.* attributes first — they specify the exact native PostgreSQL type\n        if (attributes) {\n            for (const attr of attributes) {\n                const mapped = PostgresCrudDialect.dbAttributeToSqlTypeMap[attr.name];\n                if (mapped) {\n                    return mapped;\n                }\n            }\n        }\n        if (isEnum(this.schema, zmodelType)) {\n            // reduce enum to text for type compatibility\n            return 'text';\n        } else {\n            return this.zmodelToSqlTypeMap[zmodelType] ?? 'text';\n        }\n    }\n\n    // Resolves the effective SQL type for a field: the native type from any @db.* attribute,\n    // or the base ZModel SQL type if no attribute is present, or undefined if the field is unknown.\n    private resolveFieldSqlType(fieldDef: FieldDef | undefined): {\n        sqlType: string | undefined;\n        hasDbOverride: boolean;\n    } {\n        if (!fieldDef) {\n            return { sqlType: undefined, hasDbOverride: false };\n        }\n        const dbAttr = fieldDef.attributes?.find((a) => a.name.startsWith('@db.'));\n        if (dbAttr) {\n            return { sqlType: PostgresCrudDialect.dbAttributeToSqlTypeMap[dbAttr.name], hasDbOverride: true };\n        }\n        return { sqlType: this.getSqlType(fieldDef.type), hasDbOverride: false };\n    }\n\n    override buildComparison(\n        left: Expression<unknown>,\n        leftFieldDef: FieldDef | undefined,\n        op: string,\n        right: Expression<unknown>,\n        rightFieldDef: FieldDef | undefined,\n    ) {\n        const leftResolved = this.resolveFieldSqlType(leftFieldDef);\n        const rightResolved = this.resolveFieldSqlType(rightFieldDef);\n        // If the resolved SQL types differ and at least one side carries a @db.* native type override,\n        // cast that side back to its base ZModel SQL type so PostgreSQL doesn't reject the comparison\n        // (e.g. \"operator does not exist: uuid = text\").\n        if (\n            leftResolved.sqlType !== rightResolved.sqlType &&\n            (leftResolved.hasDbOverride || rightResolved.hasDbOverride)\n        ) {\n            if (leftResolved.hasDbOverride) {\n                left = this.eb.cast(left, sql.raw(this.getSqlType(leftFieldDef!.type)));\n            }\n            if (rightResolved.hasDbOverride) {\n                right = this.eb.cast(right, sql.raw(this.getSqlType(rightFieldDef!.type)));\n            }\n        }\n        return super.buildComparison(left, leftFieldDef, op, right, rightFieldDef);\n    }\n\n    override getStringCasingBehavior() {\n        // Postgres `LIKE` is case-sensitive, `ILIKE` is case-insensitive\n        return { supportsILike: true, likeCaseSensitive: true };\n    }\n\n    override buildValuesTableSelect(fields: FieldDef[], rows: unknown[][]) {\n        if (rows.length === 0) {\n            throw createInvalidInputError('At least one row is required to build values table');\n        }\n\n        // check all rows have the same length\n        const rowLength = rows[0]!.length;\n\n        if (fields.length !== rowLength) {\n            throw createInvalidInputError('Number of fields must match number of columns in each row');\n        }\n\n        for (const row of rows) {\n            if (row.length !== rowLength) {\n                throw createInvalidInputError('All rows must have the same number of columns');\n            }\n        }\n\n        const eb = expressionBuilder<any, any>();\n\n        return eb\n            .selectFrom(\n                sql`(VALUES ${sql.join(\n                    rows.map((row) => sql`(${sql.join(row.map((v) => sql.val(v)))})`),\n                    sql.raw(', '),\n                )})`.as('$values'),\n            )\n            .select(\n                fields.map((f, i) => {\n                    const mappedType = this.getSqlType(f.type, f.attributes);\n                    const castType = f.array ? sql`${sql.raw(mappedType)}[]` : sql.raw(mappedType);\n                    return this.eb.cast(sql.ref(`$values.column${i + 1}`), castType).as(f.name);\n                }),\n            );\n    }\n\n    protected override buildOrderByField(\n        query: SelectQueryBuilder<any, any, any>,\n        field: Expression<unknown>,\n        sort: SortOrder,\n        nulls: 'first' | 'last',\n    ) {\n        return query.orderBy(field, (ob) => {\n            ob = sort === 'asc' ? ob.asc() : ob.desc();\n            ob = nulls === 'first' ? ob.nullsFirst() : ob.nullsLast();\n            return ob;\n        });\n    }\n\n    // #endregion\n\n    // #region search\n\n    /**\n     * Wraps an expression with `unaccent(lower(...))` or just `lower(...)` depending on\n     * whether the user opted into accent-insensitive matching. The lowering is always\n     * applied so trigram comparisons are case-insensitive on both sides.\n     */\n    private normalizeForTrigram(expr: Expression<any>, applyUnaccent: boolean): Expression<any> {\n        return applyUnaccent ? sql`unaccent(lower(${expr}))` : sql`lower(${expr})`;\n    }\n\n    override buildFuzzyFilter(fieldRef: Expression<any>, options: FuzzyFilterOptions): Expression<SqlBool> {\n        const fieldExpr = this.normalizeForTrigram(fieldRef, options.unaccent);\n        const valueExpr = this.normalizeForTrigram(sql.val(options.search), options.unaccent);\n\n        if (options.threshold === undefined) {\n            // Operator form: relies on the session-level pg_trgm.*_threshold settings.\n            // 'simple'  -> `%` (similarity()), symmetric.\n            // 'word'    -> `<%` (word_similarity()): search-term <% document.\n            // 'strictWord' -> `<<%` (strict_word_similarity()): search-term <<% document.\n            switch (options.mode) {\n                case 'simple':\n                    return sql<SqlBool>`${fieldExpr} % ${valueExpr}`;\n                case 'word':\n                    return sql<SqlBool>`${valueExpr} <% ${fieldExpr}`;\n                case 'strictWord':\n                    return sql<SqlBool>`${valueExpr} <<% ${fieldExpr}`;\n            }\n        }\n\n        // Function form: explicit `similarity(...) > threshold`. Bypasses session settings,\n        // letting the user pick a per-query threshold.\n        const threshold = sql.val(options.threshold);\n        switch (options.mode) {\n            case 'simple':\n                return sql<SqlBool>`similarity(${fieldExpr}, ${valueExpr}) > ${threshold}`;\n            case 'word':\n                return sql<SqlBool>`word_similarity(${valueExpr}, ${fieldExpr}) > ${threshold}`;\n            case 'strictWord':\n                return sql<SqlBool>`strict_word_similarity(${valueExpr}, ${fieldExpr}) > ${threshold}`;\n        }\n    }\n\n    override buildFuzzyRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        fieldRefs: Expression<any>[],\n        search: string,\n        sort: SortOrder,\n        mode: FuzzyFilterOptions['mode'],\n        unaccent: boolean,\n    ): SelectQueryBuilder<any, any, any> {\n        const valueExpr = this.normalizeForTrigram(sql.val(search), unaccent);\n        const buildSimilarity = (fieldRef: Expression<any>) => {\n            const fieldExpr = this.normalizeForTrigram(fieldRef, unaccent);\n            switch (mode) {\n                case 'simple':\n                    return sql`similarity(${fieldExpr}, ${valueExpr})`;\n                case 'word':\n                    return sql`word_similarity(${valueExpr}, ${fieldExpr})`;\n                case 'strictWord':\n                    return sql`strict_word_similarity(${valueExpr}, ${fieldExpr})`;\n            }\n        };\n\n        if (fieldRefs.length === 1) {\n            return query.orderBy(buildSimilarity(fieldRefs[0]!), sort);\n        }\n        const similarities = fieldRefs.map((ref) => buildSimilarity(ref));\n        return query.orderBy(sql`GREATEST(${sql.join(similarities)})`, sort);\n    }\n\n    override buildFullTextFilter(fieldRef: Expression<any>, payload: unknown): Expression<SqlBool> {\n        // When `config` is provided we bind it via sql.val + an inline ::regconfig\n        // cast (parameterized, no string concatenation). When omitted we emit the\n        // single-arg forms `to_tsvector(field)` / `to_tsquery(query)` so Postgres\n        // falls back to the database-level `default_text_search_config`.\n        // `to_tsquery` throws at execution on syntax error; we don't pre-validate.\n        const options = this.normalizeFullTextOptions(payload);\n        const query = sql.val(options.search);\n        if (options.config === undefined) {\n            return sql<SqlBool>`to_tsvector(${fieldRef}) @@ to_tsquery(${query})`;\n        }\n        const cfg = sql.val(options.config);\n        return sql<SqlBool>`to_tsvector(${cfg}::regconfig, ${fieldRef}) @@ to_tsquery(${cfg}::regconfig, ${query})`;\n    }\n\n    /**\n     * Validate the user-provided `fts` filter payload. When `config` is omitted\n     * it stays `undefined` so {@link buildFullTextFilter} can emit the no-regconfig\n     * SQL form and let Postgres fall back to `default_text_search_config`.\n     */\n    private normalizeFullTextOptions(value: unknown): FullTextFilterOptions {\n        invariant(\n            value !== null && typeof value === 'object' && !Array.isArray(value),\n            'fts filter must be an object with at least a \"search\" field',\n        );\n        const raw = value as Record<string, unknown>;\n        invariant(\n            typeof raw['search'] === 'string' && (raw['search'] as string).length > 0,\n            'fts.search must be a non-empty string',\n        );\n        if (raw['config'] !== undefined) {\n            invariant(\n                typeof raw['config'] === 'string' && (raw['config'] as string).length > 0,\n                'fts.config must be a non-empty string',\n            );\n        }\n        return {\n            search: raw['search'] as string,\n            config: raw['config'] as string | undefined,\n        };\n    }\n\n    override buildFtsRelevanceOrderBy(\n        query: SelectQueryBuilder<any, any, any>,\n        fieldRefs: Expression<any>[],\n        search: string,\n        config: string | undefined,\n        sort: SortOrder,\n    ): SelectQueryBuilder<any, any, any> {\n        const q = sql.val(search);\n\n        // Document expression: a single field, or `concat_ws` of all fields when\n        // multi-field. The single-field path coalesces NULL → '' so `ts_rank`\n        // returns 0.0 (not NULL) for NULL-valued rows, matching the null-skipping\n        // behavior `concat_ws` already provides on the multi-field path.\n        // Multi-field uses a single ts_rank over the combined document (matches\n        // Prisma; ensures AND queries match terms spread across fields).\n        const document =\n            fieldRefs.length === 1\n                ? sql`coalesce(${fieldRefs[0]!}, '')`\n                : sql`concat_ws(' ', ${sql.join(fieldRefs)})`;\n\n        if (config === undefined) {\n            // No regconfig — Postgres uses default_text_search_config.\n            return query.orderBy(sql`ts_rank(to_tsvector(${document}), to_tsquery(${q}))`, sort);\n        }\n        const cfg = sql.val(config);\n        return query.orderBy(\n            sql`ts_rank(to_tsvector(${cfg}::regconfig, ${document}), to_tsquery(${cfg}::regconfig, ${q}))`,\n            sort,\n        );\n    }\n\n    // #endregion\n}\n\n/**\n * Resolved options for the `fts` full-text filter (Postgres-only). `config` is\n * left `undefined` when the user didn't supply one — `buildFullTextFilter` then\n * emits `to_tsvector(field)` / `to_tsquery(query)` without a regconfig argument\n * so Postgres falls back to the database-level `default_text_search_config`.\n */\ntype FullTextFilterOptions = {\n    search: string;\n    config: string | undefined;\n};\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '@zenstackhq/schema';\nimport Decimal from 'decimal.js';\nimport {\n    expressionBuilder,\n    ExpressionWrapper,\n    sql,\n    ValueListNode,\n    type AliasableExpression,\n    type Expression,\n    type ExpressionBuilder,\n    type RawBuilder,\n    type SelectQueryBuilder,\n    type SqlBool,\n} from 'kysely';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs, SortOrder } from '../../crud-types';\nimport { createInternalError, createInvalidInputError, createNotSupportedError } from '../../errors';\nimport {\n    getDelegateDescendantModels,\n    getManyToManyRelation,\n    getRelationForeignKeyFieldPairs,\n    requireField,\n    requireIdFields,\n    requireModel,\n    tmpAlias,\n} from '../../query-utils';\nimport { BaseCrudDialect, type FuzzyFilterOptions } from './base-dialect';\n\nexport class SqliteCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n    override get provider() {\n        return 'sqlite' as const;\n    }\n\n    // #region capabilities\n\n    override get supportsUpdateWithLimit() {\n        return false;\n    }\n\n    override get supportsDeleteWithLimit() {\n        return false;\n    }\n\n    override get supportsDistinctOn() {\n        return false;\n    }\n\n    override get supportsReturning() {\n        return true;\n    }\n\n    override get supportsDefaultAsFieldValue() {\n        return false;\n    }\n\n    override get supportsInsertDefaultValues(): boolean {\n        return true;\n    }\n\n    override get insertIgnoreMethod() {\n        return 'onConflict' as const;\n    }\n\n    // #endregion\n\n    // #region value transformation\n\n    override transformInput(value: unknown, type: BuiltinType, _forArrayField: boolean): unknown {\n        if (value === undefined) {\n            return value;\n        }\n\n        // Handle special null classes for JSON fields\n        if (value instanceof JsonNullClass) {\n            return 'null';\n        } else if (value instanceof DbNullClass) {\n            return null;\n        } else if (value instanceof AnyNullClass) {\n            invariant(false, 'should not reach here: AnyNull is not a valid input value');\n        }\n\n        if (type === 'Json' || (this.schema.typeDefs && type in this.schema.typeDefs)) {\n            // JSON data should be stringified\n            return JSON.stringify(value);\n        }\n\n        if (Array.isArray(value)) {\n            return value.map((v) => this.transformInput(v, type, false));\n        } else {\n            switch (type) {\n                case 'Boolean':\n                    return value ? 1 : 0;\n                case 'DateTime':\n                    return value instanceof Date\n                        ? value.toISOString()\n                        : typeof value === 'string'\n                          ? new Date(value).toISOString()\n                          : value;\n                case 'Decimal':\n                    return (value as Decimal).toString();\n                case 'Bytes':\n                    return Buffer.from(value as Uint8Array);\n                default:\n                    return value;\n            }\n        }\n    }\n\n    override transformOutput(value: unknown, type: BuiltinType, array: boolean) {\n        if (value === null || value === undefined) {\n            return value;\n        } else if (this.schema.typeDefs && type in this.schema.typeDefs) {\n            // typed JSON field\n            return this.transformOutputJson(value);\n        } else {\n            switch (type) {\n                case 'Boolean':\n                    return this.transformOutputBoolean(value);\n                case 'DateTime':\n                    return this.transformOutputDate(value);\n                case 'Bytes':\n                    return this.transformOutputBytes(value);\n                case 'Decimal':\n                    return this.transformOutputDecimal(value);\n                case 'BigInt':\n                    return this.transformOutputBigInt(value);\n                case 'Json':\n                    return this.transformOutputJson(value);\n                default:\n                    return super.transformOutput(value, type, array);\n            }\n        }\n    }\n\n    private transformOutputDecimal(value: unknown) {\n        if (value instanceof Decimal) {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number' || value instanceof Decimal,\n            `Expected string, number or Decimal, got ${typeof value}`,\n        );\n        return new Decimal(value);\n    }\n\n    private transformOutputBigInt(value: unknown) {\n        if (typeof value === 'bigint') {\n            return value;\n        }\n        invariant(\n            typeof value === 'string' || typeof value === 'number',\n            `Expected string or number, got ${typeof value}`,\n        );\n        return BigInt(value);\n    }\n\n    private transformOutputBoolean(value: unknown) {\n        return !!value;\n    }\n\n    private transformOutputDate(value: unknown) {\n        if (typeof value === 'number') {\n            return new Date(value);\n        } else if (typeof value === 'string') {\n            return new Date(value);\n        } else {\n            return value;\n        }\n    }\n\n    private transformOutputBytes(value: unknown) {\n        return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\n    }\n\n    private transformOutputJson(value: unknown) {\n        // better-sqlite3 typically returns JSON as string; be tolerant\n        if (typeof value === 'string') {\n            try {\n                return JSON.parse(value);\n            } catch (e) {\n                throw createInternalError('Invalid JSON returned', undefined, { cause: e });\n            }\n        }\n        return value;\n    }\n\n    // #endregion\n\n    // #region other overrides\n\n    override buildRelationSelection(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        relationField: string,\n        parentAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ): SelectQueryBuilder<any, any, any> {\n        return query.select((eb) =>\n            this.buildRelationJSON(model, eb, relationField, parentAlias, payload).as(relationField),\n        );\n    }\n\n    private buildRelationJSON(\n        model: string,\n        eb: ExpressionBuilder<any, any>,\n        relationField: string,\n        parentAlias: string,\n        payload: true | FindArgs<Schema, GetModels<Schema>, any, true>,\n    ) {\n        const relationFieldDef = requireField(this.schema, model, relationField);\n        const relationModel = relationFieldDef.type as GetModels<Schema>;\n        const relationModelDef = requireModel(this.schema, relationModel);\n\n        const subQueryName = tmpAlias(`${parentAlias}$${relationField}`);\n        let tbl: SelectQueryBuilder<any, any, any>;\n\n        if (this.canJoinWithoutNestedSelect(relationModelDef, payload)) {\n            // join without needing a nested select on relation model\n            tbl = this.buildModelSelect(relationModel, subQueryName, payload, false);\n\n            // add parent join filter\n            tbl = this.buildRelationJoinFilter(tbl, model, relationField, subQueryName, parentAlias);\n        } else {\n            // need to make a nested select on relation model\n            tbl = eb.selectFrom(() => {\n                // nested query name\n                const selectModelAlias = tmpAlias(`${parentAlias}$${relationField}$sub`);\n\n                // select all fields\n                let selectModelQuery = this.buildModelSelect(relationModel, selectModelAlias, payload, true);\n\n                // add parent join filter\n                selectModelQuery = this.buildRelationJoinFilter(\n                    selectModelQuery,\n                    model,\n                    relationField,\n                    selectModelAlias,\n                    parentAlias,\n                );\n                return selectModelQuery.as(subQueryName);\n            });\n        }\n\n        tbl = tbl.select(() => {\n            type ArgsType = Expression<any> | RawBuilder<any> | SelectQueryBuilder<any, any, any>;\n            const objArgs: ArgsType[] = [];\n\n            const descendantModels = getDelegateDescendantModels(this.schema, relationModel);\n            if (descendantModels.length > 0) {\n                // select all JSONs built from delegate descendants\n                objArgs.push(\n                    ...descendantModels\n                        .map((subModel) => [\n                            sql.lit(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n                            eb.ref(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n                        ])\n                        .flatMap((v) => v),\n                );\n            }\n\n            if (payload === true || !payload.select) {\n                // select all scalar fields except for omitted\n                const omit = typeof payload === 'object' ? payload.omit : undefined;\n                objArgs.push(\n                    ...Object.entries(relationModelDef.fields)\n                        .filter(([, value]) => !value.relation)\n                        .filter(([name]) => !this.shouldOmitField(omit, relationModel, name))\n                        .map(([field]) => [sql.lit(field), this.fieldRef(relationModel, field, subQueryName, false)])\n                        .flatMap((v) => v),\n                );\n            } else if (payload.select) {\n                // select specific fields\n                objArgs.push(\n                    ...Object.entries<any>(payload.select)\n                        .filter(([, value]) => value)\n                        .map(([field, value]) => {\n                            if (field === '_count') {\n                                const subJson = this.buildCountJson(\n                                    relationModel,\n                                    eb,\n                                    tmpAlias(`${parentAlias}$${relationField}`),\n                                    value,\n                                );\n                                return [sql.lit(field), subJson];\n                            } else {\n                                const fieldDef = requireField(this.schema, relationModel, field);\n                                if (fieldDef.relation) {\n                                    const subJson = this.buildRelationJSON(\n                                        relationModel,\n                                        eb,\n                                        field,\n                                        tmpAlias(`${parentAlias}$${relationField}`),\n                                        value,\n                                    );\n                                    return [sql.lit(field), subJson];\n                                } else {\n                                    return [\n                                        sql.lit(field),\n                                        this.fieldRef(relationModel, field, subQueryName, false) as ArgsType,\n                                    ];\n                                }\n                            }\n                        })\n                        .flatMap((v) => v),\n                );\n            }\n\n            if (\n                typeof payload === 'object' &&\n                (payload as any).include &&\n                typeof (payload as any).include === 'object'\n            ) {\n                // include relation fields\n                objArgs.push(\n                    ...Object.entries<any>((payload as any).include)\n                        .filter(([, value]) => value)\n                        .map(([field, value]) => {\n                            if (field === '_count') {\n                                const subJson = this.buildCountJson(\n                                    relationModel,\n                                    eb,\n                                    tmpAlias(`${parentAlias}$${relationField}`),\n                                    value,\n                                );\n                                return [sql.lit(field), subJson];\n                            }\n                            const subJson = this.buildRelationJSON(\n                                relationModel,\n                                eb,\n                                field,\n                                tmpAlias(`${parentAlias}$${relationField}`),\n                                value,\n                            );\n                            return [sql.lit(field), subJson];\n                        })\n                        .flatMap((v) => v),\n                );\n            }\n\n            if (relationFieldDef.array) {\n                return eb.fn\n                    .coalesce(sql`json_group_array(json_object(${sql.join(objArgs)}))`, sql`json_array()`)\n                    .as('$data');\n            } else {\n                return sql`json_object(${sql.join(objArgs)})`.as('$data');\n            }\n        });\n\n        return tbl;\n    }\n\n    private buildRelationJoinFilter(\n        selectModelQuery: SelectQueryBuilder<any, any, {}>,\n        model: string,\n        relationField: string,\n        relationModelAlias: string,\n        parentAlias: string,\n    ) {\n        const fieldDef = requireField(this.schema, model, relationField);\n        const relationModel = fieldDef.type as GetModels<Schema>;\n\n        const m2m = getManyToManyRelation(this.schema, model, relationField);\n        if (m2m) {\n            // many-to-many relation\n            const parentIds = requireIdFields(this.schema, model);\n            const relationIds = requireIdFields(this.schema, relationModel);\n            invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n            invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n            selectModelQuery = selectModelQuery.where((eb) =>\n                eb(\n                    eb.ref(`${relationModelAlias}.${relationIds[0]}`),\n                    'in',\n                    eb\n                        .selectFrom(m2m.joinTable)\n                        .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n                        .whereRef(`${parentAlias}.${parentIds[0]}`, '=', `${m2m.joinTable}.${m2m.parentFkName}`),\n                ),\n            );\n        } else {\n            const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, model, relationField);\n            keyPairs.forEach(({ fk, pk }) => {\n                if (ownedByModel) {\n                    // the parent model owns the fk\n                    selectModelQuery = selectModelQuery.whereRef(\n                        `${relationModelAlias}.${pk}`,\n                        '=',\n                        `${parentAlias}.${fk}`,\n                    );\n                } else {\n                    // the relation side owns the fk\n                    selectModelQuery = selectModelQuery.whereRef(\n                        `${relationModelAlias}.${fk}`,\n                        '=',\n                        `${parentAlias}.${pk}`,\n                    );\n                }\n            });\n        }\n        return selectModelQuery;\n    }\n\n    override buildSkipTake(\n        query: SelectQueryBuilder<any, any, any>,\n        skip: number | undefined,\n        take: number | undefined,\n    ) {\n        if (take !== undefined) {\n            query = query.limit(take);\n        }\n        if (skip !== undefined) {\n            query = query.offset(skip);\n            if (take === undefined) {\n                // SQLite requires offset to be used with limit\n                query = query.limit(-1);\n            }\n        }\n        return query;\n    }\n\n    override buildJsonObject(value: Record<string, Expression<unknown>>) {\n        return this.eb.fn(\n            'json_object',\n            Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n        );\n    }\n\n    protected override buildJsonPathSelection(receiver: Expression<any>, path: string | undefined) {\n        if (!path) {\n            return receiver;\n        } else {\n            return sql`${receiver} -> ${this.eb.val(path)}`;\n        }\n    }\n\n    protected override buildJsonArrayFilter(\n        lhs: Expression<any>,\n        operation: 'array_contains' | 'array_starts_with' | 'array_ends_with',\n        value: unknown,\n    ) {\n        switch (operation) {\n            case 'array_contains':\n                if (Array.isArray(value)) {\n                    throw createNotSupportedError(\n                        'SQLite \"array_contains\" only supports checking for a single value, not an array of values',\n                    );\n                } else {\n                    return sql<any>`EXISTS (SELECT 1 FROM json_each(${lhs}) WHERE value = ${value})`;\n                }\n            case 'array_starts_with':\n                return this.eb(this.eb.fn('json_extract', [lhs, this.eb.val('$[0]')]), '=', value);\n            case 'array_ends_with':\n                return this.eb(sql`json_extract(${lhs}, '$[' || (json_array_length(${lhs}) - 1) || ']')`, '=', value);\n        }\n    }\n\n    protected override buildJsonArrayExistsPredicate(\n        receiver: Expression<any>,\n        buildFilter: (elem: Expression<any>) => Expression<SqlBool>,\n    ) {\n        return this.eb.exists(\n            this.eb\n                .selectFrom(this.eb.fn('json_each', [receiver]).as('$items'))\n                .select(this.eb.lit(1).as('_'))\n                .where(buildFilter(this.eb.ref('$items.value'))),\n        );\n    }\n\n    override buildArrayLength(array: Expression<unknown>): AliasableExpression<number> {\n        return this.eb.fn('json_array_length', [array]);\n    }\n\n    override buildArrayValue(values: Expression<unknown>[], _elemType: string): AliasableExpression<unknown> {\n        return new ExpressionWrapper(ValueListNode.create(values.map((v) => v.toOperationNode())));\n    }\n\n    override buildArrayContains(\n        _field: Expression<unknown>,\n        _value: Expression<unknown>,\n        _elemType?: string,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('SQLite does not support native array operations');\n    }\n\n    override buildArrayHasEvery(\n        _field: Expression<unknown>,\n        _values: Expression<unknown>,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('SQLite does not support native array operations');\n    }\n\n    override buildArrayHasSome(\n        _field: Expression<unknown>,\n        _values: Expression<unknown>,\n    ): AliasableExpression<SqlBool> {\n        throw createNotSupportedError('SQLite does not support native array operations');\n    }\n\n    override castInt<T extends Expression<any>>(expression: T): T {\n        return expression;\n    }\n\n    override castText<T extends Expression<any>>(expression: T): T {\n        return this.eb.cast(expression, 'text') as unknown as T;\n    }\n\n    override trimTextQuotes<T extends Expression<string>>(expression: T): T {\n        return this.eb.fn('trim', [expression, sql.lit('\"')]) as unknown as T;\n    }\n\n    override getStringCasingBehavior() {\n        // SQLite `LIKE` is case-insensitive, and there is no `ILIKE`\n        return { supportsILike: false, likeCaseSensitive: false };\n    }\n\n    override buildValuesTableSelect(fields: FieldDef[], rows: unknown[][]) {\n        if (rows.length === 0) {\n            throw createInvalidInputError('At least one row is required to build values table');\n        }\n\n        // check all rows have the same length\n        const rowLength = rows[0]!.length;\n\n        if (fields.length !== rowLength) {\n            throw createInvalidInputError('Number of fields must match number of columns in each row');\n        }\n\n        for (const row of rows) {\n            if (row.length !== rowLength) {\n                throw createInvalidInputError('All rows must have the same number of columns');\n            }\n        }\n\n        const eb = expressionBuilder<any, any>();\n\n        return eb\n            .selectFrom(\n                sql`(VALUES ${sql.join(\n                    rows.map((row) => sql`(${sql.join(row.map((v) => sql.val(v)))})`),\n                    sql.raw(', '),\n                )})`.as('$values'),\n            )\n            .select(fields.map((f, i) => eb.ref(`$values.column${i + 1}`).as(f.name)));\n    }\n\n    protected override buildOrderByField(\n        query: SelectQueryBuilder<any, any, any>,\n        field: Expression<unknown>,\n        sort: SortOrder,\n        nulls: 'first' | 'last',\n    ) {\n        return query.orderBy(field, (ob) => {\n            ob = sort === 'asc' ? ob.asc() : ob.desc();\n            ob = nulls === 'first' ? ob.nullsFirst() : ob.nullsLast();\n            return ob;\n        });\n    }\n\n    override buildFuzzyFilter(_fieldRef: Expression<any>, _options: FuzzyFilterOptions): Expression<SqlBool> {\n        throw createNotSupportedError('\"fuzzy\" filter is not supported by the \"sqlite\" provider');\n    }\n\n    override buildFuzzyRelevanceOrderBy(\n        _query: SelectQueryBuilder<any, any, any>,\n        _fieldRefs: Expression<any>[],\n        _search: string,\n        _sort: SortOrder,\n        _mode: FuzzyFilterOptions['mode'],\n        _unaccent: boolean,\n    ): SelectQueryBuilder<any, any, any> {\n        throw createNotSupportedError('\"_fuzzyRelevance\" ordering is not supported by the \"sqlite\" provider');\n    }\n\n    override buildFullTextFilter(_fieldRef: Expression<any>, _payload: unknown): Expression<SqlBool> {\n        throw createNotSupportedError('\"fts\" filter is not supported by the \"sqlite\" provider');\n    }\n\n    override buildFtsRelevanceOrderBy(\n        _query: SelectQueryBuilder<any, any, any>,\n        _fieldRefs: Expression<any>[],\n        _search: string,\n        _config: string | undefined,\n        _sort: SortOrder,\n    ): SelectQueryBuilder<any, any, any> {\n        throw createNotSupportedError('\"_ftsRelevance\" ordering is not supported by the \"sqlite\" provider');\n    }\n    // #endregion\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base-dialect';\nimport { MySqlCrudDialect } from './mysql';\nimport { PostgresCrudDialect } from './postgresql';\nimport { SqliteCrudDialect } from './sqlite';\n\nexport function getCrudDialect<Schema extends SchemaDef>(\n    schema: Schema,\n    options: ClientOptions<Schema>,\n): BaseCrudDialect<Schema> {\n    return match(schema.provider.type)\n        .with('sqlite', () => new SqliteCrudDialect(schema, options))\n        .with('postgresql', () => new PostgresCrudDialect(schema, options))\n        .with('mysql', () => new MySqlCrudDialect(schema, options))\n        .exhaustive();\n}\n","import stableStringify from 'json-stable-stringify';\n\n/**\n * Method decorator that caches the return value based on method name and arguments.\n *\n * Requirements:\n * - Class must have a `getCache(key: string)` method\n * - Class must have a `setCache(key: string, value: any)` method\n */\nexport function cache() {\n    return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n        const originalMethod = descriptor.value;\n\n        descriptor.value = function (\n            this: {\n                getCache: (key: string) => unknown;\n                setCache: (key: string, value: unknown) => void;\n            } & Record<string, unknown>,\n            ...args: any[]\n        ) {\n            // Build cache key object\n            const cacheKeyObj: Record<string, unknown> = {\n                $call: propertyKey,\n                $args: args.map((arg) => {\n                    if (Array.isArray(arg)) {\n                        // sort array arguments for consistent cache keys\n                        return [...arg].sort();\n                    } else {\n                        return arg;\n                    }\n                }),\n            };\n\n            // Generate stable string key\n            const cacheKey = stableStringify(cacheKeyObj)!;\n\n            // Check cache\n            const cached = this.getCache(cacheKey);\n            if (cached !== undefined) {\n                return cached;\n            }\n\n            // Execute original method\n            const result = originalMethod.apply(this, args);\n\n            // Store in cache\n            this.setCache(cacheKey, result);\n\n            return result;\n        };\n\n        return descriptor;\n    };\n}\n","import { enumerate, invariant, lowerCaseFirst, upperCaseFirst } from '@zenstackhq/common-helpers';\nimport {\n    type AttributeApplication,\n    type BuiltinType,\n    type FieldDef,\n    type GetModels,\n    type SchemaDef,\n} from '@zenstackhq/schema';\nimport { ZodUtils } from '@zenstackhq/zod';\nimport Decimal from 'decimal.js';\nimport { match, P } from 'ts-pattern';\nimport { z, ZodObject, ZodType } from 'zod';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../common-types';\nimport { extractFields } from '../../utils/object-utils';\nimport { AggregateOperators, FILTER_PROPERTY_TO_KIND, LOGICAL_COMBINATORS, NUMERIC_FIELD_TYPES } from '../constants';\nimport type { ClientContract } from '../contract';\nimport type {\n    AggregateArgs,\n    CountArgs,\n    CreateArgs,\n    CreateManyAndReturnArgs,\n    CreateManyArgs,\n    DeleteArgs,\n    DeleteManyArgs,\n    ExistsArgs,\n    FindFirstArgs,\n    FindManyArgs,\n    FindUniqueArgs,\n    GroupByArgs,\n    UpdateArgs,\n    UpdateManyAndReturnArgs,\n    UpdateManyArgs,\n    UpsertArgs,\n} from '../crud-types';\nimport {\n    CoreCreateOperations,\n    CoreDeleteOperations,\n    CoreReadOperations,\n    CoreUpdateOperations,\n    type CoreCrudOperations,\n} from '../crud/operations/base';\nimport { createInternalError } from '../errors';\nimport type { ClientOptions, QueryOptions } from '../options';\nimport type { AnyPlugin, ExtQueryArgsBase } from '../plugin';\nimport {\n    fieldHasDefaultValue,\n    getEnum,\n    getTypeDef,\n    getUniqueFields,\n    isEnum,\n    isTypeDef,\n    requireField,\n    requireModel,\n} from '../query-utils';\nimport { cache } from './cache-decorator';\n\n/**\n * Create a factory for generating Zod schemas to validate ORM query inputs.\n */\nexport function createQuerySchemaFactory<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase = {},\n>(client: ClientContract<Schema, Options, ExtQueryArgs>): ZodSchemaFactory<Schema, Options, ExtQueryArgs>;\n\n/**\n * Create a factory for generating Zod schemas to validate ORM query inputs.\n */\nexport function createQuerySchemaFactory<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema> = ClientOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase = {},\n>(schema: Schema, options?: Options): ZodSchemaFactory<Schema, Options, ExtQueryArgs>;\n\n/**\n * Create a factory using only query options (e.g. slicing) without a full client config.\n */\nexport function createQuerySchemaFactory<Schema extends SchemaDef>(\n    schema: Schema,\n    options?: QueryOptions<Schema>,\n): ZodSchemaFactory<Schema>;\n\nexport function createQuerySchemaFactory(clientOrSchema: any, options?: any) {\n    return new ZodSchemaFactory(clientOrSchema, options);\n}\n\n/**\n * Builds a `DateTime` value schema that accepts a `Date` object or any string\n * the JS `Date` constructor parses, and coerces it to a `Date`. ISO datetime,\n * ISO date, and time-only strings (e.g. `\"09:00:00\"` for `@db.Time` fields,\n * anchored to the Unix epoch) are the documented happy paths; other formats\n * accepted by `new Date(...)` also pass through, mirroring Prisma's pre-3.5\n * behaviour. Strings the engine can't parse fall through and are rejected by\n * `z.date()` with the standard error.\n *\n * @see https://github.com/zenstackhq/zenstack/issues/2631\n */\nexport function coercedDateTimeSchema(): ZodType {\n    // The schema keeps the original `z.iso.datetime() | z.iso.date() | z.date()`\n    // union so the generated OpenAPI spec still documents the accepted ISO\n    // forms. Preprocess runs first and coerces strings into `Date` objects,\n    // so the union's `z.date()` arm catches everything that successfully\n    // parses — including non-ISO formats like `\"2024/01/15\"` for Prisma\n    // compatibility (rejected with the standard error if `new Date(...)`\n    // returns Invalid Date).\n    return z.preprocess((val) => {\n        if (typeof val !== 'string') return val;\n        if (/^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d\\d(?::\\d\\d)?)?$/.test(val)) {\n            const hasTz = val.endsWith('Z') || /[+-]\\d\\d(?::\\d\\d)?$/.test(val);\n            const d = new Date(`1970-01-01T${val}${hasTz ? '' : 'Z'}`);\n            return isNaN(d.getTime()) ? val : d;\n        }\n        const d = new Date(val);\n        return isNaN(d.getTime()) ? val : d;\n    }, z.union([z.iso.datetime(), z.iso.date(), z.date()]));\n}\n\n/**\n * Options for creating Zod schemas.\n */\nexport type CreateSchemaOptions = {\n    /**\n     * Controls the depth of relation nesting in the generated schema. Default is unlimited.\n     */\n    relationDepth?: number;\n};\n\n/**\n * Factory class responsible for creating and caching Zod schemas for ORM input validation.\n */\nexport class ZodSchemaFactory<\n    in out Schema extends SchemaDef,\n    // Bounded by `QueryOptions` (not `ClientOptions`): only `omit`/`slicing` shape the schema types.\n    // The `$zod` accessor passes the client's *projected* (query-relevant) options, so the heavy\n    // options literal never reaches the (invariant) arg types this factory produces.\n    in out Options extends QueryOptions<Schema> = ClientOptions<Schema>,\n    ExtQueryArgs extends ExtQueryArgsBase = {},\n> {\n    private readonly schemaCache = new Map<string, ZodType>();\n    private readonly schemaRegistry = z.registry<{ id: string }>();\n    private readonly allFilterKinds = [...new Set(Object.values(FILTER_PROPERTY_TO_KIND))];\n    private readonly schema: Schema;\n    private readonly options: Options;\n    private readonly extraValidationsEnabled = true;\n\n    // The client's `Options` type arg is intentionally erased here (`any`) - the factory only needs\n    // the schema and the runtime options object; its own `Options` type param is supplied (projected)\n    // by the caller (`$zod`).\n    constructor(client: ClientContract<Schema, any, ExtQueryArgs, any>);\n    constructor(schema: Schema, options?: Options);\n    constructor(clientOrSchema: any, options?: Options) {\n        if ('$schema' in clientOrSchema) {\n            this.schema = clientOrSchema.$schema;\n            this.options = clientOrSchema.$options;\n        } else {\n            this.schema = clientOrSchema;\n            this.options = options || ({} as Options);\n        }\n    }\n\n    private get plugins(): AnyPlugin[] {\n        // `plugins` is a runtime-only field absent from the query-relevant `Options` type;\n        // read it weakly (the concrete options object always carries it at runtime).\n        return (this.options as { plugins?: AnyPlugin[] }).plugins ?? [];\n    }\n\n    /**\n     * Returns model field entries, excluding Unsupported fields.\n     */\n    private getModelFields(model: string): [string, FieldDef][] {\n        const modelDef = requireModel(this.schema, model);\n        return Object.entries(modelDef.fields).filter(([, def]) => def.type !== 'Unsupported');\n    }\n\n    private shouldIncludeRelations(options?: CreateSchemaOptions): boolean {\n        return options?.relationDepth === undefined || options.relationDepth > 0;\n    }\n\n    private nextOptions(options?: CreateSchemaOptions): CreateSchemaOptions | undefined {\n        if (!options) return undefined;\n        if (options.relationDepth === undefined) return options;\n        return { ...options, relationDepth: options.relationDepth - 1 };\n    }\n\n    // #region Cache Management\n\n    // @ts-ignore\n    private getCache(cacheKey: string) {\n        return this.schemaCache.get(cacheKey);\n    }\n\n    // @ts-ignore\n    private setCache(cacheKey: string, schema: ZodType) {\n        this.schemaCache.set(cacheKey, schema);\n    }\n\n    /**\n     * Builds a suffix to append to schema IDs when filter variants differ from defaults.\n     * Ensures different combinations of optional, array, and allowedFilterKinds produce distinct registry entries.\n     */\n    private filterSchemaSuffix(opts: {\n        optional?: boolean;\n        array?: boolean;\n        withAggregations?: boolean;\n        allowedFilterKinds?: string[] | undefined;\n    }): string {\n        const parts: string[] = [];\n        if (opts.optional) parts.push('Optional');\n        if (opts.array) parts.push('Array');\n        if (opts.withAggregations) parts.push('Agg');\n        if (opts.allowedFilterKinds) parts.push(...opts.allowedFilterKinds.slice().sort());\n        return parts.length ? `${parts.join('')}` : '';\n    }\n\n    /**\n     * Registers a schema in the registry under the given id.\n     * Safe to call multiple times with the same id: first registration wins, subsequent ones are silently skipped.\n     */\n    private registerSchema(id: string, schema: ZodType) {\n        if (!this.schemaRegistry.has(schema)) {\n            try {\n                this.schemaRegistry.add(schema, { id });\n            } catch {\n                // id already taken by a different schema variant (e.g. different options) — skip\n            }\n        }\n    }\n\n    /**\n     * Returns a JSON Schema document containing all registered Zod schemas as named definitions.\n     * The returned object has the shape `{ schemas: { [id]: jsonSchema } }`.\n     *\n     * Eagerly builds all top-level schemas for every model so the registry is fully populated\n     * before serialization.\n     */\n    toJSONSchema() {\n        // Reset both the registry and the builder cache so that all eager calls\n        // below re-execute their bodies and re-register schemas into the fresh registry.\n        this.schemaCache.clear();\n        this.schemaRegistry.clear();\n\n        // Eagerly build schemas for included models so they are registered before serialization.\n        for (const model of Object.keys(this.schema.models).filter((m) => this.isModelAllowed(m))) {\n            const m = model as GetModels<Schema>;\n            this.makeFindUniqueSchema(m);\n            this.makeFindFirstSchema(m);\n            this.makeFindManySchema(m);\n            this.makeExistsSchema(m);\n            this.makeCreateSchema(m);\n            this.makeCreateManySchema(m);\n            this.makeCreateManyAndReturnSchema(m);\n            this.makeUpdateSchema(m);\n            this.makeUpdateManySchema(m);\n            this.makeUpdateManyAndReturnSchema(m);\n            this.makeUpsertSchema(m);\n            this.makeDeleteSchema(m);\n            this.makeDeleteManySchema(m);\n            this.makeCountSchema(m);\n            this.makeAggregateSchema(m);\n            this.makeGroupBySchema(m);\n        }\n        // Eagerly build args schemas for allowed procedures only.\n        for (const procName of Object.keys(this.schema.procedures ?? {})) {\n            if (this.isProcedureAllowed(procName)) {\n                this.makeProcedureArgsSchema(procName);\n            }\n        }\n        return z.toJSONSchema(this.schemaRegistry, { unrepresentable: 'any' });\n    }\n\n    get cacheStats() {\n        return {\n            size: this.schemaCache.size,\n            keys: [...this.schemaCache.keys()],\n        };\n    }\n\n    // #endregion\n\n    // #region Find\n\n    makeFindUniqueSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<FindUniqueArgs<Schema, Model, Options, ExtQueryArgs>> {\n        return this.makeFindSchema(model, 'findUnique', options) as ZodType<\n            FindUniqueArgs<Schema, Model, Options, ExtQueryArgs>\n        >;\n    }\n\n    makeFindFirstSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<FindFirstArgs<Schema, Model, Options, ExtQueryArgs> | undefined> {\n        return this.makeFindSchema(model, 'findFirst', options) as ZodType<\n            FindFirstArgs<Schema, Model, Options, ExtQueryArgs> | undefined\n        >;\n    }\n\n    makeFindManySchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<FindManyArgs<Schema, Model, Options, ExtQueryArgs> | undefined> {\n        return this.makeFindSchema(model, 'findMany', options) as ZodType<\n            FindManyArgs<Schema, Model, Options, ExtQueryArgs> | undefined\n        >;\n    }\n\n    @cache()\n    private makeFindSchema(model: string, operation: CoreCrudOperations, options?: CreateSchemaOptions) {\n        const fields: Record<string, z.ZodSchema> = {};\n        const unique = operation === 'findUnique';\n        const findOne = operation === 'findUnique' || operation === 'findFirst';\n        const where = this.makeWhereSchema(model, unique, false, false, options);\n        if (unique) {\n            fields['where'] = where;\n        } else {\n            fields['where'] = where.optional();\n        }\n\n        fields['select'] = this.makeSelectSchema(model, options).optional().nullable();\n        fields['include'] = this.makeIncludeSchema(model, options).optional().nullable();\n        fields['omit'] = this.makeOmitSchema(model).optional().nullable();\n\n        if (!unique) {\n            fields['skip'] = this.makeSkipSchema().optional();\n            if (findOne) {\n                fields['take'] = z.literal(1).optional();\n            } else {\n                fields['take'] = this.makeTakeSchema().optional();\n            }\n            fields['orderBy'] = this.orArray(this.makeOrderBySchema(model, true, false, options), true).optional();\n            fields['cursor'] = this.makeCursorSchema(model, options).optional();\n            fields['distinct'] = this.makeDistinctSchema(model).optional();\n        }\n\n        const baseSchema = z.strictObject(fields);\n        let result: ZodType = this.mergePluginArgsSchema(baseSchema, operation);\n        result = this.refineForSelectIncludeMutuallyExclusive(result);\n        result = this.refineForSelectOmitMutuallyExclusive(result);\n        result = this.refineForSelectHasTruthyField(result);\n\n        if (!unique) {\n            result = result.optional();\n        }\n        this.registerSchema(`${model}${upperCaseFirst(operation)}Args`, result);\n        return result;\n    }\n\n    @cache()\n    makeExistsSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<ExistsArgs<Schema, Model, Options, ExtQueryArgs> | undefined> {\n        const baseSchema = z.strictObject({\n            where: this.makeWhereSchema(model, false, false, false, options).optional(),\n        });\n        const result = this.mergePluginArgsSchema(baseSchema, 'exists').optional() as ZodType<\n            ExistsArgs<Schema, Model, Options, ExtQueryArgs> | undefined\n        >;\n        this.registerSchema(`${model}ExistsArgs`, result);\n        return result;\n    }\n\n    private makeScalarSchema(type: string, attributes?: readonly AttributeApplication[]) {\n        if (this.schema.typeDefs && type in this.schema.typeDefs) {\n            return this.makeTypeDefSchema(type);\n        } else if (this.schema.enums && type in this.schema.enums) {\n            return this.makeEnumSchema(type);\n        } else {\n            return match(type)\n                .with('String', () =>\n                    this.extraValidationsEnabled ? ZodUtils.addStringValidation(z.string(), attributes) : z.string(),\n                )\n                .with('Int', () =>\n                    this.extraValidationsEnabled\n                        ? ZodUtils.addNumberValidation(z.number().int(), attributes)\n                        : z.number().int(),\n                )\n                .with('Float', () =>\n                    this.extraValidationsEnabled ? ZodUtils.addNumberValidation(z.number(), attributes) : z.number(),\n                )\n                .with('Boolean', () => z.boolean())\n                .with('BigInt', () =>\n                    z.union([\n                        this.extraValidationsEnabled\n                            ? ZodUtils.addNumberValidation(z.number().int(), attributes)\n                            : z.number().int(),\n                        this.extraValidationsEnabled\n                            ? ZodUtils.addBigIntValidation(z.bigint(), attributes)\n                            : z.bigint(),\n                    ]),\n                )\n                .with('Decimal', () => {\n                    return z.union([\n                        this.extraValidationsEnabled\n                            ? ZodUtils.addNumberValidation(z.number(), attributes)\n                            : z.number(),\n                        ZodUtils.addDecimalValidation(z.instanceof(Decimal), attributes, this.extraValidationsEnabled),\n                        ZodUtils.addDecimalValidation(z.string(), attributes, this.extraValidationsEnabled),\n                    ]);\n                })\n                .with('DateTime', () => this.makeDateTimeValueSchema())\n                .with('Bytes', () => z.instanceof(Uint8Array))\n                .with('Json', () => this.makeJsonValueSchema())\n                .otherwise(() => z.unknown());\n        }\n    }\n\n    @cache()\n    private makeEnumSchema(_enum: string) {\n        const enumDef = getEnum(this.schema, _enum);\n        invariant(enumDef, `Enum \"${_enum}\" not found in schema`);\n        const schema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n        this.registerSchema(_enum, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeTypeDefSchema(type: string): ZodType {\n        const typeDef = getTypeDef(this.schema, type);\n        invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n        const schema = z.looseObject(\n            Object.fromEntries(\n                Object.entries(typeDef.fields).map(([field, def]) => {\n                    // Wrap nested typedef references in z.lazy() so cyclic or self-referencing\n                    // typedefs don't recurse infinitely while building schemas.\n                    let fieldSchema: ZodType = isTypeDef(this.schema, def.type)\n                        ? z.lazy(() => this.makeTypeDefSchema(def.type))\n                        : this.makeScalarSchema(def.type);\n                    if (def.array) {\n                        fieldSchema = fieldSchema.array();\n                    }\n                    if (def.optional) {\n                        fieldSchema = fieldSchema.nullish();\n                    }\n                    return [field, fieldSchema];\n                }),\n            ),\n        );\n\n        // zod doesn't preserve object field order after parsing, here we use a\n        // validation-only custom schema and use the original data if parsing\n        // is successful\n        const finalSchema = z.any().superRefine((value, ctx) => {\n            const parseResult = schema.safeParse(value);\n            if (!parseResult.success) {\n                parseResult.error.issues.forEach((issue) => ctx.addIssue(issue as any));\n            }\n        });\n\n        this.registerSchema(type, finalSchema);\n        return finalSchema;\n    }\n\n    @cache()\n    makeWhereSchema(\n        model: string,\n        unique: boolean,\n        withoutRelationFields = false,\n        withAggregations = false,\n        options?: CreateSchemaOptions,\n    ): ZodType {\n        // unique field used in unique filters bypass filter slicing\n        const uniqueFieldNames = unique\n            ? getUniqueFields(this.schema, model)\n                  .filter(\n                      (uf): uf is { name: string; def: FieldDef } =>\n                          // single-field unique\n                          'def' in uf,\n                  )\n                  .map((uf) => uf.name)\n            : undefined;\n\n        const nextOpts = this.nextOptions(options);\n\n        const fields: Record<string, any> = {};\n        for (const [field, fieldDef] of this.getModelFields(model)) {\n            let fieldSchema: ZodType | undefined;\n\n            if (fieldDef.relation) {\n                if (withoutRelationFields || !this.shouldIncludeRelations(options)) {\n                    continue;\n                }\n\n                // Check if Relation filter kind is allowed\n                const allowedFilterKinds = this.getEffectiveFilterKinds(model, field);\n                if (allowedFilterKinds && !allowedFilterKinds.includes('Relation')) {\n                    // Relation filters are not allowed for this field - use z.never()\n                    fieldSchema = z.never();\n                } else {\n                    fieldSchema = z.lazy(() =>\n                        this.makeWhereSchema(fieldDef.type, false, false, false, nextOpts).optional(),\n                    );\n\n                    if (fieldDef.array) {\n                        // to-many relation\n                        fieldSchema = z.strictObject({\n                            some: fieldSchema.optional(),\n                            every: fieldSchema.optional(),\n                            none: fieldSchema.optional(),\n                        });\n                    } else {\n                        // to-one relation\n\n                        // optional to-one relation allows null\n                        fieldSchema = this.nullableIf(fieldSchema, !fieldDef.array && !!fieldDef.optional);\n\n                        fieldSchema = z.union([\n                            fieldSchema,\n                            z.strictObject({\n                                is: fieldSchema.optional(),\n                                isNot: fieldSchema.optional(),\n                            }),\n                        ]);\n                    }\n                }\n            } else {\n                const ignoreSlicing = !!uniqueFieldNames?.includes(field);\n                const allowedFilterKinds = ignoreSlicing ? undefined : this.getEffectiveFilterKinds(model, field);\n\n                const enumDef = getEnum(this.schema, fieldDef.type);\n                if (enumDef) {\n                    // enum\n                    if (Object.keys(enumDef.values).length > 0) {\n                        fieldSchema = this.makeEnumFilterSchema(\n                            fieldDef.type,\n                            !!fieldDef.optional,\n                            !!fieldDef.array,\n                            withAggregations,\n                            allowedFilterKinds,\n                        );\n                    }\n                } else if (fieldDef.array) {\n                    // array field\n                    fieldSchema = this.makeArrayFilterSchema(fieldDef.type, allowedFilterKinds);\n                } else if (this.isTypeDefType(fieldDef.type)) {\n                    fieldSchema = this.makeTypedJsonFilterSchema(\n                        fieldDef.type,\n                        !!fieldDef.optional,\n                        !!fieldDef.array,\n                        allowedFilterKinds,\n                    );\n                } else {\n                    // primitive field\n                    fieldSchema = this.makePrimitiveFilterSchema(\n                        fieldDef.type as BuiltinType,\n                        !!fieldDef.optional,\n                        withAggregations,\n                        allowedFilterKinds,\n                        !!fieldDef.fuzzy,\n                        !!fieldDef.fullText,\n                    );\n                }\n            }\n\n            if (fieldSchema) {\n                fields[field] = fieldSchema.optional();\n            }\n        }\n\n        if (unique) {\n            // add compound unique fields, e.g. `{ id1_id2: { id1: 1, id2: 1 } }`\n            // compound-field filters are not affected by slicing\n            const uniqueFields = getUniqueFields(this.schema, model);\n            for (const uniqueField of uniqueFields) {\n                if ('defs' in uniqueField) {\n                    fields[uniqueField.name] = z\n                        .object(\n                            Object.fromEntries(\n                                Object.entries(uniqueField.defs).map(([key, def]) => {\n                                    invariant(!def.relation, 'unique field cannot be a relation');\n                                    let fieldSchema: ZodType;\n                                    const enumDef = getEnum(this.schema, def.type);\n                                    if (enumDef) {\n                                        // enum (ignoreSlicing=true → undefined allowedFilterKinds)\n                                        if (Object.keys(enumDef.values).length > 0) {\n                                            fieldSchema = this.makeEnumFilterSchema(\n                                                def.type,\n                                                !!def.optional,\n                                                !!def.array,\n                                                false,\n                                                undefined,\n                                            );\n                                        } else {\n                                            fieldSchema = z.never();\n                                        }\n                                    } else {\n                                        fieldSchema = this.makePrimitiveFilterSchema(\n                                            def.type as BuiltinType,\n                                            !!def.optional,\n                                            false,\n                                            undefined,\n                                        );\n                                    }\n                                    return [key, fieldSchema];\n                                }),\n                            ),\n                        )\n                        .optional();\n                }\n            }\n        }\n\n        // expression builder\n        fields['$expr'] = z.custom((v) => typeof v === 'function', { error: '\"$expr\" must be a function' }).optional();\n\n        // logical operators\n        fields['AND'] = this.orArray(\n            z.lazy(() => this.makeWhereSchema(model, false, withoutRelationFields, false, options)),\n            true,\n        ).optional();\n        fields['OR'] = z\n            .lazy(() => this.makeWhereSchema(model, false, withoutRelationFields, false, options))\n            .array()\n            .optional();\n        fields['NOT'] = this.orArray(\n            z.lazy(() => this.makeWhereSchema(model, false, withoutRelationFields, false, options)),\n            true,\n        ).optional();\n\n        const baseWhere = z.strictObject(fields);\n        let result: ZodType = baseWhere;\n\n        if (unique) {\n            // requires at least one unique field (field set) is required\n            const uniqueFields = getUniqueFields(this.schema, model);\n            if (uniqueFields.length === 0) {\n                throw createInternalError(`Model \"${model}\" has no unique fields`);\n            }\n\n            if (uniqueFields.length === 1) {\n                // only one unique field (set), mark the field(s) required\n                result = baseWhere.required({\n                    [uniqueFields[0]!.name]: true,\n                } as any);\n            } else {\n                result = baseWhere.refine((value) => {\n                    // check that at least one unique field is set\n                    return uniqueFields.some(({ name }) => value[name] !== undefined);\n                }, `At least one unique field or field set must be set`);\n            }\n        }\n\n        let schemaId = unique ? `${model}WhereUniqueInput` : `${model}WhereInput`;\n        if (withoutRelationFields) schemaId += 'WithoutRelation';\n        if (withAggregations) schemaId += 'WithAggregation';\n        this.registerSchema(schemaId, result);\n        return result;\n    }\n\n    @cache()\n    private makeTypedJsonFilterSchema(\n        type: string,\n        optional: boolean,\n        array: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ) {\n        const typeDef = getTypeDef(this.schema, type);\n        invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n\n        const candidates: ZodType[] = [];\n\n        if (!array) {\n            // fields filter — typedef sub-fields are not model fields, no slicing applies\n            const fieldSchemas: Record<string, ZodType> = {};\n            for (const [fieldName, fieldDef] of Object.entries(typeDef.fields)) {\n                if (this.isTypeDefType(fieldDef.type)) {\n                    fieldSchemas[fieldName] = this.makeTypedJsonFilterSchema(\n                        fieldDef.type,\n                        !!fieldDef.optional,\n                        !!fieldDef.array,\n                        undefined,\n                    ).optional();\n                } else {\n                    const enumDef = getEnum(this.schema, fieldDef.type);\n                    if (enumDef) {\n                        fieldSchemas[fieldName] = this.makeEnumFilterSchema(\n                            fieldDef.type,\n                            !!fieldDef.optional,\n                            !!fieldDef.array,\n                            false,\n                            undefined,\n                        ).optional();\n                    } else if (fieldDef.array) {\n                        fieldSchemas[fieldName] = this.makeArrayFilterSchema(fieldDef.type, undefined).optional();\n                    } else {\n                        fieldSchemas[fieldName] = this.makePrimitiveFilterSchema(\n                            fieldDef.type as BuiltinType,\n                            !!fieldDef.optional,\n                            false,\n                            undefined,\n                        ).optional();\n                    }\n                }\n            }\n\n            candidates.push(z.strictObject(fieldSchemas));\n        }\n\n        const recursiveSchema = z\n            .lazy(() => this.makeTypedJsonFilterSchema(type, optional, false, allowedFilterKinds))\n            .optional();\n        if (array) {\n            // array filter\n            candidates.push(\n                z.strictObject({\n                    some: recursiveSchema,\n                    every: recursiveSchema,\n                    none: recursiveSchema,\n                }),\n            );\n        } else {\n            // is / isNot filter\n            candidates.push(\n                z.strictObject({\n                    is: recursiveSchema,\n                    isNot: recursiveSchema,\n                }),\n            );\n        }\n\n        // plain json filter\n        candidates.push(this.makeJsonFilterSchema(optional, allowedFilterKinds));\n\n        if (optional) {\n            // allow null and null sentinel values\n            candidates.push(z.null());\n            candidates.push(z.instanceof(DbNullClass));\n            candidates.push(z.instanceof(JsonNullClass));\n            candidates.push(z.instanceof(AnyNullClass));\n        }\n\n        // either plain json filter or field filters\n        const result = z.union(candidates);\n        this.registerSchema(`${type}Filter${this.filterSchemaSuffix({ optional, array, allowedFilterKinds })}`, result);\n        return result;\n    }\n\n    // For optional typed JSON fields, allow DbNull, JsonNull, and null.\n    // z.union doesn't work here because `z.any()` (returned by `makeScalarSchema`)\n    // always wins, so we create a wrapper superRefine instead.\n    // The caller must pass the already-built fieldSchema so that array/list\n    // mutation shapes (set, push, etc.) are preserved.\n    private makeNullableTypedJsonMutationSchema(fieldSchema: z.ZodTypeAny) {\n        return z\n            .any()\n            .superRefine((value, ctx) => {\n                if (\n                    value instanceof DbNullClass ||\n                    value instanceof JsonNullClass ||\n                    value === null ||\n                    value === undefined\n                ) {\n                    return;\n                }\n                const parseResult = fieldSchema.safeParse(value);\n                if (!parseResult.success) {\n                    parseResult.error.issues.forEach((issue) => ctx.addIssue(issue as any));\n                }\n            })\n            .optional();\n    }\n\n    private isTypeDefType(type: string) {\n        return this.schema.typeDefs && type in this.schema.typeDefs;\n    }\n\n    @cache()\n    private makeEnumFilterSchema(\n        enumName: string,\n        optional: boolean,\n        array: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ) {\n        const enumDef = getEnum(this.schema, enumName);\n        invariant(enumDef, `Enum \"${enumName}\" not found in schema`);\n        const baseSchema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n        let schema: ZodType;\n        if (array) {\n            schema = this.internalMakeArrayFilterSchema(baseSchema, allowedFilterKinds);\n        } else {\n            const components = this.makeCommonPrimitiveFilterComponents(\n                baseSchema,\n                optional,\n                () =>\n                    z.lazy(() =>\n                        this.makeEnumFilterSchema(enumName, optional, array, withAggregations, allowedFilterKinds),\n                    ),\n                ['equals', 'in', 'notIn', 'not'],\n                withAggregations ? ['_count', '_min', '_max'] : undefined,\n                allowedFilterKinds,\n            );\n\n            schema = this.createUnionFilterSchema(baseSchema, optional, components, allowedFilterKinds);\n        }\n        this.registerSchema(\n            `${enumName}Filter${this.filterSchemaSuffix({ optional, array, allowedFilterKinds, withAggregations })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    @cache()\n    @cache()\n    private makeArrayFilterSchema(fieldType: string, allowedFilterKinds: string[] | undefined) {\n        const schema = this.internalMakeArrayFilterSchema(\n            this.makeScalarSchema(fieldType as BuiltinType),\n            allowedFilterKinds,\n        );\n        this.registerSchema(\n            `${fieldType}ArrayFilter${this.filterSchemaSuffix({ array: true, allowedFilterKinds })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    private internalMakeArrayFilterSchema(elementSchema: ZodType, allowedFilterKinds: string[] | undefined) {\n        const operators = {\n            equals: elementSchema.array().optional(),\n            has: elementSchema.optional(),\n            hasEvery: elementSchema.array().optional(),\n            hasSome: elementSchema.array().optional(),\n            isEmpty: z.boolean().optional(),\n        };\n\n        // Filter operators based on allowed filter kinds\n        const filteredOperators = this.trimFilterOperators(operators, allowedFilterKinds);\n\n        return z.strictObject(filteredOperators);\n    }\n\n    @cache()\n    private makePrimitiveFilterSchema(\n        type: BuiltinType,\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n        withFuzzy = false,\n        withFullText = false,\n    ) {\n        return match(type)\n            .with('String', () =>\n                this.makeStringFilterSchema(optional, withAggregations, allowedFilterKinds, withFuzzy, withFullText),\n            )\n            .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n                this.makeNumberFilterSchema(type, optional, withAggregations, allowedFilterKinds),\n            )\n            .with('Boolean', () => this.makeBooleanFilterSchema(optional, withAggregations, allowedFilterKinds))\n            .with('DateTime', () => this.makeDateTimeFilterSchema(optional, withAggregations, allowedFilterKinds))\n            .with('Bytes', () => this.makeBytesFilterSchema(optional, withAggregations, allowedFilterKinds))\n            .with('Json', () => this.makeJsonFilterSchema(optional, allowedFilterKinds))\n            .with('Unsupported', () => z.never())\n            .exhaustive();\n    }\n\n    @cache()\n    private makeJsonValueSchema(): ZodType {\n        const schema = z.union([\n            z.string(),\n            z.number(),\n            z.boolean(),\n            z.instanceof(JsonNullClass),\n            z.lazy(() => z.union([this.makeJsonValueSchema(), z.null()]).array()),\n            z.record(\n                z.string(),\n                z.lazy(() => z.union([this.makeJsonValueSchema(), z.null()])),\n            ),\n        ]);\n        this.registerSchema('JsonValue', schema);\n        return schema;\n    }\n\n    @cache()\n    private makeJsonFilterSchema(optional: boolean, allowedFilterKinds: string[] | undefined) {\n        // Check if Json filter kind is allowed\n        if (allowedFilterKinds && !allowedFilterKinds.includes('Json')) {\n            // Return a never schema if Json filters are not allowed\n            return z.never();\n        }\n\n        // Extend the base JsonValue with filter-only null sentinels, flattened into one union\n        const jsonValue = this.makeJsonValueSchema();\n        const filterMembers: ZodType[] = [jsonValue, z.instanceof(DbNullClass), z.instanceof(AnyNullClass)];\n        if (optional) filterMembers.push(z.null());\n        const filterValueSchema = z.union(filterMembers as [ZodType, ZodType, ...ZodType[]]);\n        const schema = z.strictObject({\n            path: z.string().optional(),\n            equals: filterValueSchema.optional(),\n            not: filterValueSchema.optional(),\n            string_contains: z.string().optional(),\n            string_starts_with: z.string().optional(),\n            string_ends_with: z.string().optional(),\n            mode: this.makeStringModeSchema().optional(),\n            array_contains: filterValueSchema.optional(),\n            array_starts_with: filterValueSchema.optional(),\n            array_ends_with: filterValueSchema.optional(),\n        });\n        this.registerSchema(`JsonFilter${this.filterSchemaSuffix({ optional, allowedFilterKinds })}`, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeDateTimeValueSchema(): ZodType {\n        const schema = coercedDateTimeSchema();\n        this.registerSchema('DateTime', schema);\n        return schema;\n    }\n\n    @cache()\n    private makeDateTimeFilterSchema(\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ): ZodType {\n        const filterValueSchema = this.makeDateTimeValueSchema();\n\n        const schema = this.makeCommonPrimitiveFilterSchema(\n            filterValueSchema,\n            optional,\n            () => z.lazy(() => this.makeDateTimeFilterSchema(optional, withAggregations, allowedFilterKinds)),\n            withAggregations ? ['_count', '_min', '_max'] : undefined,\n            allowedFilterKinds,\n        );\n        this.registerSchema(\n            `DateTimeFilter${this.filterSchemaSuffix({ optional, allowedFilterKinds, withAggregations })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    @cache()\n    private makeBooleanFilterSchema(\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ): ZodType {\n        const components = this.makeCommonPrimitiveFilterComponents(\n            z.boolean(),\n            optional,\n            () => z.lazy(() => this.makeBooleanFilterSchema(optional, withAggregations, allowedFilterKinds)),\n            ['equals', 'not'],\n            withAggregations ? ['_count', '_min', '_max'] : undefined,\n            allowedFilterKinds,\n        );\n\n        const schema = this.createUnionFilterSchema(z.boolean(), optional, components, allowedFilterKinds);\n        this.registerSchema(\n            `BooleanFilter${this.filterSchemaSuffix({ optional, allowedFilterKinds, withAggregations })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    @cache()\n    private makeBytesFilterSchema(\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ): ZodType {\n        const baseSchema = z.instanceof(Uint8Array);\n        const components = this.makeCommonPrimitiveFilterComponents(\n            baseSchema,\n            optional,\n            () => z.instanceof(Uint8Array),\n            ['equals', 'in', 'notIn', 'not'],\n            withAggregations ? ['_count', '_min', '_max'] : undefined,\n            allowedFilterKinds,\n        );\n\n        const schema = this.createUnionFilterSchema(baseSchema, optional, components, allowedFilterKinds);\n        this.registerSchema(\n            `BytesFilter${this.filterSchemaSuffix({ optional, allowedFilterKinds, withAggregations })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    private makeCommonPrimitiveFilterComponents(\n        baseSchema: ZodType,\n        optional: boolean,\n        makeThis: () => ZodType,\n        supportedOperators: string[] | undefined = undefined,\n        withAggregations: Array<'_count' | '_avg' | '_sum' | '_min' | '_max'> | undefined = undefined,\n        allowedFilterKinds: string[] | undefined = undefined,\n    ) {\n        const commonAggSchema = () =>\n            this.makeCommonPrimitiveFilterSchema(baseSchema, false, makeThis, undefined, allowedFilterKinds).optional();\n        let result = {\n            equals: this.nullableIf(baseSchema.optional(), optional),\n            in: baseSchema.array().optional(),\n            notIn: baseSchema.array().optional(),\n            lt: baseSchema.optional(),\n            lte: baseSchema.optional(),\n            gt: baseSchema.optional(),\n            gte: baseSchema.optional(),\n            between: baseSchema.array().length(2).optional(),\n            not: makeThis().optional(),\n            ...(withAggregations?.includes('_count')\n                ? { _count: this.makeNumberFilterSchema('Int', false, false, undefined).optional() }\n                : {}),\n            ...(withAggregations?.includes('_avg') ? { _avg: commonAggSchema() } : {}),\n            ...(withAggregations?.includes('_sum') ? { _sum: commonAggSchema() } : {}),\n            ...(withAggregations?.includes('_min') ? { _min: commonAggSchema() } : {}),\n            ...(withAggregations?.includes('_max') ? { _max: commonAggSchema() } : {}),\n        };\n        if (supportedOperators) {\n            const keys = [...supportedOperators, ...(withAggregations ?? [])];\n            result = extractFields(result, keys) as typeof result;\n        }\n\n        // Filter operators based on allowed filter kinds\n        result = this.trimFilterOperators(result, allowedFilterKinds) as typeof result;\n\n        return result;\n    }\n\n    private makeCommonPrimitiveFilterSchema(\n        baseSchema: ZodType,\n        optional: boolean,\n        makeThis: () => ZodType,\n        withAggregations: Array<AggregateOperators> | undefined = undefined,\n        allowedFilterKinds: string[] | undefined = undefined,\n    ): ZodType {\n        const components = this.makeCommonPrimitiveFilterComponents(\n            baseSchema,\n            optional,\n            makeThis,\n            undefined,\n            withAggregations,\n            allowedFilterKinds,\n        );\n\n        return this.createUnionFilterSchema(baseSchema, optional, components, allowedFilterKinds);\n    }\n\n    @cache()\n    private makeNumberFilterSchema(\n        type: 'Int' | 'Float' | 'Decimal' | 'BigInt',\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n    ): ZodType {\n        const schema = this.makeCommonPrimitiveFilterSchema(\n            this.makeScalarSchema(type),\n            optional,\n            () => z.lazy(() => this.makeNumberFilterSchema(type, optional, withAggregations, allowedFilterKinds)),\n            withAggregations ? ['_count', '_avg', '_sum', '_min', '_max'] : undefined,\n            allowedFilterKinds,\n        );\n        this.registerSchema(\n            `${type}Filter${this.filterSchemaSuffix({ optional, allowedFilterKinds, withAggregations })}`,\n            schema,\n        );\n        return schema;\n    }\n\n    @cache()\n    private makeStringFilterSchema(\n        optional: boolean,\n        withAggregations: boolean,\n        allowedFilterKinds: string[] | undefined,\n        withFuzzy = false,\n        withFullText = false,\n    ): ZodType {\n        const baseComponents = this.makeCommonPrimitiveFilterComponents(\n            z.string(),\n            optional,\n            () =>\n                z.lazy(() =>\n                    this.makeStringFilterSchema(\n                        optional,\n                        withAggregations,\n                        allowedFilterKinds,\n                        withFuzzy,\n                        withFullText,\n                    ),\n                ),\n            undefined,\n            withAggregations ? ['_count', '_min', '_max'] : undefined,\n            allowedFilterKinds,\n        );\n\n        const stringSpecificOperators = {\n            startsWith: z.string().optional(),\n            endsWith: z.string().optional(),\n            contains: z.string().optional(),\n            ...(withFuzzy && this.providerSupportsFuzzySearch\n                ? {\n                      fuzzy: this.makeFuzzyFilterSchema().optional(),\n                  }\n                : {}),\n            ...(withFullText && this.providerSupportsFullTextSearch\n                ? {\n                      fts: this.makeFullTextFilterSchema().optional(),\n                  }\n                : {}),\n            ...(this.providerSupportsCaseSensitivity\n                ? {\n                      mode: this.makeStringModeSchema().optional(),\n                  }\n                : {}),\n        };\n\n        // Filter string-specific operators based on allowed filter kinds\n        const filteredStringOperators = this.trimFilterOperators(stringSpecificOperators, allowedFilterKinds);\n\n        const allComponents = {\n            ...baseComponents,\n            ...filteredStringOperators,\n        };\n\n        const schema = this.createUnionFilterSchema(z.string(), optional, allComponents, allowedFilterKinds);\n        const featureSuffix = `${withFuzzy ? 'Fuzzy' : ''}${withFullText ? 'FullText' : ''}`;\n        this.registerSchema(\n            `StringFilter${this.filterSchemaSuffix({ optional, allowedFilterKinds, withAggregations })}${featureSuffix}`,\n            schema,\n        );\n        return schema;\n    }\n\n    private makeStringModeSchema() {\n        return z.union([z.literal('default'), z.literal('insensitive')]);\n    }\n\n    private makeFuzzyFilterSchema() {\n        return z.strictObject({\n            search: z.string().min(1),\n            mode: z.union([z.literal('simple'), z.literal('word'), z.literal('strictWord')]).default('simple'),\n            threshold: z.number().min(0).max(1).optional(),\n            unaccent: z.boolean().default(false),\n        });\n    }\n\n    private makeFullTextFilterSchema() {\n        return z.strictObject({\n            search: z.string().min(1),\n            config: z.string().min(1).optional(),\n        });\n    }\n\n    @cache()\n    private makeSelectSchema(model: string, options?: CreateSchemaOptions) {\n        const fields: Record<string, ZodType> = {};\n        for (const [field, fieldDef] of this.getModelFields(model)) {\n            if (fieldDef.relation) {\n                if (!this.shouldIncludeRelations(options)) {\n                    continue;\n                }\n                // Check if the target model is allowed by slicing configuration\n                if (this.isModelAllowed(fieldDef.type)) {\n                    fields[field] = this.makeRelationSelectIncludeSchema(model, field, options).optional();\n                }\n            } else {\n                if (this.options.allowQueryTimeOmitOverride === false && this.isFieldOmittedByConfig(model, field)) {\n                    // when query-time omit override is disallowed, an omitted field cannot be\n                    // un-omitted by explicitly selecting it, so only allow `false`\n                    fields[field] = z.literal(false).optional();\n                } else {\n                    fields[field] = z.boolean().optional();\n                }\n            }\n        }\n\n        if (this.shouldIncludeRelations(options)) {\n            const _countSchema = this.makeCountSelectionSchema(model, options);\n            if (!(_countSchema instanceof z.ZodNever)) {\n                fields['_count'] = _countSchema;\n            }\n        }\n\n        this.addExtResultFields(model, fields);\n\n        const result = z.strictObject(fields);\n        this.registerSchema(`${model}Select`, result);\n        return result;\n    }\n\n    @cache()\n    private makeCountSelectionSchema(model: string, options?: CreateSchemaOptions) {\n        const modelDef = requireModel(this.schema, model);\n        const toManyRelations = Object.values(modelDef.fields).filter((def) => def.relation && def.array);\n        if (toManyRelations.length > 0) {\n            const nextOpts = this.nextOptions(options);\n            const schema = z\n                .union([\n                    z.literal(true),\n                    z.strictObject({\n                        select: z.strictObject(\n                            toManyRelations.reduce(\n                                (acc, fieldDef) => ({\n                                    ...acc,\n                                    [fieldDef.name]: z\n                                        .union([\n                                            z.boolean(),\n                                            z.strictObject({\n                                                where: this.makeWhereSchema(\n                                                    fieldDef.type,\n                                                    false,\n                                                    false,\n                                                    false,\n                                                    nextOpts,\n                                                ),\n                                            }),\n                                        ])\n                                        .optional(),\n                                }),\n                                {} as Record<string, ZodType>,\n                            ),\n                        ),\n                    }),\n                ])\n                .optional();\n            this.registerSchema(`${model}CountSelection`, schema);\n            return schema;\n        } else {\n            return z.never();\n        }\n    }\n\n    @cache()\n    private makeRelationSelectIncludeSchema(model: string, field: string, options?: CreateSchemaOptions) {\n        const fieldDef = requireField(this.schema, model, field);\n        const nextOpts = this.nextOptions(options);\n        let objSchema: ZodType = z.strictObject({\n            ...(fieldDef.array || fieldDef.optional\n                ? {\n                      // to-many relations and optional to-one relations are filterable\n                      where: z\n                          .lazy(() => this.makeWhereSchema(fieldDef.type, false, false, false, nextOpts))\n                          .optional(),\n                  }\n                : {}),\n            select: z\n                .lazy(() => this.makeSelectSchema(fieldDef.type, nextOpts))\n                .optional()\n                .nullable(),\n            include: z\n                .lazy(() => this.makeIncludeSchema(fieldDef.type, nextOpts))\n                .optional()\n                .nullable(),\n            omit: z\n                .lazy(() => this.makeOmitSchema(fieldDef.type))\n                .optional()\n                .nullable(),\n            ...(fieldDef.array\n                ? {\n                      // to-many relations can be ordered, skipped, taken, and cursor-located\n                      orderBy: z\n                          .lazy(() => this.orArray(this.makeOrderBySchema(fieldDef.type, true, false, nextOpts), true))\n                          .optional(),\n                      skip: this.makeSkipSchema().optional(),\n                      take: this.makeTakeSchema().optional(),\n                      cursor: this.makeCursorSchema(fieldDef.type, nextOpts).optional(),\n                      distinct: this.makeDistinctSchema(fieldDef.type).optional(),\n                  }\n                : {}),\n        });\n\n        objSchema = this.refineForSelectIncludeMutuallyExclusive(objSchema);\n        objSchema = this.refineForSelectOmitMutuallyExclusive(objSchema);\n        objSchema = this.refineForSelectHasTruthyField(objSchema);\n\n        const result = z.union([z.boolean(), objSchema]);\n        this.registerSchema(`${model}${upperCaseFirst(field)}RelationInput`, result);\n        return result;\n    }\n\n    /**\n     * Determines whether a field is configured to be omitted at the schema or client-options level\n     * (query-level omit is excluded as it's mutually exclusive with `select`).\n     */\n    private isFieldOmittedByConfig(model: string, field: string): boolean {\n        // options-level omit\n        const omitConfig =\n            (this.options.omit as Record<string, any> | undefined)?.[lowerCaseFirst(model)] ??\n            (this.options.omit as Record<string, any> | undefined)?.[model];\n        if (omitConfig && typeof omitConfig[field] === 'boolean') {\n            return omitConfig[field];\n        }\n\n        // schema-level omit\n        const fieldDef = requireField(this.schema, model, field);\n        return !!fieldDef.omit;\n    }\n\n    @cache()\n    private makeOmitSchema(model: string) {\n        const fields: Record<string, ZodType> = {};\n        for (const [field, fieldDef] of this.getModelFields(model)) {\n            if (!fieldDef.relation) {\n                if (this.options.allowQueryTimeOmitOverride !== false) {\n                    // if override is allowed, use boolean\n                    fields[field] = z.boolean().optional();\n                } else {\n                    // otherwise only allow true\n                    fields[field] = z.literal(true).optional();\n                }\n            }\n        }\n\n        this.addExtResultFields(model, fields);\n\n        const result = z.strictObject(fields);\n        this.registerSchema(`${model}OmitInput`, result);\n        return result;\n    }\n\n    private addExtResultFields(model: string, fields: Record<string, ZodType>) {\n        for (const plugin of this.plugins) {\n            const resultConfig = plugin.result;\n            if (resultConfig) {\n                const modelConfig = resultConfig[lowerCaseFirst(model)];\n                if (modelConfig) {\n                    for (const field of Object.keys(modelConfig)) {\n                        fields[field] = z.boolean().optional();\n                    }\n                }\n            }\n        }\n    }\n\n    @cache()\n    private makeIncludeSchema(model: string, options?: CreateSchemaOptions) {\n        const modelDef = requireModel(this.schema, model);\n        const fields: Record<string, ZodType> = {};\n        for (const field of Object.keys(modelDef.fields)) {\n            const fieldDef = requireField(this.schema, model, field);\n            if (fieldDef.relation) {\n                if (!this.shouldIncludeRelations(options)) {\n                    continue;\n                }\n                // Check if the target model is allowed by slicing configuration\n                if (this.isModelAllowed(fieldDef.type)) {\n                    fields[field] = this.makeRelationSelectIncludeSchema(model, field, options).optional();\n                }\n            }\n        }\n\n        if (this.shouldIncludeRelations(options)) {\n            const _countSchema = this.makeCountSelectionSchema(model, options);\n            if (!(_countSchema instanceof z.ZodNever)) {\n                fields['_count'] = _countSchema;\n            }\n        }\n\n        const result = z.strictObject(fields);\n        this.registerSchema(`${model}Include`, result);\n        return result;\n    }\n\n    @cache()\n    private makeOrderBySchema(\n        model: string,\n        withRelation: boolean,\n        WithAggregation: boolean,\n        options?: CreateSchemaOptions,\n    ) {\n        const fields: Record<string, ZodType> = {};\n        const sort = z.union([z.literal('asc'), z.literal('desc')]);\n        const refineAtMostOneKey = (s: ZodObject) =>\n            s.refine((v: object) => Object.keys(v).length <= 1, {\n                message: 'Each orderBy element must have at most one key',\n            });\n        const nextOpts = this.nextOptions(options);\n        for (const [field, fieldDef] of this.getModelFields(model)) {\n            if (fieldDef.relation) {\n                // relations\n                if (withRelation && this.shouldIncludeRelations(options)) {\n                    fields[field] = z\n                        .lazy(() => {\n                            let relationOrderBy = this.makeOrderBySchema(\n                                fieldDef.type,\n                                withRelation,\n                                WithAggregation,\n                                nextOpts,\n                            );\n                            if (fieldDef.array) {\n                                // safeExtend drops existing refinements, so re-apply after extending\n                                relationOrderBy = refineAtMostOneKey(relationOrderBy.safeExtend({ _count: sort }));\n                            }\n                            return relationOrderBy;\n                        })\n                        .optional();\n                }\n            } else {\n                // scalars\n                if (fieldDef.optional) {\n                    fields[field] = z\n                        .union([\n                            sort,\n                            z.strictObject({\n                                sort,\n                                nulls: z.union([z.literal('first'), z.literal('last')]).optional(),\n                            }),\n                        ])\n                        .optional();\n                } else {\n                    fields[field] = sort.optional();\n                }\n            }\n        }\n\n        // aggregations\n        if (WithAggregation) {\n            const aggregationFields = ['_count', '_avg', '_sum', '_min', '_max'];\n            for (const agg of aggregationFields) {\n                fields[agg] = z.lazy(() => this.makeOrderBySchema(model, true, false, options).optional());\n            }\n        }\n\n        // _fuzzyRelevance ordering for fuzzy search — only fields annotated with `@fuzzy` (postgres only).\n        if (this.providerSupportsFuzzySearch) {\n            const fuzzyFieldNames = this.getModelFields(model)\n                .filter(([, def]) => !def.relation && def.type === 'String' && def.fuzzy === true)\n                .map(([name]) => name);\n            if (fuzzyFieldNames.length > 0) {\n                fields['_fuzzyRelevance'] = z\n                    .strictObject({\n                        fields: z.array(z.enum(fuzzyFieldNames as [string, ...string[]])).min(1),\n                        search: z.string(),\n                        mode: z\n                            .union([z.literal('simple'), z.literal('word'), z.literal('strictWord')])\n                            .default('simple'),\n                        unaccent: z.boolean().default(false),\n                        sort,\n                    })\n                    .optional();\n            }\n        }\n\n        // _ftsRelevance ordering for full-text search — only fields annotated with `@fullText` (postgres only).\n        if (this.providerSupportsFullTextSearch) {\n            const fullTextFieldNames = this.getModelFields(model)\n                .filter(([, def]) => !def.relation && def.type === 'String' && def.fullText === true)\n                .map(([name]) => name);\n            if (fullTextFieldNames.length > 0) {\n                fields['_ftsRelevance'] = z\n                    .strictObject({\n                        fields: z.array(z.enum(fullTextFieldNames as [string, ...string[]])).min(1),\n                        search: z.string().min(1),\n                        config: z.string().min(1).optional(),\n                        sort,\n                    })\n                    .optional();\n            }\n        }\n\n        const schema = refineAtMostOneKey(z.strictObject(fields));\n\n        let schemaId = `${model}OrderBy`;\n        if (withRelation) schemaId += 'WithRelation';\n        if (WithAggregation) schemaId += 'WithAggregation';\n        schemaId += 'Input';\n        this.registerSchema(schemaId, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeDistinctSchema(model: string) {\n        const nonRelationFields = this.getModelFields(model)\n            .filter(([, def]) => !def.relation)\n            .map(([name]) => name);\n        const schema = nonRelationFields.length > 0 ? this.orArray(z.enum(nonRelationFields as any), true) : z.never();\n        this.registerSchema(`${model}DistinctInput`, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeCursorSchema(model: string, options?: CreateSchemaOptions) {\n        const schema = this.makeWhereSchema(model, true, true, false, options).optional();\n        this.registerSchema(`${model}CursorInput`, schema);\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Create\n\n    @cache()\n    makeCreateSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<CreateArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const dataSchema = this.makeCreateDataSchema(model, false, [], false, options);\n        const baseSchema = z.strictObject({\n            data: dataSchema,\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            include: this.makeIncludeSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        let schema: ZodType = this.mergePluginArgsSchema(baseSchema, 'create');\n        schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n        schema = this.refineForSelectOmitMutuallyExclusive(schema);\n        schema = this.refineForSelectHasTruthyField(schema);\n        this.registerSchema(`${model}CreateArgs`, schema);\n        return schema as ZodType<CreateArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    @cache()\n    makeCreateManySchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<CreateManyArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const result = this.mergePluginArgsSchema(\n            this.makeCreateManyPayloadSchema(model, [], options),\n            'createMany',\n        ) as unknown as ZodType<CreateManyArgs<Schema, Model, Options, ExtQueryArgs>>;\n        this.registerSchema(`${model}CreateManyArgs`, result);\n        return result;\n    }\n\n    @cache()\n    makeCreateManyAndReturnSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<CreateManyAndReturnArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const base = this.makeCreateManyPayloadSchema(model, [], options);\n        let result: ZodObject = base.extend({\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        result = this.mergePluginArgsSchema(result, 'createManyAndReturn');\n        const schema = this.refineForSelectHasTruthyField(\n            this.refineForSelectOmitMutuallyExclusive(result),\n        ).optional() as ZodType<CreateManyAndReturnArgs<Schema, Model, Options, ExtQueryArgs>>;\n        this.registerSchema(`${model}CreateManyAndReturnArgs`, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeCreateDataSchema(\n        model: string,\n        canBeArray: boolean,\n        withoutFields: string[] = [],\n        withoutRelationFields = false,\n        options?: CreateSchemaOptions,\n    ) {\n        const skipRelations = withoutRelationFields || !this.shouldIncludeRelations(options);\n        const uncheckedVariantFields: Record<string, ZodType> = {};\n        const checkedVariantFields: Record<string, ZodType> = {};\n        const modelDef = requireModel(this.schema, model);\n        const modelFields = this.getModelFields(model);\n        const hasRelation =\n            !skipRelations && modelFields.some(([f, def]) => !withoutFields.includes(f) && def.relation);\n\n        const nextOpts = this.nextOptions(options);\n\n        modelFields.forEach(([field, fieldDef]) => {\n            if (withoutFields.includes(field)) {\n                return;\n            }\n\n            // skip computed fields and discriminator fields\n            if (fieldDef.computed || fieldDef.isDiscriminator) {\n                return;\n            }\n\n            if (fieldDef.relation) {\n                if (skipRelations) {\n                    return;\n                }\n                // Check if the target model is allowed by slicing configuration\n                if (!this.isModelAllowed(fieldDef.type)) {\n                    return;\n                }\n                const excludeFields: string[] = [];\n                const oppositeField = fieldDef.relation.opposite;\n                if (oppositeField) {\n                    excludeFields.push(oppositeField);\n                    const oppositeFieldDef = requireField(this.schema, fieldDef.type, oppositeField);\n                    if (oppositeFieldDef.relation?.fields) {\n                        excludeFields.push(...oppositeFieldDef.relation.fields);\n                    }\n                }\n\n                let fieldSchema: ZodType = z.lazy(() =>\n                    this.makeRelationManipulationSchema(model, field, excludeFields, 'create', nextOpts),\n                );\n\n                if (fieldDef.optional || fieldDef.array) {\n                    // optional or array relations are optional\n                    fieldSchema = fieldSchema.optional();\n                } else {\n                    // if all fk fields are optional, the relation is optional\n                    let allFksOptional = false;\n                    if (fieldDef.relation.fields) {\n                        allFksOptional = fieldDef.relation.fields.every((f) => {\n                            const fkDef = requireField(this.schema, model, f);\n                            return fkDef.optional || fieldHasDefaultValue(fkDef);\n                        });\n                    }\n                    if (allFksOptional) {\n                        fieldSchema = fieldSchema.optional();\n                    }\n                }\n\n                // optional to-one relation can be null\n                if (fieldDef.optional && !fieldDef.array) {\n                    fieldSchema = fieldSchema.nullable();\n                }\n                checkedVariantFields[field] = fieldSchema;\n                if (fieldDef.array || !fieldDef.relation.references) {\n                    // non-owned relation\n                    uncheckedVariantFields[field] = fieldSchema;\n                }\n            } else {\n                let fieldSchema = this.makeScalarSchema(fieldDef.type, fieldDef.attributes);\n\n                if (fieldDef.array) {\n                    fieldSchema = ZodUtils.addListValidation(fieldSchema.array(), fieldDef.attributes);\n                    fieldSchema = z\n                        .union([\n                            fieldSchema,\n                            z.strictObject({\n                                set: fieldSchema,\n                            }),\n                        ])\n                        .optional();\n                }\n\n                if (fieldDef.optional || fieldHasDefaultValue(fieldDef)) {\n                    fieldSchema = fieldSchema.optional();\n                }\n\n                if (fieldDef.optional) {\n                    if (fieldDef.type === 'Json') {\n                        // DbNull for Json fields\n                        fieldSchema = z.union([fieldSchema, z.instanceof(DbNullClass)]);\n                    } else if (this.isTypeDefType(fieldDef.type)) {\n                        fieldSchema = this.makeNullableTypedJsonMutationSchema(fieldSchema);\n                    } else {\n                        fieldSchema = fieldSchema.nullable();\n                    }\n                }\n\n                uncheckedVariantFields[field] = fieldSchema;\n                if (!fieldDef.foreignKeyFor) {\n                    // non-fk field\n                    checkedVariantFields[field] = fieldSchema;\n                }\n            }\n        });\n\n        const uncheckedCreateSchema = this.extraValidationsEnabled\n            ? ZodUtils.addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n            : z.strictObject(uncheckedVariantFields);\n        const checkedCreateSchema = this.extraValidationsEnabled\n            ? ZodUtils.addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n            : z.strictObject(checkedVariantFields);\n\n        const result = !hasRelation\n            ? this.orArray(uncheckedCreateSchema, canBeArray)\n            : z.union([\n                  uncheckedCreateSchema,\n                  checkedCreateSchema,\n                  ...(canBeArray ? [z.array(uncheckedCreateSchema)] : []),\n                  ...(canBeArray ? [z.array(checkedCreateSchema)] : []),\n              ]);\n\n        const idParts = [`${model}CreateData`];\n        if (canBeArray) idParts.push('Array');\n        if (withoutRelationFields) idParts.push('WithoutRelation');\n        if (withoutFields.length) idParts.push(`Without${withoutFields.slice().sort().join('')}`);\n        this.registerSchema(idParts.join(''), result);\n        return result;\n    }\n\n    @cache()\n    private makeRelationManipulationSchema(\n        model: string,\n        field: string,\n        withoutFields: string[],\n        mode: 'create' | 'update',\n        options?: CreateSchemaOptions,\n    ) {\n        const fieldDef = requireField(this.schema, model, field);\n        const fieldType = fieldDef.type;\n        const array = !!fieldDef.array;\n        const canCreateModel = this.canCreateModel(fieldType);\n        const fields: Record<string, ZodType> = {\n            connect: this.makeConnectDataSchema(fieldType, array, options).optional(),\n        };\n\n        if (canCreateModel) {\n            fields['create'] = this.makeCreateDataSchema(\n                fieldDef.type,\n                !!fieldDef.array,\n                withoutFields,\n                false,\n                options,\n            ).optional();\n            fields['connectOrCreate'] = this.makeConnectOrCreateDataSchema(\n                fieldType,\n                array,\n                withoutFields,\n                options,\n            ).optional();\n        }\n\n        if (array && canCreateModel) {\n            fields['createMany'] = this.makeCreateManyPayloadSchema(fieldType, withoutFields, options).optional();\n        }\n\n        if (mode === 'update') {\n            if (fieldDef.optional || fieldDef.array) {\n                // disconnect and delete are only available for optional/to-many relations\n                fields['disconnect'] = this.makeDisconnectDataSchema(fieldType, array, options).optional();\n\n                fields['delete'] = this.makeDeleteRelationDataSchema(fieldType, array, true, options).optional();\n            }\n\n            fields['update'] = array\n                ? this.orArray(\n                      z.strictObject({\n                          where: this.makeWhereSchema(fieldType, true, false, false, options),\n                          data: this.makeUpdateDataSchema(fieldType, withoutFields, false, options),\n                      }),\n                      true,\n                  ).optional()\n                : z\n                      .union([\n                          z.strictObject({\n                              where: this.makeWhereSchema(fieldType, false, false, false, options).optional(),\n                              data: this.makeUpdateDataSchema(fieldType, withoutFields, false, options),\n                          }),\n                          this.makeUpdateDataSchema(fieldType, withoutFields, false, options),\n                      ])\n                      .optional();\n\n            if (canCreateModel) {\n                let upsertWhere = this.makeWhereSchema(fieldType, true, false, false, options);\n                if (!fieldDef.array) {\n                    // to-one relation, can upsert without where clause\n                    upsertWhere = upsertWhere.optional();\n                }\n                fields['upsert'] = this.orArray(\n                    z.strictObject({\n                        where: upsertWhere,\n                        create: this.makeCreateDataSchema(fieldType, false, withoutFields, false, options),\n                        update: this.makeUpdateDataSchema(fieldType, withoutFields, false, options),\n                    }),\n                    true,\n                ).optional();\n            }\n\n            if (array) {\n                // to-many relation specifics\n                fields['set'] = this.makeSetDataSchema(fieldType, true, options).optional();\n\n                fields['updateMany'] = this.orArray(\n                    z.strictObject({\n                        where: this.makeWhereSchema(fieldType, false, true, false, options),\n                        data: this.makeUpdateDataSchema(fieldType, withoutFields, false, options),\n                    }),\n                    true,\n                ).optional();\n\n                fields['deleteMany'] = this.makeDeleteRelationDataSchema(fieldType, true, false, options).optional();\n            }\n        }\n\n        return z.strictObject(fields);\n    }\n\n    @cache()\n    private makeSetDataSchema(model: string, canBeArray: boolean, options?: CreateSchemaOptions) {\n        return this.orArray(this.makeWhereSchema(model, true, false, false, options), canBeArray);\n    }\n\n    @cache()\n    private makeConnectDataSchema(model: string, canBeArray: boolean, options?: CreateSchemaOptions) {\n        return this.orArray(this.makeWhereSchema(model, true, false, false, options), canBeArray);\n    }\n\n    @cache()\n    private makeDisconnectDataSchema(model: string, canBeArray: boolean, options?: CreateSchemaOptions) {\n        if (canBeArray) {\n            // to-many relation, must be unique filters\n            return this.orArray(this.makeWhereSchema(model, true, false, false, options), canBeArray);\n        } else {\n            // to-one relation, can be boolean or a regular filter - the entity\n            // being disconnected is already uniquely identified by its parent\n            return z.union([z.boolean(), this.makeWhereSchema(model, false, false, false, options)]);\n        }\n    }\n\n    @cache()\n    private makeDeleteRelationDataSchema(\n        model: string,\n        toManyRelation: boolean,\n        uniqueFilter: boolean,\n        options?: CreateSchemaOptions,\n    ) {\n        return toManyRelation\n            ? this.orArray(this.makeWhereSchema(model, uniqueFilter, false, false, options), true)\n            : z.union([z.boolean(), this.makeWhereSchema(model, uniqueFilter, false, false, options)]);\n    }\n\n    @cache()\n    private makeConnectOrCreateDataSchema(\n        model: string,\n        canBeArray: boolean,\n        withoutFields: string[],\n        options?: CreateSchemaOptions,\n    ) {\n        const whereSchema = this.makeWhereSchema(model, true, false, false, options);\n        const createSchema = this.makeCreateDataSchema(model, false, withoutFields, false, options);\n        return this.orArray(\n            z.strictObject({\n                where: whereSchema,\n                create: createSchema,\n            }),\n            canBeArray,\n        );\n    }\n\n    @cache()\n    private makeCreateManyPayloadSchema(model: string, withoutFields: string[], options?: CreateSchemaOptions) {\n        const schema = z.strictObject({\n            data: this.makeCreateDataSchema(model, true, withoutFields, true, options),\n            skipDuplicates: z.boolean().optional(),\n        });\n        const idParts = [`${model}CreateManyPayload`];\n        if (withoutFields.length) idParts.push(`Without${withoutFields.slice().sort().join('')}`);\n        this.registerSchema(idParts.join(''), schema);\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Update\n\n    @cache()\n    makeUpdateSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<UpdateArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const baseSchema = z.strictObject({\n            where: this.makeWhereSchema(model, true, false, false, options),\n            data: this.makeUpdateDataSchema(model, [], false, options),\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            include: this.makeIncludeSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        let schema: ZodType = this.mergePluginArgsSchema(baseSchema, 'update');\n        schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n        schema = this.refineForSelectOmitMutuallyExclusive(schema);\n        schema = this.refineForSelectHasTruthyField(schema);\n        this.registerSchema(`${model}UpdateArgs`, schema);\n        return schema as ZodType<UpdateArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    @cache()\n    makeUpdateManySchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<UpdateManyArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const result = this.mergePluginArgsSchema(\n            z.strictObject({\n                where: this.makeWhereSchema(model, false, false, false, options).optional(),\n                data: this.makeUpdateDataSchema(model, [], true, options),\n                limit: z.number().int().nonnegative().optional(),\n            }),\n            'updateMany',\n        ) as unknown as ZodType<UpdateManyArgs<Schema, Model, Options, ExtQueryArgs>>;\n        this.registerSchema(`${model}UpdateManyArgs`, result);\n        return result;\n    }\n\n    @cache()\n    makeUpdateManyAndReturnSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<UpdateManyAndReturnArgs<Schema, Model, Options, ExtQueryArgs>> {\n        // plugin extended args schema is merged in `makeUpdateManySchema`\n        const baseSchema = this.makeUpdateManySchema(model, options) as unknown as ZodObject;\n        let schema: ZodType = baseSchema.extend({\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        schema = this.refineForSelectOmitMutuallyExclusive(schema);\n        schema = this.refineForSelectHasTruthyField(schema);\n        this.registerSchema(`${model}UpdateManyAndReturnArgs`, schema);\n        return schema as ZodType<UpdateManyAndReturnArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    @cache()\n    makeUpsertSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<UpsertArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const baseSchema = z.strictObject({\n            where: this.makeWhereSchema(model, true, false, false, options),\n            create: this.makeCreateDataSchema(model, false, [], false, options),\n            update: this.makeUpdateDataSchema(model, [], false, options),\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            include: this.makeIncludeSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        let schema: ZodType = this.mergePluginArgsSchema(baseSchema, 'upsert');\n        schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n        schema = this.refineForSelectOmitMutuallyExclusive(schema);\n        schema = this.refineForSelectHasTruthyField(schema);\n        this.registerSchema(`${model}UpsertArgs`, schema);\n        return schema as ZodType<UpsertArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    @cache()\n    private makeUpdateDataSchema(\n        model: string,\n        withoutFields: string[] = [],\n        withoutRelationFields = false,\n        options?: CreateSchemaOptions,\n    ) {\n        const skipRelations = withoutRelationFields || !this.shouldIncludeRelations(options);\n        const uncheckedVariantFields: Record<string, ZodType> = {};\n        const checkedVariantFields: Record<string, ZodType> = {};\n        const modelDef = requireModel(this.schema, model);\n        const modelFields = this.getModelFields(model);\n        const hasRelation =\n            !skipRelations && modelFields.some(([key, value]) => value.relation && !withoutFields.includes(key));\n\n        const nextOpts = this.nextOptions(options);\n\n        modelFields.forEach(([field, fieldDef]) => {\n            if (withoutFields.includes(field)) {\n                return;\n            }\n\n            // skip computed fields and discriminator fields\n            if (fieldDef.computed || fieldDef.isDiscriminator) {\n                return;\n            }\n\n            if (fieldDef.relation) {\n                if (skipRelations) {\n                    return;\n                }\n                // Check if the target model is allowed by slicing configuration\n                if (!this.isModelAllowed(fieldDef.type)) {\n                    return;\n                }\n                const excludeFields: string[] = [];\n                const oppositeField = fieldDef.relation.opposite;\n                if (oppositeField) {\n                    excludeFields.push(oppositeField);\n                    const oppositeFieldDef = requireField(this.schema, fieldDef.type, oppositeField);\n                    if (oppositeFieldDef.relation?.fields) {\n                        excludeFields.push(...oppositeFieldDef.relation.fields);\n                    }\n                }\n                let fieldSchema: ZodType = z\n                    .lazy(() => this.makeRelationManipulationSchema(model, field, excludeFields, 'update', nextOpts))\n                    .optional();\n                // optional to-one relation can be null\n                if (fieldDef.optional && !fieldDef.array) {\n                    fieldSchema = fieldSchema.nullable();\n                }\n                checkedVariantFields[field] = fieldSchema;\n                if (fieldDef.array || !fieldDef.relation.references) {\n                    // non-owned relation\n                    uncheckedVariantFields[field] = fieldSchema;\n                }\n            } else {\n                let fieldSchema = this.makeScalarSchema(fieldDef.type, fieldDef.attributes);\n\n                if (this.isNumericField(fieldDef)) {\n                    fieldSchema = z.union([\n                        fieldSchema,\n                        z\n                            .object({\n                                // TODO: use Decimal/BigInt for incremental updates\n                                set: this.nullableIf(z.number().optional(), !!fieldDef.optional).optional(),\n                                increment: z.number().optional(),\n                                decrement: z.number().optional(),\n                                multiply: z.number().optional(),\n                                divide: z.number().optional(),\n                            })\n                            .refine(\n                                (v) => Object.keys(v).length === 1,\n                                'Only one of \"set\", \"increment\", \"decrement\", \"multiply\", or \"divide\" can be provided',\n                            ),\n                    ]);\n                }\n\n                if (fieldDef.array) {\n                    const arraySchema = ZodUtils.addListValidation(fieldSchema.array(), fieldDef.attributes);\n                    fieldSchema = z.union([\n                        arraySchema,\n                        z\n                            .object({\n                                set: arraySchema.optional(),\n                                push: z.union([fieldSchema, fieldSchema.array()]).optional(),\n                            })\n                            .refine((v) => Object.keys(v).length === 1, 'Only one of \"set\", \"push\" can be provided'),\n                    ]);\n                }\n\n                if (fieldDef.optional) {\n                    if (fieldDef.type === 'Json') {\n                        // DbNull for Json fields\n                        fieldSchema = z.union([fieldSchema, z.instanceof(DbNullClass)]);\n                    } else if (this.isTypeDefType(fieldDef.type)) {\n                        fieldSchema = this.makeNullableTypedJsonMutationSchema(fieldSchema);\n                    } else {\n                        fieldSchema = fieldSchema.nullable();\n                    }\n                }\n\n                // all fields are optional in update\n                fieldSchema = fieldSchema.optional();\n\n                uncheckedVariantFields[field] = fieldSchema;\n                if (!fieldDef.foreignKeyFor) {\n                    // non-fk field\n                    checkedVariantFields[field] = fieldSchema;\n                }\n            }\n        });\n\n        const uncheckedUpdateSchema = this.extraValidationsEnabled\n            ? ZodUtils.addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n            : z.strictObject(uncheckedVariantFields);\n        const checkedUpdateSchema = this.extraValidationsEnabled\n            ? ZodUtils.addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n            : z.strictObject(checkedVariantFields);\n        const result = !hasRelation ? uncheckedUpdateSchema : z.union([uncheckedUpdateSchema, checkedUpdateSchema]);\n\n        const idParts = [`${model}UpdateData`];\n        if (withoutRelationFields) idParts.push('WithoutRelation');\n        if (withoutFields.length) idParts.push(`Without${withoutFields.slice().sort().join('')}`);\n        this.registerSchema(idParts.join(''), result);\n        return result;\n    }\n\n    // #endregion\n\n    // #region Delete\n\n    @cache()\n    makeDeleteSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<DeleteArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const baseSchema = z.strictObject({\n            where: this.makeWhereSchema(model, true, false, false, options),\n            select: this.makeSelectSchema(model, options).optional().nullable(),\n            include: this.makeIncludeSchema(model, options).optional().nullable(),\n            omit: this.makeOmitSchema(model).optional().nullable(),\n        });\n        let schema: ZodType = this.mergePluginArgsSchema(baseSchema, 'delete');\n        schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n        schema = this.refineForSelectOmitMutuallyExclusive(schema);\n        schema = this.refineForSelectHasTruthyField(schema);\n        this.registerSchema(`${model}DeleteArgs`, schema);\n        return schema as ZodType<DeleteArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    @cache()\n    makeDeleteManySchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<DeleteManyArgs<Schema, Model, Options, ExtQueryArgs> | undefined> {\n        const result = this.mergePluginArgsSchema(\n            z.strictObject({\n                where: this.makeWhereSchema(model, false, false, false, options).optional(),\n                limit: z.number().int().nonnegative().optional(),\n            }),\n            'deleteMany',\n        ).optional() as unknown as ZodType<DeleteManyArgs<Schema, Model, Options, ExtQueryArgs> | undefined>;\n        this.registerSchema(`${model}DeleteManyArgs`, result);\n        return result;\n    }\n\n    // #endregion\n\n    // #region Count\n\n    @cache()\n    makeCountSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<CountArgs<Schema, Model, Options, ExtQueryArgs> | undefined> {\n        const result = this.mergePluginArgsSchema(\n            z.strictObject({\n                where: this.makeWhereSchema(model, false, false, false, options).optional(),\n                skip: this.makeSkipSchema().optional(),\n                take: this.makeTakeSchema().optional(),\n                orderBy: this.orArray(this.makeOrderBySchema(model, true, false, options), true).optional(),\n                select: this.makeCountAggregateInputSchema(model).optional(),\n            }),\n            'count',\n        ).optional() as ZodType<CountArgs<Schema, Model, Options, ExtQueryArgs> | undefined>;\n        this.registerSchema(`${model}CountArgs`, result);\n        return result;\n    }\n\n    @cache()\n    private makeCountAggregateInputSchema(model: string) {\n        const schema = z.union([\n            z.literal(true),\n            z.strictObject({\n                _all: z.literal(true).optional(),\n                ...this.getModelFields(model).reduce(\n                    (acc, [field]) => {\n                        acc[field] = z.literal(true).optional();\n                        return acc;\n                    },\n                    {} as Record<string, ZodType>,\n                ),\n            }),\n        ]);\n        this.registerSchema(`${model}CountAggregateInput`, schema);\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Aggregate\n\n    @cache()\n    makeAggregateSchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<AggregateArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const result = this.mergePluginArgsSchema(\n            z.strictObject({\n                where: this.makeWhereSchema(model, false, false, false, options).optional(),\n                skip: this.makeSkipSchema().optional(),\n                take: this.makeTakeSchema().optional(),\n                orderBy: this.orArray(this.makeOrderBySchema(model, true, false, options), true).optional(),\n                _count: this.makeCountAggregateInputSchema(model).optional(),\n                _avg: this.makeSumAvgInputSchema(model).optional(),\n                _sum: this.makeSumAvgInputSchema(model).optional(),\n                _min: this.makeMinMaxInputSchema(model).optional(),\n                _max: this.makeMinMaxInputSchema(model).optional(),\n            }),\n            'aggregate',\n        ) as unknown as ZodType<AggregateArgs<Schema, Model, Options, ExtQueryArgs>>;\n        this.registerSchema(`${model}AggregateArgs`, result);\n        return result;\n    }\n\n    @cache()\n    private makeSumAvgInputSchema(model: string) {\n        const schema = z.strictObject(\n            this.getModelFields(model).reduce(\n                (acc, [field, fieldDef]) => {\n                    if (this.isNumericField(fieldDef)) {\n                        acc[field] = z.literal(true).optional();\n                    }\n                    return acc;\n                },\n                {} as Record<string, ZodType>,\n            ),\n        );\n        this.registerSchema(`${model}SumAvgAggregateInput`, schema);\n        return schema;\n    }\n\n    @cache()\n    private makeMinMaxInputSchema(model: string) {\n        const schema = z.strictObject(\n            this.getModelFields(model).reduce(\n                (acc, [field, fieldDef]) => {\n                    if (!fieldDef.relation && !fieldDef.array) {\n                        acc[field] = z.literal(true).optional();\n                    }\n                    return acc;\n                },\n                {} as Record<string, ZodType>,\n            ),\n        );\n        this.registerSchema(`${model}MinMaxAggregateInput`, schema);\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Group By\n\n    @cache()\n    makeGroupBySchema<Model extends GetModels<Schema>>(\n        model: Model,\n        options?: CreateSchemaOptions,\n    ): ZodType<GroupByArgs<Schema, Model, Options, ExtQueryArgs>> {\n        const nonRelationFields = this.getModelFields(model)\n            .filter(([, def]) => !def.relation)\n            .map(([name]) => name);\n        const bySchema =\n            nonRelationFields.length > 0\n                ? this.orArray(z.enum(nonRelationFields as [string, ...string[]]), true)\n                : z.never();\n\n        const baseSchema = z.strictObject({\n            where: this.makeWhereSchema(model, false, false, false, options).optional(),\n            orderBy: this.orArray(this.makeOrderBySchema(model, false, true, options), true).optional(),\n            by: bySchema,\n            having: this.makeHavingSchema(model, options).optional(),\n            skip: this.makeSkipSchema().optional(),\n            take: this.makeTakeSchema().optional(),\n            _count: this.makeCountAggregateInputSchema(model).optional(),\n            _avg: this.makeSumAvgInputSchema(model).optional(),\n            _sum: this.makeSumAvgInputSchema(model).optional(),\n            _min: this.makeMinMaxInputSchema(model).optional(),\n            _max: this.makeMinMaxInputSchema(model).optional(),\n        });\n\n        let schema: ZodType = this.mergePluginArgsSchema(baseSchema, 'groupBy');\n\n        // fields used in `having` must be either in the `by` list, or aggregations\n        schema = schema.refine((value: any) => {\n            const bys = enumerate(value.by);\n            if (value.having && typeof value.having === 'object') {\n                for (const [key, val] of Object.entries(value.having)) {\n                    if (AggregateOperators.includes(key as any)) {\n                        continue;\n                    }\n                    if (bys.includes(key)) {\n                        continue;\n                    }\n                    // we have a key not mentioned in `by`, in this case it must only use\n                    // aggregations in the condition\n\n                    // 1. payload must be an object\n                    if (!val || typeof val !== 'object') {\n                        return false;\n                    }\n                    // 2. payload must only contain aggregations\n                    if (!this.onlyAggregationFields(val)) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        }, 'fields in \"having\" must be in \"by\"');\n\n        // fields used in `orderBy` must be either in the `by` list, or aggregations\n        schema = schema.refine((value: any) => {\n            const bys = enumerate(value.by);\n            for (const orderBy of enumerate(value.orderBy)) {\n                if (\n                    orderBy &&\n                    Object.keys(orderBy)\n                        .filter((f) => !AggregateOperators.includes(f as AggregateOperators))\n                        .some((key) => !bys.includes(key))\n                ) {\n                    return false;\n                }\n            }\n            return true;\n        }, 'fields in \"orderBy\" must be in \"by\"');\n\n        this.registerSchema(`${model}GroupByArgs`, schema);\n        return schema as ZodType<GroupByArgs<Schema, Model, Options, ExtQueryArgs>>;\n    }\n\n    private onlyAggregationFields(val: object) {\n        for (const [key, value] of Object.entries(val)) {\n            if (AggregateOperators.includes(key as any)) {\n                // aggregation field\n                continue;\n            }\n            if (LOGICAL_COMBINATORS.includes(key as any)) {\n                // logical operators\n                if (enumerate(value).every((v) => this.onlyAggregationFields(v))) {\n                    continue;\n                }\n            }\n            return false;\n        }\n        return true;\n    }\n\n    @cache()\n    private makeHavingSchema(model: string, options?: CreateSchemaOptions) {\n        const schema = this.makeWhereSchema(model, false, true, true, options);\n        this.registerSchema(`${model}HavingInput`, schema);\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Procedures\n\n    @cache()\n    makeProcedureArgsSchema(procName: string): ZodType {\n        const procDef = (this.schema.procedures ?? {})[procName];\n        if (!procDef) {\n            throw createInternalError(`Procedure not found: ${procName}`);\n        }\n        const shape: Record<string, ZodType> = {};\n        for (const param of Object.values(procDef.params ?? {})) {\n            shape[param.name] = this.makeProcedureParamSchema(param);\n        }\n        const schema = z.object(shape);\n        this.registerSchema(`${procName}ProcArgs`, schema);\n        return schema;\n    }\n\n    @cache()\n    makeProcedureParamSchema(\n        param: { type: string; array?: boolean; optional?: boolean },\n        _options?: CreateSchemaOptions,\n    ): ZodType {\n        let schema: ZodType;\n\n        if (isTypeDef(this.schema, param.type)) {\n            schema = this.makeTypeDefSchema(param.type);\n        } else if (isEnum(this.schema, param.type)) {\n            schema = this.makeEnumSchema(param.type);\n        } else if (param.type in (this.schema.models ?? {})) {\n            // For model-typed values, accept any object (no deep shape validation).\n            schema = z.record(z.string(), z.unknown());\n        } else {\n            // Builtin scalar types.\n            schema = this.makeScalarSchema(param.type as BuiltinType);\n\n            // If a type isn't recognized by any of the above branches, `makeScalarSchema` returns `unknown`.\n            // Treat it as configuration/schema error.\n            if (schema instanceof z.ZodUnknown) {\n                throw createInternalError(`Unsupported procedure parameter type: ${param.type}`);\n            }\n        }\n\n        if (param.array) {\n            schema = schema.array();\n        }\n        if (param.optional) {\n            schema = schema.optional();\n        }\n\n        return schema;\n    }\n\n    // #endregion\n\n    // #region Plugin Args\n\n    private mergePluginArgsSchema(schema: ZodObject, operation: CoreCrudOperations) {\n        let result = schema;\n        for (const plugin of this.plugins ?? []) {\n            if (plugin.queryArgs) {\n                const pluginSchema = this.getPluginExtQueryArgsSchema(plugin, operation);\n                if (pluginSchema) {\n                    result = result.extend(pluginSchema.shape);\n                }\n            }\n        }\n        return result.strict();\n    }\n\n    private getPluginExtQueryArgsSchema(plugin: AnyPlugin, operation: string): ZodObject | undefined {\n        if (!plugin.queryArgs) {\n            return undefined;\n        }\n\n        let result: ZodType | undefined;\n\n        if (operation in plugin.queryArgs && plugin.queryArgs[operation]) {\n            // most specific operation takes highest precedence\n            result = plugin.queryArgs[operation];\n        } else if (operation === 'upsert') {\n            // upsert is special: it's in both CoreCreateOperations and CoreUpdateOperations\n            // so we need to merge both $create and $update schemas to match the type system\n            const createSchema =\n                '$create' in plugin.queryArgs && plugin.queryArgs['$create'] ? plugin.queryArgs['$create'] : undefined;\n            const updateSchema =\n                '$update' in plugin.queryArgs && plugin.queryArgs['$update'] ? plugin.queryArgs['$update'] : undefined;\n\n            if (createSchema && updateSchema) {\n                invariant(createSchema instanceof ZodObject, 'Plugin extended query args schema must be a Zod object');\n                invariant(updateSchema instanceof ZodObject, 'Plugin extended query args schema must be a Zod object');\n                // merge both schemas (combines their properties)\n                result = createSchema.extend(updateSchema.shape);\n            } else if (createSchema) {\n                result = createSchema;\n            } else if (updateSchema) {\n                result = updateSchema;\n            }\n        } else if (\n            // then comes grouped operations: $create, $read, $update, $delete\n            CoreCreateOperations.includes(operation as CoreCreateOperations) &&\n            '$create' in plugin.queryArgs &&\n            plugin.queryArgs['$create']\n        ) {\n            result = plugin.queryArgs['$create'];\n        } else if (\n            CoreReadOperations.includes(operation as CoreReadOperations) &&\n            '$read' in plugin.queryArgs &&\n            plugin.queryArgs['$read']\n        ) {\n            result = plugin.queryArgs['$read'];\n        } else if (\n            CoreUpdateOperations.includes(operation as CoreUpdateOperations) &&\n            '$update' in plugin.queryArgs &&\n            plugin.queryArgs['$update']\n        ) {\n            result = plugin.queryArgs['$update'];\n        } else if (\n            CoreDeleteOperations.includes(operation as CoreDeleteOperations) &&\n            '$delete' in plugin.queryArgs &&\n            plugin.queryArgs['$delete']\n        ) {\n            result = plugin.queryArgs['$delete'];\n        } else if ('$all' in plugin.queryArgs && plugin.queryArgs['$all']) {\n            // finally comes $all\n            result = plugin.queryArgs['$all'];\n        }\n\n        invariant(\n            result === undefined || result instanceof ZodObject,\n            'Plugin extended query args schema must be a Zod object',\n        );\n        return result;\n    }\n\n    // #endregion\n\n    // #region Helpers\n\n    @cache()\n    private makeSkipSchema() {\n        return z.number().int().nonnegative();\n    }\n\n    @cache()\n    private makeTakeSchema() {\n        return z.number().int();\n    }\n\n    private refineForSelectIncludeMutuallyExclusive(schema: ZodType) {\n        return schema.refine(\n            (value: any) => !(value['select'] && value['include']),\n            '\"select\" and \"include\" cannot be used together',\n        );\n    }\n\n    private refineForSelectOmitMutuallyExclusive(schema: ZodType) {\n        return schema.refine(\n            (value: any) => !(value['select'] && value['omit']),\n            '\"select\" and \"omit\" cannot be used together',\n        );\n    }\n\n    private refineForSelectHasTruthyField(schema: ZodType) {\n        return schema.refine((value: any) => {\n            const select = value['select'];\n            if (!select || typeof select !== 'object') {\n                return true;\n            }\n            return Object.values(select).some((v) => v);\n        }, '\"select\" must have at least one truthy value');\n    }\n\n    private nullableIf(schema: ZodType, nullable: boolean) {\n        return nullable ? schema.nullable() : schema;\n    }\n\n    private orArray<T extends ZodType>(schema: T, canBeArray: boolean) {\n        return canBeArray ? z.union([schema, z.array(schema)]) : schema;\n    }\n\n    private isNumericField(fieldDef: FieldDef) {\n        return NUMERIC_FIELD_TYPES.includes(fieldDef.type) && !fieldDef.array;\n    }\n\n    private get providerSupportsCaseSensitivity() {\n        return this.schema.provider.type === 'postgresql';\n    }\n\n    private get providerSupportsFullTextSearch() {\n        return this.schema.provider.type === 'postgresql';\n    }\n\n    private get providerSupportsFuzzySearch() {\n        return this.schema.provider.type === 'postgresql';\n    }\n\n    /**\n     * Gets the effective set of allowed FilterKind values for a specific model and field.\n     * Respects the precedence: model[field] > model.$all > $all[field] > $all.$all.\n     */\n    private getEffectiveFilterKinds(model: string | undefined, field: string): string[] | undefined {\n        if (!model) {\n            // no restrictions\n            return undefined;\n        }\n\n        const slicing = this.options.slicing;\n        if (!slicing?.models) {\n            // no slicing or no model-specific slicing, no restrictions\n            return undefined;\n        }\n\n        // A string-indexed view of slicing.models that avoids unsafe 'as any' while still\n        // allowing runtime access by model name. The value shape matches FieldSlicingOptions.\n        type FieldConfig = { includedFilterKinds?: readonly string[]; excludedFilterKinds?: readonly string[] };\n        type FieldsRecord = { $all?: FieldConfig } & Record<string, FieldConfig>;\n        type ModelConfig = { fields?: FieldsRecord };\n        const modelsRecord = slicing.models as Record<string, ModelConfig>;\n\n        // Check field-level settings for the specific model\n        const modelConfig = modelsRecord[lowerCaseFirst(model)];\n        if (modelConfig?.fields) {\n            const fieldConfig = modelConfig.fields[field];\n            if (fieldConfig) {\n                return this.computeFilterKinds(fieldConfig.includedFilterKinds, fieldConfig.excludedFilterKinds);\n            }\n\n            // Fallback to field-level $all for the specific model\n            const allFieldsConfig = modelConfig.fields['$all'];\n            if (allFieldsConfig) {\n                return this.computeFilterKinds(\n                    allFieldsConfig.includedFilterKinds,\n                    allFieldsConfig.excludedFilterKinds,\n                );\n            }\n        }\n\n        // Fallback to model-level $all\n        const allModelsConfig = modelsRecord['$all'];\n        if (allModelsConfig?.fields) {\n            // Check specific field in $all model config before falling back to $all.$all\n            const allModelsFieldConfig = allModelsConfig.fields[field];\n            if (allModelsFieldConfig) {\n                return this.computeFilterKinds(\n                    allModelsFieldConfig.includedFilterKinds,\n                    allModelsFieldConfig.excludedFilterKinds,\n                );\n            }\n\n            // Fallback to $all.$all\n            const allModelsAllFieldsConfig = allModelsConfig.fields['$all'];\n            if (allModelsAllFieldsConfig) {\n                return this.computeFilterKinds(\n                    allModelsAllFieldsConfig.includedFilterKinds,\n                    allModelsAllFieldsConfig.excludedFilterKinds,\n                );\n            }\n        }\n\n        return undefined; // No restrictions\n    }\n\n    /**\n     * Computes the effective set of filter kinds based on inclusion and exclusion lists.\n     */\n    private computeFilterKinds(included: readonly string[] | undefined, excluded: readonly string[] | undefined) {\n        let result: string[] | undefined;\n\n        if (included !== undefined) {\n            // Start with the included set\n            result = [...included];\n        }\n\n        if (excluded !== undefined) {\n            if (!result) {\n                // If no inclusion list, start with all filter kinds\n                result = [...this.allFilterKinds];\n            }\n            // Remove excluded kinds\n            for (const kind of excluded) {\n                result = result.filter((k) => k !== kind);\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Filters operators based on allowed filter kinds.\n     */\n    private trimFilterOperators<T extends Record<string, any>>(\n        operators: T,\n        allowedKinds: string[] | undefined,\n    ): Partial<T> {\n        if (!allowedKinds) {\n            return operators; // No restrictions\n        }\n\n        return Object.fromEntries(\n            Object.entries(operators).filter(([key, _]) => {\n                return (\n                    !(key in FILTER_PROPERTY_TO_KIND) ||\n                    allowedKinds.includes(FILTER_PROPERTY_TO_KIND[key as keyof typeof FILTER_PROPERTY_TO_KIND])\n                );\n            }),\n        ) as Partial<T>;\n    }\n\n    private createUnionFilterSchema(\n        valueSchema: ZodType,\n        optional: boolean,\n        components: Record<string, ZodType>,\n        allowedFilterKinds: string[] | undefined,\n    ) {\n        // If all filter operators are excluded\n        if (Object.keys(components).length === 0) {\n            // if equality filters are allowed, allow direct value\n            if (!allowedFilterKinds || allowedFilterKinds.includes('Equality')) {\n                return this.nullableIf(valueSchema, optional);\n            }\n            // otherwise nothing is allowed\n            return z.never();\n        }\n\n        if (!allowedFilterKinds || allowedFilterKinds.includes('Equality')) {\n            // direct value or filter operators\n            return z.union([this.nullableIf(valueSchema, optional), z.strictObject(components)]);\n        } else {\n            // filter operators\n            return z.strictObject(components);\n        }\n    }\n\n    private canCreateModel(model: string) {\n        const modelDef = requireModel(this.schema, model);\n        if (modelDef.isDelegate) {\n            return false;\n        }\n        const hasRequiredUnsupportedFields = Object.values(modelDef.fields).some(\n            (fieldDef) => fieldDef.type === 'Unsupported' && !fieldDef.optional && !fieldHasDefaultValue(fieldDef),\n        );\n        if (hasRequiredUnsupportedFields) {\n            return false;\n        }\n        return true;\n    }\n\n    private isModelAllowed(targetModel: string): boolean {\n        const slicing = this.options.slicing;\n        if (!slicing) {\n            return true; // No slicing, all models allowed\n        }\n\n        const { includedModels, excludedModels } = slicing;\n\n        // If includedModels is specified, only those models are allowed\n        if (includedModels !== undefined) {\n            if (!includedModels.includes(targetModel as any)) {\n                return false;\n            }\n        }\n\n        // If excludedModels is specified, those models are not allowed\n        if (excludedModels !== undefined) {\n            if (excludedModels.includes(targetModel as any)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private isProcedureAllowed(procName: string): boolean {\n        const slicing = this.options.slicing;\n        if (!slicing) {\n            return true;\n        }\n\n        const { includedProcedures, excludedProcedures } = slicing;\n\n        if (includedProcedures !== undefined) {\n            if (!(includedProcedures as readonly string[]).includes(procName)) {\n                return false;\n            }\n        }\n\n        if (excludedProcedures !== undefined) {\n            if ((excludedProcedures as readonly string[]).includes(procName)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    // #endregion\n}\n\nexport function createSchemaFactory<Schema extends SchemaDef, Client extends ClientContract<Schema, any, any>>(\n    client: Client,\n): Client extends ClientContract<Schema, infer Options, infer ExtQueryArgs>\n    ? ZodSchemaFactory<Schema, Options, ExtQueryArgs>\n    : never {\n    return new ZodSchemaFactory(client) as any;\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { type GetModels, type ProcedureDef, type SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport { ZodType } from 'zod';\nimport { formatError } from '../../../utils/zod-utils';\nimport type { ClientContract } from '../../contract';\nimport {\n    type AggregateArgs,\n    type CountArgs,\n    type CreateArgs,\n    type CreateManyAndReturnArgs,\n    type CreateManyArgs,\n    type DeleteArgs,\n    type DeleteManyArgs,\n    type ExistsArgs,\n    type FindArgs,\n    type GroupByArgs,\n    type UpdateArgs,\n    type UpdateManyAndReturnArgs,\n    type UpdateManyArgs,\n    type UpsertArgs,\n} from '../../crud-types';\nimport { createInvalidInputError } from '../../errors';\nimport { ZodSchemaFactory } from '../../zod/factory';\n\ntype GetSchemaFunc<Schema extends SchemaDef> = (model: GetModels<Schema>) => ZodType;\n\nexport type InputValidatorOptions = {\n    /**\n     * Whether validation is enabled. Defaults to `true`.\n     */\n    enabled?: boolean;\n};\n\nexport class InputValidator<Schema extends SchemaDef> {\n    readonly zodFactory: ZodSchemaFactory<Schema>;\n    private readonly enabled: boolean;\n\n    constructor(\n        private readonly client: ClientContract<Schema>,\n        options?: InputValidatorOptions,\n    ) {\n        this.zodFactory = new ZodSchemaFactory(client);\n        this.enabled = options?.enabled !== false;\n    }\n\n    // #region Entry points\n\n    validateFindArgs(\n        model: GetModels<Schema>,\n        args: unknown,\n        operation: 'findFirst' | 'findUnique' | 'findMany',\n    ): FindArgs<Schema, GetModels<Schema>, any, true> | undefined {\n        return this.validate<FindArgs<Schema, GetModels<Schema>, any, true> | undefined>(\n            model,\n            operation,\n            (model) =>\n                match(operation)\n                    .with('findFirst', () => this.zodFactory.makeFindFirstSchema(model))\n                    .with('findUnique', () => this.zodFactory.makeFindUniqueSchema(model))\n                    .with('findMany', () => this.zodFactory.makeFindManySchema(model))\n                    .exhaustive(),\n            args,\n        );\n    }\n\n    validateExistsArgs(\n        model: GetModels<Schema>,\n        args: unknown,\n    ): ExistsArgs<Schema, GetModels<Schema>, any> | undefined {\n        return this.validate<ExistsArgs<Schema, GetModels<Schema>, any> | undefined>(\n            model,\n            'exists',\n            (model) => this.zodFactory.makeExistsSchema(model),\n            args,\n        );\n    }\n\n    validateCreateArgs(model: GetModels<Schema>, args: unknown): CreateArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<CreateArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'create',\n            (model) => this.zodFactory.makeCreateSchema(model),\n            args,\n        );\n    }\n\n    validateCreateManyArgs(model: GetModels<Schema>, args: unknown): CreateManyArgs<Schema, GetModels<Schema>> {\n        return this.validate<CreateManyArgs<Schema, GetModels<Schema>>>(\n            model,\n            'createMany',\n            (model) => this.zodFactory.makeCreateManySchema(model),\n            args,\n        );\n    }\n\n    validateCreateManyAndReturnArgs(\n        model: GetModels<Schema>,\n        args: unknown,\n    ): CreateManyAndReturnArgs<Schema, GetModels<Schema>, any> | undefined {\n        return this.validate<CreateManyAndReturnArgs<Schema, GetModels<Schema>, any> | undefined>(\n            model,\n            'createManyAndReturn',\n            (model) => this.zodFactory.makeCreateManyAndReturnSchema(model),\n            args,\n        );\n    }\n\n    validateUpdateArgs(model: GetModels<Schema>, args: unknown): UpdateArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<UpdateArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'update',\n            (model) => this.zodFactory.makeUpdateSchema(model),\n            args,\n        );\n    }\n\n    validateUpdateManyArgs(model: GetModels<Schema>, args: unknown): UpdateManyArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<UpdateManyArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'updateMany',\n            (model) => this.zodFactory.makeUpdateManySchema(model),\n            args,\n        );\n    }\n\n    validateUpdateManyAndReturnArgs(\n        model: GetModels<Schema>,\n        args: unknown,\n    ): UpdateManyAndReturnArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<UpdateManyAndReturnArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'updateManyAndReturn',\n            (model) => this.zodFactory.makeUpdateManyAndReturnSchema(model),\n            args,\n        );\n    }\n\n    validateUpsertArgs(model: GetModels<Schema>, args: unknown): UpsertArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<UpsertArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'upsert',\n            (model) => this.zodFactory.makeUpsertSchema(model),\n            args,\n        );\n    }\n\n    validateDeleteArgs(model: GetModels<Schema>, args: unknown): DeleteArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<DeleteArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'delete',\n            (model) => this.zodFactory.makeDeleteSchema(model),\n            args,\n        );\n    }\n\n    validateDeleteManyArgs(\n        model: GetModels<Schema>,\n        args: unknown,\n    ): DeleteManyArgs<Schema, GetModels<Schema>, any> | undefined {\n        return this.validate<DeleteManyArgs<Schema, GetModels<Schema>, any> | undefined>(\n            model,\n            'deleteMany',\n            (model) => this.zodFactory.makeDeleteManySchema(model),\n            args,\n        );\n    }\n\n    validateCountArgs(model: GetModels<Schema>, args: unknown): CountArgs<Schema, GetModels<Schema>, any> | undefined {\n        return this.validate<CountArgs<Schema, GetModels<Schema>, any> | undefined>(\n            model,\n            'count',\n            (model) => this.zodFactory.makeCountSchema(model),\n            args,\n        );\n    }\n\n    validateAggregateArgs(model: GetModels<Schema>, args: unknown): AggregateArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<AggregateArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'aggregate',\n            (model) => this.zodFactory.makeAggregateSchema(model),\n            args,\n        );\n    }\n\n    validateGroupByArgs(model: GetModels<Schema>, args: unknown): GroupByArgs<Schema, GetModels<Schema>, any> {\n        return this.validate<GroupByArgs<Schema, GetModels<Schema>, any>>(\n            model,\n            'groupBy',\n            (model) => this.zodFactory.makeGroupBySchema(model),\n            args,\n        );\n    }\n\n    // TODO: turn it into a Zod schema and cache\n    validateProcedureInput(proc: string, input: unknown): unknown {\n        if (!this.enabled) {\n            return input;\n        }\n        const procDef = (this.client.$schema.procedures ?? {})[proc] as ProcedureDef | undefined;\n        invariant(procDef, `Procedure \"${proc}\" not found in schema`);\n\n        const params = Object.values(procDef.params ?? {});\n\n        // For procedures where every parameter is optional, allow omitting the input entirely.\n        if (typeof input === 'undefined') {\n            if (params.length === 0) {\n                return undefined;\n            }\n            if (params.every((p) => p.optional)) {\n                return undefined;\n            }\n            throw createInvalidInputError('Missing procedure arguments', `$procs.${proc}`);\n        }\n\n        if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n            throw createInvalidInputError('Procedure input must be an object', `$procs.${proc}`);\n        }\n\n        const envelope = input as Record<string, unknown>;\n        const argsPayload = Object.prototype.hasOwnProperty.call(envelope, 'args') ? (envelope as any).args : undefined;\n\n        if (params.length === 0) {\n            if (typeof argsPayload === 'undefined') {\n                return input;\n            }\n            if (!argsPayload || typeof argsPayload !== 'object' || Array.isArray(argsPayload)) {\n                throw createInvalidInputError('Procedure `args` must be an object', `$procs.${proc}`);\n            }\n            if (Object.keys(argsPayload as any).length === 0) {\n                return input;\n            }\n            throw createInvalidInputError('Procedure does not accept arguments', `$procs.${proc}`);\n        }\n\n        if (typeof argsPayload === 'undefined') {\n            if (params.every((p) => p.optional)) {\n                return input;\n            }\n            throw createInvalidInputError('Missing procedure arguments', `$procs.${proc}`);\n        }\n\n        if (!argsPayload || typeof argsPayload !== 'object' || Array.isArray(argsPayload)) {\n            throw createInvalidInputError('Procedure `args` must be an object', `$procs.${proc}`);\n        }\n\n        const obj = argsPayload as Record<string, unknown>;\n\n        for (const param of params) {\n            const value = (obj as any)[param.name];\n\n            if (!Object.prototype.hasOwnProperty.call(obj, param.name)) {\n                if (param.optional) {\n                    continue;\n                }\n                throw createInvalidInputError(`Missing procedure argument: ${param.name}`, `$procs.${proc}`);\n            }\n\n            if (typeof value === 'undefined') {\n                if (param.optional) {\n                    continue;\n                }\n                throw createInvalidInputError(\n                    `Invalid procedure argument: ${param.name} is required`,\n                    `$procs.${proc}`,\n                );\n            }\n\n            const schema = this.zodFactory.makeProcedureParamSchema(param);\n            const parsed = schema.safeParse(value);\n            if (!parsed.success) {\n                throw createInvalidInputError(\n                    `Invalid procedure argument: ${param.name}: ${formatError(parsed.error)}`,\n                    `$procs.${proc}`,\n                );\n            }\n        }\n\n        return input;\n    }\n\n    // #endregion\n\n    // #region Validation helpers\n\n    private validate<T>(model: GetModels<Schema>, operation: string, getSchema: GetSchemaFunc<Schema>, args: unknown) {\n        if (!this.enabled) {\n            return args as T;\n        }\n        const schema = getSchema(model);\n        const { error, data } = schema.safeParse(args);\n        if (error) {\n            throw createInvalidInputError(\n                `Invalid ${operation} args for model \"${model}\": ${formatError(error)}`,\n                model,\n                {\n                    cause: error,\n                },\n            );\n        }\n        return data as T;\n    }\n\n    // #endregion\n}\n","import { createId as cuid2 } from '@paralleldrive/cuid2';\nimport { clone, enumerate, invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport type { BuiltinType, Expression, FieldDef } from '@zenstackhq/schema';\nimport { ExpressionUtils, type GetModels, type ModelDef, type SchemaDef } from '@zenstackhq/schema';\nimport { default as cuid1 } from 'cuid';\nimport {\n    createQueryId,\n    expressionBuilder,\n    sql,\n    type Compilable,\n    type ExpressionBuilder,\n    type IsolationLevel,\n    type QueryResult,\n    type SelectQueryBuilder,\n} from 'kysely';\nimport { nanoid } from 'nanoid';\nimport { match } from 'ts-pattern';\nimport { ulid } from 'ulid';\nimport * as uuid from 'uuid';\nimport type { AnyKysely } from '../../../utils/kysely-utils';\nimport { extractFields, fieldsToSelectObject, isEmptyObject } from '../../../utils/object-utils';\nimport { NUMERIC_FIELD_TYPES } from '../../constants';\nimport { TransactionIsolationLevel, type ClientContract, type CRUD } from '../../contract';\nimport type { FindArgs, SelectIncludeOmit, WhereInput } from '../../crud-types';\nimport {\n    createDBQueryError,\n    createInternalError,\n    createInvalidInputError,\n    createNotFoundError,\n    createNotSupportedError,\n    ORMError,\n    ORMErrorReason,\n} from '../../errors';\nimport type { ToKysely } from '../../query-builder';\nimport {\n    ensureArray,\n    extractIdFields,\n    flattenCompoundUniqueFilters,\n    getDelegateDiscriminatorValue,\n    getDiscriminatorField,\n    getField,\n    getIdValues,\n    getManyToManyRelation,\n    getModel,\n    getRelationForeignKeyFieldPairs,\n    isForeignKeyField,\n    isRelationField,\n    isScalarField,\n    requireField,\n    requireIdFields,\n    requireModel,\n} from '../../query-utils';\nimport { getCrudDialect } from '../dialects';\nimport type { BaseCrudDialect } from '../dialects/base-dialect';\nimport { InputValidator } from '../validator';\n\n/**\n * List of core CRUD operations. It excludes the 'orThrow' variants.\n */\nexport const CoreCrudOperations = [\n    'findMany',\n    'findUnique',\n    'findFirst',\n    'create',\n    'createMany',\n    'createManyAndReturn',\n    'update',\n    'updateMany',\n    'updateManyAndReturn',\n    'upsert',\n    'delete',\n    'deleteMany',\n    'count',\n    'aggregate',\n    'groupBy',\n    'exists',\n] as const;\n\n/**\n * List of core CRUD operations. It excludes the 'orThrow' variants.\n */\nexport type CoreCrudOperations = (typeof CoreCrudOperations)[number];\n\n/**\n * List of core read operations. It excludes the 'orThrow' variants.\n */\nexport const CoreReadOperations = [\n    'findMany',\n    'findUnique',\n    'findFirst',\n    'count',\n    'aggregate',\n    'groupBy',\n    'exists',\n] as const;\n\n/**\n * List of core read operations. It excludes the 'orThrow' variants.\n */\nexport type CoreReadOperations = (typeof CoreReadOperations)[number];\n\n/**\n * List of core write operations.\n */\nexport const CoreWriteOperations = [\n    'create',\n    'createMany',\n    'createManyAndReturn',\n    'update',\n    'updateMany',\n    'updateManyAndReturn',\n    'upsert',\n    'delete',\n    'deleteMany',\n] as const;\n\n/**\n * List of core write operations.\n */\nexport type CoreWriteOperations = (typeof CoreWriteOperations)[number];\n\n/**\n * List of core create operations.\n */\nexport const CoreCreateOperations = ['create', 'createMany', 'createManyAndReturn', 'upsert'] as const;\n\n/**\n * List of core create operations.\n */\nexport type CoreCreateOperations = (typeof CoreCreateOperations)[number];\n\n/**\n * List of core update operations.\n */\nexport const CoreUpdateOperations = ['update', 'updateMany', 'updateManyAndReturn', 'upsert'] as const;\n\n/**\n * List of core update operations.\n */\nexport type CoreUpdateOperations = (typeof CoreUpdateOperations)[number];\n\n/**\n * List of core delete operations.\n */\nexport const CoreDeleteOperations = ['delete', 'deleteMany'] as const;\n\n/**\n * List of core delete operations.\n */\nexport type CoreDeleteOperations = (typeof CoreDeleteOperations)[number];\n\n/**\n * List of all CRUD operations, including 'orThrow' variants.\n */\nexport const AllCrudOperations = [...CoreCrudOperations, 'findUniqueOrThrow', 'findFirstOrThrow'] as const;\n\n/**\n * List of all CRUD operations, including 'orThrow' variants.\n */\nexport type AllCrudOperations = (typeof AllCrudOperations)[number];\n\n/**\n * List of all read operations, including 'orThrow' variants.\n */\nexport const AllReadOperations = [...CoreReadOperations, 'findUniqueOrThrow', 'findFirstOrThrow'] as const;\n\n/**\n * List of all read operations, including 'orThrow' variants.\n */\nexport type AllReadOperations = (typeof AllReadOperations)[number];\n\n/**\n * List of all write operations - simply an alias of CoreWriteOperations.\n */\nexport const AllWriteOperations = CoreWriteOperations;\n\n/**\n * List of all write operations - simply an alias of CoreWriteOperations.\n */\nexport type AllWriteOperations = CoreWriteOperations;\n\n// context for nested relation operations\nexport type FromRelationContext = {\n    // the model where the relation field is defined\n    model: string;\n    // the relation field name\n    field: string;\n    // the parent entity's id fields and values\n    ids: any;\n    // for relations owned by model, record the parent updates needed after the relation is processed\n    parentUpdates: Record<string, unknown>;\n};\n\nexport abstract class BaseOperationHandler<Schema extends SchemaDef> {\n    protected readonly dialect: BaseCrudDialect<Schema>;\n\n    constructor(\n        protected readonly client: ClientContract<Schema>,\n        protected readonly model: GetModels<Schema>,\n        protected readonly inputValidator: InputValidator<Schema>,\n    ) {\n        this.dialect = getCrudDialect(this.schema, this.client.$options);\n    }\n\n    protected get schema() {\n        return this.client.$schema;\n    }\n\n    protected get options() {\n        return this.client.$options;\n    }\n\n    protected get kysely(): AnyKysely {\n        return this.client.$qb;\n    }\n\n    abstract handle(operation: CoreCrudOperations, args: any): Promise<unknown>;\n\n    withClient(client: ClientContract<Schema>) {\n        return new (this.constructor as new (...args: any[]) => this)(client, this.model, this.inputValidator);\n    }\n\n    // TODO: this is not clean, needs a better solution\n    protected get hasPolicyEnabled() {\n        return this.options.plugins?.some((plugin) => plugin.id === 'policy') ?? false;\n    }\n\n    protected requireModel(model: string) {\n        return requireModel(this.schema, model);\n    }\n\n    protected getModel(model: string) {\n        return getModel(this.schema, model);\n    }\n\n    protected requireField(model: string, field: string) {\n        return requireField(this.schema, model, field);\n    }\n\n    protected getField(model: string, field: string) {\n        return getField(this.schema, model, field);\n    }\n\n    protected async exists(\n        kysely: ToKysely<Schema>,\n        model: GetModels<Schema>,\n        filter: any,\n    ): Promise<unknown | undefined> {\n        return this.readUnique(kysely, model, {\n            where: filter,\n            select: this.makeIdSelect(model),\n        });\n    }\n\n    protected async existsNonUnique(kysely: ToKysely<Schema>, model: GetModels<Schema>, filter: any): Promise<boolean> {\n        const query = kysely\n            .selectNoFrom((eb) =>\n                eb\n                    .exists(\n                        this.dialect\n                            .buildSelectModel(model, model)\n                            .select(sql.lit(1).as('_'))\n                            .where(() => this.dialect.buildFilter(model, model, filter)),\n                    )\n                    .as('$exists'),\n            )\n            .modifyEnd(this.makeContextComment({ model, operation: 'read' }));\n\n        let result: { $exists: number | boolean }[] = [];\n        const compiled = kysely.getExecutor().compileQuery(query.toOperationNode(), createQueryId());\n        try {\n            const r = await kysely.getExecutor().executeQuery(compiled);\n            result = r.rows as { $exists: number | boolean }[];\n        } catch (err) {\n            throw createDBQueryError(`Failed to execute query: ${err}`, err, compiled.sql, compiled.parameters);\n        }\n\n        return !!result[0]?.$exists;\n    }\n\n    protected async read(\n        kysely: AnyKysely,\n        model: string,\n        args: FindArgs<Schema, GetModels<Schema>, any, true> | undefined,\n    ): Promise<any[]> {\n        // table\n        let query = this.dialect.buildSelectModel(model, model);\n\n        if (args) {\n            query = this.dialect.buildFilterSortTake(model, args, query, model);\n        }\n\n        // select\n        if (args && 'select' in args && args.select) {\n            // select is mutually exclusive with omit\n            query = this.buildFieldSelection(model, query, args.select, model);\n        } else {\n            // include all scalar fields except those in omit\n            query = this.dialect.buildSelectAllFields(model, query, (args as any)?.omit, model);\n        }\n\n        // include\n        if (args && 'include' in args && args.include) {\n            // note that 'omit' is handled above already\n            query = this.buildFieldSelection(model, query, args.include, model);\n        }\n\n        query = query.modifyEnd(this.makeContextComment({ model, operation: 'read' }));\n\n        let result: any[] = [];\n        const compiled = kysely.getExecutor().compileQuery(query.toOperationNode(), createQueryId());\n        try {\n            const r = await kysely.getExecutor().executeQuery(compiled);\n            result = r.rows;\n        } catch (err) {\n            throw createDBQueryError(`Failed to execute query: ${err}`, err, compiled.sql, compiled.parameters);\n        }\n\n        return result;\n    }\n\n    protected async readUnique(kysely: AnyKysely, model: string, args: FindArgs<Schema, GetModels<Schema>, any, true>) {\n        const result = await this.read(kysely, model, { ...args, take: 1 });\n        return result[0] ?? null;\n    }\n\n    private buildFieldSelection(\n        model: string,\n        query: SelectQueryBuilder<any, any, any>,\n        selectOrInclude: Record<string, any>,\n        parentAlias: string,\n    ) {\n        let result = query;\n\n        for (const [field, payload] of Object.entries(selectOrInclude)) {\n            if (!payload) {\n                continue;\n            }\n\n            if (field === '_count') {\n                result = this.buildCountSelection(result, model, parentAlias, payload);\n                continue;\n            }\n\n            const fieldDef = this.requireField(model, field);\n            if (!fieldDef.relation) {\n                // scalar field\n                result = this.dialect.buildSelectField(result, model, parentAlias, field);\n            } else {\n                if (!fieldDef.array && !fieldDef.optional && payload.where) {\n                    throw createInternalError(`Field \"${field}\" does not support filtering`, model);\n                }\n                if (fieldDef.originModel) {\n                    result = this.dialect.buildRelationSelection(\n                        result,\n                        fieldDef.originModel,\n                        field,\n                        fieldDef.originModel,\n                        payload,\n                    );\n                } else {\n                    //  regular relation\n                    result = this.dialect.buildRelationSelection(result, model, field, parentAlias, payload);\n                }\n            }\n        }\n\n        return result;\n    }\n\n    private buildCountSelection(\n        query: SelectQueryBuilder<any, any, any>,\n        model: string,\n        parentAlias: string,\n        payload: any,\n    ) {\n        return query.select((eb) => this.dialect.buildCountJson(model, eb, parentAlias, payload).as('_count'));\n    }\n\n    protected async create(\n        kysely: AnyKysely,\n        model: string,\n        data: any,\n        fromRelation?: FromRelationContext,\n        creatingForDelegate = false,\n        returnFields?: readonly string[],\n    ): Promise<unknown> {\n        const modelDef = this.requireModel(model);\n\n        // additional validations\n        if (modelDef.isDelegate && !creatingForDelegate) {\n            throw createNotSupportedError(`Model \"${model}\" is a delegate and cannot be created directly.`);\n        }\n\n        let createFields: any = {};\n        let updateParent: ((entity: any) => void) | undefined = undefined;\n\n        let m2m: ReturnType<typeof getManyToManyRelation> = undefined;\n\n        if (fromRelation) {\n            m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n            if (!m2m) {\n                // many-to-many relations are handled after create\n                const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                    this.schema,\n                    fromRelation?.model ?? '',\n                    fromRelation?.field ?? '',\n                );\n\n                if (!ownedByModel) {\n                    // assign fks from parent\n                    const parentFkFields = await this.buildFkAssignments(\n                        kysely,\n                        fromRelation.model,\n                        fromRelation.field,\n                        fromRelation.ids,\n                    );\n                    Object.assign(createFields, parentFkFields);\n                } else {\n                    // record parent fk update after entity is created\n                    updateParent = (entity) => {\n                        for (const { fk, pk } of keyPairs) {\n                            fromRelation.parentUpdates[fk] = entity[pk];\n                        }\n                    };\n                }\n            }\n        }\n\n        // process the create and handle relations\n        const postCreateRelations: Record<string, object> = {};\n        for (const [field, value] of Object.entries(data)) {\n            const fieldDef = this.requireField(model, field);\n            if (isScalarField(this.schema, model, field) || isForeignKeyField(this.schema, model, field)) {\n                if (\n                    fieldDef.array &&\n                    value &&\n                    typeof value === 'object' &&\n                    'set' in value &&\n                    Array.isArray(value.set)\n                ) {\n                    // deal with nested \"set\" for scalar lists\n                    createFields[field] = this.dialect.transformInput(value.set, fieldDef.type as BuiltinType, true, fieldDef);\n                } else {\n                    createFields[field] = this.dialect.transformInput(\n                        value,\n                        fieldDef.type as BuiltinType,\n                        !!fieldDef.array,\n                        fieldDef,\n                    );\n                }\n            } else {\n                const subM2M = getManyToManyRelation(this.schema, model, field);\n                if (!subM2M && fieldDef.relation?.fields && fieldDef.relation?.references) {\n                    const fkValues = await this.processOwnedRelationForCreate(kysely, fieldDef, value);\n                    for (let i = 0; i < fieldDef.relation.fields.length; i++) {\n                        createFields[fieldDef.relation.fields[i]!] = fkValues[fieldDef.relation.references[i]!];\n                    }\n                } else {\n                    const subPayload = value;\n                    if (subPayload && typeof subPayload === 'object') {\n                        postCreateRelations[field] = subPayload;\n                    }\n                }\n            }\n        }\n\n        // create delegate base model entity\n        if (modelDef.baseModel) {\n            const baseCreateResult = await this.processBaseModelCreate(kysely, modelDef.baseModel, createFields, model);\n            createFields = baseCreateResult.remainingFields;\n        }\n\n        const updatedData = this.fillGeneratedAndDefaultValues(modelDef, createFields);\n\n        // return id fields if no returnFields specified\n        returnFields = returnFields ?? requireIdFields(this.schema, model);\n\n        let createdEntity: any;\n\n        if (this.dialect.supportsReturning) {\n            const query = kysely\n                .insertInto(model)\n                .$if(Object.keys(updatedData).length === 0, (qb) =>\n                    qb\n                        // case for `INSERT INTO ... DEFAULT VALUES` syntax\n                        .$if(this.dialect.supportsInsertDefaultValues, () => qb.defaultValues())\n                        // case for `INSERT INTO ... VALUES ({})` syntax\n                        .$if(!this.dialect.supportsInsertDefaultValues, () => qb.values({})),\n                )\n                .$if(Object.keys(updatedData).length > 0, (qb) => qb.values(updatedData))\n                .returning(returnFields as any)\n                .modifyEnd(\n                    this.makeContextComment({\n                        model,\n                        operation: 'create',\n                    }),\n                );\n\n            createdEntity = await this.executeQueryTakeFirst(kysely, query, 'create');\n        } else {\n            // Fallback for databases that don't support RETURNING (e.g., MySQL)\n            const insertQuery = kysely\n                .insertInto(model)\n                .$if(Object.keys(updatedData).length === 0, (qb) =>\n                    qb\n                        // case for `INSERT INTO ... DEFAULT VALUES` syntax\n                        .$if(this.dialect.supportsInsertDefaultValues, () => qb.defaultValues())\n                        // case for `INSERT INTO ... VALUES ({})` syntax\n                        .$if(!this.dialect.supportsInsertDefaultValues, () => qb.values({})),\n                )\n                .$if(Object.keys(updatedData).length > 0, (qb) => qb.values(updatedData))\n                .modifyEnd(\n                    this.makeContextComment({\n                        model,\n                        operation: 'create',\n                    }),\n                );\n\n            const insertResult = await this.executeQuery(kysely, insertQuery, 'create');\n\n            // Build WHERE clause to find the inserted record\n            const idFields = requireIdFields(this.schema, model);\n            const idValues: Record<string, any> = {};\n\n            for (const idField of idFields) {\n                if (insertResult.insertId !== undefined && insertResult.insertId !== null) {\n                    const fieldDef = this.requireField(model, idField);\n                    if (this.isAutoIncrementField(fieldDef)) {\n                        // auto-generated id value\n                        idValues[idField] = insertResult.insertId;\n                        continue;\n                    }\n                }\n\n                if (updatedData[idField] !== undefined) {\n                    // ID was provided in the insert\n                    idValues[idField] = updatedData[idField];\n                } else {\n                    throw createInternalError(\n                        `Cannot determine ID field \"${idField}\" value for created model \"${model}\"`,\n                    );\n                }\n            }\n\n            // for dialects that don't support RETURNING, the outside logic will always\n            // read back the created record, we just return the id fields here\n            createdEntity = idValues;\n        }\n\n        if (Object.keys(postCreateRelations).length > 0) {\n            // process nested creates that need to happen after the current entity is created\n            for (const [field, subPayload] of Object.entries(postCreateRelations)) {\n                await this.processNoneOwnedRelationForCreate(kysely, model, field, subPayload, createdEntity);\n            }\n        }\n\n        if (fromRelation && m2m) {\n            // connect many-to-many relation\n            await this.handleManyToManyRelation(\n                kysely,\n                'connect',\n                fromRelation.model,\n                fromRelation.field,\n                fromRelation.ids,\n                m2m.otherModel,\n                m2m.otherField,\n                [createdEntity],\n                m2m.joinTable,\n            );\n        }\n\n        // finally update parent if needed\n        if (updateParent) {\n            updateParent(createdEntity);\n        }\n\n        return createdEntity;\n    }\n\n    private isAutoIncrementField(fieldDef: FieldDef) {\n        return (\n            fieldDef.default &&\n            ExpressionUtils.isCall(fieldDef.default) &&\n            fieldDef.default.function === 'autoincrement'\n        );\n    }\n\n    private async processBaseModelCreate(kysely: ToKysely<Schema>, model: string, createFields: any, forModel: string) {\n        const thisCreateFields: any = {};\n        const remainingFields: any = {};\n\n        Object.entries(createFields).forEach(([field, value]) => {\n            const fieldDef = this.getField(model, field);\n            if (fieldDef) {\n                thisCreateFields[field] = value;\n            } else {\n                remainingFields[field] = value;\n            }\n        });\n\n        const discriminatorField = getDiscriminatorField(this.schema, model);\n        invariant(discriminatorField, `Base model \"${model}\" must have a discriminator field`);\n        thisCreateFields[discriminatorField] = getDelegateDiscriminatorValue(this.schema, forModel);\n\n        // create base model entity\n        const baseEntity: any = await this.create(\n            kysely,\n            model as GetModels<Schema>,\n            thisCreateFields,\n            undefined,\n            true,\n        );\n\n        // copy over id fields from base model\n        const idValues = extractIdFields(baseEntity, this.schema, model);\n        Object.assign(remainingFields, idValues);\n\n        return { baseEntity, remainingFields };\n    }\n\n    private async buildFkAssignments(kysely: AnyKysely, model: string, relationField: string, entity: any) {\n        const parentFkFields: any = {};\n\n        invariant(relationField, 'parentField must be defined if parentModel is defined');\n        invariant(entity, 'parentEntity must be defined if parentModel is defined');\n\n        const { keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, relationField);\n\n        for (const pair of keyPairs) {\n            if (!(pair.pk in entity)) {\n                // the relation may be using a non-id field as fk, so we read in-place\n                // to fetch that field\n                const extraRead = await this.readUnique(kysely, model, {\n                    where: entity,\n                    select: { [pair.pk]: true },\n                } as any);\n                if (!extraRead) {\n                    throw createInternalError(`Field \"${pair.pk}\" not found in parent created data`, model);\n                } else {\n                    // update the parent entity\n                    Object.assign(entity, extraRead);\n                }\n            }\n            Object.assign(parentFkFields, {\n                [pair.fk]: (entity as any)[pair.pk],\n            });\n        }\n        return parentFkFields;\n    }\n\n    private async handleManyToManyRelation<Action extends 'connect' | 'disconnect'>(\n        kysely: AnyKysely,\n        action: Action,\n        leftModel: string,\n        leftField: string,\n        leftEntity: any,\n        rightModel: string,\n        rightField: string,\n        rightEntities: any[],\n        joinTable: string,\n    ): Promise<void> {\n        if (rightEntities.length === 0) {\n            return;\n        }\n\n        // the implicit m2m join table's \"A\", \"B\" fk fields' order is determined\n        // by model name's sort order, and when identical (for self-relations),\n        // field name's sort order\n        const leftFirst =\n            leftModel !== rightModel\n                ? leftModel.localeCompare(rightModel) <= 0\n                : leftField.localeCompare(rightField) <= 0;\n\n        const leftIdField = requireIdFields(this.schema, leftModel);\n        const rightIdField = requireIdFields(this.schema, rightModel);\n        invariant(leftIdField.length === 1, 'many-to-many relation must have exactly one id field');\n        invariant(rightIdField.length === 1, 'many-to-many relation must have exactly one id field');\n\n        const leftIdValue = leftEntity[leftIdField[0]!];\n        const rightIdValues = rightEntities.map((e) => e[rightIdField[0]!]);\n\n        // Prisma's convention for many-to-many: fk fields are named \"A\" and \"B\"\n        if (action === 'connect') {\n            const values = rightIdValues.map((rightId) => ({\n                A: leftFirst ? leftIdValue : rightId,\n                B: leftFirst ? rightId : leftIdValue,\n            }));\n\n            await kysely\n                .insertInto(joinTable as any)\n                .values(values as any)\n                // case for `INSERT IGNORE` or `ON CONFLICT DO NOTHING` syntax\n                .$if(this.dialect.insertIgnoreMethod === 'onConflict', (qb) =>\n                    qb.onConflict((oc) => oc.columns(['A', 'B'] as any).doNothing()),\n                )\n                // case for `INSERT IGNORE` syntax\n                .$if(this.dialect.insertIgnoreMethod === 'ignore', (qb) => qb.ignore())\n                .execute();\n        } else {\n            const eb = expressionBuilder<any, any>();\n            const [leftCol, rightCol] = leftFirst ? (['A', 'B'] as const) : (['B', 'A'] as const);\n\n            await kysely\n                .deleteFrom(joinTable as any)\n                .where(eb(`${joinTable}.${leftCol}`, '=', leftIdValue))\n                .where(eb(`${joinTable}.${rightCol}`, 'in', rightIdValues))\n                .execute();\n        }\n    }\n\n    private resetManyToManyRelation(kysely: AnyKysely, model: string, field: string, parentIds: any) {\n        invariant(Object.keys(parentIds).length === 1, 'parentIds must have exactly one field');\n        const parentId = Object.values(parentIds)[0]!;\n\n        const m2m = getManyToManyRelation(this.schema, model, field);\n        invariant(m2m, 'not a many-to-many relation');\n\n        const eb = expressionBuilder<any, any>();\n        return kysely\n            .deleteFrom(m2m.joinTable as any)\n            .where(eb(`${m2m.joinTable}.${m2m.parentFkName}`, '=', parentId))\n            .execute();\n    }\n\n    private async processOwnedRelationForCreate(kysely: ToKysely<Schema>, relationField: FieldDef, payload: any) {\n        if (!payload) {\n            return;\n        }\n\n        let result: any;\n        const relationModel = relationField.type as GetModels<Schema>;\n\n        for (const [action, subPayload] of Object.entries<any>(payload)) {\n            if (!subPayload) {\n                continue;\n            }\n            switch (action) {\n                case 'create': {\n                    const created = await this.create(kysely, relationModel, subPayload);\n                    // extract id fields and return as foreign key values\n                    result = getIdValues(this.schema, relationField.type, created);\n                    break;\n                }\n\n                case 'connect': {\n                    const referencedPkFields = relationField.relation!.references!;\n                    invariant(referencedPkFields, 'relation must have fields info');\n                    const extractedFks = extractFields(subPayload, referencedPkFields);\n                    if (Object.keys(extractedFks).length === referencedPkFields.length) {\n                        // payload contains all referenced pk fields, we can\n                        // directly use it to connect the relation\n                        result = extractedFks;\n                    } else {\n                        // read the relation entity and fetch the referenced pk fields\n                        const relationEntity = await this.readUnique(kysely, relationModel, {\n                            where: subPayload,\n                            select: fieldsToSelectObject(referencedPkFields) as any,\n                        });\n                        if (!relationEntity) {\n                            throw createNotFoundError(\n                                relationModel,\n                                `Could not find the entity to connect for the relation \"${relationField.name}\"`,\n                            );\n                        }\n                        result = relationEntity;\n                    }\n                    break;\n                }\n\n                case 'connectOrCreate': {\n                    const found = await this.exists(kysely, relationModel, subPayload.where);\n                    if (!found) {\n                        // create\n                        const created = await this.create(kysely, relationModel, subPayload.create);\n                        result = getIdValues(this.schema, relationField.type, created);\n                    } else {\n                        // connect\n                        result = found;\n                    }\n                    break;\n                }\n\n                default:\n                    throw createInvalidInputError(`Invalid relation action: ${action}`);\n            }\n        }\n\n        return result;\n    }\n\n    private async processNoneOwnedRelationForCreate(\n        kysely: AnyKysely,\n        contextModel: string,\n        relationFieldName: string,\n        payload: any,\n        parentEntity: any,\n    ) {\n        const relationFieldDef = this.requireField(contextModel, relationFieldName);\n        const relationModel = relationFieldDef.type as GetModels<Schema>;\n        const fromRelationContext: FromRelationContext = {\n            model: contextModel,\n            field: relationFieldName,\n            ids: parentEntity,\n            parentUpdates: {},\n        };\n\n        for (const [action, subPayload] of Object.entries<any>(payload)) {\n            if (!subPayload) {\n                continue;\n            }\n            switch (action) {\n                case 'create': {\n                    // create with a parent entity\n                    for (const item of enumerate(subPayload)) {\n                        await this.create(kysely, relationModel, item, fromRelationContext);\n                    }\n                    break;\n                }\n\n                case 'createMany': {\n                    invariant(relationFieldDef.array, 'relation must be an array for createMany');\n                    await this.createMany(\n                        kysely,\n                        relationModel,\n                        subPayload as { data: any; skipDuplicates: boolean },\n                        false,\n                        fromRelationContext,\n                    );\n                    break;\n                }\n\n                case 'connect': {\n                    await this.connectRelation(kysely, relationModel, subPayload, fromRelationContext);\n                    break;\n                }\n\n                case 'connectOrCreate': {\n                    for (const item of enumerate(subPayload)) {\n                        const found = await this.exists(kysely, relationModel, item.where);\n                        if (!found) {\n                            await this.create(kysely, relationModel, item.create, fromRelationContext);\n                        } else {\n                            await this.connectRelation(kysely, relationModel, found, fromRelationContext);\n                        }\n                    }\n                    break;\n                }\n\n                default:\n                    throw createInvalidInputError(`Invalid relation action: ${action}`);\n            }\n        }\n    }\n\n    protected async createMany<\n        ReturnData extends boolean,\n        Result = ReturnData extends true ? unknown[] : { count: number },\n    >(\n        kysely: ToKysely<Schema>,\n        model: GetModels<Schema>,\n        input: { data: any; skipDuplicates?: boolean },\n        returnData: ReturnData,\n        fromRelation?: FromRelationContext,\n        fieldsToReturn?: readonly string[],\n    ): Promise<Result> {\n        if (!input.data || (Array.isArray(input.data) && input.data.length === 0)) {\n            // nothing todo\n            return returnData ? ([] as Result) : ({ count: 0 } as Result);\n        }\n\n        const modelDef = this.requireModel(model);\n\n        const relationKeyPairs: { fk: string; pk: string }[] = [];\n        if (fromRelation) {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                this.schema,\n                fromRelation.model,\n                fromRelation.field,\n            );\n            if (ownedByModel) {\n                throw createInvalidInputError('incorrect relation hierarchy for createMany', model);\n            }\n            relationKeyPairs.push(...keyPairs);\n        }\n\n        let createData = enumerate(input.data).map((item) => {\n            const newItem: any = {};\n            for (const [name, value] of Object.entries(item)) {\n                const fieldDef = this.requireField(model, name);\n                invariant(!fieldDef.relation, 'createMany does not support relations');\n                newItem[name] = this.dialect.transformInput(value, fieldDef.type as BuiltinType, !!fieldDef.array, fieldDef);\n            }\n            if (fromRelation) {\n                for (const { fk, pk } of relationKeyPairs) {\n                    newItem[fk] = fromRelation.ids[pk];\n                }\n            }\n            return this.fillGeneratedAndDefaultValues(modelDef, newItem);\n        });\n\n        if (!this.dialect.supportsDefaultAsFieldValue) {\n            // if the dialect doesn't support `DEFAULT` as insert field values,\n            // we need to double check if data rows have mismatching fields, and\n            // if so, make sure all fields have default value filled if not provided\n            const allPassedFields = createData.reduce((acc, item) => {\n                Object.keys(item).forEach((field) => {\n                    if (!acc.includes(field)) {\n                        acc.push(field);\n                    }\n                });\n                return acc;\n            }, [] as string[]);\n            for (const item of createData) {\n                if (Object.keys(item).length === allPassedFields.length) {\n                    continue;\n                }\n                for (const field of allPassedFields) {\n                    if (!(field in item)) {\n                        const fieldDef = this.requireField(model, field);\n                        if (\n                            fieldDef.default !== undefined &&\n                            fieldDef.default !== null &&\n                            typeof fieldDef.default !== 'object'\n                        ) {\n                            item[field] = this.dialect.transformInput(\n                                fieldDef.default,\n                                fieldDef.type as BuiltinType,\n                                !!fieldDef.array,\n                                fieldDef,\n                            );\n                        }\n                    }\n                }\n            }\n        }\n\n        if (modelDef.baseModel) {\n            if (input.skipDuplicates) {\n                // TODO: simulate createMany with create in this case\n                throw createNotSupportedError('\"skipDuplicates\" options is not supported for polymorphic models');\n            }\n            // create base hierarchy\n            const baseCreateResult = await this.processBaseModelCreateMany(\n                kysely,\n                modelDef.baseModel,\n                createData,\n                !!input.skipDuplicates,\n                model,\n            );\n            createData = baseCreateResult.remainingFieldRows;\n        }\n\n        const query = kysely\n            .insertInto(model)\n            .values(createData)\n            .$if(!!input.skipDuplicates, (qb) =>\n                qb\n                    // case for `INSERT ... ON CONFLICT DO NOTHING` syntax\n                    .$if(this.dialect.insertIgnoreMethod === 'onConflict', () => qb.onConflict((oc) => oc.doNothing()))\n                    // case for `INSERT IGNORE` syntax\n                    .$if(this.dialect.insertIgnoreMethod === 'ignore', () => qb.ignore()),\n            )\n            .modifyEnd(\n                this.makeContextComment({\n                    model,\n                    operation: 'create',\n                }),\n            );\n\n        if (!returnData) {\n            const result = await this.executeQuery(kysely, query, 'createMany');\n            return { count: Number(result.numAffectedRows) } as Result;\n        } else {\n            fieldsToReturn = fieldsToReturn ?? requireIdFields(this.schema, model);\n\n            if (this.dialect.supportsReturning) {\n                const result = await query.returning(fieldsToReturn as any).execute();\n                return result as Result;\n            } else {\n                // Fallback for databases that don't support RETURNING (e.g., MySQL)\n                // For createMany without RETURNING, we can't reliably get all inserted records\n                // especially with auto-increment IDs. The best we can do is return the count.\n                // If users need the created records, they should use multiple create() calls\n                // or the application should query after insertion.\n                throw createNotSupportedError(\n                    `\\`createManyAndReturn\\` is not supported for ${this.dialect.provider}. ` +\n                        `Use multiple \\`create\\` calls or query the records after insertion.`,\n                );\n            }\n        }\n    }\n\n    private async processBaseModelCreateMany(\n        kysely: ToKysely<Schema>,\n        model: string,\n        createRows: any[],\n        skipDuplicates: boolean,\n        forModel: GetModels<Schema>,\n    ) {\n        const thisCreateRows: any[] = [];\n        const remainingFieldRows: any[] = [];\n        const discriminatorField = getDiscriminatorField(this.schema, model);\n        invariant(discriminatorField, `Base model \"${model}\" must have a discriminator field`);\n\n        for (const createFields of createRows) {\n            const thisCreateFields: any = {};\n            const remainingFields: any = {};\n            Object.entries(createFields).forEach(([field, value]) => {\n                const fieldDef = this.getField(model, field);\n                if (fieldDef) {\n                    thisCreateFields[field] = value;\n                } else {\n                    remainingFields[field] = value;\n                }\n            });\n            thisCreateFields[discriminatorField] = getDelegateDiscriminatorValue(this.schema, forModel);\n            thisCreateRows.push(thisCreateFields);\n            remainingFieldRows.push(remainingFields);\n        }\n\n        // create base model entity\n        let baseEntities: unknown[];\n        if (this.dialect.supportsReturning) {\n            baseEntities = await this.createMany(\n                kysely,\n                model as GetModels<Schema>,\n                { data: thisCreateRows, skipDuplicates },\n                true,\n            );\n        } else {\n            // fall back to multiple creates if RETURNING is not supported\n            baseEntities = [];\n            for (const row of thisCreateRows) {\n                baseEntities.push(await this.create(kysely, model, row, undefined, true));\n            }\n        }\n\n        // copy over id fields from base model\n        for (let i = 0; i < baseEntities.length; i++) {\n            const idValues = extractIdFields(baseEntities[i], this.schema, model);\n            Object.assign(remainingFieldRows[i], idValues);\n        }\n        return { baseEntities, remainingFieldRows };\n    }\n\n    private fillGeneratedAndDefaultValues(modelDef: ModelDef, data: object) {\n        const fields = modelDef.fields;\n        const values: any = clone(data);\n        for (const [field, fieldDef] of Object.entries(fields)) {\n            if (fieldDef.originModel) {\n                // skip fields from delegate base\n                continue;\n            }\n            if (!(field in data)) {\n                if (typeof fieldDef?.default === 'object' && 'kind' in fieldDef.default) {\n                    const generated = this.evalGenerator(fieldDef.default);\n                    if (generated !== undefined) {\n                        values[field] = this.dialect.transformInput(\n                            generated,\n                            fieldDef.type as BuiltinType,\n                            !!fieldDef.array,\n                            fieldDef,\n                        );\n                    }\n                } else if (fieldDef?.updatedAt) {\n                    // TODO: should this work at kysely level instead?\n                    values[field] = this.dialect.transformInput(new Date(), 'DateTime', false, fieldDef);\n                } else if (fieldDef?.default !== undefined) {\n                    let value = fieldDef.default;\n                    if (fieldDef.type === 'Json') {\n                        // Schema uses JSON string for default value of Json fields\n                        if (fieldDef.array && Array.isArray(value)) {\n                            value = value.map((v) => (typeof v === 'string' ? JSON.parse(v) : v));\n                        } else if (typeof value === 'string') {\n                            value = JSON.parse(value);\n                        }\n                    }\n                    values[field] = this.dialect.transformInput(value, fieldDef.type as BuiltinType, !!fieldDef.array, fieldDef);\n                }\n            }\n        }\n        return values;\n    }\n\n    private evalGenerator(defaultValue: Expression) {\n        if (ExpressionUtils.isCall(defaultValue)) {\n            const firstArgVal =\n                defaultValue.args?.[0] && ExpressionUtils.isLiteral(defaultValue.args[0])\n                    ? defaultValue.args[0].value\n                    : undefined;\n            return match(defaultValue.function)\n                .with('cuid', () => {\n                    const version = firstArgVal;\n                    const generated = version === 2 ? cuid2() : cuid1();\n                    return this.formatGeneratedValue(generated, defaultValue.args?.[1]);\n                })\n                .with('uuid', () => {\n                    const version = firstArgVal;\n                    const generated = version === 7 ? uuid.v7() : uuid.v4();\n                    return this.formatGeneratedValue(generated, defaultValue.args?.[1]);\n                })\n                .with('nanoid', () => {\n                    const length = firstArgVal;\n                    const generated = typeof length === 'number' ? nanoid(length) : nanoid();\n                    return this.formatGeneratedValue(generated, defaultValue.args?.[1]);\n                })\n                .with('ulid', () => this.formatGeneratedValue(ulid(), defaultValue.args?.[0]))\n                .with('now', () => new Date())\n                .otherwise(() => undefined);\n        } else if (\n            ExpressionUtils.isMember(defaultValue) &&\n            ExpressionUtils.isCall(defaultValue.receiver) &&\n            defaultValue.receiver.function === 'auth'\n        ) {\n            // `auth()` member access\n            let val: any = this.client.$auth;\n            for (const member of defaultValue.members) {\n                val = val?.[member];\n            }\n            return val ?? null;\n        } else {\n            return undefined;\n        }\n    }\n\n    private formatGeneratedValue(generated: string, formatExpr?: Expression) {\n        if (!formatExpr || !ExpressionUtils.isLiteral(formatExpr) || typeof formatExpr.value !== 'string') {\n            return generated;\n        }\n\n        // Replace non-escaped %s with the generated value, then unescape \\%s to %s\n        return formatExpr.value.replace(/(?<!\\\\)%s/g, generated).replace(/\\\\%s/g, '%s');\n    }\n\n    /**\n     * @returns\n     * - throw if `throwIfNotFound` is true and the entity to update is not found\n     * - otherwise, null if the entity to update is not found\n     * - if found and `fieldsToReturn` is specified, return the post-update fields\n     * - if found and `fieldsToReturn` is not specified, return true (indicating success)\n     */\n    protected async update(\n        kysely: AnyKysely,\n        model: string,\n        where: any,\n        data: any,\n        fromRelation?: FromRelationContext,\n        allowRelationUpdate = true,\n        throwIfNotFound = true,\n        fieldsToReturn?: readonly string[],\n    ): Promise<unknown> {\n        if (!data || typeof data !== 'object') {\n            throw createInvalidInputError('data must be an object');\n        }\n\n        const parentWhere = await this.buildUpdateParentRelationFilter(kysely, fromRelation);\n\n        let combinedWhere: Record<string, unknown> = where ?? true;\n        if (Object.keys(parentWhere).length > 0) {\n            combinedWhere = Object.keys(combinedWhere).length > 0 ? { AND: [parentWhere, combinedWhere] } : parentWhere;\n        }\n        const origWhere = combinedWhere;\n\n        const modelDef = this.requireModel(model);\n        let finalData = data;\n\n        // fill in automatically updated fields\n        const autoUpdatedFields: string[] = [];\n        for (const [fieldName, fieldDef] of Object.entries(modelDef.fields)) {\n            if (fieldDef.updatedAt && finalData[fieldName] === undefined) {\n                const ignoredFields = new Set(typeof fieldDef.updatedAt === 'boolean' ? [] : fieldDef.updatedAt.ignore);\n                const hasNonIgnoredFields = Object.keys(data).some(\n                    (field) =>\n                        (isScalarField(this.schema, modelDef.name, field) ||\n                            isForeignKeyField(this.schema, modelDef.name, field)) &&\n                        !ignoredFields.has(field),\n                );\n                if (hasNonIgnoredFields) {\n                    if (finalData === data) {\n                        finalData = clone(data);\n                    }\n                    finalData[fieldName] = this.dialect.transformInput(new Date(), 'DateTime', false, fieldDef);\n                    autoUpdatedFields.push(fieldName);\n                }\n            }\n        }\n\n        // lazily load the entity to be updated\n        let thisEntity: any;\n        const loadThisEntity = async () => {\n            if (thisEntity === undefined) {\n                thisEntity = (await this.getEntityIds(kysely, model, origWhere)) ?? null;\n                if (!thisEntity && throwIfNotFound) {\n                    throw createNotFoundError(model);\n                }\n            }\n            return thisEntity;\n        };\n\n        if (Object.keys(finalData).length === 0) {\n            return loadThisEntity();\n        }\n\n        if (\n            // when updating a model with delegate base, base fields may be referenced in the filter,\n            // so we read the id out if the filter and and use it as the update filter instead\n            modelDef.baseModel ||\n            // for dialects that don't support RETURNING, we need to read the id fields\n            // to identify the updated entity for toplevel updates\n            (!this.dialect.supportsReturning && !fromRelation)\n        ) {\n            // update the filter to db-loaded id fields\n            combinedWhere = await loadThisEntity();\n            if (!combinedWhere) {\n                // not found\n                return null;\n            }\n        }\n\n        if (modelDef.baseModel) {\n            const baseUpdateResult = await this.processBaseModelUpdate(\n                kysely,\n                modelDef.baseModel,\n                combinedWhere,\n                finalData,\n                throwIfNotFound,\n            );\n\n            if (!baseUpdateResult.baseEntity) {\n                // base entity not found\n                if (throwIfNotFound) {\n                    throw createNotFoundError(model);\n                } else {\n                    return null;\n                }\n            }\n\n            // only fields not consumed by base update will be used for this model\n            finalData = baseUpdateResult.remainingFields;\n            // make sure to include only the id fields from the base entity in the final filter\n            combinedWhere = getIdValues(this.schema, modelDef.baseModel!, baseUpdateResult.baseEntity);\n\n            // update this entity with fields in updated base\n            await loadThisEntity();\n            if (thisEntity) {\n                for (const [key, value] of Object.entries(baseUpdateResult.baseEntity)) {\n                    if (key in thisEntity) {\n                        thisEntity[key] = value;\n                    }\n                }\n            } else {\n                // base entity not found\n                return null;\n            }\n        }\n\n        const updateFields: any = {};\n\n        for (const field in finalData) {\n            const fieldDef = this.requireField(model, field);\n            if (isScalarField(this.schema, model, field) || isForeignKeyField(this.schema, model, field)) {\n                updateFields[field] = this.processScalarFieldUpdateData(model, field, finalData);\n            } else {\n                if (!allowRelationUpdate) {\n                    throw createNotSupportedError(`Relation update not allowed for field \"${field}\"`);\n                }\n\n                // load this entity for passing on to relation updates as parent\n                const relationParent = await loadThisEntity();\n                if (!relationParent) {\n                    // not found\n                    return null;\n                }\n\n                const parentUpdates = await this.processRelationUpdates(\n                    kysely,\n                    model,\n                    field,\n                    fieldDef,\n                    relationParent,\n                    finalData[field],\n                );\n\n                if (Object.keys(parentUpdates).length > 0) {\n                    // merge field updates propagated from nested relation processing\n                    Object.assign(updateFields, parentUpdates);\n                }\n            }\n        }\n\n        let hasFieldUpdate = Object.keys(updateFields).length > 0;\n        if (hasFieldUpdate) {\n            // check if only updating auto-updated fields, if so, we can skip the update\n            hasFieldUpdate = Object.keys(updateFields).some((f) => !autoUpdatedFields.includes(f));\n        }\n\n        if (!hasFieldUpdate) {\n            // nothing to update, return the existing entity\n            return loadThisEntity();\n        } else {\n            let updatedEntity: any;\n\n            if (this.dialect.supportsReturning) {\n                const returnFields = fieldsToReturn !== undefined && fieldsToReturn.length > 0;\n                const query = kysely\n                    .updateTable(model)\n                    .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n                    .set(updateFields)\n                    .$if(returnFields, (qb) => qb.returning(fieldsToReturn as any))\n                    .modifyEnd(\n                        this.makeContextComment({\n                            model,\n                            operation: 'update',\n                        }),\n                    );\n\n                if (returnFields) {\n                    updatedEntity = await this.executeQueryTakeFirst(kysely, query, 'update');\n                } else {\n                    const r = await this.executeQuery(kysely, query, 'update');\n                    if (!r.numAffectedRows) {\n                        // nothing updated\n                        updatedEntity = null;\n                    } else {\n                        // if no specific fields to return, we are done, return `true` to indicate a successful update\n                        updatedEntity = true;\n                    }\n                }\n            } else {\n                // post-update read filter\n                let readFilter = combinedWhere;\n\n                // check if we are updating any id fields, if so, we need to fetch original entity ids\n                // before the update, and overwrite the filter with updated id values for post-update read\n                const idFields = requireIdFields(this.schema, model);\n                const updatingIdFields = idFields.some((idField) => idField in updateFields);\n\n                if (updatingIdFields) {\n                    const origIdValues = await loadThisEntity();\n                    invariant(origIdValues, 'Original entity should have been loaded for update without RETURNING');\n\n                    readFilter = { ...origIdValues };\n                    // replace id fields in the filter with updated values if they are being updated\n                    // const readFilter: any = { ...origWhere };\n                    for (const idField of idFields) {\n                        if (idField in updateFields && updateFields[idField] !== undefined) {\n                            // if id fields are being updated, use the new values\n                            readFilter[idField] = updateFields[idField];\n                        }\n                    }\n                }\n\n                // Fallback for databases that don't support RETURNING (e.g., MySQL)\n                const updateQuery = kysely\n                    .updateTable(model)\n                    .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n                    .set(updateFields)\n                    .modifyEnd(\n                        this.makeContextComment({\n                            model,\n                            operation: 'update',\n                        }),\n                    );\n\n                const updateResult = await this.executeQuery(kysely, updateQuery, 'update');\n\n                if (!updateResult.numAffectedRows) {\n                    // nothing updated\n                    updatedEntity = null;\n                } else if (fieldsToReturn === undefined || fieldsToReturn.length === 0) {\n                    // if no specific fields to return, we are done, return `true` to indicate a successful update\n                    updatedEntity = true;\n                } else {\n                    if (!updatingIdFields) {\n                        // not updating id fields, we can directly return original id values\n                        updatedEntity = await loadThisEntity();\n                    } else {\n                        // otherwise we need to re-query the updated entity\n                        const selectQuery = kysely\n                            .selectFrom(model)\n                            .select(fieldsToReturn as any)\n                            .where(() => this.dialect.buildFilter(model, model, readFilter));\n                        updatedEntity = await this.executeQueryTakeFirst(kysely, selectQuery, 'update');\n                    }\n                }\n            }\n\n            if (!updatedEntity) {\n                if (throwIfNotFound) {\n                    throw createNotFoundError(model);\n                } else {\n                    return null;\n                }\n            }\n\n            return updatedEntity;\n        }\n    }\n\n    private async buildUpdateParentRelationFilter(kysely: AnyKysely, fromRelation: FromRelationContext | undefined) {\n        const parentWhere: any = {};\n        let m2m: ReturnType<typeof getManyToManyRelation> = undefined;\n        if (fromRelation) {\n            m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n            if (!m2m) {\n                // merge foreign key conditions from the relation\n                const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                    this.schema,\n                    fromRelation.model,\n                    fromRelation.field,\n                );\n                if (ownedByModel) {\n                    const fromEntity = await this.readUnique(kysely, fromRelation.model, {\n                        where: fromRelation.ids,\n                    });\n                    for (const { fk, pk } of keyPairs) {\n                        parentWhere[pk] = fromEntity[fk];\n                    }\n                } else {\n                    for (const { fk, pk } of keyPairs) {\n                        parentWhere[fk] = fromRelation.ids[pk];\n                    }\n                }\n            } else {\n                // many-to-many relation, filter for parent with \"some\"\n                const fromRelationFieldDef = this.requireField(fromRelation.model, fromRelation.field);\n                invariant(fromRelationFieldDef.relation?.opposite);\n                parentWhere[fromRelationFieldDef.relation.opposite] = {\n                    some: fromRelation.ids,\n                };\n            }\n        }\n        return parentWhere;\n    }\n\n    private processScalarFieldUpdateData(model: string, field: string, data: any): any {\n        const fieldDef = this.requireField(model, field);\n        if (this.isNumericIncrementalUpdate(fieldDef, data[field])) {\n            // numeric fields incremental updates\n            return this.transformIncrementalUpdate(model, field, fieldDef, data[field]);\n        }\n\n        if (fieldDef.array && typeof data[field] === 'object' && !Array.isArray(data[field]) && data[field]) {\n            // scalar list updates\n            return this.transformScalarListUpdate(model, field, fieldDef, data[field]);\n        }\n\n        return this.dialect.transformInput(data[field], fieldDef.type as BuiltinType, !!fieldDef.array, fieldDef);\n    }\n\n    private isNumericIncrementalUpdate(fieldDef: FieldDef, value: any) {\n        if (!this.isNumericField(fieldDef)) {\n            return false;\n        }\n        if (typeof value !== 'object' || !value) {\n            return false;\n        }\n        return ['increment', 'decrement', 'multiply', 'divide', 'set'].some((key) => key in value);\n    }\n\n    private async processBaseModelUpdate(\n        kysely: ToKysely<Schema>,\n        model: string,\n        where: any,\n        updateFields: any,\n        throwIfNotFound: boolean,\n    ) {\n        const thisUpdateFields: any = {};\n        const remainingFields: any = {};\n\n        Object.entries(updateFields).forEach(([field, value]) => {\n            const fieldDef = this.getField(model, field);\n            if (fieldDef) {\n                thisUpdateFields[field] = value;\n            } else {\n                remainingFields[field] = value;\n            }\n        });\n\n        // update base model entity\n        const baseEntity: any = await this.update(\n            kysely,\n            model as GetModels<Schema>,\n            where,\n            thisUpdateFields,\n            undefined,\n            undefined,\n            throwIfNotFound,\n            requireIdFields(this.schema, model),\n        );\n        return { baseEntity, remainingFields };\n    }\n\n    private transformIncrementalUpdate(\n        model: string,\n        field: string,\n        fieldDef: FieldDef,\n        payload: Record<string, number | null>,\n    ) {\n        invariant(\n            Object.keys(payload).length === 1,\n            'Only one of \"set\", \"increment\", \"decrement\", \"multiply\", or \"divide\" can be provided',\n        );\n\n        const key = Object.keys(payload)[0];\n        const value = this.dialect.transformInput(payload[key!], fieldDef.type as BuiltinType, false, fieldDef);\n        const eb = expressionBuilder<any, any>();\n        const fieldRef = this.dialect.fieldRef(model, field);\n\n        return match(key)\n            .with('set', () => value)\n            .with('increment', () => eb(fieldRef, '+', value))\n            .with('decrement', () => eb(fieldRef, '-', value))\n            .with('multiply', () => eb(fieldRef, '*', value))\n            .with('divide', () => eb(fieldRef, '/', value))\n            .otherwise(() => {\n                throw createInvalidInputError(`Invalid incremental update operation: ${key}`);\n            });\n    }\n\n    private transformScalarListUpdate(\n        model: string,\n        field: string,\n        fieldDef: FieldDef,\n        payload: Record<string, unknown>,\n    ) {\n        invariant(Object.keys(payload).length === 1, 'Only one of \"set\", \"push\" can be provided');\n        const key = Object.keys(payload)[0];\n        const value = this.dialect.transformInput(payload[key!], fieldDef.type as BuiltinType, true, fieldDef);\n        const eb = expressionBuilder<any, any>();\n        const fieldRef = this.dialect.fieldRef(model, field);\n\n        return match(key)\n            .with('set', () => value)\n            .with('push', () => {\n                return eb(fieldRef, '||', eb.val(ensureArray(value)));\n            })\n            .otherwise(() => {\n                throw createInvalidInputError(`Invalid array update operation: ${key}`);\n            });\n    }\n\n    private isNumericField(fieldDef: FieldDef) {\n        return NUMERIC_FIELD_TYPES.includes(fieldDef.type) && !fieldDef.array;\n    }\n\n    private makeContextComment(_context: { model: string; operation: CRUD }) {\n        return sql``;\n        // return sql.raw(`${CONTEXT_COMMENT_PREFIX}${JSON.stringify(context)}`);\n    }\n\n    protected async updateMany<\n        ReturnData extends boolean,\n        Result = ReturnData extends true ? unknown[] : { count: number },\n    >(\n        kysely: AnyKysely,\n        model: string,\n        where: any,\n        data: any,\n        limit: number | undefined,\n        returnData: ReturnData,\n        filterModel?: string,\n        fromRelation?: FromRelationContext,\n        fieldsToReturn?: readonly string[],\n    ): Promise<Result> {\n        if (typeof data !== 'object') {\n            throw createInvalidInputError('data must be an object');\n        }\n\n        if (Object.keys(data).length === 0) {\n            return (returnData ? [] : { count: 0 }) as Result;\n        }\n\n        const modelDef = this.requireModel(model);\n        if (modelDef.baseModel && limit !== undefined) {\n            throw createNotSupportedError('Updating with a limit is not supported for polymorphic models');\n        }\n\n        const parentWhere = await this.buildUpdateParentRelationFilter(kysely, fromRelation);\n        let combinedWhere: WhereInput<Schema, GetModels<Schema>, any, false> = where ?? true;\n        if (Object.keys(parentWhere).length > 0) {\n            combinedWhere = Object.keys(combinedWhere).length > 0 ? { AND: [parentWhere, combinedWhere] } : parentWhere;\n        }\n\n        filterModel ??= model;\n        let updateFields: any = {};\n\n        for (const field in data) {\n            if (isRelationField(this.schema, model, field)) {\n                continue;\n            }\n            updateFields[field] = this.processScalarFieldUpdateData(model, field, data);\n        }\n\n        let resultFromBaseModel: any = undefined;\n        if (modelDef.baseModel) {\n            const baseResult = await this.processBaseModelUpdateMany(\n                kysely,\n                modelDef.baseModel,\n                combinedWhere,\n                updateFields,\n                filterModel,\n            );\n            updateFields = baseResult.remainingFields;\n            resultFromBaseModel = baseResult.baseResult;\n        }\n\n        // check again if we don't have anything to update for this model\n        if (Object.keys(updateFields).length === 0) {\n            // return result from base model if it exists, otherwise return empty result\n            return resultFromBaseModel ?? ((returnData ? [] : { count: 0 }) as Result);\n        }\n\n        let shouldFallbackToIdFilter = false;\n\n        if (limit !== undefined && !this.dialect.supportsUpdateWithLimit) {\n            // if the dialect doesn't support update with limit natively, we'll\n            // simulate it by filtering by id with a limit\n            shouldFallbackToIdFilter = true;\n        }\n\n        if (modelDef.isDelegate || modelDef.baseModel) {\n            // if the model is in a delegate hierarchy, we'll need to filter by\n            // id because the filter may involve fields in different models in\n            // the hierarchy\n            shouldFallbackToIdFilter = true;\n        }\n\n        let query = kysely.updateTable(model).set(updateFields);\n\n        if (!shouldFallbackToIdFilter) {\n            // simple filter\n            query = query\n                .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n                .$if(limit !== undefined, (qb) => qb.limit(limit!));\n        } else {\n            query = query.where((eb) =>\n                eb(\n                    eb.refTuple(\n                        // @ts-expect-error\n                        ...this.buildIdFieldRefs(kysely, model),\n                    ),\n                    'in',\n                    // the outer \"select *\" is needed to isolate the sub query (as needed for dialects like mysql)\n                    eb\n                        .selectFrom(\n                            this.dialect\n                                .buildSelectModel(filterModel, filterModel)\n                                .where(this.dialect.buildFilter(filterModel, filterModel, combinedWhere))\n                                .select(this.buildIdFieldRefs(kysely, filterModel))\n                                .$if(limit !== undefined, (qb) => qb.limit(limit!))\n                                .as('$sub'),\n                        )\n                        .selectAll(),\n                ),\n            );\n        }\n\n        query = query.modifyEnd(this.makeContextComment({ model, operation: 'update' }));\n\n        if (!returnData) {\n            const result = await this.executeQuery(kysely, query, 'update');\n            return { count: Number(result.numAffectedRows) } as Result;\n        } else {\n            fieldsToReturn = fieldsToReturn ?? requireIdFields(this.schema, model);\n\n            if (this.dialect.supportsReturning) {\n                const finalQuery = query.returning(fieldsToReturn as any);\n                const result = await this.executeQuery(kysely, finalQuery, 'update');\n                return result.rows as Result;\n            } else {\n                // Fallback for databases that don't support RETURNING (e.g., MySQL)\n                // First, select the records to be updated\n                let selectQuery = kysely.selectFrom(model).selectAll();\n\n                if (!shouldFallbackToIdFilter) {\n                    selectQuery = selectQuery\n                        .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n                        .$if(limit !== undefined, (qb) => qb.limit(limit!));\n                } else {\n                    selectQuery = selectQuery.where((eb) =>\n                        eb(\n                            eb.refTuple(\n                                // @ts-expect-error\n                                ...this.buildIdFieldRefs(kysely, model),\n                            ),\n                            'in',\n                            this.dialect\n                                .buildSelectModel(filterModel, filterModel)\n                                .where(this.dialect.buildFilter(filterModel, filterModel, combinedWhere))\n                                .select(this.buildIdFieldRefs(kysely, filterModel))\n                                .$if(limit !== undefined, (qb) => qb.limit(limit!)),\n                        ),\n                    );\n                }\n\n                const recordsToUpdate = await this.executeQuery(kysely, selectQuery, 'update');\n\n                // Execute the update\n                await this.executeQuery(kysely, query, 'update');\n\n                // Return the IDs of updated records, then query them back with updated values\n                if (recordsToUpdate.rows.length === 0) {\n                    return [] as Result;\n                }\n\n                const idFields = requireIdFields(this.schema, model);\n                const updatedIds = recordsToUpdate.rows.map((row: any) => {\n                    const id: Record<string, any> = {};\n                    for (const idField of idFields) {\n                        id[idField] = row[idField];\n                    }\n                    return id;\n                });\n\n                // Query back the updated records\n                const resultQuery = kysely\n                    .selectFrom(model)\n                    .selectAll()\n                    .where((eb) => {\n                        const conditions = updatedIds.map((id) => {\n                            const idConditions = Object.entries(id).map(([field, value]) => eb.eb(field, '=', value));\n                            return eb.and(idConditions);\n                        });\n                        return eb.or(conditions);\n                    });\n\n                const result = await this.executeQuery(kysely, resultQuery, 'update');\n                return result.rows as Result;\n            }\n        }\n    }\n\n    private async processBaseModelUpdateMany(\n        kysely: AnyKysely,\n        model: string,\n        where: any,\n        updateFields: any,\n        filterModel: string,\n    ) {\n        const thisUpdateFields: any = {};\n        const remainingFields: any = {};\n\n        Object.entries(updateFields).forEach(([field, value]) => {\n            const fieldDef = this.getField(model, field);\n            if (fieldDef) {\n                thisUpdateFields[field] = value;\n            } else {\n                remainingFields[field] = value;\n            }\n        });\n\n        // update base model entity\n        const baseResult: any = await this.updateMany(\n            kysely,\n            model as GetModels<Schema>,\n            where,\n            thisUpdateFields,\n            undefined,\n            false,\n            filterModel,\n        );\n        return { baseResult, remainingFields };\n    }\n\n    private buildIdFieldRefs(kysely: AnyKysely, model: string) {\n        const idFields = requireIdFields(this.schema, model);\n        return idFields.map((f) => kysely.dynamic.ref(`${model}.${f}`));\n    }\n\n    private async processRelationUpdates(\n        kysely: AnyKysely,\n        model: string,\n        field: string,\n        fieldDef: FieldDef,\n        parentIds: any,\n        args: any,\n    ) {\n        const fieldModel = fieldDef.type as GetModels<Schema>;\n        const fromRelationContext: FromRelationContext = {\n            model,\n            field,\n            ids: parentIds,\n            parentUpdates: {},\n        };\n\n        for (const [key, value] of Object.entries(args)) {\n            switch (key) {\n                case 'create': {\n                    invariant(\n                        !Array.isArray(value) || fieldDef.array,\n                        'relation must be an array if create is an array',\n                    );\n                    for (const item of enumerate(value)) {\n                        await this.create(kysely, fieldModel, item, fromRelationContext);\n                    }\n                    break;\n                }\n\n                case 'createMany': {\n                    invariant(fieldDef.array, 'relation must be an array for createMany');\n                    await this.createMany(\n                        kysely,\n                        fieldModel,\n                        value as { data: any; skipDuplicates: boolean },\n                        false,\n                        fromRelationContext,\n                    );\n                    break;\n                }\n\n                case 'connect': {\n                    await this.connectRelation(kysely, fieldModel, value, fromRelationContext);\n                    break;\n                }\n\n                case 'connectOrCreate': {\n                    await this.connectOrCreateRelation(kysely, fieldModel, value, fromRelationContext);\n                    break;\n                }\n\n                case 'disconnect': {\n                    await this.disconnectRelation(kysely, fieldModel, value, fromRelationContext);\n                    break;\n                }\n\n                case 'set': {\n                    invariant(fieldDef.array, 'relation must be an array');\n                    await this.setRelation(kysely, fieldModel, value, fromRelationContext);\n                    break;\n                }\n\n                case 'update': {\n                    for (const _item of enumerate(value)) {\n                        const item = _item as { where: any; data: any };\n                        let where;\n                        let data;\n                        if ('data' in item && typeof item.data === 'object') {\n                            where = item.where;\n                            data = item.data;\n                        } else {\n                            where = undefined;\n                            data = item;\n                        }\n                        // update should throw if:\n                        // - to-many: there's a where clause and no entity is found\n                        // - to-one: always throw if no entity is found\n                        const throwIfNotFound = !fieldDef.array || !!where;\n                        await this.update(kysely, fieldModel, where, data, fromRelationContext, true, throwIfNotFound);\n                    }\n                    break;\n                }\n\n                case 'upsert': {\n                    for (const _item of enumerate(value)) {\n                        const item = _item as {\n                            where: any;\n                            create: any;\n                            update: any;\n                        };\n\n                        const updated = await this.update(\n                            kysely,\n                            fieldModel,\n                            item.where,\n                            item.update,\n                            fromRelationContext,\n                            true,\n                            false,\n                        );\n                        if (!updated) {\n                            await this.create(kysely, fieldModel, item.create, fromRelationContext);\n                        }\n                    }\n                    break;\n                }\n\n                case 'updateMany': {\n                    for (const _item of enumerate(value)) {\n                        const item = _item as { where: any; data: any; limit: number | undefined };\n                        await this.updateMany(\n                            kysely,\n                            fieldModel,\n                            item.where,\n                            item.data,\n                            item.limit,\n                            false,\n                            fieldModel,\n                            fromRelationContext,\n                        );\n                    }\n                    break;\n                }\n\n                case 'delete': {\n                    await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, true, true);\n                    break;\n                }\n\n                case 'deleteMany': {\n                    await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, false, false);\n                    break;\n                }\n\n                default: {\n                    throw createInvalidInputError(`Invalid relation update operation: ${key}`);\n                }\n            }\n        }\n\n        return fromRelationContext.parentUpdates;\n    }\n\n    // #region relation manipulation\n\n    protected async connectRelation(kysely: AnyKysely, model: string, data: any, fromRelation: FromRelationContext) {\n        const _data = this.normalizeRelationManipulationInput(model, data);\n        if (_data.length === 0) {\n            return;\n        }\n\n        const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n        if (m2m) {\n            // handle many-to-many relation: batch fetch all entity IDs in one query\n            const allIds = await this.getEntitiesIds(kysely, model, _data);\n            if (allIds.length !== _data.length) {\n                throw createNotFoundError(model);\n            }\n            await this.handleManyToManyRelation(\n                kysely,\n                'connect',\n                fromRelation.model,\n                fromRelation.field,\n                fromRelation.ids,\n                m2m.otherModel!,\n                m2m.otherField!,\n                allIds,\n                m2m.joinTable,\n            );\n        } else {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                this.schema,\n                fromRelation.model,\n                fromRelation.field,\n            );\n\n            if (ownedByModel) {\n                // record parent fk update\n                invariant(_data.length === 1, 'only one entity can be connected');\n                const target = await this.readUnique(kysely, model, {\n                    where: _data[0],\n                });\n                if (!target) {\n                    throw createNotFoundError(model);\n                }\n\n                for (const { fk, pk } of keyPairs) {\n                    fromRelation.parentUpdates[fk] = target[pk];\n                }\n            } else {\n                // disconnect current if it's a one-one relation\n                const relationFieldDef = this.requireField(fromRelation.model, fromRelation.field);\n\n                if (!relationFieldDef.array) {\n                    const query = kysely\n                        .updateTable(model)\n                        .where((eb) => eb.and(keyPairs.map(({ fk, pk }) => eb(eb.ref(fk), '=', fromRelation.ids[pk]))))\n                        .set(keyPairs.reduce((acc, { fk }) => ({ ...acc, [fk]: null }), {} as any))\n                        .modifyEnd(\n                            this.makeContextComment({\n                                model: fromRelation.model,\n                                operation: 'update',\n                            }),\n                        );\n                    await this.executeQuery(kysely, query, 'disconnect');\n                }\n\n                // connect\n                const query = kysely\n                    .updateTable(model)\n                    .where((eb) => eb.or(_data.map((d) => eb.and(d))))\n                    .set(\n                        keyPairs.reduce(\n                            (acc, { fk, pk }) => ({\n                                ...acc,\n                                [fk]: fromRelation.ids[pk],\n                            }),\n                            {} as any,\n                        ),\n                    )\n                    .modifyEnd(\n                        this.makeContextComment({\n                            model,\n                            operation: 'update',\n                        }),\n                    );\n                const updateResult = await this.executeQuery(kysely, query, 'connect');\n\n                // validate connect result\n                if (!updateResult.numAffectedRows || _data.length > updateResult.numAffectedRows) {\n                    // some entities were not connected\n                    throw createNotFoundError(model);\n                }\n            }\n        }\n    }\n\n    protected async connectOrCreateRelation(\n        kysely: ToKysely<Schema>,\n        model: GetModels<Schema>,\n        data: any,\n        fromRelation: FromRelationContext,\n    ) {\n        const _data = enumerate(data);\n        if (_data.length === 0) {\n            return;\n        }\n\n        for (const { where, create } of _data) {\n            const existing = await this.exists(kysely, model, where);\n            if (existing) {\n                await this.connectRelation(kysely, model, [where], fromRelation);\n            } else {\n                await this.create(kysely, model, create, fromRelation);\n            }\n        }\n    }\n\n    protected async disconnectRelation(kysely: AnyKysely, model: string, data: any, fromRelation: FromRelationContext) {\n        let disconnectConditions: any[] = [];\n        if (typeof data === 'boolean') {\n            if (data === false) {\n                return;\n            } else {\n                disconnectConditions = [true];\n            }\n        } else if (isEmptyObject(data)) {\n            // empty object means true\n            disconnectConditions = [true];\n        } else {\n            disconnectConditions = this.normalizeRelationManipulationInput(model, data);\n\n            if (disconnectConditions.length === 0) {\n                return;\n            }\n        }\n\n        if (disconnectConditions.length === 0) {\n            return;\n        }\n\n        const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n        if (m2m) {\n            // handle many-to-many relation: batch fetch all entity IDs in one query\n            const allIds = await this.getEntitiesIds(kysely, model, disconnectConditions);\n            if (allIds.length > 0) {\n                await this.handleManyToManyRelation(\n                    kysely,\n                    'disconnect',\n                    fromRelation.model,\n                    fromRelation.field,\n                    fromRelation.ids,\n                    m2m.otherModel,\n                    m2m.otherField,\n                    allIds,\n                    m2m.joinTable,\n                );\n            }\n        } else {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                this.schema,\n                fromRelation.model,\n                fromRelation.field,\n            );\n\n            const eb = expressionBuilder<any, any>();\n            if (ownedByModel) {\n                // record parent fk update\n                invariant(disconnectConditions.length === 1, 'only one entity can be disconnected');\n                const condition = disconnectConditions[0];\n\n                if (condition === true) {\n                    // just disconnect, record parent fk update\n                    for (const { fk } of keyPairs) {\n                        fromRelation.parentUpdates[fk] = null;\n                    }\n                } else {\n                    // disconnect with a filter\n\n                    // read parent's fk\n                    const fromEntity = await this.readUnique(kysely, fromRelation.model, {\n                        where: fromRelation.ids,\n                        select: fieldsToSelectObject(keyPairs.map(({ fk }) => fk)),\n                    });\n                    if (!fromEntity || keyPairs.some(({ fk }) => fromEntity[fk] == null)) {\n                        return;\n                    }\n\n                    // check if the disconnect target exists under parent fk and the filter condition\n                    const relationFilter = {\n                        AND: [condition, Object.fromEntries(keyPairs.map(({ fk, pk }) => [pk, fromEntity[fk]]))],\n                    };\n\n                    // if the target exists, record parent fk update, otherwise do nothing\n                    const targetExists = await this.read(kysely, model, {\n                        where: relationFilter,\n                        take: 1,\n                        select: this.makeIdSelect(model),\n                    } as any);\n                    if (targetExists.length > 0) {\n                        for (const { fk } of keyPairs) {\n                            fromRelation.parentUpdates[fk] = null;\n                        }\n                    }\n                }\n            } else {\n                // disconnect\n                const query = kysely\n                    .updateTable(model)\n                    .where(\n                        eb.and([\n                            // fk filter\n                            eb.and(Object.fromEntries(keyPairs.map(({ fk, pk }) => [fk, fromRelation.ids[pk]]))),\n                            // merge extra disconnect conditions\n                            eb.or(disconnectConditions.map((d) => eb.and(d))),\n                        ]),\n                    )\n                    .set(keyPairs.reduce((acc, { fk }) => ({ ...acc, [fk]: null }), {} as any))\n                    .modifyEnd(\n                        this.makeContextComment({\n                            model,\n                            operation: 'update',\n                        }),\n                    );\n                await this.executeQuery(kysely, query, 'disconnect');\n            }\n        }\n    }\n\n    protected async setRelation(kysely: AnyKysely, model: string, data: any, fromRelation: FromRelationContext) {\n        const _data = this.normalizeRelationManipulationInput(model, data);\n\n        const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n\n        if (m2m) {\n            // handle many-to-many relation\n\n            // reset for the parent\n            await this.resetManyToManyRelation(kysely, fromRelation.model, fromRelation.field, fromRelation.ids);\n\n            if (_data.length > 0) {\n                // batch fetch all entity IDs in one query\n                const allIds = await this.getEntitiesIds(kysely, model, _data);\n                if (allIds.length !== _data.length) {\n                    throw createNotFoundError(model);\n                }\n                await this.handleManyToManyRelation(\n                    kysely,\n                    'connect',\n                    fromRelation.model,\n                    fromRelation.field,\n                    fromRelation.ids,\n                    m2m.otherModel,\n                    m2m.otherField,\n                    allIds,\n                    m2m.joinTable,\n                );\n            }\n        } else {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                this.schema,\n                fromRelation.model,\n                fromRelation.field,\n            );\n\n            if (ownedByModel) {\n                throw createInternalError('relation can only be set from the non-owning side', fromRelation.model);\n            }\n\n            const fkConditions = keyPairs.reduce(\n                (acc, { fk, pk }) => ({\n                    ...acc,\n                    [fk]: fromRelation.ids[pk],\n                }),\n                {} as any,\n            );\n\n            // disconnect\n            const query = kysely\n                .updateTable(model)\n                .where((eb) =>\n                    eb.and([\n                        // match parent\n                        eb.and(fkConditions),\n                        // exclude entities to be connected\n                        eb.not(eb.or(_data.map((d) => eb.and(d)))),\n                    ]),\n                )\n                .set(keyPairs.reduce((acc, { fk }) => ({ ...acc, [fk]: null }), {} as any))\n                .modifyEnd(\n                    this.makeContextComment({\n                        model,\n                        operation: 'update',\n                    }),\n                );\n            await this.executeQuery(kysely, query, 'disconnect');\n\n            // connect\n            if (_data.length > 0) {\n                const query = kysely\n                    .updateTable(model)\n                    .where((eb) => eb.or(_data.map((d) => eb.and(d))))\n                    .set(\n                        keyPairs.reduce(\n                            (acc, { fk, pk }) => ({\n                                ...acc,\n                                [fk]: fromRelation.ids[pk],\n                            }),\n                            {} as any,\n                        ),\n                    )\n                    .modifyEnd(\n                        this.makeContextComment({\n                            model,\n                            operation: 'update',\n                        }),\n                    );\n                const r = await this.executeQuery(kysely, query, 'connect');\n\n                // validate result\n                if (!r.numAffectedRows || _data.length > r.numAffectedRows) {\n                    // some entities were not connected\n                    throw createNotFoundError(model);\n                }\n            }\n        }\n    }\n\n    protected async deleteRelation(\n        kysely: ToKysely<Schema>,\n        model: GetModels<Schema>,\n        data: any,\n        fromRelation: FromRelationContext,\n        uniqueDelete: boolean,\n        throwForNotFound: boolean,\n    ) {\n        let deleteConditions: any[] = [];\n        let expectedDeleteCount = -1; // -1 means no expected delete count check\n        if (typeof data === 'boolean') {\n            if (data === false) {\n                return;\n            } else {\n                deleteConditions = [true];\n                if (uniqueDelete) {\n                    expectedDeleteCount = 1;\n                }\n            }\n        } else if (isEmptyObject(data)) {\n            // empty object means true\n            deleteConditions = [true];\n            if (uniqueDelete) {\n                expectedDeleteCount = 1;\n            }\n        } else {\n            deleteConditions = this.normalizeRelationManipulationInput(model, data);\n            if (deleteConditions.length === 0) {\n                return;\n            }\n            if (uniqueDelete) {\n                // each delete condition is one unique match\n                expectedDeleteCount = deleteConditions.length;\n            }\n        }\n\n        let deleteResult: Awaited<ReturnType<typeof this.delete>>;\n        let deleteFromModel: string;\n        const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n\n        if (m2m) {\n            deleteFromModel = model;\n\n            // handle many-to-many relation\n            const fieldDef = this.requireField(fromRelation.model, fromRelation.field);\n            invariant(fieldDef.relation?.opposite);\n\n            deleteResult = await this.delete(kysely, model, {\n                AND: [\n                    {\n                        [fieldDef.relation.opposite]: {\n                            some: fromRelation.ids,\n                        },\n                    },\n                    {\n                        OR: deleteConditions,\n                    },\n                ],\n            });\n        } else {\n            const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n                this.schema,\n                fromRelation.model,\n                fromRelation.field,\n            );\n\n            if (ownedByModel) {\n                deleteFromModel = fromRelation.model;\n\n                const fromEntity = await this.readUnique(kysely, fromRelation.model as GetModels<Schema>, {\n                    where: fromRelation.ids,\n                });\n                if (!fromEntity) {\n                    throw createNotFoundError(fromRelation.model);\n                }\n\n                const fieldDef = this.requireField(fromRelation.model, fromRelation.field);\n                invariant(fieldDef.relation?.opposite);\n                deleteResult = await this.delete(kysely, model, {\n                    AND: [\n                        // filter for parent\n                        Object.fromEntries(keyPairs.map(({ fk, pk }) => [pk, fromEntity[fk]])),\n                        {\n                            OR: deleteConditions,\n                        },\n                    ],\n                });\n            } else {\n                deleteFromModel = model;\n                deleteResult = await this.delete(kysely, model, {\n                    AND: [\n                        Object.fromEntries(keyPairs.map(({ fk, pk }) => [fk, fromRelation.ids[pk]])),\n                        {\n                            OR: deleteConditions,\n                        },\n                    ],\n                });\n            }\n        }\n\n        // validate result\n        if (throwForNotFound && expectedDeleteCount >= 0 && expectedDeleteCount > (deleteResult.numAffectedRows ?? 0)) {\n            // some entities were not deleted\n            throw createNotFoundError(deleteFromModel);\n        }\n    }\n\n    private normalizeRelationManipulationInput(model: string, data: any) {\n        return enumerate(data).map((item) => flattenCompoundUniqueFilters(this.schema, model, item));\n    }\n\n    // #endregion\n\n    protected async delete(\n        kysely: AnyKysely,\n        model: string,\n        where: any,\n        limit?: number,\n        filterModel?: string,\n        fieldsToReturn?: readonly string[],\n    ): Promise<QueryResult<unknown>> {\n        filterModel ??= model;\n\n        const modelDef = this.requireModel(model);\n\n        if (modelDef.baseModel) {\n            if (limit !== undefined) {\n                throw createNotSupportedError('Deleting with a limit is not supported for polymorphic models');\n            }\n            // just delete base and it'll cascade back to this model\n            return this.processBaseModelDelete(kysely, modelDef.baseModel, where, limit, filterModel);\n        }\n\n        fieldsToReturn = fieldsToReturn ?? requireIdFields(this.schema, model);\n\n        let needIdFilter = false;\n\n        if (limit !== undefined && !this.dialect.supportsDeleteWithLimit) {\n            // if the dialect doesn't support delete with limit natively, we'll\n            // simulate it by filtering by id with a limit\n            needIdFilter = true;\n        }\n\n        if (modelDef.isDelegate || modelDef.baseModel) {\n            // if the model is in a delegate hierarchy, we'll need to filter by\n            // id because the filter may involve fields in different models in\n            // the hierarchy\n            needIdFilter = true;\n        }\n\n        const deleteFilter = needIdFilter\n            ? (eb: ExpressionBuilder<any, any>) =>\n                  eb(\n                      eb.refTuple(\n                          // @ts-expect-error\n                          ...this.buildIdFieldRefs(kysely, model),\n                      ),\n                      'in',\n                      // the outer \"select *\" is needed to isolate the sub query (as needed for dialects like mysql)\n                      eb\n                          .selectFrom(\n                              this.dialect\n                                  .buildSelectModel(filterModel, filterModel)\n                                  .where(() => this.dialect.buildFilter(filterModel, filterModel, where))\n                                  .select(this.buildIdFieldRefs(kysely, filterModel))\n                                  .$if(limit !== undefined, (qb) => qb.limit(limit!))\n                                  .as('$sub'),\n                          )\n                          .selectAll(),\n                  )\n            : () => this.dialect.buildFilter(model, model, where);\n\n        // if the model being deleted has a relation to a model that extends a delegate model, and if that\n        // relation is set to trigger a cascade delete from this model, the deletion will not automatically\n        // clean up the base hierarchy of the relation side (because polymorphic model's cascade deletion\n        // works downward not upward). We need to take care of the base deletions manually here.\n\n        await this.processDelegateRelationDelete(kysely, modelDef, where, limit);\n\n        const query = kysely\n            .deleteFrom(model)\n            .where(deleteFilter)\n            .$if(this.dialect.supportsReturning, (qb) => qb.returning(fieldsToReturn))\n            .$if(limit !== undefined && this.dialect.supportsDeleteWithLimit, (qb) => qb.limit(limit!))\n            .modifyEnd(this.makeContextComment({ model, operation: 'delete' }));\n\n        return this.executeQuery(kysely, query, 'delete');\n    }\n\n    private async processDelegateRelationDelete(\n        kysely: ToKysely<Schema>,\n        modelDef: ModelDef,\n        where: any,\n        limit: number | undefined,\n    ) {\n        for (const fieldDef of Object.values(modelDef.fields)) {\n            if (fieldDef.relation && fieldDef.relation.opposite) {\n                const oppositeModelDef = this.requireModel(fieldDef.type);\n                const oppositeRelation = this.requireField(fieldDef.type, fieldDef.relation.opposite);\n                if (oppositeModelDef.baseModel && oppositeRelation.relation?.onDelete === 'Cascade') {\n                    if (limit !== undefined) {\n                        throw createNotSupportedError('Deleting with a limit is not supported for polymorphic models');\n                    }\n                    // the deletion will propagate upward to the base model chain\n                    await this.delete(\n                        kysely,\n                        fieldDef.type as GetModels<Schema>,\n                        {\n                            [fieldDef.relation.opposite]: where,\n                        },\n                        undefined,\n                    );\n                }\n            }\n        }\n    }\n\n    private async processBaseModelDelete(\n        kysely: AnyKysely,\n        model: string,\n        where: any,\n        limit: number | undefined,\n        filterModel: string,\n    ) {\n        return this.delete(kysely, model, where, limit, filterModel);\n    }\n\n    protected makeIdSelect(model: string) {\n        const modelDef = this.requireModel(model);\n        return modelDef.idFields.reduce((acc, f) => {\n            acc[f] = true;\n            return acc;\n        }, {} as any);\n    }\n\n    protected trimResult(data: any, args: SelectIncludeOmit<Schema, GetModels<Schema>, boolean>) {\n        if (!('select' in args) || !args.select) {\n            return data;\n        }\n        return Object.keys(args.select).reduce((acc, field) => {\n            acc[field] = data[field];\n            return acc;\n        }, {} as any);\n    }\n\n    protected needReturnRelations(model: string, args: SelectIncludeOmit<Schema, GetModels<Schema>, boolean>) {\n        let returnRelation = false;\n\n        if ('include' in args && args.include) {\n            returnRelation = Object.keys(args.include).length > 0;\n        } else if ('select' in args && args.select) {\n            returnRelation = Object.entries(args.select).some(([K, v]) => {\n                const fieldDef = this.requireField(model, K);\n                return fieldDef.relation && v;\n            });\n        }\n        return returnRelation;\n    }\n\n    protected async safeTransaction<T>(callback: (tx: AnyKysely) => Promise<T>, isolationLevel?: IsolationLevel) {\n        if (this.kysely.isTransaction) {\n            // proceed directly if already in a transaction\n            return callback(this.kysely);\n        } else {\n            // otherwise, create a new transaction and execute the callback\n            let txBuilder = this.kysely.transaction();\n            txBuilder = txBuilder.setIsolationLevel(isolationLevel ?? TransactionIsolationLevel.ReadCommitted);\n            return txBuilder.execute(callback);\n        }\n    }\n\n    protected async safeTransactionIf<T>(\n        condition: boolean,\n        callback: (tx: AnyKysely) => Promise<T>,\n        isolationLevel?: IsolationLevel,\n    ) {\n        if (condition) {\n            return this.safeTransaction(callback, isolationLevel);\n        } else {\n            return callback(this.kysely);\n        }\n    }\n\n    // Given a unique filter of a model, load the entity and return its id fields\n    private getEntityIds(kysely: AnyKysely, model: string, uniqueFilter: any) {\n        return this.readUnique(kysely, model, {\n            where: uniqueFilter,\n            select: this.makeIdSelect(model),\n        });\n    }\n\n    // Given multiple unique filters, load all matching entities and return their id fields in one query\n    private getEntitiesIds(kysely: AnyKysely, model: string, uniqueFilters: any[]) {\n        return this.read(kysely, model, {\n            where: { OR: uniqueFilters },\n            select: this.makeIdSelect(model),\n        } as any);\n    }\n\n    /**\n     * Normalize input args to strip `undefined` fields\n     */\n    protected normalizeArgs(args: unknown) {\n        if (!args) {\n            return;\n        }\n        const newArgs = clone(args);\n        this.doNormalizeArgs(newArgs);\n        return newArgs;\n    }\n\n    private doNormalizeArgs(args: unknown) {\n        if (args && typeof args === 'object') {\n            for (const [key, value] of Object.entries(args)) {\n                if (value === undefined) {\n                    delete args[key as keyof typeof args];\n                } else if (value && isPlainObject(value)) {\n                    this.doNormalizeArgs(value);\n                }\n            }\n        }\n    }\n\n    protected executeQuery(kysely: ToKysely<Schema>, query: Compilable, _operation: string) {\n        return kysely.executeQuery(query.compile());\n    }\n\n    protected async executeQueryTakeFirst(kysely: ToKysely<Schema>, query: Compilable, _operation: string) {\n        const result = await kysely.executeQuery(query.compile());\n        return result.rows[0];\n    }\n\n    protected async executeQueryTakeFirstOrThrow(kysely: ToKysely<Schema>, query: Compilable, _operation: string) {\n        const result = await kysely.executeQuery(query.compile());\n        if (result.rows.length === 0) {\n            throw new ORMError(ORMErrorReason.NOT_FOUND, 'No rows found');\n        }\n        return result.rows[0];\n    }\n\n    protected mutationNeedsReadBack(model: string, args: any) {\n        const idFields = requireIdFields(this.schema, model);\n        if (this.hasPolicyEnabled) {\n            // TODO: refactor this check\n            // policy enforcement always requires read back\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        if (!this.dialect.supportsReturning) {\n            // if the dialect doesn't support RETURNING, we always need read back\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        if (args.include && typeof args.include === 'object' && Object.keys(args.include).length > 0) {\n            // includes present, need read back to fetch relations\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        const modelDef = this.requireModel(model);\n\n        if (modelDef.baseModel || modelDef.isDelegate) {\n            // polymorphic model, need read back\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        const allFields = Object.keys(modelDef.fields);\n        const relationFields = Object.values(modelDef.fields)\n            .filter((f) => f.relation)\n            .map((f) => f.name);\n        const computedFields = Object.values(modelDef.fields)\n            .filter((f) => f.computed)\n            .map((f) => f.name);\n\n        const allFieldsSelected: string[] = [];\n\n        if (!args.select || typeof args.select !== 'object') {\n            // all non-relation fields selected\n            allFieldsSelected.push(\n                ...allFields.filter(\n                    (f) => !relationFields.includes(f) && !this.dialect.shouldOmitField(args.omit, model, f),\n                ),\n            );\n        } else {\n            // explicit select\n            allFieldsSelected.push(\n                ...Object.entries(args.select)\n                    .filter(([k, v]) => v && !this.dialect.shouldOmitField(args.omit, model, k))\n                    .map(([k]) => k),\n            );\n        }\n\n        if (allFieldsSelected.some((f) => relationFields.includes(f) || computedFields.includes(f))) {\n            // relation or computed field selected, need read back\n            return { needReadBack: true, selectedFields: idFields };\n        } else {\n            return { needReadBack: false, selectedFields: allFieldsSelected };\n        }\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport { getField } from '../../query-utils';\nimport { BaseOperationHandler } from './base';\n\nexport class AggregateOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(_operation: 'aggregate', args: unknown | undefined) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        // parse args\n        const parsedArgs = this.inputValidator.validateAggregateArgs(this.model, normalizedArgs);\n\n        let query = this.kysely.selectFrom((eb) => {\n            // nested query for filtering and pagination\n\n            // table and where\n            let subQuery = this.dialect\n                .buildSelectModel(this.model, this.model)\n                .where(() => this.dialect.buildFilter(this.model, this.model, parsedArgs?.where));\n\n            // select fields: collect fields from aggregation body\n            const selectedFields: string[] = [];\n            for (const [key, value] of Object.entries(parsedArgs)) {\n                if (key.startsWith('_') && value && typeof value === 'object') {\n                    // select fields\n                    Object.entries(value)\n                        .filter(([field]) => field !== '_all')\n                        .filter(([, val]) => val === true)\n                        .forEach(([field]) => {\n                            if (!selectedFields.includes(field)) selectedFields.push(field);\n                        });\n                }\n            }\n            if (selectedFields.length > 0) {\n                for (const field of selectedFields) {\n                    subQuery = this.dialect.buildSelectField(subQuery, this.model, this.model, field);\n                }\n            } else {\n                // if no field is explicitly selected, just do a `select 1` so `_count` works\n                subQuery = subQuery.select(() => eb.lit(1).as('_all'));\n            }\n\n            // skip & take\n            const skip = parsedArgs?.skip;\n            let take = parsedArgs?.take;\n            let negateOrderBy = false;\n            if (take !== undefined && take < 0) {\n                negateOrderBy = true;\n                take = -take;\n            }\n            subQuery = this.dialect.buildSkipTake(subQuery, skip, take);\n\n            // orderBy\n            subQuery = this.dialect.buildOrderBy(\n                subQuery,\n                this.model,\n                this.model,\n                parsedArgs.orderBy,\n                negateOrderBy,\n                take,\n            );\n\n            return subQuery.as('$sub');\n        });\n\n        // aggregations\n        for (const [key, value] of Object.entries(parsedArgs)) {\n            switch (key) {\n                case '_count': {\n                    if (value === true) {\n                        query = query.select((eb) => this.dialect.castInt(eb.fn.countAll()).as('_count'));\n                    } else {\n                        Object.entries(value).forEach(([field, val]) => {\n                            if (val === true) {\n                                if (field === '_all') {\n                                    query = query.select((eb) =>\n                                        this.dialect.castInt(eb.fn.countAll()).as(`_count._all`),\n                                    );\n                                } else {\n                                    query = query.select((eb) =>\n                                        this.dialect\n                                            .castInt(eb.fn.count(eb.ref(`$sub.${field}`)))\n                                            .as(`${key}.${field}`),\n                                    );\n                                }\n                            }\n                        });\n                    }\n                    break;\n                }\n\n                case '_sum':\n                case '_avg':\n                case '_max':\n                case '_min': {\n                    Object.entries(value).forEach(([field, val]) => {\n                        if (val === true) {\n                            query = query.select((eb) => {\n                                const fn = match(key)\n                                    .with('_sum', () => eb.fn.sum)\n                                    .with('_avg', () => eb.fn.avg)\n                                    .with('_max', () => eb.fn.max)\n                                    .with('_min', () => eb.fn.min)\n                                    .exhaustive();\n                                return fn(eb.ref(`$sub.${field}`)).as(`${key}.${field}`);\n                            });\n                        }\n                    });\n                    break;\n                }\n            }\n        }\n\n        const result = await this.executeQuery(this.kysely, query, 'aggregate');\n        const ret: any = {};\n\n        // postprocess result to convert flat fields into nested objects\n        for (const [key, value] of Object.entries(result.rows[0] as object)) {\n            if (key === '_count') {\n                ret[key] = value;\n                continue;\n            }\n            const parts = key.split('.');\n            if (parts.length < 2) {\n                continue;\n            }\n\n            const op = parts[0]!;\n            const field = [...parts.slice(1)].join('.');\n\n            let val: any = value;\n            if (typeof value === 'string') {\n                const fieldDef = getField(this.schema, this.model, field);\n                if (fieldDef) {\n                    const type = fieldDef.type;\n                    if (op === '_avg') {\n                        val = parseFloat(val);\n                    } else {\n                        if (op === '_sum' || op === '_min' || op === '_max') {\n                            val = match(type)\n                                .with('Int', () => parseInt(value, 10))\n                                .with('BigInt', () => BigInt(value))\n                                .with('Float', () => parseFloat(value))\n                                .with('Decimal', () => parseFloat(value))\n                                .otherwise(() => value);\n                        }\n                    }\n                }\n            }\n\n            ret[op] = {\n                ...ret[op],\n                [field]: val,\n            };\n        }\n\n        return ret;\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { BaseOperationHandler } from './base';\n\nexport class CountOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(_operation: 'count', args: unknown | undefined) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        // parse args\n        const parsedArgs = this.inputValidator.validateCountArgs(this.model, normalizedArgs);\n        const subQueryName = '$sub';\n\n        let query = this.kysely.selectFrom((eb) => {\n            // nested query for filtering and pagination\n\n            let subQuery = this.dialect\n                .buildSelectModel(this.model, this.model)\n                .where(() => this.dialect.buildFilter(this.model, this.model, parsedArgs?.where));\n\n            if (parsedArgs?.select && typeof parsedArgs.select === 'object') {\n                // select fields\n                for (const [key, value] of Object.entries(parsedArgs.select)) {\n                    if (key !== '_all' && value === true) {\n                        subQuery = this.dialect.buildSelectField(subQuery, this.model, this.model, key);\n                    }\n                }\n            } else {\n                // no field selection, just build a `select 1`\n                subQuery = subQuery.select(() => eb.lit(1).as('_all'));\n            }\n\n            subQuery = this.dialect.buildSkipTake(subQuery, parsedArgs?.skip, parsedArgs?.take);\n            return subQuery.as(subQueryName);\n        });\n\n        if (parsedArgs?.select && typeof parsedArgs.select === 'object') {\n            // count with field selection\n            query = query.select((eb) =>\n                Object.keys(parsedArgs.select!).map((key) =>\n                    key === '_all'\n                        ? this.dialect.castInt(eb.fn.countAll()).as('_all')\n                        : this.dialect.castInt(eb.fn.count(eb.ref(`${subQueryName}.${key}`))).as(key),\n                ),\n            );\n            const result = await this.executeQuery(this.kysely, query, 'count');\n            return result.rows[0];\n        } else {\n            // simple count all\n            query = query.select((eb) => this.dialect.castInt(eb.fn.countAll()).as('count'));\n            const result = await this.executeQuery(this.kysely, query, 'count');\n            return (result.rows[0] as any).count as number;\n        }\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport { createRejectedByPolicyError, RejectedByPolicyReason } from '../../errors';\nimport { getIdValues } from '../../query-utils';\nimport { BaseOperationHandler } from './base';\n\nexport class CreateOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(operation: 'create' | 'createMany' | 'createManyAndReturn', args: unknown | undefined) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        return match(operation)\n            .with('create', () => this.runCreate(this.inputValidator.validateCreateArgs(this.model, normalizedArgs)))\n            .with('createMany', () => {\n                return this.runCreateMany(this.inputValidator.validateCreateManyArgs(this.model, normalizedArgs));\n            })\n            .with('createManyAndReturn', () => {\n                return this.runCreateManyAndReturn(\n                    this.inputValidator.validateCreateManyAndReturnArgs(this.model, normalizedArgs),\n                );\n            })\n            .exhaustive();\n    }\n\n    private async runCreate(args: any) {\n        // analyze if we need to read back the created record, or just return the create result\n        const { needReadBack, selectedFields } = this.mutationNeedsReadBack(this.model, args);\n\n        // analyze if the create involves nested creates\n        const needsNestedCreate = this.needsNestedCreate(args.data);\n\n        const result = await this.safeTransactionIf(needReadBack || needsNestedCreate, async (tx) => {\n            const createResult = await this.create(tx, this.model, args.data, undefined, false, selectedFields);\n\n            if (needReadBack) {\n                return this.readUnique(tx, this.model, {\n                    select: args.select,\n                    include: args.include,\n                    omit: args.omit,\n                    where: getIdValues(this.schema, this.model, createResult) as any,\n                });\n            } else {\n                return createResult;\n            }\n        });\n\n        if (!result && this.hasPolicyEnabled) {\n            throw createRejectedByPolicyError(\n                this.model,\n                RejectedByPolicyReason.CANNOT_READ_BACK,\n                `result is not allowed to be read back`,\n            );\n        }\n\n        return result;\n    }\n\n    private runCreateMany(args?: any) {\n        if (args === undefined) {\n            return { count: 0 };\n        }\n\n        // analyze if the create involves nested creates\n        const needsNestedCreate = this.needsNestedCreate(args.data);\n\n        return this.safeTransactionIf(needsNestedCreate, (tx) => this.createMany(tx, this.model, args, false));\n    }\n\n    private async runCreateManyAndReturn(args?: any) {\n        if (args === undefined) {\n            return [];\n        }\n\n        // analyze if we need to read back the created record, or just return the create result\n        const { needReadBack, selectedFields } = this.mutationNeedsReadBack(this.model, args);\n\n        // analyze if the create involves nested creates\n        const needsNestedCreate = this.needsNestedCreate(args.data);\n\n        return this.safeTransactionIf(needReadBack || needsNestedCreate, async (tx) => {\n            const createResult = await this.createMany(tx, this.model, args, true, undefined, selectedFields);\n\n            if (needReadBack) {\n                return this.read(\n                    tx,\n                    this.model,\n                    {\n                        select: args.select,\n                        omit: args.omit,\n                        where: {\n                            OR: createResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n                        },\n                    } as any, // TODO: fix type\n                );\n            } else {\n                return createResult;\n            }\n        });\n    }\n\n    private needsNestedCreate(data: any) {\n        const modelDef = this.requireModel(this.model);\n        if (modelDef.baseModel) {\n            // involve delegate base models\n            return true;\n        }\n\n        // has relation manipulation in the payload\n        const hasRelation = Object.entries(data).some(([field, value]) => {\n            const fieldDef = this.getField(this.model, field);\n            return fieldDef?.relation && value !== undefined;\n        });\n        if (hasRelation) {\n            return true;\n        }\n\n        return false;\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport { createNotFoundError, createRejectedByPolicyError, RejectedByPolicyReason } from '../../errors';\nimport { BaseOperationHandler } from './base';\n\nexport class DeleteOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(operation: 'delete' | 'deleteMany', args: unknown | undefined) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        return match(operation)\n            .with('delete', () => this.runDelete(this.inputValidator.validateDeleteArgs(this.model, normalizedArgs)))\n            .with('deleteMany', () =>\n                this.runDeleteMany(this.inputValidator.validateDeleteManyArgs(this.model, normalizedArgs)),\n            )\n            .exhaustive();\n    }\n\n    async runDelete(args: any) {\n        // analyze if we need to read back the deleted record, or just return delete result\n        const { needReadBack, selectedFields } = this.mutationNeedsReadBack(this.model, args);\n\n        // analyze if the delete involves nested deletes\n        const needsNestedDelete = this.needsNestedDelete();\n\n        const result = await this.safeTransactionIf(needReadBack || needsNestedDelete, async (tx) => {\n            let preDeleteRead: any = undefined;\n            if (needReadBack) {\n                preDeleteRead = await this.readUnique(tx, this.model, {\n                    select: args.select,\n                    include: args.include,\n                    omit: args.omit,\n                    where: args.where,\n                });\n            }\n            const deleteResult = await this.delete(tx, this.model, args.where, undefined, undefined, selectedFields);\n            if (!deleteResult.numAffectedRows) {\n                throw createNotFoundError(this.model);\n            }\n\n            return needReadBack ? preDeleteRead : deleteResult.rows[0];\n        });\n\n        if (!result && this.hasPolicyEnabled) {\n            throw createRejectedByPolicyError(\n                this.model,\n                RejectedByPolicyReason.CANNOT_READ_BACK,\n                'result is not allowed to be read back',\n            );\n        }\n\n        return result;\n    }\n\n    async runDeleteMany(args?: any) {\n        // analyze if the delete involves nested deletes\n        const needsNestedDelete = this.needsNestedDelete();\n\n        return await this.safeTransactionIf(needsNestedDelete, async (tx) => {\n            const result = await this.delete(tx, this.model, args?.where, args?.limit);\n            return { count: Number(result.numAffectedRows ?? 0) };\n        });\n    }\n\n    private needsNestedDelete() {\n        const modelDef = this.requireModel(this.model);\n        if (modelDef.baseModel) {\n            return true;\n        }\n\n        // Check if any relation points to a delegate sub-model with cascade delete,\n        // which would trigger processDelegateRelationDelete in BaseOperationHandler.delete()\n        for (const fieldDef of Object.values(modelDef.fields)) {\n            if (fieldDef.relation?.opposite) {\n                const oppositeModelDef = this.requireModel(fieldDef.type);\n                const oppositeRelation = this.requireField(fieldDef.type, fieldDef.relation.opposite);\n                if (oppositeModelDef.baseModel && oppositeRelation.relation?.onDelete === 'Cascade') {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { BaseOperationHandler } from './base';\n\nexport class ExistsOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(_operation: 'exists', args: unknown): Promise<unknown> {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n        const parsedArgs = this.inputValidator.validateExistsArgs(this.model, normalizedArgs);\n\n        return await this.existsNonUnique(this.client.$qb, this.model, parsedArgs?.where);\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { BaseOperationHandler, type CoreCrudOperations } from './base';\n\nexport class FindOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(operation: CoreCrudOperations, args: unknown, validateArgs = true): Promise<unknown> {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        const findOne = operation === 'findFirst' || operation === 'findUnique';\n\n        // parse args\n        let parsedArgs = validateArgs\n            ? this.inputValidator.validateFindArgs(\n                  this.model,\n                  normalizedArgs,\n                  operation as 'findFirst' | 'findUnique' | 'findMany',\n              )\n            : (normalizedArgs as any);\n\n        if (findOne) {\n            // ensure \"limit 1\"\n            parsedArgs = parsedArgs ?? {};\n            parsedArgs.take = 1;\n        }\n\n        // run query\n        const result = await this.read(this.client.$qb, this.model, parsedArgs);\n\n        const finalResult = findOne ? (result[0] ?? null) : result;\n        return finalResult;\n    }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport { aggregate, getField } from '../../query-utils';\nimport { BaseOperationHandler } from './base';\n\nexport class GroupByOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(_operation: 'groupBy', args: unknown | undefined) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        // parse args\n        const parsedArgs = this.inputValidator.validateGroupByArgs(this.model, normalizedArgs);\n\n        let query = this.kysely\n            .selectFrom(this.model as string)\n            .where(() => this.dialect.buildFilter(this.model, this.model, parsedArgs?.where));\n\n        const fieldRef = (field: string) => this.dialect.fieldRef(this.model, field);\n\n        // groupBy\n        const bys = typeof parsedArgs.by === 'string' ? [parsedArgs.by] : (parsedArgs.by as string[]);\n        query = query.groupBy(bys.map((by) => fieldRef(by)));\n\n        // skip & take\n        const skip = parsedArgs?.skip;\n        let take = parsedArgs?.take;\n        let negateOrderBy = false;\n        if (take !== undefined && take < 0) {\n            negateOrderBy = true;\n            take = -take;\n        }\n        query = this.dialect.buildSkipTake(query, skip, take);\n\n        // orderBy\n        query = this.dialect.buildOrderBy(query, this.model, this.model, parsedArgs.orderBy, negateOrderBy, take);\n\n        // having\n        if (parsedArgs.having) {\n            query = query.having(() => this.dialect.buildFilter(this.model, this.model, parsedArgs.having));\n        }\n\n        // select all by fields\n        for (const by of bys) {\n            query = query.select(() => fieldRef(by).as(by));\n        }\n\n        // aggregations\n        for (const [key, value] of Object.entries(parsedArgs)) {\n            switch (key) {\n                case '_count': {\n                    if (value === true) {\n                        query = query.select((eb) => this.dialect.castInt(eb.fn.countAll()).as('_count'));\n                    } else {\n                        Object.entries(value).forEach(([field, val]) => {\n                            if (val === true) {\n                                if (field === '_all') {\n                                    query = query.select((eb) =>\n                                        this.dialect.castInt(eb.fn.countAll()).as(`_count._all`),\n                                    );\n                                } else {\n                                    query = query.select((eb) =>\n                                        this.dialect.castInt(eb.fn.count(fieldRef(field))).as(`${key}.${field}`),\n                                    );\n                                }\n                            }\n                        });\n                    }\n                    break;\n                }\n\n                case '_sum':\n                case '_avg':\n                case '_max':\n                case '_min': {\n                    Object.entries(value).forEach(([field, val]) => {\n                        if (val === true) {\n                            query = query.select((eb) => aggregate(eb, fieldRef(field), key).as(`${key}.${field}`));\n                        }\n                    });\n                    break;\n                }\n            }\n        }\n\n        const result = await this.executeQuery(this.kysely, query, 'groupBy');\n        return result.rows.map((row) => this.postProcessRow(row));\n    }\n\n    private postProcessRow(row: any) {\n        const ret: any = {};\n\n        // postprocess result to convert flat fields into nested objects\n        for (const [key, value] of Object.entries(row)) {\n            if (key === '_count') {\n                ret[key] = value;\n                continue;\n            }\n            const parts = key.split('.');\n            if (parts.length < 2) {\n                ret[key] = value;\n                continue;\n            }\n\n            const op = parts[0]!;\n            const field = [...parts.slice(1)].join('.');\n\n            let val: any = value;\n            if (typeof value === 'string') {\n                const fieldDef = getField(this.schema, this.model, field);\n                if (fieldDef) {\n                    const type = fieldDef.type;\n                    if (op === '_avg') {\n                        val = parseFloat(val);\n                    } else {\n                        if (op === '_sum' || op === '_min' || op === '_max') {\n                            val = match(type)\n                                .with('Int', () => parseInt(value, 10))\n                                .with('BigInt', () => BigInt(value))\n                                .with('Float', () => parseFloat(value))\n                                .with('Decimal', () => parseFloat(value))\n                                .otherwise(() => value);\n                        }\n                    }\n                }\n            }\n\n            ret[op] = {\n                ...ret[op],\n                [field]: val,\n            };\n        }\n\n        return ret;\n    }\n}\n","import type { GetModels, SchemaDef } from '@zenstackhq/schema';\nimport { match } from 'ts-pattern';\nimport type { WhereInput } from '../../crud-types';\nimport { createRejectedByPolicyError, RejectedByPolicyReason } from '../../errors';\nimport { getIdValues, requireIdFields } from '../../query-utils';\nimport { BaseOperationHandler } from './base';\n\nexport class UpdateOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n    async handle(operation: 'update' | 'updateMany' | 'updateManyAndReturn' | 'upsert', args: unknown) {\n        // normalize args to strip `undefined` fields\n        const normalizedArgs = this.normalizeArgs(args);\n\n        return match(operation)\n            .with('update', () => this.runUpdate(this.inputValidator.validateUpdateArgs(this.model, normalizedArgs)))\n            .with('updateMany', () =>\n                this.runUpdateMany(this.inputValidator.validateUpdateManyArgs(this.model, normalizedArgs)),\n            )\n            .with('updateManyAndReturn', () =>\n                this.runUpdateManyAndReturn(\n                    this.inputValidator.validateUpdateManyAndReturnArgs(this.model, normalizedArgs),\n                ),\n            )\n            .with('upsert', () => this.runUpsert(this.inputValidator.validateUpsertArgs(this.model, normalizedArgs)))\n            .exhaustive();\n    }\n\n    private async runUpdate(args: any) {\n        // analyze if we need to read back the update record, or just return the updated result\n        const { needReadBack, selectedFields } = this.needReadBack(args);\n\n        // analyze if the update involves nested updates\n        const needsNestedUpdate = this.needsNestedUpdate(args.data);\n\n        const result = await this.safeTransactionIf(needReadBack || needsNestedUpdate, async (tx) => {\n            const updateResult = await this.update(\n                tx,\n                this.model,\n                args.where,\n                args.data,\n                undefined,\n                undefined,\n                undefined,\n                selectedFields,\n            );\n\n            if (needReadBack) {\n                // updated can be undefined if there's nothing to update, in that case we'll use the original\n                // filter to read back the entity\n                // note that we trim filter to id fields only, just in case underlying executor returns more fields\n                const readFilter = updateResult ? getIdValues(this.schema, this.model, updateResult) : args.where;\n                let readBackResult: any = undefined;\n                readBackResult = await this.readUnique(tx, this.model, {\n                    select: args.select,\n                    include: args.include,\n                    omit: args.omit,\n                    where: readFilter,\n                });\n                return readBackResult;\n            } else {\n                return updateResult;\n            }\n        });\n\n        if (!result) {\n            // update succeeded but result cannot be read back\n            if (this.hasPolicyEnabled) {\n                // if access policy is enabled, we assume it's due to read violation (not guaranteed though)\n                throw createRejectedByPolicyError(\n                    this.model,\n                    RejectedByPolicyReason.CANNOT_READ_BACK,\n                    'result is not allowed to be read back',\n                );\n            } else {\n                // this can happen if the entity is cascade deleted during the update, return null to\n                // be consistent with Prisma even though it doesn't comply with the method signature\n                return null;\n            }\n        } else {\n            return result;\n        }\n    }\n    private async runUpdateMany(args: any) {\n        // analyze if the update involves nested updates\n        const needsNestedUpdate = this.needsNestedUpdate(args.data);\n\n        return this.safeTransactionIf(needsNestedUpdate, async (tx) => {\n            return this.updateMany(tx, this.model, args.where, args.data, args.limit, false);\n        });\n    }\n\n    private async runUpdateManyAndReturn(args: any) {\n        if (!args) {\n            return [];\n        }\n\n        // analyze if we need to read back the updated record, or just return the update result\n        const { needReadBack, selectedFields } = this.needReadBack(args);\n\n        // analyze if the update involves nested updates\n        const needsNestedUpdate = this.needsNestedUpdate(args.data);\n\n        const { readBackResult, updateResult } = await this.safeTransactionIf(\n            needReadBack || needsNestedUpdate,\n            async (tx) => {\n                const updateResult = await this.updateMany(\n                    tx,\n                    this.model,\n                    args.where,\n                    args.data,\n                    args.limit,\n                    true,\n                    undefined,\n                    undefined,\n                    selectedFields,\n                );\n\n                if (needReadBack) {\n                    const readBackResult = await this.read(\n                        tx,\n                        this.model,\n                        {\n                            select: args.select,\n                            omit: args.omit,\n                            where: {\n                                OR: updateResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n                            },\n                        } as any, // TODO: fix type\n                    );\n\n                    return { readBackResult, updateResult };\n                } else {\n                    return { readBackResult: updateResult, updateResult };\n                }\n            },\n        );\n\n        if (readBackResult.length < updateResult.length && this.hasPolicyEnabled) {\n            // some of the updated entities cannot be read back\n            throw createRejectedByPolicyError(\n                this.model,\n                RejectedByPolicyReason.CANNOT_READ_BACK,\n                'result is not allowed to be read back',\n            );\n        }\n\n        return readBackResult;\n    }\n\n    private async runUpsert(args: any) {\n        // analyze if we need to read back the updated record, or just return the update result\n        const { needReadBack, selectedFields } = this.needReadBack(args);\n\n        // upsert is intrinsically multi-step and is always run in a transaction\n        const result = await this.safeTransaction(async (tx) => {\n            let mutationResult: unknown = await this.update(\n                tx,\n                this.model,\n                args.where,\n                args.update,\n                undefined,\n                true,\n                false,\n                selectedFields,\n            );\n\n            if (!mutationResult) {\n                // non-existing, create\n                mutationResult = await this.create(tx, this.model, args.create, undefined, undefined, selectedFields);\n            }\n\n            if (needReadBack) {\n                return this.readUnique(tx, this.model, {\n                    select: args.select,\n                    include: args.include,\n                    omit: args.omit,\n                    where: getIdValues(this.schema, this.model, mutationResult) as WhereInput<\n                        Schema,\n                        GetModels<Schema>,\n                        any,\n                        false\n                    >,\n                });\n            } else {\n                return mutationResult;\n            }\n        });\n\n        if (!result && this.hasPolicyEnabled) {\n            throw createRejectedByPolicyError(\n                this.model,\n                RejectedByPolicyReason.CANNOT_READ_BACK,\n                'result is not allowed to be read back',\n            );\n        }\n\n        return result;\n    }\n\n    private needReadBack(args: any) {\n        const baseResult = this.mutationNeedsReadBack(this.model, args);\n        if (baseResult.needReadBack) {\n            return baseResult;\n        }\n\n        const idFields = requireIdFields(this.schema, this.model);\n\n        if (!this.dialect.supportsReturning) {\n            // if dialect doesn't support \"returning\", we always need to read back\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        // further check if we're not updating any non-relation fields, because if so,\n        // SQL \"returning\" is not effective, we need to always read back\n\n        const modelDef = this.requireModel(this.model);\n        const nonRelationFields = Object.entries(modelDef.fields)\n            .filter(([_, def]) => !def.relation)\n            .map(([name, _]) => name);\n\n        // update/updateMany payload\n        if (args.data && !Object.keys(args.data).some((field) => nonRelationFields.includes(field))) {\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        // upsert payload\n        if (args.update && !Object.keys(args.update).some((field: string) => nonRelationFields.includes(field))) {\n            return { needReadBack: true, selectedFields: idFields };\n        }\n\n        return baseResult;\n    }\n\n    private needsNestedUpdate(data: any) {\n        const modelDef = this.requireModel(this.model);\n        if (modelDef.baseModel) {\n            // involve delegate base models\n            return true;\n        }\n\n        // has relation manipulation in the payload\n        const hasRelation = Object.entries(data).some(([field, value]) => {\n            const fieldDef = this.getField(this.model, field);\n            return fieldDef?.relation && value !== undefined;\n        });\n        if (hasRelation) {\n            return true;\n        }\n\n        return false;\n    }\n}\n","import type { CompiledQuery, DatabaseConnection, Driver, Log, QueryResult, TransactionSettings } from 'kysely';\n\n/**\n * Copied from kysely's RuntimeDriver\n */\nexport class ZenStackDriver implements Driver {\n    readonly #driver: Driver;\n    readonly #log: Log;\n\n    #initPromise?: Promise<void>;\n    #initDone: boolean;\n    #destroyPromise?: Promise<void>;\n    #connections = new WeakSet<DatabaseConnection>();\n    #txConnections = new WeakMap<DatabaseConnection, Array<() => Promise<unknown>>>();\n\n    constructor(driver: Driver, log: Log) {\n        this.#initDone = false;\n        this.#driver = driver;\n        this.#log = log;\n    }\n\n    async init(): Promise<void> {\n        if (this.#destroyPromise) {\n            throw new Error('driver has already been destroyed');\n        }\n\n        if (!this.#initPromise) {\n            this.#initPromise = this.#driver\n                .init()\n                .then(() => {\n                    this.#initDone = true;\n                })\n                .catch((err) => {\n                    this.#initPromise = undefined;\n                    return Promise.reject(err);\n                });\n        }\n\n        await this.#initPromise;\n    }\n\n    async acquireConnection(): Promise<DatabaseConnection> {\n        if (this.#destroyPromise) {\n            throw new Error('driver has already been destroyed');\n        }\n\n        if (!this.#initDone) {\n            await this.init();\n        }\n\n        const connection = await this.#driver.acquireConnection();\n\n        if (!this.#connections.has(connection)) {\n            if (this.#needsLogging()) {\n                this.#addLogging(connection);\n            }\n\n            this.#connections.add(connection);\n        }\n\n        return connection;\n    }\n\n    async releaseConnection(connection: DatabaseConnection): Promise<void> {\n        await this.#driver.releaseConnection(connection);\n    }\n\n    async beginTransaction(connection: DatabaseConnection, settings: TransactionSettings): Promise<void> {\n        const result = await this.#driver.beginTransaction(connection, settings);\n        this.#txConnections.set(connection, []);\n        return result;\n    }\n\n    async commitTransaction(connection: DatabaseConnection): Promise<void> {\n        try {\n            const result = await this.#driver.commitTransaction(connection);\n            const callbacks = this.#txConnections.get(connection);\n            // delete from the map immediately to avoid accidental re-triggering\n            this.#txConnections.delete(connection);\n            if (callbacks) {\n                for (const callback of callbacks) {\n                    try {\n                        await callback();\n                    } catch (err) {\n                        // errors in commit callbacks are logged but do not fail the commit\n                        console.error(`Error executing transaction commit callback: ${err}`);\n                    }\n                }\n            }\n            return result;\n        } catch (err) {\n            this.#txConnections.delete(connection);\n            throw err;\n        }\n    }\n\n    async rollbackTransaction(connection: DatabaseConnection): Promise<void> {\n        try {\n            return await this.#driver.rollbackTransaction(connection);\n        } finally {\n            this.#txConnections.delete(connection);\n        }\n    }\n\n    async destroy(): Promise<void> {\n        if (!this.#initPromise) {\n            return;\n        }\n\n        await this.#initPromise;\n\n        if (!this.#destroyPromise) {\n            this.#destroyPromise = this.#driver.destroy().catch((err) => {\n                this.#destroyPromise = undefined;\n                return Promise.reject(err);\n            });\n        }\n\n        await this.#destroyPromise;\n    }\n\n    #needsLogging(): boolean {\n        return this.#log.isLevelEnabled('query') || this.#log.isLevelEnabled('error');\n    }\n\n    // This method monkey patches the database connection's executeQuery method\n    // by adding logging code around it. Monkey patching is not pretty, but it's\n    // the best option in this case.\n    #addLogging(connection: DatabaseConnection): void {\n        const executeQuery = connection.executeQuery;\n        const streamQuery = connection.streamQuery;\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const dis = this;\n\n        connection.executeQuery = async (compiledQuery): Promise<QueryResult<any>> => {\n            let caughtError: unknown;\n            const startTime = performanceNow();\n\n            try {\n                return await executeQuery.call(connection, compiledQuery);\n            } catch (error) {\n                caughtError = error;\n                await dis.#logError(error, compiledQuery, startTime);\n                throw error;\n            } finally {\n                if (!caughtError) {\n                    await dis.#logQuery(compiledQuery, startTime);\n                }\n            }\n        };\n\n        connection.streamQuery = async function* (compiledQuery, chunkSize): AsyncIterableIterator<QueryResult<any>> {\n            let caughtError: unknown;\n            const startTime = performanceNow();\n\n            try {\n                for await (const result of streamQuery.call(connection, compiledQuery, chunkSize)) {\n                    yield result;\n                }\n            } catch (error) {\n                caughtError = error;\n                await dis.#logError(error, compiledQuery, startTime);\n                throw error;\n            } finally {\n                if (!caughtError) {\n                    await dis.#logQuery(compiledQuery, startTime, true);\n                }\n            }\n        };\n    }\n\n    async #logError(error: unknown, compiledQuery: CompiledQuery, startTime: number): Promise<void> {\n        await this.#log.error(() => ({\n            level: 'error',\n            error,\n            query: compiledQuery,\n            queryDurationMillis: this.#calculateDurationMillis(startTime),\n        }));\n    }\n\n    async #logQuery(compiledQuery: CompiledQuery, startTime: number, isStream = false): Promise<void> {\n        await this.#log.query(() => ({\n            level: 'query',\n            isStream,\n            query: compiledQuery,\n            queryDurationMillis: this.#calculateDurationMillis(startTime),\n        }));\n    }\n\n    #calculateDurationMillis(startTime: number): number {\n        return performanceNow() - startTime;\n    }\n\n    isTransactionConnection(connection: DatabaseConnection): boolean {\n        return this.#txConnections.has(connection);\n    }\n\n    registerTransactionCommitCallback(connection: DatabaseConnection, callback: () => Promise<unknown>): void {\n        if (!this.#txConnections.has(connection)) {\n            return;\n        }\n        const callbacks = this.#txConnections.get(connection);\n        if (callbacks) {\n            callbacks.push(callback);\n        } else {\n            this.#txConnections.set(connection, [callback]);\n        }\n    }\n}\n\nexport function performanceNow() {\n    if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n        return performance.now();\n    } else {\n        return Date.now();\n    }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { EnumDef, EnumField, FieldDef, ModelDef, SchemaDef } from '@zenstackhq/schema';\nimport {\n    AliasNode,\n    BinaryOperationNode,\n    CaseWhenBuilder,\n    ColumnNode,\n    ColumnUpdateNode,\n    DeleteQueryNode,\n    expressionBuilder,\n    ExpressionWrapper,\n    FromNode,\n    IdentifierNode,\n    InsertQueryNode,\n    type OperationNode,\n    OperationNodeTransformer,\n    PrimitiveValueListNode,\n    type QueryId,\n    ReferenceNode,\n    ReturningNode,\n    SelectAllNode,\n    SelectionNode,\n    SelectQueryNode,\n    type SimpleReferenceExpressionNode,\n    TableNode,\n    UpdateQueryNode,\n    ValueListNode,\n    ValueNode,\n    ValuesNode,\n} from 'kysely';\nimport type { ClientContract } from '../contract';\nimport { getCrudDialect } from '../crud/dialects';\nimport type { BaseCrudDialect } from '../crud/dialects/base-dialect';\nimport {\n    extractFieldName,\n    extractModelName,\n    getEnum,\n    getField,\n    getManyToManyRelation,\n    getModel,\n    getModelFields,\n    isEnum,\n    stripAlias,\n} from '../query-utils';\n\ntype Scope = {\n    model?: string;\n    alias?: OperationNode;\n    namesMapped?: boolean; // true means fields referring to this scope have their names already mapped\n};\n\ntype SelectionNodeChild = SimpleReferenceExpressionNode | AliasNode | SelectAllNode;\n\nexport class QueryNameMapper extends OperationNodeTransformer {\n    private readonly modelToTableMap = new Map<string, string>();\n    private readonly fieldToColumnMap = new Map<string, string>();\n    private readonly enumTypeMap = new Map<string, string>();\n    // Maps implicit many-to-many join table names to their PostgreSQL schema\n    private readonly joinTableSchemaMap = new Map<string, string>();\n    private readonly scopes: Scope[] = [];\n    private readonly dialect: BaseCrudDialect<SchemaDef>;\n\n    constructor(private readonly client: ClientContract<SchemaDef>) {\n        super();\n        this.dialect = getCrudDialect(client.$schema, client.$options);\n        for (const [modelName, modelDef] of Object.entries(client.$schema.models)) {\n            const mappedName = this.getMappedName(modelDef);\n            if (mappedName) {\n                this.modelToTableMap.set(modelName, mappedName);\n            }\n\n            for (const fieldDef of getModelFields(this.schema, modelName)) {\n                const mappedName = this.getMappedName(fieldDef);\n                if (mappedName) {\n                    this.fieldToColumnMap.set(`${modelName}.${fieldDef.name}`, mappedName);\n                }\n            }\n        }\n\n        for (const [enumName, enumDef] of Object.entries(client.$schema.enums ?? {})) {\n            const mappedName = this.getMappedName(enumDef);\n            if (mappedName) {\n                this.enumTypeMap.set(enumName, mappedName);\n            }\n        }\n\n        // Build a map from implicit many-to-many join table names to their PostgreSQL schema.\n        // Join tables live in the schema of the alphabetically-first model in the relation\n        // (matching Prisma's convention for both naming and placement).\n        if (client.$schema.provider.type === 'postgresql') {\n            for (const modelName of Object.keys(client.$schema.models)) {\n                for (const fieldDef of getModelFields(this.schema, modelName, { relations: true })) {\n                    const m2m = getManyToManyRelation(this.schema, modelName, fieldDef.name);\n                    if (m2m && !this.joinTableSchemaMap.has(m2m.joinTable)) {\n                        // Use the schema of whichever model comes first alphabetically —\n                        // that is where Prisma creates the join table.\n                        const owningModel = [modelName, m2m.otherModel].sort()[0]!;\n                        this.joinTableSchemaMap.set(m2m.joinTable, this.getTableSchema(owningModel) ?? 'public');\n                    }\n                }\n            }\n        }\n    }\n\n    private get schema() {\n        return this.client.$schema;\n    }\n\n    // #region overrides\n\n    protected override transformSelectQuery(node: SelectQueryNode, queryId?: QueryId) {\n        if (!node.from?.froms) {\n            return super.transformSelectQuery(node, queryId);\n        }\n\n        // process \"from\" clauses\n        const processedFroms = node.from.froms.map((from) => this.processSelectTable(from));\n\n        // process \"join\" clauses, note that \"from\" and previous joins need to be added as scopes since join conditions\n        // can refer to \"from\" tables and previous joins\n        const processedJoins: ReturnType<typeof this.processSelectTable>[] = [];\n        const cumulativeScopes = [...processedFroms.map(({ scope }) => scope)];\n        for (const join of node.joins ?? []) {\n            const processedJoin = this.withScopes(cumulativeScopes, () => this.processSelectTable(join.table));\n            processedJoins.push(processedJoin);\n            cumulativeScopes.push(processedJoin.scope);\n        }\n\n        // merge the scopes of froms and joins since they're all visible in the query body\n\n        return this.withScopes(cumulativeScopes, () => {\n            // transform join clauses, \"on\" is transformed within the scopes\n            const joins = node.joins\n                ? node.joins.map((join, i) => ({\n                      ...join,\n                      table: processedJoins[i]!.node,\n                      on: this.transformNode(join.on),\n                  }))\n                : undefined;\n            const selections = this.processSelectQuerySelections(node);\n            const baseResult = super.transformSelectQuery(node, queryId);\n\n            return {\n                ...baseResult,\n                from: FromNode.create(processedFroms.map((f) => f.node)),\n                joins,\n                selections,\n            };\n        });\n    }\n\n    protected override transformInsertQuery(node: InsertQueryNode, queryId?: QueryId) {\n        if (!node.into) {\n            return super.transformInsertQuery(node, queryId);\n        }\n\n        const model = extractModelName(node.into);\n        invariant(model, 'InsertQueryNode must have a model name in the \"into\" clause');\n\n        return this.withScope({ model }, () => {\n            const baseResult = super.transformInsertQuery(node, queryId);\n            let values = baseResult.values;\n            if (node.columns && values) {\n                // process enum values with name mapping\n                values = this.processEnumMappingForColumns(model, node.columns, values);\n            }\n            return {\n                ...baseResult,\n                // map table name\n                into: this.processTableRef(node.into!),\n                values,\n            } satisfies InsertQueryNode;\n        });\n    }\n\n    private isOperationNode(value: unknown): value is OperationNode {\n        return !!value && typeof value === 'object' && 'kind' in value;\n    }\n\n    protected override transformReturning(node: ReturningNode) {\n        return {\n            kind: node.kind,\n            // map column names in returning selections (include returningAll)\n            selections: this.processSelections(node.selections),\n        };\n    }\n\n    protected override transformReference(node: ReferenceNode, queryId?: QueryId) {\n        if (!ColumnNode.is(node.column)) {\n            return super.transformReference(node, queryId);\n        }\n\n        // resolve the reference to a field from outer scopes\n        const scope = this.resolveFieldFromScopes(node.column.column.name, node.table?.table.identifier.name);\n        if (scope && !scope.namesMapped && scope.model) {\n            // map column name and table name as needed\n            const mappedFieldName = this.mapFieldName(scope.model, node.column.column.name);\n\n            // map table name depending on how it is resolved\n            let mappedTableName = node.table?.table.identifier.name;\n            if (mappedTableName) {\n                if (scope.alias && IdentifierNode.is(scope.alias) && scope.alias.name === mappedTableName) {\n                    // table name is resolved to an alias, no mapping needed\n                } else if (scope.model === mappedTableName) {\n                    // table name is resolved to a model, map the name as needed\n                    mappedTableName = this.mapTableName(scope.model);\n                }\n            }\n            return ReferenceNode.create(\n                ColumnNode.create(mappedFieldName),\n                mappedTableName ? this.createTableNode(mappedTableName, undefined) : undefined,\n            );\n        } else {\n            // no name mapping needed\n            return node;\n        }\n    }\n\n    protected override transformColumn(node: ColumnNode, queryId?: QueryId) {\n        const scope = this.resolveFieldFromScopes(node.column.name);\n        if (!scope || scope.namesMapped || !scope.model) {\n            return super.transformColumn(node, queryId);\n        }\n        const mappedName = this.mapFieldName(scope.model, node.column.name);\n        return ColumnNode.create(mappedName);\n    }\n\n    protected override transformBinaryOperation(node: BinaryOperationNode, queryId?: QueryId) {\n        // transform enum name mapping for enum values used inside binary operations\n        //   1. simple value: column = EnumValue\n        //   2. list value: column IN [EnumValue, EnumValue2]\n\n        // note: Kysely only allows column ref on the left side of a binary operation\n\n        if (\n            ReferenceNode.is(node.leftOperand) &&\n            ColumnNode.is(node.leftOperand.column) &&\n            (ValueNode.is(node.rightOperand) || PrimitiveValueListNode.is(node.rightOperand))\n        ) {\n            const columnNode = node.leftOperand.column;\n\n            // resolve field from scope in case it's not directly qualified with a table name\n            const resolvedScope = this.resolveFieldFromScopes(\n                columnNode.column.name,\n                node.leftOperand.table?.table.identifier.name,\n            );\n\n            if (resolvedScope?.model) {\n                const valueNode = node.rightOperand;\n                let resultValue: OperationNode = valueNode;\n\n                if (ValueNode.is(valueNode)) {\n                    resultValue = this.processEnumMappingForValue(\n                        resolvedScope.model,\n                        columnNode,\n                        valueNode,\n                    ) as OperationNode;\n                } else if (PrimitiveValueListNode.is(valueNode)) {\n                    resultValue = PrimitiveValueListNode.create(\n                        this.processEnumMappingForValues(\n                            resolvedScope.model,\n                            valueNode.values.map(() => columnNode),\n                            valueNode.values,\n                        ),\n                    );\n                }\n\n                return super.transformBinaryOperation(\n                    {\n                        ...node,\n                        rightOperand: resultValue,\n                    },\n                    queryId,\n                );\n            }\n        }\n\n        return super.transformBinaryOperation(node, queryId);\n    }\n\n    protected override transformUpdateQuery(node: UpdateQueryNode, queryId?: QueryId) {\n        if (!node.table) {\n            return super.transformUpdateQuery(node, queryId);\n        }\n\n        const { alias, node: innerTable } = stripAlias(node.table);\n        if (!innerTable || !TableNode.is(innerTable)) {\n            return super.transformUpdateQuery(node);\n        }\n\n        const model = extractModelName(innerTable);\n        invariant(model, 'UpdateQueryNode must have a model name in the \"table\" clause');\n\n        return this.withScope({ model, alias }, () => {\n            const baseResult = super.transformUpdateQuery(node, queryId);\n\n            // process enum value mappings in update set values\n            const updates = baseResult.updates?.map((update, i) => {\n                if (ColumnNode.is(update.column)) {\n                    // fetch original column that doesn't have name mapping applied\n                    const origColumn = node.updates![i]!.column as ColumnNode;\n                    return ColumnUpdateNode.create(\n                        update.column,\n                        this.processEnumMappingForValue(model, origColumn, update.value) as OperationNode,\n                    );\n                } else {\n                    return update;\n                }\n            });\n\n            return {\n                ...baseResult,\n                updates,\n                // map table name\n                table: this.wrapAlias(this.processTableRef(innerTable), alias),\n            };\n        });\n    }\n\n    protected override transformDeleteQuery(node: DeleteQueryNode, queryId?: QueryId) {\n        // all \"from\" nodes are pushed as scopes\n        const scopes: Scope[] = node.from.froms.map((node) => {\n            const { alias, node: innerNode } = stripAlias(node);\n            return {\n                model: extractModelName(innerNode),\n                alias,\n                namesMapped: false,\n            };\n        });\n\n        // process name mapping in each \"from\"\n        const froms = node.from.froms.map((from) => {\n            const { alias, node: innerNode } = stripAlias(from);\n            if (TableNode.is(innerNode!)) {\n                // map table name\n                return this.wrapAlias(this.processTableRef(innerNode), alias);\n            } else {\n                return super.transformNode(from, queryId);\n            }\n        });\n\n        return this.withScopes(scopes, () => {\n            return {\n                ...super.transformDeleteQuery(node, queryId),\n                from: FromNode.create(froms),\n            };\n        });\n    }\n\n    // #endregion\n\n    // #region utils\n\n    private processSelectQuerySelections(node: SelectQueryNode) {\n        const selections: SelectionNode[] = [];\n        for (const selection of node.selections ?? []) {\n            const processedSelections: { originalField?: string; selection: SelectionNode }[] = [];\n            if (SelectAllNode.is(selection.selection)) {\n                // expand `selectAll` to all fields with name mapping if the\n                // inner-most scope is not already mapped\n                const scope = this.requireCurrentScope();\n                if (scope?.model && !scope.namesMapped) {\n                    // expand\n                    processedSelections.push(...this.createSelectAllFields(scope.model, scope.alias));\n                } else {\n                    // preserve\n                    processedSelections.push({\n                        originalField: undefined,\n                        selection: super.transformSelection(selection),\n                    });\n                }\n            } else if (ReferenceNode.is(selection.selection) || ColumnNode.is(selection.selection)) {\n                // map column name and add/preserve alias\n                const transformed = this.transformNode(selection.selection);\n\n                // field name without applying name mapping\n                const originalField = extractFieldName(selection.selection);\n\n                if (AliasNode.is(transformed)) {\n                    // keep the alias if there's one\n                    processedSelections.push({ originalField, selection: SelectionNode.create(transformed) });\n                } else {\n                    // otherwise use an alias to preserve the original field name\n                    const fieldName = extractFieldName(transformed);\n                    if (fieldName !== originalField) {\n                        processedSelections.push({\n                            originalField,\n                            selection: SelectionNode.create(\n                                this.wrapAlias(\n                                    transformed,\n                                    originalField ? IdentifierNode.create(originalField) : undefined,\n                                ),\n                            ),\n                        });\n                    } else {\n                        processedSelections.push({\n                            originalField,\n                            selection: SelectionNode.create(transformed),\n                        });\n                    }\n                }\n            } else {\n                const { node: innerNode } = stripAlias(selection.selection);\n                processedSelections.push({\n                    originalField: extractFieldName(innerNode),\n                    selection: super.transformSelection(selection),\n                });\n            }\n\n            // process enum value mapping\n            const enumProcessedSelections = processedSelections.map(({ originalField, selection }) => {\n                if (!originalField) {\n                    return selection;\n                } else {\n                    return SelectionNode.create(this.processEnumSelection(selection.selection, originalField));\n                }\n            });\n            selections.push(...enumProcessedSelections);\n        }\n\n        return selections;\n    }\n\n    private resolveFieldFromScopes(name: string, qualifier?: string) {\n        for (let i = this.scopes.length - 1; i >= 0; i--) {\n            const scope = this.scopes[i]!;\n            if (qualifier) {\n                // if the field as a qualifier, the qualifier must match the scope's\n                // alias if any, or model if no alias\n                if (scope.alias) {\n                    if (scope.alias && IdentifierNode.is(scope.alias) && scope.alias.name === qualifier) {\n                        // scope has an alias that matches the qualifier\n                        return scope;\n                    } else {\n                        // scope has an alias but it doesn't match the qualifier\n                        continue;\n                    }\n                } else if (scope.model) {\n                    if (scope.model === qualifier) {\n                        // scope has a model that matches the qualifier\n                        return scope;\n                    } else {\n                        // scope has a model but it doesn't match the qualifier\n                        continue;\n                    }\n                }\n            } else {\n                // if the field has no qualifier, match with model name\n                if (scope.model) {\n                    const modelDef = getModel(this.schema, scope.model);\n                    if (!modelDef) {\n                        continue;\n                    }\n                    if (getModelFields(this.schema, scope.model).some((f) => f.name === name)) {\n                        return scope;\n                    }\n                }\n            }\n        }\n        return undefined;\n    }\n\n    private pushScope(scope: Scope) {\n        this.scopes.push(scope);\n    }\n\n    private withScope<T>(scope: Scope, fn: (...args: unknown[]) => T): T {\n        this.pushScope(scope);\n        try {\n            return fn();\n        } finally {\n            this.scopes.pop();\n        }\n    }\n\n    private withScopes<T>(scopes: Scope[], fn: (...args: unknown[]) => T): T {\n        scopes.forEach((s) => this.pushScope(s));\n        try {\n            return fn();\n        } finally {\n            scopes.forEach(() => this.scopes.pop());\n        }\n    }\n\n    private wrapAlias<T extends OperationNode>(node: T, alias: OperationNode | undefined) {\n        return alias ? AliasNode.create(node, alias) : node;\n    }\n\n    private processTableRef(node: TableNode) {\n        if (!node) {\n            return node;\n        }\n        if (!TableNode.is(node)) {\n            return super.transformNode(node);\n        }\n        const mappedName = this.mapTableName(node.table.identifier.name);\n        const tableSchema = this.getTableSchema(node.table.identifier.name);\n        return this.createTableNode(mappedName, tableSchema);\n    }\n\n    private getMappedName(def: ModelDef | FieldDef | EnumField) {\n        const mapAttr = def.attributes?.find((attr) => attr.name === '@@map' || attr.name === '@map');\n        if (mapAttr) {\n            const nameArg = mapAttr.args?.find((arg) => arg.name === 'name');\n            if (nameArg && nameArg.value.kind === 'literal') {\n                return nameArg.value.value as string;\n            }\n        }\n        return undefined;\n    }\n\n    private mapFieldName(model: string, field: string): string {\n        const mappedName = this.fieldToColumnMap.get(`${model}.${field}`);\n        if (mappedName) {\n            return mappedName;\n        } else {\n            return field;\n        }\n    }\n\n    private mapTableName(tableName: string): string {\n        const mappedName = this.modelToTableMap.get(tableName);\n        if (mappedName) {\n            return mappedName;\n        } else {\n            return tableName;\n        }\n    }\n\n    private hasMappedColumns(modelName: string) {\n        return [...this.fieldToColumnMap.keys()].some((key) => key.startsWith(modelName + '.'));\n    }\n\n    // convert a \"from\" node to a nested query if there are columns with name mapping\n    private processSelectTable(node: OperationNode): { node: OperationNode; scope: Scope } {\n        const { alias, node: innerNode } = stripAlias(node);\n        if (innerNode && TableNode.is(innerNode)) {\n            // if the selection is a table, map its name and create alias to preserve model name,\n            // mark the scope as names NOT mapped if the model has field name mappings, so that\n            // inner transformations will map column names\n            const modelName = innerNode.table.identifier.name;\n            const mappedName = this.mapTableName(modelName);\n            const finalAlias = alias ?? (mappedName !== modelName ? IdentifierNode.create(modelName) : undefined);\n            const tableSchema = this.getTableSchema(modelName);\n            return {\n                node: this.wrapAlias(this.createTableNode(mappedName, tableSchema), finalAlias),\n                scope: {\n                    alias: alias ?? IdentifierNode.create(modelName),\n                    model: modelName,\n                    namesMapped: !this.hasMappedColumns(modelName),\n                },\n            };\n        } else {\n            // otherwise, it's an alias or a sub-query, in which case the inner field names are\n            // already mapped, so we just create a scope with the alias and mark names mapped\n            return {\n                node: super.transformNode(node),\n                scope: {\n                    alias,\n                    model: undefined,\n                    namesMapped: true,\n                },\n            };\n        }\n    }\n\n    private getTableSchema(model: string) {\n        if (this.schema.provider.type !== 'postgresql') {\n            return undefined;\n        }\n        // Implicit many-to-many join tables (e.g. _AToB) are not represented as models.\n        // Their schema is pre-computed in the constructor from the models they join.\n        if (!this.schema.models[model]) {\n            return this.joinTableSchemaMap.get(model) ?? 'public';\n        }\n        let schema = this.schema.provider.defaultSchema ?? 'public';\n        const schemaAttr = this.schema.models[model].attributes?.find((attr) => attr.name === '@@schema');\n        if (schemaAttr) {\n            const mapArg = schemaAttr.args?.find((arg) => arg.name === 'map');\n            if (mapArg && mapArg.value.kind === 'literal') {\n                schema = mapArg.value.value as string;\n            }\n        }\n        return schema;\n    }\n\n    private createSelectAllFields(model: string, alias: OperationNode | undefined) {\n        return getModelFields(this.schema, model).map((fieldDef) => {\n            const columnName = this.mapFieldName(model, fieldDef.name);\n            const columnRef = ReferenceNode.create(\n                ColumnNode.create(columnName),\n                alias && IdentifierNode.is(alias) ? TableNode.create(alias.name) : undefined,\n            );\n            if (columnName !== fieldDef.name) {\n                const aliased = AliasNode.create(columnRef, IdentifierNode.create(fieldDef.name));\n                return { originalField: fieldDef.name, selection: SelectionNode.create(aliased) };\n            } else {\n                return { originalField: fieldDef.name, selection: SelectionNode.create(columnRef) };\n            }\n        });\n    }\n\n    private processSelections(selections: readonly SelectionNode[]) {\n        const result: SelectionNode[] = [];\n        selections.forEach((selection) => {\n            if (SelectAllNode.is(selection.selection)) {\n                // expand \"select *\" to a list of selections if name mapping is needed\n                const processed = this.processSelectAll(selection.selection);\n                if (Array.isArray(processed)) {\n                    // expanded and names mapped\n                    result.push(...processed.map((s) => SelectionNode.create(s)));\n                } else {\n                    // not expanded\n                    result.push(SelectionNode.create(processed));\n                }\n            } else {\n                result.push(SelectionNode.create(this.processSelection(selection.selection)));\n            }\n        });\n        return result;\n    }\n\n    private processSelection(node: SelectionNodeChild) {\n        const { alias, node: innerNode } = stripAlias(node);\n        const originalField = extractFieldName(innerNode);\n        let result = super.transformNode(node);\n\n        if (originalField) {\n            // process enum value mapping\n            result = this.processEnumSelection(result, originalField);\n        }\n\n        if (!AliasNode.is(result)) {\n            const addAlias = alias ?? (originalField ? IdentifierNode.create(originalField) : undefined);\n            if (addAlias) {\n                result = this.wrapAlias(result, addAlias);\n            }\n        }\n        return result;\n    }\n\n    private processSelectAll(node: SelectAllNode) {\n        const scope = this.requireCurrentScope();\n        if (!scope.model || !(this.hasMappedColumns(scope.model) || this.modelUsesEnumWithMappedValues(scope.model))) {\n            // no name mapping needed, preserve the select all\n            return super.transformSelectAll(node);\n        }\n\n        // expand select all to a list of selections with name mapping\n        return getModelFields(this.schema, scope.model).map((fieldDef) => {\n            const columnName = this.mapFieldName(scope.model!, fieldDef.name);\n            const columnRef = ReferenceNode.create(ColumnNode.create(columnName));\n\n            // process enum value mapping\n            const enumProcessed = this.processEnumSelection(columnRef, fieldDef.name);\n\n            return columnName !== fieldDef.name && !AliasNode.is(enumProcessed)\n                ? this.wrapAlias(enumProcessed, IdentifierNode.create(fieldDef.name))\n                : enumProcessed;\n        });\n    }\n\n    private createTableNode(tableName: string, schemaName: string | undefined) {\n        return schemaName ? TableNode.createWithSchema(schemaName, tableName) : TableNode.create(tableName);\n    }\n\n    private requireCurrentScope() {\n        const scope = this.scopes[this.scopes.length - 1];\n        invariant(scope, 'No scope available');\n        return scope;\n    }\n\n    // #endregion\n\n    // #region enum value mapping\n\n    private modelUsesEnumWithMappedValues(model: string) {\n        const modelDef = getModel(this.schema, model);\n        if (!modelDef) {\n            return false;\n        }\n        return getModelFields(this.schema, model).some((fieldDef) => {\n            const enumDef = getEnum(this.schema, fieldDef.type);\n            if (!enumDef) {\n                return false;\n            }\n            return Object.values(enumDef.fields ?? {}).some((f) => f.attributes?.some((attr) => attr.name === '@map'));\n        });\n    }\n\n    private getEnumValueMapping(enumDef: EnumDef) {\n        const mapping: Record<string, string> = {};\n        for (const [key, field] of Object.entries(enumDef.fields ?? {})) {\n            const mappedName = this.getMappedName(field);\n            if (mappedName) {\n                mapping[key] = mappedName;\n            }\n        }\n        return mapping;\n    }\n\n    private processEnumMappingForColumns(\n        model: string,\n        columns: readonly ColumnNode[],\n        values: OperationNode,\n    ): OperationNode {\n        if (ValuesNode.is(values)) {\n            return ValuesNode.create(\n                values.values.map((valueItems) => {\n                    if (PrimitiveValueListNode.is(valueItems)) {\n                        return PrimitiveValueListNode.create(\n                            this.processEnumMappingForValues(model, columns, valueItems.values),\n                        );\n                    } else {\n                        return ValueListNode.create(\n                            this.processEnumMappingForValues(model, columns, valueItems.values) as OperationNode[],\n                        );\n                    }\n                }),\n            );\n        } else if (PrimitiveValueListNode.is(values)) {\n            return PrimitiveValueListNode.create(this.processEnumMappingForValues(model, columns, values.values));\n        } else {\n            return values;\n        }\n    }\n\n    private processEnumMappingForValues(model: string, columns: readonly ColumnNode[], values: readonly unknown[]) {\n        const result: unknown[] = [];\n        for (let i = 0; i < columns.length; i++) {\n            const value = values[i];\n            if (value === null || value === undefined) {\n                result.push(value);\n                continue;\n            }\n            result.push(this.processEnumMappingForValue(model, columns[i]!, value));\n        }\n        return result;\n    }\n\n    private processEnumMappingForValue(model: string, column: ColumnNode, value: unknown) {\n        const fieldDef = getField(this.schema, model, column.column.name);\n        if (!fieldDef) {\n            return value;\n        }\n        if (!isEnum(this.schema, fieldDef.type)) {\n            return value;\n        }\n\n        const enumDef = getEnum(this.schema, fieldDef.type);\n        if (!enumDef) {\n            return value;\n        }\n\n        const enumValueMapping = this.getEnumValueMapping(enumDef);\n        if (this.isOperationNode(value) && ValueNode.is(value) && typeof value.value === 'string') {\n            const mappedValue = enumValueMapping[value.value];\n            if (mappedValue) {\n                return ValueNode.create(mappedValue);\n            }\n        } else if (typeof value === 'string') {\n            const mappedValue = enumValueMapping[value];\n            if (mappedValue) {\n                return mappedValue;\n            }\n        }\n\n        return value;\n    }\n\n    private processEnumSelection(selection: SelectionNodeChild, fieldName: string) {\n        const { alias, node } = stripAlias(selection);\n        const fieldScope = this.resolveFieldFromScopes(fieldName);\n        if (!fieldScope || !fieldScope.model) {\n            return selection;\n        }\n        const aliasName = alias && IdentifierNode.is(alias) ? alias.name : fieldName;\n\n        const fieldDef = getField(this.schema, fieldScope.model, fieldName);\n        if (!fieldDef) {\n            return selection;\n        }\n        const enumDef = getEnum(this.schema, fieldDef.type);\n        if (!enumDef) {\n            return selection;\n        }\n        const enumValueMapping = this.getEnumValueMapping(enumDef);\n        if (Object.keys(enumValueMapping).length === 0) {\n            return selection;\n        }\n\n        const eb = expressionBuilder();\n        const caseBuilder = eb.case();\n        let caseWhen: CaseWhenBuilder<any, any, any, any> | undefined;\n        for (const [key, value] of Object.entries(enumValueMapping)) {\n            if (!caseWhen) {\n                caseWhen = caseBuilder.when(new ExpressionWrapper(node), '=', value).then(key);\n            } else {\n                caseWhen = caseWhen.when(new ExpressionWrapper(node), '=', value).then(key);\n            }\n        }\n\n        // the explicit cast to \"text\" is needed to address postgres's case-when type inference issue\n        const finalExpr = caseWhen!.else(this.dialect.castText(new ExpressionWrapper(node))).end();\n        if (aliasName) {\n            return finalExpr.as(aliasName).toOperationNode() as SelectionNodeChild;\n        } else {\n            return finalExpr.toOperationNode() as SelectionNodeChild;\n        }\n    }\n\n    // #endregion\n}\n","import { IdentifierNode, OperationNodeTransformer, type OperationNode, type QueryId } from 'kysely';\nimport { TEMP_ALIAS_PREFIX } from '../query-utils';\n\ntype TempAliasTransformerMode = 'alwaysCompact' | 'compactLongNames';\n\ntype TempAliasTransformerOptions = {\n    mode?: TempAliasTransformerMode;\n    maxIdentifierLength?: number;\n};\n\n/**\n * Kysely node transformer that replaces temporary aliases created during query construction with\n * shorter names while ensuring the same temp alias gets replaced with the same name.\n */\nexport class TempAliasTransformer extends OperationNodeTransformer {\n    private aliasMap = new Map<string, string>();\n    private readonly textEncoder = new TextEncoder();\n    private readonly mode: TempAliasTransformerMode;\n    private readonly maxIdentifierLength: number;\n\n    constructor(options: TempAliasTransformerOptions = {}) {\n        super();\n        this.mode = options.mode ?? 'alwaysCompact';\n        // PostgreSQL limits identifier length to 63 bytes and silently truncates overlong aliases.\n        const maxIdentifierLength = options.maxIdentifierLength ?? 63;\n        if (\n            !Number.isFinite(maxIdentifierLength) ||\n            !Number.isInteger(maxIdentifierLength) ||\n            maxIdentifierLength <= 0\n        ) {\n            throw new RangeError('maxIdentifierLength must be a positive integer');\n        }\n        this.maxIdentifierLength = maxIdentifierLength;\n    }\n\n    run<T extends OperationNode>(node: T): T {\n        this.aliasMap.clear();\n        return this.transformNode(node);\n    }\n\n    protected override transformIdentifier(node: IdentifierNode, queryId?: QueryId): IdentifierNode {\n        if (!node.name.startsWith(TEMP_ALIAS_PREFIX)) {\n            return super.transformIdentifier(node, queryId);\n        }\n\n        let shouldCompact = false;\n        if (this.mode === 'alwaysCompact') {\n            shouldCompact = true;\n        } else {\n            // check if the alias name exceeds the max identifier length, and\n            // if so, compact it\n            const aliasByteLength = this.textEncoder.encode(node.name).length;\n            if (aliasByteLength > this.maxIdentifierLength) {\n                shouldCompact = true;\n            }\n        }\n\n        if (shouldCompact) {\n            let mapped = this.aliasMap.get(node.name);\n            if (!mapped) {\n                mapped = `$$t${this.aliasMap.size + 1}`;\n                this.aliasMap.set(node.name, mapped);\n            }\n            return IdentifierNode.create(mapped);\n        } else {\n            return super.transformIdentifier(node, queryId);\n        }\n    }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { ModelDef, SchemaDef, TypeDefDef } from '@zenstackhq/schema';\nimport type { QueryId } from 'kysely';\nimport {\n    AndNode,\n    ColumnNode,\n    ColumnUpdateNode,\n    CompiledQuery,\n    createQueryId,\n    DefaultQueryExecutor,\n    DeleteQueryNode,\n    expressionBuilder,\n    InsertQueryNode,\n    PrimitiveValueListNode,\n    ReturningNode,\n    SelectionNode,\n    SelectQueryNode,\n    SingleConnectionProvider,\n    TableNode,\n    UpdateQueryNode,\n    ValueNode,\n    ValuesNode,\n    WhereNode,\n    type ConnectionProvider,\n    type DatabaseConnection,\n    type DialectAdapter,\n    type KyselyPlugin,\n    type OperationNode,\n    type QueryCompiler,\n    type QueryResult,\n    type RootOperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ClientImpl } from '../client-impl';\nimport { TransactionIsolationLevel, type ClientContract } from '../contract';\nimport { getCrudDialect } from '../crud/dialects';\nimport type { BaseCrudDialect } from '../crud/dialects/base-dialect';\nimport { createDBQueryError, createInternalError, ORMError } from '../errors';\nimport type { AfterEntityMutationCallback, OnKyselyQueryCallback } from '../plugin';\nimport { requireIdFields, stripAlias } from '../query-utils';\nimport { QueryNameMapper } from './name-mapper';\nimport { TempAliasTransformer } from './temp-alias-transformer';\nimport type { ZenStackDriver } from './zenstack-driver';\n\ntype MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\ntype MutationInfo = {\n    model: string;\n    action: 'create' | 'update' | 'delete';\n    where: WhereNode | undefined;\n};\n\ntype CallBeforeMutationHooksArgs = {\n    queryNode: OperationNode;\n    mutationInfo: MutationInfo;\n    loadBeforeMutationEntities: () => Promise<Record<string, unknown>[] | undefined>;\n    client: ClientContract<SchemaDef>;\n    queryId: QueryId;\n};\n\ntype CallAfterMutationHooksArgs = {\n    queryResult: QueryResult<unknown>;\n    queryNode: OperationNode;\n    mutationInfo: MutationInfo;\n    client: ClientContract<SchemaDef>;\n    filterFor: 'inTx' | 'outTx' | 'all';\n    connection: DatabaseConnection;\n    queryId: QueryId;\n    beforeMutationEntities?: Record<string, unknown>[];\n    afterMutationEntities?: Record<string, unknown>[];\n};\n\nconst DEFAULT_MAX_SLOW_RECORDS = 100;\n\nexport class ZenStackQueryExecutor extends DefaultQueryExecutor {\n    // #region constructor, fields and props\n\n    private readonly nameMapper: QueryNameMapper | undefined;\n    private readonly dialect: BaseCrudDialect<SchemaDef>;\n\n    constructor(\n        private client: ClientImpl,\n        private readonly driver: ZenStackDriver,\n        private readonly compiler: QueryCompiler,\n        adapter: DialectAdapter,\n        private readonly connectionProvider: ConnectionProvider,\n        plugins: KyselyPlugin[] = [],\n        private suppressMutationHooks: boolean = false,\n    ) {\n        super(compiler, adapter, connectionProvider, plugins);\n\n        if (\n            client.$schema.provider.type === 'postgresql' || // postgres queries need to be schema-qualified\n            this.schemaHasMappedNames(client.$schema)\n        ) {\n            this.nameMapper = new QueryNameMapper(client as unknown as ClientContract<SchemaDef>);\n        }\n\n        this.dialect = getCrudDialect(client.$schema, client.$options);\n    }\n\n    private schemaHasMappedNames(schema: SchemaDef) {\n        const hasMapAttr = (decl: ModelDef | TypeDefDef) => {\n            if (decl.attributes?.some((attr) => attr.name === '@@map')) {\n                return true;\n            }\n            return Object.values(decl.fields).some((field) => field.attributes?.some((attr) => attr.name === '@map'));\n        };\n\n        return Object.values(schema.models).some(hasMapAttr) || Object.values(schema.typeDefs ?? []).some(hasMapAttr);\n    }\n\n    private get kysely() {\n        return this.client.$qb;\n    }\n\n    private get options() {\n        return this.client.$options;\n    }\n\n    private get hasEntityMutationPlugins() {\n        return (this.client.$options.plugins ?? []).some((plugin) => plugin.onEntityMutation);\n    }\n\n    private get hasEntityMutationPluginsWithAfterMutationHooks() {\n        return (this.client.$options.plugins ?? []).some((plugin) => plugin.onEntityMutation?.afterEntityMutation);\n    }\n\n    private get hasOnKyselyHooks() {\n        return (this.client.$options.plugins ?? []).some((plugin) => plugin.onKyselyQuery);\n    }\n\n    // #endregion\n\n    // #region main entry point\n\n    override async executeQuery(compiledQuery: CompiledQuery) {\n        // proceed with the query with kysely interceptors\n        // if the query is a raw query, we need to carry over the parameters\n        const queryParams = (compiledQuery as any).$raw ? compiledQuery.parameters : undefined;\n\n        // needs to ensure transaction if we:\n        // - have plugins with Kysely hooks, as they may spawn more queries (check: should creating tx be plugin's responsibility?)\n        // - have entity mutation plugins\n        const needEnsureTx = this.hasOnKyselyHooks || this.hasEntityMutationPlugins;\n\n        const result = await this.provideConnection(async (connection) => {\n            let startedTx = false;\n            try {\n                // mutations are wrapped in tx if not already in one\n                if (\n                    this.isMutationNode(compiledQuery.query) &&\n                    !this.driver.isTransactionConnection(connection) &&\n                    needEnsureTx\n                ) {\n                    await this.driver.beginTransaction(connection, {\n                        isolationLevel: TransactionIsolationLevel.ReadCommitted,\n                    });\n                    startedTx = true;\n                }\n                const result = await this.proceedQueryWithKyselyInterceptors(\n                    connection,\n                    compiledQuery.query,\n                    queryParams,\n                    compiledQuery.queryId,\n                );\n                if (startedTx) {\n                    await this.driver.commitTransaction(connection);\n                }\n                return result;\n            } catch (err) {\n                if (startedTx) {\n                    await this.driver.rollbackTransaction(connection);\n                }\n                if (err instanceof ORMError) {\n                    throw err;\n                } else {\n                    // wrap error\n                    throw createDBQueryError(\n                        `Failed to execute query: ${err}`,\n                        err,\n                        compiledQuery.sql,\n                        compiledQuery.parameters,\n                    );\n                }\n            }\n        });\n\n        return this.ensureProperQueryResult(compiledQuery.query, result);\n    }\n\n    private async proceedQueryWithKyselyInterceptors(\n        connection: DatabaseConnection,\n        queryNode: RootOperationNode,\n        parameters: readonly unknown[] | undefined,\n        queryId: QueryId,\n    ) {\n        let proceed = (q: RootOperationNode) => this.proceedQuery(connection, q, parameters, queryId);\n\n        const hooks: OnKyselyQueryCallback<SchemaDef>[] = [];\n        // tsc perf\n        for (const plugin of this.client.$options.plugins ?? []) {\n            if (plugin.onKyselyQuery) {\n                hooks.push(plugin.onKyselyQuery.bind(plugin));\n            }\n        }\n\n        for (const hook of hooks) {\n            const _proceed = proceed;\n            proceed = async (query: RootOperationNode) => {\n                const _p = (q: RootOperationNode) => _proceed(q);\n                const hookResult = await hook!({\n                    client: this.client as unknown as ClientContract<SchemaDef>,\n                    schema: this.client.$schema,\n                    query,\n                    proceed: _p,\n                });\n                return hookResult;\n            };\n        }\n\n        const result = await proceed(queryNode);\n\n        return result;\n    }\n\n    private async proceedQuery(\n        connection: DatabaseConnection,\n        query: RootOperationNode,\n        parameters: readonly unknown[] | undefined,\n        queryId: QueryId,\n    ) {\n        if (this.suppressMutationHooks || !this.isMutationNode(query) || !this.hasEntityMutationPlugins) {\n            // no need to handle mutation hooks, just proceed\n            return this.internalExecuteQuery(query, connection, queryId, parameters);\n        }\n\n        let preUpdateIds: Record<string, unknown>[] | undefined;\n        const mutationModel = this.getMutationModel(query);\n        const needLoadAfterMutationEntities =\n            (InsertQueryNode.is(query) || UpdateQueryNode.is(query)) &&\n            this.hasEntityMutationPluginsWithAfterMutationHooks;\n\n        if (needLoadAfterMutationEntities) {\n            if (this.dialect.supportsReturning) {\n                // need to make sure the query node has \"returnAll\" for insert and update queries\n                // so that after-mutation hooks can get the mutated entities with all fields\n                query = {\n                    ...query,\n                    returning: ReturningNode.create([SelectionNode.createSelectAll()]),\n                };\n            } else {\n                if (UpdateQueryNode.is(query)) {\n                    // if we're updating and the dialect doesn't support RETURNING, need to load\n                    // entity IDs before the update in so we can use them to load the entities\n                    // after the update\n                    preUpdateIds = await this.getPreUpdateIds(mutationModel, query, connection);\n                }\n            }\n        }\n\n        // the client passed to hooks needs to be in sync with current in-transaction\n        // status so that it doesn't try to create a nested one\n        const currentlyInTx = this.driver.isTransactionConnection(connection);\n\n        const connectionClient = this.createClientForConnection(connection, currentlyInTx);\n\n        const mutationInfo = this.getMutationInfo(query);\n\n        // cache already loaded before-mutation entities\n        let beforeMutationEntities: Record<string, unknown>[] | undefined;\n        const loadBeforeMutationEntities = async () => {\n            if (beforeMutationEntities === undefined && (UpdateQueryNode.is(query) || DeleteQueryNode.is(query))) {\n                beforeMutationEntities = await this.loadEntities(\n                    mutationInfo.model,\n                    mutationInfo.where,\n                    connection,\n                    undefined,\n                );\n            }\n            return beforeMutationEntities;\n        };\n\n        // call before mutation hooks\n        await this.callBeforeMutationHooks({\n            queryNode: query,\n            mutationInfo,\n            loadBeforeMutationEntities,\n            client: connectionClient,\n            queryId,\n        });\n\n        // execute the final query\n        const result = await this.internalExecuteQuery(query, connection, queryId, parameters);\n\n        let afterMutationEntities: Record<string, unknown>[] | undefined;\n        if (needLoadAfterMutationEntities) {\n            afterMutationEntities = await this.loadAfterMutationEntities(\n                mutationInfo,\n                query,\n                result,\n                connection,\n                preUpdateIds,\n            );\n        }\n\n        const baseArgs: CallAfterMutationHooksArgs = {\n            queryResult: result,\n            queryNode: query,\n            mutationInfo,\n            filterFor: 'all',\n            client: connectionClient,\n            connection,\n            queryId,\n            beforeMutationEntities,\n            afterMutationEntities,\n        };\n\n        if (!this.driver.isTransactionConnection(connection)) {\n            // not in a transaction, just call all after-mutation hooks\n            await this.callAfterMutationHooks({\n                ...baseArgs,\n                filterFor: 'all',\n            });\n        } else {\n            // run after-mutation hooks that are requested to be run inside tx\n            await this.callAfterMutationHooks({\n                ...baseArgs,\n                filterFor: 'inTx',\n            });\n\n            // register other after-mutation hooks to be run after the tx is committed\n            this.driver.registerTransactionCommitCallback(connection, () =>\n                this.callAfterMutationHooks({\n                    ...baseArgs,\n                    filterFor: 'outTx',\n                }),\n            );\n        }\n\n        return result;\n    }\n\n    // #endregion\n\n    // #region before and after mutation hooks\n\n    private async callBeforeMutationHooks(args: CallBeforeMutationHooksArgs) {\n        const { queryNode, mutationInfo, loadBeforeMutationEntities, client, queryId } = args;\n\n        if (this.options.plugins) {\n            for (const plugin of this.options.plugins) {\n                const onEntityMutation = plugin.onEntityMutation;\n                if (!onEntityMutation?.beforeEntityMutation) {\n                    continue;\n                }\n\n                await onEntityMutation.beforeEntityMutation({\n                    model: mutationInfo.model,\n                    action: mutationInfo.action,\n                    queryNode,\n                    loadBeforeMutationEntities,\n                    client,\n                    queryId,\n                });\n            }\n        }\n    }\n\n    private async callAfterMutationHooks(args: CallAfterMutationHooksArgs) {\n        const { queryNode, mutationInfo, client, filterFor, queryId, beforeMutationEntities, afterMutationEntities } =\n            args;\n\n        const hooks: AfterEntityMutationCallback<SchemaDef>[] = [];\n\n        // tsc perf\n        for (const plugin of this.options.plugins ?? []) {\n            const onEntityMutation = plugin.onEntityMutation;\n\n            if (!onEntityMutation?.afterEntityMutation) {\n                continue;\n            }\n            if (filterFor === 'inTx' && !onEntityMutation.runAfterMutationWithinTransaction) {\n                continue;\n            }\n\n            if (filterFor === 'outTx' && onEntityMutation.runAfterMutationWithinTransaction) {\n                continue;\n            }\n\n            hooks.push(onEntityMutation.afterEntityMutation.bind(plugin));\n        }\n\n        if (hooks.length === 0) {\n            return;\n        }\n\n        for (const hook of hooks) {\n            await hook({\n                model: mutationInfo.model,\n                action: mutationInfo.action,\n                queryNode,\n                loadAfterMutationEntities: () => Promise.resolve(afterMutationEntities),\n                beforeMutationEntities,\n                client,\n                queryId,\n            });\n        }\n    }\n\n    private async loadAfterMutationEntities(\n        mutationInfo: MutationInfo,\n        queryNode: OperationNode,\n        queryResult: QueryResult<unknown>,\n        connection: DatabaseConnection,\n        preUpdateIds: Record<string, unknown>[] | undefined,\n    ): Promise<Record<string, unknown>[] | undefined> {\n        if (mutationInfo.action === 'delete') {\n            return undefined;\n        }\n\n        if (this.dialect.supportsReturning) {\n            // entities are returned in the query result\n            return queryResult.rows as Record<string, unknown>[];\n        } else {\n            const mutatedIds = InsertQueryNode.is(queryNode)\n                ? this.getInsertIds(mutationInfo.model, queryNode, queryResult)\n                : preUpdateIds;\n\n            if (mutatedIds) {\n                const idFields = requireIdFields(this.client.$schema, mutationInfo.model);\n                const eb = expressionBuilder<any, any>();\n                const filter = eb(\n                    // @ts-ignore\n                    eb.refTuple(...idFields),\n                    'in',\n                    mutatedIds.map((idObj) =>\n                        eb.tuple(\n                            // @ts-ignore\n                            ...idFields.map((idField) => eb.val(idObj[idField] as any)),\n                        ),\n                    ),\n                );\n                const entities = await this.loadEntities(\n                    mutationInfo.model,\n                    WhereNode.create(filter.toOperationNode()),\n                    connection,\n                    undefined,\n                );\n                return entities;\n            } else {\n                console.warn(\n                    `Unable to load after-mutation entities for hooks: model \"${mutationInfo.model}\", operation \"${mutationInfo.action}\".\nThis happens when the following conditions are met:\n\n1. The database does not support RETURNING clause for INSERT/UPDATE, e.g., MySQL.\n2. The mutation creates or updates multiple entities at once.\n3. For create: the model does not have all ID fields explicitly set in the mutation data.\n4. For update: the mutation modifies ID fields.\n\nIn such cases, ZenStack cannot reliably determine the IDs of the mutated entities to reload them.\n`,\n                );\n                return [];\n            }\n        }\n    }\n\n    private async getPreUpdateIds(mutationModel: string, query: UpdateQueryNode, connection: DatabaseConnection) {\n        // Get the ID fields for this model\n        const idFields = requireIdFields(this.client.$schema, mutationModel);\n\n        // Check if the update modifies any ID fields\n        if (query.updates) {\n            for (const update of query.updates) {\n                if (ColumnUpdateNode.is(update)) {\n                    // Extract the column name from the update\n                    const columnNode = update.column;\n                    if (ColumnNode.is(columnNode)) {\n                        const columnName = columnNode.column.name;\n                        if (idFields.includes(columnName)) {\n                            // ID field is being updated, return undefined\n                            return undefined;\n                        }\n                    }\n                }\n            }\n        }\n\n        // No ID fields are being updated, load the entities\n        return await this.loadEntities(this.getMutationModel(query), query.where, connection, idFields);\n    }\n\n    private getInsertIds(\n        mutationModel: string,\n        query: InsertQueryNode,\n        queryResult: QueryResult<unknown>,\n    ): Record<string, unknown>[] | undefined {\n        const idFields = requireIdFields(this.client.$schema, mutationModel);\n\n        if (\n            InsertQueryNode.is(query) &&\n            queryResult.numAffectedRows === 1n &&\n            queryResult.insertId &&\n            idFields.length === 1\n        ) {\n            // single row creation, return the insertId directly\n            return [\n                {\n                    [idFields[0]!]: queryResult.insertId,\n                },\n            ];\n        }\n\n        const columns = query.columns;\n        if (!columns) {\n            return undefined;\n        }\n\n        const values = query.values;\n        if (!values || !ValuesNode.is(values)) {\n            return undefined;\n        }\n\n        // Extract ID values for each row\n        const allIds: Record<string, unknown>[] = [];\n        for (const valuesItem of values.values) {\n            const rowIds: Record<string, unknown> = {};\n\n            if (PrimitiveValueListNode.is(valuesItem)) {\n                // PrimitiveValueListNode case\n                invariant(valuesItem.values.length === columns.length, 'Values count must match columns count');\n                for (const idField of idFields) {\n                    const colIndex = columns.findIndex((col) => col.column.name === idField);\n                    if (colIndex === -1) {\n                        // ID field not included in insert columns\n                        return undefined;\n                    }\n                    rowIds[idField] = valuesItem.values[colIndex];\n                }\n            } else {\n                // ValueListNode case\n                invariant(valuesItem.values.length === columns.length, 'Values count must match columns count');\n                for (const idField of idFields) {\n                    const colIndex = columns.findIndex((col) => col.column.name === idField);\n                    if (colIndex === -1) {\n                        // ID field not included in insert columns\n                        return undefined;\n                    }\n                    const valueNode = valuesItem.values[colIndex];\n                    if (!valueNode || !ValueNode.is(valueNode)) {\n                        // not a literal value\n                        return undefined;\n                    }\n                    rowIds[idField] = valueNode.value;\n                }\n            }\n\n            allIds.push(rowIds);\n        }\n\n        return allIds;\n    }\n\n    private async loadEntities(\n        model: string,\n        where: WhereNode | undefined,\n        connection: DatabaseConnection,\n        fieldsToLoad: readonly string[] | undefined,\n    ): Promise<Record<string, unknown>[]> {\n        let selectQuery = this.kysely.selectFrom(model);\n        if (fieldsToLoad) {\n            selectQuery = selectQuery.select(fieldsToLoad);\n        } else {\n            selectQuery = selectQuery.selectAll();\n        }\n        let selectQueryNode = selectQuery.toOperationNode() as SelectQueryNode;\n        selectQueryNode = {\n            ...selectQueryNode,\n            where: this.andNodes(selectQueryNode.where, where),\n        };\n        // execute the query directly with the given connection to avoid triggering\n        // any other side effects\n        const result = await this.internalExecuteQuery(selectQueryNode, connection);\n        return result.rows as Record<string, unknown>[];\n    }\n\n    // #endregion\n\n    // #region utilities\n\n    private getMutationInfo(queryNode: MutationQueryNode): MutationInfo {\n        const model = this.getMutationModel(queryNode);\n        const { action, where } = match(queryNode)\n            .when(InsertQueryNode.is, () => ({\n                action: 'create' as const,\n                where: undefined,\n            }))\n            .when(UpdateQueryNode.is, (node) => ({\n                action: 'update' as const,\n                where: node.where,\n            }))\n            .when(DeleteQueryNode.is, (node) => ({\n                action: 'delete' as const,\n                where: node.where,\n            }))\n            .exhaustive();\n\n        return { model, action, where };\n    }\n\n    private isMutationNode(queryNode: RootOperationNode): queryNode is MutationQueryNode {\n        return InsertQueryNode.is(queryNode) || UpdateQueryNode.is(queryNode) || DeleteQueryNode.is(queryNode);\n    }\n\n    private getMutationModel(queryNode: OperationNode): string {\n        return match(queryNode)\n            .when(InsertQueryNode.is, (node) => {\n                invariant(node.into, 'InsertQueryNode must have an into clause');\n                return node.into.table.identifier.name;\n            })\n            .when(UpdateQueryNode.is, (node) => {\n                invariant(node.table, 'UpdateQueryNode must have a table');\n                const { node: tableNode } = stripAlias(node.table);\n                invariant(TableNode.is(tableNode), 'UpdateQueryNode must use a TableNode');\n                return tableNode.table.identifier.name;\n            })\n            .when(DeleteQueryNode.is, (node) => {\n                invariant(node.from.froms.length === 1, 'Delete query must have exactly one from table');\n                const { node: tableNode } = stripAlias(node.from.froms[0]!);\n                invariant(TableNode.is(tableNode), 'DeleteQueryNode must use a TableNode');\n                return tableNode.table.identifier.name;\n            })\n            .otherwise((node) => {\n                throw createInternalError(`Invalid query node: ${node}`);\n            }) as string;\n    }\n\n    private processQueryNode<Node extends RootOperationNode>(query: Node): Node {\n        let result = query;\n        result = this.processNameMapping(result);\n        result = this.processTempAlias(result);\n        return result;\n    }\n\n    private processNameMapping<Node extends RootOperationNode>(query: Node): Node {\n        return this.nameMapper?.transformNode(query) ?? query;\n    }\n\n    private processTempAlias<Node extends RootOperationNode>(query: Node): Node {\n        return new TempAliasTransformer({\n            mode: this.options.useCompactAliasNames === false ? 'compactLongNames' : 'alwaysCompact',\n        }).run(query);\n    }\n\n    private createClientForConnection(connection: DatabaseConnection, inTx: boolean) {\n        const innerExecutor = this.withConnectionProvider(new SingleConnectionProvider(connection));\n        innerExecutor.suppressMutationHooks = true;\n        const innerClient = this.client.withExecutor(innerExecutor);\n        if (inTx) {\n            innerClient.forceTransaction();\n        }\n        return innerClient as unknown as ClientContract<SchemaDef>;\n    }\n\n    private andNodes(condition1: WhereNode | undefined, condition2: WhereNode | undefined) {\n        if (condition1 && condition2) {\n            return WhereNode.create(AndNode.create(condition1, condition2));\n        } else if (condition1) {\n            return WhereNode.create(condition1);\n        } else {\n            return condition2;\n        }\n    }\n\n    private async internalExecuteQuery(\n        query: RootOperationNode,\n        connection: DatabaseConnection,\n        queryId?: QueryId,\n        parameters?: readonly unknown[],\n    ) {\n        // run query node processors: name mapping, temp alias renaming, etc.\n        const finalQuery = this.processQueryNode(query);\n\n        // inherit the original queryId\n        let compiledQuery = this.compileQuery(finalQuery, queryId ?? createQueryId());\n        if (parameters) {\n            compiledQuery = { ...compiledQuery, parameters: parameters };\n        }\n\n        const trackSlowQuery = this.options.diagnostics !== undefined;\n        const startTimestamp = trackSlowQuery ? performance.now() : undefined;\n        const startedAt = trackSlowQuery ? new Date() : undefined;\n\n        try {\n            const result = await connection.executeQuery<any>(compiledQuery);\n\n            if (startTimestamp !== undefined) {\n                this.trackSlowQuery(compiledQuery, startTimestamp, startedAt!);\n            }\n\n            return this.ensureProperQueryResult(compiledQuery.query, result);\n        } catch (err) {\n            throw createDBQueryError(\n                `Failed to execute query: ${err}`,\n                err,\n                compiledQuery.sql,\n                compiledQuery.parameters,\n            );\n        }\n    }\n\n    private trackSlowQuery(compiledQuery: CompiledQuery, startTimestamp: number, startedAt: Date) {\n        const durationMs = performance.now() - startTimestamp;\n        const thresholdMs = this.options.diagnostics?.slowQueryThresholdMs;\n        if (thresholdMs === undefined || durationMs < thresholdMs) {\n            return;\n        }\n\n        const slowQueries = this.client.slowQueries;\n        const maxRecords = this.options.diagnostics?.slowQueryMaxRecords ?? DEFAULT_MAX_SLOW_RECORDS;\n        if (maxRecords <= 0) {\n            return;\n        }\n\n        const queryInfo = { startedAt, durationMs, sql: compiledQuery.sql };\n\n        if (slowQueries.length >= maxRecords) {\n            // find and remove the entry with the lowest duration\n            let minIndex = 0;\n            for (let i = 1; i < slowQueries.length; i++) {\n                if (slowQueries[i]!.durationMs < slowQueries[minIndex]!.durationMs) {\n                    minIndex = i;\n                }\n            }\n            // only replace if the new query is slower than the minimum\n            if (durationMs > slowQueries[minIndex]!.durationMs) {\n                slowQueries[minIndex] = queryInfo;\n            }\n        } else {\n            slowQueries.push(queryInfo);\n        }\n    }\n\n    private ensureProperQueryResult(query: RootOperationNode, result: QueryResult<any>) {\n        let finalResult = result;\n\n        if (this.isMutationNode(query)) {\n            // Kysely dialects don't consistently set numAffectedRows, so we fix it here\n            // to simplify the consumer's code\n            finalResult = {\n                ...result,\n                numAffectedRows: result.numAffectedRows ?? BigInt(result.rows.length),\n            };\n        }\n\n        return finalResult;\n    }\n\n    // #endregion\n\n    // #region other overrides\n\n    override withPlugin(plugin: KyselyPlugin) {\n        return new ZenStackQueryExecutor(\n            this.client,\n            this.driver,\n            this.compiler,\n            this.adapter,\n            this.connectionProvider,\n            [...this.plugins, plugin],\n            this.suppressMutationHooks,\n        );\n    }\n\n    override withPlugins(plugins: ReadonlyArray<KyselyPlugin>) {\n        return new ZenStackQueryExecutor(\n            this.client,\n            this.driver,\n            this.compiler,\n            this.adapter,\n            this.connectionProvider,\n            [...this.plugins, ...plugins],\n            this.suppressMutationHooks,\n        );\n    }\n\n    override withPluginAtFront(plugin: KyselyPlugin) {\n        return new ZenStackQueryExecutor(\n            this.client,\n            this.driver,\n            this.compiler,\n            this.adapter,\n            this.connectionProvider,\n            [plugin, ...this.plugins],\n            this.suppressMutationHooks,\n        );\n    }\n\n    override withoutPlugins() {\n        return new ZenStackQueryExecutor(\n            this.client,\n            this.driver,\n            this.compiler,\n            this.adapter,\n            this.connectionProvider,\n            [],\n            this.suppressMutationHooks,\n        );\n    }\n\n    override withConnectionProvider(connectionProvider: ConnectionProvider) {\n        const newExecutor = new ZenStackQueryExecutor(\n            this.client,\n            this.driver,\n            this.compiler,\n            this.adapter,\n            connectionProvider,\n            this.plugins as KyselyPlugin[],\n            this.suppressMutationHooks,\n        );\n        // replace client with a new one associated with the new executor\n        newExecutor.client = this.client.withExecutor(newExecutor);\n        return newExecutor;\n    }\n\n    // #endregion\n}\n","import { invariant, lowerCaseFirst, upperCaseFirst } from '@zenstackhq/common-helpers';\nimport { sql, ValueNode, type BinaryOperator, type Expression, type ExpressionBuilder, type SqlBool } from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ZModelFunction, ZModelFunctionContext } from './options';\n\n// TODO: migrate default value generation functions to here too\n\nexport const contains: ZModelFunction<any> = (eb, args, context) => textMatch(eb, args, context, 'contains');\n\nexport const search: ZModelFunction<any> = (_eb: ExpressionBuilder<any, any>, _args: Expression<any>[]) => {\n    throw new Error(`\"search\" function is not implemented yet`);\n};\n\nexport const startsWith: ZModelFunction<any> = (eb, args, context) => textMatch(eb, args, context, 'startsWith');\n\nexport const endsWith: ZModelFunction<any> = (eb, args, context) => textMatch(eb, args, context, 'endsWith');\n\nconst textMatch = (\n    eb: ExpressionBuilder<any, any>,\n    args: Expression<any>[],\n    { dialect }: ZModelFunctionContext<any>,\n    method: 'contains' | 'startsWith' | 'endsWith',\n) => {\n    const [field, search, caseInsensitive = undefined] = args;\n    if (!field) {\n        throw new Error('\"field\" parameter is required');\n    }\n    if (!search) {\n        throw new Error('\"search\" parameter is required');\n    }\n\n    const casingBehavior = dialect.getStringCasingBehavior();\n    const caseInsensitiveValue = readBoolean(caseInsensitive, false);\n    let op: BinaryOperator;\n    let fieldExpr = field;\n    let searchExpr = search;\n\n    if (caseInsensitiveValue) {\n        // case-insensitive search\n        if (casingBehavior.supportsILike) {\n            // use ILIKE if supported\n            op = 'ilike';\n        } else {\n            // otherwise change both sides to lower case\n            op = 'like';\n            if (casingBehavior.likeCaseSensitive === true) {\n                fieldExpr = eb.fn('LOWER', [fieldExpr]);\n                searchExpr = eb.fn('LOWER', [searchExpr]);\n            }\n        }\n    } else {\n        // case-sensitive search, just use LIKE and deliver whatever the database's behavior is\n        op = 'like';\n    }\n\n    // coalesce to empty string to consistently handle nulls across databases\n    searchExpr = eb.fn.coalesce(searchExpr, sql.lit(''));\n\n    // escape special characters in search string\n    const escapedSearch = sql`REPLACE(REPLACE(REPLACE(${dialect.castText(searchExpr)}, ${sql.val('\\\\')}, ${sql.val('\\\\\\\\')}), ${sql.val('%')}, ${sql.val('\\\\%')}), ${sql.val('_')}, ${sql.val('\\\\_')})`;\n\n    searchExpr = match(method)\n        .with('contains', () => eb.fn('CONCAT', [sql.lit('%'), escapedSearch, sql.lit('%')]))\n        .with('startsWith', () => eb.fn('CONCAT', [escapedSearch, sql.lit('%')]))\n        .with('endsWith', () => eb.fn('CONCAT', [sql.lit('%'), escapedSearch]))\n        .exhaustive();\n\n    return sql<SqlBool>`${fieldExpr} ${sql.raw(op)} ${searchExpr} escape ${sql.val('\\\\')}`;\n};\n\nexport const has: ZModelFunction<any> = (_eb, args, context) => {\n    const [field, search] = args;\n    if (!field) {\n        throw new Error('\"field\" parameter is required');\n    }\n    if (!search) {\n        throw new Error('\"search\" parameter is required');\n    }\n    return context.dialect.buildArrayContains(field, search);\n};\n\nexport const hasEvery: ZModelFunction<any> = (_eb, args, { dialect }: ZModelFunctionContext<any>) => {\n    const [field, search] = args;\n    if (!field) {\n        throw new Error('\"field\" parameter is required');\n    }\n    if (!search) {\n        throw new Error('\"search\" parameter is required');\n    }\n    return dialect.buildArrayHasEvery(field, search);\n};\n\nexport const hasSome: ZModelFunction<any> = (_eb, args, { dialect }: ZModelFunctionContext<any>) => {\n    const [field, search] = args;\n    if (!field) {\n        throw new Error('\"field\" parameter is required');\n    }\n    if (!search) {\n        throw new Error('\"search\" parameter is required');\n    }\n    return dialect.buildArrayHasSome(field, search);\n};\n\nexport const isEmpty: ZModelFunction<any> = (eb, args, { dialect }: ZModelFunctionContext<any>) => {\n    const [field] = args;\n    if (!field) {\n        throw new Error('\"field\" parameter is required');\n    }\n    return eb(dialect.buildArrayLength(field), '=', sql.lit(0));\n};\n\nexport const now: ZModelFunction<any> = (_eb, _args, context) =>\n    match(context.dialect.provider)\n        // SQLite stores DateTime as ISO 8601 text ('YYYY-MM-DDTHH:MM:SS.sssZ'), but\n        // CURRENT_TIMESTAMP returns 'YYYY-MM-DD HH:MM:SS'. Use strftime for ISO format.\n        .with('sqlite', () => sql.raw(\"strftime('%Y-%m-%dT%H:%M:%fZ')\"))\n        // MySQL stores DateTime as ISO 8601 text ('YYYY-MM-DDTHH:MM:SS.sss+00:00').\n        // Use CONCAT + SUBSTRING to produce matching 3-digit millisecond ISO format.\n        .with('mysql', () =>\n            sql.raw(\"CONCAT(SUBSTRING(DATE_FORMAT(UTC_TIMESTAMP(3), '%Y-%m-%dT%H:%i:%s.%f'), 1, 23), '+00:00')\"),\n        )\n        // PostgreSQL has native timestamp type that compares correctly.\n        .with('postgresql', () => sql.raw('CURRENT_TIMESTAMP'))\n        .exhaustive();\n\nexport const currentModel: ZModelFunction<any> = (_eb, args, { model }: ZModelFunctionContext<any>) => {\n    let result = model;\n    const [casing] = args;\n    if (casing) {\n        result = processCasing(casing, result, model);\n    }\n    return sql.lit(result);\n};\n\nexport const currentOperation: ZModelFunction<any> = (_eb, args, { operation }: ZModelFunctionContext<any>) => {\n    let result: string = operation;\n    const [casing] = args;\n    if (casing) {\n        result = processCasing(casing, result, operation);\n    }\n    return sql.lit(result);\n};\n\nfunction processCasing(casing: Expression<any>, result: string, model: string) {\n    const opNode = casing.toOperationNode();\n    invariant(ValueNode.is(opNode) && typeof opNode.value === 'string', '\"casting\" parameter must be a string value');\n    result = match(opNode.value)\n        .with('original', () => model)\n        .with('upper', () => result.toUpperCase())\n        .with('lower', () => result.toLowerCase())\n        .with('capitalize', () => upperCaseFirst(result))\n        .with('uncapitalize', () => lowerCaseFirst(result))\n        .otherwise(() => {\n            throw new Error(\n                `Invalid casing value: ${opNode.value}. Must be \"original\", \"upper\", \"lower\", \"capitalize\", or \"uncapitalize\".`,\n            );\n        });\n    return result;\n}\n\nfunction readBoolean(expr: Expression<any> | undefined, defaultValue: boolean) {\n    if (expr === undefined) {\n        return defaultValue;\n    }\n    const opNode = expr.toOperationNode();\n    invariant(ValueNode.is(opNode), 'expression must be a literal value');\n    return !!opNode.value;\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n    ExpressionUtils,\n    type BuiltinType,\n    type CascadeAction,\n    type EnumDef,\n    type FieldDef,\n    type ModelDef,\n    type SchemaDef,\n} from '@zenstackhq/schema';\nimport { CreateTableBuilder, sql, type ColumnDataType, type OnModifyForeignAction, type RawBuilder } from 'kysely';\nimport toposort from 'toposort';\nimport { match } from 'ts-pattern';\nimport type { ToKysely } from '../query-builder';\nimport { isUnsupportedField, requireModel } from '../query-utils';\n\n/**\n * This class is for testing purposes only. It should never be used in production.\n *\n * @private\n */\nexport class SchemaDbPusher<Schema extends SchemaDef> {\n    constructor(\n        private readonly schema: Schema,\n        private readonly kysely: ToKysely<Schema>,\n    ) {}\n\n    async push() {\n        await this.kysely.transaction().execute(async (tx) => {\n            if (this.schema.enums && this.providerSupportsNativeEnum) {\n                for (const enumDef of Object.values(this.schema.enums)) {\n                    let enumValues: string[];\n                    if (enumDef.fields) {\n                        enumValues = Object.values(enumDef.fields).map((f) => {\n                            const mapAttr = f.attributes?.find((a) => a.name === '@map');\n                            if (!mapAttr || !mapAttr.args?.[0]) {\n                                return f.name;\n                            } else {\n                                const mappedName = ExpressionUtils.getLiteralValue(mapAttr.args[0].value);\n                                invariant(\n                                    mappedName && typeof mappedName === 'string',\n                                    `Invalid @map attribute for enum field ${f.name}`,\n                                );\n                                return mappedName;\n                            }\n                        });\n                    } else {\n                        enumValues = Object.values(enumDef.values);\n                    }\n\n                    const createEnum = tx.schema.createType(this.getEnumName(enumDef)).asEnum(enumValues);\n                    await createEnum.execute();\n                }\n            }\n\n            // sort models so that target of fk constraints are created first\n            const models = Object.values(this.schema.models).filter((m) => !m.isView);\n            const sortedModels = this.sortModels(models);\n            for (const modelDef of sortedModels) {\n                const createTable = this.createModelTable(tx, modelDef);\n                await createTable.execute();\n            }\n        });\n    }\n\n    private get providerSupportsNativeEnum() {\n        return ['postgresql'].includes(this.schema.provider.type);\n    }\n\n    private sortModels(models: ModelDef[]): ModelDef[] {\n        const graph: [ModelDef, ModelDef | undefined][] = [];\n\n        for (const model of models) {\n            let added = false;\n\n            if (model.baseModel) {\n                // base model should be created before concrete model\n                const baseDef = requireModel(this.schema, model.baseModel);\n                // edge: concrete model -> base model\n                graph.push([model, baseDef]);\n                added = true;\n            }\n\n            for (const field of Object.values(model.fields)) {\n                // relation order\n                if (field.relation && field.relation.fields && field.relation.references) {\n                    // skip self-referential relations to avoid false cycle in toposort\n                    if (field.type === model.name) {\n                        continue;\n                    }\n                    const targetModel = requireModel(this.schema, field.type);\n                    // edge: fk side -> target model\n                    graph.push([model, targetModel]);\n                    added = true;\n                }\n            }\n\n            if (!added) {\n                // no relations, add self to graph to ensure it is included in the result\n                graph.push([model, undefined]);\n            }\n        }\n\n        return toposort(graph)\n            .reverse()\n            .filter((m) => !!m);\n    }\n\n    private createModelTable(kysely: ToKysely<Schema>, modelDef: ModelDef) {\n        let table: CreateTableBuilder<string, any> = kysely.schema\n            .createTable(this.getTableName(modelDef))\n            .ifNotExists();\n\n        for (const [fieldName, fieldDef] of Object.entries(modelDef.fields)) {\n            if (fieldDef.originModel && !fieldDef.id) {\n                // skip non-id fields inherited from base model\n                continue;\n            }\n\n            if (isUnsupportedField(fieldDef)) {\n                // Unsupported fields cannot be represented in the ORM's schema pusher\n                continue;\n            }\n\n            if (fieldDef.relation) {\n                table = this.addForeignKeyConstraint(table, modelDef.name, fieldName, fieldDef);\n            } else if (!this.isComputedField(fieldDef)) {\n                table = this.createModelField(table, fieldDef, modelDef);\n            }\n        }\n\n        if (modelDef.baseModel) {\n            // create fk constraint\n            const baseModelDef = requireModel(this.schema, modelDef.baseModel);\n            table = table.addForeignKeyConstraint(\n                `fk_${modelDef.baseModel}_${modelDef.name}_delegate`,\n                baseModelDef.idFields as string[],\n                modelDef.baseModel,\n                baseModelDef.idFields as string[],\n                (cb) => cb.onDelete('cascade').onUpdate('cascade'),\n            );\n        }\n\n        table = this.addPrimaryKeyConstraint(table, modelDef);\n        table = this.addUniqueConstraint(table, modelDef);\n\n        return table;\n    }\n\n    private getTableName(modelDef: ModelDef) {\n        const mapAttr = modelDef.attributes?.find((a) => a.name === '@@map');\n        if (mapAttr && mapAttr.args?.[0]) {\n            const mappedName = ExpressionUtils.getLiteralValue(mapAttr.args[0].value);\n            if (mappedName) {\n                return mappedName as string;\n            }\n        }\n        return modelDef.name;\n    }\n\n    private getEnumName(enumDef: EnumDef) {\n        const mapAttr = enumDef.attributes?.find((a) => a.name === '@@map');\n        if (mapAttr && mapAttr.args?.[0]) {\n            const mappedName = ExpressionUtils.getLiteralValue(mapAttr.args[0].value);\n            if (mappedName) {\n                return mappedName as string;\n            }\n        }\n        return enumDef.name;\n    }\n\n    private getColumnName(fieldDef: FieldDef) {\n        const mapAttr = fieldDef.attributes?.find((a) => a.name === '@map');\n        if (mapAttr && mapAttr.args?.[0]) {\n            const mappedName = ExpressionUtils.getLiteralValue(mapAttr.args[0].value);\n            if (mappedName) {\n                return mappedName as string;\n            }\n        }\n        return fieldDef.name;\n    }\n\n    private isComputedField(fieldDef: FieldDef) {\n        return fieldDef.attributes?.some((a) => a.name === '@computed');\n    }\n\n    private addPrimaryKeyConstraint(table: CreateTableBuilder<string, any>, modelDef: ModelDef) {\n        if (modelDef.idFields.length === 1) {\n            if (Object.values(modelDef.fields).some((f) => f.id)) {\n                // @id defined at field level\n                return table;\n            }\n        }\n\n        if (modelDef.idFields.length > 0) {\n            table = table.addPrimaryKeyConstraint(\n                `pk_${modelDef.name}`,\n                modelDef.idFields.map((f) => this.getColumnName(modelDef.fields[f]!)),\n            );\n        }\n\n        return table;\n    }\n\n    private addUniqueConstraint(table: CreateTableBuilder<string, any>, modelDef: ModelDef) {\n        for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n            invariant(typeof value === 'object', 'expecting an object');\n            if ('type' in value) {\n                // uni-field constraint, check if it's already defined at field level\n                const fieldDef = modelDef.fields[key]!;\n                if (fieldDef.unique) {\n                    continue;\n                }\n                if (fieldDef.originModel && fieldDef.originModel !== modelDef.name) {\n                    // field is inherited from a base model, skip\n                    continue;\n                }\n                table = table.addUniqueConstraint(`unique_${modelDef.name}_${key}`, [this.getColumnName(fieldDef)]);\n            } else {\n                // multi-field constraint, if any field is inherited from base model, skip\n                if (\n                    Object.keys(value).some((f) => {\n                        const fDef = modelDef.fields[f]!;\n                        return fDef.originModel && fDef.originModel !== modelDef.name;\n                    })\n                ) {\n                    continue;\n                }\n                table = table.addUniqueConstraint(\n                    `unique_${modelDef.name}_${key}`,\n                    Object.keys(value).map((f) => this.getColumnName(modelDef.fields[f]!)),\n                );\n            }\n        }\n        return table;\n    }\n\n    private createModelField(table: CreateTableBuilder<any>, fieldDef: FieldDef, modelDef: ModelDef) {\n        return table.addColumn(this.getColumnName(fieldDef), this.mapFieldType(fieldDef), (col) => {\n            // @id\n            if (fieldDef.id && modelDef.idFields.length === 1) {\n                col = col.primaryKey();\n            }\n\n            // @default\n            if (fieldDef.default !== undefined && this.isDefaultValueSupportedForType(fieldDef.type)) {\n                if (typeof fieldDef.default === 'object' && 'kind' in fieldDef.default) {\n                    if (ExpressionUtils.isCall(fieldDef.default) && fieldDef.default.function === 'now') {\n                        col =\n                            this.schema.provider.type === 'mysql'\n                                ? col.defaultTo(sql`CURRENT_TIMESTAMP(3)`)\n                                : col.defaultTo(sql`CURRENT_TIMESTAMP`);\n                    }\n                } else {\n                    if (\n                        this.schema.provider.type === 'mysql' &&\n                        fieldDef.type === 'DateTime' &&\n                        typeof fieldDef.default === 'string'\n                    ) {\n                        const defaultValue = new Date(fieldDef.default).toISOString().replace('Z', '+00:00');\n                        col = col.defaultTo(defaultValue);\n                    } else {\n                        col = col.defaultTo(fieldDef.default);\n                    }\n                }\n            }\n\n            // @unique\n            if (fieldDef.unique) {\n                col = col.unique();\n            }\n\n            // nullable\n            if (!fieldDef.optional && !fieldDef.array) {\n                col = col.notNull();\n            }\n\n            if (this.isAutoIncrement(fieldDef) && this.columnSupportsAutoIncrement()) {\n                col = col.autoIncrement();\n            }\n\n            return col;\n        });\n    }\n\n    private isDefaultValueSupportedForType(type: string) {\n        return match(this.schema.provider.type)\n            .with('postgresql', () => true)\n            .with('sqlite', () => true)\n            .with('mysql', () => !['Json', 'Bytes'].includes(type))\n            .exhaustive();\n    }\n\n    private mapFieldType(fieldDef: FieldDef) {\n        if (this.schema.enums?.[fieldDef.type]) {\n            if (this.schema.provider.type === 'postgresql') {\n                return sql.ref(fieldDef.type);\n            } else if (this.schema.provider.type === 'mysql') {\n                // MySQL requires inline ENUM definition\n                const enumDef = this.schema.enums[fieldDef.type]!;\n                let enumValues: string[];\n                if (enumDef.fields) {\n                    enumValues = Object.values(enumDef.fields).map((f) => {\n                        const mapAttr = f.attributes?.find((a) => a.name === '@map');\n                        if (!mapAttr || !mapAttr.args?.[0]) {\n                            return f.name;\n                        } else {\n                            const mappedName = ExpressionUtils.getLiteralValue(mapAttr.args[0].value);\n                            invariant(\n                                mappedName && typeof mappedName === 'string',\n                                `Invalid @map attribute for enum field ${f.name}`,\n                            );\n                            return mappedName;\n                        }\n                    });\n                } else {\n                    enumValues = Object.values(enumDef.values);\n                }\n                return sql.raw(`enum(${enumValues.map((v) => `'${v}'`).join(', ')})`);\n            } else {\n                return 'text';\n            }\n        }\n\n        if (this.isAutoIncrement(fieldDef) && this.schema.provider.type === 'postgresql') {\n            return 'serial';\n        }\n\n        if (this.isCustomType(fieldDef.type)) {\n            return this.jsonType;\n        }\n\n        const type = fieldDef.type as BuiltinType;\n        const result = match<BuiltinType, ColumnDataType | RawBuilder<unknown>>(type)\n            .with('String', () => this.stringType)\n            .with('Boolean', () => this.booleanType)\n            .with('Int', () => this.intType)\n            .with('Float', () => this.floatType)\n            .with('BigInt', () => this.bigIntType)\n            .with('Decimal', () => this.decimalType)\n            .with('DateTime', () => this.dateTimeType)\n            .with('Bytes', () => this.bytesType)\n            .with('Json', () => this.jsonType)\n            .otherwise(() => {\n                throw new Error(`Unsupported field type: ${type}`);\n            });\n\n        if (fieldDef.array) {\n            // Kysely doesn't support array type natively\n            return sql.raw(`${result}[]`);\n        } else {\n            return result as ColumnDataType;\n        }\n    }\n\n    private isCustomType(type: string) {\n        return this.schema.typeDefs && Object.values(this.schema.typeDefs).some((def) => def.name === type);\n    }\n\n    private isAutoIncrement(fieldDef: FieldDef) {\n        return (\n            fieldDef.default &&\n            ExpressionUtils.isCall(fieldDef.default) &&\n            fieldDef.default.function === 'autoincrement'\n        );\n    }\n\n    private addForeignKeyConstraint(\n        table: CreateTableBuilder<string, any>,\n        model: string,\n        fieldName: string,\n        fieldDef: FieldDef,\n    ) {\n        invariant(fieldDef.relation, 'field must be a relation');\n\n        if (!fieldDef.relation.fields || !fieldDef.relation.references) {\n            // not fk side\n            return table;\n        }\n\n        const modelDef = requireModel(this.schema, model);\n        const relationModelDef = requireModel(this.schema, fieldDef.type);\n\n        table = table.addForeignKeyConstraint(\n            `fk_${model}_${fieldName}`,\n            fieldDef.relation.fields.map((f) => this.getColumnName(modelDef.fields[f]!)),\n            this.getTableName(relationModelDef),\n            fieldDef.relation.references.map((f) => this.getColumnName(relationModelDef.fields[f]!)),\n            (cb) => {\n                if (fieldDef.relation?.onDelete) {\n                    cb = cb.onDelete(this.mapCascadeAction(fieldDef.relation.onDelete));\n                } else if (fieldDef.optional) {\n                    cb = cb.onDelete('set null');\n                } else {\n                    cb = cb.onDelete('restrict');\n                }\n\n                if (fieldDef.relation?.onUpdate) {\n                    cb = cb.onUpdate(this.mapCascadeAction(fieldDef.relation.onUpdate));\n                } else {\n                    cb = cb.onUpdate('cascade');\n                }\n                return cb;\n            },\n        );\n        return table;\n    }\n\n    private mapCascadeAction(action: CascadeAction) {\n        return match<CascadeAction, OnModifyForeignAction>(action)\n            .with('SetNull', () => 'set null')\n            .with('Cascade', () => 'cascade')\n            .with('Restrict', () => 'restrict')\n            .with('NoAction', () => 'no action')\n            .with('SetDefault', () => 'set default')\n            .exhaustive();\n    }\n\n    // #region Type mappings and capabilities\n\n    private get jsonType(): ColumnDataType {\n        return match<string, ColumnDataType>(this.schema.provider.type)\n            .with('mysql', () => 'json')\n            .otherwise(() => 'jsonb');\n    }\n\n    private get bytesType(): ColumnDataType {\n        return match<string, ColumnDataType>(this.schema.provider.type)\n            .with('postgresql', () => 'bytea')\n            .with('mysql', () => 'blob')\n            .otherwise(() => 'blob');\n    }\n\n    private get stringType() {\n        return match<string, ColumnDataType | RawBuilder<unknown>>(this.schema.provider.type)\n            .with('mysql', () => sql.raw('varchar(255)'))\n            .otherwise(() => 'text');\n    }\n\n    private get booleanType() {\n        return match<string, ColumnDataType | RawBuilder<unknown>>(this.schema.provider.type)\n            .with('mysql', () => sql.raw('tinyint(1)'))\n            .otherwise(() => 'boolean');\n    }\n\n    private get intType(): ColumnDataType {\n        return 'integer';\n    }\n\n    private get floatType() {\n        return match<string, ColumnDataType | RawBuilder<unknown>>(this.schema.provider.type)\n            .with('postgresql', () => 'double precision')\n            .with('mysql', () => sql.raw('double'))\n            .otherwise(() => 'real');\n    }\n\n    private get bigIntType(): ColumnDataType {\n        return 'bigint';\n    }\n\n    private get decimalType() {\n        return match<string, ColumnDataType | RawBuilder<unknown>>(this.schema.provider.type)\n            .with('mysql', () => sql.raw('decimal(65, 30)'))\n            .otherwise(() => 'decimal');\n    }\n\n    private get dateTimeType() {\n        return match<string, ColumnDataType | RawBuilder<unknown>>(this.schema.provider.type)\n            .with('mysql', () => sql.raw('datetime(3)'))\n            .otherwise(() => 'timestamp');\n    }\n\n    private columnSupportsAutoIncrement() {\n        return ['sqlite', 'mysql'].includes(this.schema.provider.type);\n    }\n\n    // #endregion\n}\n","import type { ClientContract } from './contract';\n\n/**\n * A promise that only executes when it's awaited or .then() is called.\n */\nexport interface ZenStackPromise<T> extends Promise<T> {\n    [Symbol.toStringTag]: 'ZenStackPromise';\n}\n\n/**\n * Creates a promise that only executes when it's awaited or .then() is called.\n * @see https://github.com/prisma/prisma/blob/main/packages/client/src/runtime/core/request/createPrismaPromise.ts\n */\nexport function createZenStackPromise(\n    callback: (txClient?: ClientContract<any>) => Promise<unknown>,\n): ZenStackPromise<unknown> {\n    let promise: Promise<unknown> | undefined;\n    const cb = (txClient?: ClientContract<any>) => {\n        try {\n            return (promise ??= valueToPromise(callback(txClient)));\n        } catch (err) {\n            // deal with synchronous errors\n            return Promise.reject<unknown>(err);\n        }\n    };\n\n    return {\n        then(onFulfilled, onRejected) {\n            return cb().then(onFulfilled, onRejected);\n        },\n        catch(onRejected) {\n            return cb().catch(onRejected);\n        },\n        finally(onFinally) {\n            return cb().finally(onFinally);\n        },\n        cb,\n        [Symbol.toStringTag]: 'ZenStackPromise',\n    } as ZenStackPromise<unknown>;\n}\n\nfunction valueToPromise(thing: any): Promise<any> {\n    if (typeof thing === 'object' && typeof thing?.then === 'function') {\n        return thing;\n    } else {\n        return Promise.resolve(thing);\n    }\n}\n","import type { BuiltinType, FieldDef, GetModels, SchemaDef } from '@zenstackhq/schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from './constants';\nimport { getCrudDialect } from './crud/dialects';\nimport type { BaseCrudDialect } from './crud/dialects/base-dialect';\nimport type { ClientOptions } from './options';\nimport { ensureArray, getField, getIdValues } from './query-utils';\n\nexport class ResultProcessor<Schema extends SchemaDef> {\n    private dialect: BaseCrudDialect<Schema>;\n    constructor(\n        private readonly schema: Schema,\n        options: ClientOptions<Schema>,\n    ) {\n        this.dialect = getCrudDialect(schema, options);\n    }\n\n    processResult(data: any, model: GetModels<Schema>, args?: any) {\n        const result = this.doProcessResult(data, model);\n        // deal with correcting the reversed order due to negative take\n        this.fixReversedResult(result, model, args);\n        return result;\n    }\n\n    private doProcessResult(data: any, model: GetModels<Schema>) {\n        // pre-resolve field definitions from the first row's keys\n        const firstRow = Array.isArray(data) ? data[0] : data;\n        if (!firstRow || typeof firstRow !== 'object') {\n            return data;\n        }\n\n        const fields = this.resolveFields(firstRow, model);\n\n        if (Array.isArray(data)) {\n            data.forEach((row, i) => (data[i] = this.processRow(row, fields)));\n            return data;\n        } else {\n            return this.processRow(data, fields);\n        }\n    }\n\n    private resolveFields(row: any, model: GetModels<Schema>): FieldDef[] {\n        if (!row || typeof row !== 'object') {\n            return [];\n        }\n        const result: FieldDef[] = [];\n        for (const key of Object.keys(row)) {\n            if (key === '_count' || key.startsWith(DELEGATE_JOINED_FIELD_PREFIX)) {\n                continue;\n            }\n            const fieldDef = getField(this.schema, model, key);\n            if (fieldDef) {\n                result.push(fieldDef);\n            }\n        }\n        return result;\n    }\n\n    private processRow(data: any, fields: FieldDef[]) {\n        if (!data || typeof data !== 'object') {\n            return data;\n        }\n\n        // handle special keys\n        for (const key of Object.keys(data)) {\n            const value = data[key];\n            if (value === undefined) {\n                continue;\n            }\n\n            if (key === '_count') {\n                // underlying database provider may return string for count\n                data[key] = typeof value === 'string' ? JSON.parse(value) : value;\n            } else if (key.startsWith(DELEGATE_JOINED_FIELD_PREFIX)) {\n                // merge delegate descendant fields\n                if (value) {\n                    // descendant fields are packed as JSON\n                    const subRow = this.dialect.transformOutput(value, 'Json', false);\n\n                    // process the sub-row\n                    const subModel = key.slice(DELEGATE_JOINED_FIELD_PREFIX.length) as GetModels<Schema>;\n                    const idValues = getIdValues(this.schema, subModel, subRow);\n                    if (Object.values(idValues).some((v) => v === null || v === undefined)) {\n                        // if the row doesn't have a valid id, the joined row doesn't exist\n                        delete data[key];\n                        continue;\n                    }\n                    const subFields = this.resolveFields(subRow, subModel);\n                    const processedSubRow = this.processRow(subRow, subFields);\n\n                    // merge the sub-row into the main row\n                    Object.assign(data, processedSubRow);\n                }\n                delete data[key];\n            }\n        }\n\n        // process regular fields using pre-resolved field definitions\n        for (const fieldDef of fields) {\n            const value = data[fieldDef.name];\n            if (value === undefined) {\n                continue;\n            }\n\n            if (value === null) {\n                // scalar list defaults to empty array\n                if (fieldDef.array && !fieldDef.relation) {\n                    data[fieldDef.name] = [];\n                }\n                continue;\n            }\n\n            if (fieldDef.relation) {\n                data[fieldDef.name] = this.processRelation(value, fieldDef);\n            } else {\n                data[fieldDef.name] = this.processFieldValue(value, fieldDef);\n            }\n        }\n\n        return data;\n    }\n\n    private processFieldValue(value: unknown, fieldDef: FieldDef) {\n        const type = fieldDef.type as BuiltinType;\n        if (Array.isArray(value)) {\n            value.forEach((v, i) => (value[i] = this.dialect.transformOutput(v, type, false)));\n            return value;\n        } else {\n            return this.dialect.transformOutput(value, type, !!fieldDef.array);\n        }\n    }\n\n    private processRelation(value: unknown, fieldDef: FieldDef) {\n        let relationData = value;\n        if (typeof value === 'string') {\n            // relation can be returned as a JSON string\n            try {\n                relationData = JSON.parse(value);\n            } catch {\n                return value;\n            }\n        }\n        return this.doProcessResult(relationData, fieldDef.type as GetModels<Schema>);\n    }\n\n    private fixReversedResult(data: any, model: GetModels<Schema>, args: any) {\n        if (!data) {\n            return;\n        }\n\n        if (Array.isArray(data) && typeof args === 'object' && args && args.take !== undefined && args.take < 0) {\n            data.reverse();\n        }\n\n        const selectInclude = args?.include ?? args?.select;\n        if (!selectInclude) {\n            return;\n        }\n\n        for (const row of ensureArray(data)) {\n            for (const [field, value] of Object.entries<any>(selectInclude)) {\n                if (typeof value !== 'object' || !value) {\n                    continue;\n                }\n                const fieldDef = getField(this.schema, model, field);\n                if (!fieldDef || !fieldDef.relation || !fieldDef.array) {\n                    continue;\n                }\n                this.fixReversedResult(row[field], fieldDef.type as GetModels<Schema>, value);\n            }\n        }\n    }\n}\n","import { invariant, lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type { ProcedureDef, SchemaDef } from '@zenstackhq/schema';\nimport type { QueryExecutor } from 'kysely';\nimport {\n    CompiledQuery,\n    DefaultConnectionProvider,\n    DefaultQueryExecutor,\n    Kysely,\n    Log,\n    sql,\n    Transaction,\n    type KyselyProps,\n} from 'kysely';\nimport z from 'zod';\nimport type { AnyKysely } from '../utils/kysely-utils';\nimport type { UnwrapTuplePromises } from '../utils/type-utils';\nimport { formatError } from '../utils/zod-utils';\nimport type {\n    AuthType,\n    ClientConstructor,\n    ClientContract,\n    ModelOperations,\n    TransactionIsolationLevel,\n} from './contract';\nimport { AggregateOperationHandler } from './crud/operations/aggregate';\nimport type { AllCrudOperations, CoreCrudOperations } from './crud/operations/base';\nimport { BaseOperationHandler } from './crud/operations/base';\nimport { CountOperationHandler } from './crud/operations/count';\nimport { CreateOperationHandler } from './crud/operations/create';\nimport { DeleteOperationHandler } from './crud/operations/delete';\nimport { ExistsOperationHandler } from './crud/operations/exists';\nimport { FindOperationHandler } from './crud/operations/find';\nimport { GroupByOperationHandler } from './crud/operations/group-by';\nimport { UpdateOperationHandler } from './crud/operations/update';\nimport { InputValidator } from './crud/validator';\nimport type { Diagnostics, QueryInfo } from './diagnostics';\nimport { createConfigError, createNotFoundError, createNotSupportedError } from './errors';\nimport { ZenStackDriver } from './executor/zenstack-driver';\nimport { ZenStackQueryExecutor } from './executor/zenstack-query-executor';\nimport * as BuiltinFunctions from './functions';\nimport { SchemaDbPusher } from './helpers/schema-db-pusher';\nimport type { ClientOptions, ProceduresOptions } from './options';\nimport type { AnyPlugin } from './plugin';\nimport { createZenStackPromise, type ZenStackPromise } from './promise';\nimport { fieldHasDefaultValue, getField, isUnsupportedField, requireModel } from './query-utils';\nimport { ResultProcessor } from './result-processor';\n\ntype ExtResultFieldDef = {\n    needs: Record<string, true>;\n    compute: (data: Record<string, any>) => unknown;\n};\n\n/**\n * ZenStack ORM client.\n */\nexport const ZenStackClient = function <Schema extends SchemaDef>(\n    this: any,\n    schema: Schema,\n    options: ClientOptions<Schema>,\n) {\n    return new ClientImpl(schema, options as ClientOptions<SchemaDef>);\n} as unknown as ClientConstructor;\n\nexport class ClientImpl {\n    private kysely: AnyKysely;\n    private kyselyRaw: AnyKysely;\n    public readonly $options: ClientOptions<SchemaDef>;\n    public readonly $schema: SchemaDef;\n    readonly kyselyProps: KyselyProps;\n    private auth: AuthType<SchemaDef> | undefined;\n    inputValidator: InputValidator<SchemaDef>;\n    readonly slowQueries: QueryInfo[] = [];\n\n    constructor(\n        private readonly schema: SchemaDef,\n        private options: ClientOptions<SchemaDef>,\n        baseClient?: ClientImpl,\n        executor?: QueryExecutor,\n    ) {\n        this.$schema = schema;\n        this.$options = options;\n\n        this.$options.functions = {\n            ...BuiltinFunctions,\n            ...this.$options.functions,\n        };\n\n        this.validateOptions(baseClient, options);\n\n        // here we use kysely's props constructor so we can pass a custom query executor\n        if (baseClient) {\n            this.kyselyProps = {\n                ...baseClient.kyselyProps,\n                executor:\n                    executor ??\n                    new ZenStackQueryExecutor(\n                        this,\n                        baseClient.kyselyProps.driver as ZenStackDriver,\n                        baseClient.kyselyProps.dialect.createQueryCompiler(),\n                        baseClient.kyselyProps.dialect.createAdapter(),\n                        new DefaultConnectionProvider(baseClient.kyselyProps.driver),\n                    ),\n            };\n            this.kyselyRaw = baseClient.kyselyRaw;\n            this.auth = baseClient.auth;\n            this.slowQueries = baseClient.slowQueries;\n        } else {\n            const driver = new ZenStackDriver(options.dialect.createDriver(), new Log(this.$options.log ?? []));\n            const compiler = options.dialect.createQueryCompiler();\n            const adapter = options.dialect.createAdapter();\n            const connectionProvider = new DefaultConnectionProvider(driver);\n\n            this.kyselyProps = {\n                config: {\n                    dialect: options.dialect,\n                    log: this.$options.log,\n                },\n                dialect: options.dialect,\n                driver,\n                executor: executor ?? new ZenStackQueryExecutor(this, driver, compiler, adapter, connectionProvider),\n            };\n\n            // raw kysely instance with default executor\n            this.kyselyRaw = new Kysely({\n                ...this.kyselyProps,\n                executor: new DefaultQueryExecutor(compiler, adapter, connectionProvider, []),\n            });\n        }\n\n        if (baseClient?.isTransaction && !executor) {\n            // if we're creating a derived client from a transaction client and not replacing\n            // the executor, reuse the current kysely instance to retain the transaction context\n            this.kysely = baseClient.$qb;\n        } else {\n            this.kysely = new Kysely(this.kyselyProps);\n        }\n\n        this.inputValidator =\n            baseClient?.inputValidator ??\n            new InputValidator(this as any, { enabled: this.$options.validateInput !== false });\n\n        return createClientProxy(this);\n    }\n\n    private validateOptions(baseClient: ClientImpl | undefined, options: ClientOptions<SchemaDef>) {\n        if (!baseClient && !options.skipValidationForComputedFields) {\n            // validate computed fields configuration once for the root client\n            this.validateComputedFieldsConfig(options);\n        }\n\n        if (options.diagnostics) {\n            const diagnosticsSchema = z.object({\n                slowQueryThresholdMs: z.number().nonnegative().optional(),\n                slowQueryMaxRecords: z.int().nonnegative().or(z.literal(Infinity)).optional(),\n            });\n            const parseResult = diagnosticsSchema.safeParse(options.diagnostics);\n            if (!parseResult.success) {\n                throw createConfigError(`Invalid diagnostics configuration: ${formatError(parseResult.error)}`);\n            }\n        }\n    }\n\n    /**\n     * Validates that all computed fields in the schema have corresponding configurations.\n     */\n    private validateComputedFieldsConfig(options: ClientOptions<SchemaDef>) {\n        const computedFieldsConfig =\n            'computedFields' in options ? (options.computedFields as Record<string, any> | undefined) : undefined;\n\n        for (const [modelName, modelDef] of Object.entries(this.$schema.models)) {\n            if (modelDef.computedFields) {\n                for (const fieldName of Object.keys(modelDef.computedFields)) {\n                    // check both uncapitalized (current) and original (backward compat) model name\n                    const modelConfig =\n                        computedFieldsConfig?.[lowerCaseFirst(modelName)] ?? computedFieldsConfig?.[modelName];\n                    const fieldConfig = modelConfig?.[fieldName];\n                    // Check if the computed field has a configuration\n                    if (fieldConfig === null || fieldConfig === undefined) {\n                        throw createConfigError(\n                            `Computed field \"${fieldName}\" in model \"${modelName}\" does not have a configuration. ` +\n                                `Please provide an implementation in the computedFields option.`,\n                        );\n                    }\n                    // Check that the configuration is a function\n                    if (typeof fieldConfig !== 'function') {\n                        throw createConfigError(\n                            `Computed field \"${fieldName}\" in model \"${modelName}\" has an invalid configuration: ` +\n                                `expected a function but received ${typeof fieldConfig}.`,\n                        );\n                    }\n                }\n            }\n        }\n    }\n\n    get $qb() {\n        return this.kysely;\n    }\n\n    get $qbRaw() {\n        return this.kyselyRaw;\n    }\n\n    get $zod() {\n        return this.inputValidator.zodFactory;\n    }\n\n    get isTransaction() {\n        return this.kysely.isTransaction;\n    }\n\n    /**\n     * Create a new client with a new query executor.\n     */\n    withExecutor(executor: QueryExecutor) {\n        return new ClientImpl(this.schema, this.$options, this, executor);\n    }\n\n    // overload for interactive transaction\n    $transaction<T>(\n        callback: (tx: ClientContract<SchemaDef>) => Promise<T>,\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ): Promise<T>;\n\n    // overload for sequential transaction\n    $transaction<P extends ZenStackPromise<any>[]>(\n        arg: [...P],\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ): Promise<UnwrapTuplePromises<P>>;\n\n    // implementation\n    async $transaction(input: any, options?: { isolationLevel?: TransactionIsolationLevel }) {\n        invariant(\n            typeof input === 'function' || (Array.isArray(input) && input.every((p) => p.then && p.cb)),\n            'Invalid transaction input, expected a function or an array of ZenStackPromise',\n        );\n        if (typeof input === 'function') {\n            return this.interactiveTransaction(input, options);\n        } else {\n            return this.sequentialTransaction(input, options);\n        }\n    }\n\n    forceTransaction() {\n        if (!this.kysely.isTransaction) {\n            this.kysely = new Transaction(this.kyselyProps);\n        }\n    }\n\n    private async interactiveTransaction(\n        callback: (tx: ClientContract<SchemaDef>) => Promise<any>,\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ): Promise<any> {\n        if (this.kysely.isTransaction) {\n            // proceed directly if already in a transaction\n            return callback(this as unknown as ClientContract<SchemaDef>);\n        } else {\n            // otherwise, create a new transaction, clone the client, and execute the callback\n            let txBuilder = this.kysely.transaction();\n            if (options?.isolationLevel) {\n                txBuilder = txBuilder.setIsolationLevel(options.isolationLevel);\n            }\n            return txBuilder.execute((tx) => {\n                const txClient = new ClientImpl(this.schema, this.$options, this);\n                txClient.kysely = tx;\n                return callback(txClient as unknown as ClientContract<SchemaDef>);\n            });\n        }\n    }\n\n    private getPromiseCallback(promise: ZenStackPromise<any>) {\n        invariant((promise as any).cb, 'Invalid ZenStackPromise, missing cb property');\n        const cb = (promise as any).cb;\n        invariant(typeof cb === 'function', 'Invalid ZenStackPromise, cb property is not a function');\n        return (promise as any).cb;\n    }\n\n    private async sequentialTransaction(\n        arg: ZenStackPromise<any>[],\n        options?: { isolationLevel?: TransactionIsolationLevel },\n    ) {\n        const execute = async (tx: AnyKysely) => {\n            const txClient = new ClientImpl(this.schema, this.$options, this);\n            txClient.kysely = tx;\n            const result: any[] = [];\n            for (const promise of arg) {\n                const cb = this.getPromiseCallback(promise);\n                result.push(await cb(txClient as unknown as ClientContract<SchemaDef>));\n            }\n            return result;\n        };\n        if (this.kysely.isTransaction) {\n            // proceed directly if already in a transaction\n            return execute(this.kysely);\n        } else {\n            // otherwise, create a new transaction, clone the client, and execute the callback\n            let txBuilder = this.kysely.transaction();\n            if (options?.isolationLevel) {\n                txBuilder = txBuilder.setIsolationLevel(options.isolationLevel);\n            }\n            return txBuilder.execute((tx) => execute(tx as AnyKysely));\n        }\n    }\n\n    get $procs() {\n        return Object.keys(this.$schema.procedures ?? {}).reduce((acc, name) => {\n            // Filter procedures based on slicing configuration\n            if (!isProcedureIncluded(this.$options, name)) {\n                return acc;\n            }\n            acc[name] = (input?: unknown) => this.handleProc(name, input);\n            return acc;\n        }, {} as any);\n    }\n\n    private async handleProc(name: string, input: unknown) {\n        if (!('procedures' in this.$options) || !this.$options || typeof this.$options.procedures !== 'object') {\n            throw createConfigError('Procedures are not configured for the client.');\n        }\n\n        const procDef = (this.$schema.procedures ?? {})[name];\n        if (!procDef) {\n            throw createConfigError(`Procedure \"${name}\" is not defined in schema.`);\n        }\n\n        const procOptions = this.$options.procedures as ProceduresOptions<\n            SchemaDef & {\n                procedures: Record<string, ProcedureDef>;\n            }\n        >;\n        if (!procOptions[name] || typeof procOptions[name] !== 'function') {\n            throw createConfigError(`Procedure \"${name}\" does not have a handler configured.`);\n        }\n\n        // Validate inputs using the same validator infrastructure as CRUD operations.\n        const validatedInput = this.inputValidator.validateProcedureInput(name, input);\n\n        const handler = procOptions[name] as Function;\n\n        const invokeWithClient = async (client: any, _input: unknown) => {\n            let proceed = async (nextInput: unknown) => {\n                const sanitizedNextInput =\n                    nextInput && typeof nextInput === 'object' && !Array.isArray(nextInput) ? nextInput : {};\n\n                return handler({ client, ...sanitizedNextInput });\n            };\n\n            // apply plugins\n            const plugins = [...(client.$options?.plugins ?? [])];\n            for (const plugin of plugins) {\n                const onProcedure = plugin.onProcedure;\n                if (onProcedure) {\n                    const _proceed = proceed;\n                    proceed = (nextInput: unknown) =>\n                        onProcedure({\n                            client,\n                            name,\n                            mutation: !!procDef.mutation,\n                            input: nextInput,\n                            proceed: (finalInput: unknown) => _proceed(finalInput),\n                        }) as Promise<unknown>;\n                }\n            }\n\n            return proceed(_input);\n        };\n\n        return invokeWithClient(this as any, validatedInput);\n    }\n\n    async $connect() {\n        await this.kysely.connection().execute(async (conn) => {\n            await conn.executeQuery(sql`select 1`.compile(this.kysely));\n        });\n    }\n\n    async $disconnect() {\n        await this.kysely.destroy();\n    }\n\n    async $pushSchema() {\n        await new SchemaDbPusher(this.schema, this.kysely).push();\n    }\n\n    $use(plugin: AnyPlugin) {\n        const newPlugins: AnyPlugin[] = [...(this.$options.plugins ?? []), plugin];\n        const newOptions: ClientOptions<SchemaDef> = {\n            ...this.options,\n            plugins: newPlugins,\n        };\n        const newClient = new ClientImpl(this.schema, newOptions, this);\n        // create a new validator to have a fresh schema cache, because plugins may extend the\n        // query args schemas\n        newClient.inputValidator = new InputValidator(newClient as any, {\n            enabled: newOptions.validateInput !== false,\n        });\n        return newClient;\n    }\n\n    $unuse(pluginId: string) {\n        // tsc perf\n        const newPlugins: AnyPlugin[] = [];\n        for (const plugin of this.options.plugins ?? []) {\n            if (plugin.id !== pluginId) {\n                newPlugins.push(plugin);\n            }\n        }\n        const newOptions: ClientOptions<SchemaDef> = {\n            ...this.options,\n            plugins: newPlugins,\n        };\n        const newClient = new ClientImpl(this.schema, newOptions, this);\n        // create a new validator to have a fresh schema cache, because plugins may\n        // extend the query args schemas\n        newClient.inputValidator = new InputValidator(newClient as any, {\n            enabled: newClient.$options.validateInput !== false,\n        });\n        return newClient;\n    }\n\n    $unuseAll() {\n        // tsc perf\n        const newOptions: ClientOptions<SchemaDef> = {\n            ...this.options,\n            plugins: [] as AnyPlugin[],\n        };\n        const newClient = new ClientImpl(this.schema, newOptions, this);\n        // create a new validator to have a fresh schema cache, because plugins may\n        // extend the query args schemas\n        newClient.inputValidator = new InputValidator(newClient as any, {\n            enabled: newOptions.validateInput !== false,\n        });\n        return newClient;\n    }\n\n    $setAuth(auth: AuthType<SchemaDef> | undefined) {\n        if (auth !== undefined && (typeof auth !== 'object' || auth === null || Array.isArray(auth))) {\n            throw new Error('Invalid auth object');\n        }\n        const newClient = new ClientImpl(this.schema, this.$options, this);\n        newClient.auth = auth;\n        return newClient;\n    }\n\n    get $auth() {\n        return this.auth;\n    }\n\n    $setOptions<Options extends ClientOptions<SchemaDef>>(options: Options): ClientContract<SchemaDef, Options> {\n        const newClient = new ClientImpl(this.schema, options as ClientOptions<SchemaDef>, this);\n        // create a new validator to have a fresh schema cache, because options may change validation settings\n        newClient.inputValidator = new InputValidator(newClient as any, {\n            enabled: newClient.$options.validateInput !== false,\n        });\n        return newClient as unknown as ClientContract<SchemaDef, Options>;\n    }\n\n    $setInputValidation(enable: boolean) {\n        const newOptions: ClientOptions<SchemaDef> = {\n            ...this.options,\n            validateInput: enable,\n        };\n        return this.$setOptions(newOptions);\n    }\n\n    get $diagnostics(): Promise<Diagnostics> {\n        return Promise.resolve({\n            zodCache: this.inputValidator.zodFactory.cacheStats,\n            slowQueries: this.slowQueries.map((q) => ({ ...q })).sort((a, b) => b.durationMs - a.durationMs),\n        });\n    }\n\n    $executeRaw(query: TemplateStringsArray, ...values: any[]) {\n        return createZenStackPromise(async () => {\n            const result = await sql(query, ...values).execute(this.kysely);\n            return Number(result.numAffectedRows ?? 0);\n        });\n    }\n\n    $executeRawUnsafe(query: string, ...values: any[]) {\n        return createZenStackPromise(async () => {\n            const compiledQuery = this.createRawCompiledQuery(query, values);\n            const result = await this.kysely.executeQuery(compiledQuery);\n            return Number(result.numAffectedRows ?? 0);\n        });\n    }\n\n    $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: any[]) {\n        return createZenStackPromise(async () => {\n            const result = await sql(query, ...values).execute(this.kysely);\n            return result.rows as T;\n        });\n    }\n\n    $queryRawUnsafe<T = unknown>(query: string, ...values: any[]) {\n        return createZenStackPromise(async () => {\n            const compiledQuery = this.createRawCompiledQuery(query, values);\n            const result = await this.kysely.executeQuery(compiledQuery);\n            return result.rows as T;\n        });\n    }\n\n    private createRawCompiledQuery(query: string, values: any[]) {\n        const q = CompiledQuery.raw(query, values);\n        return { ...q, $raw: true } as CompiledQuery;\n    }\n}\n\nfunction createClientProxy(client: ClientImpl): ClientImpl {\n    const resultProcessor = new ResultProcessor(client.$schema, client.$options);\n\n    return new Proxy(client, {\n        get: (target, prop, receiver) => {\n            if (typeof prop === 'string' && prop.startsWith('$')) {\n                // Check for plugin-provided members (search in reverse order so later plugins win)\n                const plugins = target.$options.plugins ?? [];\n                for (let i = plugins.length - 1; i >= 0; i--) {\n                    const plugin = plugins[i];\n                    const clientMembers = plugin?.client as Record<string, unknown> | undefined;\n                    if (clientMembers && prop in clientMembers) {\n                        return clientMembers[prop];\n                    }\n                }\n                // Fall through to built-in $ methods\n                return Reflect.get(target, prop, receiver);\n            }\n\n            if (typeof prop === 'string') {\n                const model = Object.keys(client.$schema.models).find((m) => m.toLowerCase() === prop.toLowerCase());\n                if (model) {\n                    // Check if model is allowed by slicing configuration\n                    if (!isModelIncluded(client.$options, model)) {\n                        return undefined;\n                    }\n                    return createModelCrudHandler(client as any, model, client.inputValidator, resultProcessor);\n                }\n            }\n\n            return Reflect.get(target, prop, receiver);\n        },\n    }) as unknown as ClientImpl;\n}\n\n/**\n * Checks if a model should be included based on slicing configuration.\n */\nfunction isModelIncluded(options: ClientOptions<SchemaDef>, model: string): boolean {\n    const slicing = options.slicing;\n    if (!slicing) {\n        // No slicing config, include all models\n        return true;\n    }\n\n    const { includedModels, excludedModels } = slicing;\n\n    // If includedModels is specified (even if empty), only include those models\n    if (includedModels !== undefined) {\n        if (!includedModels.includes(model as any)) {\n            return false;\n        }\n    }\n\n    // Then check if model is excluded\n    if (excludedModels && excludedModels.length > 0) {\n        if (excludedModels.includes(model as any)) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\n/**\n * Checks if a procedure should be included based on slicing configuration.\n */\nfunction isProcedureIncluded(options: ClientOptions<SchemaDef>, procedureName: string): boolean {\n    const slicing = options.slicing;\n    if (!slicing) {\n        // No slicing config, include all procedures\n        return true;\n    }\n\n    const { includedProcedures, excludedProcedures } = slicing;\n\n    // If includedProcedures is specified (even if empty), only include those procedures\n    if (includedProcedures !== undefined) {\n        if (!(includedProcedures as readonly string[]).includes(procedureName)) {\n            return false;\n        }\n    }\n\n    // Then check if procedure is excluded (exclusion takes precedence)\n    if (excludedProcedures && excludedProcedures.length > 0) {\n        if ((excludedProcedures as readonly string[]).includes(procedureName)) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nfunction createModelCrudHandler(\n    client: ClientContract<any>,\n    model: string,\n    inputValidator: InputValidator<any>,\n    resultProcessor: ResultProcessor<any>,\n): ModelOperations<any, any> {\n    // check if any plugin defines ext result fields\n    const plugins = client.$options.plugins ?? [];\n    const schema = client.$schema;\n    const hasAnyExtResult = hasExtResultFieldDefs(plugins);\n\n    const createPromise = (\n        operation: CoreCrudOperations,\n        nominalOperation: AllCrudOperations,\n        args: unknown,\n        handler: BaseOperationHandler<any>,\n        postProcess = false,\n        throwIfNoResult = false,\n    ) => {\n        return createZenStackPromise(async (txClient?: ClientContract<any>) => {\n            let proceed = async (_args: unknown) => {\n                // prepare args for ext result: strip ext result field names from select/omit,\n                // inject needs fields into select (recursively handles nested relations)\n                const shouldApplyExtResult = hasAnyExtResult && EXT_RESULT_OPERATIONS.has(operation);\n                const processedArgs = shouldApplyExtResult\n                    ? prepareArgsForExtResult(_args, model, schema, plugins)\n                    : _args;\n\n                const _handler = txClient ? handler.withClient(txClient) : handler;\n                const r = await _handler.handle(operation, processedArgs);\n                if (!r && throwIfNoResult) {\n                    throw createNotFoundError(model);\n                }\n                let result: unknown;\n                if (r && postProcess) {\n                    result = resultProcessor.processResult(r, model, processedArgs);\n                } else {\n                    result = r ?? null;\n                }\n\n                // compute ext result fields (recursively handles nested relations)\n                if (result && shouldApplyExtResult) {\n                    result = applyExtResult(result, model, _args, schema, plugins);\n                }\n\n                return result;\n            };\n\n            // apply plugins\n            const plugins = [...(client.$options.plugins ?? [])];\n            for (const plugin of plugins) {\n                const onQuery = plugin.onQuery;\n                if (onQuery) {\n                    const _proceed = proceed;\n                    proceed = (_args: unknown) => {\n                        const ctx: any = {\n                            client,\n                            model,\n                            operation: nominalOperation,\n                            // reflect the latest override if provided\n                            args: _args,\n                            // ensure inner overrides are propagated to the previous proceed\n                            proceed: (nextArgs: unknown) => _proceed(nextArgs),\n                        };\n                        return (onQuery as (ctx: any) => Promise<unknown>)(ctx);\n                    };\n                }\n            }\n\n            return proceed(args);\n        });\n    };\n\n    // type parameters to operation handlers are explicitly specified to improve tsc performance\n    const operations = {\n        findUnique: (args: unknown) => {\n            return createPromise(\n                'findUnique',\n                'findUnique',\n                args,\n                new FindOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        findUniqueOrThrow: (args: unknown) => {\n            return createPromise(\n                'findUnique',\n                'findUniqueOrThrow',\n                args,\n                new FindOperationHandler<any>(client, model, inputValidator),\n                true,\n                true,\n            );\n        },\n\n        findFirst: (args: unknown) => {\n            return createPromise(\n                'findFirst',\n                'findFirst',\n                args,\n                new FindOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        findFirstOrThrow: (args: unknown) => {\n            return createPromise(\n                'findFirst',\n                'findFirstOrThrow',\n                args,\n                new FindOperationHandler<any>(client, model, inputValidator),\n                true,\n                true,\n            );\n        },\n\n        findMany: (args: unknown) => {\n            return createPromise(\n                'findMany',\n                'findMany',\n                args,\n                new FindOperationHandler<any>(client, model, inputValidator),\n                true,\n                false,\n            );\n        },\n\n        create: (args: unknown) => {\n            return createPromise(\n                'create',\n                'create',\n                args,\n                new CreateOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        createMany: (args: unknown) => {\n            return createPromise(\n                'createMany',\n                'createMany',\n                args,\n                new CreateOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n\n        createManyAndReturn: (args: unknown) => {\n            if (client.$schema.provider.type === 'mysql') {\n                throw createNotSupportedError(\n                    '\"createManyAndReturn\" is not supported by \"mysql\" provider. Use \"createMany\" or multiple \"create\" calls instead.',\n                );\n            }\n            return createPromise(\n                'createManyAndReturn',\n                'createManyAndReturn',\n                args,\n                new CreateOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        update: (args: unknown) => {\n            return createPromise(\n                'update',\n                'update',\n                args,\n                new UpdateOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        updateMany: (args: unknown) => {\n            return createPromise(\n                'updateMany',\n                'updateMany',\n                args,\n                new UpdateOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n\n        updateManyAndReturn: (args: unknown) => {\n            if (client.$schema.provider.type === 'mysql') {\n                throw createNotSupportedError(\n                    '\"updateManyAndReturn\" is not supported by \"mysql\" provider. Use \"updateMany\" or multiple \"update\" calls instead.',\n                );\n            }\n            return createPromise(\n                'updateManyAndReturn',\n                'updateManyAndReturn',\n                args,\n                new UpdateOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        upsert: (args: unknown) => {\n            return createPromise(\n                'upsert',\n                'upsert',\n                args,\n                new UpdateOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        delete: (args: unknown) => {\n            return createPromise(\n                'delete',\n                'delete',\n                args,\n                new DeleteOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        deleteMany: (args: unknown) => {\n            return createPromise(\n                'deleteMany',\n                'deleteMany',\n                args,\n                new DeleteOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n\n        count: (args: unknown) => {\n            return createPromise(\n                'count',\n                'count',\n                args,\n                new CountOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n\n        aggregate: (args: unknown) => {\n            return createPromise(\n                'aggregate',\n                'aggregate',\n                args,\n                new AggregateOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n\n        groupBy: (args: unknown) => {\n            return createPromise(\n                'groupBy',\n                'groupBy',\n                args,\n                new GroupByOperationHandler<any>(client, model, inputValidator),\n                true,\n            );\n        },\n\n        exists: (args: unknown) => {\n            return createPromise(\n                'exists',\n                'exists',\n                args,\n                new ExistsOperationHandler<any>(client, model, inputValidator),\n                false,\n            );\n        },\n    };\n\n    // Filter operations based on slicing configuration\n    const slicing = client.$options.slicing;\n    if (slicing?.models) {\n        const modelSlicing = slicing.models[lowerCaseFirst(model) as any];\n        const allSlicing = slicing.models.$all;\n\n        // Determine includedOperations: model-specific takes precedence over $all\n        const includedOperations = modelSlicing?.includedOperations ?? allSlicing?.includedOperations;\n\n        // Determine excludedOperations: model-specific takes precedence over $all\n        const excludedOperations = modelSlicing?.excludedOperations ?? allSlicing?.excludedOperations;\n\n        // If includedOperations is specified, remove operations not in the list\n        if (includedOperations !== undefined) {\n            for (const key of Object.keys(operations)) {\n                if (!includedOperations.includes(key as any)) {\n                    delete (operations as any)[key];\n                }\n            }\n        }\n\n        // Then remove explicitly excluded operations\n        if (excludedOperations && excludedOperations.length > 0) {\n            for (const operation of excludedOperations) {\n                delete (operations as any)[operation];\n            }\n        }\n    }\n\n    // Remove create/upsert operations for models with required Unsupported fields\n    const modelDef = requireModel(client.$schema, model);\n    if (Object.values(modelDef.fields).some((f) => isUnsupportedField(f) && !f.optional && !fieldHasDefaultValue(f))) {\n        for (const op of ['create', 'createMany', 'createManyAndReturn', 'upsert'] as const) {\n            delete (operations as any)[op];\n        }\n    }\n\n    return operations as ModelOperations<any, any>;\n}\n\n// #region Extended result field helpers\n\n// operations that return model rows and should have ext result fields applied\nconst EXT_RESULT_OPERATIONS = new Set<CoreCrudOperations>([\n    'findMany',\n    'findUnique',\n    'findFirst',\n    'create',\n    'createManyAndReturn',\n    'update',\n    'updateManyAndReturn',\n    'upsert',\n    'delete',\n]);\n\n/**\n * Returns true if any plugin defines ext result fields for any model.\n */\nfunction hasExtResultFieldDefs(plugins: AnyPlugin[]): boolean {\n    return plugins.some((p) => p.result && Object.keys(p.result).length > 0);\n}\n\n/**\n * Collects extended result field definitions from all plugins for a given model.\n */\nfunction collectExtResultFieldDefs(\n    model: string,\n    schema: SchemaDef,\n    plugins: AnyPlugin[],\n): Map<string, ExtResultFieldDef> {\n    const defs = new Map<string, ExtResultFieldDef>();\n    for (const plugin of plugins) {\n        const resultConfig = plugin.result;\n        if (resultConfig) {\n            const modelConfig = resultConfig[lowerCaseFirst(model)];\n            if (modelConfig) {\n                for (const [fieldName, fieldDef] of Object.entries(modelConfig)) {\n                    if (getField(schema, model, fieldName)) {\n                        throw new Error(\n                            `Plugin \"${plugin.id}\" registers ext result field \"${fieldName}\" on model \"${model}\" which conflicts with an existing model field`,\n                        );\n                    }\n                    for (const needField of Object.keys((fieldDef as ExtResultFieldDef).needs ?? {})) {\n                        const needDef = getField(schema, model, needField);\n                        if (!needDef || needDef.relation) {\n                            throw new Error(\n                                `Plugin \"${plugin.id}\" registers ext result field \"${fieldName}\" on model \"${model}\" with invalid need \"${needField}\"`,\n                            );\n                        }\n                    }\n                    defs.set(fieldName, fieldDef as ExtResultFieldDef);\n                }\n            }\n        }\n    }\n    return defs;\n}\n\n/**\n * Prepares query args for extended result fields (recursive):\n * - Strips ext result field names from `select` and `omit`\n * - Injects `needs` fields into `select` when ext result fields are explicitly selected\n * - Recurses into `include` and `select` for nested relation fields\n */\nfunction prepareArgsForExtResult(args: unknown, model: string, schema: SchemaDef, plugins: AnyPlugin[]): unknown {\n    if (!args || typeof args !== 'object') {\n        return args;\n    }\n\n    const extResultDefs = collectExtResultFieldDefs(model, schema, plugins);\n    const typedArgs = args as Record<string, unknown>;\n    let result = typedArgs;\n    let changed = false;\n\n    const select = typedArgs['select'] as Record<string, unknown> | undefined;\n    const omit = typedArgs['omit'] as Record<string, unknown> | undefined;\n    const include = typedArgs['include'] as Record<string, unknown> | undefined;\n\n    if (select && extResultDefs.size > 0) {\n        const newSelect = { ...select };\n        for (const [fieldName, fieldDef] of extResultDefs) {\n            if (newSelect[fieldName]) {\n                delete newSelect[fieldName];\n                // inject needs fields\n                for (const needField of Object.keys(fieldDef.needs)) {\n                    if (!newSelect[needField]) {\n                        newSelect[needField] = true;\n                    }\n                }\n            }\n        }\n        result = { ...result, select: newSelect };\n        changed = true;\n    }\n\n    if (omit && extResultDefs.size > 0) {\n        const newOmit = { ...omit };\n        for (const [fieldName, fieldDef] of extResultDefs) {\n            if (newOmit[fieldName]) {\n                // strip ext result field names from omit (they don't exist in the DB)\n                delete newOmit[fieldName];\n            } else {\n                // this ext result field is active — ensure its needs are not omitted\n                for (const needField of Object.keys(fieldDef.needs)) {\n                    if (newOmit[needField]) {\n                        delete newOmit[needField];\n                    }\n                }\n            }\n        }\n        result = { ...result, omit: newOmit };\n        changed = true;\n    }\n\n    // Recurse into nested relations in `include`\n    if (include) {\n        const newInclude = { ...include };\n        let includeChanged = false;\n        for (const [field, value] of Object.entries(newInclude)) {\n            if (value && typeof value === 'object') {\n                const fieldDef = getField(schema, model, field);\n                if (fieldDef?.relation) {\n                    const targetModel = fieldDef.type;\n                    const processed = prepareArgsForExtResult(value, targetModel, schema, plugins);\n                    if (processed !== value) {\n                        newInclude[field] = processed;\n                        includeChanged = true;\n                    }\n                }\n            }\n        }\n        if (includeChanged) {\n            result = changed ? { ...result, include: newInclude } : { ...typedArgs, include: newInclude };\n            changed = true;\n        }\n    }\n\n    // Recurse into nested relations in `select` (relation fields can have nested args)\n    if (select) {\n        const currentSelect = (changed ? (result as Record<string, unknown>)['select'] : select) as\n            | Record<string, unknown>\n            | undefined;\n        if (currentSelect) {\n            const newSelect = { ...currentSelect };\n            let selectChanged = false;\n            for (const [field, value] of Object.entries(newSelect)) {\n                if (value && typeof value === 'object') {\n                    const fieldDef = getField(schema, model, field);\n                    if (fieldDef?.relation) {\n                        const targetModel = fieldDef.type;\n                        const processed = prepareArgsForExtResult(value, targetModel, schema, plugins);\n                        if (processed !== value) {\n                            newSelect[field] = processed;\n                            selectChanged = true;\n                        }\n                    }\n                }\n            }\n            if (selectChanged) {\n                result = { ...result, select: newSelect };\n                changed = true;\n            }\n        }\n    }\n\n    return changed ? result : args;\n}\n\n/**\n * Applies extended result field computation to query results (recursive).\n * Processes the current model's ext result fields, then recurses into nested relation data.\n */\nfunction applyExtResult(\n    result: unknown,\n    model: string,\n    originalArgs: unknown,\n    schema: SchemaDef,\n    plugins: AnyPlugin[],\n): unknown {\n    const extResultDefs = collectExtResultFieldDefs(model, schema, plugins);\n    if (Array.isArray(result)) {\n        for (let i = 0; i < result.length; i++) {\n            result[i] = applyExtResultToRow(result[i], model, originalArgs, schema, plugins, extResultDefs);\n        }\n        return result;\n    } else {\n        return applyExtResultToRow(result, model, originalArgs, schema, plugins, extResultDefs);\n    }\n}\n\nfunction applyExtResultToRow(\n    row: unknown,\n    model: string,\n    originalArgs: unknown,\n    schema: SchemaDef,\n    plugins: AnyPlugin[],\n    extResultDefs: Map<string, ExtResultFieldDef>,\n): unknown {\n    if (!row || typeof row !== 'object') {\n        return row;\n    }\n\n    const data = row as Record<string, unknown>;\n    const typedArgs = (originalArgs && typeof originalArgs === 'object' ? originalArgs : {}) as Record<string, unknown>;\n    const select = typedArgs['select'] as Record<string, unknown> | undefined;\n    const omit = typedArgs['omit'] as Record<string, unknown> | undefined;\n    const include = typedArgs['include'] as Record<string, unknown> | undefined;\n\n    // Compute ext result fields for the current model\n    for (const [fieldName, fieldDef] of extResultDefs) {\n        if (select && !select[fieldName]) {\n            continue;\n        }\n        if (omit?.[fieldName]) {\n            continue;\n        }\n        const needsSatisfied = Object.keys(fieldDef.needs).every((needField) => needField in data);\n        if (needsSatisfied) {\n            data[fieldName] = fieldDef.compute(data);\n        }\n    }\n\n    // Strip fields that shouldn't be in the result: when `select` was used,\n    // drop any field not in the original select and not a computed ext result field;\n    // when `omit` was used, re-delete any field the user originally omitted.\n    if (select) {\n        for (const key of Object.keys(data)) {\n            if (!select[key] && !extResultDefs.has(key)) {\n                delete data[key];\n            }\n        }\n    } else if (omit) {\n        for (const key of Object.keys(omit)) {\n            if (omit[key] && !extResultDefs.has(key)) {\n                delete data[key];\n            }\n        }\n    }\n\n    // Recurse into nested relation data\n    const relationSource = include ?? select;\n    if (relationSource) {\n        for (const [field, value] of Object.entries(relationSource)) {\n            if (data[field] == null) {\n                continue;\n            }\n            const fieldDef = getField(schema, model, field);\n            if (!fieldDef?.relation) {\n                continue;\n            }\n            const targetModel = fieldDef.type;\n            const nestedArgs = value && typeof value === 'object' ? value : undefined;\n            data[field] = applyExtResult(data[field], targetModel, nestedArgs, schema, plugins);\n        }\n    }\n\n    return data;\n}\n\n// #endregion\n","import type { OperationNode, QueryId, QueryResult, RootOperationNode, UnknownRow } from 'kysely';\nimport type { ZodType } from 'zod';\nimport type { ClientContract, ZModelFunction } from '.';\nimport type { GetModelFields, GetModels, NonRelationFields, SchemaDef } from '@zenstackhq/schema';\nimport type { MaybePromise } from '../utils/type-utils';\nimport type { MapModelFieldType } from './crud-types';\nimport type { AllCrudOperations, CoreCrudOperations } from './crud/operations/base';\n\ntype AllowedExtQueryArgKeys = CoreCrudOperations | '$create' | '$read' | '$update' | '$delete' | '$all';\n\n/**\n * Base shape of plugin-extended query args.\n */\nexport type ExtQueryArgsBase = {\n    [K in AllowedExtQueryArgKeys]?: object;\n};\n\n/**\n * Base type for plugin-extended client members (methods and properties).\n * Member names should start with '$' to avoid model name conflicts.\n */\nexport type ExtClientMembersBase = Record<string, unknown>;\n\n/**\n * Base shape of plugin-extended result fields.\n * Keyed by model name, each value maps field names to their definitions.\n * `needs` keys are constrained to non-relation fields of the corresponding model.\n */\nexport type ExtResultBase<Schema extends SchemaDef = SchemaDef> = {\n    [M in GetModels<Schema> as Uncapitalize<M>]?: Record<\n        string,\n        {\n            needs: Partial<Record<NonRelationFields<Schema, M>, true>>;\n            compute: (...args: any[]) => any;\n        }\n    >;\n};\n\n/**\n * Mapped type that provides per-field contextual typing for `compute` callbacks\n * based on the `needs` declaration. Uses a separate type parameter `R_` that captures\n * the needs shape (model → field → { neededField: true }), then links each field's\n * `compute` parameter to exactly the keys declared in its `needs`.\n */\nexport type ExtResultInferenceArgs<Schema extends SchemaDef, R_> = {\n    [K in keyof R_ & string]: {\n        [P in keyof R_[K]]?: {\n            needs?: {\n                // constraint for `needs` keys\n                [F in keyof R_[K][P]]: F extends NonRelationFields<Schema, ModelNameFromKey<Schema, K>> ? true : never;\n            } & Partial<Record<NonRelationFields<Schema, ModelNameFromKey<Schema, K>>, true>>; // further intersects with all possible keys for intellisense\n\n            // refine `computes`'s parameter type based on the inferred type of `needs`\n            compute: (data: ExtResultComputeData<Schema, ModelNameFromKey<Schema, K>, R_[K][P]>) => unknown;\n        };\n    };\n};\n\n/**\n * Reverse-maps an uncapitalized key back to the original model name in the schema.\n * E.g., for a schema with model `myModel`, the key `myModel` maps back to `myModel`\n * (not `MyModel` as `Capitalize` would produce).\n */\ntype ModelNameFromKey<Schema extends SchemaDef, K extends string> = {\n    [M in GetModels<Schema>]: Uncapitalize<M> extends K ? M : never;\n}[GetModels<Schema>];\n\n/**\n * Maps the needs shape `S` to an object with actual schema field types.\n * For each key in `S` that is a valid non-relation field of model `M`,\n * resolves the TypeScript type from the schema field definition.\n */\ntype ExtResultComputeData<Schema extends SchemaDef, M extends GetModels<Schema>, S> = {\n    [F in keyof S & GetModelFields<Schema, M>]: MapModelFieldType<Schema, M, F>;\n};\n\n/**\n * ZenStack runtime plugin.\n */\nexport interface RuntimePlugin<\n    Schema extends SchemaDef,\n    ExtQueryArgs extends ExtQueryArgsBase,\n    ExtClientMembers extends Record<string, unknown>,\n    ExtResult extends ExtResultBase<Schema>,\n> {\n    /**\n     * Plugin ID.\n     */\n    id: string;\n\n    /**\n     * Plugin display name.\n     */\n    name?: string;\n\n    /**\n     * Plugin description.\n     */\n    description?: string;\n\n    // TODO: revisit\n    /**\n     * Custom function implementations.\n     * @private\n     */\n    functions?: Record<string, ZModelFunction<Schema>>;\n\n    /**\n     * Intercepts an ORM query.\n     */\n    onQuery?: OnQueryCallback<Schema>;\n\n    /**\n     * Intercepts a procedure invocation.\n     */\n    onProcedure?: OnProcedureCallback<Schema>;\n\n    /**\n     * Intercepts an entity mutation.\n     */\n    onEntityMutation?: EntityMutationHooksDef<Schema>;\n\n    /**\n     * Intercepts a Kysely query.\n     */\n    onKyselyQuery?: OnKyselyQueryCallback<Schema>;\n\n    /**\n     * Extended query args configuration.\n     */\n    queryArgs?: {\n        [K in keyof ExtQueryArgs]: ZodType<ExtQueryArgs[K]>;\n    };\n\n    /**\n     * Extended client members (methods and properties).\n     */\n    client?: ExtClientMembers;\n\n    /**\n     * Extended result fields on query results.\n     * Keyed by model name, each value defines computed fields with `needs` and `compute`.\n     */\n    result?: ExtResult;\n}\n\nexport type AnyPlugin = RuntimePlugin<SchemaDef, any, any, any>;\n\n/**\n * Defines a ZenStack runtime plugin based on type of the given schema.\n *\n * @see {@link https://zenstack.dev/docs/orm/plugins/|Plugin Documentation}\n *\n * @example\n * ```typescript\n * definePlugin(schema, {\n *     id: 'my-plugin',\n *     result: {\n *         user: {\n *             fullName: {\n *                 needs: { firstName: true, lastName: true },\n *                 compute: (user) => `${user.firstName} ${user.lastName}`,\n *             },\n *         },\n *     },\n * });\n * ```\n */\nexport function definePlugin<\n    Schema extends SchemaDef,\n    const ExtQueryArgs extends ExtQueryArgsBase = {},\n    const ExtClientMembers extends Record<string, unknown> = {},\n    const ExtResult extends ExtResultBase<Schema> = {},\n    R_ = {},\n>(\n    schema: Schema,\n    plugin: RuntimePlugin<Schema, ExtQueryArgs, ExtClientMembers, ExtResult> & {\n        result?: ExtResultInferenceArgs<Schema, R_>;\n    },\n): RuntimePlugin<Schema, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\n/**\n * Defines a ZenStack runtime plugin.\n *\n * @see {@link https://zenstack.dev/docs/orm/plugins/|Plugin Documentation}\n *\n * @example\n * ```typescript\n * definePlugin(schema, {\n *     id: 'my-plugin',\n *     result: {\n *         user: {\n *             fullName: {\n *                 needs: { firstName: true, lastName: true },\n *                 compute: (user) => `${user.firstName} ${user.lastName}`,\n *             },\n *         },\n *     },\n * });\n * ```\n *  */\nexport function definePlugin<\n    Schema extends SchemaDef,\n    const ExtQueryArgs extends ExtQueryArgsBase = {},\n    const ExtClientMembers extends Record<string, unknown> = {},\n    const ExtResult extends ExtResultBase<Schema> = {},\n>(\n    plugin: RuntimePlugin<Schema, ExtQueryArgs, ExtClientMembers, ExtResult>,\n): RuntimePlugin<Schema, ExtQueryArgs, ExtClientMembers, ExtResult>;\n\nexport function definePlugin(...args: unknown[]) {\n    return args.length === 2 ? args[1] : args[0];\n}\n\n// #region OnProcedure hooks\n\ntype OnProcedureCallback<Schema extends SchemaDef> = (ctx: OnProcedureHookContext<Schema>) => Promise<unknown>;\n\nexport type OnProcedureHookContext<Schema extends SchemaDef> = {\n    /**\n     * The procedure name.\n     */\n    name: string;\n\n    /**\n     * Whether the procedure is a mutation.\n     */\n    mutation: boolean;\n\n    /**\n     * Procedure invocation input (envelope).\n     *\n     * The canonical shape is `{ args?: Record<string, unknown> }`.\n     * When a procedure has required params, `args` is required.\n     */\n    input: unknown;\n\n    /**\n     * Continues the invocation. The input passed here is forwarded to the next handler.\n     */\n    proceed: (input: unknown) => Promise<unknown>;\n\n    /**\n     * The ZenStack client that is invoking the procedure.\n     */\n    client: ClientContract<Schema>;\n};\n\n// #endregion\n\n// #region OnQuery hooks\n\ntype OnQueryCallback<Schema extends SchemaDef> = (ctx: OnQueryHookContext<Schema>) => Promise<unknown>;\n\ntype OnQueryHookContext<Schema extends SchemaDef> = {\n    /**\n     * The model that is being queried.\n     */\n    model: GetModels<Schema>;\n\n    /**\n     * The operation that is being performed.\n     */\n    operation: AllCrudOperations;\n\n    /**\n     * The query arguments.\n     */\n    args: Record<string, unknown> | undefined;\n\n    /**\n     * The function to proceed with the original query.\n     * It takes the same arguments as the operation method.\n     *\n     * @param args The query arguments.\n     */\n    proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;\n\n    /**\n     * The ZenStack client that is performing the operation.\n     */\n    client: ClientContract<Schema>;\n};\n\n// #endregion\n\n// #region OnEntityMutation hooks\n\nexport type EntityMutationHooksDef<Schema extends SchemaDef> = {\n    /**\n     * Called before entities are mutated.\n     */\n    beforeEntityMutation?: BeforeEntityMutationCallback<Schema>;\n\n    /**\n     * Called after entities are mutated.\n     */\n    afterEntityMutation?: AfterEntityMutationCallback<Schema>;\n\n    /**\n     * Whether to run after-mutation hooks within the transaction that performs the mutation.\n     *\n     * If set to `true`, if the mutation already runs inside a transaction, the callbacks are\n     * executed immediately after the mutation within the transaction boundary. If the mutation\n     * is not running inside a transaction, a new transaction is created to run both the mutation\n     * and the callbacks.\n     *\n     * If set to `false`, the callbacks are executed after the mutation transaction is committed.\n     *\n     * Defaults to `false`.\n     */\n    runAfterMutationWithinTransaction?: boolean;\n};\n\ntype MutationHooksArgs<Schema extends SchemaDef> = {\n    /**\n     * The model that is being mutated.\n     */\n    model: GetModels<Schema>;\n\n    /**\n     * The mutation action that is being performed.\n     */\n    action: 'create' | 'update' | 'delete';\n\n    /**\n     * The mutation data. Only available for create and update actions.\n     */\n    queryNode: OperationNode;\n\n    /**\n     * A query ID that uniquely identifies the mutation operation. You can use it to correlate\n     * data between the before and after mutation hooks.\n     */\n    queryId: QueryId;\n};\n\nexport type BeforeEntityMutationCallback<Schema extends SchemaDef> = (\n    args: PluginBeforeEntityMutationArgs<Schema>,\n) => MaybePromise<void>;\n\nexport type AfterEntityMutationCallback<Schema extends SchemaDef> = (\n    args: PluginAfterEntityMutationArgs<Schema>,\n) => MaybePromise<void>;\n\nexport type PluginBeforeEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {\n    /**\n     * Loads the entities that are about to be mutated. The db operation that loads the entities is executed\n     * within the same transaction context as the mutation.\n     */\n    loadBeforeMutationEntities(): Promise<Record<string, unknown>[] | undefined>;\n\n    /**\n     * The ZenStack client you can use to perform additional operations. The database operations initiated\n     * from this client are executed within the same transaction as the mutation if the mutation is running\n     * inside a transaction.\n     *\n     * Mutations initiated from this client will NOT trigger entity mutation hooks to avoid infinite loops.\n     */\n    client: ClientContract<Schema>;\n};\n\nexport type PluginAfterEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {\n    /**\n     * Loads the entities that have been mutated.\n     */\n    loadAfterMutationEntities(): Promise<Record<string, unknown>[] | undefined>;\n\n    /**\n     * The entities before mutation. Only available if `beforeEntityMutation` hook is provided and\n     * the `loadBeforeMutationEntities` function is called in that hook.\n     */\n    beforeMutationEntities?: Record<string, unknown>[];\n\n    /**\n     * The ZenStack client you can use to perform additional operations.\n     * See {@link EntityMutationHooksDef.runAfterMutationWithinTransaction} for detailed transaction behavior.\n     *\n     * Mutations initiated from this client will NOT trigger entity mutation hooks to avoid infinite loops.\n     */\n    client: ClientContract<Schema>;\n};\n\n// #endregion\n\n// #region OnKyselyQuery hooks\n\nexport type OnKyselyQueryArgs<Schema extends SchemaDef> = {\n    schema: SchemaDef;\n    client: ClientContract<Schema>;\n    query: RootOperationNode;\n    proceed: ProceedKyselyQueryFunction;\n};\n\nexport type ProceedKyselyQueryFunction = (query: RootOperationNode) => Promise<QueryResult<any>>;\n\nexport type OnKyselyQueryCallback<Schema extends SchemaDef> = (\n    args: OnKyselyQueryArgs<Schema>,\n) => Promise<QueryResult<UnknownRow>>;\n\n// #endregion\n","import {\n    AddColumnNode,\n    AddConstraintNode,\n    AddIndexNode,\n    AddValueNode,\n    AggregateFunctionNode,\n    AliasNode,\n    AlterColumnNode,\n    AlterTableNode,\n    AlterTypeNode,\n    AndNode,\n    BinaryOperationNode,\n    CaseNode,\n    CastNode,\n    CheckConstraintNode,\n    CollateNode,\n    ColumnDefinitionNode,\n    ColumnNode,\n    ColumnUpdateNode,\n    CommonTableExpressionNameNode,\n    CommonTableExpressionNode,\n    CreateIndexNode,\n    CreateSchemaNode,\n    CreateTableNode,\n    CreateTypeNode,\n    CreateViewNode,\n    DataTypeNode,\n    DefaultInsertValueNode,\n    DefaultValueNode,\n    DeleteQueryNode,\n    DropColumnNode,\n    DropConstraintNode,\n    DropIndexNode,\n    DropSchemaNode,\n    DropTableNode,\n    DropTypeNode,\n    DropViewNode,\n    ExplainNode,\n    FetchNode,\n    ForeignKeyConstraintNode,\n    FromNode,\n    FunctionNode,\n    GeneratedNode,\n    GroupByItemNode,\n    GroupByNode,\n    HavingNode,\n    IdentifierNode,\n    InsertQueryNode,\n    JoinNode,\n    JSONOperatorChainNode,\n    JSONPathLegNode,\n    JSONPathNode,\n    JSONReferenceNode,\n    Kysely,\n    LimitNode,\n    ListNode,\n    MatchedNode,\n    MergeQueryNode,\n    ModifyColumnNode,\n    OffsetNode,\n    OnConflictNode,\n    OnDuplicateKeyNode,\n    OnNode,\n    OperationNodeVisitor,\n    OperatorNode,\n    OrActionNode,\n    OrderByItemNode,\n    OrderByNode,\n    OrNode,\n    OutputNode,\n    OverNode,\n    ParensNode,\n    PartitionByItemNode,\n    PartitionByNode,\n    PrimitiveValueListNode,\n    RawNode,\n    ReferenceNode,\n    ReferencesNode,\n    RefreshMaterializedViewNode,\n    RenameColumnNode,\n    RenameConstraintNode,\n    RenameValueNode,\n    ReturningNode,\n    SchemableIdentifierNode,\n    SelectAllNode,\n    SelectionNode,\n    SelectModifierNode,\n    SelectQueryNode,\n    SetOperationNode,\n    TableNode,\n    TopNode,\n    TupleNode,\n    UnaryOperationNode,\n    UniqueConstraintNode,\n    UpdateQueryNode,\n    UsingNode,\n    ValueListNode,\n    ValueNode,\n    ValuesNode,\n    WhenNode,\n    WhereNode,\n    WithNode,\n    type OperationNode,\n    type PrimaryKeyConstraintNode,\n} from 'kysely';\n\nexport class DefaultOperationNodeVisitor extends OperationNodeVisitor {\n    protected defaultVisit(node: OperationNode) {\n        Object.values(node).forEach((value) => {\n            if (!value) {\n                return;\n            }\n            if (Array.isArray(value)) {\n                value.forEach((el) => this.defaultVisit(el));\n            }\n            if (typeof value === 'object' && 'kind' in value && typeof value.kind === 'string') {\n                this.visitNode(value);\n            }\n        });\n    }\n\n    protected override visitSelectQuery(node: SelectQueryNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitSelection(node: SelectionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitColumn(node: ColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAlias(node: AliasNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitTable(node: TableNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitFrom(node: FromNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitReference(node: ReferenceNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAnd(node: AndNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOr(node: OrNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitValueList(node: ValueListNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitParens(node: ParensNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitJoin(node: JoinNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitRaw(node: RawNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitWhere(node: WhereNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitInsertQuery(node: InsertQueryNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDeleteQuery(node: DeleteQueryNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitReturning(node: ReturningNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCreateTable(node: CreateTableNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAddColumn(node: AddColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitColumnDefinition(node: ColumnDefinitionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropTable(node: DropTableNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOrderBy(node: OrderByNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOrderByItem(node: OrderByItemNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitGroupBy(node: GroupByNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitGroupByItem(node: GroupByItemNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitUpdateQuery(node: UpdateQueryNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitColumnUpdate(node: ColumnUpdateNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitLimit(node: LimitNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOffset(node: OffsetNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOnConflict(node: OnConflictNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOnDuplicateKey(node: OnDuplicateKeyNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCheckConstraint(node: CheckConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDataType(node: DataTypeNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitSelectAll(node: SelectAllNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitIdentifier(node: IdentifierNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitSchemableIdentifier(node: SchemableIdentifierNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitValue(node: ValueNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitPrimitiveValueList(node: PrimitiveValueListNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOperator(node: OperatorNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCreateIndex(node: CreateIndexNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropIndex(node: DropIndexNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitList(node: ListNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitPrimaryKeyConstraint(node: PrimaryKeyConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitUniqueConstraint(node: UniqueConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitReferences(node: ReferencesNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitWith(node: WithNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCommonTableExpression(node: CommonTableExpressionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitHaving(node: HavingNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCreateSchema(node: CreateSchemaNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropSchema(node: DropSchemaNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAlterTable(node: AlterTableNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropColumn(node: DropColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitRenameColumn(node: RenameColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAlterColumn(node: AlterColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitModifyColumn(node: ModifyColumnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAddConstraint(node: AddConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropConstraint(node: DropConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCreateView(node: CreateViewNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropView(node: DropViewNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitGenerated(node: GeneratedNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDefaultValue(node: DefaultValueNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOn(node: OnNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitValues(node: ValuesNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitSelectModifier(node: SelectModifierNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCreateType(node: CreateTypeNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDropType(node: DropTypeNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitExplain(node: ExplainNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitDefaultInsertValue(node: DefaultInsertValueNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAggregateFunction(node: AggregateFunctionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOver(node: OverNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitPartitionBy(node: PartitionByNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitPartitionByItem(node: PartitionByItemNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitSetOperation(node: SetOperationNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitBinaryOperation(node: BinaryOperationNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitUnaryOperation(node: UnaryOperationNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitUsing(node: UsingNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitFunction(node: FunctionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCase(node: CaseNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitWhen(node: WhenNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitJSONReference(node: JSONReferenceNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitJSONPath(node: JSONPathNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitJSONPathLeg(node: JSONPathLegNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitJSONOperatorChain(node: JSONOperatorChainNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitTuple(node: TupleNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitMergeQuery(node: MergeQueryNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitMatched(node: MatchedNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAddIndex(node: AddIndexNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCast(node: CastNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitFetch(node: FetchNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitTop(node: TopNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOutput(node: OutputNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitRenameConstraint(node: RenameConstraintNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitRefreshMaterializedView(node: RefreshMaterializedViewNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitOrAction(node: OrActionNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitCollate(node: CollateNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAlterType(node: AlterTypeNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitAddValue(node: AddValueNode): void {\n        this.defaultVisit(node);\n    }\n    protected override visitRenameValue(node: RenameValueNode): void {\n        this.defaultVisit(node);\n    }\n}\n\nexport type AnyKysely = Kysely<any>;\n","import { match } from 'ts-pattern';\nimport type {\n    ArrayExpression,\n    BinaryExpression,\n    BindingExpression,\n    CallExpression,\n    Expression,\n    FieldExpression,\n    LiteralExpression,\n    MemberExpression,\n    NullExpression,\n    ThisExpression,\n    UnaryExpression,\n} from '@zenstackhq/schema';\n\nexport type VisitResult = void | { abort: true };\n\nexport class ExpressionVisitor {\n    visit(expr: Expression): VisitResult {\n        return match(expr)\n            .with({ kind: 'literal' }, (e) => this.visitLiteral(e))\n            .with({ kind: 'array' }, (e) => this.visitArray(e))\n            .with({ kind: 'field' }, (e) => this.visitField(e))\n            .with({ kind: 'member' }, (e) => this.visitMember(e))\n            .with({ kind: 'binary' }, (e) => this.visitBinary(e))\n            .with({ kind: 'unary' }, (e) => this.visitUnary(e))\n            .with({ kind: 'call' }, (e) => this.visitCall(e))\n            .with({ kind: 'binding' }, (e) => this.visitBinding(e))\n            .with({ kind: 'this' }, (e) => this.visitThis(e))\n            .with({ kind: 'null' }, (e) => this.visitNull(e))\n            .exhaustive();\n    }\n\n    protected visitLiteral(_e: LiteralExpression): VisitResult {}\n\n    protected visitArray(e: ArrayExpression): VisitResult {\n        for (const item of e.items) {\n            const result = this.visit(item);\n            if (result?.abort) {\n                return result;\n            }\n        }\n    }\n\n    protected visitField(_e: FieldExpression): VisitResult {}\n\n    protected visitMember(e: MemberExpression): VisitResult {\n        return this.visit(e.receiver);\n    }\n\n    protected visitBinary(e: BinaryExpression): VisitResult {\n        const l = this.visit(e.left);\n        if (l?.abort) {\n            return l;\n        } else {\n            return this.visit(e.right);\n        }\n    }\n\n    protected visitUnary(e: UnaryExpression): VisitResult {\n        return this.visit(e.operand);\n    }\n\n    protected visitCall(e: CallExpression): VisitResult {\n        for (const arg of e.args ?? []) {\n            const r = this.visit(arg);\n            if (r?.abort) {\n                return r;\n            }\n        }\n    }\n\n    protected visitBinding(_e: BindingExpression): VisitResult {}\n\n    protected visitThis(_e: ThisExpression): VisitResult {}\n\n    protected visitNull(_e: NullExpression): VisitResult {}\n}\n\nexport class MatchingExpressionVisitor extends ExpressionVisitor {\n    private found = false;\n\n    constructor(private predicate: (expr: Expression) => boolean) {\n        super();\n    }\n\n    find(expr: Expression) {\n        this.found = false;\n        this.visit(expr);\n        return this.found;\n    }\n\n    override visit(expr: Expression) {\n        if (this.predicate(expr)) {\n            this.found = true;\n            return { abort: true } as const;\n        } else {\n            return super.visit(expr);\n        }\n    }\n}\n"],"mappings":"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"}