@zenstackhq/orm 3.1.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +236 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +238 -27
- package/dist/index.d.ts +238 -27
- package/dist/index.js +235 -45
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/client-impl.ts","../src/client/crud/operations/aggregate.ts","../src/client/query-utils.ts","../src/schema.ts","../src/utils/object-utils.ts","../src/client/executor/error-processor.ts","../src/client/errors.ts","../src/client/crud/operations/base.ts","../src/client/constants.ts","../src/client/contract.ts","../src/client/crud/dialects/index.ts","../src/client/crud/dialects/postgresql.ts","../src/common-types.ts","../src/client/crud/dialects/base-dialect.ts","../src/client/crud/dialects/sqlite.ts","../src/client/crud/operations/count.ts","../src/client/crud/operations/create.ts","../src/client/crud/operations/delete.ts","../src/client/crud/operations/find.ts","../src/client/crud/operations/group-by.ts","../src/client/crud/operations/update.ts","../src/client/crud/validator/index.ts","../src/utils/zod-utils.ts","../src/client/crud/validator/utils.ts","../src/client/executor/zenstack-driver.ts","../src/client/executor/zenstack-query-executor.ts","../src/client/executor/name-mapper.ts","../src/client/functions.ts","../src/client/helpers/schema-db-pusher.ts","../src/client/promise.ts","../src/client/result-processor.ts","../src/client/plugin.ts","../src/utils/kysely-utils.ts","../src/utils/schema-utils.ts"],"sourcesContent":["import { invariant } from '@zenstackhq/common-helpers';\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 type { ProcedureDef, SchemaDef } from '../schema';\nimport type { AnyKysely } from '../utils/kysely-utils';\nimport type { UnwrapTuplePromises } from '../utils/type-utils';\nimport type {\n AuthType,\n ClientConstructor,\n ClientContract,\n ModelOperations,\n TransactionIsolationLevel,\n} from './contract';\nimport { AggregateOperationHandler } from './crud/operations/aggregate';\nimport type { AllCrudOperation, CoreCrudOperation } 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 { FindOperationHandler } from './crud/operations/find';\nimport { GroupByOperationHandler } from './crud/operations/group-by';\nimport { UpdateOperationHandler } from './crud/operations/update';\nimport { InputValidator } from './crud/validator';\nimport { createConfigError, createNotFoundError } 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 { RuntimePlugin } from './plugin';\nimport { createZenStackPromise, type ZenStackPromise } from './promise';\nimport { ResultProcessor } from './result-processor';\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\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 // 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 } 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 this.kysely = new Kysely(this.kyselyProps);\n\n return createClientProxy(this);\n }\n\n get $qb() {\n return this.kysely;\n }\n\n get $qbRaw() {\n return this.kyselyRaw;\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<SchemaDef, 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 async sequentialTransaction(\n arg: ZenStackPromise<SchemaDef, 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 result.push(await promise.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 $procedures() {\n return Object.keys(this.$schema.procedures ?? {}).reduce((acc, name) => {\n acc[name] = (...args: unknown[]) => this.handleProc(name, args);\n return acc;\n }, {} as any);\n }\n\n private async handleProc(name: string, args: 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 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 new Error(`Procedure \"${name}\" does not have a handler configured.`);\n }\n\n return (procOptions[name] as Function).apply(this, [this, ...args]);\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: RuntimePlugin<SchemaDef>) {\n // tsc perf\n const newPlugins: RuntimePlugin<SchemaDef>[] = [...(this.$options.plugins ?? []), plugin];\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl(this.schema, newOptions, this);\n }\n\n $unuse(pluginId: string) {\n // tsc perf\n const newPlugins: RuntimePlugin<SchemaDef>[] = [];\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 return new ClientImpl(this.schema, newOptions, this);\n }\n\n $unuseAll() {\n // tsc perf\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n plugins: [] as RuntimePlugin<SchemaDef>[],\n };\n return new ClientImpl(this.schema, newOptions, this);\n }\n\n $setAuth(auth: AuthType<SchemaDef> | undefined) {\n if (auth !== undefined && typeof auth !== 'object') {\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 return new ClientImpl(this.schema, options as ClientOptions<SchemaDef>, this) as unknown as ClientContract<\n SchemaDef,\n Options\n >;\n }\n\n $setInputValidation(enable: boolean) {\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n validateInput: enable,\n };\n return new ClientImpl(this.schema, newOptions, this);\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 inputValidator = new InputValidator(client as any);\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 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 return createModelCrudHandler(client as any, model, inputValidator, resultProcessor);\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as unknown as ClientImpl;\n}\n\nfunction createModelCrudHandler(\n client: ClientContract<any>,\n model: string,\n inputValidator: InputValidator<any>,\n resultProcessor: ResultProcessor<any>,\n): ModelOperations<any, any> {\n const createPromise = (\n operation: CoreCrudOperation,\n nominalOperation: AllCrudOperation,\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 const _handler = txClient ? handler.withClient(txClient) : handler;\n const r = await _handler.handle(operation, _args);\n if (!r && throwIfNoResult) {\n throw createNotFoundError(model);\n }\n let result: unknown;\n if (r && postProcess) {\n result = resultProcessor.processResult(r, model, args);\n } else {\n result = r ?? null;\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 onQuery({\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 }) as Promise<unknown>;\n }\n }\n\n return proceed(args);\n });\n };\n\n // type parameters to operation handlers are explicitly specified to improve tsc performance\n return {\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 );\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 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 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 } as ModelOperations<any, any>;\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\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(subQuery, this.model, this.model, parsedArgs.orderBy, negateOrderBy);\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) => eb.cast(eb.fn.countAll(), 'integer').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 eb.cast(eb.fn.countAll(), 'integer').as(`_count._all`),\n );\n } else {\n query = query.select((eb) =>\n eb\n .cast(eb.fn.count(eb.ref(`$sub.${field}` as any)), 'integer')\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 any)).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 { invariant } from '@zenstackhq/common-helpers';\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 { ExpressionUtils, type FieldDef, type GetModels, type ModelDef, type SchemaDef } from '../schema';\nimport { extractFields } from '../utils/object-utils';\nimport type { AGGREGATE_OPERATORS } from './constants';\nimport type { OrderBy } from './crud-types';\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\nexport function getModel(schema: SchemaDef, model: string) {\n return Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());\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\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 extends SchemaDef>(schema: SchemaDef, model: string) {\n const idFields = requireIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(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 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: AGGREGATE_OPERATORS) {\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","export * from '@zenstackhq/schema';\nexport type { OperandExpression } from 'kysely';\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 * 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 { createId as cuid2 } from '@paralleldrive/cuid2';\nimport { clone, enumerate, invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport { default as cuid1 } from 'cuid';\nimport {\n createQueryId,\n DeleteResult,\n expressionBuilder,\n sql,\n UpdateResult,\n type Compilable,\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 { BuiltinType, Expression, FieldDef } from '../../../schema';\nimport { ExpressionUtils, type GetModels, type ModelDef, type SchemaDef } from '../../../schema';\nimport type { AnyKysely } from '../../../utils/kysely-utils';\nimport { extractFields, fieldsToSelectObject } 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 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\nexport type CoreCrudOperation =\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\nexport type AllCrudOperation = CoreCrudOperation | 'findUniqueOrThrow' | 'findFirstOrThrow';\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: CoreCrudOperation, 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.constructor.name === 'PolicyPlugin');\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 read(\n kysely: AnyKysely,\n model: string,\n args: FindArgs<Schema, GetModels<Schema>, 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, compiled.sql, compiled.parameters);\n }\n\n return result;\n }\n\n protected async readUnique(kysely: AnyKysely, model: string, args: FindArgs<Schema, GetModels<Schema>, 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.transformPrimitive(\n value.set,\n fieldDef.type as BuiltinType,\n true,\n );\n } else {\n createFields[field] = this.dialect.transformPrimitive(\n value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\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 const query = kysely\n .insertInto(model)\n .$if(Object.keys(updatedData).length === 0, (qb) => qb.defaultValues())\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 const createdEntity = await this.executeQueryTakeFirst(kysely, query, 'create');\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 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] = 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 rightEntity: any,\n joinTable: string,\n ): Promise<Action extends 'connect' ? UpdateResult | undefined : DeleteResult | undefined> {\n const sortedRecords = [\n {\n model: leftModel,\n field: leftField,\n entity: leftEntity,\n },\n {\n model: rightModel,\n field: rightField,\n entity: rightEntity,\n },\n ].sort((a, b) =>\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 a.model !== b.model ? a.model.localeCompare(b.model) : a.field.localeCompare(b.field),\n );\n\n const firstIds = requireIdFields(this.schema, sortedRecords[0]!.model);\n const secondIds = requireIdFields(this.schema, sortedRecords[1]!.model);\n invariant(firstIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(secondIds.length === 1, 'many-to-many relation must have exactly one id field');\n\n // Prisma's convention for many-to-many: fk fields are named \"A\" and \"B\"\n if (action === 'connect') {\n const result = await kysely\n .insertInto(joinTable as any)\n .values({\n A: sortedRecords[0]!.entity[firstIds[0]!],\n B: sortedRecords[1]!.entity[secondIds[0]!],\n } as any)\n .onConflict((oc) => oc.columns(['A', 'B'] as any).doNothing())\n .execute();\n return result[0] as any;\n } else {\n const eb = expressionBuilder<any, any>();\n const result = await kysely\n .deleteFrom(joinTable as any)\n .where(eb(`${joinTable}.A`, '=', sortedRecords[0]!.entity[firstIds[0]!]))\n .where(eb(`${joinTable}.B`, '=', sortedRecords[1]!.entity[secondIds[0]!]))\n .execute();\n return result[0] as any;\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 let 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 = 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.transformPrimitive(value, fieldDef.type as BuiltinType, !!fieldDef.array);\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.supportInsertWithDefault) {\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.transformPrimitive(\n fieldDef.default,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\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) => qb.onConflict((oc) => oc.doNothing()))\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 const result = await query.returning(fieldsToReturn as any).execute();\n return result as Result;\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] = forModel;\n thisCreateRows.push(thisCreateFields);\n remainingFieldRows.push(remainingFields);\n }\n\n // create base model entity\n const baseEntities = await this.createMany(\n kysely,\n model as GetModels<Schema>,\n { data: thisCreateRows, skipDuplicates },\n true,\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.transformPrimitive(\n generated,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n );\n }\n } else if (fieldDef?.updatedAt) {\n // TODO: should this work at kysely level instead?\n values[field] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\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.transformPrimitive(\n value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n );\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 .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 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: any = {};\n let m2m: ReturnType<typeof getManyToManyRelation> = undefined;\n\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 as GetModels<Schema>, {\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\n let combinedWhere: WhereInput<Schema, GetModels<Schema>, false> = where ?? {};\n if (Object.keys(parentWhere).length > 0) {\n combinedWhere = Object.keys(combinedWhere).length > 0 ? { AND: [parentWhere, combinedWhere] } : parentWhere;\n }\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) {\n if (finalData === data) {\n finalData = clone(data);\n }\n finalData[fieldName] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\n autoUpdatedFields.push(fieldName);\n }\n }\n\n // read pre-update entity with ids so that the caller can use it to identify\n // the entity being updated, the read data is used as return value if no update\n // is made to the entity\n const thisEntity = await this.getEntityIds(kysely, model, combinedWhere);\n if (!thisEntity) {\n if (throwIfNotFound) {\n throw createNotFoundError(model);\n } else {\n return null;\n }\n }\n\n if (Object.keys(finalData).length === 0) {\n return thisEntity;\n }\n\n let needIdRead = false;\n if (modelDef.baseModel && !this.isIdFilter(model, combinedWhere)) {\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 is not ready an id filter, and and use it as the\n // update filter instead\n needIdRead = true;\n }\n\n if (needIdRead) {\n const readResult = await this.readUnique(kysely, model, {\n where: combinedWhere,\n select: this.makeIdSelect(model),\n });\n if (!readResult && throwIfNotFound) {\n throw createNotFoundError(model);\n }\n combinedWhere = readResult;\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 // only fields not consumed by base update will be used for this model\n finalData = baseUpdateResult.remainingFields;\n // base update may change entity ids, update the filter\n combinedWhere = baseUpdateResult.baseEntity;\n\n // update this entity with fields in updated base\n if (baseUpdateResult.baseEntity) {\n for (const [key, value] of Object.entries(baseUpdateResult.baseEntity)) {\n if (key in thisEntity) {\n thisEntity[key] = value;\n }\n }\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 const parentUpdates = await this.processRelationUpdates(\n kysely,\n model,\n field,\n fieldDef,\n thisEntity,\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 thisEntity;\n } else {\n fieldsToReturn = fieldsToReturn ?? requireIdFields(this.schema, model);\n const query = kysely\n .updateTable(model)\n .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n .set(updateFields)\n .returning(fieldsToReturn as any)\n .modifyEnd(\n this.makeContextComment({\n model,\n operation: 'update',\n }),\n );\n\n const updatedEntity = await this.executeQueryTakeFirst(kysely, query, 'update');\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 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.transformPrimitive(data[field], fieldDef.type as BuiltinType, !!fieldDef.array);\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 isIdFilter(model: string, filter: any) {\n if (!filter || typeof filter !== 'object') {\n return false;\n }\n const idFields = requireIdFields(this.schema, model);\n return idFields.length === Object.keys(filter).length && idFields.every((field) => field in filter);\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 );\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.transformPrimitive(payload[key!], fieldDef.type as BuiltinType, false);\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.transformPrimitive(payload[key!], fieldDef.type as BuiltinType, true);\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 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 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 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 resultFromBaseModel: any = undefined;\n if (modelDef.baseModel) {\n const baseResult = await this.processBaseModelUpdateMany(\n kysely,\n modelDef.baseModel,\n where,\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 query = kysely.updateTable(model).set(updateFields);\n\n if (!shouldFallbackToIdFilter) {\n // simple filter\n query = query\n .where(() => this.dialect.buildFilter(model, model, where))\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 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 ),\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 const finalQuery = query.returning(fieldsToReturn as any);\n const result = await this.executeQuery(kysely, finalQuery, 'update');\n return result.rows as Result;\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 };\n await this.update(kysely, fieldModel, item.where, item.data, fromRelationContext, false, false);\n }\n break;\n }\n\n case 'delete': {\n await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, true);\n break;\n }\n\n case 'deleteMany': {\n await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, 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\n const results: (unknown | undefined)[] = [];\n for (const d of _data) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n throw createNotFoundError(model);\n }\n const r = await this.handleManyToManyRelation(\n kysely,\n 'connect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel!,\n m2m.otherField!,\n ids,\n m2m.joinTable,\n );\n results.push(r);\n }\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw createNotFoundError(model);\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) =>\n eb.and(keyPairs.map(({ fk, pk }) => eb(eb.ref(fk as any), '=', fromRelation.ids[pk]))),\n )\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 {\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\n for (const d of disconnectConditions) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n // not found\n return;\n }\n await this.handleManyToManyRelation(\n kysely,\n 'disconnect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel,\n m2m.otherField,\n ids,\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 // connect new entities\n const results: (unknown | undefined)[] = [];\n for (const d of _data) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n throw createNotFoundError(model);\n }\n results.push(\n await this.handleManyToManyRelation(\n kysely,\n 'connect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel,\n m2m.otherField,\n ids,\n m2m.joinTable,\n ),\n );\n }\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw createNotFoundError(model);\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 throwForNotFound: boolean,\n ) {\n let deleteConditions: any[] = [];\n let expectedDeleteCount: number;\n if (typeof data === 'boolean') {\n if (data === false) {\n return;\n } else {\n deleteConditions = [true];\n expectedDeleteCount = 1;\n }\n } else {\n deleteConditions = this.normalizeRelationManipulationInput(model, data);\n if (deleteConditions.length === 0) {\n return;\n }\n expectedDeleteCount = deleteConditions.length;\n }\n\n let deleteResult: QueryResult<unknown>;\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 > deleteResult.rows.length) {\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 let query = kysely.deleteFrom(model).returning(fieldsToReturn as any);\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 if (!needIdFilter) {\n query = query.where(() => this.dialect.buildFilter(model, model, where));\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 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 ),\n );\n }\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 await this.processDelegateRelationDelete(kysely, modelDef, where, limit);\n\n query = query.modifyEnd(this.makeContextComment({ model, operation: 'delete' }));\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 // 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 /**\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 if (this.hasPolicyEnabled) {\n // TODO: refactor this check\n // policy enforcement always requires read back\n return { needReadBack: true, selectedFields: undefined };\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: undefined };\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: undefined };\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: undefined };\n } else {\n return { needReadBack: false, selectedFields: allFieldsSelected };\n }\n }\n}\n","/**\n * The comment prefix for annotation generated Kysely queries with context information.\n */\nexport 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 AGGREGATE_OPERATORS = ['_count', '_sum', '_avg', '_min', '_max'] as const;\nexport type AGGREGATE_OPERATORS = (typeof AGGREGATE_OPERATORS)[number];\n","import type Decimal from 'decimal.js';\nimport {\n type FieldIsArray,\n type GetModels,\n type GetTypeDefs,\n type IsDelegateModel,\n type ProcedureDef,\n type RelationFields,\n type RelationFieldType,\n type SchemaDef,\n} from '../schema';\nimport type { AnyKysely } from '../utils/kysely-utils';\nimport type { OrUndefinedIf, Simplify, UnwrapTuplePromises } from '../utils/type-utils';\nimport type { TRANSACTION_UNSUPPORTED_METHODS } from './constants';\nimport type {\n AggregateArgs,\n AggregateResult,\n BatchResult,\n CountArgs,\n CountResult,\n CreateArgs,\n CreateManyAndReturnArgs,\n CreateManyArgs,\n DefaultModelResult,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n GroupByArgs,\n GroupByResult,\n ModelResult,\n SelectSubset,\n SimplifiedPlainResult,\n Subset,\n TypeDefResult,\n UpdateArgs,\n UpdateManyAndReturnArgs,\n UpdateManyArgs,\n UpsertArgs,\n} from './crud-types';\nimport type { ClientOptions, QueryOptions, ToQueryOptions } from './options';\nimport type { RuntimePlugin } from './plugin';\nimport type { ZenStackPromise } from './promise';\nimport type { ToKysely } from './query-builder';\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 * ZenStack client interface.\n */\nexport type ClientContract<Schema extends SchemaDef, Options extends ClientOptions<Schema> = ClientOptions<Schema>> = {\n /**\n * The schema definition.\n */\n readonly $schema: Schema;\n\n /**\n * The client options.\n */\n readonly $options: Options;\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<Schema, 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<Schema, 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<Schema, 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<Schema, T>;\n\n /**\n * The current user identity.\n */\n get $auth(): AuthType<Schema> | undefined;\n\n /**\n * Sets the current user identity.\n */\n $setAuth(auth: AuthType<Schema> | undefined): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with new options applied.\n * @example\n * ```\n * const dbNoValidation = db.$setOptions({ ...db.$options, validateInput: false });\n * ```\n */\n $setOptions<Options extends ClientOptions<Schema>>(options: Options): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client enabling/disabling input validations expressed with attributes like\n * `@email`, `@regex`, `@@validate`, etc.\n *\n * @deprecated Use `$setOptions` instead.\n */\n $setInputValidation(enable: boolean): ClientContract<Schema, Options>;\n\n /**\n * The Kysely query builder instance.\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 $transaction<T>(\n callback: (tx: Omit<ClientContract<Schema, Options>, TransactionUnsupportedMethods>) => Promise<T>,\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<T>;\n\n /**\n * Starts a sequential transaction.\n */\n $transaction<P extends ZenStackPromise<Schema, any>[]>(\n arg: [...P],\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<UnwrapTuplePromises<P>>;\n\n /**\n * Returns a new client with the specified plugin installed.\n */\n $use(plugin: RuntimePlugin<Schema>): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with the specified plugin removed.\n */\n $unuse(pluginId: string): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with all plugins removed.\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 * Pushes the schema to the database. For testing purposes only.\n * @private\n */\n $pushSchema(): Promise<void>;\n} & {\n [Key in GetModels<Schema> as Uncapitalize<Key>]: ModelOperations<Schema, Key, ToQueryOptions<Options>>;\n} & Procedures<Schema>;\n\n/**\n * The contract for a client in a transaction.\n */\nexport type TransactionClientContract<Schema extends SchemaDef, Options extends ClientOptions<Schema>> = Omit<\n ClientContract<Schema, Options>,\n TransactionUnsupportedMethods\n>;\n\ntype _TypeMap = {\n String: string;\n Int: number;\n Float: number;\n BigInt: bigint;\n Decimal: Decimal;\n Boolean: boolean;\n DateTime: Date;\n};\n\ntype MapType<Schema extends SchemaDef, T extends string> = T extends keyof _TypeMap\n ? _TypeMap[T]\n : T extends GetModels<Schema>\n ? ModelResult<Schema, T>\n : unknown;\n\nexport type Procedures<Schema extends SchemaDef> =\n Schema['procedures'] extends Record<string, ProcedureDef>\n ? {\n $procedures: {\n [Key in keyof Schema['procedures']]: ProcedureFunc<Schema, Schema['procedures'][Key]>;\n };\n }\n : {};\n\nexport type ProcedureFunc<Schema extends SchemaDef, Proc extends ProcedureDef> = (\n ...args: MapProcedureParams<Schema, Proc['params']>\n) => Promise<MapType<Schema, Proc['returnType']>>;\n\ntype MapProcedureParams<Schema extends SchemaDef, Params> = {\n [P in keyof Params]: Params[P] extends { type: infer U }\n ? OrUndefinedIf<MapType<Schema, U & string>, Params[P] extends { optional: true } ? true : false>\n : never;\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\nexport type AllModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n Options extends QueryOptions<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 FindManyArgs<Schema, Model>>(\n args?: SelectSubset<T, FindManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options> | null>;\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 FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 FindFirstArgs<Schema, Model>>(\n args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options> | null>;\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 FindFirstArgs<Schema, Model>>(\n args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 CreateArgs<Schema, Model>>(\n args: SelectSubset<T, CreateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 CreateManyArgs<Schema, Model>>(\n args?: SelectSubset<T, CreateManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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<T extends CreateManyAndReturnArgs<Schema, Model>>(\n args?: SelectSubset<T, CreateManyAndReturnArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 UpdateArgs<Schema, Model>>(\n args: SelectSubset<T, UpdateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 UpdateManyArgs<Schema, Model>>(\n args: Subset<T, UpdateManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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<T extends UpdateManyAndReturnArgs<Schema, Model>>(\n args: Subset<T, UpdateManyAndReturnArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 UpsertArgs<Schema, Model>>(\n args: SelectSubset<T, UpsertArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 DeleteArgs<Schema, Model>>(\n args: SelectSubset<T, DeleteArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 DeleteManyArgs<Schema, Model>>(\n args?: Subset<T, DeleteManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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 CountArgs<Schema, Model>>(\n args?: Subset<T, CountArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<CountResult<Schema, Model, T>>>;\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 AggregateArgs<Schema, Model>>(\n args: Subset<T, AggregateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<AggregateResult<Schema, Model, T>>>;\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 GroupByArgs<Schema, Model>>(\n args: Subset<T, GroupByArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<GroupByResult<Schema, Model, T>>>;\n};\n\nexport type OperationsIneligibleForDelegateModels = 'create' | 'createMany' | 'createManyAndReturn' | 'upsert';\n\nexport type ModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n Options extends QueryOptions<Schema> = QueryOptions<Schema>,\n> = Omit<\n AllModelOperations<Schema, Model, Options>,\n // exclude operations not applicable to delegate models\n IsDelegateModel<Schema, Model> extends true ? OperationsIneligibleForDelegateModels : never\n>;\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 { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base-dialect';\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 .exhaustive();\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n type SqlBool,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport z from 'zod';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport { createInternalError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getManyToManyRelation,\n isRelationField,\n isTypeDef,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n private isoDateSchema = z.iso.datetime({ local: true, offset: true });\n\n constructor(schema: Schema, options: ClientOptions<Schema>) {\n super(schema, options);\n }\n\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(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 // 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 // `Json[]` fields need their input as array (not stringified)\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .with('Json', () => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n // postgres requires simple JSON values to be stringified\n return JSON.stringify(value);\n } else {\n return value;\n }\n })\n .otherwise(() => value);\n }\n }\n\n override transformOutput(value: unknown, type: BuiltinType) {\n if (value === null || value === undefined) {\n return value;\n }\n return match(type)\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Decimal', () => this.transformDecimal(value))\n .otherwise(() => super.transformOutput(value, type));\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 // PostgreSQL's jsonb_build_object serializes timestamp as ISO 8601 strings\n // without timezone, (e.g., \"2023-01-01T12:00:00.123456\"). Since Date is always\n // stored as UTC `timestamp` type, we add 'Z' to explicitly mark them as UTC for\n // correct Date object creation.\n if (this.isoDateSchema.safeParse(value).success) {\n const hasOffset = value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value);\n return new Date(hasOffset ? value : `${value}Z`);\n } else {\n return value;\n }\n } else if (value instanceof Date && this.options.fixPostgresTimezone !== false) {\n // SPECIAL NOTES:\n // node-pg has a terrible quirk that it returns the date value in local timezone\n // as a `Date` object although for `DateTime` field the data in DB is stored in UTC\n // see: https://github.com/brianc/node-postgres/issues/429\n return new Date(value.getTime() - value.getTimezoneOffset() * 60 * 1000);\n } else {\n return value;\n }\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 override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const relationResultName = `${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>, 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 = `${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 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>, 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 return eb.fn\n .coalesce(sql`jsonb_agg(jsonb_build_object(${sql.join(objArgs)}))`, sql`'[]'::jsonb`)\n .as('$data');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$data');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationModelAlias: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentResultName: string,\n ) {\n const relationModelDef = requireModel(this.schema, relationModel);\n const objArgs: Array<\n string | ExpressionWrapper<any, any, any> | SelectQueryBuilder<any, any, any> | RawBuilder<any>\n > = [];\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, relationModelAlias, 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 as GetModels<Schema>,\n eb,\n relationModelAlias,\n value,\n );\n return [sql.lit(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 [sql.lit(field), fieldValue];\n }\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field]) => [\n sql.lit(field),\n // reference the synthesized JSON field\n eb.ref(`${parentResultName}$${field}.$data`),\n ])\n .flatMap((v) => v),\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>, true>,\n parentResultName: string,\n ) {\n let result = query;\n if (typeof payload === 'object') {\n const selectInclude = payload.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 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 return this.eb.fn(\n 'jsonb_build_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n );\n }\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 buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number> {\n return this.eb.fn('array_length', [array]);\n }\n\n override buildArrayLiteralSQL(values: unknown[]): string {\n if (values.length === 0) {\n return '{}';\n } else {\n return `ARRAY[${values.map((v) => (typeof v === 'string' ? `'${v}'` : v))}]`;\n }\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 return match(operation)\n .with('array_contains', () => {\n const v = Array.isArray(value) ? value : [value];\n return sql<SqlBool>`${lhs} @> ${sql.val(JSON.stringify(v))}::jsonb`;\n })\n .with('array_starts_with', () =>\n this.eb(\n this.eb.fn('jsonb_extract_path', [lhs, this.eb.val('0')]),\n '=',\n this.transformPrimitive(value, 'Json', false),\n ),\n )\n .with('array_ends_with', () =>\n this.eb(\n this.eb.fn('jsonb_extract_path', [lhs, sql`(jsonb_array_length(${lhs}) - 1)::text`]),\n '=',\n this.transformPrimitive(value, 'Json', false),\n ),\n )\n .exhaustive();\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('$t'))\n .where(buildFilter(this.eb.ref('$items.value'))),\n );\n }\n\n override get supportInsertWithDefault() {\n return true;\n }\n\n override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw createInternalError('Cannot get SQL type of a relation field');\n }\n\n let result: string;\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are treated as text\n result = 'text';\n } else {\n result = match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'bigint')\n .with('Float', () => 'double precision')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'timestamp')\n .with('Bytes', () => 'bytea')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text');\n }\n\n if (fieldDef.array) {\n result += '[]';\n }\n\n return result;\n }\n\n override getStringCasingBehavior() {\n // Postgres `LIKE` is case-sensitive, `ILIKE` is case-insensitive\n return { supportsILike: true, likeCaseSensitive: true };\n }\n}\n","export type JsonValue = string | number | boolean | JsonObject | JsonArray;\nexport type JsonObject = { [key: string]: JsonValue | null };\nexport type JsonArray = ReadonlyArray<JsonValue | null>;\nexport type JsonNullValues = DbNull | JsonNull | AnyNull;\n\nexport class DbNullClass {\n // @ts-ignore\n private __brand = 'DbNull' as const;\n}\nexport const DbNull = new DbNullClass();\nexport type DbNull = typeof DbNull;\n\nexport class JsonNullClass {\n // @ts-ignore\n private __brand = 'JsonNull' as const;\n}\nexport const JsonNull = new JsonNullClass();\nexport type JsonNull = typeof JsonNull;\n\nexport class AnyNullClass {\n // @ts-ignore\n private __brand = 'AnyNull' as const;\n}\nexport const AnyNull = new AnyNullClass();\nexport type AnyNull = typeof AnyNull;\n","import { enumerate, invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport type { 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 { BuiltinType, DataSourceProviderType, FieldDef, GetModels, ModelDef, SchemaDef } from '../../../schema';\nimport type { OrArray } from '../../../utils/type-utils';\nimport { AGGREGATE_OPERATORS, 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 getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n isTypeDef,\n makeDefaultOrderBy,\n requireField,\n requireIdFields,\n requireModel,\n requireTypeDef,\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 transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean) {\n return value;\n }\n\n transformOutput(value: unknown, _type: BuiltinType) {\n return value;\n }\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>, 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 // orderBy\n result = this.buildOrderBy(result, model, modelAlias, args.orderBy, negateOrderBy);\n\n // distinct\n if ('distinct' in args && (args as any).distinct) {\n const distinct = ensureArray((args as any).distinct) as string[];\n if (this.supportsDistinctOn) {\n result = result.distinctOn(distinct.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 if (args.cursor) {\n result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy, modelAlias);\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: FindArgs<Schema, GetModels<Schema>, true>['cursor'],\n orderBy: FindArgs<Schema, GetModels<Schema>, true>['orderBy'],\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 andFilters.push(\n this.eb(\n this.eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(model, subQueryAlias)\n .select(`${subQueryAlias}.${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 return match(key)\n .with('AND', () =>\n this.and(...enumerate(payload).map((subPayload) => this.buildFilter(model, modelAlias, subPayload))),\n )\n .with('OR', () =>\n this.or(...enumerate(payload).map((subPayload) => this.buildFilter(model, modelAlias, subPayload))),\n )\n .with('NOT', () => this.eb.not(this.buildCompositeFilter(model, modelAlias, 'AND', payload)))\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 = `${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 filterResultField = `${field}$filter`;\n\n const joinSelect = this.eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() =>\n this.and(...joinPairs.map(([left, right]) => this.eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n )\n .select(() => this.eb.fn.count(this.eb.lit(1)).as(filterResultField));\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(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload.is)),\n '>',\n 0,\n ),\n );\n }\n }\n\n if ('isNot' in payload) {\n if (payload.isNot === null) {\n // check if found\n conditions.push(this.eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n // is null\n this.eb(joinSelect, '=', 0),\n // found one that matches the filter\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\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 = `${modelAlias}$${field}$filter`;\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 switch (key) {\n case 'some': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select(() => this.eb.fn.count(this.eb.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() => this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() =>\n this.eb.not(this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select(() => this.eb.fn.count(this.eb.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() => this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n '=',\n 0,\n ),\n );\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 const value = this.transformPrimitive(_value, fieldType, !!fieldDef.array);\n\n switch (key) {\n case 'equals': {\n clauses.push(this.buildLiteralFilter(fieldRef, fieldType, this.eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(this.eb(fieldRef, '@>', this.eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(this.eb(fieldRef, '@>', this.eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(this.eb(fieldRef, '&&', this.eb.val(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 return this.buildJsonFilter(fieldRef, payload, fieldDef);\n }\n\n return match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(fieldRef, payload))\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.eb.cast(jsonReceiver, 'text');\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, '=', 'null');\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.eb.fn('trim', [this.eb.cast(fieldReceiver, 'text'), sql.lit('\"')]);\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([this.eb(lhs, '=', 'null'), this.eb(lhs, 'is not', null)]);\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, '=', 'null')]);\n } else {\n return this.buildLiteralFilter(lhs, 'Json', value);\n }\n }\n\n private buildLiteralFilter(lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return this.eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\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.buildLiteralFilter(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 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('not', () => this.eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (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>) {\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>),\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 // already consumed\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 '\\\\'`;\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.transformPrimitive(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.transformPrimitive(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.transformPrimitive(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.transformPrimitive(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 ) {\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 // aggregations\n if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n invariant(value && typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\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 as AGGREGATE_OPERATORS),\n this.negateSort(v, negated),\n );\n }\n continue;\n }\n\n switch (field) {\n case '_count': {\n invariant(value && typeof value === 'object', 'invalid orderBy value for field \"_count\"');\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn.count(buildFieldRef(model, k, modelAlias)),\n this.negateSort(v, negated),\n );\n }\n continue;\n }\n default:\n break;\n }\n\n const fieldDef = requireField(this.schema, model, field);\n\n if (!fieldDef.relation) {\n const fieldRef = buildFieldRef(model, field, modelAlias);\n if (value === 'asc' || value === 'desc') {\n result = result.orderBy(fieldRef, this.negateSort(value, negated));\n } else if (\n value &&\n typeof value === 'object' &&\n 'nulls' in value &&\n 'sort' in value &&\n (value.sort === 'asc' || value.sort === 'desc') &&\n (value.nulls === 'first' || value.nulls === 'last')\n ) {\n result = result.orderBy(fieldRef, (ob) => {\n const dir = this.negateSort(value.sort, negated);\n ob = dir === 'asc' ? ob.asc() : ob.desc();\n ob = value.nulls === 'first' ? ob.nullsFirst() : ob.nullsLast();\n return ob;\n });\n }\n } else {\n // order by relation\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 result = result.orderBy((eb) => {\n const subQueryAlias = `${modelAlias}$orderBy$${field}$count`;\n let subQuery = this.buildSelectModel(relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n ...joinPairs.map(([left, right]) =>\n eb(this.eb.ref(left), '=', this.eb.ref(right)),\n ),\n ),\n );\n subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n return subQuery;\n }, sort);\n }\n } else {\n // order by to-one relation\n const joinAlias = `${modelAlias}$orderBy$${index}`;\n result = result.leftJoin(`${relationModel} as ${joinAlias}`, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, joinAlias);\n return join.on((eb) =>\n this.and(\n ...joinPairs.map(([left, right]) => eb(this.eb.ref(left), '=', this.eb.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, relationModel, joinAlias, value, negated);\n }\n }\n }\n });\n\n return result;\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 const modelDef = requireModel(this.schema, model);\n let result = query;\n\n for (const field of Object.keys(modelDef.fields)) {\n if (isRelationField(this.schema, model, field)) {\n continue;\n }\n if (this.shouldOmitField(omit, model, field)) {\n continue;\n }\n result = this.buildSelectField(result, model, modelAlias, field);\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((eb) => {\n const jsonObject: Record<string, Expression<any>> = {};\n for (const field of Object.keys(subModel.fields)) {\n if (\n isRelationField(this.schema, subModel.name, field) ||\n isInheritedField(this.schema, subModel.name, field)\n ) {\n continue;\n }\n jsonObject[field] = eb.ref(`${subModel.name}.${field}`);\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 // options-level\n if (\n this.options.omit?.[model] &&\n typeof this.options.omit[model] === 'object' &&\n typeof (this.options.omit[model] as any)[field] === 'boolean'\n ) {\n return (this.options.omit[model] as any)[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>, 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 // 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, fieldModel, value as any, false)\n .innerJoin(m2m.joinTable, (join) =>\n join\n .onRef(`${m2m.joinTable}.${m2m.otherFkName}`, '=', `${fieldModel}.${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, fieldModel, 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, fieldModel);\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 private 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.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(): Expression<SqlBool> {\n return this.eb.lit<SqlBool>(this.transformPrimitive(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 computer = computedFields?.[fieldDef.originModel ?? model]?.[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>, 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 // #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>, 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>>): ExpressionWrapper<any, any, unknown>;\n\n /**\n * Builds an Kysely expression that returns the length of an array.\n */\n abstract buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number>;\n\n /**\n * Builds an array literal SQL string for the given values.\n */\n abstract buildArrayLiteralSQL(values: unknown[]): string;\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 supportInsertWithDefault(): boolean;\n\n /**\n * Gets the SQL column type for the given field definition.\n */\n abstract getFieldSqlType(fieldDef: FieldDef): string;\n\n /*\n * Gets the string casing behavior for the dialect.\n */\n abstract getStringCasingBehavior(): { supportsILike: boolean; likeCaseSensitive: boolean };\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 // #endregion\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n type SqlBool,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport { createInternalError, createNotSupportedError } from '../../errors';\nimport {\n getDelegateDescendantModels,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } 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 override transformPrimitive(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.transformPrimitive(v, type, false));\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .otherwise(() => value);\n }\n }\n\n override transformOutput(value: unknown, type: BuiltinType) {\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 return match(type)\n .with('Boolean', () => this.transformOutputBoolean(value))\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('Decimal', () => this.transformOutputDecimal(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Json', () => this.transformOutputJson(value))\n .otherwise(() => super.transformOutput(value, type));\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 override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, 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>, 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 = `${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 = `${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 `${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 `${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 (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field, value]) => {\n const subJson = this.buildRelationJSON(\n relationModel,\n eb,\n field,\n `${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 return match(operation)\n .with('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 })\n .with('array_starts_with', () =>\n this.eb(this.eb.fn('json_extract', [lhs, this.eb.val('$[0]')]), '=', value),\n )\n .with('array_ends_with', () =>\n this.eb(sql`json_extract(${lhs}, '$[' || (json_array_length(${lhs}) - 1) || ']')`, '=', value),\n )\n .exhaustive();\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('$t'))\n .where(buildFilter(this.eb.ref('$items.value'))),\n );\n }\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 buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number> {\n return this.eb.fn('json_array_length', [array]);\n }\n\n override buildArrayLiteralSQL(_values: unknown[]): string {\n throw new Error('SQLite does not support array literals');\n }\n\n override get supportInsertWithDefault() {\n return false;\n }\n\n override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw createInternalError('Cannot get SQL type of a relation field');\n }\n if (fieldDef.array) {\n throw createInternalError('SQLite does not support scalar list type');\n }\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are stored as text\n return 'text';\n }\n\n return (\n match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'integer')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'integer')\n .with('Float', () => 'real')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'numeric')\n .with('Bytes', () => 'blob')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text')\n );\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","import type { SchemaDef } from '../../../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 ? eb.cast(eb.fn.countAll(), 'integer').as('_all')\n : eb.cast(eb.fn.count(eb.ref(`${subQueryName}.${key}` as any)), 'integer').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) => eb.cast(eb.fn.countAll(), 'integer').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 { match } from 'ts-pattern';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { CreateArgs, CreateManyAndReturnArgs, CreateManyArgs, WhereInput } from '../../crud-types';\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: CreateArgs<Schema, GetModels<Schema>>) {\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 // TODO: avoid using transaction for simple create\n const result = await this.safeTransaction(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 WhereInput<\n Schema,\n GetModels<Schema>,\n false\n >,\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?: CreateManyArgs<Schema, GetModels<Schema>>) {\n if (args === undefined) {\n return { count: 0 };\n }\n return this.createMany(this.kysely, this.model, args, false);\n }\n\n private async runCreateManyAndReturn(args?: CreateManyAndReturnArgs<Schema, GetModels<Schema>>) {\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 // TODO: avoid using transaction for simple create\n return this.safeTransaction(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","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { DeleteArgs, DeleteManyArgs } from '../../crud-types';\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: DeleteArgs<Schema, Extract<keyof Schema['models'], string>>) {\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 // TODO: avoid using transaction for simple delete\n const result = await this.safeTransaction(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.rows.length === 0) {\n throw createNotFoundError(this.model);\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: DeleteManyArgs<Schema, Extract<keyof Schema['models'], string>> | undefined) {\n return await this.safeTransaction(async (tx) => {\n const result = await this.delete(tx, this.model, args?.where, args?.limit);\n return { count: result.rows.length };\n });\n }\n}\n","import type { GetModels, SchemaDef } from '../../../schema';\nimport type { FindArgs } from '../../crud-types';\nimport { BaseOperationHandler, type CoreCrudOperation } from './base';\n\nexport class FindOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n async handle(operation: CoreCrudOperation, 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(this.model, normalizedArgs, {\n unique: operation === 'findUnique',\n findOne,\n })\n : (normalizedArgs as FindArgs<Schema, GetModels<Schema>, true> | undefined);\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 { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\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);\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) => eb.cast(eb.fn.countAll(), 'integer').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 eb.cast(eb.fn.countAll(), 'integer').as(`_count._all`),\n );\n } else {\n query = query.select((eb) =>\n eb.cast(eb.fn.count(fieldRef(field)), 'integer').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 { match } from 'ts-pattern';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { UpdateArgs, UpdateManyAndReturnArgs, UpdateManyArgs, UpsertArgs, WhereInput } from '../../crud-types';\nimport { createRejectedByPolicyError, RejectedByPolicyReason } from '../../errors';\nimport { getIdValues } 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: UpdateArgs<Schema, GetModels<Schema>>) {\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 const result = await this.safeTransaction(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 const readFilter = 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 as WhereInput<Schema, GetModels<Schema>, false>,\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\n private async runUpdateMany(args: UpdateManyArgs<Schema, GetModels<Schema>>) {\n // TODO: avoid using transaction for simple update\n return this.safeTransaction(async (tx) => {\n return this.updateMany(tx, this.model, args.where, args.data, args.limit, false);\n });\n }\n\n private async runUpdateManyAndReturn(args: UpdateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined) {\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 const { readBackResult, updateResult } = await this.safeTransaction(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 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 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: UpsertArgs<Schema, GetModels<Schema>>) {\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 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 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 // 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: undefined };\n }\n\n // upsert payload\n if (args.update && !Object.keys(args.update).some((field: string) => nonRelationFields.includes(field))) {\n return { needReadBack: true, selectedFields: undefined };\n }\n\n return baseResult;\n }\n}\n","import { enumerate, invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport stableStringify from 'json-stable-stringify';\nimport { match, P } from 'ts-pattern';\nimport { z, ZodType } from 'zod';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport {\n type AttributeApplication,\n type BuiltinType,\n type EnumDef,\n type FieldDef,\n type GetModels,\n type ModelDef,\n type SchemaDef,\n} from '../../../schema';\nimport { extractFields } from '../../../utils/object-utils';\nimport { formatError } from '../../../utils/zod-utils';\nimport { AGGREGATE_OPERATORS, LOGICAL_COMBINATORS, NUMERIC_FIELD_TYPES } from '../../constants';\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 FindArgs,\n type GroupByArgs,\n type UpdateArgs,\n type UpdateManyAndReturnArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n} from '../../crud-types';\nimport { createInternalError, createInvalidInputError } from '../../errors';\nimport {\n fieldHasDefaultValue,\n getDiscriminatorField,\n getEnum,\n getTypeDef,\n getUniqueFields,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport {\n addBigIntValidation,\n addCustomValidation,\n addDecimalValidation,\n addListValidation,\n addNumberValidation,\n addStringValidation,\n} from './utils';\n\nconst schemaCache = new WeakMap<SchemaDef, Map<string, ZodType>>();\n\ntype GetSchemaFunc<Schema extends SchemaDef, Options> = (model: GetModels<Schema>, options: Options) => ZodType;\n\nexport class InputValidator<Schema extends SchemaDef> {\n constructor(private readonly client: ClientContract<Schema>) {}\n\n private get schema() {\n return this.client.$schema;\n }\n\n private get options() {\n return this.client.$options;\n }\n\n private get extraValidationsEnabled() {\n return this.client.$options.validateInput !== false;\n }\n\n validateFindArgs(\n model: GetModels<Schema>,\n args: unknown,\n options: { unique: boolean; findOne: boolean },\n ): FindArgs<Schema, GetModels<Schema>, true> | undefined {\n return this.validate<\n FindArgs<Schema, GetModels<Schema>, true> | undefined,\n Parameters<typeof this.makeFindSchema>[1]\n >(model, 'find', options, (model, options) => this.makeFindSchema(model, options), args);\n }\n\n validateCreateArgs(model: GetModels<Schema>, args: unknown): CreateArgs<Schema, GetModels<Schema>> {\n return this.validate<CreateArgs<Schema, GetModels<Schema>>>(\n model,\n 'create',\n undefined,\n (model) => this.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 undefined,\n (model) => this.makeCreateManySchema(model),\n args,\n );\n }\n\n validateCreateManyAndReturnArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): CreateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<CreateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'createManyAndReturn',\n undefined,\n (model) => this.makeCreateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpdateArgs(model: GetModels<Schema>, args: unknown): UpdateArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateArgs<Schema, GetModels<Schema>>>(\n model,\n 'update',\n undefined,\n (model) => this.makeUpdateSchema(model),\n args,\n );\n }\n\n validateUpdateManyArgs(model: GetModels<Schema>, args: unknown): UpdateManyArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateManyArgs<Schema, GetModels<Schema>>>(\n model,\n 'updateMany',\n undefined,\n (model) => this.makeUpdateManySchema(model),\n args,\n );\n }\n\n validateUpdateManyAndReturnArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): UpdateManyAndReturnArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateManyAndReturnArgs<Schema, GetModels<Schema>>>(\n model,\n 'updateManyAndReturn',\n undefined,\n (model) => this.makeUpdateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpsertArgs(model: GetModels<Schema>, args: unknown): UpsertArgs<Schema, GetModels<Schema>> {\n return this.validate<UpsertArgs<Schema, GetModels<Schema>>>(\n model,\n 'upsert',\n undefined,\n (model) => this.makeUpsertSchema(model),\n args,\n );\n }\n\n validateDeleteArgs(model: GetModels<Schema>, args: unknown): DeleteArgs<Schema, GetModels<Schema>> {\n return this.validate<DeleteArgs<Schema, GetModels<Schema>>>(\n model,\n 'delete',\n undefined,\n (model) => this.makeDeleteSchema(model),\n args,\n );\n }\n\n validateDeleteManyArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): DeleteManyArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<DeleteManyArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'deleteMany',\n undefined,\n (model) => this.makeDeleteManySchema(model),\n args,\n );\n }\n\n validateCountArgs(model: GetModels<Schema>, args: unknown): CountArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<CountArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'count',\n undefined,\n (model) => this.makeCountSchema(model),\n args,\n );\n }\n\n validateAggregateArgs(model: GetModels<Schema>, args: unknown): AggregateArgs<Schema, GetModels<Schema>> {\n return this.validate<AggregateArgs<Schema, GetModels<Schema>>>(\n model,\n 'aggregate',\n undefined,\n (model) => this.makeAggregateSchema(model),\n args,\n );\n }\n\n validateGroupByArgs(model: GetModels<Schema>, args: unknown): GroupByArgs<Schema, GetModels<Schema>> {\n return this.validate<GroupByArgs<Schema, GetModels<Schema>>>(\n model,\n 'groupBy',\n undefined,\n (model) => this.makeGroupBySchema(model),\n args,\n );\n }\n\n private getSchemaCache(cacheKey: string) {\n let thisCache = schemaCache.get(this.schema);\n if (!thisCache) {\n thisCache = new Map<string, ZodType>();\n schemaCache.set(this.schema, thisCache);\n }\n return thisCache.get(cacheKey);\n }\n\n private setSchemaCache(cacheKey: string, schema: ZodType) {\n let thisCache = schemaCache.get(this.schema);\n if (!thisCache) {\n thisCache = new Map<string, ZodType>();\n schemaCache.set(this.schema, thisCache);\n }\n return thisCache.set(cacheKey, schema);\n }\n\n private validate<T, Options = undefined>(\n model: GetModels<Schema>,\n operation: string,\n options: Options,\n getSchema: GetSchemaFunc<Schema, Options>,\n args: unknown,\n ) {\n const cacheKey = stableStringify({\n type: 'model',\n model,\n operation,\n options,\n extraValidationsEnabled: this.extraValidationsEnabled,\n });\n let schema = this.getSchemaCache(cacheKey!);\n if (!schema) {\n schema = getSchema(model, options);\n this.setSchemaCache(cacheKey!, schema);\n }\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 // #region Find\n\n private makeFindSchema(model: string, options: { unique: boolean; findOne: boolean }) {\n const fields: Record<string, z.ZodSchema> = {};\n const where = this.makeWhereSchema(model, options.unique);\n if (options.unique) {\n fields['where'] = where;\n } else {\n fields['where'] = where.optional();\n }\n\n fields['select'] = this.makeSelectSchema(model).optional().nullable();\n fields['include'] = this.makeIncludeSchema(model).optional().nullable();\n fields['omit'] = this.makeOmitSchema(model).optional().nullable();\n\n if (!options.unique) {\n fields['skip'] = this.makeSkipSchema().optional();\n if (options.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), true).optional();\n fields['cursor'] = this.makeCursorSchema(model).optional();\n fields['distinct'] = this.makeDistinctSchema(model).optional();\n }\n\n let result: ZodType = z.strictObject(fields);\n result = this.refineForSelectIncludeMutuallyExclusive(result);\n result = this.refineForSelectOmitMutuallyExclusive(result);\n\n if (!options.unique) {\n result = result.optional();\n }\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 ? addStringValidation(z.string(), attributes) : z.string(),\n )\n .with('Int', () =>\n this.extraValidationsEnabled ? addNumberValidation(z.number().int(), attributes) : z.number().int(),\n )\n .with('Float', () =>\n this.extraValidationsEnabled ? addNumberValidation(z.number(), attributes) : z.number(),\n )\n .with('Boolean', () => z.boolean())\n .with('BigInt', () =>\n z.union([\n this.extraValidationsEnabled\n ? addNumberValidation(z.number().int(), attributes)\n : z.number().int(),\n this.extraValidationsEnabled ? addBigIntValidation(z.bigint(), attributes) : z.bigint(),\n ]),\n )\n .with('Decimal', () => {\n return z.union([\n this.extraValidationsEnabled ? addNumberValidation(z.number(), attributes) : z.number(),\n addDecimalValidation(z.instanceof(Decimal), attributes, this.extraValidationsEnabled),\n addDecimalValidation(z.string(), attributes, this.extraValidationsEnabled),\n ]);\n })\n .with('DateTime', () => z.union([z.date(), z.iso.datetime()]))\n .with('Bytes', () => z.instanceof(Uint8Array))\n .with('Json', () => this.makeJsonValueSchema(false, false))\n .otherwise(() => z.unknown());\n }\n }\n\n private makeEnumSchema(type: string) {\n const key = stableStringify({\n type: 'enum',\n name: type,\n });\n let schema = this.getSchemaCache(key!);\n if (schema) {\n return schema;\n }\n const enumDef = getEnum(this.schema, type);\n invariant(enumDef, `Enum \"${type}\" not found in schema`);\n schema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n this.setSchemaCache(key!, schema);\n return schema;\n }\n\n private makeTypeDefSchema(type: string): z.ZodType {\n const key = stableStringify({\n type: 'typedef',\n name: type,\n extraValidationsEnabled: this.extraValidationsEnabled,\n });\n let schema = this.getSchemaCache(key!);\n if (schema) {\n return schema;\n }\n const typeDef = getTypeDef(this.schema, type);\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n schema = z.looseObject(\n Object.fromEntries(\n Object.entries(typeDef.fields).map(([field, def]) => {\n let fieldSchema = 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.setSchemaCache(key!, finalSchema);\n return finalSchema;\n }\n\n private makeWhereSchema(\n model: string,\n unique: boolean,\n withoutRelationFields = false,\n withAggregations = false,\n ): ZodType {\n const modelDef = requireModel(this.schema, model);\n\n const fields: Record<string, any> = {};\n for (const field of Object.keys(modelDef.fields)) {\n const fieldDef = requireField(this.schema, model, field);\n let fieldSchema: ZodType | undefined;\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\n continue;\n }\n fieldSchema = z.lazy(() => this.makeWhereSchema(fieldDef.type, false).optional());\n\n // optional to-one relation allows null\n fieldSchema = this.nullableIf(fieldSchema, !fieldDef.array && !!fieldDef.optional);\n\n if (fieldDef.array) {\n // to-many relation\n fieldSchema = z.union([\n fieldSchema,\n z.strictObject({\n some: fieldSchema.optional(),\n every: fieldSchema.optional(),\n none: fieldSchema.optional(),\n }),\n ]);\n } else {\n // to-one relation\n fieldSchema = z.union([\n fieldSchema,\n z.strictObject({\n is: fieldSchema.optional(),\n isNot: fieldSchema.optional(),\n }),\n ]);\n }\n } else {\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(enumDef, !!fieldDef.optional, withAggregations);\n }\n } else if (fieldDef.array) {\n // array field\n fieldSchema = this.makeArrayFilterSchema(fieldDef.type as BuiltinType);\n } else if (this.isTypeDefType(fieldDef.type)) {\n fieldSchema = this.makeTypedJsonFilterSchema(fieldDef.type, !!fieldDef.optional, !!fieldDef.array);\n } else {\n // primitive field\n fieldSchema = this.makePrimitiveFilterSchema(\n fieldDef.type as BuiltinType,\n !!fieldDef.optional,\n withAggregations,\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 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\n if (Object.keys(enumDef.values).length > 0) {\n fieldSchema = this.makeEnumFilterSchema(enumDef, !!def.optional, false);\n } else {\n fieldSchema = z.never();\n }\n } else {\n // regular field\n fieldSchema = this.makePrimitiveFilterSchema(\n def.type as BuiltinType,\n !!def.optional,\n false,\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)),\n true,\n ).optional();\n fields['OR'] = z\n .lazy(() => this.makeWhereSchema(model, false, withoutRelationFields))\n .array()\n .optional();\n fields['NOT'] = this.orArray(\n z.lazy(() => this.makeWhereSchema(model, false, withoutRelationFields)),\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 return result;\n }\n\n private makeTypedJsonFilterSchema(type: string, optional: boolean, array: boolean) {\n const typeDef = getTypeDef(this.schema, type);\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n\n const candidates: z.ZodType[] = [];\n\n if (!array) {\n // fields filter\n const fieldSchemas: Record<string, z.ZodType> = {};\n for (const [fieldName, fieldDef] of Object.entries(typeDef.fields)) {\n if (this.isTypeDefType(fieldDef.type)) {\n // recursive typed JSON\n fieldSchemas[fieldName] = this.makeTypedJsonFilterSchema(\n fieldDef.type,\n !!fieldDef.optional,\n !!fieldDef.array,\n ).optional();\n } else {\n // array, enum, primitives\n if (fieldDef.array) {\n fieldSchemas[fieldName] = this.makeArrayFilterSchema(fieldDef.type as BuiltinType).optional();\n } else {\n const enumDef = getEnum(this.schema, fieldDef.type);\n if (enumDef) {\n fieldSchemas[fieldName] = this.makeEnumFilterSchema(\n enumDef,\n !!fieldDef.optional,\n false,\n ).optional();\n } else {\n fieldSchemas[fieldName] = this.makePrimitiveFilterSchema(\n fieldDef.type as BuiltinType,\n !!fieldDef.optional,\n false,\n ).optional();\n }\n }\n }\n }\n\n candidates.push(z.strictObject(fieldSchemas));\n }\n\n const recursiveSchema = z.lazy(() => this.makeTypedJsonFilterSchema(type, optional, false)).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));\n\n if (optional) {\n // allow null as well\n candidates.push(z.null());\n }\n\n // either plain json filter or field filters\n return z.union(candidates);\n }\n\n private isTypeDefType(type: string) {\n return this.schema.typeDefs && type in this.schema.typeDefs;\n }\n\n private makeEnumFilterSchema(enumDef: EnumDef, optional: boolean, withAggregations: boolean) {\n const baseSchema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n const components = this.makeCommonPrimitiveFilterComponents(\n baseSchema,\n optional,\n () => z.lazy(() => this.makeEnumFilterSchema(enumDef, optional, withAggregations)),\n ['equals', 'in', 'notIn', 'not'],\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n return z.union([this.nullableIf(baseSchema, optional), z.strictObject(components)]);\n }\n\n private makeArrayFilterSchema(type: BuiltinType) {\n return z.strictObject({\n equals: this.makeScalarSchema(type).array().optional(),\n has: this.makeScalarSchema(type).optional(),\n hasEvery: this.makeScalarSchema(type).array().optional(),\n hasSome: this.makeScalarSchema(type).array().optional(),\n isEmpty: z.boolean().optional(),\n });\n }\n\n private makePrimitiveFilterSchema(type: BuiltinType, optional: boolean, withAggregations: boolean) {\n return match(type)\n .with('String', () => this.makeStringFilterSchema(optional, withAggregations))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.makeNumberFilterSchema(this.makeScalarSchema(type), optional, withAggregations),\n )\n .with('Boolean', () => this.makeBooleanFilterSchema(optional, withAggregations))\n .with('DateTime', () => this.makeDateTimeFilterSchema(optional, withAggregations))\n .with('Bytes', () => this.makeBytesFilterSchema(optional, withAggregations))\n .with('Json', () => this.makeJsonFilterSchema(optional))\n .with('Unsupported', () => z.never())\n .exhaustive();\n }\n\n private makeJsonValueSchema(nullable: boolean, forFilter: boolean): z.ZodType {\n const options: z.ZodType[] = [z.string(), z.number(), z.boolean(), z.instanceof(JsonNullClass)];\n\n if (forFilter) {\n options.push(z.instanceof(DbNullClass));\n } else {\n if (nullable) {\n // for mutation, allow DbNull only if nullable\n options.push(z.instanceof(DbNullClass));\n }\n }\n\n if (forFilter) {\n options.push(z.instanceof(AnyNullClass));\n }\n\n const schema = z.union([\n ...options,\n z.lazy(() => z.union([this.makeJsonValueSchema(false, false), z.null()]).array()),\n z.record(\n z.string(),\n z.lazy(() => z.union([this.makeJsonValueSchema(false, false), z.null()])),\n ),\n ]);\n return this.nullableIf(schema, nullable);\n }\n\n private makeJsonFilterSchema(optional: boolean) {\n const valueSchema = this.makeJsonValueSchema(optional, true);\n return z.strictObject({\n path: z.string().optional(),\n equals: valueSchema.optional(),\n not: valueSchema.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: valueSchema.optional(),\n array_starts_with: valueSchema.optional(),\n array_ends_with: valueSchema.optional(),\n });\n }\n\n private makeDateTimeFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n z.union([z.iso.datetime(), z.date()]),\n optional,\n () => z.lazy(() => this.makeDateTimeFilterSchema(optional, withAggregations)),\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n }\n\n private makeBooleanFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n const components = this.makeCommonPrimitiveFilterComponents(\n z.boolean(),\n optional,\n () => z.lazy(() => this.makeBooleanFilterSchema(optional, withAggregations)),\n ['equals', 'not'],\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n return z.union([this.nullableIf(z.boolean(), optional), z.strictObject(components)]);\n }\n\n private makeBytesFilterSchema(optional: boolean, withAggregations: boolean): 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 );\n return z.union([this.nullableIf(baseSchema, optional), z.strictObject(components)]);\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 ) {\n const commonAggSchema = () =>\n this.makeCommonPrimitiveFilterSchema(baseSchema, false, makeThis, undefined).optional();\n let result = {\n equals: this.nullableIf(baseSchema.optional(), optional),\n notEquals: 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 not: makeThis().optional(),\n ...(withAggregations?.includes('_count')\n ? { _count: this.makeNumberFilterSchema(z.number().int(), false, false).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 return result;\n }\n\n private makeCommonPrimitiveFilterSchema(\n baseSchema: ZodType,\n optional: boolean,\n makeThis: () => ZodType,\n withAggregations: Array<AGGREGATE_OPERATORS> | undefined = undefined,\n ): z.ZodType {\n return z.union([\n this.nullableIf(baseSchema, optional),\n z.strictObject(\n this.makeCommonPrimitiveFilterComponents(baseSchema, optional, makeThis, undefined, withAggregations),\n ),\n ]);\n }\n\n private makeNumberFilterSchema(baseSchema: ZodType, optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n baseSchema,\n optional,\n () => z.lazy(() => this.makeNumberFilterSchema(baseSchema, optional, withAggregations)),\n withAggregations ? ['_count', '_avg', '_sum', '_min', '_max'] : undefined,\n );\n }\n\n private makeStringFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return z.union([\n this.nullableIf(z.string(), optional),\n z.strictObject({\n ...this.makeCommonPrimitiveFilterComponents(\n z.string(),\n optional,\n () => z.lazy(() => this.makeStringFilterSchema(optional, withAggregations)),\n undefined,\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n ),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n ...(this.providerSupportsCaseSensitivity\n ? {\n mode: this.makeStringModeSchema().optional(),\n }\n : {}),\n }),\n ]);\n }\n\n private makeStringModeSchema() {\n return z.union([z.literal('default'), z.literal('insensitive')]);\n }\n\n private makeSelectSchema(model: string) {\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 fields[field] = this.makeRelationSelectIncludeSchema(fieldDef).optional();\n } else {\n fields[field] = z.boolean().optional();\n }\n }\n\n const _countSchema = this.makeCountSelectionSchema(modelDef);\n if (_countSchema) {\n fields['_count'] = _countSchema;\n }\n\n return z.strictObject(fields);\n }\n\n private makeCountSelectionSchema(modelDef: ModelDef) {\n const toManyRelations = Object.values(modelDef.fields).filter((def) => def.relation && def.array);\n if (toManyRelations.length > 0) {\n return 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(fieldDef.type, false, false),\n }),\n ])\n .optional(),\n }),\n {} as Record<string, ZodType>,\n ),\n ),\n }),\n ])\n .optional();\n } else {\n return undefined;\n }\n }\n\n private makeRelationSelectIncludeSchema(fieldDef: FieldDef) {\n let objSchema: z.ZodType = z.strictObject({\n ...(fieldDef.array || fieldDef.optional\n ? {\n // to-many relations and optional to-one relations are filterable\n where: z.lazy(() => this.makeWhereSchema(fieldDef.type, false)).optional(),\n }\n : {}),\n select: z\n .lazy(() => this.makeSelectSchema(fieldDef.type))\n .optional()\n .nullable(),\n include: z\n .lazy(() => this.makeIncludeSchema(fieldDef.type))\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), true))\n .optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n cursor: this.makeCursorSchema(fieldDef.type).optional(),\n distinct: this.makeDistinctSchema(fieldDef.type).optional(),\n }\n : {}),\n });\n\n objSchema = this.refineForSelectIncludeMutuallyExclusive(objSchema);\n objSchema = this.refineForSelectOmitMutuallyExclusive(objSchema);\n\n return z.union([z.boolean(), objSchema]);\n }\n\n private makeOmitSchema(model: string) {\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.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 return z.strictObject(fields);\n }\n\n private makeIncludeSchema(model: string) {\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 fields[field] = this.makeRelationSelectIncludeSchema(fieldDef).optional();\n }\n }\n\n const _countSchema = this.makeCountSelectionSchema(modelDef);\n if (_countSchema) {\n fields['_count'] = _countSchema;\n }\n\n return z.strictObject(fields);\n }\n\n private makeOrderBySchema(model: string, withRelation: boolean, WithAggregation: boolean) {\n const modelDef = requireModel(this.schema, model);\n const fields: Record<string, ZodType> = {};\n const sort = z.union([z.literal('asc'), z.literal('desc')]);\n for (const field of Object.keys(modelDef.fields)) {\n const fieldDef = requireField(this.schema, model, field);\n if (fieldDef.relation) {\n // relations\n if (withRelation) {\n fields[field] = z.lazy(() => {\n let relationOrderBy = this.makeOrderBySchema(fieldDef.type, withRelation, WithAggregation);\n if (fieldDef.array) {\n relationOrderBy = relationOrderBy.extend({\n _count: sort,\n });\n }\n return relationOrderBy.optional();\n });\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')]),\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).optional());\n }\n }\n\n return z.strictObject(fields);\n }\n\n private makeDistinctSchema(model: string) {\n const modelDef = requireModel(this.schema, model);\n const nonRelationFields = Object.keys(modelDef.fields).filter((field) => !modelDef.fields[field]?.relation);\n return this.orArray(z.enum(nonRelationFields as any), true);\n }\n\n private makeCursorSchema(model: string) {\n return this.makeWhereSchema(model, true, true).optional();\n }\n\n // #endregion\n\n // #region Create\n\n private makeCreateSchema(model: string) {\n const dataSchema = this.makeCreateDataSchema(model, false);\n let schema: ZodType = z.strictObject({\n data: dataSchema,\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeCreateManySchema(model: string) {\n return this.makeCreateManyDataSchema(model, []).optional();\n }\n\n private makeCreateManyAndReturnSchema(model: string) {\n const base = this.makeCreateManyDataSchema(model, []);\n const result = base.extend({\n select: this.makeSelectSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n return this.refineForSelectOmitMutuallyExclusive(result).optional();\n }\n\n private makeCreateDataSchema(\n model: string,\n canBeArray: boolean,\n withoutFields: string[] = [],\n withoutRelationFields = false,\n ) {\n const uncheckedVariantFields: Record<string, ZodType> = {};\n const checkedVariantFields: Record<string, ZodType> = {};\n const modelDef = requireModel(this.schema, model);\n const hasRelation =\n !withoutRelationFields &&\n Object.entries(modelDef.fields).some(([f, def]) => !withoutFields.includes(f) && def.relation);\n\n Object.keys(modelDef.fields).forEach((field) => {\n if (withoutFields.includes(field)) {\n return;\n }\n const fieldDef = requireField(this.schema, model, field);\n if (fieldDef.computed) {\n return;\n }\n\n if (this.isDelegateDiscriminator(fieldDef)) {\n // discriminator field is auto-assigned\n return;\n }\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\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(fieldDef, excludeFields, 'create'),\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 = 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 {\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 ? addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n : z.strictObject(uncheckedVariantFields);\n const checkedCreateSchema = this.extraValidationsEnabled\n ? addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n : z.strictObject(checkedVariantFields);\n\n if (!hasRelation) {\n return this.orArray(uncheckedCreateSchema, canBeArray);\n } else {\n return z.union([\n uncheckedCreateSchema,\n checkedCreateSchema,\n ...(canBeArray ? [z.array(uncheckedCreateSchema)] : []),\n ...(canBeArray ? [z.array(checkedCreateSchema)] : []),\n ]);\n }\n }\n\n private isDelegateDiscriminator(fieldDef: FieldDef) {\n if (!fieldDef.originModel) {\n // not inherited from a delegate\n return false;\n }\n const discriminatorField = getDiscriminatorField(this.schema, fieldDef.originModel);\n return discriminatorField === fieldDef.name;\n }\n\n private makeRelationManipulationSchema(fieldDef: FieldDef, withoutFields: string[], mode: 'create' | 'update') {\n const fieldType = fieldDef.type;\n const array = !!fieldDef.array;\n const fields: Record<string, ZodType> = {\n create: this.makeCreateDataSchema(fieldDef.type, !!fieldDef.array, withoutFields).optional(),\n\n connect: this.makeConnectDataSchema(fieldType, array).optional(),\n\n connectOrCreate: this.makeConnectOrCreateDataSchema(fieldType, array, withoutFields).optional(),\n };\n\n if (array) {\n fields['createMany'] = this.makeCreateManyDataSchema(fieldType, withoutFields).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).optional();\n\n fields['delete'] = this.makeDeleteRelationDataSchema(fieldType, array, true).optional();\n }\n\n fields['update'] = array\n ? this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional()\n : z\n .union([\n z.strictObject({\n where: this.makeWhereSchema(fieldType, false).optional(),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n this.makeUpdateDataSchema(fieldType, withoutFields),\n ])\n .optional();\n\n let upsertWhere = this.makeWhereSchema(fieldType, true);\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),\n update: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional();\n\n if (array) {\n // to-many relation specifics\n fields['set'] = this.makeSetDataSchema(fieldType, true).optional();\n\n fields['updateMany'] = this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, false, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional();\n\n fields['deleteMany'] = this.makeDeleteRelationDataSchema(fieldType, true, false).optional();\n }\n }\n\n return z.strictObject(fields);\n }\n\n private makeSetDataSchema(model: string, canBeArray: boolean) {\n return this.orArray(this.makeWhereSchema(model, true), canBeArray);\n }\n\n private makeConnectDataSchema(model: string, canBeArray: boolean) {\n return this.orArray(this.makeWhereSchema(model, true), canBeArray);\n }\n\n private makeDisconnectDataSchema(model: string, canBeArray: boolean) {\n if (canBeArray) {\n // to-many relation, must be unique filters\n return this.orArray(this.makeWhereSchema(model, true), 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)]);\n }\n }\n\n private makeDeleteRelationDataSchema(model: string, toManyRelation: boolean, uniqueFilter: boolean) {\n return toManyRelation\n ? this.orArray(this.makeWhereSchema(model, uniqueFilter), true)\n : z.union([z.boolean(), this.makeWhereSchema(model, uniqueFilter)]);\n }\n\n private makeConnectOrCreateDataSchema(model: string, canBeArray: boolean, withoutFields: string[]) {\n const whereSchema = this.makeWhereSchema(model, true);\n const createSchema = this.makeCreateDataSchema(model, false, withoutFields);\n return this.orArray(\n z.strictObject({\n where: whereSchema,\n create: createSchema,\n }),\n canBeArray,\n );\n }\n\n private makeCreateManyDataSchema(model: string, withoutFields: string[]) {\n return z.strictObject({\n data: this.makeCreateDataSchema(model, true, withoutFields, true),\n skipDuplicates: z.boolean().optional(),\n });\n }\n\n // #endregion\n\n // #region Update\n\n private makeUpdateSchema(model: string) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n data: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpdateManySchema(model: string) {\n return z.strictObject({\n where: this.makeWhereSchema(model, false).optional(),\n data: this.makeUpdateDataSchema(model, [], true),\n limit: z.number().int().nonnegative().optional(),\n });\n }\n\n private makeUpdateManyAndReturnSchema(model: string) {\n const base = this.makeUpdateManySchema(model);\n let schema: ZodType = base.extend({\n select: this.makeSelectSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpsertSchema(model: string) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n create: this.makeCreateDataSchema(model, false),\n update: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpdateDataSchema(model: string, withoutFields: string[] = [], withoutRelationFields = false) {\n const uncheckedVariantFields: Record<string, ZodType> = {};\n const checkedVariantFields: Record<string, ZodType> = {};\n const modelDef = requireModel(this.schema, model);\n const hasRelation = Object.entries(modelDef.fields).some(\n ([key, value]) => value.relation && !withoutFields.includes(key),\n );\n\n Object.keys(modelDef.fields).forEach((field) => {\n if (withoutFields.includes(field)) {\n return;\n }\n const fieldDef = requireField(this.schema, model, field);\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\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(fieldDef, excludeFields, 'update'))\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 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 = 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 {\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 ? addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n : z.strictObject(uncheckedVariantFields);\n const checkedUpdateSchema = this.extraValidationsEnabled\n ? addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n : z.strictObject(checkedVariantFields);\n if (!hasRelation) {\n return uncheckedUpdateSchema;\n } else {\n return z.union([uncheckedUpdateSchema, checkedUpdateSchema]);\n }\n }\n\n // #endregion\n\n // #region Delete\n\n private makeDeleteSchema(model: GetModels<Schema>) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeDeleteManySchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n limit: z.number().int().nonnegative().optional(),\n })\n\n .optional();\n }\n\n // #endregion\n\n // #region Count\n\n makeCountSchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, true, false), true).optional(),\n select: this.makeCountAggregateInputSchema(model).optional(),\n })\n\n .optional();\n }\n\n private makeCountAggregateInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.union([\n z.literal(true),\n z.strictObject({\n _all: z.literal(true).optional(),\n ...Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n acc[field] = z.literal(true).optional();\n return acc;\n },\n {} as Record<string, ZodType>,\n ),\n }),\n ]);\n }\n\n // #endregion\n\n // #region Aggregate\n\n makeAggregateSchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, true, false), 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\n .optional();\n }\n\n makeSumAvgInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.strictObject(\n Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n const fieldDef = requireField(this.schema, model, field);\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 }\n\n makeMinMaxInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.strictObject(\n Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n const fieldDef = requireField(this.schema, model, field);\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 }\n\n private makeGroupBySchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n const nonRelationFields = Object.keys(modelDef.fields).filter((field) => !modelDef.fields[field]?.relation);\n const bySchema =\n nonRelationFields.length > 0\n ? this.orArray(z.enum(nonRelationFields as [string, ...string[]]), true)\n : z.never();\n\n let schema: z.ZodSchema = z.strictObject({\n where: this.makeWhereSchema(model, false).optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, false, true), true).optional(),\n by: bySchema,\n having: this.makeHavingSchema(model).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 // fields used in `having` must be either in the `by` list, or aggregations\n schema = schema.refine((value: any) => {\n const bys = typeof value.by === 'string' ? [value.by] : value.by;\n if (value.having && typeof value.having === 'object') {\n for (const [key, val] of Object.entries(value.having)) {\n if (AGGREGATE_OPERATORS.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 = typeof value.by === 'string' ? [value.by] : value.by;\n if (\n value.orderBy &&\n Object.keys(value.orderBy)\n .filter((f) => !AGGREGATE_OPERATORS.includes(f as AGGREGATE_OPERATORS))\n .some((key) => !bys.includes(key))\n ) {\n return false;\n } else {\n return true;\n }\n }, 'fields in \"orderBy\" must be in \"by\"');\n\n return schema;\n }\n\n private onlyAggregationFields(val: object) {\n for (const [key, value] of Object.entries(val)) {\n if (AGGREGATE_OPERATORS.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 private makeHavingSchema(model: GetModels<Schema>) {\n return this.makeWhereSchema(model, false, true, true);\n }\n\n // #endregion\n\n // #region Helpers\n\n private makeSkipSchema() {\n return z.number().int().nonnegative();\n }\n\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 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 // #endregion\n}\n","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 { invariant } from '@zenstackhq/common-helpers';\nimport type {\n AttributeApplication,\n BinaryExpression,\n CallExpression,\n Expression,\n FieldExpression,\n MemberExpression,\n UnaryExpression,\n} from '@zenstackhq/schema';\nimport Decimal from 'decimal.js';\nimport { match, P } from 'ts-pattern';\nimport { z } from 'zod';\nimport { ZodIssueCode } from 'zod/v3';\nimport { ExpressionUtils } from '../../../schema';\nimport { createNotSupportedError } from '../../errors';\n\nfunction getArgValue<T extends string | number | boolean>(expr: Expression | undefined): T | undefined {\n if (!expr || !ExpressionUtils.isLiteral(expr)) {\n return undefined;\n }\n return expr.value as T;\n}\n\nexport function addStringValidation(\n schema: z.ZodString,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n match(attr.name)\n .with('@length', () => {\n const min = getArgValue<number>(attr.args?.[0]?.value);\n if (min !== undefined) {\n result = result.min(min);\n }\n const max = getArgValue<number>(attr.args?.[1]?.value);\n if (max !== undefined) {\n result = result.max(max);\n }\n })\n .with('@startsWith', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.startsWith(value);\n }\n })\n .with('@endsWith', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.endsWith(value);\n }\n })\n .with('@contains', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.includes(value);\n }\n })\n .with('@regex', () => {\n const pattern = getArgValue<string>(attr.args?.[0]?.value);\n if (pattern !== undefined) {\n result = result.regex(new RegExp(pattern));\n }\n })\n .with('@email', () => {\n result = result.email();\n })\n .with('@datetime', () => {\n result = result.datetime();\n })\n .with('@url', () => {\n result = result.url();\n })\n .with('@trim', () => {\n result = result.trim();\n })\n .with('@lower', () => {\n result = result.toLowerCase();\n })\n .with('@upper', () => {\n result = result.toUpperCase();\n });\n }\n return result;\n}\n\nexport function addNumberValidation(\n schema: z.ZodNumber,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n match(attr.name)\n .with('@gt', () => {\n result = result.gt(val);\n })\n .with('@gte', () => {\n result = result.gte(val);\n })\n .with('@lt', () => {\n result = result.lt(val);\n })\n .with('@lte', () => {\n result = result.lte(val);\n });\n }\n return result;\n}\n\nexport function addBigIntValidation(\n schema: z.ZodBigInt,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n\n match(attr.name)\n .with('@gt', () => {\n result = result.gt(BigInt(val));\n })\n .with('@gte', () => {\n result = result.gte(BigInt(val));\n })\n .with('@lt', () => {\n result = result.lt(BigInt(val));\n })\n .with('@lte', () => {\n result = result.lte(BigInt(val));\n });\n }\n return result;\n}\n\nexport function addDecimalValidation(\n schema: z.ZodType<Decimal> | z.ZodString,\n attributes: readonly AttributeApplication[] | undefined,\n addExtraValidation: boolean,\n): z.ZodSchema {\n let result: z.ZodSchema = schema;\n\n // parse string to Decimal\n if (schema instanceof z.ZodString) {\n result = schema\n .superRefine((v, ctx) => {\n try {\n new Decimal(v);\n } catch (err) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid decimal: ${err}`,\n });\n }\n })\n .transform((val) => new Decimal(val));\n }\n\n // add validations\n\n function refine(schema: z.ZodSchema, op: 'gt' | 'gte' | 'lt' | 'lte', value: number) {\n return schema.superRefine((v, ctx) => {\n const base = z.number();\n const { error } = base[op](value).safeParse((v as Decimal).toNumber());\n error?.issues.forEach((issue) => {\n if (op === 'gt' || op === 'gte') {\n ctx.addIssue({\n code: ZodIssueCode.too_small,\n origin: 'number',\n minimum: value,\n type: 'decimal',\n inclusive: op === 'gte',\n message: issue.message,\n });\n } else {\n ctx.addIssue({\n code: ZodIssueCode.too_big,\n origin: 'number',\n maximum: value,\n type: 'decimal',\n inclusive: op === 'lte',\n message: issue.message,\n });\n }\n });\n });\n }\n\n if (attributes && addExtraValidation) {\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n\n match(attr.name)\n .with('@gt', () => {\n result = refine(result, 'gt', val);\n })\n .with('@gte', () => {\n result = refine(result, 'gte', val);\n })\n .with('@lt', () => {\n result = refine(result, 'lt', val);\n })\n .with('@lte', () => {\n result = refine(result, 'lte', val);\n });\n }\n }\n\n return result;\n}\n\nexport function addListValidation(\n schema: z.ZodArray<any>,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n match(attr.name)\n .with('@length', () => {\n const min = getArgValue<number>(attr.args?.[0]?.value);\n if (min !== undefined) {\n result = result.min(min);\n }\n const max = getArgValue<number>(attr.args?.[1]?.value);\n if (max !== undefined) {\n result = result.max(max);\n }\n })\n .otherwise(() => {});\n }\n return result;\n}\n\nexport function addCustomValidation(\n schema: z.ZodSchema,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n const attrs = attributes?.filter((a) => a.name === '@@validate');\n if (!attrs || attrs.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attrs) {\n const expr = attr.args?.[0]?.value;\n if (!expr) {\n continue;\n }\n const message = getArgValue<string>(attr.args?.[1]?.value);\n const pathExpr = attr.args?.[2]?.value;\n let path: string[] | undefined = undefined;\n if (pathExpr && ExpressionUtils.isArray(pathExpr)) {\n path = pathExpr.items.map((e) => ExpressionUtils.getLiteralValue(e) as string);\n }\n result = applyValidation(result, expr, message, path);\n }\n return result;\n}\n\nfunction applyValidation(\n schema: z.ZodSchema,\n expr: Expression,\n message: string | undefined,\n path: string[] | undefined,\n) {\n const options: Parameters<typeof schema.refine>[1] = {};\n if (message) {\n options.error = message;\n }\n if (path) {\n options.path = path;\n }\n return schema.refine((data) => Boolean(evalExpression(data, expr)), options);\n}\n\nfunction evalExpression(data: any, expr: Expression): unknown {\n return match(expr)\n .with({ kind: 'literal' }, (e) => e.value)\n .with({ kind: 'array' }, (e) => e.items.map((item) => evalExpression(data, item)))\n .with({ kind: 'field' }, (e) => evalField(data, e))\n .with({ kind: 'member' }, (e) => evalMember(data, e))\n .with({ kind: 'unary' }, (e) => evalUnary(data, e))\n .with({ kind: 'binary' }, (e) => evalBinary(data, e))\n .with({ kind: 'call' }, (e) => evalCall(data, e))\n .with({ kind: 'this' }, () => data ?? null)\n .with({ kind: 'null' }, () => null)\n .exhaustive();\n}\n\nfunction evalField(data: any, e: FieldExpression) {\n return data?.[e.field] ?? null;\n}\n\nfunction evalUnary(data: any, expr: UnaryExpression) {\n const operand = evalExpression(data, expr.operand);\n switch (expr.op) {\n case '!':\n return !operand;\n default:\n throw new Error(`Unsupported unary operator: ${expr.op}`);\n }\n}\n\nfunction evalBinary(data: any, expr: BinaryExpression) {\n const left = evalExpression(data, expr.left);\n const right = evalExpression(data, expr.right);\n return match(expr.op)\n .with('&&', () => Boolean(left) && Boolean(right))\n .with('||', () => Boolean(left) || Boolean(right))\n .with('==', () => left == right)\n .with('!=', () => left != right)\n .with('<', () => (left as any) < (right as any))\n .with('<=', () => (left as any) <= (right as any))\n .with('>', () => (left as any) > (right as any))\n .with('>=', () => (left as any) >= (right as any))\n .with('?', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return left.some((item) => item === right);\n })\n .with('!', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return left.every((item) => item === right);\n })\n .with('^', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return !left.some((item) => item === right);\n })\n .with('in', () => {\n if (!Array.isArray(right)) {\n return false;\n }\n return right.includes(left);\n })\n .exhaustive();\n}\n\nfunction evalMember(data: any, expr: MemberExpression) {\n let result: any = evalExpression(data, expr.receiver);\n for (const member of expr.members) {\n if (!result || typeof result !== 'object') {\n return undefined;\n }\n result = result[member];\n }\n return result ?? null;\n}\n\nfunction evalCall(data: any, expr: CallExpression) {\n const fieldArg = expr.args?.[0] ? evalExpression(data, expr.args[0]) : undefined;\n return (\n match(expr.function)\n // string functions\n .with('length', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(\n typeof fieldArg === 'string' || Array.isArray(fieldArg),\n `\"${f}\" first argument must be a string or a list`,\n );\n return fieldArg.length;\n })\n .with(P.union('startsWith', 'endsWith', 'contains'), (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n invariant(expr.args?.[1], `\"${f}\" requires a search argument`);\n\n const search = getArgValue<string>(expr.args?.[1])!;\n const caseInsensitive = getArgValue<boolean>(expr.args?.[2]) ?? false;\n\n const matcher = (x: string, y: string) =>\n match(f)\n .with('startsWith', () => x.startsWith(y))\n .with('endsWith', () => x.endsWith(y))\n .with('contains', () => x.includes(y))\n .exhaustive();\n return caseInsensitive\n ? matcher(fieldArg.toLowerCase(), search.toLowerCase())\n : matcher(fieldArg, search);\n })\n .with('regex', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n const pattern = getArgValue<string>(expr.args?.[1])!;\n invariant(pattern !== undefined, `\"${f}\" requires a pattern argument`);\n return new RegExp(pattern).test(fieldArg);\n })\n .with(P.union('isEmail', 'isUrl', 'isDateTime'), (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n const fn = match(f)\n .with('isEmail', () => 'email' as const)\n .with('isUrl', () => 'url' as const)\n .with('isDateTime', () => 'datetime' as const)\n .exhaustive();\n return z.string()[fn]().safeParse(fieldArg).success;\n })\n // list functions\n .with(P.union('has', 'hasEvery', 'hasSome'), (f) => {\n invariant(expr.args?.[1], `${f} requires a search argument`);\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(Array.isArray(fieldArg), `\"${f}\" first argument must be an array field`);\n\n const search = evalExpression(data, expr.args?.[1])!;\n const matcher = (x: any[], y: any) =>\n match(f)\n .with('has', () => x.some((item) => item === y))\n .with('hasEvery', () => {\n invariant(Array.isArray(y), 'hasEvery second argument must be an array');\n return y.every((v) => x.some((item) => item === v));\n })\n .with('hasSome', () => {\n invariant(Array.isArray(y), 'hasSome second argument must be an array');\n return y.some((v) => x.some((item) => item === v));\n })\n .exhaustive();\n return matcher(fieldArg, search);\n })\n .with('isEmpty', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(Array.isArray(fieldArg), `\"${f}\" first argument must be an array field`);\n return fieldArg.length === 0;\n })\n .otherwise(() => {\n throw createNotSupportedError(`Unsupported function \"${expr.function}\"`);\n })\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 { QueryId } from 'kysely';\nimport {\n AndNode,\n CompiledQuery,\n createQueryId,\n DefaultQueryExecutor,\n DeleteQueryNode,\n InsertQueryNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n SingleConnectionProvider,\n TableNode,\n UpdateQueryNode,\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 { ModelDef, SchemaDef, TypeDefDef } from '../../schema';\nimport { type ClientImpl } from '../client-impl';\nimport { TransactionIsolationLevel, type ClientContract } from '../contract';\nimport { createDBQueryError, createInternalError, ORMError } from '../errors';\nimport type { AfterEntityMutationCallback, OnKyselyQueryCallback } from '../plugin';\nimport { stripAlias } from '../query-utils';\nimport { QueryNameMapper } from './name-mapper';\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\nexport class ZenStackQueryExecutor extends DefaultQueryExecutor {\n private readonly nameMapper: QueryNameMapper | undefined;\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.$schema);\n }\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 override 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 return this.provideConnection(async (connection) => {\n let startedTx = false;\n try {\n // mutations are wrapped in tx if not already in one\n if (this.isMutationNode(compiledQuery.query) && !this.driver.isTransactionConnection(connection)) {\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',\n err,\n compiledQuery.sql,\n compiledQuery.parameters,\n );\n }\n }\n });\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 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 async proceedQuery(\n connection: DatabaseConnection,\n query: RootOperationNode,\n parameters: readonly unknown[] | undefined,\n queryId: QueryId,\n ) {\n let compiled: CompiledQuery | undefined;\n\n if (this.suppressMutationHooks || !this.isMutationNode(query) || !this.hasEntityMutationPlugins) {\n // no need to handle mutation hooks, just proceed\n const finalQuery = this.processNameMapping(query);\n\n // inherit the original queryId\n compiled = this.compileQuery(finalQuery, queryId);\n if (parameters) {\n compiled = { ...compiled, parameters };\n }\n return this.internalExecuteQuery(connection, compiled);\n }\n\n if (\n (InsertQueryNode.is(query) || UpdateQueryNode.is(query)) &&\n this.hasEntityMutationPluginsWithAfterMutationHooks\n ) {\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 }\n const finalQuery = this.processNameMapping(query);\n\n // inherit the original queryId\n compiled = this.compileQuery(finalQuery, queryId);\n if (parameters) {\n compiled = { ...compiled, parameters };\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(finalQuery);\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(mutationInfo.model, mutationInfo.where, connection);\n }\n return beforeMutationEntities;\n };\n\n // call before mutation hooks\n await this.callBeforeMutationHooks(\n finalQuery,\n mutationInfo,\n loadBeforeMutationEntities,\n connectionClient,\n queryId,\n );\n\n const result = await this.internalExecuteQuery(connection, compiled);\n\n if (!this.driver.isTransactionConnection(connection)) {\n // not in a transaction, just call all after-mutation hooks\n await this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'all', queryId);\n } else {\n // run after-mutation hooks that are requested to be run inside tx\n await this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'inTx', queryId);\n\n // register other after-mutation hooks to be run after the tx is committed\n this.driver.registerTransactionCommitCallback(connection, () =>\n this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'outTx', queryId),\n );\n }\n\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 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 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 isMutationNode(queryNode: RootOperationNode): queryNode is MutationQueryNode {\n return InsertQueryNode.is(queryNode) || UpdateQueryNode.is(queryNode) || DeleteQueryNode.is(queryNode);\n }\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 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 async callBeforeMutationHooks(\n queryNode: OperationNode,\n mutationInfo: MutationInfo,\n loadBeforeMutationEntities: () => Promise<Record<string, unknown>[] | undefined>,\n client: ClientContract<SchemaDef>,\n queryId: QueryId,\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(\n queryResult: QueryResult<unknown>,\n queryNode: OperationNode,\n mutationInfo: MutationInfo,\n client: ClientContract<SchemaDef>,\n filterFor: 'inTx' | 'outTx' | 'all',\n queryId: QueryId,\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 const mutationModel = this.getMutationModel(queryNode);\n\n const loadAfterMutationEntities = async () => {\n if (mutationInfo.action === 'delete') {\n return undefined;\n } else {\n return queryResult.rows as Record<string, unknown>[];\n }\n };\n\n for (const hook of hooks) {\n await hook({\n model: mutationModel,\n action: mutationInfo.action,\n queryNode,\n loadAfterMutationEntities,\n client,\n queryId,\n });\n }\n }\n\n private async loadEntities(\n model: string,\n where: WhereNode | undefined,\n connection: DatabaseConnection,\n ): Promise<Record<string, unknown>[]> {\n const selectQuery = this.kysely.selectFrom(model).selectAll();\n let selectQueryNode = selectQuery.toOperationNode() as SelectQueryNode;\n selectQueryNode = {\n ...selectQueryNode,\n where: this.andNodes(selectQueryNode.where, where),\n };\n const compiled = this.compileQuery(selectQueryNode, createQueryId());\n // execute the query directly with the given connection to avoid triggering\n // any other side effects\n const result = await this.internalExecuteQuery(connection, compiled);\n return result.rows as Record<string, unknown>[];\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(connection: DatabaseConnection, compiledQuery: CompiledQuery) {\n try {\n return await connection.executeQuery<any>(compiledQuery);\n } catch (err) {\n throw createDBQueryError('Failed to execute query', err, compiledQuery.sql, compiledQuery.parameters);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\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 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 { EnumDef, EnumField, FieldDef, ModelDef, SchemaDef } from '../../schema';\nimport {\n extractFieldName,\n extractModelName,\n getEnum,\n getField,\n getModel,\n isEnum,\n requireModel,\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 scopes: Scope[] = [];\n\n constructor(private readonly schema: SchemaDef) {\n super();\n for (const [modelName, modelDef] of Object.entries(schema.models)) {\n const mappedName = this.getMappedName(modelDef);\n if (mappedName) {\n this.modelToTableMap.set(modelName, mappedName);\n }\n\n for (const fieldDef of this.getModelFields(modelDef)) {\n const mappedName = this.getMappedName(fieldDef);\n if (mappedName) {\n this.fieldToColumnMap.set(`${modelName}.${fieldDef.name}`, mappedName);\n }\n }\n }\n }\n\n // #region overrides\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n if (!node.from?.froms) {\n return super.transformSelectQuery(node);\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\" needs to be added as scopes since join conditions\n // can refer to \"from\" tables\n const processedJoins = this.withScopes([...processedFroms.map(({ scope }) => scope)], () =>\n (node.joins ?? []).map((join) => this.processSelectTable(join.table)),\n );\n\n // merge the scopes of froms and joins since they're all visible in the query body\n const scopes = [...processedFroms.map(({ scope }) => scope), ...processedJoins.map(({ scope }) => scope)];\n\n return this.withScopes(scopes, () => {\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);\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) {\n if (!node.into) {\n return super.transformInsertQuery(node);\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);\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) {\n if (!ColumnNode.is(node.column)) {\n return super.transformReference(node);\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) {\n const scope = this.resolveFieldFromScopes(node.column.name);\n if (!scope || scope.namesMapped || !scope.model) {\n return super.transformColumn(node);\n }\n const mappedName = this.mapFieldName(scope.model, node.column.name);\n return ColumnNode.create(mappedName);\n }\n\n protected override transformBinaryOperation(node: BinaryOperationNode) {\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 ...node,\n rightOperand: resultValue,\n });\n }\n }\n\n return super.transformBinaryOperation(node);\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n if (!node.table) {\n return super.transformUpdateQuery(node);\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);\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) {\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);\n }\n });\n\n return this.withScopes(scopes, () => {\n return {\n ...super.transformDeleteQuery(node),\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 (this.getModelFields(modelDef).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 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 nameArg = schemaAttr.args?.find((arg) => arg.name === 'map');\n if (nameArg && nameArg.value.kind === 'literal') {\n schema = nameArg.value.value as string;\n }\n }\n return schema;\n }\n\n private createSelectAllFields(model: string, alias: OperationNode | undefined) {\n const modelDef = requireModel(this.schema, model);\n return this.getModelFields(modelDef).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 getModelFields(modelDef: ModelDef) {\n return Object.values(modelDef.fields).filter((f) => !f.relation && !f.computed && !f.originModel);\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 const modelDef = requireModel(this.schema, scope.model);\n return this.getModelFields(modelDef).map((fieldDef) => {\n const columnName = this.mapFieldName(modelDef.name, 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 this.getModelFields(modelDef).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(eb.cast(new ExpressionWrapper(node), 'text')).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 { 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 // escape special characters in search string\n const escapedSearch = sql`REPLACE(REPLACE(REPLACE(CAST(${searchExpr} as text), '\\\\', '\\\\\\\\'), '%', '\\\\%'), '_', '\\\\_')`;\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 '\\\\'`;\n};\n\nexport const has: ZModelFunction<any> = (eb, args) => {\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 eb(field, '@>', [search]);\n};\n\nexport const hasEvery: ZModelFunction<any> = (eb: ExpressionBuilder<any, any>, args: Expression<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 eb(field, '@>', search);\n};\n\nexport const hasSome: ZModelFunction<any> = (eb, args) => {\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 eb(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> = () => sql.raw('CURRENT_TIMESTAMP');\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 { CreateTableBuilder, sql, type ColumnDataType, type OnModifyForeignAction } from 'kysely';\nimport toposort from 'toposort';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type BuiltinType,\n type CascadeAction,\n type FieldDef,\n type ModelDef,\n type SchemaDef,\n} from '../../schema';\nimport type { ToKysely } from '../query-builder';\nimport { requireModel } from '../query-utils';\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.schema.provider.type === 'postgresql') {\n for (const [name, enumDef] of Object.entries(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(name).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 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 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 (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}_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 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) {\n if (typeof fieldDef.default === 'object' && 'kind' in fieldDef.default) {\n if (ExpressionUtils.isCall(fieldDef.default) && fieldDef.default.function === 'now') {\n col = col.defaultTo(sql`CURRENT_TIMESTAMP`);\n }\n } else {\n col = col.defaultTo(fieldDef.default);\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.schema.provider.type === 'sqlite') {\n col = col.autoIncrement();\n }\n\n return col;\n });\n }\n\n private mapFieldType(fieldDef: FieldDef) {\n if (this.schema.enums?.[fieldDef.type]) {\n return this.schema.provider.type === 'postgresql' ? sql.ref(fieldDef.type) : 'text';\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 'jsonb';\n }\n\n const type = fieldDef.type as BuiltinType;\n const result = match<BuiltinType, ColumnDataType>(type)\n .with('String', () => 'text')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'integer')\n .with('Float', () => 'real')\n .with('BigInt', () => 'bigint')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'timestamp')\n .with('Bytes', () => (this.schema.provider.type === 'postgresql' ? 'bytea' : 'blob'))\n .with('Json', () => 'jsonb')\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","import type { SchemaDef } from '../schema';\nimport type { ClientContract } from './contract';\n\n/**\n * A promise that only executes when it's awaited or .then() is called.\n */\nexport type ZenStackPromise<Schema extends SchemaDef, T> = Promise<T> & {\n /**\n * @private\n * Callable to get a plain promise.\n */\n cb: (txClient?: ClientContract<Schema>) => Promise<T>;\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<any, 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 };\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 '../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 if (Array.isArray(data)) {\n data.forEach((row, i) => (data[i] = this.processRow(row, model)));\n return data;\n } else {\n return this.processRow(data, model);\n }\n }\n\n private processRow(data: any, model: GetModels<Schema>) {\n if (!data || typeof data !== 'object') {\n return data;\n }\n for (const [key, value] of Object.entries<any>(data)) {\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 continue;\n }\n\n 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');\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 processedSubRow = this.processRow(subRow, subModel);\n\n // merge the sub-row into the main row\n Object.assign(data, processedSubRow);\n }\n delete data[key];\n continue;\n }\n\n const fieldDef = getField(this.schema, model, key);\n if (!fieldDef) {\n continue;\n }\n\n if (value === null) {\n // scalar list defaults to empty array\n if (fieldDef.array && !fieldDef.relation && value === null) {\n data[key] = [];\n }\n continue;\n }\n\n if (fieldDef.relation) {\n data[key] = this.processRelation(value, fieldDef);\n } else {\n data[key] = this.processFieldValue(value, fieldDef);\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)));\n return value;\n } else {\n return this.dialect.transformOutput(value, type);\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 type { OperationNode, QueryId, QueryResult, RootOperationNode, UnknownRow } from 'kysely';\nimport type { ClientContract } from '.';\nimport type { GetModels, SchemaDef } from '../schema';\nimport type { MaybePromise } from '../utils/type-utils';\nimport type { AllCrudOperation } from './crud/operations/base';\nimport type { ZModelFunction } from './options';\n\n/**\n * ZenStack runtime plugin.\n */\nexport interface RuntimePlugin<Schema extends SchemaDef = SchemaDef> {\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 an entity mutation.\n */\n onEntityMutation?: EntityMutationHooksDef<Schema>;\n\n /**\n * Intercepts a Kysely query.\n */\n onKyselyQuery?: OnKyselyQueryCallback<Schema>;\n}\n\n/**\n * Defines a ZenStack runtime plugin.\n */\nexport function definePlugin<Schema extends SchemaDef>(plugin: RuntimePlugin<Schema>) {\n return plugin;\n}\n\nexport { type CoreCrudOperation as CrudOperation } from './crud/operations/base';\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: AllCrudOperation;\n\n /**\n * The query arguments.\n */\n args: unknown;\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: unknown) => 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 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 AggregateFunctionNode,\n AliasNode,\n AlterColumnNode,\n AlterTableNode,\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 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}\n\nexport type AnyKysely = Kysely<any>;\n","import { match } from 'ts-pattern';\nimport type {\n ArrayExpression,\n BinaryExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n} from '../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: '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 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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","names":["invariant","CompiledQuery","DefaultConnectionProvider","DefaultQueryExecutor","Kysely","Log","sql","Transaction","match","invariant","AliasNode","ColumnNode","ReferenceNode","TableNode","match","extractFields","obj","fields","Object","fromEntries","entries","filter","key","includes","fieldsToSelectObject","map","f","getDbErrorCode","error","Error","code","undefined","ORMErrorReason","RejectedByPolicyReason","ORMError","Error","reason","message","options","model","dbErrorCode","dbErrorMessage","rejectedByPolicyReason","sql","sqlParams","createConfigError","createNotFoundError","error","createInvalidInputError","createDBQueryError","dbError","parameters","cause","getDbErrorCode","undefined","createRejectedByPolicyError","createNotSupportedError","createInternalError","hasModel","schema","model","Object","keys","models","map","k","toLowerCase","includes","getModel","values","find","m","name","getTypeDef","type","typeDefs","requireModel","modelDef","createInternalError","requireTypeDef","typeDef","getField","field","fields","requireField","modelOrType","getIdFields","idFields","requireIdFields","result","getRelationForeignKeyFieldPairs","relationField","fieldDef","relation","references","keyPairs","f","i","fk","pk","ownedByModel","opposite","oppositeField","isScalarField","foreignKeyFor","isForeignKeyField","isRelationField","isInheritedField","originModel","getUniqueFields","key","value","entries","uniqueFields","push","def","defs","fromEntries","getIdValues","data","reduce","acc","fieldHasDefaultValue","default","undefined","updatedAt","isEnum","enums","getEnum","isTypeDef","buildJoinPairs","modelAlias","relationModelAlias","makeDefaultOrderBy","getManyToManyRelation","array","realModel","oppositeFieldDef","sortedModelNames","sort","orderedFK","sortedFieldNames","modelIdFields","invariant","length","otherIdFields","parentFkName","parentPKName","otherModel","otherField","otherFkName","otherPKName","joinTable","flattenCompoundUniqueFilters","filter","compoundUniques","u","flattenedResult","restFilter","some","assign","flattenedKeys","restKeys","AND","ensureArray","Array","isArray","extractIdFields","entity","extractFields","getDiscriminatorField","delegateAttr","attributes","attr","discriminator","args","arg","ExpressionUtils","isField","getDelegateDescendantModels","collected","Set","subModels","baseModel","forEach","has","add","aggregate","eb","expr","op","match","with","fn","count","sum","avg","min","max","exhaustive","stripAlias","node","AliasNode","is","alias","extractModelName","innerNode","TableNode","table","identifier","extractFieldName","ReferenceNode","ColumnNode","column","createId","cuid2","clone","enumerate","invariant","isPlainObject","default","cuid1","createQueryId","expressionBuilder","sql","nanoid","match","ulid","uuid","NUMERIC_FIELD_TYPES","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","TransactionIsolationLevel","CRUD","CRUD_EXT","match","invariant","Decimal","sql","match","z","DbNullClass","__brand","DbNull","JsonNullClass","JsonNull","AnyNullClass","AnyNull","enumerate","invariant","isPlainObject","expressionBuilder","sql","match","P","BaseCrudDialect","eb","expressionBuilder","schema","options","transformPrimitive","value","_type","_forArrayField","transformOutput","buildSelectModel","model","modelAlias","modelDef","requireModel","result","selectFrom","joinBase","baseModel","buildDelegateJoin","buildFilterSortTake","args","query","where","buildFilter","negateOrderBy","skip","take","undefined","buildSkipTake","buildOrderBy","orderBy","distinct","ensureArray","supportsDistinctOn","distinctOn","map","f","ref","createNotSupportedError","provider","type","cursor","buildCursorFilter","true","false","_where","flattenCompoundUniqueFilters","key","payload","Object","entries","startsWith","isLogicalCombinator","and","buildCompositeFilter","fieldDef","requireField","relation","buildRelationFilter","fieldRef","originModel","array","buildArrayFilter","buildPrimitiveFilter","_orderBy","makeDefaultOrderBy","orderByItems","flatMap","obj","subQueryAlias","cursorFilter","filters","i","length","andFilters","j","field","order","_order","op","push","select","or","LOGICAL_COMBINATORS","includes","match","with","enumerate","subPayload","not","exhaustive","buildToOneRelationFilter","buildToManyRelationFilter","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","fk","is","joinAlias","joinPairs","buildJoinPairs","filterResultField","joinSelect","left","right","fn","count","lit","as","conditions","isNot","relationModel","relationFilterSelectAlias","buildPkFkWhereRefs","m2m","getManyToManyRelation","modelIdFields","requireIdFields","invariant","relationIdFields","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","createInvalidInputError","isEnum","buildEnumFilter","isTypeDef","buildJsonFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","receiver","filter","some","k","buildPlainJsonFilter","buildTypedJsonFilter","path","jsonReceiver","buildJsonPathSelection","stringReceiver","cast","mode","buildJsonValueFilterClause","buildJsonStringFilter","buildJsonArrayFilter","typeDefName","buildTypedJsonArrayFilter","buildTypeJsonNonArrayFilter","makeExistsPred","buildJsonArrayExistsPredicate","elem","makeExistsNegatedPred","typeDef","requireTypeDef","fields","fieldReceiver","_receiver","sql","lhs","DbNullClass","JsonNullClass","AnyNullClass","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","prepStringCasing","escapedValue","escapeLikePattern","buildStringLike","operation","pattern","replace","insensitive","supportsILike","getStringCasingBehavior","raw","v","negated","buildFieldRef","forEach","index","negateSort","sort","nulls","ob","dir","asc","desc","nullsFirst","nullsLast","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","isRelationField","shouldOmitField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","buildModelSelect","selectAllFields","fieldModel","alias","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","selections","reduce","acc","fieldCountQuery","innerJoin","otherPKName","parentPKName","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","computed","computer","computedFields","createConfigError","canJoinWithoutNestedSelect","isDelegate","PostgresCrudDialect","BaseCrudDialect","isoDateSchema","z","iso","datetime","local","offset","schema","options","provider","transformPrimitive","value","type","forArrayField","undefined","JsonNullClass","DbNullClass","AnyNullClass","invariant","isTypeDef","JSON","stringify","Array","isArray","map","v","match","with","Date","toISOString","toString","otherwise","transformOutput","transformOutputDate","transformOutputBytes","transformOutputBigInt","transformDecimal","BigInt","Decimal","safeParse","success","hasOffset","endsWith","test","fixPostgresTimezone","getTime","getTimezoneOffset","Buffer","isBuffer","Uint8Array","from","startsWith","slice","buildRelationSelection","query","model","relationField","parentAlias","payload","relationResultName","joinedQuery","buildRelationJSON","select","qb","resultName","relationFieldDef","requireField","relationModel","leftJoinLateral","eb","relationSelectName","relationModelDef","requireModel","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","subQuery","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","parentResultName","objArgs","buildRelationObjectArgs","array","fn","coalesce","sql","descendantModels","getDelegateDescendantModels","push","subModel","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","omit","Object","entries","fields","filter","relation","shouldOmitField","field","fieldRef","subJson","buildCountJson","fieldDef","fieldValue","include","result","selectInclude","isRelationField","forEach","buildSkipTake","skip","take","limit","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","buildJsonPathSelection","receiver","path","val","buildJsonArrayFilter","lhs","operation","exhaustive","buildJsonArrayExistsPredicate","buildFilter","exists","supportInsertWithDefault","getFieldSqlType","createInternalError","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","invariant","Decimal","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","JsonNullClass","DbNullClass","AnyNullClass","invariant","schema","typeDefs","JSON","stringify","Array","isArray","map","v","match","with","Date","toISOString","toString","Buffer","from","otherwise","transformOutput","transformOutputJson","transformOutputBoolean","transformOutputDate","transformOutputBytes","transformOutputDecimal","transformOutputBigInt","Decimal","BigInt","isBuffer","Uint8Array","parse","e","createInternalError","cause","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","selectModelAlias","selectModelQuery","objArgs","descendantModels","getDelegateDescendantModels","length","push","subModel","sql","lit","DELEGATE_JOINED_FIELD_PREFIX","name","ref","flatMap","omit","Object","entries","fields","filter","relation","shouldOmitField","field","fieldRef","subJson","buildCountJson","fieldDef","include","array","fn","coalesce","join","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","where","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","buildJsonPathSelection","receiver","path","val","buildJsonArrayFilter","lhs","operation","createNotSupportedError","exhaustive","buildJsonArrayExistsPredicate","buildFilter","exists","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","supportInsertWithDefault","getFieldSqlType","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","BaseOperationHandler","dialect","client","model","inputValidator","getCrudDialect","schema","$options","$schema","options","kysely","$qb","withClient","hasPolicyEnabled","plugins","some","plugin","name","requireModel","getModel","requireField","field","getField","exists","filter","readUnique","where","select","makeIdSelect","read","args","query","buildSelectModel","buildFilterSortTake","buildFieldSelection","buildSelectAllFields","omit","include","modifyEnd","makeContextComment","operation","result","compiled","getExecutor","compileQuery","toOperationNode","createQueryId","r","executeQuery","rows","err","createDBQueryError","sql","parameters","take","selectOrInclude","parentAlias","payload","Object","entries","buildCountSelection","fieldDef","relation","buildSelectField","array","optional","createInternalError","originModel","buildRelationSelection","eb","buildCountJson","as","create","data","fromRelation","creatingForDelegate","returnFields","modelDef","isDelegate","createNotSupportedError","createFields","updateParent","undefined","m2m","getManyToManyRelation","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","parentFkFields","buildFkAssignments","ids","assign","entity","fk","pk","parentUpdates","postCreateRelations","value","isScalarField","isForeignKeyField","Array","isArray","set","transformPrimitive","type","subM2M","fields","references","fkValues","processOwnedRelationForCreate","i","length","subPayload","baseModel","baseCreateResult","processBaseModelCreate","remainingFields","updatedData","fillGeneratedAndDefaultValues","requireIdFields","insertInto","$if","keys","qb","defaultValues","values","returning","createdEntity","executeQueryTakeFirst","processNoneOwnedRelationForCreate","handleManyToManyRelation","otherModel","otherField","joinTable","forModel","thisCreateFields","forEach","discriminatorField","getDiscriminatorField","invariant","baseEntity","idValues","extractIdFields","relationField","pair","extraRead","action","leftModel","leftField","leftEntity","rightModel","rightField","rightEntity","sortedRecords","sort","a","b","localeCompare","firstIds","secondIds","A","B","onConflict","oc","columns","doNothing","execute","expressionBuilder","deleteFrom","resetManyToManyRelation","parentIds","parentId","parentFkName","relationModel","created","getIdValues","referencedPkFields","extractedFks","extractFields","relationEntity","fieldsToSelectObject","createNotFoundError","found","createInvalidInputError","contextModel","relationFieldName","parentEntity","relationFieldDef","fromRelationContext","item","enumerate","createMany","connectRelation","input","returnData","fieldsToReturn","count","relationKeyPairs","createData","map","newItem","supportInsertWithDefault","allPassedFields","reduce","acc","includes","push","default","skipDuplicates","processBaseModelCreateMany","remainingFieldRows","Number","numAffectedRows","createRows","thisCreateRows","baseEntities","clone","generated","evalGenerator","updatedAt","Date","v","JSON","parse","defaultValue","ExpressionUtils","isCall","firstArgVal","isLiteral","match","function","with","version","cuid2","cuid1","formatGeneratedValue","v7","v4","nanoid","ulid","otherwise","isMember","receiver","val","$auth","member","members","formatExpr","replace","update","allowRelationUpdate","throwIfNotFound","parentWhere","fromEntity","fromRelationFieldDef","opposite","combinedWhere","AND","finalData","autoUpdatedFields","fieldName","thisEntity","getEntityIds","needIdRead","isIdFilter","readResult","baseUpdateResult","processBaseModelUpdate","key","updateFields","processScalarFieldUpdateData","processRelationUpdates","hasFieldUpdate","f","updateTable","buildFilter","updatedEntity","isNumericIncrementalUpdate","transformIncrementalUpdate","transformScalarListUpdate","isNumericField","idFields","every","thisUpdateFields","fieldRef","ensureArray","NUMERIC_FIELD_TYPES","_context","updateMany","limit","filterModel","isRelationField","shouldFallbackToIdFilter","supportsUpdateWithLimit","resultFromBaseModel","baseResult","processBaseModelUpdateMany","refTuple","buildIdFieldRefs","finalQuery","dynamic","ref","fieldModel","connectOrCreateRelation","disconnectRelation","setRelation","_item","updated","deleteRelation","_data","normalizeRelationManipulationInput","results","d","target","and","or","updateResult","existing","disconnectConditions","condition","relationFilter","fromEntries","targetExists","fkConditions","not","throwForNotFound","deleteConditions","expectedDeleteCount","deleteResult","deleteFromModel","delete","OR","flattenCompoundUniqueFilters","processBaseModelDelete","needIdFilter","supportsDeleteWithLimit","processDelegateRelationDelete","oppositeModelDef","oppositeRelation","onDelete","trimResult","needReturnRelations","returnRelation","K","safeTransaction","callback","isolationLevel","isTransaction","txBuilder","transaction","setIsolationLevel","TransactionIsolationLevel","ReadCommitted","uniqueFilter","normalizeArgs","newArgs","doNormalizeArgs","isPlainObject","_operation","compile","executeQueryTakeFirstOrThrow","ORMError","ORMErrorReason","NOT_FOUND","mutationNeedsReadBack","needReadBack","selectedFields","allFields","relationFields","computedFields","computed","allFieldsSelected","shouldOmitField","k","AggregateOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateAggregateArgs","model","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","buildFilter","selectedFields","key","value","Object","entries","startsWith","filter","field","val","forEach","includes","push","length","buildSelectField","select","lit","as","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","orderBy","cast","fn","countAll","count","ref","match","with","sum","avg","max","min","exhaustive","result","executeQuery","ret","rows","parts","split","op","slice","join","fieldDef","getField","schema","type","parseFloat","parseInt","BigInt","otherwise","CountOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateCountArgs","model","subQueryName","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","buildFilter","select","key","value","Object","entries","buildSelectField","lit","as","buildSkipTake","skip","take","keys","map","cast","fn","countAll","count","ref","result","executeQuery","rows","match","CreateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runCreate","inputValidator","validateCreateArgs","model","runCreateMany","validateCreateManyArgs","runCreateManyAndReturn","validateCreateManyAndReturnArgs","exhaustive","needReadBack","selectedFields","mutationNeedsReadBack","result","safeTransaction","tx","createResult","create","data","undefined","readUnique","select","include","omit","where","getIdValues","schema","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","count","createMany","kysely","read","OR","map","item","match","DeleteOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runDelete","inputValidator","validateDeleteArgs","model","runDeleteMany","validateDeleteManyArgs","exhaustive","needReadBack","selectedFields","mutationNeedsReadBack","result","safeTransaction","tx","preDeleteRead","undefined","readUnique","select","include","omit","where","deleteResult","delete","rows","length","createNotFoundError","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","limit","count","FindOperationHandler","BaseOperationHandler","handle","operation","args","validateArgs","normalizedArgs","normalizeArgs","findOne","parsedArgs","inputValidator","validateFindArgs","model","unique","take","result","read","client","$qb","finalResult","match","GroupByOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateGroupByArgs","model","query","kysely","selectFrom","where","dialect","buildFilter","fieldRef","field","bys","by","groupBy","map","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","orderBy","having","select","as","key","value","Object","entries","eb","cast","fn","countAll","forEach","val","count","aggregate","result","executeQuery","rows","row","postProcessRow","ret","parts","split","length","op","slice","join","fieldDef","getField","schema","type","parseFloat","match","with","parseInt","BigInt","otherwise","match","UpdateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runUpdate","inputValidator","validateUpdateArgs","model","runUpdateMany","validateUpdateManyArgs","runUpdateManyAndReturn","validateUpdateManyAndReturnArgs","runUpsert","validateUpsertArgs","exhaustive","needReadBack","selectedFields","result","safeTransaction","tx","updateResult","update","where","data","undefined","readFilter","readBackResult","readUnique","select","include","omit","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","updateMany","limit","read","OR","map","item","getIdValues","schema","length","mutationResult","create","baseResult","mutationNeedsReadBack","modelDef","requireModel","nonRelationFields","Object","entries","fields","filter","_","def","relation","name","keys","some","field","includes","enumerate","invariant","Decimal","stableStringify","match","P","z","fromError","formatError","error","fromError","toString","invariant","Decimal","match","P","z","ZodIssueCode","getArgValue","expr","ExpressionUtils","isLiteral","undefined","value","addStringValidation","schema","attributes","length","result","attr","match","name","with","min","args","max","startsWith","endsWith","includes","pattern","regex","RegExp","email","datetime","url","trim","toLowerCase","toUpperCase","addNumberValidation","val","gt","gte","lt","lte","addBigIntValidation","BigInt","addDecimalValidation","addExtraValidation","z","ZodString","superRefine","v","ctx","Decimal","err","addIssue","code","ZodIssueCode","custom","message","transform","refine","op","base","number","error","safeParse","toNumber","issues","forEach","issue","too_small","origin","minimum","type","inclusive","too_big","maximum","addListValidation","otherwise","addCustomValidation","attrs","filter","a","pathExpr","path","isArray","items","map","e","getLiteralValue","applyValidation","options","data","Boolean","evalExpression","kind","item","evalField","evalMember","evalUnary","evalBinary","evalCall","exhaustive","field","operand","Error","left","right","Array","some","every","receiver","member","members","fieldArg","function","f","invariant","P","union","search","caseInsensitive","matcher","x","y","test","fn","string","success","createNotSupportedError","schemaCache","WeakMap","InputValidator","client","schema","$schema","options","$options","extraValidationsEnabled","validateInput","validateFindArgs","model","args","validate","makeFindSchema","validateCreateArgs","undefined","makeCreateSchema","validateCreateManyArgs","makeCreateManySchema","validateCreateManyAndReturnArgs","makeCreateManyAndReturnSchema","validateUpdateArgs","makeUpdateSchema","validateUpdateManyArgs","makeUpdateManySchema","validateUpdateManyAndReturnArgs","makeUpdateManyAndReturnSchema","validateUpsertArgs","makeUpsertSchema","validateDeleteArgs","makeDeleteSchema","validateDeleteManyArgs","makeDeleteManySchema","validateCountArgs","makeCountSchema","validateAggregateArgs","makeAggregateSchema","validateGroupByArgs","makeGroupBySchema","getSchemaCache","cacheKey","thisCache","get","Map","set","setSchemaCache","operation","getSchema","stableStringify","type","error","data","safeParse","createInvalidInputError","formatError","cause","fields","where","makeWhereSchema","unique","optional","makeSelectSchema","nullable","makeIncludeSchema","makeOmitSchema","makeSkipSchema","findOne","z","literal","makeTakeSchema","orArray","makeOrderBySchema","makeCursorSchema","makeDistinctSchema","result","strictObject","refineForSelectIncludeMutuallyExclusive","refineForSelectOmitMutuallyExclusive","makeScalarSchema","attributes","typeDefs","makeTypeDefSchema","enums","makeEnumSchema","match","with","addStringValidation","string","addNumberValidation","number","int","boolean","union","addBigIntValidation","bigint","addDecimalValidation","instanceof","Decimal","date","iso","datetime","Uint8Array","makeJsonValueSchema","otherwise","unknown","key","name","enumDef","getEnum","invariant","enum","Object","keys","values","typeDef","getTypeDef","looseObject","fromEntries","entries","map","field","def","fieldSchema","array","nullish","finalSchema","any","superRefine","value","ctx","parseResult","success","issues","forEach","issue","addIssue","withoutRelationFields","withAggregations","modelDef","requireModel","fieldDef","requireField","relation","lazy","nullableIf","some","every","none","is","isNot","length","makeEnumFilterSchema","makeArrayFilterSchema","isTypeDefType","makeTypedJsonFilterSchema","makePrimitiveFilterSchema","uniqueFields","getUniqueFields","uniqueField","object","defs","never","custom","v","baseWhere","createInternalError","required","refine","candidates","fieldSchemas","fieldName","push","recursiveSchema","makeJsonFilterSchema","null","baseSchema","components","makeCommonPrimitiveFilterComponents","equals","has","hasEvery","hasSome","isEmpty","makeStringFilterSchema","P","makeNumberFilterSchema","makeBooleanFilterSchema","makeDateTimeFilterSchema","makeBytesFilterSchema","exhaustive","forFilter","JsonNullClass","DbNullClass","AnyNullClass","record","valueSchema","path","not","string_contains","string_starts_with","string_ends_with","mode","makeStringModeSchema","array_contains","array_starts_with","array_ends_with","makeCommonPrimitiveFilterSchema","makeThis","supportedOperators","commonAggSchema","notEquals","in","notIn","lt","lte","gt","gte","includes","_count","_avg","_sum","_min","_max","extractFields","startsWith","endsWith","contains","providerSupportsCaseSensitivity","makeRelationSelectIncludeSchema","_countSchema","makeCountSelectionSchema","toManyRelations","filter","select","reduce","acc","objSchema","include","omit","orderBy","skip","take","cursor","distinct","allowQueryTimeOmitOverride","withRelation","WithAggregation","sort","relationOrderBy","extend","nulls","aggregationFields","agg","nonRelationFields","dataSchema","makeCreateDataSchema","makeCreateManyDataSchema","base","canBeArray","withoutFields","uncheckedVariantFields","checkedVariantFields","hasRelation","f","computed","isDelegateDiscriminator","excludeFields","oppositeField","opposite","oppositeFieldDef","makeRelationManipulationSchema","allFksOptional","fkDef","fieldHasDefaultValue","references","addListValidation","foreignKeyFor","uncheckedCreateSchema","addCustomValidation","checkedCreateSchema","originModel","discriminatorField","getDiscriminatorField","fieldType","create","connect","makeConnectDataSchema","connectOrCreate","makeConnectOrCreateDataSchema","makeDisconnectDataSchema","makeDeleteRelationDataSchema","makeUpdateDataSchema","upsertWhere","update","makeSetDataSchema","toManyRelation","uniqueFilter","whereSchema","createSchema","skipDuplicates","limit","nonnegative","isNumericField","increment","decrement","multiply","divide","arraySchema","uncheckedUpdateSchema","checkedUpdateSchema","makeCountAggregateInputSchema","_all","makeSumAvgInputSchema","makeMinMaxInputSchema","bySchema","by","having","makeHavingSchema","bys","val","AGGREGATE_OPERATORS","onlyAggregationFields","LOGICAL_COMBINATORS","enumerate","NUMERIC_FIELD_TYPES","provider","ZenStackDriver","WeakSet","WeakMap","driver","log","init","Error","then","catch","err","undefined","Promise","reject","acquireConnection","connection","has","add","releaseConnection","beginTransaction","settings","result","set","commitTransaction","callbacks","get","delete","callback","console","error","rollbackTransaction","destroy","isLevelEnabled","executeQuery","streamQuery","dis","compiledQuery","caughtError","startTime","performanceNow","call","chunkSize","level","query","queryDurationMillis","isStream","isTransactionConnection","registerTransactionCommitCallback","push","performance","now","Date","invariant","AndNode","createQueryId","DefaultQueryExecutor","DeleteQueryNode","InsertQueryNode","ReturningNode","SelectionNode","SingleConnectionProvider","TableNode","UpdateQueryNode","WhereNode","match","invariant","AliasNode","ColumnNode","ColumnUpdateNode","expressionBuilder","ExpressionWrapper","FromNode","IdentifierNode","OperationNodeTransformer","PrimitiveValueListNode","ReferenceNode","SelectAllNode","SelectionNode","TableNode","ValueListNode","ValueNode","ValuesNode","QueryNameMapper","OperationNodeTransformer","modelToTableMap","Map","fieldToColumnMap","scopes","schema","modelName","modelDef","Object","entries","models","mappedName","getMappedName","set","fieldDef","getModelFields","name","transformSelectQuery","node","from","froms","processedFroms","map","processSelectTable","processedJoins","withScopes","scope","joins","join","table","i","on","transformNode","undefined","selections","processSelectQuerySelections","baseResult","FromNode","create","f","transformInsertQuery","into","model","extractModelName","invariant","withScope","values","columns","processEnumMappingForColumns","processTableRef","isOperationNode","value","transformReturning","kind","processSelections","transformReference","ColumnNode","is","column","resolveFieldFromScopes","identifier","namesMapped","mappedFieldName","mapFieldName","mappedTableName","alias","IdentifierNode","mapTableName","ReferenceNode","createTableNode","transformColumn","transformBinaryOperation","leftOperand","ValueNode","rightOperand","PrimitiveValueListNode","columnNode","resolvedScope","valueNode","resultValue","processEnumMappingForValue","processEnumMappingForValues","transformUpdateQuery","innerTable","stripAlias","TableNode","updates","update","origColumn","ColumnUpdateNode","wrapAlias","transformDeleteQuery","innerNode","selection","processedSelections","SelectAllNode","requireCurrentScope","push","createSelectAllFields","originalField","transformSelection","transformed","extractFieldName","AliasNode","SelectionNode","fieldName","enumProcessedSelections","processEnumSelection","qualifier","length","getModel","some","pushScope","fn","pop","forEach","s","tableSchema","getTableSchema","def","mapAttr","attributes","find","attr","nameArg","args","arg","field","get","tableName","hasMappedColumns","keys","key","startsWith","finalAlias","provider","type","defaultSchema","schemaAttr","requireModel","columnName","columnRef","aliased","fields","filter","relation","computed","originModel","result","processed","processSelectAll","Array","isArray","processSelection","addAlias","modelUsesEnumWithMappedValues","transformSelectAll","enumProcessed","schemaName","createWithSchema","enumDef","getEnum","getEnumValueMapping","mapping","ValuesNode","valueItems","ValueListNode","getField","isEnum","enumValueMapping","mappedValue","fieldScope","aliasName","eb","expressionBuilder","caseBuilder","case","caseWhen","when","ExpressionWrapper","then","finalExpr","else","cast","end","as","toOperationNode","ZenStackQueryExecutor","DefaultQueryExecutor","nameMapper","client","driver","compiler","adapter","connectionProvider","plugins","suppressMutationHooks","$schema","provider","type","schemaHasMappedNames","QueryNameMapper","schema","hasMapAttr","decl","attributes","some","attr","name","Object","values","fields","field","models","typeDefs","kysely","$qb","options","$options","executeQuery","compiledQuery","queryParams","$raw","parameters","undefined","provideConnection","connection","startedTx","isMutationNode","query","isTransactionConnection","beginTransaction","isolationLevel","TransactionIsolationLevel","ReadCommitted","result","proceedQueryWithKyselyInterceptors","queryId","commitTransaction","err","rollbackTransaction","ORMError","createDBQueryError","sql","queryNode","proceed","q","proceedQuery","hooks","plugin","onKyselyQuery","push","bind","hook","_proceed","_p","hookResult","getMutationInfo","model","getMutationModel","action","where","match","when","InsertQueryNode","is","UpdateQueryNode","node","DeleteQueryNode","exhaustive","compiled","hasEntityMutationPlugins","finalQuery","processNameMapping","compileQuery","internalExecuteQuery","hasEntityMutationPluginsWithAfterMutationHooks","returning","ReturningNode","create","SelectionNode","createSelectAll","currentlyInTx","connectionClient","createClientForConnection","mutationInfo","beforeMutationEntities","loadBeforeMutationEntities","loadEntities","callBeforeMutationHooks","callAfterMutationHooks","registerTransactionCommitCallback","transformNode","inTx","innerExecutor","withConnectionProvider","SingleConnectionProvider","innerClient","withExecutor","forceTransaction","onEntityMutation","afterEntityMutation","withPlugin","withPlugins","withPluginAtFront","withoutPlugins","newExecutor","invariant","into","table","identifier","tableNode","stripAlias","TableNode","from","froms","length","otherwise","createInternalError","beforeEntityMutation","queryResult","filterFor","runAfterMutationWithinTransaction","mutationModel","loadAfterMutationEntities","rows","selectQuery","selectFrom","selectAll","selectQueryNode","toOperationNode","andNodes","createQueryId","condition1","condition2","WhereNode","AndNode","invariant","lowerCaseFirst","upperCaseFirst","sql","ValueNode","match","contains","eb","args","context","textMatch","search","_eb","_args","Error","startsWith","endsWith","dialect","method","field","caseInsensitive","undefined","casingBehavior","getStringCasingBehavior","caseInsensitiveValue","readBoolean","op","fieldExpr","searchExpr","supportsILike","likeCaseSensitive","fn","escapedSearch","sql","match","with","lit","exhaustive","raw","has","hasEvery","hasSome","isEmpty","buildArrayLength","now","currentModel","model","result","casing","processCasing","currentOperation","operation","opNode","toOperationNode","invariant","ValueNode","is","value","toUpperCase","toLowerCase","upperCaseFirst","lowerCaseFirst","otherwise","expr","defaultValue","invariant","sql","toposort","match","SchemaDbPusher","schema","kysely","push","transaction","execute","tx","enums","provider","type","name","enumDef","Object","entries","enumValues","fields","values","map","f","mapAttr","attributes","find","a","args","mappedName","ExpressionUtils","getLiteralValue","value","invariant","createEnum","createType","asEnum","models","filter","m","isView","sortedModels","sortModels","modelDef","createTable","createModelTable","graph","model","added","baseModel","baseDef","requireModel","field","relation","references","targetModel","undefined","toposort","reverse","table","getTableName","ifNotExists","fieldName","fieldDef","originModel","id","addForeignKeyConstraint","isComputedField","createModelField","baseModelDef","idFields","cb","onDelete","onUpdate","addPrimaryKeyConstraint","addUniqueConstraint","getColumnName","some","length","key","uniqueFields","unique","keys","fDef","addColumn","mapFieldType","col","primaryKey","default","isCall","function","defaultTo","sql","optional","array","notNull","isAutoIncrement","autoIncrement","ref","isCustomType","result","match","with","otherwise","Error","raw","typeDefs","def","relationModelDef","mapCascadeAction","action","exhaustive","createZenStackPromise","callback","promise","cb","txClient","valueToPromise","err","Promise","reject","then","onFulfilled","onRejected","catch","finally","onFinally","Symbol","toStringTag","thing","resolve","ResultProcessor","dialect","schema","options","getCrudDialect","processResult","data","model","args","result","doProcessResult","fixReversedResult","Array","isArray","forEach","row","i","processRow","key","value","Object","entries","undefined","JSON","parse","startsWith","DELEGATE_JOINED_FIELD_PREFIX","subRow","transformOutput","subModel","slice","length","idValues","getIdValues","values","some","v","processedSubRow","assign","fieldDef","getField","array","relation","processRelation","processFieldValue","type","relationData","take","reverse","selectInclude","include","select","ensureArray","field","ZenStackClient","schema","options","ClientImpl","kysely","kyselyRaw","$options","$schema","kyselyProps","auth","baseClient","executor","functions","BuiltinFunctions","ZenStackQueryExecutor","driver","dialect","createQueryCompiler","createAdapter","DefaultConnectionProvider","ZenStackDriver","createDriver","Log","log","compiler","adapter","connectionProvider","config","Kysely","DefaultQueryExecutor","createClientProxy","$qb","$qbRaw","isTransaction","withExecutor","$transaction","input","invariant","Array","isArray","every","p","then","cb","interactiveTransaction","sequentialTransaction","forceTransaction","Transaction","callback","txBuilder","transaction","isolationLevel","setIsolationLevel","execute","tx","txClient","arg","result","promise","push","$procedures","Object","keys","procedures","reduce","acc","name","args","handleProc","createConfigError","procOptions","Error","apply","$connect","connection","conn","executeQuery","sql","compile","$disconnect","destroy","$pushSchema","SchemaDbPusher","$use","plugin","newPlugins","plugins","newOptions","$unuse","pluginId","id","$unuseAll","$setAuth","undefined","newClient","$auth","$setOptions","$setInputValidation","enable","validateInput","$executeRaw","query","values","createZenStackPromise","Number","numAffectedRows","$executeRawUnsafe","compiledQuery","createRawCompiledQuery","$queryRaw","rows","$queryRawUnsafe","q","CompiledQuery","raw","$raw","client","inputValidator","InputValidator","resultProcessor","ResultProcessor","Proxy","get","target","prop","receiver","startsWith","Reflect","model","models","find","m","toLowerCase","createModelCrudHandler","createPromise","operation","nominalOperation","handler","postProcess","throwIfNoResult","proceed","_args","_handler","withClient","r","handle","createNotFoundError","processResult","onQuery","_proceed","nextArgs","findUnique","FindOperationHandler","findUniqueOrThrow","findFirst","findFirstOrThrow","findMany","create","CreateOperationHandler","createMany","createManyAndReturn","update","UpdateOperationHandler","updateMany","updateManyAndReturn","upsert","delete","DeleteOperationHandler","deleteMany","count","CountOperationHandler","aggregate","AggregateOperationHandler","groupBy","GroupByOperationHandler","definePlugin","plugin","OperationNodeVisitor","DefaultOperationNodeVisitor","OperationNodeVisitor","defaultVisit","node","Object","values","forEach","value","Array","isArray","el","kind","visitNode","visitSelectQuery","visitSelection","visitColumn","visitAlias","visitTable","visitFrom","visitReference","visitAnd","visitOr","visitValueList","visitParens","visitJoin","visitRaw","visitWhere","visitInsertQuery","visitDeleteQuery","visitReturning","visitCreateTable","visitAddColumn","visitColumnDefinition","visitDropTable","visitOrderBy","visitOrderByItem","visitGroupBy","visitGroupByItem","visitUpdateQuery","visitColumnUpdate","visitLimit","visitOffset","visitOnConflict","visitOnDuplicateKey","visitCheckConstraint","visitDataType","visitSelectAll","visitIdentifier","visitSchemableIdentifier","visitValue","visitPrimitiveValueList","visitOperator","visitCreateIndex","visitDropIndex","visitList","visitPrimaryKeyConstraint","visitUniqueConstraint","visitReferences","visitWith","visitCommonTableExpression","visitCommonTableExpressionName","visitHaving","visitCreateSchema","visitDropSchema","visitAlterTable","visitDropColumn","visitRenameColumn","visitAlterColumn","visitModifyColumn","visitAddConstraint","visitDropConstraint","visitForeignKeyConstraint","visitCreateView","visitDropView","visitGenerated","visitDefaultValue","visitOn","visitValues","visitSelectModifier","visitCreateType","visitDropType","visitExplain","visitDefaultInsertValue","visitAggregateFunction","visitOver","visitPartitionBy","visitPartitionByItem","visitSetOperation","visitBinaryOperation","visitUnaryOperation","visitUsing","visitFunction","visitCase","visitWhen","visitJSONReference","visitJSONPath","visitJSONPathLeg","visitJSONOperatorChain","visitTuple","visitMergeQuery","visitMatched","visitAddIndex","visitCast","visitFetch","visitTop","visitOutput","visitRenameConstraint","visitRefreshMaterializedView","visitOrAction","visitCollate","match","ExpressionVisitor","visit","expr","match","with","kind","e","visitLiteral","visitArray","visitField","visitMember","visitBinary","visitUnary","visitCall","visitThis","visitNull","exhaustive","_e","item","items","result","abort","receiver","l","left","right","operand","arg","args","r","MatchingExpressionVisitor","found","predicate","find"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/client-impl.ts","../src/client/crud/operations/aggregate.ts","../src/client/query-utils.ts","../src/schema.ts","../src/utils/object-utils.ts","../src/client/executor/error-processor.ts","../src/client/errors.ts","../src/client/crud/operations/base.ts","../src/client/constants.ts","../src/client/contract.ts","../src/client/crud/dialects/index.ts","../src/client/crud/dialects/postgresql.ts","../src/common-types.ts","../src/client/crud/dialects/base-dialect.ts","../src/client/crud/dialects/sqlite.ts","../src/client/crud/operations/count.ts","../src/client/crud/operations/create.ts","../src/client/crud/operations/delete.ts","../src/client/crud/operations/find.ts","../src/client/crud/operations/exists.ts","../src/client/crud/operations/group-by.ts","../src/client/crud/operations/update.ts","../src/client/crud/validator/index.ts","../src/utils/zod-utils.ts","../src/client/crud/validator/utils.ts","../src/client/executor/zenstack-driver.ts","../src/client/executor/zenstack-query-executor.ts","../src/client/executor/name-mapper.ts","../src/client/functions.ts","../src/client/helpers/schema-db-pusher.ts","../src/client/promise.ts","../src/client/result-processor.ts","../src/client/plugin.ts","../src/utils/kysely-utils.ts","../src/utils/schema-utils.ts"],"sourcesContent":["import { invariant } from '@zenstackhq/common-helpers';\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 type { ProcedureDef, SchemaDef } from '../schema';\nimport type { AnyKysely } from '../utils/kysely-utils';\nimport type { UnwrapTuplePromises } from '../utils/type-utils';\nimport type {\n AuthType,\n ClientConstructor,\n ClientContract,\n ModelOperations,\n TransactionIsolationLevel,\n} from './contract';\nimport { AggregateOperationHandler } from './crud/operations/aggregate';\nimport type { AllCrudOperation, CoreCrudOperation } 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 { FindOperationHandler } from './crud/operations/find';\nimport { ExistsOperationHandler } from './crud/operations/exists';\nimport { GroupByOperationHandler } from './crud/operations/group-by';\nimport { UpdateOperationHandler } from './crud/operations/update';\nimport { InputValidator } from './crud/validator';\nimport { createConfigError, createNotFoundError } 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 { RuntimePlugin } from './plugin';\nimport { createZenStackPromise, type ZenStackPromise } from './promise';\nimport { ResultProcessor } from './result-processor';\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\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 // 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 } 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 this.kysely = new Kysely(this.kyselyProps);\n\n return createClientProxy(this);\n }\n\n get $qb() {\n return this.kysely;\n }\n\n get $qbRaw() {\n return this.kyselyRaw;\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<SchemaDef, 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 async sequentialTransaction(\n arg: ZenStackPromise<SchemaDef, 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 result.push(await promise.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 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 inputValidator = new InputValidator(this as any);\n const validatedInput = 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: RuntimePlugin<SchemaDef>) {\n // tsc perf\n const newPlugins: RuntimePlugin<SchemaDef>[] = [...(this.$options.plugins ?? []), plugin];\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl(this.schema, newOptions, this);\n }\n\n $unuse(pluginId: string) {\n // tsc perf\n const newPlugins: RuntimePlugin<SchemaDef>[] = [];\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 return new ClientImpl(this.schema, newOptions, this);\n }\n\n $unuseAll() {\n // tsc perf\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n plugins: [] as RuntimePlugin<SchemaDef>[],\n };\n return new ClientImpl(this.schema, newOptions, this);\n }\n\n $setAuth(auth: AuthType<SchemaDef> | undefined) {\n if (auth !== undefined && typeof auth !== 'object') {\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 return new ClientImpl(this.schema, options as ClientOptions<SchemaDef>, this) as unknown as ClientContract<\n SchemaDef,\n Options\n >;\n }\n\n $setInputValidation(enable: boolean) {\n const newOptions: ClientOptions<SchemaDef> = {\n ...this.options,\n validateInput: enable,\n };\n return new ClientImpl(this.schema, newOptions, this);\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 inputValidator = new InputValidator(client as any);\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 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 return createModelCrudHandler(client as any, model, inputValidator, resultProcessor);\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as unknown as ClientImpl;\n}\n\nfunction createModelCrudHandler(\n client: ClientContract<any>,\n model: string,\n inputValidator: InputValidator<any>,\n resultProcessor: ResultProcessor<any>,\n): ModelOperations<any, any> {\n const createPromise = (\n operation: CoreCrudOperation,\n nominalOperation: AllCrudOperation,\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 const _handler = txClient ? handler.withClient(txClient) : handler;\n const r = await _handler.handle(operation, _args);\n if (!r && throwIfNoResult) {\n throw createNotFoundError(model);\n }\n let result: unknown;\n if (r && postProcess) {\n result = resultProcessor.processResult(r, model, args);\n } else {\n result = r ?? null;\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 onQuery({\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 }) as Promise<unknown>;\n }\n }\n\n return proceed(args);\n });\n };\n\n // type parameters to operation handlers are explicitly specified to improve tsc performance\n return {\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 );\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 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 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 } as ModelOperations<any, any>;\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\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(subQuery, this.model, this.model, parsedArgs.orderBy, negateOrderBy);\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) => eb.cast(eb.fn.countAll(), 'integer').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 eb.cast(eb.fn.countAll(), 'integer').as(`_count._all`),\n );\n } else {\n query = query.select((eb) =>\n eb\n .cast(eb.fn.count(eb.ref(`$sub.${field}` as any)), 'integer')\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 any)).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 { invariant } from '@zenstackhq/common-helpers';\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 { ExpressionUtils, type FieldDef, type GetModels, type ModelDef, type SchemaDef } from '../schema';\nimport { extractFields } from '../utils/object-utils';\nimport type { AGGREGATE_OPERATORS } from './constants';\nimport type { OrderBy } from './crud-types';\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\nexport function getModel(schema: SchemaDef, model: string) {\n return Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());\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\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 extends SchemaDef>(schema: SchemaDef, model: string) {\n const idFields = requireIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(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 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: AGGREGATE_OPERATORS) {\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","export * from '@zenstackhq/schema';\nexport type { OperandExpression } from 'kysely';\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 * 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 { createId as cuid2 } from '@paralleldrive/cuid2';\nimport { clone, enumerate, invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport { default as cuid1 } from 'cuid';\nimport {\n createQueryId,\n DeleteResult,\n expressionBuilder,\n sql,\n UpdateResult,\n type Compilable,\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 { BuiltinType, Expression, FieldDef } from '../../../schema';\nimport { ExpressionUtils, type GetModels, type ModelDef, type SchemaDef } from '../../../schema';\nimport type { AnyKysely } from '../../../utils/kysely-utils';\nimport { extractFields, fieldsToSelectObject } 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 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\nexport type CoreCrudOperation =\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\nexport type AllCrudOperation = CoreCrudOperation | 'findUniqueOrThrow' | 'findFirstOrThrow';\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: CoreCrudOperation, 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.constructor.name === 'PolicyPlugin');\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('$t'))\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>, 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>, 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.transformPrimitive(\n value.set,\n fieldDef.type as BuiltinType,\n true,\n );\n } else {\n createFields[field] = this.dialect.transformPrimitive(\n value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\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 const query = kysely\n .insertInto(model)\n .$if(Object.keys(updatedData).length === 0, (qb) => qb.defaultValues())\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 const createdEntity = await this.executeQueryTakeFirst(kysely, query, 'create');\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 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] = 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 rightEntity: any,\n joinTable: string,\n ): Promise<Action extends 'connect' ? UpdateResult | undefined : DeleteResult | undefined> {\n const sortedRecords = [\n {\n model: leftModel,\n field: leftField,\n entity: leftEntity,\n },\n {\n model: rightModel,\n field: rightField,\n entity: rightEntity,\n },\n ].sort((a, b) =>\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 a.model !== b.model ? a.model.localeCompare(b.model) : a.field.localeCompare(b.field),\n );\n\n const firstIds = requireIdFields(this.schema, sortedRecords[0]!.model);\n const secondIds = requireIdFields(this.schema, sortedRecords[1]!.model);\n invariant(firstIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(secondIds.length === 1, 'many-to-many relation must have exactly one id field');\n\n // Prisma's convention for many-to-many: fk fields are named \"A\" and \"B\"\n if (action === 'connect') {\n const result = await kysely\n .insertInto(joinTable as any)\n .values({\n A: sortedRecords[0]!.entity[firstIds[0]!],\n B: sortedRecords[1]!.entity[secondIds[0]!],\n } as any)\n .onConflict((oc) => oc.columns(['A', 'B'] as any).doNothing())\n .execute();\n return result[0] as any;\n } else {\n const eb = expressionBuilder<any, any>();\n const result = await kysely\n .deleteFrom(joinTable as any)\n .where(eb(`${joinTable}.A`, '=', sortedRecords[0]!.entity[firstIds[0]!]))\n .where(eb(`${joinTable}.B`, '=', sortedRecords[1]!.entity[secondIds[0]!]))\n .execute();\n return result[0] as any;\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 let 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 = 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.transformPrimitive(value, fieldDef.type as BuiltinType, !!fieldDef.array);\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.supportInsertWithDefault) {\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.transformPrimitive(\n fieldDef.default,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\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) => qb.onConflict((oc) => oc.doNothing()))\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 const result = await query.returning(fieldsToReturn as any).execute();\n return result as Result;\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] = forModel;\n thisCreateRows.push(thisCreateFields);\n remainingFieldRows.push(remainingFields);\n }\n\n // create base model entity\n const baseEntities = await this.createMany(\n kysely,\n model as GetModels<Schema>,\n { data: thisCreateRows, skipDuplicates },\n true,\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.transformPrimitive(\n generated,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n );\n }\n } else if (fieldDef?.updatedAt) {\n // TODO: should this work at kysely level instead?\n values[field] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\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.transformPrimitive(\n value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n );\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 .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 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: any = {};\n let m2m: ReturnType<typeof getManyToManyRelation> = undefined;\n\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 as GetModels<Schema>, {\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\n let combinedWhere: WhereInput<Schema, GetModels<Schema>, false> = where ?? {};\n if (Object.keys(parentWhere).length > 0) {\n combinedWhere = Object.keys(combinedWhere).length > 0 ? { AND: [parentWhere, combinedWhere] } : parentWhere;\n }\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) {\n if (finalData === data) {\n finalData = clone(data);\n }\n finalData[fieldName] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\n autoUpdatedFields.push(fieldName);\n }\n }\n\n // read pre-update entity with ids so that the caller can use it to identify\n // the entity being updated, the read data is used as return value if no update\n // is made to the entity\n const thisEntity = await this.getEntityIds(kysely, model, combinedWhere);\n if (!thisEntity) {\n if (throwIfNotFound) {\n throw createNotFoundError(model);\n } else {\n return null;\n }\n }\n\n if (Object.keys(finalData).length === 0) {\n return thisEntity;\n }\n\n let needIdRead = false;\n if (modelDef.baseModel && !this.isIdFilter(model, combinedWhere)) {\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 is not ready an id filter, and and use it as the\n // update filter instead\n needIdRead = true;\n }\n\n if (needIdRead) {\n const readResult = await this.readUnique(kysely, model, {\n where: combinedWhere,\n select: this.makeIdSelect(model),\n });\n if (!readResult && throwIfNotFound) {\n throw createNotFoundError(model);\n }\n combinedWhere = readResult;\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 // only fields not consumed by base update will be used for this model\n finalData = baseUpdateResult.remainingFields;\n // base update may change entity ids, update the filter\n combinedWhere = baseUpdateResult.baseEntity;\n\n // update this entity with fields in updated base\n if (baseUpdateResult.baseEntity) {\n for (const [key, value] of Object.entries(baseUpdateResult.baseEntity)) {\n if (key in thisEntity) {\n thisEntity[key] = value;\n }\n }\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 const parentUpdates = await this.processRelationUpdates(\n kysely,\n model,\n field,\n fieldDef,\n thisEntity,\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 thisEntity;\n } else {\n fieldsToReturn = fieldsToReturn ?? requireIdFields(this.schema, model);\n const query = kysely\n .updateTable(model)\n .where(() => this.dialect.buildFilter(model, model, combinedWhere))\n .set(updateFields)\n .returning(fieldsToReturn as any)\n .modifyEnd(\n this.makeContextComment({\n model,\n operation: 'update',\n }),\n );\n\n const updatedEntity = await this.executeQueryTakeFirst(kysely, query, 'update');\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 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.transformPrimitive(data[field], fieldDef.type as BuiltinType, !!fieldDef.array);\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 isIdFilter(model: string, filter: any) {\n if (!filter || typeof filter !== 'object') {\n return false;\n }\n const idFields = requireIdFields(this.schema, model);\n return idFields.length === Object.keys(filter).length && idFields.every((field) => field in filter);\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 );\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.transformPrimitive(payload[key!], fieldDef.type as BuiltinType, false);\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.transformPrimitive(payload[key!], fieldDef.type as BuiltinType, true);\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 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 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 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 resultFromBaseModel: any = undefined;\n if (modelDef.baseModel) {\n const baseResult = await this.processBaseModelUpdateMany(\n kysely,\n modelDef.baseModel,\n where,\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 query = kysely.updateTable(model).set(updateFields);\n\n if (!shouldFallbackToIdFilter) {\n // simple filter\n query = query\n .where(() => this.dialect.buildFilter(model, model, where))\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 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 ),\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 const finalQuery = query.returning(fieldsToReturn as any);\n const result = await this.executeQuery(kysely, finalQuery, 'update');\n return result.rows as Result;\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 };\n await this.update(kysely, fieldModel, item.where, item.data, fromRelationContext, false, false);\n }\n break;\n }\n\n case 'delete': {\n await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, true);\n break;\n }\n\n case 'deleteMany': {\n await this.deleteRelation(kysely, fieldModel, value, fromRelationContext, 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\n const results: (unknown | undefined)[] = [];\n for (const d of _data) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n throw createNotFoundError(model);\n }\n const r = await this.handleManyToManyRelation(\n kysely,\n 'connect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel!,\n m2m.otherField!,\n ids,\n m2m.joinTable,\n );\n results.push(r);\n }\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw createNotFoundError(model);\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) =>\n eb.and(keyPairs.map(({ fk, pk }) => eb(eb.ref(fk as any), '=', fromRelation.ids[pk]))),\n )\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 {\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\n for (const d of disconnectConditions) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n // not found\n return;\n }\n await this.handleManyToManyRelation(\n kysely,\n 'disconnect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel,\n m2m.otherField,\n ids,\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 // connect new entities\n const results: (unknown | undefined)[] = [];\n for (const d of _data) {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n throw createNotFoundError(model);\n }\n results.push(\n await this.handleManyToManyRelation(\n kysely,\n 'connect',\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n m2m.otherModel,\n m2m.otherField,\n ids,\n m2m.joinTable,\n ),\n );\n }\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw createNotFoundError(model);\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 throwForNotFound: boolean,\n ) {\n let deleteConditions: any[] = [];\n let expectedDeleteCount: number;\n if (typeof data === 'boolean') {\n if (data === false) {\n return;\n } else {\n deleteConditions = [true];\n expectedDeleteCount = 1;\n }\n } else {\n deleteConditions = this.normalizeRelationManipulationInput(model, data);\n if (deleteConditions.length === 0) {\n return;\n }\n expectedDeleteCount = deleteConditions.length;\n }\n\n let deleteResult: QueryResult<unknown>;\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 > deleteResult.rows.length) {\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 let query = kysely.deleteFrom(model).returning(fieldsToReturn as any);\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 if (!needIdFilter) {\n query = query.where(() => this.dialect.buildFilter(model, model, where));\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 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 ),\n );\n }\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 await this.processDelegateRelationDelete(kysely, modelDef, where, limit);\n\n query = query.modifyEnd(this.makeContextComment({ model, operation: 'delete' }));\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 // 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 /**\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 if (this.hasPolicyEnabled) {\n // TODO: refactor this check\n // policy enforcement always requires read back\n return { needReadBack: true, selectedFields: undefined };\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: undefined };\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: undefined };\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: undefined };\n } else {\n return { needReadBack: false, selectedFields: allFieldsSelected };\n }\n }\n}\n","/**\n * The comment prefix for annotation generated Kysely queries with context information.\n */\nexport 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 AGGREGATE_OPERATORS = ['_count', '_sum', '_avg', '_min', '_max'] as const;\nexport type AGGREGATE_OPERATORS = (typeof AGGREGATE_OPERATORS)[number];\n","import {\n type FieldIsArray,\n type GetModels,\n type GetTypeDefs,\n type IsDelegateModel,\n type ProcedureDef,\n type RelationFields,\n type RelationFieldType,\n type SchemaDef,\n} from '../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 AggregateArgs,\n AggregateResult,\n BatchResult,\n CountArgs,\n CountResult,\n CreateArgs,\n CreateManyAndReturnArgs,\n CreateManyArgs,\n DefaultModelResult,\n DeleteArgs,\n DeleteManyArgs,\n ExistsArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n GetProcedureNames,\n GroupByArgs,\n GroupByResult,\n ProcedureFunc,\n SelectSubset,\n SimplifiedPlainResult,\n Subset,\n TypeDefResult,\n UpdateArgs,\n UpdateManyAndReturnArgs,\n UpdateManyArgs,\n UpsertArgs,\n} from './crud-types';\nimport type { ClientOptions, QueryOptions, ToQueryOptions } from './options';\nimport type { RuntimePlugin } from './plugin';\nimport type { ZenStackPromise } from './promise';\nimport type { ToKysely } from './query-builder';\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 * ZenStack client interface.\n */\nexport type ClientContract<Schema extends SchemaDef, Options extends ClientOptions<Schema> = ClientOptions<Schema>> = {\n /**\n * The schema definition.\n */\n readonly $schema: Schema;\n\n /**\n * The client options.\n */\n readonly $options: Options;\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<Schema, 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<Schema, 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<Schema, 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<Schema, T>;\n\n /**\n * The current user identity.\n */\n get $auth(): AuthType<Schema> | undefined;\n\n /**\n * Sets the current user identity.\n */\n $setAuth(auth: AuthType<Schema> | undefined): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with new options applied.\n * @example\n * ```\n * const dbNoValidation = db.$setOptions({ ...db.$options, validateInput: false });\n * ```\n */\n $setOptions<Options extends ClientOptions<Schema>>(options: Options): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client enabling/disabling input validations expressed with attributes like\n * `@email`, `@regex`, `@@validate`, etc.\n *\n * @deprecated Use `$setOptions` instead.\n */\n $setInputValidation(enable: boolean): ClientContract<Schema, Options>;\n\n /**\n * The Kysely query builder instance.\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 $transaction<T>(\n callback: (tx: Omit<ClientContract<Schema, Options>, TransactionUnsupportedMethods>) => Promise<T>,\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<T>;\n\n /**\n * Starts a sequential transaction.\n */\n $transaction<P extends ZenStackPromise<Schema, any>[]>(\n arg: [...P],\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<UnwrapTuplePromises<P>>;\n\n /**\n * Returns a new client with the specified plugin installed.\n */\n $use(plugin: RuntimePlugin<Schema>): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with the specified plugin removed.\n */\n $unuse(pluginId: string): ClientContract<Schema, Options>;\n\n /**\n * Returns a new client with all plugins removed.\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 * Pushes the schema to the database. For testing purposes only.\n * @private\n */\n $pushSchema(): Promise<void>;\n} & {\n [Key in GetModels<Schema> as Uncapitalize<Key>]: ModelOperations<Schema, Key, ToQueryOptions<Options>>;\n} & ProcedureOperations<Schema>;\n\n/**\n * The contract for a client in a transaction.\n */\nexport type TransactionClientContract<Schema extends SchemaDef, Options extends ClientOptions<Schema>> = Omit<\n ClientContract<Schema, Options>,\n TransactionUnsupportedMethods\n>;\n\nexport type ProcedureOperations<Schema extends SchemaDef> =\n Schema['procedures'] extends Record<string, ProcedureDef>\n ? {\n /**\n * Custom procedures.\n */\n $procs: {\n [Key in GetProcedureNames<Schema>]: 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\nexport type AllModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n Options extends QueryOptions<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 FindManyArgs<Schema, Model>>(\n args?: SelectSubset<T, FindManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options> | null>;\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 FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 FindFirstArgs<Schema, Model>>(\n args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options> | null>;\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 FindFirstArgs<Schema, Model>>(\n args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 CreateArgs<Schema, Model>>(\n args: SelectSubset<T, CreateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 CreateManyArgs<Schema, Model>>(\n args?: SelectSubset<T, CreateManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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<T extends CreateManyAndReturnArgs<Schema, Model>>(\n args?: SelectSubset<T, CreateManyAndReturnArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 UpdateArgs<Schema, Model>>(\n args: SelectSubset<T, UpdateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 UpdateManyArgs<Schema, Model>>(\n args: Subset<T, UpdateManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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<T extends UpdateManyAndReturnArgs<Schema, Model>>(\n args: Subset<T, UpdateManyAndReturnArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>[]>;\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 UpsertArgs<Schema, Model>>(\n args: SelectSubset<T, UpsertArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 DeleteArgs<Schema, Model>>(\n args: SelectSubset<T, DeleteArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, SimplifiedPlainResult<Schema, Model, T, Options>>;\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 DeleteManyArgs<Schema, Model>>(\n args?: Subset<T, DeleteManyArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, BatchResult>;\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 CountArgs<Schema, Model>>(\n args?: Subset<T, CountArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<CountResult<Schema, Model, T>>>;\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 AggregateArgs<Schema, Model>>(\n args: Subset<T, AggregateArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<AggregateResult<Schema, Model, T>>>;\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 GroupByArgs<Schema, Model>>(\n args: Subset<T, GroupByArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, Simplify<GroupByResult<Schema, Model, T>>>;\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 ExistsArgs<Schema, Model>>(\n args?: Subset<T, ExistsArgs<Schema, Model>>,\n ): ZenStackPromise<Schema, boolean>;\n};\n\nexport type OperationsIneligibleForDelegateModels = 'create' | 'createMany' | 'createManyAndReturn' | 'upsert';\n\nexport type ModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n Options extends QueryOptions<Schema> = QueryOptions<Schema>,\n> = Omit<\n AllModelOperations<Schema, Model, Options>,\n // exclude operations not applicable to delegate models\n IsDelegateModel<Schema, Model> extends true ? OperationsIneligibleForDelegateModels : never\n>;\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 { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base-dialect';\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 .exhaustive();\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n type SqlBool,\n} from 'kysely';\nimport { parse as parsePostgresArray } from 'postgres-array';\nimport { match } from 'ts-pattern';\nimport z from 'zod';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport { createInternalError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getEnum,\n getManyToManyRelation,\n isEnum,\n isRelationField,\n isTypeDef,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n private isoDateSchema = z.iso.datetime({ local: true, offset: true });\n\n constructor(schema: Schema, options: ClientOptions<Schema>) {\n super(schema, options);\n }\n\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(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 // 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 }\n if (isEnum(this.schema, type)) {\n // cast to enum array `CAST(ARRAY[...] AS \"enum_type\"[])`\n return this.eb.cast(\n sql`ARRAY[${sql.join(\n value.map((v) => this.transformPrimitive(v, type, false)),\n sql.raw(','),\n )}]`,\n this.createSchemaQualifiedEnumType(type, true),\n );\n } else {\n // `Json[]` fields need their input as array (not stringified)\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .with('Json', () => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n // postgres requires simple JSON values to be stringified\n return JSON.stringify(value);\n } else {\n return value;\n }\n })\n .otherwise(() => value);\n }\n }\n\n private createSchemaQualifiedEnumType(type: string, array: boolean) {\n // determines the postgres schema name for the enum type, and returns the\n // qualified name\n\n let qualified = type;\n\n const enumDef = getEnum(this.schema, type);\n if (enumDef) {\n // check if the enum has a custom \"@@schema\" attribute\n const schemaAttr = enumDef.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 const schemaName = mapArg.value.value as string;\n qualified = `\"${schemaName}\".\"${type}\"`;\n }\n } else {\n // no custom schema, use default from datasource or 'public'\n const defaultSchema = this.schema.provider.defaultSchema ?? 'public';\n qualified = `\"${defaultSchema}\".\"${type}\"`;\n }\n }\n\n return array ? sql.raw(`${qualified}[]`) : sql.raw(qualified);\n }\n\n override transformOutput(value: unknown, type: BuiltinType, array: boolean) {\n if (value === null || value === undefined) {\n return value;\n }\n return match(type)\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Decimal', () => this.transformDecimal(value))\n .when(\n (type) => isEnum(this.schema, type),\n () => this.transformOutputEnum(value, array),\n )\n .otherwise(() => super.transformOutput(value, type, array));\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 // PostgreSQL's jsonb_build_object serializes timestamp as ISO 8601 strings\n // without timezone, (e.g., \"2023-01-01T12:00:00.123456\"). Since Date is always\n // stored as UTC `timestamp` type, we add 'Z' to explicitly mark them as UTC for\n // correct Date object creation.\n if (this.isoDateSchema.safeParse(value).success) {\n const hasOffset = value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value);\n return new Date(hasOffset ? value : `${value}Z`);\n } else {\n return value;\n }\n } else if (value instanceof Date && this.options.fixPostgresTimezone !== false) {\n // SPECIAL NOTES:\n // node-pg has a terrible quirk that it returns the date value in local timezone\n // as a `Date` object although for `DateTime` field the data in DB is stored in UTC\n // see: https://github.com/brianc/node-postgres/issues/429\n return new Date(value.getTime() - value.getTimezoneOffset() * 60 * 1000);\n } else {\n return value;\n }\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 override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const relationResultName = `${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>, 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 = `${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 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>, 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 return eb.fn\n .coalesce(sql`jsonb_agg(jsonb_build_object(${sql.join(objArgs)}))`, sql`'[]'::jsonb`)\n .as('$data');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$data');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationModelAlias: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentResultName: string,\n ) {\n const relationModelDef = requireModel(this.schema, relationModel);\n const objArgs: Array<\n string | ExpressionWrapper<any, any, any> | SelectQueryBuilder<any, any, any> | RawBuilder<any>\n > = [];\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, relationModelAlias, 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 as GetModels<Schema>,\n eb,\n relationModelAlias,\n value,\n );\n return [sql.lit(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 [sql.lit(field), fieldValue];\n }\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field]) => [\n sql.lit(field),\n // reference the synthesized JSON field\n eb.ref(`${parentResultName}$${field}.$data`),\n ])\n .flatMap((v) => v),\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>, true>,\n parentResultName: string,\n ) {\n let result = query;\n if (typeof payload === 'object') {\n const selectInclude = payload.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 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 return this.eb.fn(\n 'jsonb_build_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n );\n }\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 buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number> {\n return this.eb.fn('array_length', [array]);\n }\n\n override buildArrayLiteralSQL(values: unknown[]): string {\n if (values.length === 0) {\n return '{}';\n } else {\n return `ARRAY[${values.map((v) => (typeof v === 'string' ? `'${v}'` : v))}]`;\n }\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 return match(operation)\n .with('array_contains', () => {\n const v = Array.isArray(value) ? value : [value];\n return sql<SqlBool>`${lhs} @> ${sql.val(JSON.stringify(v))}::jsonb`;\n })\n .with('array_starts_with', () =>\n this.eb(\n this.eb.fn('jsonb_extract_path', [lhs, this.eb.val('0')]),\n '=',\n this.transformPrimitive(value, 'Json', false),\n ),\n )\n .with('array_ends_with', () =>\n this.eb(\n this.eb.fn('jsonb_extract_path', [lhs, sql`(jsonb_array_length(${lhs}) - 1)::text`]),\n '=',\n this.transformPrimitive(value, 'Json', false),\n ),\n )\n .exhaustive();\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('$t'))\n .where(buildFilter(this.eb.ref('$items.value'))),\n );\n }\n\n override get supportInsertWithDefault() {\n return true;\n }\n\n override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw createInternalError('Cannot get SQL type of a relation field');\n }\n\n let result: string;\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are treated as text\n result = 'text';\n } else {\n result = match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'bigint')\n .with('Float', () => 'double precision')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'timestamp')\n .with('Bytes', () => 'bytea')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text');\n }\n\n if (fieldDef.array) {\n result += '[]';\n }\n\n return result;\n }\n\n override getStringCasingBehavior() {\n // Postgres `LIKE` is case-sensitive, `ILIKE` is case-insensitive\n return { supportsILike: true, likeCaseSensitive: true };\n }\n}\n","export type JsonValue = string | number | boolean | JsonObject | JsonArray;\nexport type JsonObject = { [key: string]: JsonValue | null };\nexport type JsonArray = ReadonlyArray<JsonValue | null>;\nexport type JsonNullValues = DbNull | JsonNull | AnyNull;\n\nexport class DbNullClass {\n // @ts-ignore\n private __brand = 'DbNull' as const;\n}\nexport const DbNull = new DbNullClass();\nexport type DbNull = typeof DbNull;\n\nexport class JsonNullClass {\n // @ts-ignore\n private __brand = 'JsonNull' as const;\n}\nexport const JsonNull = new JsonNullClass();\nexport type JsonNull = typeof JsonNull;\n\nexport class AnyNullClass {\n // @ts-ignore\n private __brand = 'AnyNull' as const;\n}\nexport const AnyNull = new AnyNullClass();\nexport type AnyNull = typeof AnyNull;\n","import { enumerate, invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport type { 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 { BuiltinType, DataSourceProviderType, FieldDef, GetModels, ModelDef, SchemaDef } from '../../../schema';\nimport type { OrArray } from '../../../utils/type-utils';\nimport { AGGREGATE_OPERATORS, 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 getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n isTypeDef,\n makeDefaultOrderBy,\n requireField,\n requireIdFields,\n requireModel,\n requireTypeDef,\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 transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean) {\n return value;\n }\n\n transformOutput(value: unknown, _type: BuiltinType, _array: boolean) {\n return value;\n }\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>, 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 // orderBy\n result = this.buildOrderBy(result, model, modelAlias, args.orderBy, negateOrderBy);\n\n // distinct\n if ('distinct' in args && (args as any).distinct) {\n const distinct = ensureArray((args as any).distinct) as string[];\n if (this.supportsDistinctOn) {\n result = result.distinctOn(distinct.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 if (args.cursor) {\n result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy, modelAlias);\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: FindArgs<Schema, GetModels<Schema>, true>['cursor'],\n orderBy: FindArgs<Schema, GetModels<Schema>, true>['orderBy'],\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 andFilters.push(\n this.eb(\n this.eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(model, subQueryAlias)\n .select(`${subQueryAlias}.${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 return match(key)\n .with('AND', () =>\n this.and(...enumerate(payload).map((subPayload) => this.buildFilter(model, modelAlias, subPayload))),\n )\n .with('OR', () =>\n this.or(...enumerate(payload).map((subPayload) => this.buildFilter(model, modelAlias, subPayload))),\n )\n .with('NOT', () => this.eb.not(this.buildCompositeFilter(model, modelAlias, 'AND', payload)))\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 = `${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 filterResultField = `${field}$filter`;\n\n const joinSelect = this.eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() =>\n this.and(...joinPairs.map(([left, right]) => this.eb(this.eb.ref(left), '=', this.eb.ref(right)))),\n )\n .select(() => this.eb.fn.count(this.eb.lit(1)).as(filterResultField));\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(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload.is)),\n '>',\n 0,\n ),\n );\n }\n }\n\n if ('isNot' in payload) {\n if (payload.isNot === null) {\n // check if found\n conditions.push(this.eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n // is null\n this.eb(joinSelect, '=', 0),\n // found one that matches the filter\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n this.eb(\n joinSelect.where(() => this.buildFilter(fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\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 = `${modelAlias}$${field}$filter`;\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 switch (key) {\n case 'some': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select(() => this.eb.fn.count(this.eb.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() => this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() =>\n this.eb.not(this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n result,\n this.eb(\n this.buildSelectModel(relationModel, relationFilterSelectAlias)\n .select(() => this.eb.fn.count(this.eb.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(this.eb))\n .where(() => this.buildFilter(relationModel, relationFilterSelectAlias, subPayload)),\n '=',\n 0,\n ),\n );\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 const value = this.transformPrimitive(_value, fieldType, !!fieldDef.array);\n\n switch (key) {\n case 'equals': {\n clauses.push(this.buildLiteralFilter(fieldRef, fieldType, this.eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(this.eb(fieldRef, '@>', this.eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(this.eb(fieldRef, '@>', this.eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(this.eb(fieldRef, '&&', this.eb.val(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 return this.buildJsonFilter(fieldRef, payload, fieldDef);\n }\n\n return match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(fieldRef, payload))\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.eb.cast(jsonReceiver, 'text');\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, '=', 'null');\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.eb.fn('trim', [this.eb.cast(fieldReceiver, 'text'), sql.lit('\"')]);\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([this.eb(lhs, '=', 'null'), this.eb(lhs, 'is not', null)]);\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, '=', 'null')]);\n } else {\n return this.buildLiteralFilter(lhs, 'Json', value);\n }\n }\n\n private buildLiteralFilter(lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return this.eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\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.buildLiteralFilter(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 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('not', () => this.eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (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>) {\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>),\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 // already consumed\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 '\\\\'`;\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.transformPrimitive(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.transformPrimitive(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.transformPrimitive(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.transformPrimitive(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 ) {\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 // aggregations\n if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n invariant(value && typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\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 as AGGREGATE_OPERATORS),\n this.negateSort(v, negated),\n );\n }\n continue;\n }\n\n switch (field) {\n case '_count': {\n invariant(value && typeof value === 'object', 'invalid orderBy value for field \"_count\"');\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn.count(buildFieldRef(model, k, modelAlias)),\n this.negateSort(v, negated),\n );\n }\n continue;\n }\n default:\n break;\n }\n\n const fieldDef = requireField(this.schema, model, field);\n\n if (!fieldDef.relation) {\n const fieldRef = buildFieldRef(model, field, modelAlias);\n if (value === 'asc' || value === 'desc') {\n result = result.orderBy(fieldRef, this.negateSort(value, negated));\n } else if (\n value &&\n typeof value === 'object' &&\n 'nulls' in value &&\n 'sort' in value &&\n (value.sort === 'asc' || value.sort === 'desc') &&\n (value.nulls === 'first' || value.nulls === 'last')\n ) {\n result = result.orderBy(fieldRef, (ob) => {\n const dir = this.negateSort(value.sort, negated);\n ob = dir === 'asc' ? ob.asc() : ob.desc();\n ob = value.nulls === 'first' ? ob.nullsFirst() : ob.nullsLast();\n return ob;\n });\n }\n } else {\n // order by relation\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 result = result.orderBy((eb) => {\n const subQueryAlias = `${modelAlias}$orderBy$${field}$count`;\n let subQuery = this.buildSelectModel(relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n ...joinPairs.map(([left, right]) =>\n eb(this.eb.ref(left), '=', this.eb.ref(right)),\n ),\n ),\n );\n subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n return subQuery;\n }, sort);\n }\n } else {\n // order by to-one relation\n const joinAlias = `${modelAlias}$orderBy$${index}`;\n result = result.leftJoin(`${relationModel} as ${joinAlias}`, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, joinAlias);\n return join.on((eb) =>\n this.and(\n ...joinPairs.map(([left, right]) => eb(this.eb.ref(left), '=', this.eb.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, relationModel, joinAlias, value, negated);\n }\n }\n }\n });\n\n return result;\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 const modelDef = requireModel(this.schema, model);\n let result = query;\n\n for (const field of Object.keys(modelDef.fields)) {\n if (isRelationField(this.schema, model, field)) {\n continue;\n }\n if (this.shouldOmitField(omit, model, field)) {\n continue;\n }\n result = this.buildSelectField(result, model, modelAlias, field);\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((eb) => {\n const jsonObject: Record<string, Expression<any>> = {};\n for (const field of Object.keys(subModel.fields)) {\n if (\n isRelationField(this.schema, subModel.name, field) ||\n isInheritedField(this.schema, subModel.name, field)\n ) {\n continue;\n }\n jsonObject[field] = eb.ref(`${subModel.name}.${field}`);\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 // options-level\n if (\n this.options.omit?.[model] &&\n typeof this.options.omit[model] === 'object' &&\n typeof (this.options.omit[model] as any)[field] === 'boolean'\n ) {\n return (this.options.omit[model] as any)[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>, 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 // 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, fieldModel, value as any, false)\n .innerJoin(m2m.joinTable, (join) =>\n join\n .onRef(`${m2m.joinTable}.${m2m.otherFkName}`, '=', `${fieldModel}.${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, fieldModel, 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, fieldModel);\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 private 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.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(): Expression<SqlBool> {\n return this.eb.lit<SqlBool>(this.transformPrimitive(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 computer = computedFields?.[fieldDef.originModel ?? model]?.[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>, 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 // #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>, 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>>): ExpressionWrapper<any, any, unknown>;\n\n /**\n * Builds an Kysely expression that returns the length of an array.\n */\n abstract buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number>;\n\n /**\n * Builds an array literal SQL string for the given values.\n */\n abstract buildArrayLiteralSQL(values: unknown[]): string;\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 supportInsertWithDefault(): boolean;\n\n /**\n * Gets the SQL column type for the given field definition.\n */\n abstract getFieldSqlType(fieldDef: FieldDef): string;\n\n /*\n * Gets the string casing behavior for the dialect.\n */\n abstract getStringCasingBehavior(): { supportsILike: boolean; likeCaseSensitive: boolean };\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 // #endregion\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n type SqlBool,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport { createInternalError, createNotSupportedError } from '../../errors';\nimport {\n getDelegateDescendantModels,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } 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 override transformPrimitive(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.transformPrimitive(v, type, false));\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .otherwise(() => value);\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 return match(type)\n .with('Boolean', () => this.transformOutputBoolean(value))\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('Decimal', () => this.transformOutputDecimal(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Json', () => this.transformOutputJson(value))\n .otherwise(() => super.transformOutput(value, type, array));\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 override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, 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>, 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 = `${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 = `${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 `${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 `${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 (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field, value]) => {\n const subJson = this.buildRelationJSON(\n relationModel,\n eb,\n field,\n `${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 return match(operation)\n .with('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 })\n .with('array_starts_with', () =>\n this.eb(this.eb.fn('json_extract', [lhs, this.eb.val('$[0]')]), '=', value),\n )\n .with('array_ends_with', () =>\n this.eb(sql`json_extract(${lhs}, '$[' || (json_array_length(${lhs}) - 1) || ']')`, '=', value),\n )\n .exhaustive();\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('$t'))\n .where(buildFilter(this.eb.ref('$items.value'))),\n );\n }\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 buildArrayLength(array: Expression<unknown>): ExpressionWrapper<any, any, number> {\n return this.eb.fn('json_array_length', [array]);\n }\n\n override buildArrayLiteralSQL(_values: unknown[]): string {\n throw new Error('SQLite does not support array literals');\n }\n\n override get supportInsertWithDefault() {\n return false;\n }\n\n override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw createInternalError('Cannot get SQL type of a relation field');\n }\n if (fieldDef.array) {\n throw createInternalError('SQLite does not support scalar list type');\n }\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are stored as text\n return 'text';\n }\n\n return (\n match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'integer')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'integer')\n .with('Float', () => 'real')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'numeric')\n .with('Bytes', () => 'blob')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text')\n );\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","import type { SchemaDef } from '../../../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 ? eb.cast(eb.fn.countAll(), 'integer').as('_all')\n : eb.cast(eb.fn.count(eb.ref(`${subQueryName}.${key}` as any)), 'integer').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) => eb.cast(eb.fn.countAll(), 'integer').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 { match } from 'ts-pattern';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { CreateArgs, CreateManyAndReturnArgs, CreateManyArgs, WhereInput } from '../../crud-types';\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: CreateArgs<Schema, GetModels<Schema>>) {\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 // TODO: avoid using transaction for simple create\n const result = await this.safeTransaction(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 WhereInput<\n Schema,\n GetModels<Schema>,\n false\n >,\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?: CreateManyArgs<Schema, GetModels<Schema>>) {\n if (args === undefined) {\n return { count: 0 };\n }\n return this.createMany(this.kysely, this.model, args, false);\n }\n\n private async runCreateManyAndReturn(args?: CreateManyAndReturnArgs<Schema, GetModels<Schema>>) {\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 // TODO: avoid using transaction for simple create\n return this.safeTransaction(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","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { DeleteArgs, DeleteManyArgs } from '../../crud-types';\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: DeleteArgs<Schema, Extract<keyof Schema['models'], string>>) {\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 // TODO: avoid using transaction for simple delete\n const result = await this.safeTransaction(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.rows.length === 0) {\n throw createNotFoundError(this.model);\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: DeleteManyArgs<Schema, Extract<keyof Schema['models'], string>> | undefined) {\n return await this.safeTransaction(async (tx) => {\n const result = await this.delete(tx, this.model, args?.where, args?.limit);\n return { count: result.rows.length };\n });\n }\n}\n","import type { GetModels, SchemaDef } from '../../../schema';\nimport type { FindArgs } from '../../crud-types';\nimport { BaseOperationHandler, type CoreCrudOperation } from './base';\n\nexport class FindOperationHandler<Schema extends SchemaDef> extends BaseOperationHandler<Schema> {\n async handle(operation: CoreCrudOperation, 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(this.model, normalizedArgs, {\n unique: operation === 'findUnique',\n findOne,\n })\n : (normalizedArgs as FindArgs<Schema, GetModels<Schema>, true> | undefined);\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 '../../../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 { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\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);\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) => eb.cast(eb.fn.countAll(), 'integer').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 eb.cast(eb.fn.countAll(), 'integer').as(`_count._all`),\n );\n } else {\n query = query.select((eb) =>\n eb.cast(eb.fn.count(fieldRef(field)), 'integer').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 { match } from 'ts-pattern';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { UpdateArgs, UpdateManyAndReturnArgs, UpdateManyArgs, UpsertArgs, WhereInput } from '../../crud-types';\nimport { createRejectedByPolicyError, RejectedByPolicyReason } from '../../errors';\nimport { getIdValues } 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: UpdateArgs<Schema, GetModels<Schema>>) {\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 const result = await this.safeTransaction(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 const readFilter = 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 as WhereInput<Schema, GetModels<Schema>, false>,\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\n private async runUpdateMany(args: UpdateManyArgs<Schema, GetModels<Schema>>) {\n // TODO: avoid using transaction for simple update\n return this.safeTransaction(async (tx) => {\n return this.updateMany(tx, this.model, args.where, args.data, args.limit, false);\n });\n }\n\n private async runUpdateManyAndReturn(args: UpdateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined) {\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 const { readBackResult, updateResult } = await this.safeTransaction(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 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 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: UpsertArgs<Schema, GetModels<Schema>>) {\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 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 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 // 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: undefined };\n }\n\n // upsert payload\n if (args.update && !Object.keys(args.update).some((field: string) => nonRelationFields.includes(field))) {\n return { needReadBack: true, selectedFields: undefined };\n }\n\n return baseResult;\n }\n}\n","import { enumerate, invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport stableStringify from 'json-stable-stringify';\nimport { match, P } from 'ts-pattern';\nimport { z, ZodType } from 'zod';\nimport { AnyNullClass, DbNullClass, JsonNullClass } from '../../../common-types';\nimport {\n type AttributeApplication,\n type BuiltinType,\n type EnumDef,\n type FieldDef,\n type GetModels,\n type ModelDef,\n type ProcedureDef,\n type SchemaDef,\n} from '../../../schema';\nimport { extractFields } from '../../../utils/object-utils';\nimport { formatError } from '../../../utils/zod-utils';\nimport { AGGREGATE_OPERATORS, LOGICAL_COMBINATORS, NUMERIC_FIELD_TYPES } from '../../constants';\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 { createInternalError, createInvalidInputError } from '../../errors';\nimport {\n fieldHasDefaultValue,\n getDiscriminatorField,\n getEnum,\n getTypeDef,\n getUniqueFields,\n isEnum,\n isTypeDef,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport {\n addBigIntValidation,\n addCustomValidation,\n addDecimalValidation,\n addListValidation,\n addNumberValidation,\n addStringValidation,\n} from './utils';\n\nconst schemaCache = new WeakMap<SchemaDef, Map<string, ZodType>>();\n\ntype GetSchemaFunc<Schema extends SchemaDef, Options> = (model: GetModels<Schema>, options: Options) => ZodType;\n\nexport class InputValidator<Schema extends SchemaDef> {\n constructor(private readonly client: ClientContract<Schema>) {}\n\n private get schema() {\n return this.client.$schema;\n }\n\n private get options() {\n return this.client.$options;\n }\n\n private get extraValidationsEnabled() {\n return this.client.$options.validateInput !== false;\n }\n\n validateProcedureInput(proc: string, input: unknown): unknown {\n const procDef = (this.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') {\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.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 private makeProcedureParamSchema(param: { type: string; array?: boolean; optional?: boolean }): z.ZodType {\n let schema: z.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 validateFindArgs(\n model: GetModels<Schema>,\n args: unknown,\n options: { unique: boolean; findOne: boolean },\n ): FindArgs<Schema, GetModels<Schema>, true> | undefined {\n return this.validate<\n FindArgs<Schema, GetModels<Schema>, true> | undefined,\n Parameters<typeof this.makeFindSchema>[1]\n >(model, 'find', options, (model, options) => this.makeFindSchema(model, options), args);\n }\n\n validateExistsArgs(model: GetModels<Schema>, args: unknown): ExistsArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<ExistsArgs<Schema, GetModels<Schema>>>(\n model,\n 'exists',\n undefined,\n (model) => this.makeExistsSchema(model),\n args,\n );\n }\n\n validateCreateArgs(model: GetModels<Schema>, args: unknown): CreateArgs<Schema, GetModels<Schema>> {\n return this.validate<CreateArgs<Schema, GetModels<Schema>>>(\n model,\n 'create',\n undefined,\n (model) => this.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 undefined,\n (model) => this.makeCreateManySchema(model),\n args,\n );\n }\n\n validateCreateManyAndReturnArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): CreateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<CreateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'createManyAndReturn',\n undefined,\n (model) => this.makeCreateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpdateArgs(model: GetModels<Schema>, args: unknown): UpdateArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateArgs<Schema, GetModels<Schema>>>(\n model,\n 'update',\n undefined,\n (model) => this.makeUpdateSchema(model),\n args,\n );\n }\n\n validateUpdateManyArgs(model: GetModels<Schema>, args: unknown): UpdateManyArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateManyArgs<Schema, GetModels<Schema>>>(\n model,\n 'updateMany',\n undefined,\n (model) => this.makeUpdateManySchema(model),\n args,\n );\n }\n\n validateUpdateManyAndReturnArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): UpdateManyAndReturnArgs<Schema, GetModels<Schema>> {\n return this.validate<UpdateManyAndReturnArgs<Schema, GetModels<Schema>>>(\n model,\n 'updateManyAndReturn',\n undefined,\n (model) => this.makeUpdateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpsertArgs(model: GetModels<Schema>, args: unknown): UpsertArgs<Schema, GetModels<Schema>> {\n return this.validate<UpsertArgs<Schema, GetModels<Schema>>>(\n model,\n 'upsert',\n undefined,\n (model) => this.makeUpsertSchema(model),\n args,\n );\n }\n\n validateDeleteArgs(model: GetModels<Schema>, args: unknown): DeleteArgs<Schema, GetModels<Schema>> {\n return this.validate<DeleteArgs<Schema, GetModels<Schema>>>(\n model,\n 'delete',\n undefined,\n (model) => this.makeDeleteSchema(model),\n args,\n );\n }\n\n validateDeleteManyArgs(\n model: GetModels<Schema>,\n args: unknown,\n ): DeleteManyArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<DeleteManyArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'deleteMany',\n undefined,\n (model) => this.makeDeleteManySchema(model),\n args,\n );\n }\n\n validateCountArgs(model: GetModels<Schema>, args: unknown): CountArgs<Schema, GetModels<Schema>> | undefined {\n return this.validate<CountArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'count',\n undefined,\n (model) => this.makeCountSchema(model),\n args,\n );\n }\n\n validateAggregateArgs(model: GetModels<Schema>, args: unknown): AggregateArgs<Schema, GetModels<Schema>> {\n return this.validate<AggregateArgs<Schema, GetModels<Schema>>>(\n model,\n 'aggregate',\n undefined,\n (model) => this.makeAggregateSchema(model),\n args,\n );\n }\n\n validateGroupByArgs(model: GetModels<Schema>, args: unknown): GroupByArgs<Schema, GetModels<Schema>> {\n return this.validate<GroupByArgs<Schema, GetModels<Schema>>>(\n model,\n 'groupBy',\n undefined,\n (model) => this.makeGroupBySchema(model),\n args,\n );\n }\n\n private getSchemaCache(cacheKey: string) {\n let thisCache = schemaCache.get(this.schema);\n if (!thisCache) {\n thisCache = new Map<string, ZodType>();\n schemaCache.set(this.schema, thisCache);\n }\n return thisCache.get(cacheKey);\n }\n\n private setSchemaCache(cacheKey: string, schema: ZodType) {\n let thisCache = schemaCache.get(this.schema);\n if (!thisCache) {\n thisCache = new Map<string, ZodType>();\n schemaCache.set(this.schema, thisCache);\n }\n return thisCache.set(cacheKey, schema);\n }\n\n private validate<T, Options = undefined>(\n model: GetModels<Schema>,\n operation: string,\n options: Options,\n getSchema: GetSchemaFunc<Schema, Options>,\n args: unknown,\n ) {\n const cacheKey = stableStringify({\n type: 'model',\n model,\n operation,\n options,\n extraValidationsEnabled: this.extraValidationsEnabled,\n });\n let schema = this.getSchemaCache(cacheKey!);\n if (!schema) {\n schema = getSchema(model, options);\n this.setSchemaCache(cacheKey!, schema);\n }\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 // #region Find\n\n private makeFindSchema(model: string, options: { unique: boolean; findOne: boolean }) {\n const fields: Record<string, z.ZodSchema> = {};\n const where = this.makeWhereSchema(model, options.unique);\n if (options.unique) {\n fields['where'] = where;\n } else {\n fields['where'] = where.optional();\n }\n\n fields['select'] = this.makeSelectSchema(model).optional().nullable();\n fields['include'] = this.makeIncludeSchema(model).optional().nullable();\n fields['omit'] = this.makeOmitSchema(model).optional().nullable();\n\n if (!options.unique) {\n fields['skip'] = this.makeSkipSchema().optional();\n if (options.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), true).optional();\n fields['cursor'] = this.makeCursorSchema(model).optional();\n fields['distinct'] = this.makeDistinctSchema(model).optional();\n }\n\n let result: ZodType = z.strictObject(fields);\n result = this.refineForSelectIncludeMutuallyExclusive(result);\n result = this.refineForSelectOmitMutuallyExclusive(result);\n\n if (!options.unique) {\n result = result.optional();\n }\n return result;\n }\n\n private makeExistsSchema(model: string) {\n return z\n .strictObject({\n where: this.makeWhereSchema(model, false).optional(),\n })\n .optional();\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 ? addStringValidation(z.string(), attributes) : z.string(),\n )\n .with('Int', () =>\n this.extraValidationsEnabled ? addNumberValidation(z.number().int(), attributes) : z.number().int(),\n )\n .with('Float', () =>\n this.extraValidationsEnabled ? addNumberValidation(z.number(), attributes) : z.number(),\n )\n .with('Boolean', () => z.boolean())\n .with('BigInt', () =>\n z.union([\n this.extraValidationsEnabled\n ? addNumberValidation(z.number().int(), attributes)\n : z.number().int(),\n this.extraValidationsEnabled ? addBigIntValidation(z.bigint(), attributes) : z.bigint(),\n ]),\n )\n .with('Decimal', () => {\n return z.union([\n this.extraValidationsEnabled ? addNumberValidation(z.number(), attributes) : z.number(),\n addDecimalValidation(z.instanceof(Decimal), attributes, this.extraValidationsEnabled),\n addDecimalValidation(z.string(), attributes, this.extraValidationsEnabled),\n ]);\n })\n .with('DateTime', () => z.union([z.date(), z.iso.datetime()]))\n .with('Bytes', () => z.instanceof(Uint8Array))\n .with('Json', () => this.makeJsonValueSchema(false, false))\n .otherwise(() => z.unknown());\n }\n }\n\n private makeEnumSchema(type: string) {\n const key = stableStringify({\n type: 'enum',\n name: type,\n });\n let schema = this.getSchemaCache(key!);\n if (schema) {\n return schema;\n }\n const enumDef = getEnum(this.schema, type);\n invariant(enumDef, `Enum \"${type}\" not found in schema`);\n schema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n this.setSchemaCache(key!, schema);\n return schema;\n }\n\n private makeTypeDefSchema(type: string): z.ZodType {\n const key = stableStringify({\n type: 'typedef',\n name: type,\n extraValidationsEnabled: this.extraValidationsEnabled,\n });\n let schema = this.getSchemaCache(key!);\n if (schema) {\n return schema;\n }\n const typeDef = getTypeDef(this.schema, type);\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n schema = z.looseObject(\n Object.fromEntries(\n Object.entries(typeDef.fields).map(([field, def]) => {\n let fieldSchema = 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.setSchemaCache(key!, finalSchema);\n return finalSchema;\n }\n\n private makeWhereSchema(\n model: string,\n unique: boolean,\n withoutRelationFields = false,\n withAggregations = false,\n ): ZodType {\n const modelDef = requireModel(this.schema, model);\n\n const fields: Record<string, any> = {};\n for (const field of Object.keys(modelDef.fields)) {\n const fieldDef = requireField(this.schema, model, field);\n let fieldSchema: ZodType | undefined;\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\n continue;\n }\n fieldSchema = z.lazy(() => this.makeWhereSchema(fieldDef.type, false).optional());\n\n // optional to-one relation allows null\n fieldSchema = this.nullableIf(fieldSchema, !fieldDef.array && !!fieldDef.optional);\n\n if (fieldDef.array) {\n // to-many relation\n fieldSchema = z.union([\n fieldSchema,\n z.strictObject({\n some: fieldSchema.optional(),\n every: fieldSchema.optional(),\n none: fieldSchema.optional(),\n }),\n ]);\n } else {\n // to-one relation\n fieldSchema = z.union([\n fieldSchema,\n z.strictObject({\n is: fieldSchema.optional(),\n isNot: fieldSchema.optional(),\n }),\n ]);\n }\n } else {\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 enumDef,\n !!fieldDef.optional,\n withAggregations,\n !!fieldDef.array,\n );\n }\n } else if (fieldDef.array) {\n // array field\n fieldSchema = this.makeArrayFilterSchema(fieldDef.type as BuiltinType);\n } else if (this.isTypeDefType(fieldDef.type)) {\n fieldSchema = this.makeTypedJsonFilterSchema(fieldDef.type, !!fieldDef.optional, !!fieldDef.array);\n } else {\n // primitive field\n fieldSchema = this.makePrimitiveFilterSchema(\n fieldDef.type as BuiltinType,\n !!fieldDef.optional,\n withAggregations,\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 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\n if (Object.keys(enumDef.values).length > 0) {\n fieldSchema = this.makeEnumFilterSchema(\n enumDef,\n !!def.optional,\n false,\n false,\n );\n } else {\n fieldSchema = z.never();\n }\n } else {\n // regular field\n fieldSchema = this.makePrimitiveFilterSchema(\n def.type as BuiltinType,\n !!def.optional,\n false,\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)),\n true,\n ).optional();\n fields['OR'] = z\n .lazy(() => this.makeWhereSchema(model, false, withoutRelationFields))\n .array()\n .optional();\n fields['NOT'] = this.orArray(\n z.lazy(() => this.makeWhereSchema(model, false, withoutRelationFields)),\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 return result;\n }\n\n private makeTypedJsonFilterSchema(type: string, optional: boolean, array: boolean) {\n const typeDef = getTypeDef(this.schema, type);\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n\n const candidates: z.ZodType[] = [];\n\n if (!array) {\n // fields filter\n const fieldSchemas: Record<string, z.ZodType> = {};\n for (const [fieldName, fieldDef] of Object.entries(typeDef.fields)) {\n if (this.isTypeDefType(fieldDef.type)) {\n // recursive typed JSON\n fieldSchemas[fieldName] = this.makeTypedJsonFilterSchema(\n fieldDef.type,\n !!fieldDef.optional,\n !!fieldDef.array,\n ).optional();\n } else {\n // enum, array, primitives\n const enumDef = getEnum(this.schema, fieldDef.type);\n if (enumDef) {\n fieldSchemas[fieldName] = this.makeEnumFilterSchema(\n enumDef,\n !!fieldDef.optional,\n false,\n !!fieldDef.array,\n ).optional();\n } else if (fieldDef.array) {\n fieldSchemas[fieldName] = this.makeArrayFilterSchema(fieldDef.type as BuiltinType).optional();\n } else {\n fieldSchemas[fieldName] = this.makePrimitiveFilterSchema(\n fieldDef.type as BuiltinType,\n !!fieldDef.optional,\n false,\n ).optional();\n }\n }\n }\n\n candidates.push(z.strictObject(fieldSchemas));\n }\n\n const recursiveSchema = z.lazy(() => this.makeTypedJsonFilterSchema(type, optional, false)).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));\n\n if (optional) {\n // allow null as well\n candidates.push(z.null());\n }\n\n // either plain json filter or field filters\n return z.union(candidates);\n }\n\n private isTypeDefType(type: string) {\n return this.schema.typeDefs && type in this.schema.typeDefs;\n }\n\n private makeEnumFilterSchema(enumDef: EnumDef, optional: boolean, withAggregations: boolean, array: boolean) {\n const baseSchema = z.enum(Object.keys(enumDef.values) as [string, ...string[]]);\n if (array) {\n return this.internalMakeArrayFilterSchema(baseSchema);\n }\n const components = this.makeCommonPrimitiveFilterComponents(\n baseSchema,\n optional,\n () => z.lazy(() => this.makeEnumFilterSchema(enumDef, optional, withAggregations, array)),\n ['equals', 'in', 'notIn', 'not'],\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n return z.union([this.nullableIf(baseSchema, optional), z.strictObject(components)]);\n }\n\n private makeArrayFilterSchema(type: BuiltinType) {\n return this.internalMakeArrayFilterSchema(this.makeScalarSchema(type));\n }\n\n private internalMakeArrayFilterSchema(elementSchema: ZodType) {\n return z.strictObject({\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\n private makePrimitiveFilterSchema(type: BuiltinType, optional: boolean, withAggregations: boolean) {\n return match(type)\n .with('String', () => this.makeStringFilterSchema(optional, withAggregations))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.makeNumberFilterSchema(this.makeScalarSchema(type), optional, withAggregations),\n )\n .with('Boolean', () => this.makeBooleanFilterSchema(optional, withAggregations))\n .with('DateTime', () => this.makeDateTimeFilterSchema(optional, withAggregations))\n .with('Bytes', () => this.makeBytesFilterSchema(optional, withAggregations))\n .with('Json', () => this.makeJsonFilterSchema(optional))\n .with('Unsupported', () => z.never())\n .exhaustive();\n }\n\n private makeJsonValueSchema(nullable: boolean, forFilter: boolean): z.ZodType {\n const options: z.ZodType[] = [z.string(), z.number(), z.boolean(), z.instanceof(JsonNullClass)];\n\n if (forFilter) {\n options.push(z.instanceof(DbNullClass));\n } else {\n if (nullable) {\n // for mutation, allow DbNull only if nullable\n options.push(z.instanceof(DbNullClass));\n }\n }\n\n if (forFilter) {\n options.push(z.instanceof(AnyNullClass));\n }\n\n const schema = z.union([\n ...options,\n z.lazy(() => z.union([this.makeJsonValueSchema(false, false), z.null()]).array()),\n z.record(\n z.string(),\n z.lazy(() => z.union([this.makeJsonValueSchema(false, false), z.null()])),\n ),\n ]);\n return this.nullableIf(schema, nullable);\n }\n\n private makeJsonFilterSchema(optional: boolean) {\n const valueSchema = this.makeJsonValueSchema(optional, true);\n return z.strictObject({\n path: z.string().optional(),\n equals: valueSchema.optional(),\n not: valueSchema.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: valueSchema.optional(),\n array_starts_with: valueSchema.optional(),\n array_ends_with: valueSchema.optional(),\n });\n }\n\n private makeDateTimeFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n z.union([z.iso.datetime(), z.date()]),\n optional,\n () => z.lazy(() => this.makeDateTimeFilterSchema(optional, withAggregations)),\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n }\n\n private makeBooleanFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n const components = this.makeCommonPrimitiveFilterComponents(\n z.boolean(),\n optional,\n () => z.lazy(() => this.makeBooleanFilterSchema(optional, withAggregations)),\n ['equals', 'not'],\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n );\n return z.union([this.nullableIf(z.boolean(), optional), z.strictObject(components)]);\n }\n\n private makeBytesFilterSchema(optional: boolean, withAggregations: boolean): 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 );\n return z.union([this.nullableIf(baseSchema, optional), z.strictObject(components)]);\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 ) {\n const commonAggSchema = () =>\n this.makeCommonPrimitiveFilterSchema(baseSchema, false, makeThis, undefined).optional();\n let result = {\n equals: this.nullableIf(baseSchema.optional(), optional),\n notEquals: 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 not: makeThis().optional(),\n ...(withAggregations?.includes('_count')\n ? { _count: this.makeNumberFilterSchema(z.number().int(), false, false).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 return result;\n }\n\n private makeCommonPrimitiveFilterSchema(\n baseSchema: ZodType,\n optional: boolean,\n makeThis: () => ZodType,\n withAggregations: Array<AGGREGATE_OPERATORS> | undefined = undefined,\n ): z.ZodType {\n return z.union([\n this.nullableIf(baseSchema, optional),\n z.strictObject(\n this.makeCommonPrimitiveFilterComponents(baseSchema, optional, makeThis, undefined, withAggregations),\n ),\n ]);\n }\n\n private makeNumberFilterSchema(baseSchema: ZodType, optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n baseSchema,\n optional,\n () => z.lazy(() => this.makeNumberFilterSchema(baseSchema, optional, withAggregations)),\n withAggregations ? ['_count', '_avg', '_sum', '_min', '_max'] : undefined,\n );\n }\n\n private makeStringFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return z.union([\n this.nullableIf(z.string(), optional),\n z.strictObject({\n ...this.makeCommonPrimitiveFilterComponents(\n z.string(),\n optional,\n () => z.lazy(() => this.makeStringFilterSchema(optional, withAggregations)),\n undefined,\n withAggregations ? ['_count', '_min', '_max'] : undefined,\n ),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n ...(this.providerSupportsCaseSensitivity\n ? {\n mode: this.makeStringModeSchema().optional(),\n }\n : {}),\n }),\n ]);\n }\n\n private makeStringModeSchema() {\n return z.union([z.literal('default'), z.literal('insensitive')]);\n }\n\n private makeSelectSchema(model: string) {\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 fields[field] = this.makeRelationSelectIncludeSchema(fieldDef).optional();\n } else {\n fields[field] = z.boolean().optional();\n }\n }\n\n const _countSchema = this.makeCountSelectionSchema(modelDef);\n if (_countSchema) {\n fields['_count'] = _countSchema;\n }\n\n return z.strictObject(fields);\n }\n\n private makeCountSelectionSchema(modelDef: ModelDef) {\n const toManyRelations = Object.values(modelDef.fields).filter((def) => def.relation && def.array);\n if (toManyRelations.length > 0) {\n return 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(fieldDef.type, false, false),\n }),\n ])\n .optional(),\n }),\n {} as Record<string, ZodType>,\n ),\n ),\n }),\n ])\n .optional();\n } else {\n return undefined;\n }\n }\n\n private makeRelationSelectIncludeSchema(fieldDef: FieldDef) {\n let objSchema: z.ZodType = z.strictObject({\n ...(fieldDef.array || fieldDef.optional\n ? {\n // to-many relations and optional to-one relations are filterable\n where: z.lazy(() => this.makeWhereSchema(fieldDef.type, false)).optional(),\n }\n : {}),\n select: z\n .lazy(() => this.makeSelectSchema(fieldDef.type))\n .optional()\n .nullable(),\n include: z\n .lazy(() => this.makeIncludeSchema(fieldDef.type))\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), true))\n .optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n cursor: this.makeCursorSchema(fieldDef.type).optional(),\n distinct: this.makeDistinctSchema(fieldDef.type).optional(),\n }\n : {}),\n });\n\n objSchema = this.refineForSelectIncludeMutuallyExclusive(objSchema);\n objSchema = this.refineForSelectOmitMutuallyExclusive(objSchema);\n\n return z.union([z.boolean(), objSchema]);\n }\n\n private makeOmitSchema(model: string) {\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.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 return z.strictObject(fields);\n }\n\n private makeIncludeSchema(model: string) {\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 fields[field] = this.makeRelationSelectIncludeSchema(fieldDef).optional();\n }\n }\n\n const _countSchema = this.makeCountSelectionSchema(modelDef);\n if (_countSchema) {\n fields['_count'] = _countSchema;\n }\n\n return z.strictObject(fields);\n }\n\n private makeOrderBySchema(model: string, withRelation: boolean, WithAggregation: boolean) {\n const modelDef = requireModel(this.schema, model);\n const fields: Record<string, ZodType> = {};\n const sort = z.union([z.literal('asc'), z.literal('desc')]);\n for (const field of Object.keys(modelDef.fields)) {\n const fieldDef = requireField(this.schema, model, field);\n if (fieldDef.relation) {\n // relations\n if (withRelation) {\n fields[field] = z.lazy(() => {\n let relationOrderBy = this.makeOrderBySchema(fieldDef.type, withRelation, WithAggregation);\n if (fieldDef.array) {\n relationOrderBy = relationOrderBy.extend({\n _count: sort,\n });\n }\n return relationOrderBy.optional();\n });\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')]),\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).optional());\n }\n }\n\n return z.strictObject(fields);\n }\n\n private makeDistinctSchema(model: string) {\n const modelDef = requireModel(this.schema, model);\n const nonRelationFields = Object.keys(modelDef.fields).filter((field) => !modelDef.fields[field]?.relation);\n return this.orArray(z.enum(nonRelationFields as any), true);\n }\n\n private makeCursorSchema(model: string) {\n return this.makeWhereSchema(model, true, true).optional();\n }\n\n // #endregion\n\n // #region Create\n\n private makeCreateSchema(model: string) {\n const dataSchema = this.makeCreateDataSchema(model, false);\n let schema: ZodType = z.strictObject({\n data: dataSchema,\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeCreateManySchema(model: string) {\n return this.makeCreateManyDataSchema(model, []).optional();\n }\n\n private makeCreateManyAndReturnSchema(model: string) {\n const base = this.makeCreateManyDataSchema(model, []);\n const result = base.extend({\n select: this.makeSelectSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n return this.refineForSelectOmitMutuallyExclusive(result).optional();\n }\n\n private makeCreateDataSchema(\n model: string,\n canBeArray: boolean,\n withoutFields: string[] = [],\n withoutRelationFields = false,\n ) {\n const uncheckedVariantFields: Record<string, ZodType> = {};\n const checkedVariantFields: Record<string, ZodType> = {};\n const modelDef = requireModel(this.schema, model);\n const hasRelation =\n !withoutRelationFields &&\n Object.entries(modelDef.fields).some(([f, def]) => !withoutFields.includes(f) && def.relation);\n\n Object.keys(modelDef.fields).forEach((field) => {\n if (withoutFields.includes(field)) {\n return;\n }\n const fieldDef = requireField(this.schema, model, field);\n if (fieldDef.computed) {\n return;\n }\n\n if (this.isDelegateDiscriminator(fieldDef)) {\n // discriminator field is auto-assigned\n return;\n }\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\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(fieldDef, excludeFields, 'create'),\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 = 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 {\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 ? addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n : z.strictObject(uncheckedVariantFields);\n const checkedCreateSchema = this.extraValidationsEnabled\n ? addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n : z.strictObject(checkedVariantFields);\n\n if (!hasRelation) {\n return this.orArray(uncheckedCreateSchema, canBeArray);\n } else {\n return z.union([\n uncheckedCreateSchema,\n checkedCreateSchema,\n ...(canBeArray ? [z.array(uncheckedCreateSchema)] : []),\n ...(canBeArray ? [z.array(checkedCreateSchema)] : []),\n ]);\n }\n }\n\n private isDelegateDiscriminator(fieldDef: FieldDef) {\n if (!fieldDef.originModel) {\n // not inherited from a delegate\n return false;\n }\n const discriminatorField = getDiscriminatorField(this.schema, fieldDef.originModel);\n return discriminatorField === fieldDef.name;\n }\n\n private makeRelationManipulationSchema(fieldDef: FieldDef, withoutFields: string[], mode: 'create' | 'update') {\n const fieldType = fieldDef.type;\n const array = !!fieldDef.array;\n const fields: Record<string, ZodType> = {\n create: this.makeCreateDataSchema(fieldDef.type, !!fieldDef.array, withoutFields).optional(),\n\n connect: this.makeConnectDataSchema(fieldType, array).optional(),\n\n connectOrCreate: this.makeConnectOrCreateDataSchema(fieldType, array, withoutFields).optional(),\n };\n\n if (array) {\n fields['createMany'] = this.makeCreateManyDataSchema(fieldType, withoutFields).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).optional();\n\n fields['delete'] = this.makeDeleteRelationDataSchema(fieldType, array, true).optional();\n }\n\n fields['update'] = array\n ? this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional()\n : z\n .union([\n z.strictObject({\n where: this.makeWhereSchema(fieldType, false).optional(),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n this.makeUpdateDataSchema(fieldType, withoutFields),\n ])\n .optional();\n\n let upsertWhere = this.makeWhereSchema(fieldType, true);\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),\n update: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional();\n\n if (array) {\n // to-many relation specifics\n fields['set'] = this.makeSetDataSchema(fieldType, true).optional();\n\n fields['updateMany'] = this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, false, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n true,\n ).optional();\n\n fields['deleteMany'] = this.makeDeleteRelationDataSchema(fieldType, true, false).optional();\n }\n }\n\n return z.strictObject(fields);\n }\n\n private makeSetDataSchema(model: string, canBeArray: boolean) {\n return this.orArray(this.makeWhereSchema(model, true), canBeArray);\n }\n\n private makeConnectDataSchema(model: string, canBeArray: boolean) {\n return this.orArray(this.makeWhereSchema(model, true), canBeArray);\n }\n\n private makeDisconnectDataSchema(model: string, canBeArray: boolean) {\n if (canBeArray) {\n // to-many relation, must be unique filters\n return this.orArray(this.makeWhereSchema(model, true), 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)]);\n }\n }\n\n private makeDeleteRelationDataSchema(model: string, toManyRelation: boolean, uniqueFilter: boolean) {\n return toManyRelation\n ? this.orArray(this.makeWhereSchema(model, uniqueFilter), true)\n : z.union([z.boolean(), this.makeWhereSchema(model, uniqueFilter)]);\n }\n\n private makeConnectOrCreateDataSchema(model: string, canBeArray: boolean, withoutFields: string[]) {\n const whereSchema = this.makeWhereSchema(model, true);\n const createSchema = this.makeCreateDataSchema(model, false, withoutFields);\n return this.orArray(\n z.strictObject({\n where: whereSchema,\n create: createSchema,\n }),\n canBeArray,\n );\n }\n\n private makeCreateManyDataSchema(model: string, withoutFields: string[]) {\n return z.strictObject({\n data: this.makeCreateDataSchema(model, true, withoutFields, true),\n skipDuplicates: z.boolean().optional(),\n });\n }\n\n // #endregion\n\n // #region Update\n\n private makeUpdateSchema(model: string) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n data: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpdateManySchema(model: string) {\n return z.strictObject({\n where: this.makeWhereSchema(model, false).optional(),\n data: this.makeUpdateDataSchema(model, [], true),\n limit: z.number().int().nonnegative().optional(),\n });\n }\n\n private makeUpdateManyAndReturnSchema(model: string) {\n const base = this.makeUpdateManySchema(model);\n let schema: ZodType = base.extend({\n select: this.makeSelectSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpsertSchema(model: string) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n create: this.makeCreateDataSchema(model, false),\n update: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeUpdateDataSchema(model: string, withoutFields: string[] = [], withoutRelationFields = false) {\n const uncheckedVariantFields: Record<string, ZodType> = {};\n const checkedVariantFields: Record<string, ZodType> = {};\n const modelDef = requireModel(this.schema, model);\n const hasRelation = Object.entries(modelDef.fields).some(\n ([key, value]) => value.relation && !withoutFields.includes(key),\n );\n\n Object.keys(modelDef.fields).forEach((field) => {\n if (withoutFields.includes(field)) {\n return;\n }\n const fieldDef = requireField(this.schema, model, field);\n\n if (fieldDef.relation) {\n if (withoutRelationFields) {\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(fieldDef, excludeFields, 'update'))\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 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 = 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 {\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 ? addCustomValidation(z.strictObject(uncheckedVariantFields), modelDef.attributes)\n : z.strictObject(uncheckedVariantFields);\n const checkedUpdateSchema = this.extraValidationsEnabled\n ? addCustomValidation(z.strictObject(checkedVariantFields), modelDef.attributes)\n : z.strictObject(checkedVariantFields);\n if (!hasRelation) {\n return uncheckedUpdateSchema;\n } else {\n return z.union([uncheckedUpdateSchema, checkedUpdateSchema]);\n }\n }\n\n // #endregion\n\n // #region Delete\n\n private makeDeleteSchema(model: GetModels<Schema>) {\n let schema: ZodType = z.strictObject({\n where: this.makeWhereSchema(model, true),\n select: this.makeSelectSchema(model).optional().nullable(),\n include: this.makeIncludeSchema(model).optional().nullable(),\n omit: this.makeOmitSchema(model).optional().nullable(),\n });\n schema = this.refineForSelectIncludeMutuallyExclusive(schema);\n schema = this.refineForSelectOmitMutuallyExclusive(schema);\n return schema;\n }\n\n private makeDeleteManySchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n limit: z.number().int().nonnegative().optional(),\n })\n\n .optional();\n }\n\n // #endregion\n\n // #region Count\n\n makeCountSchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, true, false), true).optional(),\n select: this.makeCountAggregateInputSchema(model).optional(),\n })\n\n .optional();\n }\n\n private makeCountAggregateInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.union([\n z.literal(true),\n z.strictObject({\n _all: z.literal(true).optional(),\n ...Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n acc[field] = z.literal(true).optional();\n return acc;\n },\n {} as Record<string, ZodType>,\n ),\n }),\n ]);\n }\n\n // #endregion\n\n // #region Aggregate\n\n makeAggregateSchema(model: GetModels<Schema>) {\n return z\n .object({\n where: this.makeWhereSchema(model, false).optional(),\n skip: this.makeSkipSchema().optional(),\n take: this.makeTakeSchema().optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, true, false), 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\n .optional();\n }\n\n makeSumAvgInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.strictObject(\n Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n const fieldDef = requireField(this.schema, model, field);\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 }\n\n makeMinMaxInputSchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n return z.strictObject(\n Object.keys(modelDef.fields).reduce(\n (acc, field) => {\n const fieldDef = requireField(this.schema, model, field);\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 }\n\n private makeGroupBySchema(model: GetModels<Schema>) {\n const modelDef = requireModel(this.schema, model);\n const nonRelationFields = Object.keys(modelDef.fields).filter((field) => !modelDef.fields[field]?.relation);\n const bySchema =\n nonRelationFields.length > 0\n ? this.orArray(z.enum(nonRelationFields as [string, ...string[]]), true)\n : z.never();\n\n let schema: z.ZodSchema = z.strictObject({\n where: this.makeWhereSchema(model, false).optional(),\n orderBy: this.orArray(this.makeOrderBySchema(model, false, true), true).optional(),\n by: bySchema,\n having: this.makeHavingSchema(model).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 // fields used in `having` must be either in the `by` list, or aggregations\n schema = schema.refine((value: any) => {\n const bys = typeof value.by === 'string' ? [value.by] : value.by;\n if (value.having && typeof value.having === 'object') {\n for (const [key, val] of Object.entries(value.having)) {\n if (AGGREGATE_OPERATORS.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 = typeof value.by === 'string' ? [value.by] : value.by;\n if (\n value.orderBy &&\n Object.keys(value.orderBy)\n .filter((f) => !AGGREGATE_OPERATORS.includes(f as AGGREGATE_OPERATORS))\n .some((key) => !bys.includes(key))\n ) {\n return false;\n } else {\n return true;\n }\n }, 'fields in \"orderBy\" must be in \"by\"');\n\n return schema;\n }\n\n private onlyAggregationFields(val: object) {\n for (const [key, value] of Object.entries(val)) {\n if (AGGREGATE_OPERATORS.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 private makeHavingSchema(model: GetModels<Schema>) {\n return this.makeWhereSchema(model, false, true, true);\n }\n\n // #endregion\n\n // #region Helpers\n\n private makeSkipSchema() {\n return z.number().int().nonnegative();\n }\n\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 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 // #endregion\n}\n","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 { invariant } from '@zenstackhq/common-helpers';\nimport type {\n AttributeApplication,\n BinaryExpression,\n CallExpression,\n Expression,\n FieldExpression,\n MemberExpression,\n UnaryExpression,\n} from '@zenstackhq/schema';\nimport Decimal from 'decimal.js';\nimport { match, P } from 'ts-pattern';\nimport { z } from 'zod';\nimport { ZodIssueCode } from 'zod/v3';\nimport { ExpressionUtils } from '../../../schema';\nimport { createNotSupportedError } from '../../errors';\n\nfunction getArgValue<T extends string | number | boolean>(expr: Expression | undefined): T | undefined {\n if (!expr || !ExpressionUtils.isLiteral(expr)) {\n return undefined;\n }\n return expr.value as T;\n}\n\nexport function addStringValidation(\n schema: z.ZodString,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n match(attr.name)\n .with('@length', () => {\n const min = getArgValue<number>(attr.args?.[0]?.value);\n if (min !== undefined) {\n result = result.min(min);\n }\n const max = getArgValue<number>(attr.args?.[1]?.value);\n if (max !== undefined) {\n result = result.max(max);\n }\n })\n .with('@startsWith', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.startsWith(value);\n }\n })\n .with('@endsWith', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.endsWith(value);\n }\n })\n .with('@contains', () => {\n const value = getArgValue<string>(attr.args?.[0]?.value);\n if (value !== undefined) {\n result = result.includes(value);\n }\n })\n .with('@regex', () => {\n const pattern = getArgValue<string>(attr.args?.[0]?.value);\n if (pattern !== undefined) {\n result = result.regex(new RegExp(pattern));\n }\n })\n .with('@email', () => {\n result = result.email();\n })\n .with('@datetime', () => {\n result = result.datetime();\n })\n .with('@url', () => {\n result = result.url();\n })\n .with('@trim', () => {\n result = result.trim();\n })\n .with('@lower', () => {\n result = result.toLowerCase();\n })\n .with('@upper', () => {\n result = result.toUpperCase();\n });\n }\n return result;\n}\n\nexport function addNumberValidation(\n schema: z.ZodNumber,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n match(attr.name)\n .with('@gt', () => {\n result = result.gt(val);\n })\n .with('@gte', () => {\n result = result.gte(val);\n })\n .with('@lt', () => {\n result = result.lt(val);\n })\n .with('@lte', () => {\n result = result.lte(val);\n });\n }\n return result;\n}\n\nexport function addBigIntValidation(\n schema: z.ZodBigInt,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n\n match(attr.name)\n .with('@gt', () => {\n result = result.gt(BigInt(val));\n })\n .with('@gte', () => {\n result = result.gte(BigInt(val));\n })\n .with('@lt', () => {\n result = result.lt(BigInt(val));\n })\n .with('@lte', () => {\n result = result.lte(BigInt(val));\n });\n }\n return result;\n}\n\nexport function addDecimalValidation(\n schema: z.ZodType<Decimal> | z.ZodString,\n attributes: readonly AttributeApplication[] | undefined,\n addExtraValidation: boolean,\n): z.ZodSchema {\n let result: z.ZodSchema = schema;\n\n // parse string to Decimal\n if (schema instanceof z.ZodString) {\n result = schema\n .superRefine((v, ctx) => {\n try {\n new Decimal(v);\n } catch (err) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid decimal: ${err}`,\n });\n }\n })\n .transform((val) => new Decimal(val));\n }\n\n // add validations\n\n function refine(schema: z.ZodSchema, op: 'gt' | 'gte' | 'lt' | 'lte', value: number) {\n return schema.superRefine((v, ctx) => {\n const base = z.number();\n const { error } = base[op](value).safeParse((v as Decimal).toNumber());\n error?.issues.forEach((issue) => {\n if (op === 'gt' || op === 'gte') {\n ctx.addIssue({\n code: ZodIssueCode.too_small,\n origin: 'number',\n minimum: value,\n type: 'decimal',\n inclusive: op === 'gte',\n message: issue.message,\n });\n } else {\n ctx.addIssue({\n code: ZodIssueCode.too_big,\n origin: 'number',\n maximum: value,\n type: 'decimal',\n inclusive: op === 'lte',\n message: issue.message,\n });\n }\n });\n });\n }\n\n if (attributes && addExtraValidation) {\n for (const attr of attributes) {\n const val = getArgValue<number>(attr.args?.[0]?.value);\n if (val === undefined) {\n continue;\n }\n\n match(attr.name)\n .with('@gt', () => {\n result = refine(result, 'gt', val);\n })\n .with('@gte', () => {\n result = refine(result, 'gte', val);\n })\n .with('@lt', () => {\n result = refine(result, 'lt', val);\n })\n .with('@lte', () => {\n result = refine(result, 'lte', val);\n });\n }\n }\n\n return result;\n}\n\nexport function addListValidation(\n schema: z.ZodArray<any>,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n if (!attributes || attributes.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attributes) {\n match(attr.name)\n .with('@length', () => {\n const min = getArgValue<number>(attr.args?.[0]?.value);\n if (min !== undefined) {\n result = result.min(min);\n }\n const max = getArgValue<number>(attr.args?.[1]?.value);\n if (max !== undefined) {\n result = result.max(max);\n }\n })\n .otherwise(() => {});\n }\n return result;\n}\n\nexport function addCustomValidation(\n schema: z.ZodSchema,\n attributes: readonly AttributeApplication[] | undefined,\n): z.ZodSchema {\n const attrs = attributes?.filter((a) => a.name === '@@validate');\n if (!attrs || attrs.length === 0) {\n return schema;\n }\n\n let result = schema;\n for (const attr of attrs) {\n const expr = attr.args?.[0]?.value;\n if (!expr) {\n continue;\n }\n const message = getArgValue<string>(attr.args?.[1]?.value);\n const pathExpr = attr.args?.[2]?.value;\n let path: string[] | undefined = undefined;\n if (pathExpr && ExpressionUtils.isArray(pathExpr)) {\n path = pathExpr.items.map((e) => ExpressionUtils.getLiteralValue(e) as string);\n }\n result = applyValidation(result, expr, message, path);\n }\n return result;\n}\n\nfunction applyValidation(\n schema: z.ZodSchema,\n expr: Expression,\n message: string | undefined,\n path: string[] | undefined,\n) {\n const options: Parameters<typeof schema.refine>[1] = {};\n if (message) {\n options.error = message;\n }\n if (path) {\n options.path = path;\n }\n return schema.refine((data) => Boolean(evalExpression(data, expr)), options);\n}\n\nfunction evalExpression(data: any, expr: Expression): unknown {\n return match(expr)\n .with({ kind: 'literal' }, (e) => e.value)\n .with({ kind: 'array' }, (e) => e.items.map((item) => evalExpression(data, item)))\n .with({ kind: 'field' }, (e) => evalField(data, e))\n .with({ kind: 'member' }, (e) => evalMember(data, e))\n .with({ kind: 'unary' }, (e) => evalUnary(data, e))\n .with({ kind: 'binary' }, (e) => evalBinary(data, e))\n .with({ kind: 'call' }, (e) => evalCall(data, e))\n .with({ kind: 'this' }, () => data ?? null)\n .with({ kind: 'null' }, () => null)\n .exhaustive();\n}\n\nfunction evalField(data: any, e: FieldExpression) {\n return data?.[e.field] ?? null;\n}\n\nfunction evalUnary(data: any, expr: UnaryExpression) {\n const operand = evalExpression(data, expr.operand);\n switch (expr.op) {\n case '!':\n return !operand;\n default:\n throw new Error(`Unsupported unary operator: ${expr.op}`);\n }\n}\n\nfunction evalBinary(data: any, expr: BinaryExpression) {\n const left = evalExpression(data, expr.left);\n const right = evalExpression(data, expr.right);\n return match(expr.op)\n .with('&&', () => Boolean(left) && Boolean(right))\n .with('||', () => Boolean(left) || Boolean(right))\n .with('==', () => left == right)\n .with('!=', () => left != right)\n .with('<', () => (left as any) < (right as any))\n .with('<=', () => (left as any) <= (right as any))\n .with('>', () => (left as any) > (right as any))\n .with('>=', () => (left as any) >= (right as any))\n .with('?', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return left.some((item) => item === right);\n })\n .with('!', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return left.every((item) => item === right);\n })\n .with('^', () => {\n if (!Array.isArray(left)) {\n return false;\n }\n return !left.some((item) => item === right);\n })\n .with('in', () => {\n if (!Array.isArray(right)) {\n return false;\n }\n return right.includes(left);\n })\n .exhaustive();\n}\n\nfunction evalMember(data: any, expr: MemberExpression) {\n let result: any = evalExpression(data, expr.receiver);\n for (const member of expr.members) {\n if (!result || typeof result !== 'object') {\n return undefined;\n }\n result = result[member];\n }\n return result ?? null;\n}\n\nfunction evalCall(data: any, expr: CallExpression) {\n const fieldArg = expr.args?.[0] ? evalExpression(data, expr.args[0]) : undefined;\n return (\n match(expr.function)\n // string functions\n .with('length', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(\n typeof fieldArg === 'string' || Array.isArray(fieldArg),\n `\"${f}\" first argument must be a string or a list`,\n );\n return fieldArg.length;\n })\n .with(P.union('startsWith', 'endsWith', 'contains'), (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n invariant(expr.args?.[1], `\"${f}\" requires a search argument`);\n\n const search = getArgValue<string>(expr.args?.[1])!;\n const caseInsensitive = getArgValue<boolean>(expr.args?.[2]) ?? false;\n\n const matcher = (x: string, y: string) =>\n match(f)\n .with('startsWith', () => x.startsWith(y))\n .with('endsWith', () => x.endsWith(y))\n .with('contains', () => x.includes(y))\n .exhaustive();\n return caseInsensitive\n ? matcher(fieldArg.toLowerCase(), search.toLowerCase())\n : matcher(fieldArg, search);\n })\n .with('regex', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n const pattern = getArgValue<string>(expr.args?.[1])!;\n invariant(pattern !== undefined, `\"${f}\" requires a pattern argument`);\n return new RegExp(pattern).test(fieldArg);\n })\n .with(P.union('isEmail', 'isUrl', 'isDateTime'), (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(typeof fieldArg === 'string', `\"${f}\" first argument must be a string`);\n const fn = match(f)\n .with('isEmail', () => 'email' as const)\n .with('isUrl', () => 'url' as const)\n .with('isDateTime', () => 'datetime' as const)\n .exhaustive();\n return z.string()[fn]().safeParse(fieldArg).success;\n })\n // list functions\n .with(P.union('has', 'hasEvery', 'hasSome'), (f) => {\n invariant(expr.args?.[1], `${f} requires a search argument`);\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(Array.isArray(fieldArg), `\"${f}\" first argument must be an array field`);\n\n const search = evalExpression(data, expr.args?.[1])!;\n const matcher = (x: any[], y: any) =>\n match(f)\n .with('has', () => x.some((item) => item === y))\n .with('hasEvery', () => {\n invariant(Array.isArray(y), 'hasEvery second argument must be an array');\n return y.every((v) => x.some((item) => item === v));\n })\n .with('hasSome', () => {\n invariant(Array.isArray(y), 'hasSome second argument must be an array');\n return y.some((v) => x.some((item) => item === v));\n })\n .exhaustive();\n return matcher(fieldArg, search);\n })\n .with('isEmpty', (f) => {\n if (fieldArg === undefined || fieldArg === null) {\n return false;\n }\n invariant(Array.isArray(fieldArg), `\"${f}\" first argument must be an array field`);\n return fieldArg.length === 0;\n })\n .otherwise(() => {\n throw createNotSupportedError(`Unsupported function \"${expr.function}\"`);\n })\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 { QueryId } from 'kysely';\nimport {\n AndNode,\n CompiledQuery,\n createQueryId,\n DefaultQueryExecutor,\n DeleteQueryNode,\n InsertQueryNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n SingleConnectionProvider,\n TableNode,\n UpdateQueryNode,\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 { ModelDef, SchemaDef, TypeDefDef } from '../../schema';\nimport { type ClientImpl } from '../client-impl';\nimport { TransactionIsolationLevel, type ClientContract } from '../contract';\nimport { createDBQueryError, createInternalError, ORMError } from '../errors';\nimport type { AfterEntityMutationCallback, OnKyselyQueryCallback } from '../plugin';\nimport { stripAlias } from '../query-utils';\nimport { QueryNameMapper } from './name-mapper';\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\nexport class ZenStackQueryExecutor extends DefaultQueryExecutor {\n private readonly nameMapper: QueryNameMapper | undefined;\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.$schema);\n }\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 override 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 return this.provideConnection(async (connection) => {\n let startedTx = false;\n try {\n // mutations are wrapped in tx if not already in one\n if (this.isMutationNode(compiledQuery.query) && !this.driver.isTransactionConnection(connection)) {\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\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 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 async proceedQuery(\n connection: DatabaseConnection,\n query: RootOperationNode,\n parameters: readonly unknown[] | undefined,\n queryId: QueryId,\n ) {\n let compiled: CompiledQuery | undefined;\n\n if (this.suppressMutationHooks || !this.isMutationNode(query) || !this.hasEntityMutationPlugins) {\n // no need to handle mutation hooks, just proceed\n const finalQuery = this.processNameMapping(query);\n\n // inherit the original queryId\n compiled = this.compileQuery(finalQuery, queryId);\n if (parameters) {\n compiled = { ...compiled, parameters };\n }\n return this.internalExecuteQuery(connection, compiled);\n }\n\n if (\n (InsertQueryNode.is(query) || UpdateQueryNode.is(query)) &&\n this.hasEntityMutationPluginsWithAfterMutationHooks\n ) {\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 }\n const finalQuery = this.processNameMapping(query);\n\n // inherit the original queryId\n compiled = this.compileQuery(finalQuery, queryId);\n if (parameters) {\n compiled = { ...compiled, parameters };\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(finalQuery);\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(mutationInfo.model, mutationInfo.where, connection);\n }\n return beforeMutationEntities;\n };\n\n // call before mutation hooks\n await this.callBeforeMutationHooks(\n finalQuery,\n mutationInfo,\n loadBeforeMutationEntities,\n connectionClient,\n queryId,\n );\n\n const result = await this.internalExecuteQuery(connection, compiled);\n\n if (!this.driver.isTransactionConnection(connection)) {\n // not in a transaction, just call all after-mutation hooks\n await this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'all', queryId);\n } else {\n // run after-mutation hooks that are requested to be run inside tx\n await this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'inTx', queryId);\n\n // register other after-mutation hooks to be run after the tx is committed\n this.driver.registerTransactionCommitCallback(connection, () =>\n this.callAfterMutationHooks(result, finalQuery, mutationInfo, connectionClient, 'outTx', queryId),\n );\n }\n\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 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 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 isMutationNode(queryNode: RootOperationNode): queryNode is MutationQueryNode {\n return InsertQueryNode.is(queryNode) || UpdateQueryNode.is(queryNode) || DeleteQueryNode.is(queryNode);\n }\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 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 async callBeforeMutationHooks(\n queryNode: OperationNode,\n mutationInfo: MutationInfo,\n loadBeforeMutationEntities: () => Promise<Record<string, unknown>[] | undefined>,\n client: ClientContract<SchemaDef>,\n queryId: QueryId,\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(\n queryResult: QueryResult<unknown>,\n queryNode: OperationNode,\n mutationInfo: MutationInfo,\n client: ClientContract<SchemaDef>,\n filterFor: 'inTx' | 'outTx' | 'all',\n queryId: QueryId,\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 const mutationModel = this.getMutationModel(queryNode);\n\n const loadAfterMutationEntities = async () => {\n if (mutationInfo.action === 'delete') {\n return undefined;\n } else {\n return queryResult.rows as Record<string, unknown>[];\n }\n };\n\n for (const hook of hooks) {\n await hook({\n model: mutationModel,\n action: mutationInfo.action,\n queryNode,\n loadAfterMutationEntities,\n client,\n queryId,\n });\n }\n }\n\n private async loadEntities(\n model: string,\n where: WhereNode | undefined,\n connection: DatabaseConnection,\n ): Promise<Record<string, unknown>[]> {\n const selectQuery = this.kysely.selectFrom(model).selectAll();\n let selectQueryNode = selectQuery.toOperationNode() as SelectQueryNode;\n selectQueryNode = {\n ...selectQueryNode,\n where: this.andNodes(selectQueryNode.where, where),\n };\n const compiled = this.compileQuery(selectQueryNode, createQueryId());\n // execute the query directly with the given connection to avoid triggering\n // any other side effects\n const result = await this.internalExecuteQuery(connection, compiled);\n return result.rows as Record<string, unknown>[];\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(connection: DatabaseConnection, compiledQuery: CompiledQuery) {\n try {\n return await connection.executeQuery<any>(compiledQuery);\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","import { invariant } from '@zenstackhq/common-helpers';\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 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 { EnumDef, EnumField, FieldDef, ModelDef, SchemaDef } from '../../schema';\nimport {\n extractFieldName,\n extractModelName,\n getEnum,\n getField,\n getModel,\n isEnum,\n requireModel,\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 scopes: Scope[] = [];\n\n constructor(private readonly schema: SchemaDef) {\n super();\n for (const [modelName, modelDef] of Object.entries(schema.models)) {\n const mappedName = this.getMappedName(modelDef);\n if (mappedName) {\n this.modelToTableMap.set(modelName, mappedName);\n }\n\n for (const fieldDef of this.getModelFields(modelDef)) {\n const mappedName = this.getMappedName(fieldDef);\n if (mappedName) {\n this.fieldToColumnMap.set(`${modelName}.${fieldDef.name}`, mappedName);\n }\n }\n }\n }\n\n // #region overrides\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n if (!node.from?.froms) {\n return super.transformSelectQuery(node);\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);\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) {\n if (!node.into) {\n return super.transformInsertQuery(node);\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);\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) {\n if (!ColumnNode.is(node.column)) {\n return super.transformReference(node);\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) {\n const scope = this.resolveFieldFromScopes(node.column.name);\n if (!scope || scope.namesMapped || !scope.model) {\n return super.transformColumn(node);\n }\n const mappedName = this.mapFieldName(scope.model, node.column.name);\n return ColumnNode.create(mappedName);\n }\n\n protected override transformBinaryOperation(node: BinaryOperationNode) {\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 ...node,\n rightOperand: resultValue,\n });\n }\n }\n\n return super.transformBinaryOperation(node);\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n if (!node.table) {\n return super.transformUpdateQuery(node);\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);\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) {\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);\n }\n });\n\n return this.withScopes(scopes, () => {\n return {\n ...super.transformDeleteQuery(node),\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 (this.getModelFields(modelDef).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 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 const modelDef = requireModel(this.schema, model);\n return this.getModelFields(modelDef).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 getModelFields(modelDef: ModelDef) {\n return Object.values(modelDef.fields).filter((f) => !f.relation && !f.computed && !f.originModel);\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 const modelDef = requireModel(this.schema, scope.model);\n return this.getModelFields(modelDef).map((fieldDef) => {\n const columnName = this.mapFieldName(modelDef.name, 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 this.getModelFields(modelDef).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(eb.cast(new ExpressionWrapper(node), 'text')).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 { 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 // escape special characters in search string\n const escapedSearch = sql`REPLACE(REPLACE(REPLACE(CAST(${searchExpr} as text), '\\\\', '\\\\\\\\'), '%', '\\\\%'), '_', '\\\\_')`;\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 '\\\\'`;\n};\n\nexport const has: ZModelFunction<any> = (eb, args) => {\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 eb(field, '@>', [search]);\n};\n\nexport const hasEvery: ZModelFunction<any> = (eb: ExpressionBuilder<any, any>, args: Expression<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 eb(field, '@>', search);\n};\n\nexport const hasSome: ZModelFunction<any> = (eb, args) => {\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 eb(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> = () => sql.raw('CURRENT_TIMESTAMP');\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 { CreateTableBuilder, sql, type ColumnDataType, type OnModifyForeignAction } from 'kysely';\nimport toposort from 'toposort';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type BuiltinType,\n type CascadeAction,\n type FieldDef,\n type ModelDef,\n type SchemaDef,\n} from '../../schema';\nimport type { ToKysely } from '../query-builder';\nimport { requireModel } from '../query-utils';\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.schema.provider.type === 'postgresql') {\n for (const [name, enumDef] of Object.entries(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(name).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 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 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 (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}_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 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) {\n if (typeof fieldDef.default === 'object' && 'kind' in fieldDef.default) {\n if (ExpressionUtils.isCall(fieldDef.default) && fieldDef.default.function === 'now') {\n col = col.defaultTo(sql`CURRENT_TIMESTAMP`);\n }\n } else {\n col = col.defaultTo(fieldDef.default);\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.schema.provider.type === 'sqlite') {\n col = col.autoIncrement();\n }\n\n return col;\n });\n }\n\n private mapFieldType(fieldDef: FieldDef) {\n if (this.schema.enums?.[fieldDef.type]) {\n return this.schema.provider.type === 'postgresql' ? sql.ref(fieldDef.type) : 'text';\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 'jsonb';\n }\n\n const type = fieldDef.type as BuiltinType;\n const result = match<BuiltinType, ColumnDataType>(type)\n .with('String', () => 'text')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'integer')\n .with('Float', () => 'real')\n .with('BigInt', () => 'bigint')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'timestamp')\n .with('Bytes', () => (this.schema.provider.type === 'postgresql' ? 'bytea' : 'blob'))\n .with('Json', () => 'jsonb')\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","import type { SchemaDef } from '../schema';\nimport type { ClientContract } from './contract';\n\n/**\n * A promise that only executes when it's awaited or .then() is called.\n */\nexport type ZenStackPromise<Schema extends SchemaDef, T> = Promise<T> & {\n /**\n * @private\n * Callable to get a plain promise.\n */\n cb: (txClient?: ClientContract<Schema>) => Promise<T>;\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<any, 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 };\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 '../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 if (Array.isArray(data)) {\n data.forEach((row, i) => (data[i] = this.processRow(row, model)));\n return data;\n } else {\n return this.processRow(data, model);\n }\n }\n\n private processRow(data: any, model: GetModels<Schema>) {\n if (!data || typeof data !== 'object') {\n return data;\n }\n for (const [key, value] of Object.entries<any>(data)) {\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 continue;\n }\n\n 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 processedSubRow = this.processRow(subRow, subModel);\n\n // merge the sub-row into the main row\n Object.assign(data, processedSubRow);\n }\n delete data[key];\n continue;\n }\n\n const fieldDef = getField(this.schema, model, key);\n if (!fieldDef) {\n continue;\n }\n\n if (value === null) {\n // scalar list defaults to empty array\n if (fieldDef.array && !fieldDef.relation && value === null) {\n data[key] = [];\n }\n continue;\n }\n\n if (fieldDef.relation) {\n data[key] = this.processRelation(value, fieldDef);\n } else {\n data[key] = this.processFieldValue(value, fieldDef);\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 type { OperationNode, QueryId, QueryResult, RootOperationNode, UnknownRow } from 'kysely';\nimport type { ClientContract } from '.';\nimport type { GetModels, SchemaDef } from '../schema';\nimport type { MaybePromise } from '../utils/type-utils';\nimport type { AllCrudOperation } from './crud/operations/base';\nimport type { ZModelFunction } from './options';\n\n/**\n * ZenStack runtime plugin.\n */\nexport interface RuntimePlugin<Schema extends SchemaDef = SchemaDef> {\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/**\n * Defines a ZenStack runtime plugin.\n */\nexport function definePlugin<Schema extends SchemaDef>(plugin: RuntimePlugin<Schema>) {\n return plugin;\n}\n\nexport { type CoreCrudOperation as CrudOperation } from './crud/operations/base';\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: AllCrudOperation;\n\n /**\n * The query arguments.\n */\n args: unknown;\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: unknown) => 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 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 AggregateFunctionNode,\n AliasNode,\n AlterColumnNode,\n AlterTableNode,\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 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}\n\nexport type AnyKysely = Kysely<any>;\n","import { match } from 'ts-pattern';\nimport type {\n ArrayExpression,\n BinaryExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n} from '../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: '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 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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","names":["invariant","CompiledQuery","DefaultConnectionProvider","DefaultQueryExecutor","Kysely","Log","sql","Transaction","match","invariant","AliasNode","ColumnNode","ReferenceNode","TableNode","match","extractFields","obj","fields","Object","fromEntries","entries","filter","key","includes","fieldsToSelectObject","map","f","getDbErrorCode","error","Error","code","undefined","ORMErrorReason","RejectedByPolicyReason","ORMError","Error","reason","message","options","model","dbErrorCode","dbErrorMessage","rejectedByPolicyReason","sql","sqlParams","createConfigError","createNotFoundError","error","createInvalidInputError","createDBQueryError","dbError","parameters","cause","getDbErrorCode","undefined","createRejectedByPolicyError","createNotSupportedError","createInternalError","hasModel","schema","model","Object","keys","models","map","k","toLowerCase","includes","getModel","values","find","m","name","getTypeDef","type","typeDefs","requireModel","modelDef","createInternalError","requireTypeDef","typeDef","getField","field","fields","requireField","modelOrType","getIdFields","idFields","requireIdFields","result","getRelationForeignKeyFieldPairs","relationField","fieldDef","relation","references","keyPairs","f","i","fk","pk","ownedByModel","opposite","oppositeField","isScalarField","foreignKeyFor","isForeignKeyField","isRelationField","isInheritedField","originModel","getUniqueFields","key","value","entries","uniqueFields","push","def","defs","fromEntries","getIdValues","data","reduce","acc","fieldHasDefaultValue","default","undefined","updatedAt","isEnum","enums","getEnum","isTypeDef","buildJoinPairs","modelAlias","relationModelAlias","makeDefaultOrderBy","getManyToManyRelation","array","realModel","oppositeFieldDef","sortedModelNames","sort","orderedFK","sortedFieldNames","modelIdFields","invariant","length","otherIdFields","parentFkName","parentPKName","otherModel","otherField","otherFkName","otherPKName","joinTable","flattenCompoundUniqueFilters","filter","compoundUniques","u","flattenedResult","restFilter","some","assign","flattenedKeys","restKeys","AND","ensureArray","Array","isArray","extractIdFields","entity","extractFields","getDiscriminatorField","delegateAttr","attributes","attr","discriminator","args","arg","ExpressionUtils","isField","getDelegateDescendantModels","collected","Set","subModels","baseModel","forEach","has","add","aggregate","eb","expr","op","match","with","fn","count","sum","avg","min","max","exhaustive","stripAlias","node","AliasNode","is","alias","extractModelName","innerNode","TableNode","table","identifier","extractFieldName","ReferenceNode","ColumnNode","column","createId","cuid2","clone","enumerate","invariant","isPlainObject","default","cuid1","createQueryId","expressionBuilder","sql","nanoid","match","ulid","uuid","NUMERIC_FIELD_TYPES","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","TransactionIsolationLevel","CRUD","CRUD_EXT","match","invariant","Decimal","sql","parse","parsePostgresArray","match","z","DbNullClass","__brand","DbNull","JsonNullClass","JsonNull","AnyNullClass","AnyNull","enumerate","invariant","isPlainObject","expressionBuilder","sql","match","P","BaseCrudDialect","eb","expressionBuilder","schema","options","transformPrimitive","value","_type","_forArrayField","transformOutput","_array","buildSelectModel","model","modelAlias","modelDef","requireModel","result","selectFrom","joinBase","baseModel","buildDelegateJoin","buildFilterSortTake","args","query","where","buildFilter","negateOrderBy","skip","take","undefined","buildSkipTake","buildOrderBy","orderBy","distinct","ensureArray","supportsDistinctOn","distinctOn","map","f","ref","createNotSupportedError","provider","type","cursor","buildCursorFilter","true","false","_where","flattenCompoundUniqueFilters","key","payload","Object","entries","startsWith","isLogicalCombinator","and","buildCompositeFilter","fieldDef","requireField","relation","buildRelationFilter","fieldRef","originModel","array","buildArrayFilter","buildPrimitiveFilter","_orderBy","makeDefaultOrderBy","orderByItems","flatMap","obj","subQueryAlias","cursorFilter","filters","i","length","andFilters","j","field","order","_order","op","push","select","or","LOGICAL_COMBINATORS","includes","match","with","enumerate","subPayload","not","exhaustive","buildToOneRelationFilter","buildToManyRelationFilter","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","fk","is","joinAlias","joinPairs","buildJoinPairs","filterResultField","joinSelect","left","right","fn","count","lit","as","conditions","isNot","relationModel","relationFilterSelectAlias","buildPkFkWhereRefs","m2m","getManyToManyRelation","modelIdFields","requireIdFields","invariant","relationIdFields","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","createInvalidInputError","isEnum","buildEnumFilter","isTypeDef","buildJsonFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","receiver","filter","some","k","buildPlainJsonFilter","buildTypedJsonFilter","path","jsonReceiver","buildJsonPathSelection","stringReceiver","cast","mode","buildJsonValueFilterClause","buildJsonStringFilter","buildJsonArrayFilter","typeDefName","buildTypedJsonArrayFilter","buildTypeJsonNonArrayFilter","makeExistsPred","buildJsonArrayExistsPredicate","elem","makeExistsNegatedPred","typeDef","requireTypeDef","fields","fieldReceiver","_receiver","sql","lhs","DbNullClass","JsonNullClass","AnyNullClass","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","prepStringCasing","escapedValue","escapeLikePattern","buildStringLike","operation","pattern","replace","insensitive","supportsILike","getStringCasingBehavior","raw","v","negated","buildFieldRef","forEach","index","negateSort","sort","nulls","ob","dir","asc","desc","nullsFirst","nullsLast","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","isRelationField","shouldOmitField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","buildModelSelect","selectAllFields","fieldModel","alias","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","selections","reduce","acc","fieldCountQuery","innerJoin","otherPKName","parentPKName","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","computed","computer","computedFields","createConfigError","canJoinWithoutNestedSelect","isDelegate","PostgresCrudDialect","BaseCrudDialect","isoDateSchema","z","iso","datetime","local","offset","schema","options","provider","transformPrimitive","value","type","forArrayField","undefined","JsonNullClass","DbNullClass","AnyNullClass","invariant","isTypeDef","JSON","stringify","Array","isArray","isEnum","eb","cast","sql","join","map","v","raw","createSchemaQualifiedEnumType","match","with","Date","toISOString","toString","otherwise","array","qualified","enumDef","getEnum","schemaAttr","attributes","find","attr","name","mapArg","args","arg","kind","schemaName","defaultSchema","transformOutput","transformOutputDate","transformOutputBytes","transformOutputBigInt","transformDecimal","when","transformOutputEnum","BigInt","Decimal","safeParse","success","hasOffset","endsWith","test","fixPostgresTimezone","getTime","getTimezoneOffset","Buffer","isBuffer","Uint8Array","from","startsWith","slice","parsePostgresArray","buildRelationSelection","query","model","relationField","parentAlias","payload","relationResultName","joinedQuery","buildRelationJSON","select","qb","resultName","relationFieldDef","requireField","relationModel","leftJoinLateral","relationSelectName","relationModelDef","requireModel","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","subQuery","as","buildRelationObjectSelect","buildRelationJoins","onTrue","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","parentResultName","objArgs","buildRelationObjectArgs","fn","coalesce","descendantModels","getDelegateDescendantModels","push","subModel","lit","DELEGATE_JOINED_FIELD_PREFIX","flatMap","omit","Object","entries","fields","filter","relation","shouldOmitField","field","fieldRef","subJson","buildCountJson","fieldDef","fieldValue","include","result","selectInclude","isRelationField","forEach","buildSkipTake","skip","take","limit","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","buildJsonPathSelection","receiver","path","val","buildJsonArrayFilter","lhs","operation","exhaustive","buildJsonArrayExistsPredicate","buildFilter","exists","supportInsertWithDefault","getFieldSqlType","createInternalError","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","invariant","Decimal","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","JsonNullClass","DbNullClass","AnyNullClass","invariant","schema","typeDefs","JSON","stringify","Array","isArray","map","v","match","with","Date","toISOString","toString","Buffer","from","otherwise","transformOutput","array","transformOutputJson","transformOutputBoolean","transformOutputDate","transformOutputBytes","transformOutputDecimal","transformOutputBigInt","Decimal","BigInt","isBuffer","Uint8Array","parse","e","createInternalError","cause","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","selectModelAlias","selectModelQuery","objArgs","descendantModels","getDelegateDescendantModels","length","push","subModel","sql","lit","DELEGATE_JOINED_FIELD_PREFIX","name","ref","flatMap","omit","Object","entries","fields","filter","relation","shouldOmitField","field","fieldRef","subJson","buildCountJson","fieldDef","include","fn","coalesce","join","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","where","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","buildJsonPathSelection","receiver","path","val","buildJsonArrayFilter","lhs","operation","createNotSupportedError","exhaustive","buildJsonArrayExistsPredicate","buildFilter","exists","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","supportInsertWithDefault","getFieldSqlType","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","BaseOperationHandler","dialect","client","model","inputValidator","getCrudDialect","schema","$options","$schema","options","kysely","$qb","withClient","hasPolicyEnabled","plugins","some","plugin","name","requireModel","getModel","requireField","field","getField","exists","filter","readUnique","where","select","makeIdSelect","existsNonUnique","query","selectNoFrom","eb","buildSelectModel","sql","lit","as","buildFilter","modifyEnd","makeContextComment","operation","result","compiled","getExecutor","compileQuery","toOperationNode","createQueryId","r","executeQuery","rows","err","createDBQueryError","parameters","read","args","buildFilterSortTake","buildFieldSelection","buildSelectAllFields","omit","include","take","selectOrInclude","parentAlias","payload","Object","entries","buildCountSelection","fieldDef","relation","buildSelectField","array","optional","createInternalError","originModel","buildRelationSelection","buildCountJson","create","data","fromRelation","creatingForDelegate","returnFields","modelDef","isDelegate","createNotSupportedError","createFields","updateParent","undefined","m2m","getManyToManyRelation","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","parentFkFields","buildFkAssignments","ids","assign","entity","fk","pk","parentUpdates","postCreateRelations","value","isScalarField","isForeignKeyField","Array","isArray","set","transformPrimitive","type","subM2M","fields","references","fkValues","processOwnedRelationForCreate","i","length","subPayload","baseModel","baseCreateResult","processBaseModelCreate","remainingFields","updatedData","fillGeneratedAndDefaultValues","requireIdFields","insertInto","$if","keys","qb","defaultValues","values","returning","createdEntity","executeQueryTakeFirst","processNoneOwnedRelationForCreate","handleManyToManyRelation","otherModel","otherField","joinTable","forModel","thisCreateFields","forEach","discriminatorField","getDiscriminatorField","invariant","baseEntity","idValues","extractIdFields","relationField","pair","extraRead","action","leftModel","leftField","leftEntity","rightModel","rightField","rightEntity","sortedRecords","sort","a","b","localeCompare","firstIds","secondIds","A","B","onConflict","oc","columns","doNothing","execute","expressionBuilder","deleteFrom","resetManyToManyRelation","parentIds","parentId","parentFkName","relationModel","created","getIdValues","referencedPkFields","extractedFks","extractFields","relationEntity","fieldsToSelectObject","createNotFoundError","found","createInvalidInputError","contextModel","relationFieldName","parentEntity","relationFieldDef","fromRelationContext","item","enumerate","createMany","connectRelation","input","returnData","fieldsToReturn","count","relationKeyPairs","createData","map","newItem","supportInsertWithDefault","allPassedFields","reduce","acc","includes","push","default","skipDuplicates","processBaseModelCreateMany","remainingFieldRows","Number","numAffectedRows","createRows","thisCreateRows","baseEntities","clone","generated","evalGenerator","updatedAt","Date","v","JSON","parse","defaultValue","ExpressionUtils","isCall","firstArgVal","isLiteral","match","function","with","version","cuid2","cuid1","formatGeneratedValue","v7","v4","nanoid","ulid","otherwise","isMember","receiver","val","$auth","member","members","formatExpr","replace","update","allowRelationUpdate","throwIfNotFound","parentWhere","fromEntity","fromRelationFieldDef","opposite","combinedWhere","AND","finalData","autoUpdatedFields","fieldName","thisEntity","getEntityIds","needIdRead","isIdFilter","readResult","baseUpdateResult","processBaseModelUpdate","key","updateFields","processScalarFieldUpdateData","processRelationUpdates","hasFieldUpdate","f","updateTable","updatedEntity","isNumericIncrementalUpdate","transformIncrementalUpdate","transformScalarListUpdate","isNumericField","idFields","every","thisUpdateFields","fieldRef","ensureArray","NUMERIC_FIELD_TYPES","_context","updateMany","limit","filterModel","isRelationField","shouldFallbackToIdFilter","supportsUpdateWithLimit","resultFromBaseModel","baseResult","processBaseModelUpdateMany","refTuple","buildIdFieldRefs","finalQuery","dynamic","ref","fieldModel","connectOrCreateRelation","disconnectRelation","setRelation","_item","updated","deleteRelation","_data","normalizeRelationManipulationInput","results","d","target","and","or","updateResult","existing","disconnectConditions","condition","relationFilter","fromEntries","targetExists","fkConditions","not","throwForNotFound","deleteConditions","expectedDeleteCount","deleteResult","deleteFromModel","delete","OR","flattenCompoundUniqueFilters","processBaseModelDelete","needIdFilter","supportsDeleteWithLimit","processDelegateRelationDelete","oppositeModelDef","oppositeRelation","onDelete","trimResult","needReturnRelations","returnRelation","K","safeTransaction","callback","isolationLevel","isTransaction","txBuilder","transaction","setIsolationLevel","TransactionIsolationLevel","ReadCommitted","uniqueFilter","normalizeArgs","newArgs","doNormalizeArgs","isPlainObject","_operation","compile","executeQueryTakeFirstOrThrow","ORMError","ORMErrorReason","NOT_FOUND","mutationNeedsReadBack","needReadBack","selectedFields","allFields","relationFields","computedFields","computed","allFieldsSelected","shouldOmitField","k","AggregateOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateAggregateArgs","model","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","buildFilter","selectedFields","key","value","Object","entries","startsWith","filter","field","val","forEach","includes","push","length","buildSelectField","select","lit","as","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","orderBy","cast","fn","countAll","count","ref","match","with","sum","avg","max","min","exhaustive","result","executeQuery","ret","rows","parts","split","op","slice","join","fieldDef","getField","schema","type","parseFloat","parseInt","BigInt","otherwise","CountOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateCountArgs","model","subQueryName","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","buildFilter","select","key","value","Object","entries","buildSelectField","lit","as","buildSkipTake","skip","take","keys","map","cast","fn","countAll","count","ref","result","executeQuery","rows","match","CreateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runCreate","inputValidator","validateCreateArgs","model","runCreateMany","validateCreateManyArgs","runCreateManyAndReturn","validateCreateManyAndReturnArgs","exhaustive","needReadBack","selectedFields","mutationNeedsReadBack","result","safeTransaction","tx","createResult","create","data","undefined","readUnique","select","include","omit","where","getIdValues","schema","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","count","createMany","kysely","read","OR","map","item","match","DeleteOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runDelete","inputValidator","validateDeleteArgs","model","runDeleteMany","validateDeleteManyArgs","exhaustive","needReadBack","selectedFields","mutationNeedsReadBack","result","safeTransaction","tx","preDeleteRead","undefined","readUnique","select","include","omit","where","deleteResult","delete","rows","length","createNotFoundError","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","limit","count","FindOperationHandler","BaseOperationHandler","handle","operation","args","validateArgs","normalizedArgs","normalizeArgs","findOne","parsedArgs","inputValidator","validateFindArgs","model","unique","take","result","read","client","$qb","finalResult","ExistsOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateExistsArgs","model","existsNonUnique","client","$qb","where","match","GroupByOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateGroupByArgs","model","query","kysely","selectFrom","where","dialect","buildFilter","fieldRef","field","bys","by","groupBy","map","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","orderBy","having","select","as","key","value","Object","entries","eb","cast","fn","countAll","forEach","val","count","aggregate","result","executeQuery","rows","row","postProcessRow","ret","parts","split","length","op","slice","join","fieldDef","getField","schema","type","parseFloat","match","with","parseInt","BigInt","otherwise","match","UpdateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runUpdate","inputValidator","validateUpdateArgs","model","runUpdateMany","validateUpdateManyArgs","runUpdateManyAndReturn","validateUpdateManyAndReturnArgs","runUpsert","validateUpsertArgs","exhaustive","needReadBack","selectedFields","result","safeTransaction","tx","updateResult","update","where","data","undefined","readFilter","readBackResult","readUnique","select","include","omit","hasPolicyEnabled","createRejectedByPolicyError","RejectedByPolicyReason","CANNOT_READ_BACK","updateMany","limit","read","OR","map","item","getIdValues","schema","length","mutationResult","create","baseResult","mutationNeedsReadBack","modelDef","requireModel","nonRelationFields","Object","entries","fields","filter","_","def","relation","name","keys","some","field","includes","enumerate","invariant","Decimal","stableStringify","match","P","z","fromError","formatError","error","fromError","toString","invariant","Decimal","match","P","z","ZodIssueCode","getArgValue","expr","ExpressionUtils","isLiteral","undefined","value","addStringValidation","schema","attributes","length","result","attr","match","name","with","min","args","max","startsWith","endsWith","includes","pattern","regex","RegExp","email","datetime","url","trim","toLowerCase","toUpperCase","addNumberValidation","val","gt","gte","lt","lte","addBigIntValidation","BigInt","addDecimalValidation","addExtraValidation","z","ZodString","superRefine","v","ctx","Decimal","err","addIssue","code","ZodIssueCode","custom","message","transform","refine","op","base","number","error","safeParse","toNumber","issues","forEach","issue","too_small","origin","minimum","type","inclusive","too_big","maximum","addListValidation","otherwise","addCustomValidation","attrs","filter","a","pathExpr","path","isArray","items","map","e","getLiteralValue","applyValidation","options","data","Boolean","evalExpression","kind","item","evalField","evalMember","evalUnary","evalBinary","evalCall","exhaustive","field","operand","Error","left","right","Array","some","every","receiver","member","members","fieldArg","function","f","invariant","P","union","search","caseInsensitive","matcher","x","y","test","fn","string","success","createNotSupportedError","schemaCache","WeakMap","InputValidator","client","schema","$schema","options","$options","extraValidationsEnabled","validateInput","validateProcedureInput","proc","input","procDef","procedures","invariant","params","Object","values","length","undefined","every","p","optional","createInvalidInputError","envelope","argsPayload","prototype","hasOwnProperty","call","args","Array","isArray","keys","obj","param","value","name","makeProcedureParamSchema","parsed","safeParse","success","formatError","error","isTypeDef","type","makeTypeDefSchema","isEnum","makeEnumSchema","models","z","record","string","unknown","makeScalarSchema","ZodUnknown","createInternalError","array","validateFindArgs","model","validate","makeFindSchema","validateExistsArgs","makeExistsSchema","validateCreateArgs","makeCreateSchema","validateCreateManyArgs","makeCreateManySchema","validateCreateManyAndReturnArgs","makeCreateManyAndReturnSchema","validateUpdateArgs","makeUpdateSchema","validateUpdateManyArgs","makeUpdateManySchema","validateUpdateManyAndReturnArgs","makeUpdateManyAndReturnSchema","validateUpsertArgs","makeUpsertSchema","validateDeleteArgs","makeDeleteSchema","validateDeleteManyArgs","makeDeleteManySchema","validateCountArgs","makeCountSchema","validateAggregateArgs","makeAggregateSchema","validateGroupByArgs","makeGroupBySchema","getSchemaCache","cacheKey","thisCache","get","Map","set","setSchemaCache","operation","getSchema","stableStringify","data","cause","fields","where","makeWhereSchema","unique","makeSelectSchema","nullable","makeIncludeSchema","makeOmitSchema","makeSkipSchema","findOne","literal","makeTakeSchema","orArray","makeOrderBySchema","makeCursorSchema","makeDistinctSchema","result","strictObject","refineForSelectIncludeMutuallyExclusive","refineForSelectOmitMutuallyExclusive","attributes","typeDefs","enums","match","with","addStringValidation","addNumberValidation","number","int","boolean","union","addBigIntValidation","bigint","addDecimalValidation","instanceof","Decimal","date","iso","datetime","Uint8Array","makeJsonValueSchema","otherwise","key","enumDef","getEnum","enum","typeDef","getTypeDef","looseObject","fromEntries","entries","map","field","def","fieldSchema","nullish","finalSchema","any","superRefine","ctx","parseResult","issues","forEach","issue","addIssue","withoutRelationFields","withAggregations","modelDef","requireModel","fieldDef","requireField","relation","lazy","nullableIf","some","none","is","isNot","makeEnumFilterSchema","makeArrayFilterSchema","isTypeDefType","makeTypedJsonFilterSchema","makePrimitiveFilterSchema","uniqueFields","getUniqueFields","uniqueField","object","defs","never","custom","v","baseWhere","required","refine","candidates","fieldSchemas","fieldName","push","recursiveSchema","makeJsonFilterSchema","null","baseSchema","internalMakeArrayFilterSchema","components","makeCommonPrimitiveFilterComponents","elementSchema","equals","has","hasEvery","hasSome","isEmpty","makeStringFilterSchema","P","makeNumberFilterSchema","makeBooleanFilterSchema","makeDateTimeFilterSchema","makeBytesFilterSchema","exhaustive","forFilter","JsonNullClass","DbNullClass","AnyNullClass","valueSchema","path","not","string_contains","string_starts_with","string_ends_with","mode","makeStringModeSchema","array_contains","array_starts_with","array_ends_with","makeCommonPrimitiveFilterSchema","makeThis","supportedOperators","commonAggSchema","notEquals","in","notIn","lt","lte","gt","gte","includes","_count","_avg","_sum","_min","_max","extractFields","startsWith","endsWith","contains","providerSupportsCaseSensitivity","makeRelationSelectIncludeSchema","_countSchema","makeCountSelectionSchema","toManyRelations","filter","select","reduce","acc","objSchema","include","omit","orderBy","skip","take","cursor","distinct","allowQueryTimeOmitOverride","withRelation","WithAggregation","sort","relationOrderBy","extend","nulls","aggregationFields","agg","nonRelationFields","dataSchema","makeCreateDataSchema","makeCreateManyDataSchema","base","canBeArray","withoutFields","uncheckedVariantFields","checkedVariantFields","hasRelation","f","computed","isDelegateDiscriminator","excludeFields","oppositeField","opposite","oppositeFieldDef","makeRelationManipulationSchema","allFksOptional","fkDef","fieldHasDefaultValue","references","addListValidation","foreignKeyFor","uncheckedCreateSchema","addCustomValidation","checkedCreateSchema","originModel","discriminatorField","getDiscriminatorField","fieldType","create","connect","makeConnectDataSchema","connectOrCreate","makeConnectOrCreateDataSchema","makeDisconnectDataSchema","makeDeleteRelationDataSchema","makeUpdateDataSchema","upsertWhere","update","makeSetDataSchema","toManyRelation","uniqueFilter","whereSchema","createSchema","skipDuplicates","limit","nonnegative","isNumericField","increment","decrement","multiply","divide","arraySchema","uncheckedUpdateSchema","checkedUpdateSchema","makeCountAggregateInputSchema","_all","makeSumAvgInputSchema","makeMinMaxInputSchema","bySchema","by","having","makeHavingSchema","bys","val","AGGREGATE_OPERATORS","onlyAggregationFields","LOGICAL_COMBINATORS","enumerate","NUMERIC_FIELD_TYPES","provider","ZenStackDriver","WeakSet","WeakMap","driver","log","init","Error","then","catch","err","undefined","Promise","reject","acquireConnection","connection","has","add","releaseConnection","beginTransaction","settings","result","set","commitTransaction","callbacks","get","delete","callback","console","error","rollbackTransaction","destroy","isLevelEnabled","executeQuery","streamQuery","dis","compiledQuery","caughtError","startTime","performanceNow","call","chunkSize","level","query","queryDurationMillis","isStream","isTransactionConnection","registerTransactionCommitCallback","push","performance","now","Date","invariant","AndNode","createQueryId","DefaultQueryExecutor","DeleteQueryNode","InsertQueryNode","ReturningNode","SelectionNode","SingleConnectionProvider","TableNode","UpdateQueryNode","WhereNode","match","invariant","AliasNode","ColumnNode","ColumnUpdateNode","expressionBuilder","ExpressionWrapper","FromNode","IdentifierNode","OperationNodeTransformer","PrimitiveValueListNode","ReferenceNode","SelectAllNode","SelectionNode","TableNode","ValueListNode","ValueNode","ValuesNode","QueryNameMapper","OperationNodeTransformer","modelToTableMap","Map","fieldToColumnMap","scopes","schema","modelName","modelDef","Object","entries","models","mappedName","getMappedName","set","fieldDef","getModelFields","name","transformSelectQuery","node","from","froms","processedFroms","map","processSelectTable","processedJoins","cumulativeScopes","scope","join","joins","processedJoin","withScopes","table","push","i","on","transformNode","undefined","selections","processSelectQuerySelections","baseResult","FromNode","create","f","transformInsertQuery","into","model","extractModelName","invariant","withScope","values","columns","processEnumMappingForColumns","processTableRef","isOperationNode","value","transformReturning","kind","processSelections","transformReference","ColumnNode","is","column","resolveFieldFromScopes","identifier","namesMapped","mappedFieldName","mapFieldName","mappedTableName","alias","IdentifierNode","mapTableName","ReferenceNode","createTableNode","transformColumn","transformBinaryOperation","leftOperand","ValueNode","rightOperand","PrimitiveValueListNode","columnNode","resolvedScope","valueNode","resultValue","processEnumMappingForValue","processEnumMappingForValues","transformUpdateQuery","innerTable","stripAlias","TableNode","updates","update","origColumn","ColumnUpdateNode","wrapAlias","transformDeleteQuery","innerNode","selection","processedSelections","SelectAllNode","requireCurrentScope","createSelectAllFields","originalField","transformSelection","transformed","extractFieldName","AliasNode","SelectionNode","fieldName","enumProcessedSelections","processEnumSelection","qualifier","length","getModel","some","pushScope","fn","pop","forEach","s","tableSchema","getTableSchema","def","mapAttr","attributes","find","attr","nameArg","args","arg","field","get","tableName","hasMappedColumns","keys","key","startsWith","finalAlias","provider","type","defaultSchema","schemaAttr","mapArg","requireModel","columnName","columnRef","aliased","fields","filter","relation","computed","originModel","result","processed","processSelectAll","Array","isArray","processSelection","addAlias","modelUsesEnumWithMappedValues","transformSelectAll","enumProcessed","schemaName","createWithSchema","enumDef","getEnum","getEnumValueMapping","mapping","ValuesNode","valueItems","ValueListNode","getField","isEnum","enumValueMapping","mappedValue","fieldScope","aliasName","eb","expressionBuilder","caseBuilder","case","caseWhen","when","ExpressionWrapper","then","finalExpr","else","cast","end","as","toOperationNode","ZenStackQueryExecutor","DefaultQueryExecutor","nameMapper","client","driver","compiler","adapter","connectionProvider","plugins","suppressMutationHooks","$schema","provider","type","schemaHasMappedNames","QueryNameMapper","schema","hasMapAttr","decl","attributes","some","attr","name","Object","values","fields","field","models","typeDefs","kysely","$qb","options","$options","executeQuery","compiledQuery","queryParams","$raw","parameters","undefined","provideConnection","connection","startedTx","isMutationNode","query","isTransactionConnection","beginTransaction","isolationLevel","TransactionIsolationLevel","ReadCommitted","result","proceedQueryWithKyselyInterceptors","queryId","commitTransaction","err","rollbackTransaction","ORMError","createDBQueryError","sql","queryNode","proceed","q","proceedQuery","hooks","plugin","onKyselyQuery","push","bind","hook","_proceed","_p","hookResult","getMutationInfo","model","getMutationModel","action","where","match","when","InsertQueryNode","is","UpdateQueryNode","node","DeleteQueryNode","exhaustive","compiled","hasEntityMutationPlugins","finalQuery","processNameMapping","compileQuery","internalExecuteQuery","hasEntityMutationPluginsWithAfterMutationHooks","returning","ReturningNode","create","SelectionNode","createSelectAll","currentlyInTx","connectionClient","createClientForConnection","mutationInfo","beforeMutationEntities","loadBeforeMutationEntities","loadEntities","callBeforeMutationHooks","callAfterMutationHooks","registerTransactionCommitCallback","transformNode","inTx","innerExecutor","withConnectionProvider","SingleConnectionProvider","innerClient","withExecutor","forceTransaction","onEntityMutation","afterEntityMutation","withPlugin","withPlugins","withPluginAtFront","withoutPlugins","newExecutor","invariant","into","table","identifier","tableNode","stripAlias","TableNode","from","froms","length","otherwise","createInternalError","beforeEntityMutation","queryResult","filterFor","runAfterMutationWithinTransaction","mutationModel","loadAfterMutationEntities","rows","selectQuery","selectFrom","selectAll","selectQueryNode","toOperationNode","andNodes","createQueryId","condition1","condition2","WhereNode","AndNode","invariant","lowerCaseFirst","upperCaseFirst","sql","ValueNode","match","contains","eb","args","context","textMatch","search","_eb","_args","Error","startsWith","endsWith","dialect","method","field","caseInsensitive","undefined","casingBehavior","getStringCasingBehavior","caseInsensitiveValue","readBoolean","op","fieldExpr","searchExpr","supportsILike","likeCaseSensitive","fn","escapedSearch","sql","match","with","lit","exhaustive","raw","has","hasEvery","hasSome","isEmpty","buildArrayLength","now","currentModel","model","result","casing","processCasing","currentOperation","operation","opNode","toOperationNode","invariant","ValueNode","is","value","toUpperCase","toLowerCase","upperCaseFirst","lowerCaseFirst","otherwise","expr","defaultValue","invariant","sql","toposort","match","SchemaDbPusher","schema","kysely","push","transaction","execute","tx","enums","provider","type","name","enumDef","Object","entries","enumValues","fields","values","map","f","mapAttr","attributes","find","a","args","mappedName","ExpressionUtils","getLiteralValue","value","invariant","createEnum","createType","asEnum","models","filter","m","isView","sortedModels","sortModels","modelDef","createTable","createModelTable","graph","model","added","baseModel","baseDef","requireModel","field","relation","references","targetModel","undefined","toposort","reverse","table","getTableName","ifNotExists","fieldName","fieldDef","originModel","id","addForeignKeyConstraint","isComputedField","createModelField","baseModelDef","idFields","cb","onDelete","onUpdate","addPrimaryKeyConstraint","addUniqueConstraint","getColumnName","some","length","key","uniqueFields","unique","keys","fDef","addColumn","mapFieldType","col","primaryKey","default","isCall","function","defaultTo","sql","optional","array","notNull","isAutoIncrement","autoIncrement","ref","isCustomType","result","match","with","otherwise","Error","raw","typeDefs","def","relationModelDef","mapCascadeAction","action","exhaustive","createZenStackPromise","callback","promise","cb","txClient","valueToPromise","err","Promise","reject","then","onFulfilled","onRejected","catch","finally","onFinally","Symbol","toStringTag","thing","resolve","ResultProcessor","dialect","schema","options","getCrudDialect","processResult","data","model","args","result","doProcessResult","fixReversedResult","Array","isArray","forEach","row","i","processRow","key","value","Object","entries","undefined","JSON","parse","startsWith","DELEGATE_JOINED_FIELD_PREFIX","subRow","transformOutput","subModel","slice","length","idValues","getIdValues","values","some","v","processedSubRow","assign","fieldDef","getField","array","relation","processRelation","processFieldValue","type","relationData","take","reverse","selectInclude","include","select","ensureArray","field","ZenStackClient","schema","options","ClientImpl","kysely","kyselyRaw","$options","$schema","kyselyProps","auth","baseClient","executor","functions","BuiltinFunctions","ZenStackQueryExecutor","driver","dialect","createQueryCompiler","createAdapter","DefaultConnectionProvider","ZenStackDriver","createDriver","Log","log","compiler","adapter","connectionProvider","config","Kysely","DefaultQueryExecutor","createClientProxy","$qb","$qbRaw","isTransaction","withExecutor","$transaction","input","invariant","Array","isArray","every","p","then","cb","interactiveTransaction","sequentialTransaction","forceTransaction","Transaction","callback","txBuilder","transaction","isolationLevel","setIsolationLevel","execute","tx","txClient","arg","result","promise","push","$procs","Object","keys","procedures","reduce","acc","name","handleProc","createConfigError","procDef","procOptions","inputValidator","InputValidator","validatedInput","validateProcedureInput","handler","invokeWithClient","client","_input","proceed","nextInput","sanitizedNextInput","plugins","plugin","onProcedure","_proceed","mutation","finalInput","$connect","connection","conn","executeQuery","sql","compile","$disconnect","destroy","$pushSchema","SchemaDbPusher","$use","newPlugins","newOptions","$unuse","pluginId","id","$unuseAll","$setAuth","undefined","Error","newClient","$auth","$setOptions","$setInputValidation","enable","validateInput","$executeRaw","query","values","createZenStackPromise","Number","numAffectedRows","$executeRawUnsafe","compiledQuery","createRawCompiledQuery","$queryRaw","rows","$queryRawUnsafe","q","CompiledQuery","raw","$raw","resultProcessor","ResultProcessor","Proxy","get","target","prop","receiver","startsWith","Reflect","model","models","find","m","toLowerCase","createModelCrudHandler","createPromise","operation","nominalOperation","args","postProcess","throwIfNoResult","_args","_handler","withClient","r","handle","createNotFoundError","processResult","onQuery","nextArgs","findUnique","FindOperationHandler","findUniqueOrThrow","findFirst","findFirstOrThrow","findMany","create","CreateOperationHandler","createMany","createManyAndReturn","update","UpdateOperationHandler","updateMany","updateManyAndReturn","upsert","delete","DeleteOperationHandler","deleteMany","count","CountOperationHandler","aggregate","AggregateOperationHandler","groupBy","GroupByOperationHandler","exists","ExistsOperationHandler","definePlugin","plugin","OperationNodeVisitor","DefaultOperationNodeVisitor","OperationNodeVisitor","defaultVisit","node","Object","values","forEach","value","Array","isArray","el","kind","visitNode","visitSelectQuery","visitSelection","visitColumn","visitAlias","visitTable","visitFrom","visitReference","visitAnd","visitOr","visitValueList","visitParens","visitJoin","visitRaw","visitWhere","visitInsertQuery","visitDeleteQuery","visitReturning","visitCreateTable","visitAddColumn","visitColumnDefinition","visitDropTable","visitOrderBy","visitOrderByItem","visitGroupBy","visitGroupByItem","visitUpdateQuery","visitColumnUpdate","visitLimit","visitOffset","visitOnConflict","visitOnDuplicateKey","visitCheckConstraint","visitDataType","visitSelectAll","visitIdentifier","visitSchemableIdentifier","visitValue","visitPrimitiveValueList","visitOperator","visitCreateIndex","visitDropIndex","visitList","visitPrimaryKeyConstraint","visitUniqueConstraint","visitReferences","visitWith","visitCommonTableExpression","visitCommonTableExpressionName","visitHaving","visitCreateSchema","visitDropSchema","visitAlterTable","visitDropColumn","visitRenameColumn","visitAlterColumn","visitModifyColumn","visitAddConstraint","visitDropConstraint","visitForeignKeyConstraint","visitCreateView","visitDropView","visitGenerated","visitDefaultValue","visitOn","visitValues","visitSelectModifier","visitCreateType","visitDropType","visitExplain","visitDefaultInsertValue","visitAggregateFunction","visitOver","visitPartitionBy","visitPartitionByItem","visitSetOperation","visitBinaryOperation","visitUnaryOperation","visitUsing","visitFunction","visitCase","visitWhen","visitJSONReference","visitJSONPath","visitJSONPathLeg","visitJSONOperatorChain","visitTuple","visitMergeQuery","visitMatched","visitAddIndex","visitCast","visitFetch","visitTop","visitOutput","visitRenameConstraint","visitRefreshMaterializedView","visitOrAction","visitCollate","match","ExpressionVisitor","visit","expr","match","with","kind","e","visitLiteral","visitArray","visitField","visitMember","visitBinary","visitUnary","visitCall","visitThis","visitNull","exhaustive","_e","item","items","result","abort","receiver","l","left","right","operand","arg","args","r","MatchingExpressionVisitor","found","predicate","find"]}
|