@zenstackhq/runtime 3.0.0-alpha.31 → 3.0.0-alpha.32
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/{contract-5Wcmlo5v.d.cts → contract-CToGslMD.d.cts} +36 -38
- package/dist/{contract-5Wcmlo5v.d.ts → contract-CToGslMD.d.ts} +36 -38
- package/dist/index.cjs +297 -261
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +245 -209
- package/dist/index.js.map +1 -1
- package/dist/plugins/policy/index.d.cts +1 -1
- package/dist/plugins/policy/index.d.ts +1 -1
- package/package.json +8 -8
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/expression.ts","../src/utils/object-utils.ts","../src/client/errors.ts","../src/client/crud/operations/base.ts","../src/plugins/policy/errors.ts","../src/plugins/policy/policy-handler.ts","../src/client/crud/dialects/index.ts","../src/client/crud/dialects/postgresql.ts","../src/client/constants.ts","../src/client/crud/dialects/base.ts","../src/utils/enumerate.ts","../src/client/crud/dialects/sqlite.ts","../src/utils/default-operation-node-visitor.ts","../src/plugins/policy/column-collector.ts","../src/plugins/policy/expression-transformer.ts","../src/plugins/policy/expression-evaluator.ts","../src/plugins/policy/utils.ts","../src/plugins/policy/plugin.ts","../src/utils/clone.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.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/client/index.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 type KyselyProps,\n} from 'kysely';\nimport type { GetModels, ProcedureDef, SchemaDef } from '../schema';\nimport type { AuthType } from '../schema/auth';\nimport type { UnwrapTuplePromises } from '../utils/type-utils';\nimport type { ClientConstructor, ClientContract, ModelOperations, TransactionIsolationLevel } 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 { NotFoundError, QueryError } 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 type { ToKysely } from './query-builder';\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>(schema, options);\n} as unknown as ClientConstructor;\n\nexport class ClientImpl<Schema extends SchemaDef> {\n private kysely: ToKysely<Schema>;\n private kyselyRaw: ToKysely<any>;\n public readonly $options: ClientOptions<Schema>;\n public readonly $schema: Schema;\n readonly kyselyProps: KyselyProps;\n private auth: AuthType<Schema> | undefined;\n\n constructor(\n private readonly schema: Schema,\n private options: ClientOptions<Schema>,\n baseClient?: ClientImpl<Schema>,\n executor?: QueryExecutor,\n ) {\n this.$schema = schema;\n this.$options = options ?? ({} as ClientOptions<Schema>);\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<Schema>) => Promise<T>,\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<T>;\n\n // overload for sequential transaction\n $transaction<P extends ZenStackPromise<Schema, 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 private async interactiveTransaction(\n callback: (tx: ClientContract<Schema>) => 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<Schema>);\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<Schema>(this.schema, this.$options, this);\n txClient.kysely = tx;\n return callback(txClient as unknown as ClientContract<Schema>);\n });\n }\n }\n\n private async sequentialTransaction(\n arg: ZenStackPromise<Schema, any>[],\n options?: { isolationLevel?: TransactionIsolationLevel },\n ) {\n const execute = async (tx: Kysely<any>) => {\n const txClient = new ClientImpl<Schema>(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<Schema>));\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 Kysely<any>));\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 new QueryError('Procedures are not configured for the client.');\n }\n\n const procOptions = this.$options.procedures as ProceduresOptions<\n Schema & {\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 $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<Schema>) {\n // tsc perf\n const newPlugins: RuntimePlugin<Schema>[] = [...(this.$options.plugins ?? []), plugin];\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $unuse(pluginId: string) {\n // tsc perf\n const newPlugins: RuntimePlugin<Schema>[] = [];\n for (const plugin of this.options.plugins ?? []) {\n if (plugin.id !== pluginId) {\n newPlugins.push(plugin);\n }\n }\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $unuseAll() {\n // tsc perf\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: [] as RuntimePlugin<Schema>[],\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $setAuth(auth: AuthType<Schema> | undefined) {\n if (auth !== undefined && typeof auth !== 'object') {\n throw new Error('Invalid auth object');\n }\n const newClient = new ClientImpl<Schema>(this.schema, this.$options, this);\n newClient.auth = auth;\n return newClient;\n }\n\n get $auth() {\n return this.auth;\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<Schema extends SchemaDef>(client: ClientImpl<Schema>): ClientImpl<Schema> {\n const inputValidator = new InputValidator(client.$schema);\n const resultProcessor = new ResultProcessor(client.$schema);\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(\n client as unknown as ClientContract<Schema>,\n model as GetModels<Schema>,\n inputValidator,\n resultProcessor,\n );\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as unknown as ClientImpl<Schema>;\n}\n\nfunction createModelCrudHandler<Schema extends SchemaDef, Model extends GetModels<Schema>>(\n client: ClientContract<Schema>,\n model: Model,\n inputValidator: InputValidator<Schema>,\n resultProcessor: ResultProcessor<Schema>,\n): ModelOperations<Schema, Model> {\n const createPromise = (\n operation: CoreCrudOperation,\n nominalOperation: AllCrudOperation,\n args: unknown,\n handler: BaseOperationHandler<Schema>,\n postProcess = false,\n throwIfNoResult = false,\n ) => {\n return createZenStackPromise(async (txClient?: ClientContract<Schema>) => {\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 new NotFoundError(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n findUniqueOrThrow: (args: unknown) => {\n return createPromise(\n 'findUnique',\n 'findUniqueOrThrow',\n args,\n new FindOperationHandler<Schema>(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n findFirstOrThrow: (args: unknown) => {\n return createPromise(\n 'findFirst',\n 'findFirstOrThrow',\n args,\n new FindOperationHandler<Schema>(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n create: (args: unknown) => {\n return createPromise(\n 'create',\n 'create',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n createMany: (args: unknown) => {\n return createPromise(\n 'createMany',\n 'createMany',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n createManyAndReturn: (args: unknown) => {\n return createPromise(\n 'createManyAndReturn',\n 'createManyAndReturn',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n update: (args: unknown) => {\n return createPromise(\n 'update',\n 'update',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n updateMany: (args: unknown) => {\n return createPromise(\n 'updateMany',\n 'updateMany',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n updateManyAndReturn: (args: unknown) => {\n return createPromise(\n 'updateManyAndReturn',\n 'updateManyAndReturn',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n upsert: (args: unknown) => {\n return createPromise(\n 'upsert',\n 'upsert',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n delete: (args: unknown) => {\n return createPromise(\n 'delete',\n 'delete',\n args,\n new DeleteOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n deleteMany: (args: unknown) => {\n return createPromise(\n 'deleteMany',\n 'deleteMany',\n args,\n new DeleteOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n count: (args: unknown) => {\n return createPromise(\n 'count',\n 'count',\n args,\n new CountOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n aggregate: (args: unknown) => {\n return createPromise(\n 'aggregate',\n 'aggregate',\n args,\n new AggregateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n groupBy: (args: unknown) => {\n return createPromise(\n 'groupBy',\n 'groupBy',\n args,\n new GroupByOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n } as ModelOperations<Schema, Model>;\n}\n","import type { ExpressionBuilder } from 'kysely';\nimport { sql } from 'kysely';\nimport { 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(eb as ExpressionBuilder<any, any>, this.model, this.model)\n .where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));\n\n // select fields: collect fields from aggregation body\n const selectedFields: string[] = [];\n for (const [key, value] of Object.entries(parsedArgs)) {\n if (key.startsWith('_') && value && typeof value === 'object') {\n // select fields\n Object.entries(value)\n .filter(([field]) => field !== '_all')\n .filter(([, val]) => val === true)\n .forEach(([field]) => {\n if (!selectedFields.includes(field)) selectedFields.push(field);\n });\n }\n }\n if (selectedFields.length > 0) {\n for (const field of selectedFields) {\n subQuery = this.dialect.buildSelectField(subQuery, this.model, this.model, field);\n }\n } else {\n // if no field is explicitly selected, just do a `select 1` so `_count` works\n subQuery = subQuery.select(() => eb.lit(1).as('_all'));\n }\n\n // skip & take\n const skip = parsedArgs?.skip;\n let take = parsedArgs?.take;\n let negateOrderBy = false;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n subQuery = this.dialect.buildSkipTake(subQuery, skip, take);\n\n // orderBy\n subQuery = this.dialect.buildOrderBy(\n subQuery,\n this.model,\n this.model,\n parsedArgs.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n return subQuery.as('$sub');\n });\n\n // aggregations\n for (const [key, value] of Object.entries(parsedArgs)) {\n switch (key) {\n case '_count': {\n if (value === true) {\n query = query.select((eb) => 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(sql.ref(`$sub.${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) => {\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(sql.ref(`$sub.${field}`)).as(`${key}.${field}`);\n });\n }\n });\n break;\n }\n }\n }\n\n const result = await this.executeQuery(this.kysely, query, 'aggregate');\n const ret: any = {};\n\n // postprocess result to convert flat fields into nested objects\n for (const [key, value] of Object.entries(result.rows[0] as object)) {\n if (key === '_count') {\n ret[key] = value;\n continue;\n }\n const parts = key.split('.');\n if (parts.length < 2) {\n continue;\n }\n\n const op = parts[0]!;\n const field = [...parts.slice(1)].join('.');\n\n let val: any = value;\n if (typeof value === 'string') {\n const fieldDef = getField(this.schema, this.model, field);\n if (fieldDef) {\n const type = fieldDef.type;\n if (op === '_avg') {\n val = parseFloat(val);\n } else {\n if (op === '_sum' || op === '_min' || op === '_max') {\n val = match(type)\n .with('Int', () => parseInt(value, 10))\n .with('BigInt', () => BigInt(value))\n .with('Float', () => parseFloat(value))\n .with('Decimal', () => parseFloat(value))\n .otherwise(() => value);\n }\n }\n }\n }\n\n ret[op] = {\n ...ret[op],\n [field]: val,\n };\n }\n\n return ret;\n }\n}\n","import type { Expression, ExpressionBuilder, ExpressionWrapper } 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 { InternalError, QueryError } from './errors';\nimport type { ClientOptions } from './options';\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 schema.models[model];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n const matchedName = Object.keys(schema.models).find((k) => k.toLowerCase() === model.toLowerCase());\n if (!matchedName) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\n return schema.models[matchedName]!;\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, model: string, field: string) {\n const modelDef = requireModel(schema, model);\n if (!modelDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in model \"${model}\"`);\n }\n return modelDef.fields[field];\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n const modelDef = requireModel(schema, model);\n return modelDef?.idFields as GetModels<Schema>[];\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 new InternalError(`Model \"${model}\" does not have ID field(s)`);\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 new InternalError(`Field \"${relationField}\" is not a relation`);\n }\n\n if (fieldDef.relation.fields) {\n if (!fieldDef.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\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 new InternalError(`Opposite relation not defined for field \"${relationField}\"`);\n }\n\n const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n if (!oppositeField.relation) {\n throw new InternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`);\n }\n if (!oppositeField.relation.fields) {\n throw new InternalError(`Relation fields not defined for field \"${relationField}\"`);\n }\n if (!oppositeField.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\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 new InternalError(`Invalid unique field definition for \"${key}\"`);\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 new InternalError(`ID fields not defined for model \"${model}\"`);\n }\n return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function buildFieldRef<Schema extends SchemaDef>(\n schema: Schema,\n model: string,\n field: string,\n options: ClientOptions<Schema>,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n): ExpressionWrapper<any, any, unknown> {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.computed) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n } else {\n if (!inlineComputedField) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n }\n let computer: Function | undefined;\n if ('computedFields' in options) {\n const computedFields = options.computedFields as Record<string, any>;\n computer = computedFields?.[model]?.[field];\n }\n if (!computer) {\n throw new QueryError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n }\n return computer(eb, { currentModel: modelAlias });\n }\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 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 = getIdFields(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 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 = [model, fieldDef.type].sort();\n\n let orderedFK: [string, string];\n if (model !== fieldDef.type) {\n // not a self-relation, model name's sort order determines fk order\n orderedFK = sortedModelNames[0] === model ? ['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 return {\n parentFkName: orderedFK[0],\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: orderedFK[1],\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 result: any = {};\n for (const [key, value] of Object.entries(filter)) {\n if (compoundUniques.some(({ name }) => name === key)) {\n // flatten the compound field\n Object.assign(result, value);\n } else {\n result[key] = value;\n }\n }\n return result;\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 safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n\nexport function extractIdFields(entity: any, schema: SchemaDef, model: string) {\n const idFields = getIdFields(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 new InternalError(`Discriminator field not defined for 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","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from '.';\n\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return {\n kind: 'literal',\n value,\n };\n },\n\n array: (items: Expression[]): ArrayExpression => {\n return {\n kind: 'array',\n items,\n };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return {\n kind: 'call',\n function: functionName,\n args,\n };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression): BinaryExpression => {\n return {\n kind: 'binary',\n op,\n left,\n right,\n };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return {\n kind: 'unary',\n op,\n operand,\n };\n },\n\n field: (field: string): FieldExpression => {\n return {\n kind: 'field',\n field,\n };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return {\n kind: 'member',\n receiver: receiver,\n members,\n };\n },\n\n _this: (): ThisExpression => {\n return {\n kind: 'this',\n };\n },\n\n _null: (): NullExpression => {\n return {\n kind: 'null',\n };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n};\n","/**\n * Extract fields from an object.\n */\nexport function extractFields(obj: any, fields: 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: string[]): Record<string, boolean> {\n return Object.fromEntries(fields.map((f) => [f, true]));\n}\n","/**\n * Error thrown when input validation fails.\n */\nexport class InputValidationError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when a query fails.\n */\nexport class QueryError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when an internal error occurs.\n */\nexport class InternalError extends Error {}\n\n/**\n * Error thrown when an entity is not found.\n */\nexport class NotFoundError extends Error {\n constructor(model: string) {\n super(`Entity not found for model \"${model}\"`);\n }\n}\n","import { createId } from '@paralleldrive/cuid2';\nimport { invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport {\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 { ClientContract } from '../..';\nimport { PolicyPlugin } from '../../../plugins/policy';\nimport type { BuiltinType, Expression, FieldDef } from '../../../schema';\nimport { ExpressionUtils, type GetModels, type ModelDef, type SchemaDef } from '../../../schema';\nimport { clone } from '../../../utils/clone';\nimport { enumerate } from '../../../utils/enumerate';\nimport { extractFields, fieldsToSelectObject } from '../../../utils/object-utils';\nimport { NUMERIC_FIELD_TYPES } from '../../constants';\nimport type { CRUD } from '../../contract';\nimport type { FindArgs, SelectIncludeOmit, WhereInput } from '../../crud-types';\nimport { InternalError, NotFoundError, QueryError } from '../../errors';\nimport type { ToKysely } from '../../query-builder';\nimport {\n ensureArray,\n extractIdFields,\n flattenCompoundUniqueFilters,\n getDiscriminatorField,\n getField,\n getIdFields,\n getIdValues,\n getManyToManyRelation,\n getModel,\n getRelationForeignKeyFieldPairs,\n isForeignKeyField,\n isRelationField,\n isScalarField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { getCrudDialect } from '../dialects';\nimport type { BaseCrudDialect } from '../dialects/base';\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\nexport type FromRelationContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n field: string;\n ids: any;\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() {\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 instanceof 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 const idFields = getIdFields(this.schema, model);\n const _filter = flattenCompoundUniqueFilters(this.schema, model, filter);\n const query = kysely\n .selectFrom(model)\n .where((eb) => eb.and(_filter))\n .select(idFields.map((f) => kysely.dynamic.ref(f)))\n .limit(1)\n .modifyEnd(this.makeContextComment({ model, operation: 'read' }));\n return this.executeQueryTakeFirst(kysely, query, 'exists');\n }\n\n protected async read(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true> | undefined,\n ): Promise<any[]> {\n // table\n let query = this.dialect.buildSelectModel(expressionBuilder(), 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 queryId = { queryId: `zenstack-${createId()}` };\n const compiled = kysely.getExecutor().compileQuery(query.toOperationNode(), queryId);\n try {\n const r = await kysely.getExecutor().executeQuery(compiled, queryId);\n result = r.rows;\n } catch (err) {\n const message = `Failed to execute query: ${err}, sql: ${compiled.sql}`;\n throw new QueryError(message, err);\n }\n\n return result;\n }\n\n protected async readUnique(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true>,\n ) {\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 new QueryError(`Field \"${field}\" doesn't support filtering`);\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: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation?: FromRelationContext<Schema>,\n creatingForDelegate = false,\n ): Promise<unknown> {\n const modelDef = this.requireModel(model);\n\n // additional validations\n if (modelDef.isDelegate && !creatingForDelegate) {\n throw new QueryError(`Model \"${this.model}\" is a delegate and cannot be created directly.`);\n }\n\n let createFields: any = {};\n let parentUpdateTask: ((entity: any) => Promise<unknown>) | 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 = this.buildFkAssignments(\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n );\n Object.assign(createFields, parentFkFields);\n } else {\n parentUpdateTask = (entity) => {\n const query = kysely\n .updateTable(fromRelation.model)\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: entity[pk],\n }),\n {} as any,\n ),\n )\n .where((eb) => eb.and(fromRelation.ids))\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n return this.executeQuery(kysely, query, 'update');\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.fillGeneratedValues(modelDef, createFields);\n const idFields = getIdFields(this.schema, model);\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(idFields 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 // let createdEntity: any;\n // try {\n // createdEntity = await this.executeQueryTakeFirst(kysely, query, 'create');\n // } catch (err) {\n // const { sql, parameters } = query.compile();\n // throw new QueryError(`Error during create: ${err}, sql: ${sql}, parameters: ${parameters}`);\n // }\n\n if (Object.keys(postCreateRelations).length > 0) {\n // process nested creates that need to happen after the current entity is created\n const relationPromises = Object.entries(postCreateRelations).map(([field, subPayload]) => {\n return this.processNoneOwnedRelationForCreate(kysely, model, field, subPayload, createdEntity);\n });\n\n // await relation creation\n await Promise.all(relationPromises);\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 (parentUpdateTask) {\n await parentUpdateTask(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 buildFkAssignments(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 throw new QueryError(`Field \"${pair.pk}\" not found in parent created data`);\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: ToKysely<Schema>,\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 implement 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 = getIdFields(this.schema, sortedRecords[0]!.model);\n const secondIds = getIdFields(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: ToKysely<Schema>, model: GetModels<Schema>, 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 new NotFoundError(`Could not find the entity for connect action`);\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 new QueryError(`Invalid relation action: ${action}`);\n }\n }\n\n return result;\n }\n\n private processNoneOwnedRelationForCreate(\n kysely: ToKysely<Schema>,\n contextModel: GetModels<Schema>,\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 tasks: Promise<unknown>[] = [];\n const fromRelationContext = {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\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 tasks.push(\n ...enumerate(subPayload).map((item) =>\n this.create(kysely, relationModel, item, fromRelationContext),\n ),\n );\n break;\n }\n\n case 'createMany': {\n invariant(relationFieldDef.array, 'relation must be an array for createMany');\n tasks.push(\n this.createMany(\n kysely,\n relationModel,\n subPayload as { data: any; skipDuplicates: boolean },\n false,\n fromRelationContext,\n ),\n );\n break;\n }\n\n case 'connect': {\n tasks.push(\n this.connectRelation(kysely, relationModel, subPayload, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n }),\n );\n break;\n }\n\n case 'connectOrCreate': {\n tasks.push(\n ...enumerate(subPayload).map((item) =>\n this.exists(kysely, relationModel, item.where).then((found) =>\n !found\n ? this.create(kysely, relationModel, item.create, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n })\n : this.connectRelation(kysely, relationModel, found, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n }),\n ),\n ),\n );\n break;\n }\n\n default:\n throw new QueryError(`Invalid relation action: ${action}`);\n }\n }\n\n return Promise.all(tasks);\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<Schema>,\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 new QueryError('incorrect relation hierarchy for createMany');\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.fillGeneratedValues(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 new QueryError('\"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 const idFields = getIdFields(this.schema, model);\n const result = await query.returning(idFields 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 fillGeneratedValues(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 fields[field]?.default === 'object' && 'kind' in fields[field].default) {\n const generated = this.evalGenerator(fields[field].default);\n if (generated !== undefined) {\n values[field] = generated;\n }\n } else if (fields[field]?.updatedAt) {\n // TODO: should this work at kysely level instead?\n values[field] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\n }\n }\n }\n return values;\n }\n\n private evalGenerator(defaultValue: Expression) {\n if (ExpressionUtils.isCall(defaultValue)) {\n return match(defaultValue.function)\n .with('cuid', () => createId())\n .with('uuid', () =>\n defaultValue.args?.[0] &&\n ExpressionUtils.isLiteral(defaultValue.args?.[0]) &&\n defaultValue.args[0].value === 7\n ? uuid.v7()\n : uuid.v4(),\n )\n .with('nanoid', () =>\n defaultValue.args?.[0] &&\n ExpressionUtils.isLiteral(defaultValue.args[0]) &&\n typeof defaultValue.args[0].value === 'number'\n ? nanoid(defaultValue.args[0].value)\n : nanoid(),\n )\n .with('ulid', () => ulid())\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 protected async update(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n data: any,\n fromRelation?: FromRelationContext<Schema>,\n allowRelationUpdate = true,\n throwIfNotFound = true,\n ): Promise<unknown> {\n if (!data || typeof data !== 'object') {\n throw new InternalError('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 // fill in automatically updated fields\n const modelDef = this.requireModel(model);\n let finalData = data;\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 }\n }\n\n if (Object.keys(finalData).length === 0) {\n // nothing to update, return the original filter so that caller can identify the entity\n return combinedWhere;\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 new NotFoundError(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\n const updateFields: any = {};\n let thisEntity: any = undefined;\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 new QueryError(`Relation update not allowed for field \"${field}\"`);\n }\n if (!thisEntity) {\n thisEntity = await this.readUnique(kysely, model, {\n where: combinedWhere,\n select: this.makeIdSelect(model),\n });\n if (!thisEntity) {\n if (throwIfNotFound) {\n throw new NotFoundError(model);\n } else {\n return null;\n }\n }\n }\n await this.processRelationUpdates(\n kysely,\n model,\n field,\n fieldDef,\n thisEntity,\n finalData[field],\n throwIfNotFound,\n );\n }\n }\n\n if (Object.keys(updateFields).length === 0) {\n // nothing to update, return the filter so that the caller can identify the entity\n return combinedWhere;\n } else {\n const idFields = getIdFields(this.schema, model);\n const query = kysely\n .updateTable(model)\n .where((eb) => this.dialect.buildFilter(eb, model, model, combinedWhere))\n .set(updateFields)\n .returning(idFields 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\n // try {\n // updatedEntity = await this.executeQueryTakeFirst(kysely, query, 'update');\n // } catch (err) {\n // const { sql, parameters } = query.compile();\n // throw new QueryError(\n // `Error during update: ${err}, sql: ${sql}, parameters: ${parameters}`\n // );\n // }\n\n if (!updatedEntity) {\n if (throwIfNotFound) {\n throw new NotFoundError(model);\n } else {\n return null;\n }\n }\n\n return updatedEntity;\n }\n }\n\n private processScalarFieldUpdateData(model: GetModels<Schema>, 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: GetModels<Schema>, filter: any) {\n if (!filter || typeof filter !== 'object') {\n return false;\n }\n const idFields = getIdFields(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: GetModels<Schema>,\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, eb);\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 new InternalError(`Invalid incremental update operation: ${key}`);\n });\n }\n\n private transformScalarListUpdate(\n model: GetModels<Schema>,\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, eb);\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 new InternalError(`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: GetModels<Schema>; 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: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n data: any,\n limit: number | undefined,\n returnData: ReturnData,\n filterModel?: GetModels<Schema>,\n ): Promise<Result> {\n if (typeof data !== 'object') {\n throw new InternalError('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 new QueryError('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((eb) => this.dialect.buildFilter(eb, 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(eb, filterModel, filterModel)\n .where(this.dialect.buildFilter(eb, 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 const idFields = getIdFields(this.schema, model);\n const result = await query.returning(idFields as any).execute();\n return result as Result;\n }\n }\n\n private async processBaseModelUpdateMany(\n kysely: ToKysely<Schema>,\n model: string,\n where: any,\n updateFields: any,\n filterModel: GetModels<Schema>,\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: ToKysely<Schema>, model: GetModels<Schema>) {\n const idFields = getIdFields(this.schema, model);\n return idFields.map((f) => kysely.dynamic.ref(`${model}.${f}`));\n }\n\n private async processRelationUpdates(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n field: string,\n fieldDef: FieldDef,\n parentIds: any,\n args: any,\n throwIfNotFound: boolean,\n ) {\n const tasks: Promise<unknown>[] = [];\n const fieldModel = fieldDef.type as GetModels<Schema>;\n const fromRelationContext = {\n model,\n field,\n ids: parentIds,\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 tasks.push(\n ...enumerate(value).map((item) => 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 tasks.push(\n this.createMany(\n kysely,\n fieldModel,\n value as { data: any; skipDuplicates: boolean },\n false,\n fromRelationContext,\n ),\n );\n break;\n }\n\n case 'connect': {\n tasks.push(this.connectRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'connectOrCreate': {\n tasks.push(this.connectOrCreateRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'disconnect': {\n tasks.push(this.disconnectRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'set': {\n invariant(fieldDef.array, 'relation must be an array');\n tasks.push(this.setRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'update': {\n tasks.push(\n ...(enumerate(value) as { where: any; data: any }[]).map((item) => {\n let where;\n let data;\n if ('where' in item) {\n where = item.where;\n data = item.data;\n } else {\n where = undefined;\n data = item;\n }\n return this.update(\n kysely,\n fieldModel,\n where,\n data,\n fromRelationContext,\n true,\n throwIfNotFound,\n );\n }),\n );\n break;\n }\n\n case 'upsert': {\n tasks.push(\n ...(\n enumerate(value) as {\n where: any;\n create: any;\n update: any;\n }[]\n ).map(async (item) => {\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 return updated;\n } else {\n return this.create(kysely, fieldModel, item.create, fromRelationContext);\n }\n }),\n );\n break;\n }\n\n case 'updateMany': {\n tasks.push(\n ...(enumerate(value) as { where: any; data: any }[]).map((item) =>\n this.update(kysely, fieldModel, item.where, item.data, fromRelationContext, false, false),\n ),\n );\n break;\n }\n\n case 'delete': {\n tasks.push(this.deleteRelation(kysely, fieldModel, value, fromRelationContext, true));\n break;\n }\n\n case 'deleteMany': {\n tasks.push(this.deleteRelation(kysely, fieldModel, value, fromRelationContext, false));\n break;\n }\n\n default: {\n throw new Error('Not implemented yet');\n }\n }\n }\n\n await Promise.all(tasks);\n }\n\n // #region relation manipulation\n\n protected async connectRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 actions = _data.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n return 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 const results = await Promise.all(actions);\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw new NotFoundError(model);\n }\n } else {\n const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n this.schema,\n fromRelation.model,\n fromRelation.field,\n );\n let updateResult: QueryResult<unknown>;\n\n if (ownedByModel) {\n // set parent fk directly\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 new NotFoundError(model);\n }\n const query = kysely\n .updateTable(fromRelation.model)\n .where((eb) => eb.and(fromRelation.ids))\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: target[pk],\n }),\n {} as any,\n ),\n )\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n updateResult = await this.executeQuery(kysely, query, 'connect');\n } else {\n // disconnect current if it's a one-one relation\n const relationFieldDef = this.requireField(fromRelation.model, fromRelation.field);\n\n if (!relationFieldDef.array) {\n const query = kysely\n .updateTable(model)\n .where((eb) => eb.and(keyPairs.map(({ fk, pk }) => eb(sql.ref(fk), '=', fromRelation.ids[pk]))))\n .set(keyPairs.reduce((acc, { fk }) => ({ ...acc, [fk]: null }), {} as any))\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n await this.executeQuery(kysely, query, 'disconnect');\n }\n\n // connect\n const query = kysely\n .updateTable(model)\n .where((eb) => eb.or(_data.map((d) => eb.and(d))))\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: fromRelation.ids[pk],\n }),\n {} as any,\n ),\n )\n .modifyEnd(\n this.makeContextComment({\n model,\n operation: 'update',\n }),\n );\n updateResult = await this.executeQuery(kysely, query, 'connect');\n }\n\n // validate connect result\n if (_data.length > updateResult.numAffectedRows!) {\n // some entities were not connected\n throw new NotFoundError(model);\n }\n }\n }\n\n protected async connectOrCreateRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\n const _data = enumerate(data);\n if (_data.length === 0) {\n return;\n }\n\n return Promise.all(\n _data.map(async ({ where, create }) => {\n const existing = await this.exists(kysely, model, where);\n if (existing) {\n return this.connectRelation(kysely, model, [where], fromRelation);\n } else {\n return this.create(kysely, model, create, fromRelation);\n }\n }),\n );\n }\n\n protected async disconnectRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 const actions = disconnectConditions.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n // not found\n return;\n }\n return 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 await Promise.all(actions);\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 // set parent fk directly\n invariant(disconnectConditions.length === 1, 'only one entity can be disconnected');\n const condition = disconnectConditions[0];\n const query = kysely\n .updateTable(fromRelation.model)\n // id filter\n .where(eb.and(fromRelation.ids))\n // merge extra disconnect conditions\n .$if(condition !== true, (qb) =>\n qb.where(\n eb(\n // @ts-ignore\n eb.refTuple(...keyPairs.map(({ fk }) => fk)),\n 'in',\n eb\n .selectFrom(model)\n .select(keyPairs.map(({ pk }) => pk))\n .where(this.dialect.buildFilter(eb, model, model, condition)),\n ),\n ),\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 } 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(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 actions = _data.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n return 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 const results = await Promise.all(actions);\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw new NotFoundError(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 new InternalError('relation can only be set from the non-owning side');\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 (_data.length > r.numAffectedRows!) {\n // some entities were not connected\n throw new NotFoundError(model);\n }\n }\n }\n }\n\n protected async deleteRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\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: { count: number };\n const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n\n if (m2m) {\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 const fromEntity = await this.readUnique(kysely, fromRelation.model as GetModels<Schema>, {\n where: fromRelation.ids,\n });\n if (!fromEntity) {\n throw new NotFoundError(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 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.count) {\n // some entities were not deleted\n throw new NotFoundError(model);\n }\n }\n\n private normalizeRelationManipulationInput(model: GetModels<Schema>, data: any) {\n return enumerate(data).map((item) => flattenCompoundUniqueFilters(this.schema, model, item));\n }\n\n // #endregion\n\n protected async delete(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n limit?: number,\n filterModel?: GetModels<Schema>,\n ): Promise<{ count: number }> {\n filterModel ??= model;\n\n const modelDef = this.requireModel(model);\n\n if (modelDef.baseModel) {\n if (limit !== undefined) {\n throw new QueryError('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 let query = kysely.deleteFrom(model);\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((eb) => this.dialect.buildFilter(eb, 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(eb, filterModel, filterModel)\n .where((eb) => this.dialect.buildFilter(eb, 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 const result = await this.executeQuery(kysely, query, 'delete');\n return { count: Number(result.numAffectedRows) };\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 new QueryError('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: ToKysely<Schema>,\n model: string,\n where: any,\n limit: number | undefined,\n filterModel: GetModels<Schema>,\n ) {\n return this.delete(kysely, model as GetModels<Schema>, 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>(\n callback: (tx: ToKysely<Schema>) => Promise<T>,\n isolationLevel?: IsolationLevel,\n ) {\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 ?? 'repeatable read');\n return txBuilder.execute(callback);\n }\n }\n\n // Given a unique filter of a model, return the entity ids by trying to\n // reused the filter if it's a complete id filter (without extra fields)\n // otherwise, read the entity by the filter\n private getEntityIds(kysely: ToKysely<Schema>, model: GetModels<Schema>, uniqueFilter: any) {\n const idFields: string[] = getIdFields(this.schema, model);\n if (\n // all id fields are provided\n idFields.every((f) => f in uniqueFilter && uniqueFilter[f] !== undefined) &&\n // no non-id filter exists\n Object.keys(uniqueFilter).every((k) => idFields.includes(k))\n ) {\n return uniqueFilter;\n }\n\n return this.readUnique(kysely, model, {\n where: uniqueFilter,\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 makeQueryId(operation: string) {\n return { queryId: `${operation}-${createId()}` };\n }\n\n protected executeQuery(kysely: ToKysely<Schema>, query: Compilable, operation: string) {\n return kysely.executeQuery(query.compile(), this.makeQueryId(operation));\n }\n\n protected async executeQueryTakeFirst(kysely: ToKysely<Schema>, query: Compilable, operation: string) {\n const result = await kysely.executeQuery(query.compile(), this.makeQueryId(operation));\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(), this.makeQueryId(operation));\n if (result.rows.length === 0) {\n throw new QueryError('No rows found');\n }\n return result.rows[0];\n }\n}\n","/**\n * Error thrown when an operation is rejected by access policy.\n */\nexport class RejectedByPolicyError extends Error {\n constructor(\n public readonly model: string | undefined,\n public readonly reason?: string,\n ) {\n super(reason ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n OperationNodeTransformer,\n OperatorNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n ValueNode,\n ValuesNode,\n WhereNode,\n type OperationNode,\n type QueryResult,\n type RootOperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ClientContract } from '../../client';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getIdFields, requireField, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError } from './errors';\nimport { ExpressionTransformer } from './expression-transformer';\nimport type { Policy, PolicyOperation } from './types';\nimport { buildIsFalse, conjunction, disjunction, falseNode, getTableName } from './utils';\n\nexport type CrudQueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport type MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport class PolicyHandler<Schema extends SchemaDef> extends OperationNodeTransformer {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(private readonly client: ClientContract<Schema>) {\n super();\n this.dialect = getCrudDialect(this.client.$schema, this.client.$options);\n }\n\n get kysely() {\n return this.client.$qb;\n }\n\n async handle(\n node: RootOperationNode,\n proceed: ProceedKyselyQueryFunction /*, transaction: OnKyselyQueryTransaction*/,\n ) {\n if (!this.isCrudQueryNode(node)) {\n // non-CRUD queries are not allowed\n throw new RejectedByPolicyError(undefined, 'non-CRUD queries are not allowed');\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed read without transaction\n return proceed(this.transformNode(node));\n }\n\n let mutationRequiresTransaction = false;\n const mutationModel = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // reject create if unconditional deny\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n } else if (constCondition === undefined) {\n mutationRequiresTransaction = true;\n }\n }\n\n if (!mutationRequiresTransaction && !node.returning) {\n // transform and proceed mutation without transaction\n return proceed(this.transformNode(node));\n }\n\n if (InsertQueryNode.is(node)) {\n await this.enforcePreCreatePolicy(node, proceed);\n }\n const transformedNode = this.transformNode(node);\n const result = await proceed(transformedNode);\n\n if (!this.onlyReturningId(node)) {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n }\n return readBackResult;\n } else {\n return result;\n }\n\n // TODO: run in transaction\n //let readBackError = false;\n\n // transform and post-process in a transaction\n // const result = await transaction(async (txProceed) => {\n // if (InsertQueryNode.is(node)) {\n // await this.enforcePreCreatePolicy(node, txProceed);\n // }\n // const transformedNode = this.transformNode(node);\n // const result = await txProceed(transformedNode);\n\n // if (!this.onlyReturningId(node)) {\n // const readBackResult = await this.processReadBack(node, result, txProceed);\n // if (readBackResult.rows.length !== result.rows.length) {\n // readBackError = true;\n // }\n // return readBackResult;\n // } else {\n // return result;\n // }\n // });\n\n // if (readBackError) {\n // throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n // }\n\n // return result;\n }\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n const collector = new ColumnCollector();\n const selectedColumns = collector.collect(node.returning);\n return selectedColumns.every((c) => idFields.includes(c));\n }\n\n private async enforcePreCreatePolicy(node: InsertQueryNode, proceed: ProceedKyselyQueryFunction) {\n if (!node.columns || !node.values) {\n return;\n }\n\n const model = this.getMutationModel(node);\n const fields = node.columns.map((c) => c.column.name);\n const valueRows = this.unwrapCreateValueRows(node.values, model, fields);\n for (const values of valueRows) {\n await this.enforcePreCreatePolicyForOne(\n model,\n fields,\n values.map((v) => v.node),\n values.map((v) => v.raw),\n proceed,\n );\n }\n }\n\n private async enforcePreCreatePolicyForOne(\n model: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n valuesRaw: unknown[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const thisEntity: Record<string, OperationNode> = {};\n const thisEntityRaw: Record<string, unknown> = {};\n for (let i = 0; i < fields.length; i++) {\n thisEntity[fields[i]!] = values[i]!;\n thisEntityRaw[fields[i]!] = valuesRaw[i]!;\n }\n\n const filter = this.buildPolicyFilter(model, undefined, 'create', thisEntity, thisEntityRaw);\n const preCreateCheck: SelectQueryNode = {\n kind: 'SelectQueryNode',\n selections: [SelectionNode.create(AliasNode.create(filter, IdentifierNode.create('$condition')))],\n };\n const result = await proceed(preCreateCheck);\n if (!(result.rows[0] as any)?.$condition) {\n throw new RejectedByPolicyError(model);\n }\n }\n\n private unwrapCreateValueRows(node: OperationNode, model: GetModels<Schema>, fields: string[]) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(data: readonly unknown[], model: GetModels<Schema>, fields: string[]) {\n invariant(data.length === fields.length, 'data length must match fields length');\n const result: { node: OperationNode; raw: unknown }[] = [];\n for (let i = 0; i < data.length; i++) {\n const item = data[i]!;\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n if (typeof item === 'object' && item && 'kind' in item) {\n invariant(item.kind === 'ValueNode', 'expecting a ValueNode');\n result.push({\n node: ValueNode.create(\n this.dialect.transformPrimitive(\n (item as ValueNode).value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n ),\n ),\n raw: (item as ValueNode).value,\n });\n } else {\n const value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n if (Array.isArray(value)) {\n result.push({\n node: RawNode.createWithSql(this.dialect.buildArrayLiteralSQL(value)),\n raw: value,\n });\n } else {\n result.push({ node: ValueNode.create(value), raw: value });\n }\n }\n }\n return result;\n }\n\n private tryGetConstantPolicy(model: GetModels<Schema>, operation: PolicyOperation) {\n const policies = this.getModelPolicies(model, operation);\n if (!policies.some((p) => p.kind === 'allow')) {\n // no allow -> unconditional deny\n return false;\n } else if (\n // unconditional deny\n policies.some((p) => p.kind === 'deny' && this.isTrueExpr(p.condition))\n ) {\n return false;\n } else if (\n // unconditional allow\n !policies.some((p) => p.kind === 'deny') &&\n policies.some((p) => p.kind === 'allow' && this.isTrueExpr(p.condition))\n ) {\n return true;\n } else {\n return undefined;\n }\n }\n\n private isTrueExpr(expr: Expression) {\n return ExpressionUtils.isLiteral(expr) && expr.value === true;\n }\n\n private async processReadBack(node: CrudQueryNode, result: QueryResult<any>, proceed: ProceedKyselyQueryFunction) {\n if (result.rows.length === 0) {\n return result;\n }\n\n if (!this.isMutationQueryNode(node) || !node.returning) {\n return result;\n }\n\n // do a select (with policy) in place of returning\n const table = this.getMutationModel(node);\n if (!table) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n\n const idConditions = this.buildIdConditions(table, result.rows);\n const policyFilter = this.buildPolicyFilter(table, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(table)]),\n where: WhereNode.create(conjunction(this.dialect, [idConditions, policyFilter])),\n selections: node.returning.selections,\n };\n const selectResult = await proceed(select);\n return selectResult;\n }\n\n private buildIdConditions(table: string, rows: any[]): OperationNode {\n const idFields = getIdFields(this.client.$schema, table);\n return disjunction(\n this.dialect,\n rows.map((row) =>\n conjunction(\n this.dialect,\n idFields.map((field) =>\n BinaryOperationNode.create(\n ColumnNode.create(field),\n OperatorNode.create('='),\n ValueNode.create(row[field]),\n ),\n ),\n ),\n ),\n );\n }\n\n private getMutationModel(node: InsertQueryNode | UpdateQueryNode | DeleteQueryNode) {\n const r = match(node)\n .when(InsertQueryNode.is, (node) => getTableName(node.into) as GetModels<Schema>)\n .when(UpdateQueryNode.is, (node) => getTableName(node.table) as GetModels<Schema>)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError('Only one from table is supported for delete');\n }\n return getTableName(node.from.froms[0]) as GetModels<Schema>;\n })\n .exhaustive();\n if (!r) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n return r;\n }\n\n private isCrudQueryNode(node: RootOperationNode): node is CrudQueryNode {\n return (\n SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node)\n );\n }\n\n private isMutationQueryNode(node: RootOperationNode): node is MutationQueryNode {\n return InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node);\n }\n\n private buildPolicyFilter(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n const policies = this.getModelPolicies(model, operation);\n if (policies.length === 0) {\n return falseNode(this.dialect);\n }\n\n const allows = policies\n .filter((policy) => policy.kind === 'allow')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n let combinedPolicy: OperationNode;\n\n if (allows.length === 0) {\n // constant false\n combinedPolicy = falseNode(this.dialect);\n } else {\n // or(...allows)\n combinedPolicy = disjunction(this.dialect, allows);\n\n // and(...!denies)\n if (denies.length !== 0) {\n const combinedDenies = conjunction(\n this.dialect,\n denies.map((d) => buildIsFalse(d, this.dialect)),\n );\n // or(...allows) && and(...!denies)\n combinedPolicy = conjunction(this.dialect, [combinedPolicy, combinedDenies]);\n }\n }\n return combinedPolicy;\n }\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = node.where;\n\n node.from?.froms.forEach((from) => {\n const extractResult = this.extractTableName(from);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, filter]) : filter,\n );\n }\n });\n\n const baseResult = super.transformSelectQuery({\n ...node,\n where: undefined,\n });\n\n return {\n ...baseResult,\n where: whereNode,\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n const result = super.transformInsertQuery(node);\n if (!node.returning) {\n return result;\n }\n if (this.onlyReturningId(node)) {\n return result;\n } else {\n // only return ID fields, that's enough for reading back the inserted row\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n return {\n ...result,\n returning: ReturningNode.create(\n idFields.map((field) => SelectionNode.create(ColumnNode.create(field))),\n ),\n };\n }\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const result = super.transformUpdateQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'update');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n protected override transformDeleteQuery(node: DeleteQueryNode) {\n const result = super.transformDeleteQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'delete');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n private extractTableName(from: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(from)) {\n return { model: from.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(from)) {\n const inner = this.extractTableName(from.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(from.alias) ? from.alias.name : undefined,\n };\n } else {\n // this can happen for subqueries, which will be handled when nested\n // transformation happens\n return undefined;\n }\n }\n\n private transformPolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n return new ExpressionTransformer(this.client.$schema, this.client.$options, this.client.$auth).transform(\n policy.condition,\n {\n model,\n alias,\n operation,\n thisEntity,\n thisEntityRaw,\n auth: this.client.$auth,\n },\n );\n }\n\n private getModelPolicies(modelName: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, modelName);\n const result: Policy[] = [];\n\n const extractOperations = (expr: Expression) => {\n invariant(ExpressionUtils.isLiteral(expr), 'expecting a literal');\n invariant(typeof expr.value === 'string', 'expecting a string literal');\n return expr.value\n .split(',')\n .filter((v) => !!v)\n .map((v) => v.trim()) as PolicyOperation[];\n };\n\n if (modelDef.attributes) {\n result.push(\n ...modelDef.attributes\n .filter((attr) => attr.name === '@@allow' || attr.name === '@@deny')\n .map(\n (attr) =>\n ({\n kind: attr.name === '@@allow' ? 'allow' : 'deny',\n operations: extractOperations(attr.args![0]!.value),\n condition: attr.args![1]!.value,\n }) as const,\n )\n .filter((policy) => policy.operations.includes('all') || policy.operations.includes(operation)),\n );\n }\n return result;\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base';\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 {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\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 if (Array.isArray(value)) {\n if (type === 'Json' && !forArrayField) {\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 return JSON.stringify(value);\n } else {\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date ? value : typeof value === 'string' ? new Date(value) : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\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 joinedQuery = this.buildRelationJSON(model, query, relationField, parentAlias, payload);\n\n return joinedQuery.select(`${parentAlias}$${relationField}.$j as ${relationField}`);\n }\n\n private buildRelationJSON(\n model: string,\n qb: SelectQueryBuilder<any, any, any>,\n relationField: string,\n parentName: 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\n return qb.leftJoinLateral(\n (eb) => {\n const joinTableName = `${parentName}$${relationField}`;\n\n // simple select by default\n let result = eb.selectFrom(`${relationModel} as ${joinTableName}`);\n\n // however if there're filter/orderBy/take/skip,\n // we need to build a subquery to handle them before aggregation\n\n // give sub query an alias to avoid conflict with parent scope\n // (e.g., for cases like self-relation)\n const subQueryAlias = `${relationModel}$${relationField}$sub`;\n\n result = eb.selectFrom(() => {\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n subQuery = this.buildSelectAllFields(\n relationModel,\n subQuery,\n typeof payload === 'object' ? payload?.omit : undefined,\n subQueryAlias,\n );\n\n if (payload && typeof payload === 'object') {\n subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);\n }\n\n // add join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(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 subQuery = subQuery.where(\n eb(\n eb.ref(`${subQueryAlias}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n `${parentName}.${parentIds[0]}`,\n '=',\n `${m2m.joinTable}.${m2m.parentFkName}`,\n ),\n ),\n );\n } else {\n const joinPairs = buildJoinPairs(this.schema, model, parentName, relationField, subQueryAlias);\n subQuery = subQuery.where((eb) =>\n this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))),\n );\n }\n\n return subQuery.as(joinTableName);\n });\n\n result = this.buildRelationObjectSelect(\n relationModel,\n joinTableName,\n relationField,\n relationFieldDef,\n result,\n payload,\n parentName,\n );\n\n // add nested joins for each relation\n result = this.buildRelationJoins(relationModel, relationField, result, payload, parentName);\n\n // alias the join table\n return result.as(joinTableName);\n },\n (join) => join.onTrue(),\n );\n }\n\n private buildRelationObjectSelect(\n relationModel: string,\n relationModelAlias: string,\n relationField: string,\n relationFieldDef: FieldDef,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n qb = qb.select((eb) => {\n const objArgs = this.buildRelationObjectArgs(\n relationModel,\n relationModelAlias,\n relationField,\n eb,\n payload,\n parentName,\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('$j');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$j');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationModelAlias: string,\n relationField: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentAlias: 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 // TODO: descendant JSON shouldn't be joined and selected if none of its fields are selected\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\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [\n sql.lit(field),\n this.fieldRef(relationModel, field, eb, relationModelAlias, false),\n ])\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 `${parentAlias}$${relationField}`,\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(`${parentAlias}$${relationField}$${field}.$j`)\n : // reference a plain field\n this.fieldRef(relationModel, field, eb, undefined, 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(`${parentAlias}$${relationField}$${field}.$j`),\n ])\n .flatMap((v) => v),\n );\n }\n return objArgs;\n }\n\n private buildRelationJoins(\n relationModel: string,\n relationField: string,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n let result = qb;\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 `${parentName}$${relationField}`,\n value,\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(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return 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(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return 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 override get supportInsertWithDefault() {\n return true;\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', '$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 { 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 type { BuiltinType, DataSourceProviderType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { enumerate } from '../../../utils/enumerate';\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 { InternalError, QueryError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n aggregate,\n buildFieldRef,\n buildJoinPairs,\n ensureArray,\n flattenCompoundUniqueFilters,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n makeDefaultOrderBy,\n requireField,\n requireModel,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\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 // #region common query builders\n\n buildSelectModel(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string) {\n const modelDef = requireModel(this.schema, model);\n let result = 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: GetModels<Schema>,\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((eb) => this.buildFilter(eb, 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(\n result,\n model,\n modelAlias,\n args.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\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) => sql.ref(`${modelAlias}.${f}`)));\n } else {\n throw new QueryError(`\"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(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n where: boolean | object | undefined,\n ) {\n if (where === true || where === undefined) {\n return this.true(eb);\n }\n\n if (where === false) {\n return this.false(eb);\n }\n\n let result = this.true(eb);\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(eb, result, this.buildCompositeFilter(eb, 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(eb, result, this.buildRelationFilter(eb, 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(\n fieldDef.originModel ?? model,\n key,\n eb,\n fieldDef.originModel ?? modelAlias,\n );\n if (fieldDef.array) {\n result = this.and(eb, result, this.buildArrayFilter(eb, fieldRef, fieldDef, payload));\n } else {\n result = this.and(eb, result, this.buildPrimitiveFilter(eb, 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(eb, result, _where['$expr'](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 eb = expressionBuilder<any, any>();\n const subQueryAlias = `${model}$cursor$sub`;\n const cursorFilter = this.buildFilter(eb, 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 eb(\n eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(eb, model, subQueryAlias)\n .select(`${subQueryAlias}.${field}`)\n .where(cursorFilter),\n ),\n );\n }\n\n filters.push(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 eb: ExpressionBuilder<any, any>,\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(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('OR', () =>\n this.or(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('NOT', () => eb.not(this.buildCompositeFilter(eb, model, modelAlias, 'AND', payload)))\n .exhaustive();\n }\n\n private buildRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (!fieldDef.array) {\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n } else {\n return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n }\n }\n\n private buildToOneRelationFilter(\n eb: ExpressionBuilder<any, any>,\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(eb, ...keyPairs.map(({ fk }) => eb(sql.ref(`${modelAlias}.${fk}`), 'is', null)));\n } else {\n // translate it to `{ is: null }` filter\n return this.buildToOneRelationFilter(eb, 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 = eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))))\n .select(() => eb.fn.count(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(eb(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, 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(eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n eb,\n // is null\n eb(joinSelect, '=', 0),\n // found one that matches the filter\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\n }\n\n return this.and(eb, ...conditions);\n }\n\n private buildToManyRelationFilter(\n eb: ExpressionBuilder<any, any>,\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 eb(sql.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 const modelIdField = getIdFields(this.schema, model)[0]!;\n const relationIdField = getIdFields(this.schema, relationModel)[0]!;\n return eb(\n sql.ref(`${relationFilterSelectAlias}.${relationIdField}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n '=',\n sql.ref(`${modelAlias}.${modelIdField}`),\n ),\n );\n } else {\n const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n let result = this.true(eb);\n for (const { fk, pk } of relationKeyPairs.keyPairs) {\n if (relationKeyPairs.ownedByModel) {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${fk}`), '=', sql.ref(`${relationFilterSelectAlias}.${pk}`)),\n );\n } else {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${pk}`), '=', sql.ref(`${relationFilterSelectAlias}.${fk}`)),\n );\n }\n }\n return result;\n }\n };\n\n let result = this.true(eb);\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 eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n eb1.not(\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n }\n }\n\n return result;\n }\n\n private buildArrayFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\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(eb, fieldRef, fieldType, eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(eb(fieldRef, '@>', eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(eb(fieldRef, '@>', eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(eb(fieldRef, '&&', eb.val(value)));\n break;\n }\n\n case 'isEmpty': {\n clauses.push(eb(fieldRef, value === true ? '=' : '!=', eb.val([])));\n break;\n }\n\n default: {\n throw new InternalError(`Invalid array filter key: ${key}`);\n }\n }\n }\n\n return this.and(eb, ...clauses);\n }\n\n buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n if (payload === null) {\n return eb(fieldRef, 'is', null);\n }\n\n if (isEnum(this.schema, fieldDef.type)) {\n return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);\n }\n\n return (\n match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(eb, fieldRef, payload))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.buildNumberFilter(eb, fieldRef, type, payload),\n )\n .with('Boolean', () => this.buildBooleanFilter(eb, fieldRef, payload))\n .with('DateTime', () => this.buildDateTimeFilter(eb, fieldRef, payload))\n .with('Bytes', () => this.buildBytesFilter(eb, fieldRef, payload))\n // TODO: JSON filters\n .with('Json', () => {\n throw new InternalError('JSON filters are not supported yet');\n })\n .with('Unsupported', () => {\n throw new QueryError(`Unsupported field cannot be used in filters`);\n })\n .exhaustive()\n );\n }\n\n private buildLiteralFilter(eb: ExpressionBuilder<any, any>, lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\n }\n\n private buildStandardFilter(\n eb: ExpressionBuilder<any, any>,\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(eb, 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 ? eb(lhs, 'is', null) : 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(eb);\n } else {\n return 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(eb);\n } else {\n return eb.not(eb(lhs, 'in', rhs));\n }\n })\n .with('lt', () => eb(lhs, '<', rhs))\n .with('lte', () => eb(lhs, '<=', rhs))\n .with('gt', () => eb(lhs, '>', rhs))\n .with('gte', () => eb(lhs, '>=', rhs))\n .with('not', () => eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (op) => {\n const innerResult = this.buildStandardFilter(\n eb,\n type,\n value,\n aggregate(eb, lhs, op),\n getRhs,\n recurse,\n throwIfInvalid,\n );\n consumedKeys.push(...innerResult.consumedKeys);\n return this.and(eb, ...innerResult.conditions);\n })\n .otherwise(() => {\n if (throwIfInvalid) {\n throw new QueryError(`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(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: StringFilter<Schema, true, boolean>,\n ) {\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 eb,\n 'String',\n payload,\n mode === 'insensitive' ? eb.fn('lower', [fieldRef]) : fieldRef,\n (value) => this.prepStringCasing(eb, value, mode),\n (value) => this.buildStringFilter(eb, fieldRef, value as StringFilter<Schema, 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 const condition = match(key)\n .with('contains', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}%`))\n : eb(fieldRef, 'like', sql.val(`%${value}%`)),\n )\n .with('startsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`${value}%`))\n : eb(fieldRef, 'like', sql.val(`${value}%`)),\n )\n .with('endsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}`))\n : eb(fieldRef, 'like', sql.val(`%${value}`)),\n )\n .otherwise(() => {\n throw new QueryError(`Invalid string filter key: ${key}`);\n });\n\n if (condition) {\n conditions.push(condition);\n }\n }\n }\n\n return this.and(eb, ...conditions);\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(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n type: BuiltinType,\n payload: any,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n type,\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, type, false),\n (value) => this.buildNumberFilter(eb, fieldRef, type, value),\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBooleanFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BooleanFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'Boolean',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Boolean', false),\n (value) => this.buildBooleanFilter(eb, fieldRef, value as BooleanFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'not'],\n );\n return this.and(eb, ...conditions);\n }\n\n private buildDateTimeFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: DateTimeFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'DateTime',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'DateTime', false),\n (value) => this.buildDateTimeFilter(eb, fieldRef, value as DateTimeFilter<Schema, boolean, boolean>),\n true,\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBytesFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BytesFilter<Schema, boolean, boolean>,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'Bytes',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Bytes', false),\n (value) => this.buildBytesFilter(eb, fieldRef, value as BytesFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n private buildEnumFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n fieldRef,\n (value) => value,\n (value) => this.buildEnumFilter(eb, fieldRef, fieldDef, value),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...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 useDefaultIfEmpty: boolean,\n negated: boolean,\n ) {\n if (!orderBy) {\n if (useDefaultIfEmpty) {\n orderBy = makeDefaultOrderBy(this.schema, model);\n } else {\n return query;\n }\n }\n\n let result = query;\n enumerate(orderBy).forEach((orderBy) => {\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) =>\n aggregate(eb, this.fieldRef(model, k, eb, modelAlias), field as AGGREGATE_OPERATORS),\n sql.raw(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(this.fieldRef(model, k, eb, modelAlias)),\n sql.raw(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 = this.fieldRef(model, field, expressionBuilder(), 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(\n fieldRef,\n sql.raw(`${this.negateSort(value.sort, negated)} nulls ${value.nulls}`),\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 new QueryError(`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(eb, relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\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 result = result.leftJoin(relationModel, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n return join.on((eb) =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, fieldDef.type, relationModel, value, false, 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,\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 (omit?.[field] === true) {\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(eb, jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);\n });\n }\n\n return result;\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 if (fieldDef.computed) {\n // TODO: computed field from delegate base?\n return query.select((eb) => this.fieldRef(model, field, eb, modelAlias).as(field));\n } else if (!fieldDef.originModel) {\n // regular field\n return query.select(sql.ref(`${modelAlias}.${field}`).as(field));\n } else {\n return this.buildSelectField(query, fieldDef.originModel, fieldDef.originModel, field);\n }\n }\n\n buildDelegateJoin(\n thisModel: string,\n thisModelAlias: string,\n otherModelAlias: string,\n query: SelectQueryBuilder<any, any, any>,\n ) {\n const idFields = getIdFields(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;\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, fieldModel);\n\n // build a nested query to count the number of records in the relation\n let fieldCountQuery = eb.selectFrom(fieldModel).select(eb.fn.countAll().as(`_count$${field}`));\n\n // join conditions\n for (const [left, right] of joinPairs) {\n fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n }\n\n // merge _count filter\n if (\n value &&\n typeof value === 'object' &&\n 'where' in value &&\n value.where &&\n typeof value.where === 'object'\n ) {\n const filter = this.buildFilter(eb, fieldModel, fieldModel, value.where);\n fieldCountQuery = fieldCountQuery.where(filter);\n }\n\n jsonObject[field] = fieldCountQuery;\n }\n\n return this.buildJsonObject(eb, 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(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return 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 protected and(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonTrueArgs = args.filter((arg) => !this.isTrue(arg));\n if (nonTrueArgs.length === 0) {\n return this.true(eb);\n } else if (nonTrueArgs.length === 1) {\n return nonTrueArgs[0]!;\n } else {\n return eb.and(nonTrueArgs);\n }\n }\n\n protected or(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonFalseArgs = args.filter((arg) => !this.isFalse(arg));\n if (nonFalseArgs.length === 0) {\n return this.false(eb);\n } else if (nonFalseArgs.length === 1) {\n return nonFalseArgs[0]!;\n } else {\n return eb.or(nonFalseArgs);\n }\n }\n\n protected not(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n return eb.not(this.and(eb, ...args));\n }\n\n fieldRef(\n model: string,\n field: string,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n ) {\n return buildFieldRef(this.schema, model, field, this.options, eb, modelAlias, inlineComputedField);\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(\n eb: ExpressionBuilder<any, any>,\n value: Record<string, Expression<unknown>>,\n ): ExpressionWrapper<any, any, unknown>;\n\n /**\n * Builds an Kysely expression that returns the length of an array.\n */\n abstract buildArrayLength(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): 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 // #endregion\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\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 if (Array.isArray(value)) {\n return value.map((v) => this.transformPrimitive(v, type, false));\n } else {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return JSON.stringify(value);\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () => (value instanceof Date ? value.toISOString() : value))\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\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\n let tbl = eb.selectFrom(() => {\n // give sub query an alias to avoid conflict with parent scope\n // (e.g., for cases like self-relation)\n const subQueryAlias = `${parentAlias}$${relationField}$sub`;\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n\n subQuery = this.buildSelectAllFields(\n relationModel,\n subQuery,\n typeof payload === 'object' ? payload?.omit : undefined,\n subQueryAlias,\n );\n\n if (payload && typeof payload === 'object') {\n // take care of where, orderBy, skip, take, cursor, and distinct\n subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);\n }\n\n // join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(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 subQuery = subQuery.where(\n eb(\n eb.ref(`${subQueryAlias}.${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 subQuery = subQuery.whereRef(`${subQueryAlias}.${pk}`, '=', `${parentAlias}.${fk}`);\n } else {\n // the relation side owns the fk\n subQuery = subQuery.whereRef(`${subQueryAlias}.${fk}`, '=', `${parentAlias}.${pk}`);\n }\n });\n }\n return subQuery.as(subQueryName);\n });\n\n tbl = tbl.select(() => {\n type ArgsType = Expression<any> | RawBuilder<any> | SelectQueryBuilder<any, any, any>;\n const objArgs: ArgsType[] = [];\n\n // TODO: descendant JSON shouldn't be joined and selected if none of its fields are selected\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\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [sql.lit(field), this.fieldRef(relationModel, field, eb, undefined, 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, eb, undefined, 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('$j');\n } else {\n return sql`json_object(${sql.join(objArgs)})`.as('data');\n }\n });\n\n return tbl;\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(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return eb.fn(\n 'json_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), 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(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return 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","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 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 LimitNode,\n ListNode,\n MatchedNode,\n MergeQueryNode,\n ModifyColumnNode,\n OffsetNode,\n OnConflictNode,\n OnDuplicateKeyNode,\n OnNode,\n OperationNodeVisitor,\n OperatorNode,\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 RenameColumnNode,\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}\n","import type { ColumnNode, OperationNode } from 'kysely';\nimport { DefaultOperationNodeVisitor } from '../../utils/default-operation-node-visitor';\n\n/**\n * Collects all column names from a query.\n */\nexport class ColumnCollector extends DefaultOperationNodeVisitor {\n private columns: string[] = [];\n\n collect(node: OperationNode) {\n this.columns = [];\n this.visitNode(node);\n return this.columns;\n }\n\n protected override visitColumn(node: ColumnNode): void {\n if (!this.columns.includes(node.column.name)) {\n this.columns.push(node.column.name);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n expressionBuilder,\n FromNode,\n FunctionNode,\n IdentifierNode,\n OperatorNode,\n ReferenceNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n ValueListNode,\n ValueNode,\n WhereNode,\n type ExpressionBuilder,\n type OperandExpression,\n type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ClientOptions } from '../../client/options';\nimport { getRelationForeignKeyFieldPairs, requireField } from '../../client/query-utils';\nimport type {\n BinaryExpression,\n BinaryOperator,\n BuiltinType,\n FieldDef,\n GetModels,\n LiteralExpression,\n MemberExpression,\n UnaryExpression,\n} from '../../schema';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type SchemaDef,\n} from '../../schema';\nimport { ExpressionEvaluator } from './expression-evaluator';\nimport { conjunction, disjunction, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\n thisEntity?: Record<string, OperationNode>;\n thisEntityRaw?: Record<string, unknown>;\n auth?: any;\n memberFilter?: OperationNode;\n memberSelect?: SelectionNode;\n};\n\n// a registry of expression handlers marked with @expr\nconst expressionHandlers = new Map<string, PropertyDescriptor>();\n\n// expression handler decorator\nfunction expr(kind: Expression['kind']) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!expressionHandlers.get(kind)) {\n expressionHandlers.set(kind, descriptor);\n }\n return descriptor;\n };\n}\n\nexport class ExpressionTransformer<Schema extends SchemaDef> {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(\n private readonly schema: Schema,\n private readonly clientOptions: ClientOptions<Schema>,\n private readonly auth: unknown | undefined,\n ) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get authType() {\n if (!this.schema.authType) {\n throw new InternalError('Schema does not have an \"authType\" specified');\n }\n return this.schema.authType;\n }\n\n transform(expression: Expression, context: ExpressionTransformerContext<Schema>): OperationNode {\n const handler = expressionHandlers.get(expression.kind);\n if (!handler) {\n throw new Error(`Unsupported expression kind: ${expression.kind}`);\n }\n return handler.value.call(this, expression, context);\n }\n\n @expr('literal')\n // @ts-expect-error\n private _literal(expr: LiteralExpression) {\n return this.transformValue(\n expr.value,\n typeof expr.value === 'string' ? 'String' : typeof expr.value === 'boolean' ? 'Boolean' : 'Int',\n );\n }\n\n @expr('array')\n // @ts-expect-error\n private _array(expr: ArrayExpression, context: ExpressionTransformerContext<Schema>) {\n return ValueListNode.create(expr.items.map((item) => this.transform(item, context)));\n }\n\n @expr('field')\n // @ts-expect-error\n private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n if (context.thisEntity) {\n return context.thisEntity[expr.field];\n } else {\n return this.createColumnRef(expr.field, context);\n }\n } else {\n const { memberFilter, memberSelect, ...restContext } = context;\n const relation = this.transformRelationAccess(expr.field, fieldDef.type, restContext);\n return {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n }\n\n private mergeWhere(where: WhereNode | undefined, memberFilter: OperationNode | undefined) {\n if (!where) {\n return WhereNode.create(memberFilter ?? trueNode(this.dialect));\n }\n if (!memberFilter) {\n return where;\n }\n return WhereNode.create(conjunction(this.dialect, [where.where, memberFilter]));\n }\n\n @expr('null')\n // @ts-ignore\n private _null() {\n return ValueNode.createImmediate(null);\n }\n\n @expr('binary')\n // @ts-ignore\n private _binary(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n if (expr.op === '&&') {\n return conjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n } else if (expr.op === '||') {\n return disjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n }\n\n if (this.isAuthCall(expr.left) || this.isAuthCall(expr.right)) {\n return this.transformAuthBinary(expr);\n }\n\n const op = expr.op;\n\n if (op === '?' || op === '!' || op === '^') {\n return this.transformCollectionPredicate(expr, context);\n }\n\n const left = this.transform(expr.left, context);\n const right = this.transform(expr.right, context);\n\n if (op === 'in') {\n if (this.isNullNode(left)) {\n return this.transformValue(false, 'Boolean');\n } else {\n if (ValueListNode.is(right)) {\n return BinaryOperationNode.create(left, OperatorNode.create('in'), right);\n } else {\n // array contains\n return BinaryOperationNode.create(\n left,\n OperatorNode.create('='),\n FunctionNode.create('any', [right]),\n );\n }\n }\n }\n\n if (this.isNullNode(right)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(left, OperatorNode.create('is'), right)\n : BinaryOperationNode.create(left, OperatorNode.create('is not'), right);\n } else if (this.isNullNode(left)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(right, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(right, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n\n private transformCollectionPredicate(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n invariant(expr.op === '?' || expr.op === '!' || expr.op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n if (this.isAuthCall(expr.left) || this.isAuthMember(expr.left)) {\n const value = new ExpressionEvaluator().evaluate(expr, {\n auth: this.auth,\n });\n return this.transformValue(value, 'Boolean');\n }\n\n invariant(\n ExpressionUtils.isField(expr.left) || ExpressionUtils.isMember(expr.left),\n 'left operand must be field or member access',\n );\n\n let newContextModel: string;\n if (ExpressionUtils.isField(expr.left)) {\n const fieldDef = requireField(this.schema, context.model, expr.left.field);\n newContextModel = fieldDef.type;\n } else {\n invariant(ExpressionUtils.isField(expr.left.receiver));\n const fieldDef = requireField(this.schema, context.model, expr.left.receiver.field);\n newContextModel = fieldDef.type;\n for (const member of expr.left.members) {\n const memberDef = requireField(this.schema, newContextModel, member);\n newContextModel = memberDef.type;\n }\n }\n\n let predicateFilter = this.transform(expr.right, {\n ...context,\n model: newContextModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (expr.op === '!') {\n predicateFilter = logicalNot(predicateFilter);\n }\n\n const count = FunctionNode.create('count', [ValueNode.createImmediate(1)]);\n\n const predicateResult = match(expr.op)\n .with('?', () => BinaryOperationNode.create(count, OperatorNode.create('>'), ValueNode.createImmediate(0)))\n .with('!', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .with('^', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .exhaustive();\n\n return this.transform(expr.left, {\n ...context,\n memberSelect: SelectionNode.create(AliasNode.create(predicateResult, IdentifierNode.create('$t'))),\n memberFilter: predicateFilter,\n });\n }\n\n private transformAuthBinary(expr: BinaryExpression) {\n if (expr.op !== '==' && expr.op !== '!=') {\n throw new Error(`Unsupported operator for auth call: ${expr.op}`);\n }\n let other: Expression;\n if (this.isAuthCall(expr.left)) {\n other = expr.right;\n } else {\n other = expr.left;\n }\n\n if (ExpressionUtils.isNull(other)) {\n return this.transformValue(expr.op === '==' ? !this.auth : !!this.auth, 'Boolean');\n } else {\n throw new Error('Unsupported binary expression with `auth()`');\n }\n }\n\n private transformValue(value: unknown, type: BuiltinType) {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\n\n @expr('unary')\n // @ts-ignore\n private _unary(expr: UnaryExpression, context: ExpressionTransformerContext<Schema>) {\n // only '!' operator for now\n invariant(expr.op === '!', 'only \"!\" operator is supported');\n return BinaryOperationNode.create(\n this.transform(expr.operand, context),\n this.transformOperator('!='),\n trueNode(this.dialect),\n );\n }\n\n private transformOperator(op: Exclude<BinaryOperator, '?' | '!' | '^'>) {\n const mappedOp = match(op)\n .with('==', () => '=' as const)\n .otherwise(() => op);\n return OperatorNode.create(mappedOp);\n }\n\n @expr('call')\n // @ts-ignore\n private _call(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const result = this.transformCall(expr, context);\n return result.toOperationNode();\n }\n\n private transformCall(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const func = this.clientOptions.functions?.[expr.function];\n if (!func) {\n throw new QueryError(`Function not implemented: ${expr.function}`);\n }\n const eb = expressionBuilder<any, any>();\n return func(\n eb,\n (expr.args ?? []).map((arg) => this.transformCallArg(eb, arg, context)),\n {\n dialect: this.dialect,\n model: context.model,\n operation: context.operation,\n },\n );\n }\n\n private transformCallArg(\n eb: ExpressionBuilder<any, any>,\n arg: Expression,\n context: ExpressionTransformerContext<Schema>,\n ): OperandExpression<any> {\n if (ExpressionUtils.isLiteral(arg)) {\n return eb.val(arg.value);\n }\n\n if (ExpressionUtils.isField(arg)) {\n return context.thisEntityRaw ? eb.val(context.thisEntityRaw[arg.field]) : eb.ref(arg.field);\n }\n\n if (ExpressionUtils.isCall(arg)) {\n return this.transformCall(arg, context);\n }\n\n if (this.isAuthMember(arg)) {\n const valNode = this.valueMemberAccess(context.auth, arg as MemberExpression, this.authType);\n return valNode ? eb.val(valNode.value) : eb.val(null);\n }\n\n // TODO\n // if (Expression.isMember(arg)) {\n // }\n\n throw new InternalError(`Unsupported argument expression: ${arg.kind}`);\n }\n\n @expr('member')\n // @ts-ignore\n private _member(expr: MemberExpression, context: ExpressionTransformerContext<Schema>) {\n // auth() member access\n if (this.isAuthCall(expr.receiver)) {\n return this.valueMemberAccess(this.auth, expr, this.authType);\n }\n\n invariant(ExpressionUtils.isField(expr.receiver), 'expect receiver to be field expression');\n\n const { memberFilter, memberSelect, ...restContext } = context;\n\n const receiver = this.transform(expr.receiver, restContext);\n invariant(SelectQueryNode.is(receiver), 'expected receiver to be select query');\n\n // relation member access\n const receiverField = requireField(this.schema, context.model, expr.receiver.field);\n\n // traverse forward to collect member types\n const memberFields: { fromModel: string; fieldDef: FieldDef }[] = [];\n let currType = receiverField.type;\n for (const member of expr.members) {\n const fieldDef = requireField(this.schema, currType, member);\n memberFields.push({ fieldDef, fromModel: currType });\n currType = fieldDef.type;\n }\n\n let currNode: SelectQueryNode | ColumnNode | ReferenceNode | undefined = undefined;\n\n for (let i = expr.members.length - 1; i >= 0; i--) {\n const member = expr.members[i]!;\n const { fieldDef, fromModel } = memberFields[i]!;\n\n if (fieldDef.relation) {\n const relation = this.transformRelationAccess(member, fieldDef.type, {\n ...restContext,\n model: fromModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (currNode) {\n invariant(SelectQueryNode.is(currNode), 'expected select query node');\n currNode = {\n ...relation,\n selections: [\n SelectionNode.create(\n AliasNode.create(currNode, IdentifierNode.create(expr.members[i + 1]!)),\n ),\n ],\n };\n } else {\n // inner most member, merge with member filter from the context\n currNode = {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n } else {\n invariant(i === expr.members.length - 1, 'plain field access must be the last segment');\n invariant(!currNode, 'plain field access must be the last segment');\n\n currNode = ColumnNode.create(member);\n }\n }\n\n return {\n ...receiver,\n selections: [SelectionNode.create(AliasNode.create(currNode!, IdentifierNode.create('$t')))],\n };\n }\n\n private valueMemberAccess(receiver: any, expr: MemberExpression, receiverType: string) {\n if (!receiver) {\n return ValueNode.createImmediate(null);\n }\n\n if (expr.members.length !== 1) {\n throw new Error(`Only single member access is supported`);\n }\n\n const field = expr.members[0]!;\n const fieldDef = requireField(this.schema, receiverType, field);\n const fieldValue = receiver[field] ?? null;\n return this.transformValue(fieldValue, fieldDef.type as BuiltinType);\n }\n\n private transformRelationAccess(\n field: string,\n relationModel: string,\n context: ExpressionTransformerContext<Schema>,\n ): SelectQueryNode {\n const fromModel = context.model;\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, fromModel, field);\n\n if (context.thisEntity) {\n let condition: OperationNode;\n if (ownedByModel) {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![fk]!,\n ),\n ),\n );\n } else {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![pk]!,\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n } else {\n let condition: OperationNode;\n if (ownedByModel) {\n // `fromModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n ),\n ),\n );\n } else {\n // `relationModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n }\n }\n\n private createColumnRef(column: string, context: ExpressionTransformerContext<Schema>): ReferenceNode {\n return ReferenceNode.create(ColumnNode.create(column), TableNode.create(context.alias ?? context.model));\n }\n\n private isAuthCall(value: unknown): value is CallExpression {\n return ExpressionUtils.isCall(value) && value.function === 'auth';\n }\n\n private isAuthMember(expr: Expression) {\n return ExpressionUtils.isMember(expr) && this.isAuthCall(expr.receiver);\n }\n\n private isNullNode(node: OperationNode) {\n return ValueNode.is(node) && node.value === null;\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type BinaryExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type LiteralExpression,\n type MemberExpression,\n type UnaryExpression,\n} from '../../schema';\n\ntype ExpressionEvaluatorContext = {\n auth?: any;\n thisValue?: any;\n};\n\n/**\n * Evaluate a schema expression into a JavaScript value.\n */\nexport class ExpressionEvaluator {\n evaluate(expression: Expression, context: ExpressionEvaluatorContext): any {\n const result = match(expression)\n .when(ExpressionUtils.isArray, (expr) => this.evaluateArray(expr, context))\n .when(ExpressionUtils.isBinary, (expr) => this.evaluateBinary(expr, context))\n .when(ExpressionUtils.isField, (expr) => this.evaluateField(expr, context))\n .when(ExpressionUtils.isLiteral, (expr) => this.evaluateLiteral(expr))\n .when(ExpressionUtils.isMember, (expr) => this.evaluateMember(expr, context))\n .when(ExpressionUtils.isUnary, (expr) => this.evaluateUnary(expr, context))\n .when(ExpressionUtils.isCall, (expr) => this.evaluateCall(expr, context))\n .when(ExpressionUtils.isThis, () => context.thisValue)\n .when(ExpressionUtils.isNull, () => null)\n .exhaustive();\n\n return result ?? null;\n }\n\n private evaluateCall(expr: CallExpression, context: ExpressionEvaluatorContext): any {\n if (expr.function === 'auth') {\n return context.auth;\n } else {\n throw new Error(`Unsupported call expression function: ${expr.function}`);\n }\n }\n\n private evaluateUnary(expr: UnaryExpression, context: ExpressionEvaluatorContext) {\n return match(expr.op)\n .with('!', () => !this.evaluate(expr.operand, context))\n .exhaustive();\n }\n\n private evaluateMember(expr: MemberExpression, context: ExpressionEvaluatorContext) {\n let val = this.evaluate(expr.receiver, context);\n for (const member of expr.members) {\n val = val?.[member];\n }\n return val;\n }\n\n private evaluateLiteral(expr: LiteralExpression): any {\n return expr.value;\n }\n\n private evaluateField(expr: FieldExpression, context: ExpressionEvaluatorContext): any {\n return context.thisValue?.[expr.field];\n }\n\n private evaluateArray(expr: ArrayExpression, context: ExpressionEvaluatorContext) {\n return expr.items.map((item) => this.evaluate(item, context));\n }\n\n private evaluateBinary(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n if (expr.op === '?' || expr.op === '!' || expr.op === '^') {\n return this.evaluateCollectionPredicate(expr, context);\n }\n\n const left = this.evaluate(expr.left, context);\n const right = this.evaluate(expr.right, context);\n\n return match(expr.op)\n .with('==', () => left === right)\n .with('!=', () => left !== right)\n .with('>', () => left > right)\n .with('>=', () => left >= right)\n .with('<', () => left < right)\n .with('<=', () => left <= right)\n .with('&&', () => left && right)\n .with('||', () => left || right)\n .with('in', () => {\n const _right = right ?? [];\n invariant(Array.isArray(_right), 'expected array for \"in\" operator');\n return _right.includes(left);\n })\n .exhaustive();\n }\n\n private evaluateCollectionPredicate(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n const op = expr.op;\n invariant(op === '?' || op === '!' || op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n const left = this.evaluate(expr.left, context);\n if (!left) {\n return false;\n }\n\n invariant(Array.isArray(left), 'expected array');\n\n return match(op)\n .with('?', () => left.some((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with('!', () => left.every((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with(\n '^',\n () =>\n !left.some((item: any) =>\n this.evaluate(expr.right, {\n ...context,\n thisValue: item,\n }),\n ),\n )\n .exhaustive();\n }\n}\n","import type { OperationNode } from 'kysely';\nimport {\n AliasNode,\n AndNode,\n BinaryOperationNode,\n FunctionNode,\n OperatorNode,\n OrNode,\n ParensNode,\n ReferenceNode,\n TableNode,\n UnaryOperationNode,\n ValueNode,\n} from 'kysely';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport type { SchemaDef } from '../../schema';\n\n/**\n * Creates a `true` value node.\n */\nexport function trueNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(true, 'Boolean', false));\n}\n\n/**\n * Creates a `false` value node.\n */\nexport function falseNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(false, 'Boolean', false));\n}\n\n/**\n * Checks if a node is a truthy value node.\n */\nexport function isTrueNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === true || node.value === 1);\n}\n\n/**\n * Checks if a node is a falsy value node.\n */\nexport function isFalseNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === false || node.value === 0);\n}\n\n/**\n * Builds a logical conjunction of a list of nodes.\n */\nexport function conjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isFalseNode)) {\n return falseNode(dialect);\n }\n const items = nodes.filter((n) => !isTrueNode(n));\n if (items.length === 0) {\n return trueNode(dialect);\n }\n return items.reduce((acc, node) =>\n OrNode.is(node)\n ? AndNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : AndNode.create(acc, node),\n );\n}\n\nexport function disjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isTrueNode)) {\n return trueNode(dialect);\n }\n const items = nodes.filter((n) => !isFalseNode(n));\n if (items.length === 0) {\n return falseNode(dialect);\n }\n return items.reduce((acc, node) =>\n AndNode.is(node)\n ? OrNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : OrNode.create(acc, node),\n );\n}\n\n/**\n * Negates a logical expression.\n */\nexport function logicalNot(node: OperationNode): OperationNode {\n return UnaryOperationNode.create(\n OperatorNode.create('not'),\n AndNode.is(node) || OrNode.is(node)\n ? ParensNode.create(node) // wraps parentheses\n : node,\n );\n}\n\n/**\n * Builds an expression node that checks if a node is true.\n */\nexport function buildIsTrue<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isTrueNode(node)) {\n return trueNode(dialect);\n } else if (isFalseNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(node, OperatorNode.create('='), trueNode(dialect));\n}\n\n/**\n * Builds an expression node that checks if a node is false.\n */\nexport function buildIsFalse<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isFalseNode(node)) {\n return trueNode(dialect);\n } else if (isTrueNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(\n // coalesce so null is treated as false\n FunctionNode.create('coalesce', [node, falseNode(dialect)]),\n OperatorNode.create('='),\n falseNode(dialect),\n );\n}\n\n/**\n * Gets the table name from a node.\n */\nexport function getTableName(node: OperationNode | undefined) {\n if (!node) {\n return node;\n }\n if (TableNode.is(node)) {\n return node.table.identifier.name;\n } else if (AliasNode.is(node)) {\n return getTableName(node.node);\n } else if (ReferenceNode.is(node) && node.table) {\n return getTableName(node.table);\n }\n return undefined;\n}\n","import { type OnKyselyQueryArgs, type RuntimePlugin } from '../../client/plugin';\nimport type { SchemaDef } from '../../schema';\nimport { PolicyHandler } from './policy-handler';\n\nexport class PolicyPlugin<Schema extends SchemaDef> implements RuntimePlugin<Schema> {\n get id() {\n return 'policy';\n }\n\n get name() {\n return 'Access Policy';\n }\n\n get description() {\n return 'Enforces access policies defined in the schema.';\n }\n\n onKyselyQuery({ query, client, proceed /*, transaction*/ }: OnKyselyQueryArgs<Schema>) {\n const handler = new PolicyHandler<Schema>(client);\n return handler.handle(query, proceed /*, transaction*/);\n }\n}\n","import { isPlainObject } from '@zenstackhq/common-helpers';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","import type { ExpressionBuilder } from 'kysely';\nimport { sql } from 'kysely';\nimport 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(eb as ExpressionBuilder<any, any>, this.model, this.model)\n .where((eb1) => this.dialect.buildFilter(eb1, 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(sql.ref(`${subQueryName}.${key}`)), '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 { RejectedByPolicyError } from '../../../plugins/policy/errors';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { CreateArgs, CreateManyAndReturnArgs, CreateManyArgs, WhereInput } from '../../crud-types';\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 // 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);\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 });\n\n if (!result && this.hasPolicyEnabled) {\n throw new RejectedByPolicyError(this.model, `result is not allowed to be read back`);\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 // TODO: avoid using transaction for simple create\n return this.safeTransaction(async (tx) => {\n const createResult = await this.createMany(tx, this.model, args, true);\n return this.read(tx, this.model, {\n select: args.select,\n omit: args.omit,\n where: {\n OR: createResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n } as any, // TODO: fix type\n });\n });\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { DeleteArgs, DeleteManyArgs } from '../../crud-types';\nimport { NotFoundError } 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 const existing = await this.readUnique(this.kysely, this.model, {\n select: args.select,\n include: args.include,\n omit: args.omit,\n where: args.where,\n });\n if (!existing) {\n throw new NotFoundError(this.model);\n }\n\n // TODO: avoid using transaction for simple delete\n await this.safeTransaction(async (tx) => {\n const result = await this.delete(tx, this.model, args.where);\n if (result.count === 0) {\n throw new NotFoundError(this.model);\n }\n });\n\n return existing;\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 result;\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 // parse args\n const parsedArgs = validateArgs\n ? this.inputValidator.validateFindArgs(this.model, operation === 'findUnique', normalizedArgs)\n : normalizedArgs;\n\n // run query\n const result = await this.read(\n this.client.$qb,\n this.model,\n parsedArgs as FindArgs<Schema, GetModels<Schema>, true>,\n );\n\n const finalResult = operation === 'findMany' ? result : (result[0] ?? null);\n return finalResult;\n }\n}\n","import { expressionBuilder } from 'kysely';\nimport { 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.selectFrom((eb) => {\n // nested query for filtering and pagination\n\n // where\n let subQuery = eb\n .selectFrom(this.model)\n .selectAll()\n .where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));\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 // default orderBy\n subQuery = this.dialect.buildOrderBy(\n subQuery,\n this.model,\n this.model,\n undefined,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n return subQuery.as('$sub');\n });\n\n const fieldRef = (field: string) => this.dialect.fieldRef(this.model, field, expressionBuilder(), '$sub');\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 // orderBy\n if (parsedArgs.orderBy) {\n query = this.dialect.buildOrderBy(query, this.model, '$sub', parsedArgs.orderBy, false, false);\n }\n\n if (parsedArgs.having) {\n query = query.having((eb) => this.dialect.buildFilter(eb, this.model, '$sub', 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 { RejectedByPolicyError } from '../../../plugins/policy/errors';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { UpdateArgs, UpdateManyAndReturnArgs, UpdateManyArgs, UpsertArgs, WhereInput } from '../../crud-types';\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 const readBackResult = await this.safeTransaction(async (tx) => {\n const updateResult = await this.update(tx, this.model, args.where, args.data);\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 try {\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 } catch {\n // commit the update even if read-back failed\n }\n return readBackResult;\n });\n\n if (!readBackResult) {\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 new RejectedByPolicyError(this.model, 'result is not allowed to be read back');\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 readBackResult;\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 return this.safeTransaction(async (tx) => {\n const updateResult = await this.updateMany(tx, this.model, args.where, args.data, args.limit, true);\n return this.read(tx, this.model, {\n select: args.select,\n omit: args.omit,\n where: {\n OR: updateResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n } as any, // TODO: fix type\n });\n });\n }\n\n private async runUpsert(args: UpsertArgs<Schema, GetModels<Schema>>) {\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 );\n\n if (!mutationResult) {\n // non-existing, create\n mutationResult = await this.create(tx, this.model, args.create);\n }\n\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 });\n\n if (!result && this.hasPolicyEnabled) {\n throw new RejectedByPolicyError(this.model, 'result is not allowed to be read back');\n }\n\n return result;\n }\n}\n","import { 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 { type BuiltinType, type EnumDef, type FieldDef, type GetModels, type SchemaDef } from '../../schema';\nimport { enumerate } from '../../utils/enumerate';\nimport { extractFields } from '../../utils/object-utils';\nimport { AGGREGATE_OPERATORS, LOGICAL_COMBINATORS, NUMERIC_FIELD_TYPES } from '../constants';\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 { InputValidationError, InternalError, QueryError } from '../errors';\nimport {\n fieldHasDefaultValue,\n getDiscriminatorField,\n getEnum,\n getModel,\n getUniqueFields,\n requireField,\n requireModel,\n} from '../query-utils';\n\ntype GetSchemaFunc<Schema extends SchemaDef, Options> = (model: GetModels<Schema>, options: Options) => ZodType;\n\nexport class InputValidator<Schema extends SchemaDef> {\n private schemaCache = new Map<string, ZodType>();\n\n constructor(private readonly schema: Schema) {}\n\n validateFindArgs(model: GetModels<Schema>, unique: boolean, args: unknown) {\n return this.validate<FindArgs<Schema, GetModels<Schema>, true>, Parameters<typeof this.makeFindSchema>[1]>(\n model,\n 'find',\n { unique },\n (model, options) => this.makeFindSchema(model, options),\n args,\n );\n }\n\n validateCreateArgs(model: GetModels<Schema>, args: unknown) {\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) {\n return this.validate<CreateManyArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'createMany',\n undefined,\n (model) => this.makeCreateManySchema(model),\n args,\n );\n }\n\n validateCreateManyAndReturnArgs(model: GetModels<Schema>, args: unknown) {\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) {\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) {\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(model: GetModels<Schema>, args: unknown) {\n return this.validate<UpdateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'updateManyAndReturn',\n undefined,\n (model) => this.makeUpdateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpsertArgs(model: GetModels<Schema>, args: unknown) {\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) {\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(model: GetModels<Schema>, args: unknown) {\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) {\n return this.validate<CountArgs<Schema, GetModels<Schema>> | undefined, undefined>(\n model,\n 'count',\n undefined,\n (model) => this.makeCountSchema(model),\n args,\n );\n }\n\n validateAggregateArgs(model: GetModels<Schema>, args: unknown) {\n return this.validate<AggregateArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'aggregate',\n undefined,\n (model) => this.makeAggregateSchema(model),\n args,\n );\n }\n\n validateGroupByArgs(model: GetModels<Schema>, args: unknown) {\n return this.validate<GroupByArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'groupBy',\n undefined,\n (model) => this.makeGroupBySchema(model),\n args,\n );\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 model,\n operation,\n options,\n });\n let schema = this.schemaCache.get(cacheKey!);\n if (!schema) {\n schema = getSchema(model, options);\n this.schemaCache.set(cacheKey!, schema);\n }\n const { error } = schema.safeParse(args);\n if (error) {\n throw new InputValidationError(`Invalid ${operation} args: ${error.message}`, error);\n }\n return args as T;\n }\n\n // #region Find\n\n private makeFindSchema(model: string, options: { unique: 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();\n fields['include'] = this.makeIncludeSchema(model).optional();\n fields['omit'] = this.makeOmitSchema(model).optional();\n\n if (!options.unique) {\n fields['skip'] = this.makeSkipSchema().optional();\n fields['take'] = this.makeTakeSchema().optional();\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 makePrimitiveSchema(type: string) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n return this.makeTypeDefSchema(type);\n } else {\n return match(type)\n .with('String', () => z.string())\n .with('Int', () => z.number().int())\n .with('Float', () => z.number())\n .with('Boolean', () => z.boolean())\n .with('BigInt', () => z.union([z.number().int(), z.bigint()]))\n .with('Decimal', () => z.union([z.number(), z.instanceof(Decimal), z.string()]))\n .with('DateTime', () => z.union([z.date(), z.string().datetime()]))\n .with('Bytes', () => z.instanceof(Uint8Array))\n .otherwise(() => z.unknown());\n }\n }\n\n private makeTypeDefSchema(type: string): z.ZodType {\n const key = `$typedef-${type}`;\n let schema = this.schemaCache.get(key);\n if (schema) {\n return schema;\n }\n const typeDef = this.schema.typeDefs?.[type];\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n schema = z\n .object(\n Object.fromEntries(\n Object.entries(typeDef.fields).map(([field, def]) => {\n let fieldSchema = this.makePrimitiveSchema(def.type);\n if (def.array) {\n fieldSchema = fieldSchema.array();\n }\n if (def.optional) {\n fieldSchema = fieldSchema.optional();\n }\n return [field, fieldSchema];\n }),\n ),\n )\n .passthrough();\n this.schemaCache.set(key, schema);\n return schema;\n }\n\n private makeWhereSchema(\n model: string,\n unique: boolean,\n withoutRelationFields = false,\n withAggregations = false,\n ): ZodType {\n const modelDef = getModel(this.schema, model);\n if (!modelDef) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\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).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 {\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).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').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 new InternalError(`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 makeEnumFilterSchema(enumDef: EnumDef, optional: boolean, withAggregations: boolean) {\n const baseSchema = z.enum(Object.keys(enumDef) 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.makePrimitiveSchema(type).array().optional(),\n has: this.makePrimitiveSchema(type).optional(),\n hasEvery: this.makePrimitiveSchema(type).array().optional(),\n hasSome: this.makePrimitiveSchema(type).array().optional(),\n isEmpty: z.boolean().optional(),\n });\n }\n\n private makePrimitiveFilterSchema(type: BuiltinType, optional: boolean, withAggregations: boolean) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return this.makeTypeDefFilterSchema(type, optional);\n }\n return (\n match(type)\n .with('String', () => this.makeStringFilterSchema(optional, withAggregations))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.makeNumberFilterSchema(this.makePrimitiveSchema(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 // TODO: JSON filters\n .with('Json', () => z.any())\n .with('Unsupported', () => z.never())\n .exhaustive()\n );\n }\n\n private makeTypeDefFilterSchema(_type: string, _optional: boolean) {\n // TODO: strong typed JSON filtering\n return z.never();\n }\n\n private makeDateTimeFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n z.union([z.string().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 toManyRelations = Object.values(modelDef.fields).filter((def) => def.relation && def.array);\n\n if (toManyRelations.length > 0) {\n fields['_count'] = 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 }\n\n return z.strictObject(fields);\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.lazy(() => this.makeSelectSchema(fieldDef.type)).optional(),\n include: z.lazy(() => this.makeIncludeSchema(fieldDef.type)).optional(),\n omit: z.lazy(() => this.makeOmitSchema(fieldDef.type)).optional(),\n ...(fieldDef.array\n ? {\n // to-many relations can be ordered, skipped, taken, and cursor-located\n orderBy: z.lazy(() => this.makeOrderBySchema(fieldDef.type, true, false)).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 fields[field] = z.boolean().optional();\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 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 const schema = z.strictObject({\n data: dataSchema,\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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(),\n omit: this.makeOmitSchema(model).optional(),\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: ZodType = this.makePrimitiveSchema(fieldDef.type);\n\n if (fieldDef.array) {\n fieldSchema = z\n .union([\n z.array(fieldSchema),\n z.strictObject({\n set: z.array(fieldSchema),\n }),\n ])\n .optional();\n }\n\n if (fieldDef.optional || fieldHasDefaultValue(fieldDef)) {\n fieldSchema = fieldSchema.optional();\n }\n\n if (fieldDef.optional) {\n fieldSchema = fieldSchema.nullable();\n }\n\n uncheckedVariantFields[field] = fieldSchema;\n if (!fieldDef.foreignKeyFor) {\n // non-fk field\n checkedVariantFields[field] = fieldSchema;\n }\n }\n });\n\n if (!hasRelation) {\n return this.orArray(z.strictObject(uncheckedVariantFields), canBeArray);\n } else {\n return z.union([\n z.strictObject(uncheckedVariantFields),\n z.strictObject(checkedVariantFields),\n ...(canBeArray ? [z.array(z.strictObject(uncheckedVariantFields))] : []),\n ...(canBeArray ? [z.array(z.strictObject(checkedVariantFields))] : []),\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, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n this.makeUpdateDataSchema(fieldType, withoutFields),\n ])\n .optional();\n\n fields['upsert'] = this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, true),\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 const schema = z.strictObject({\n where: this.makeWhereSchema(model, true),\n data: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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 const result = base.extend({\n select: this.makeSelectSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectOmitMutuallyExclusive(result);\n }\n\n private makeUpsertSchema(model: string) {\n const schema = 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(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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: ZodType = this.makePrimitiveSchema(fieldDef.type).optional();\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),\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 fieldSchema = z\n .union([\n fieldSchema.array(),\n z\n .object({\n set: z.array(fieldSchema).optional(),\n push: this.orArray(fieldSchema, true).optional(),\n })\n .refine(\n (v) => Object.keys(v).length === 1,\n 'Only one of \"set\", \"push\" can be provided',\n ),\n ])\n .optional();\n }\n\n if (fieldDef.optional) {\n fieldSchema = fieldSchema.nullable();\n }\n\n uncheckedVariantFields[field] = fieldSchema;\n if (!fieldDef.foreignKeyFor) {\n // non-fk field\n checkedVariantFields[field] = fieldSchema;\n }\n }\n });\n\n if (!hasRelation) {\n return z.strictObject(uncheckedVariantFields);\n } else {\n return z.union([z.strictObject(uncheckedVariantFields), z.strictObject(checkedVariantFields)]);\n }\n }\n\n // #endregion\n\n // #region Delete\n\n private makeDeleteSchema(model: GetModels<Schema>) {\n const schema = z.strictObject({\n where: this.makeWhereSchema(model, true),\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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) => {\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) => {\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 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 await callback();\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 {\n AndNode,\n CompiledQuery,\n DefaultQueryExecutor,\n DeleteQueryNode,\n InsertQueryNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\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 type TableNode,\n} from 'kysely';\nimport { nanoid } from 'nanoid';\nimport { match } from 'ts-pattern';\nimport type { GetModels, SchemaDef } from '../../schema';\nimport { type ClientImpl } from '../client-impl';\nimport type { ClientContract } from '../contract';\nimport { InternalError, QueryError } from '../errors';\nimport type { AfterEntityMutationCallback, MutationInterceptionFilterResult, OnKyselyQueryCallback } from '../plugin';\nimport { QueryNameMapper } from './name-mapper';\nimport type { ZenStackDriver } from './zenstack-driver';\n\ntype QueryId = { queryId: string };\n\nexport class ZenStackQueryExecutor<Schema extends SchemaDef> extends DefaultQueryExecutor {\n private readonly nameMapper: QueryNameMapper;\n\n constructor(\n private client: ClientImpl<Schema>,\n private readonly driver: ZenStackDriver,\n private readonly compiler: QueryCompiler,\n adapter: DialectAdapter,\n private readonly connectionProvider: ConnectionProvider,\n plugins: KyselyPlugin[] = [],\n ) {\n super(compiler, adapter, connectionProvider, plugins);\n this.nameMapper = new QueryNameMapper(client.$schema);\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 async executeQuery(compiledQuery: CompiledQuery, _queryId: QueryId) {\n let queryNode = compiledQuery.query;\n let mutationInterceptionInfo: Awaited<ReturnType<typeof this.callMutationInterceptionFilters>>;\n if (this.isMutationNode(queryNode) && this.hasMutationHooks) {\n mutationInterceptionInfo = await this.callMutationInterceptionFilters(queryNode);\n }\n\n const task = async () => {\n // call before mutation hooks\n if (this.isMutationNode(queryNode)) {\n await this.callBeforeMutationHooks(queryNode, mutationInterceptionInfo);\n }\n\n // TODO: make sure insert and update return rows\n const oldQueryNode = queryNode;\n if (\n (InsertQueryNode.is(queryNode) || UpdateQueryNode.is(queryNode)) &&\n mutationInterceptionInfo?.loadAfterMutationEntities\n ) {\n // need to make sure the query node has \"returnAll\"\n // for insert and update queries\n queryNode = {\n ...queryNode,\n returning: ReturningNode.create([SelectionNode.createSelectAll()]),\n };\n }\n\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 const result = await this.proceedQueryWithKyselyInterceptors(queryNode, queryParams);\n\n // call after mutation hooks\n if (this.isMutationNode(queryNode)) {\n await this.callAfterMutationHooks(\n result.result,\n queryNode,\n mutationInterceptionInfo,\n result.connection,\n );\n }\n\n if (oldQueryNode !== queryNode) {\n // TODO: trim the result to the original query node\n }\n\n return result.result;\n };\n\n return task();\n }\n\n private proceedQueryWithKyselyInterceptors(\n queryNode: RootOperationNode,\n parameters: readonly unknown[] | undefined,\n ) {\n let proceed = (q: RootOperationNode) => this.proceedQuery(q, parameters);\n\n const hooks: OnKyselyQueryCallback<Schema>[] = [];\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 let connection: DatabaseConnection | undefined;\n const _p = async (q: RootOperationNode) => {\n const r = await _proceed(q);\n // carry over the database connection returned by the original executor\n connection = r.connection;\n return r.result;\n };\n\n const hookResult = await hook!({\n client: this.client as ClientContract<Schema>,\n schema: this.client.$schema,\n kysely: this.kysely,\n query,\n proceed: _p,\n });\n return { result: hookResult, connection: connection! };\n };\n }\n\n return proceed(queryNode);\n }\n\n private async proceedQuery(query: RootOperationNode, parameters: readonly unknown[] | undefined) {\n // run built-in transformers\n const finalQuery = this.nameMapper.transformNode(query);\n let compiled = this.compileQuery(finalQuery);\n if (parameters) {\n compiled = { ...compiled, parameters };\n }\n\n try {\n return await this.provideConnection(async (connection) => {\n const result = await connection.executeQuery<any>(compiled);\n return { result, connection };\n });\n } catch (err) {\n const message = `Failed to execute query: ${err}, sql: ${compiled.sql}`;\n throw new QueryError(message, err);\n }\n }\n\n private isMutationNode(queryNode: RootOperationNode) {\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 );\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 );\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 );\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 );\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 );\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 get hasMutationHooks() {\n return this.client.$options.plugins?.some((plugin) => !!plugin.onEntityMutation);\n }\n\n private getMutationModel(queryNode: OperationNode): GetModels<Schema> {\n return match(queryNode)\n .when(InsertQueryNode.is, (node) => node.into!.table.identifier.name)\n .when(UpdateQueryNode.is, (node) => (node.table as TableNode).table.identifier.name)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError(`Delete query must have exactly one from table`);\n }\n return (node.from.froms[0] as TableNode).table.identifier.name;\n })\n .otherwise((node) => {\n throw new InternalError(`Invalid query node: ${node}`);\n }) as GetModels<Schema>;\n }\n\n private async callMutationInterceptionFilters(queryNode: UpdateQueryNode | InsertQueryNode | DeleteQueryNode) {\n const plugins = this.client.$options.plugins;\n if (plugins) {\n const mutationModel = this.getMutationModel(queryNode);\n const result: MutationInterceptionFilterResult = {\n intercept: false,\n };\n\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 for (const plugin of plugins) {\n const onEntityMutation = plugin.onEntityMutation;\n if (!onEntityMutation) {\n continue;\n }\n\n if (!onEntityMutation.mutationInterceptionFilter) {\n // by default intercept without loading entities\n result.intercept = true;\n } else {\n const filterResult = await onEntityMutation.mutationInterceptionFilter({\n model: mutationModel,\n action,\n queryNode,\n });\n result.intercept ||= filterResult.intercept;\n result.loadBeforeMutationEntities ||= filterResult.loadBeforeMutationEntities;\n result.loadAfterMutationEntities ||= filterResult.loadAfterMutationEntities;\n }\n }\n\n let beforeMutationEntities: Record<string, unknown>[] | undefined;\n if (result.loadBeforeMutationEntities && (UpdateQueryNode.is(queryNode) || DeleteQueryNode.is(queryNode))) {\n beforeMutationEntities = await this.loadEntities(mutationModel, where);\n }\n\n return {\n ...result,\n mutationModel,\n action,\n where,\n beforeMutationEntities,\n };\n } else {\n return undefined;\n }\n }\n\n private async callBeforeMutationHooks(\n queryNode: OperationNode,\n mutationInterceptionInfo: Awaited<ReturnType<typeof this.callMutationInterceptionFilters>>,\n ) {\n if (!mutationInterceptionInfo?.intercept) {\n return;\n }\n\n if (this.options.plugins) {\n const mutationModel = this.getMutationModel(queryNode);\n for (const plugin of this.options.plugins) {\n const onEntityMutation = plugin.onEntityMutation;\n if (onEntityMutation?.beforeEntityMutation) {\n await onEntityMutation.beforeEntityMutation({\n model: mutationModel,\n action: mutationInterceptionInfo.action,\n queryNode,\n entities: mutationInterceptionInfo.beforeMutationEntities,\n });\n }\n }\n }\n }\n\n private async callAfterMutationHooks(\n queryResult: QueryResult<unknown>,\n queryNode: OperationNode,\n mutationInterceptionInfo: Awaited<ReturnType<typeof this.callMutationInterceptionFilters>>,\n connection: DatabaseConnection,\n ) {\n if (!mutationInterceptionInfo?.intercept) {\n return;\n }\n\n const hooks: AfterEntityMutationCallback<Schema>[] = [];\n // tsc perf\n for (const plugin of this.options.plugins ?? []) {\n const onEntityMutation = plugin.onEntityMutation;\n if (onEntityMutation?.afterEntityMutation) {\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 const inTransaction = this.driver.isTransactionConnection(connection);\n\n for (const hook of hooks) {\n let afterMutationEntities: Record<string, unknown>[] | undefined = undefined;\n if (mutationInterceptionInfo.loadAfterMutationEntities) {\n if (InsertQueryNode.is(queryNode) || UpdateQueryNode.is(queryNode)) {\n afterMutationEntities = queryResult.rows as Record<string, unknown>[];\n }\n }\n\n const action = async () => {\n try {\n await hook({\n model: mutationModel,\n action: mutationInterceptionInfo.action,\n queryNode,\n beforeMutationEntities: mutationInterceptionInfo.beforeMutationEntities,\n afterMutationEntities,\n });\n } catch (err) {\n console.error(`Error in afterEntityMutation hook for model \"${mutationModel}\": ${err}`);\n }\n };\n\n if (inTransaction) {\n // if we're in a transaction, the after mutation hooks should be triggered after the transaction is committed,\n // only register a callback here\n this.driver.registerTransactionCommitCallback(connection, action);\n } else {\n // otherwise trigger the hooks immediately\n await action();\n }\n }\n }\n\n private async loadEntities(\n model: GetModels<Schema>,\n where: WhereNode | undefined,\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);\n const result = await this.executeQuery(compiled, { queryId: `zenstack-${nanoid()}` });\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","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n OperationNodeTransformer,\n ReferenceNode,\n ReturningNode,\n SelectAllNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n type OperationNode,\n} from 'kysely';\nimport type { FieldDef, ModelDef, SchemaDef } from '../../schema';\nimport { getModel, requireModel } from '../query-utils';\n\ntype Scope = {\n model: string;\n alias?: string;\n namesMapped?: boolean;\n};\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 modelScopes: 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 [fieldName, fieldDef] of Object.entries(modelDef.fields)) {\n const mappedName = this.getMappedName(fieldDef);\n if (mappedName) {\n this.fieldToColumnMap.set(`${modelName}.${fieldName}`, 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 // all table names in \"from\" are pushed as scopes, each \"from\" is expanded\n // as nested query to apply column name mapping, so the scopes are marked\n // \"namesMapped\" so no additional name mapping is applied when resolving\n // columns\n const scopes = this.createScopesFromFroms(node.from, true);\n return this.withScopes(scopes, () => {\n return {\n ...super.transformSelectQuery(node),\n // convert \"from\" to nested query as needed\n from: this.processFrom(node.from!),\n };\n });\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n if (!node.into) {\n return super.transformInsertQuery(node);\n }\n\n return this.withScope(\n { model: node.into.table.identifier.name },\n () =>\n ({\n ...super.transformInsertQuery(node),\n // map table name\n into: this.processTableRef(node.into!),\n }) satisfies InsertQueryNode,\n );\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 transformJoin(node: JoinNode) {\n const { alias, node: innerNode } = this.stripAlias(node.table);\n if (TableNode.is(innerNode!)) {\n const modelName = innerNode.table.identifier.name;\n if (this.hasMappedColumns(modelName)) {\n // create a nested query with all fields selected and names mapped\n const select = this.createSelectAll(modelName);\n return { ...super.transformJoin(node), table: this.wrapAlias(select, alias ?? modelName) };\n }\n }\n return super.transformJoin(node);\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 { fieldDef, modelDef, scope } = this.resolveFieldFromScopes(\n node.column.column.name,\n node.table?.table.identifier.name,\n );\n if (fieldDef && !scope.namesMapped) {\n // map column name and table name as needed\n const mappedFieldName = this.mapFieldName(modelDef.name, fieldDef.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 === 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\n return ReferenceNode.create(\n ColumnNode.create(mappedFieldName),\n mappedTableName ? TableNode.create(mappedTableName) : undefined,\n );\n } else {\n return super.transformReference(node);\n }\n }\n\n protected override transformColumn(node: ColumnNode) {\n const { modelDef, fieldDef, scope } = this.resolveFieldFromScopes(node.column.name);\n if (!fieldDef || scope.namesMapped) {\n return super.transformColumn(node);\n }\n const mappedName = this.mapFieldName(modelDef.name, fieldDef.name);\n return ColumnNode.create(mappedName);\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const { alias, node: innerTable } = this.stripAlias(node.table);\n if (!innerTable || !TableNode.is(innerTable)) {\n return super.transformUpdateQuery(node);\n }\n\n return this.withScope({ model: innerTable.table.identifier.name, alias }, () => {\n return {\n ...super.transformUpdateQuery(node),\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 = this.createScopesFromFroms(node.from, false);\n\n // process name mapping in each \"from\"\n const froms = node.from.froms.map((from) => {\n const { alias, node: innerNode } = this.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 resolveFieldFromScopes(name: string, qualifier?: string) {\n for (const scope of this.modelScopes.toReversed()) {\n if (qualifier) {\n if (scope.alias) {\n if (qualifier !== scope.alias) {\n continue;\n }\n } else {\n if (qualifier !== scope.model) {\n continue;\n }\n }\n }\n const modelDef = getModel(this.schema, scope.model);\n if (!modelDef) {\n continue;\n }\n if (modelDef.fields[name]) {\n return { modelDef, fieldDef: modelDef.fields[name], scope };\n }\n }\n return { modelDef: undefined, fieldDef: undefined, scope: undefined };\n }\n\n private pushScope(scope: Scope) {\n this.modelScopes.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.modelScopes.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.modelScopes.pop());\n }\n }\n\n private wrapAlias<T extends OperationNode>(node: T, alias: string | undefined) {\n return alias ? AliasNode.create(node, IdentifierNode.create(alias)) : node;\n }\n\n private ensureAlias(node: OperationNode, alias: string | undefined, fallbackName: string) {\n if (!node) {\n return node;\n }\n return alias\n ? AliasNode.create(node, IdentifierNode.create(alias))\n : AliasNode.create(node, IdentifierNode.create(fallbackName));\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 return TableNode.create(this.mapTableName(node.table.identifier.name));\n }\n\n private getMappedName(def: ModelDef | FieldDef) {\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 stripAlias(node: OperationNode | undefined) {\n if (!node) {\n return { alias: undefined, node };\n }\n if (AliasNode.is(node)) {\n invariant(IdentifierNode.is(node.alias), 'Expected identifier as alias');\n return { alias: node.alias.name, node: node.node };\n }\n return { alias: undefined, node };\n }\n\n private hasMappedColumns(modelName: string) {\n return [...this.fieldToColumnMap.keys()].some((key) => key.startsWith(modelName + '.'));\n }\n\n private createScopesFromFroms(node: FromNode | undefined, namesMapped: boolean) {\n if (!node) {\n return [];\n }\n return node.froms\n .map((from) => {\n const { alias, node: innerNode } = this.stripAlias(from);\n if (innerNode && TableNode.is(innerNode)) {\n return { model: innerNode.table.identifier.name, alias, namesMapped };\n } else {\n return undefined;\n }\n })\n .filter((s) => !!s);\n }\n\n // convert a \"from\" node to a nested query if there are columns with name mapping\n private processFrom(node: FromNode): FromNode {\n return {\n ...super.transformFrom(node),\n froms: node.froms.map((from) => {\n const { alias, node: innerNode } = this.stripAlias(from);\n if (!innerNode) {\n return super.transformNode(from);\n }\n if (TableNode.is(innerNode)) {\n if (this.hasMappedColumns(innerNode.table.identifier.name)) {\n // create a nested query with all fields selected and names mapped\n const selectAll = this.createSelectAll(innerNode.table.identifier.name);\n\n // use the original alias or table name as the alias for the nested query\n // so its transparent to the outer scope\n return this.ensureAlias(selectAll, alias, innerNode.table.identifier.name);\n }\n }\n return this.transformNode(from);\n }),\n };\n }\n\n // create a `SelectQueryNode` for the given model with all columns mapped\n private createSelectAll(model: string): SelectQueryNode {\n const modelDef = requireModel(this.schema, model);\n const tableName = this.mapTableName(model);\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(tableName)]),\n selections: this.getModelFields(modelDef).map((fieldDef) => {\n const columnName = this.mapFieldName(model, fieldDef.name);\n const columnRef = ReferenceNode.create(ColumnNode.create(columnName), TableNode.create(tableName));\n if (columnName !== fieldDef.name) {\n const aliased = AliasNode.create(columnRef, IdentifierNode.create(fieldDef.name));\n return SelectionNode.create(aliased);\n } else {\n return SelectionNode.create(columnRef);\n }\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: AliasNode | ColumnNode | ReferenceNode) {\n let alias: string | undefined;\n if (!AliasNode.is(node)) {\n alias = this.extractFieldName(node);\n }\n const result = super.transformNode(node);\n return this.wrapAlias(result, alias);\n }\n\n private processSelectAll(node: SelectAllNode) {\n const scope = this.modelScopes[this.modelScopes.length - 1];\n invariant(scope);\n\n if (!this.hasMappedColumns(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(scope.model, fieldDef.name);\n const columnRef = ReferenceNode.create(ColumnNode.create(columnName));\n return columnName !== fieldDef.name ? this.wrapAlias(columnRef, fieldDef.name) : columnRef;\n });\n }\n\n private extractFieldName(node: ReferenceNode | ColumnNode) {\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\n // #endregion\n}\n","import { invariant, lowerCaseFirst, upperCaseFirst } from '@zenstackhq/common-helpers';\nimport { sql, ValueNode, type Expression, type ExpressionBuilder } 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: ExpressionBuilder<any, any>, args: Expression<any>[]) => {\n const [field, search, caseInsensitive = false] = 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 const searchExpr = eb.fn('CONCAT', [sql.lit('%'), search, sql.lit('%')]);\n return eb(field, caseInsensitive ? 'ilike' : 'like', searchExpr);\n};\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: 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, 'like', eb.fn('CONCAT', [search, sql.lit('%')]));\n};\n\nexport const endsWith: 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, 'like', eb.fn('CONCAT', [sql.lit('%'), search]));\n};\n\nexport const has: 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 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: 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 isEmpty: ZModelFunction<any> = (\n eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { dialect }: ZModelFunctionContext<any>,\n) => {\n const [field] = args;\n if (!field) {\n throw new Error('\"field\" parameter is required');\n }\n return eb(dialect.buildArrayLength(eb, field), '=', sql.lit(0));\n};\n\nexport const now: ZModelFunction<any> = (\n eb: ExpressionBuilder<any, any>,\n _args: Expression<any>[],\n { dialect }: ZModelFunctionContext<any>,\n) => {\n return match(dialect.provider)\n .with('postgresql', () => eb.fn('now'))\n .with('sqlite', () => sql.raw('CURRENT_TIMESTAMP'))\n .exhaustive();\n};\n\nexport const currentModel: ZModelFunction<any> = (\n _eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { model }: ZModelFunctionContext<any>,\n) => {\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> = (\n _eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { operation }: ZModelFunctionContext<any>,\n) => {\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","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 const createEnum = tx.schema.createType(name).asEnum(Object.values(enumDef));\n await createEnum.execute();\n }\n }\n\n // sort models so that target of fk constraints are created first\n const sortedModels = this.sortModels(this.schema.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: Record<string, ModelDef>): ModelDef[] {\n const graph: [ModelDef, ModelDef | undefined][] = [];\n\n for (const model of Object.values(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.createTable(modelDef.name).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,\n modelDef.baseModel,\n baseModelDef.idFields,\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 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(`pk_${modelDef.name}`, modelDef.idFields);\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 table = table.addUniqueConstraint(`unique_${modelDef.name}_${key}`, [key]);\n } else {\n // multi-field constraint\n table = table.addUniqueConstraint(`unique_${modelDef.name}_${key}`, Object.keys(value));\n }\n }\n return table;\n }\n\n private createModelField(table: CreateTableBuilder<any>, fieldDef: FieldDef, modelDef: ModelDef) {\n return table.addColumn(fieldDef.name, 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 table = table.addForeignKeyConstraint(\n `fk_${model}_${fieldName}`,\n fieldDef.relation.fields,\n fieldDef.type,\n fieldDef.relation.references,\n (cb) => {\n if (fieldDef.relation?.onDelete) {\n cb = cb.onDelete(this.mapCascadeAction(fieldDef.relation.onDelete));\n }\n if (fieldDef.relation?.onUpdate) {\n cb = cb.onUpdate(this.mapCascadeAction(fieldDef.relation.onUpdate));\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<Schema extends SchemaDef, T>(\n callback: (txClient?: ClientContract<Schema>) => Promise<T>,\n): ZenStackPromise<Schema, T> {\n let promise: Promise<T> | undefined;\n const cb = (txClient?: ClientContract<Schema>) => {\n try {\n return (promise ??= valueToPromise(callback(txClient)));\n } catch (err) {\n // deal with synchronous errors\n return Promise.reject<T>(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 { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from './constants';\nimport { ensureArray, getField, getIdValues } from './query-utils';\n\nexport class ResultProcessor<Schema extends SchemaDef> {\n constructor(private readonly schema: Schema) {}\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.transformJson(value);\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.transformScalar(v, type)));\n return value;\n } else {\n return this.transformScalar(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 transformScalar(value: unknown, type: BuiltinType) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return this.transformJson(value);\n } else {\n return match(type)\n .with('Boolean', () => this.transformBoolean(value))\n .with('DateTime', () => this.transformDate(value))\n .with('Bytes', () => this.transformBytes(value))\n .with('Decimal', () => this.transformDecimal(value))\n .with('BigInt', () => this.transformBigInt(value))\n .with('Json', () => this.transformJson(value))\n .otherwise(() => value);\n }\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 transformBigInt(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 transformBoolean(value: unknown) {\n return !!value;\n }\n\n private transformDate(value: unknown) {\n if (typeof value === 'number') {\n return new Date(value);\n } else if (typeof value === 'string') {\n return new Date(Date.parse(value));\n } else {\n return value;\n }\n }\n\n private transformBytes(value: unknown) {\n return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\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 private transformJson(value: unknown) {\n return match(this.schema.provider.type)\n .with('sqlite', () => {\n // better-sqlite3 returns JSON as string\n invariant(typeof value === 'string', 'Expected string, got ' + typeof value);\n return JSON.parse(value as string);\n })\n .otherwise(() => value);\n }\n}\n","import type { OperationNode, QueryResult, RootOperationNode, UnknownRow } from 'kysely';\nimport type { ClientContract, ToKysely } from '.';\nimport type { GetModels, SchemaDef } from '../schema';\nimport type { MaybePromise } from '../utils/type-utils';\nimport type { AllCrudOperation } from './crud/operations/base';\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 /**\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 * This callback determines whether a mutation should be intercepted, and if so,\n * what data should be loaded before and after the mutation.\n */\n mutationInterceptionFilter?: MutationInterceptionFilter<Schema>;\n\n /**\n * Called before an entity is mutated.\n * @param args.entity Only available if `loadBeforeMutationEntities` is set to true in the\n * return value of {@link RuntimePlugin.mutationInterceptionFilter}.\n */\n beforeEntityMutation?: BeforeEntityMutationCallback<Schema>;\n\n /**\n * Called after an entity is mutated.\n * @param args.beforeMutationEntity Only available if `loadBeforeMutationEntities` is set to true in the\n * return value of {@link RuntimePlugin.mutationInterceptionFilter}.\n * @param args.afterMutationEntity Only available if `loadAfterMutationEntities` is set to true in the\n * return value of {@link RuntimePlugin.mutationInterceptionFilter}.\n */\n afterEntityMutation?: AfterEntityMutationCallback<Schema>;\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\nexport type MutationInterceptionFilter<Schema extends SchemaDef> = (\n args: MutationHooksArgs<Schema>,\n) => MaybePromise<MutationInterceptionFilterResult>;\n\n/**\n * The result of the hooks interception filter.\n */\nexport type MutationInterceptionFilterResult = {\n /**\n * Whether to intercept the mutation or not.\n */\n intercept: boolean;\n\n /**\n * Whether entities should be loaded before the mutation.\n */\n loadBeforeMutationEntities?: boolean;\n\n /**\n * Whether entities should be loaded after the mutation.\n */\n loadAfterMutationEntities?: boolean;\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 * Entities that are about to be mutated. Only available if `loadBeforeMutationEntities` is set to\n * true in the return value of {@link RuntimePlugin.mutationInterceptionFilter}.\n */\n entities?: unknown[];\n};\n\nexport type PluginAfterEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {\n /**\n * Entities that are about to be mutated. Only available if `loadBeforeMutationEntities` is set to\n * true in the return value of {@link RuntimePlugin.mutationInterceptionFilter}.\n */\n beforeMutationEntities?: unknown[];\n\n /**\n * Entities mutated. Only available if `loadAfterMutationEntities` is set to true in the return\n * value of {@link RuntimePlugin.mutationInterceptionFilter}.\n */\n afterMutationEntities?: unknown[];\n};\n\n// #endregion\n\n// #region OnKyselyQuery hooks\n\nexport type OnKyselyQueryArgs<Schema extends SchemaDef> = {\n kysely: ToKysely<Schema>;\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","export { ZenStackClient } from './client-impl';\nexport type { ClientConstructor, ClientContract } from './contract';\nexport type * from './crud-types';\nexport * from './errors';\nexport type { ClientOptions } from './options';\nexport { definePlugin } from './plugin';\nexport type { ZenStackPromise } from './promise';\nexport type { ToKysely } from './query-builder';\nexport { sql } from 'kysely';\n"],"mappings":"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","names":["invariant","CompiledQuery","DefaultConnectionProvider","DefaultQueryExecutor","Kysely","Log","sql","sql","match","match","ExpressionUtils","literal","value","kind","array","items","call","functionName","args","function","binary","left","op","right","unary","operand","field","member","receiver","members","_this","_null","and","expr","expressions","reduce","acc","exp","or","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","extractFields","obj","fields","Object","fromEntries","entries","filter","key","includes","fieldsToSelectObject","map","f","InputValidationError","Error","message","cause","QueryError","InternalError","NotFoundError","model","getModel","schema","model","models","requireModel","matchedName","Object","keys","find","k","toLowerCase","QueryError","getField","field","modelDef","fields","requireField","getIdFields","idFields","getRelationForeignKeyFieldPairs","schema","model","relationField","fieldDef","requireField","relation","InternalError","fields","references","keyPairs","map","f","i","fk","pk","ownedByModel","opposite","oppositeField","type","isScalarField","field","getField","foreignKeyFor","isForeignKeyField","isRelationField","isInheritedField","originModel","getUniqueFields","modelDef","requireModel","result","key","value","Object","entries","uniqueFields","push","name","def","defs","fromEntries","keys","k","getIdValues","data","idFields","getIdFields","reduce","acc","buildFieldRef","options","eb","modelAlias","inlineComputedField","computed","ref","computer","computedFields","QueryError","currentModel","fieldHasDefaultValue","default","undefined","updatedAt","isEnum","enums","getEnum","buildJoinPairs","relationModelAlias","makeDefaultOrderBy","getManyToManyRelation","array","oppositeFieldDef","sortedModelNames","sort","orderedFK","sortedFieldNames","parentFkName","otherModel","otherField","otherFkName","joinTable","flattenCompoundUniqueFilters","filter","compoundUniques","u","length","some","assign","ensureArray","Array","isArray","extractIdFields","entity","schema","model","idFields","getIdFields","extractFields","getDiscriminatorField","modelDef","requireModel","delegateAttr","attributes","find","attr","name","undefined","discriminator","args","arg","ExpressionUtils","isField","value","InternalError","field","getDelegateDescendantModels","collected","Set","subModels","Object","values","models","filter","m","baseModel","forEach","def","has","add","aggregate","eb","expr","op","match","with","fn","count","sum","avg","min","max","exhaustive","createId","invariant","isPlainObject","expressionBuilder","sql","nanoid","match","ulid","uuid","RejectedByPolicyError","Error","model","reason","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","FromNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","TableNode","UpdateQueryNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","sql","match","NUMERIC_FIELD_TYPES","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","invariant","isPlainObject","expressionBuilder","sql","match","P","enumerate","x","undefined","Array","isArray","BaseCrudDialect","schema","options","transformPrimitive","value","_type","_forArrayField","buildSelectModel","eb","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","sql","ref","QueryError","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","expressionBuilder","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","modelIdField","getIdFields","relationIdField","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","InternalError","isEnum","buildEnumFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","lhs","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","invariant","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","mode","prepStringCasing","v","useDefaultIfEmpty","negated","forEach","k","raw","negateSort","sort","nulls","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","fields","isRelationField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","computed","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","filter","selections","reduce","acc","fieldModel","fieldCountQuery","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","buildFieldRef","PostgresCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toString","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","joinedQuery","buildRelationJSON","select","qb","parentName","relationFieldDef","requireField","schema","relationModel","leftJoinLateral","eb","joinTableName","result","selectFrom","subQueryAlias","subQuery","buildSelectModel","buildSelectAllFields","omit","buildFilterSortTake","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","sql","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","objArgs","buildRelationObjectArgs","array","fn","coalesce","relationModelDef","requireModel","descendantModels","getDelegateDescendantModels","push","subModel","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","Object","entries","fields","filter","relation","field","fieldRef","subJson","buildCountJson","fieldDef","fieldValue","include","selectInclude","isRelationField","forEach","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","supportInsertWithDefault","invariant","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","Array","isArray","map","v","schema","typeDefs","JSON","stringify","match","with","Date","toISOString","toString","Buffer","from","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","selectFrom","subQueryAlias","subQuery","buildSelectModel","buildSelectAllFields","omit","buildFilterSortTake","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","objArgs","descendantModels","getDelegateDescendantModels","push","subModel","sql","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","Object","entries","fields","filter","relation","field","fieldRef","subJson","buildCountJson","fieldDef","include","array","fn","coalesce","join","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","supportInsertWithDefault","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","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","ColumnCollector","DefaultOperationNodeVisitor","columns","collect","node","visitNode","visitColumn","includes","column","name","push","invariant","AliasNode","BinaryOperationNode","ColumnNode","expressionBuilder","FromNode","FunctionNode","IdentifierNode","OperatorNode","ReferenceNode","SelectionNode","SelectQueryNode","TableNode","ValueListNode","ValueNode","WhereNode","match","invariant","match","ExpressionEvaluator","evaluate","expression","context","result","match","when","ExpressionUtils","isArray","expr","evaluateArray","isBinary","evaluateBinary","isField","evaluateField","isLiteral","evaluateLiteral","isMember","evaluateMember","isUnary","evaluateUnary","isCall","evaluateCall","isThis","thisValue","isNull","exhaustive","function","auth","Error","op","with","operand","val","receiver","member","members","value","field","items","map","item","evaluateCollectionPredicate","left","right","_right","invariant","Array","includes","some","every","AliasNode","AndNode","BinaryOperationNode","FunctionNode","OperatorNode","OrNode","ParensNode","ReferenceNode","TableNode","UnaryOperationNode","ValueNode","trueNode","dialect","ValueNode","createImmediate","transformPrimitive","falseNode","isTrueNode","node","is","value","isFalseNode","conjunction","nodes","some","items","filter","n","length","reduce","acc","OrNode","AndNode","create","ParensNode","disjunction","logicalNot","UnaryOperationNode","OperatorNode","buildIsFalse","node","dialect","isFalseNode","trueNode","isTrueNode","falseNode","BinaryOperationNode","create","FunctionNode","OperatorNode","getTableName","TableNode","is","table","identifier","name","AliasNode","ReferenceNode","undefined","expressionHandlers","Map","expr","kind","_target","_propertyKey","descriptor","get","set","ExpressionTransformer","dialect","schema","clientOptions","auth","getCrudDialect","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","thisEntity","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformOperator","invariant","isAuthMember","ExpressionEvaluator","evaluate","ExpressionUtils","isField","isMember","newContextModel","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","other","isNull","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","result","transformCall","toOperationNode","func","functions","function","QueryError","eb","expressionBuilder","args","arg","transformCallArg","operation","isLiteral","val","thisEntityRaw","ref","isCall","valNode","valueMemberAccess","_member","SelectQueryNode","receiverField","memberFields","currType","push","fromModel","currNode","i","length","ColumnNode","receiverType","fieldValue","relationModel","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","column","node","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","isMutationQueryNode","transformNode","mutationRequiresTransaction","mutationModel","getMutationModel","InsertQueryNode","is","constCondition","tryGetConstantPolicy","returning","enforcePreCreatePolicy","transformedNode","result","onlyReturningId","readBackResult","processReadBack","rows","length","idFields","getIdFields","collector","ColumnCollector","selectedColumns","collect","every","c","includes","columns","values","model","fields","map","column","name","valueRows","unwrapCreateValueRows","enforcePreCreatePolicyForOne","v","raw","valuesRaw","thisEntity","thisEntityRaw","i","filter","buildPolicyFilter","preCreateCheck","kind","selections","SelectionNode","create","AliasNode","IdentifierNode","$condition","ValuesNode","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","invariant","item","fieldDef","requireField","push","ValueNode","transformPrimitive","value","type","array","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","table","idConditions","buildIdConditions","policyFilter","select","from","FromNode","TableNode","where","WhereNode","conjunction","selectResult","disjunction","row","field","BinaryOperationNode","ColumnNode","OperatorNode","r","match","when","getTableName","into","UpdateQueryNode","DeleteQueryNode","froms","exhaustive","SelectQueryNode","alias","falseNode","allows","policy","transformPolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","transformSelectQuery","whereNode","forEach","extractResult","extractTableName","baseResult","transformInsertQuery","ReturningNode","transformUpdateQuery","transformDeleteQuery","identifier","inner","ExpressionTransformer","$auth","transform","auth","modelName","modelDef","requireModel","extractOperations","split","trim","attributes","attr","operations","args","PolicyPlugin","id","name","description","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle","isPlainObject","clone","value","Array","isArray","map","v","isPlainObject","result","key","Object","keys","BaseOperationHandler","dialect","client","model","inputValidator","getCrudDialect","schema","$options","$schema","options","kysely","$qb","withClient","hasPolicyEnabled","plugins","some","plugin","PolicyPlugin","requireModel","getModel","requireField","field","getField","exists","filter","idFields","getIdFields","_filter","flattenCompoundUniqueFilters","query","selectFrom","where","eb","and","select","map","f","dynamic","ref","limit","modifyEnd","makeContextComment","operation","executeQueryTakeFirst","read","args","buildSelectModel","expressionBuilder","buildFilterSortTake","buildFieldSelection","buildSelectAllFields","omit","include","result","queryId","createId","compiled","getExecutor","compileQuery","toOperationNode","r","executeQuery","rows","err","message","sql","QueryError","readUnique","take","selectOrInclude","parentAlias","payload","Object","entries","buildCountSelection","fieldDef","relation","buildSelectField","array","optional","originModel","buildRelationSelection","buildCountJson","as","create","data","fromRelation","creatingForDelegate","modelDef","isDelegate","createFields","parentUpdateTask","undefined","m2m","getManyToManyRelation","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","parentFkFields","buildFkAssignments","ids","assign","entity","updateTable","set","reduce","acc","fk","pk","postCreateRelations","value","isScalarField","isForeignKeyField","Array","isArray","transformPrimitive","type","subM2M","fields","references","fkValues","processOwnedRelationForCreate","i","length","subPayload","baseModel","baseCreateResult","processBaseModelCreate","remainingFields","updatedData","fillGeneratedValues","insertInto","$if","keys","qb","defaultValues","values","returning","createdEntity","relationPromises","processNoneOwnedRelationForCreate","Promise","all","handleManyToManyRelation","otherModel","otherField","joinTable","forModel","thisCreateFields","forEach","discriminatorField","getDiscriminatorField","invariant","baseEntity","idValues","extractIdFields","relationField","pair","action","leftModel","leftField","leftEntity","rightModel","rightField","rightEntity","sortedRecords","sort","a","b","localeCompare","firstIds","secondIds","A","B","onConflict","oc","columns","doNothing","execute","deleteFrom","resetManyToManyRelation","parentIds","parentId","parentFkName","relationModel","created","getIdValues","referencedPkFields","extractedFks","extractFields","relationEntity","fieldsToSelectObject","NotFoundError","found","contextModel","relationFieldName","parentEntity","relationFieldDef","tasks","fromRelationContext","push","enumerate","item","createMany","connectRelation","then","input","returnData","count","relationKeyPairs","createData","newItem","name","supportInsertWithDefault","allPassedFields","includes","default","skipDuplicates","processBaseModelCreateMany","remainingFieldRows","Number","numAffectedRows","createRows","thisCreateRows","baseEntities","clone","generated","evalGenerator","updatedAt","Date","defaultValue","ExpressionUtils","isCall","match","function","with","isLiteral","v7","v4","nanoid","ulid","otherwise","isMember","receiver","val","$auth","member","members","update","allowRelationUpdate","throwIfNotFound","InternalError","parentWhere","fromEntity","fromRelationFieldDef","opposite","combinedWhere","AND","finalData","fieldName","needIdRead","isIdFilter","readResult","makeIdSelect","baseUpdateResult","processBaseModelUpdate","updateFields","thisEntity","processScalarFieldUpdateData","processRelationUpdates","buildFilter","updatedEntity","isNumericIncrementalUpdate","transformIncrementalUpdate","transformScalarListUpdate","isNumericField","key","every","thisUpdateFields","fieldRef","ensureArray","NUMERIC_FIELD_TYPES","_context","updateMany","filterModel","isRelationField","shouldFallbackToIdFilter","supportsUpdateWithLimit","resultFromBaseModel","baseResult","processBaseModelUpdateMany","refTuple","buildIdFieldRefs","fieldModel","connectOrCreateRelation","disconnectRelation","setRelation","updated","deleteRelation","Error","_data","normalizeRelationManipulationInput","actions","d","getEntityIds","results","updateResult","target","or","existing","disconnectConditions","condition","fromEntries","fkConditions","not","throwForNotFound","deleteConditions","expectedDeleteCount","deleteResult","delete","OR","processBaseModelDelete","needIdFilter","supportsDeleteWithLimit","processDelegateRelationDelete","oppositeModelDef","oppositeRelation","onDelete","trimResult","needReturnRelations","returnRelation","K","v","safeTransaction","callback","isolationLevel","isTransaction","txBuilder","transaction","setIsolationLevel","uniqueFilter","k","normalizeArgs","newArgs","doNormalizeArgs","isPlainObject","makeQueryId","compile","executeQueryTakeFirstOrThrow","AggregateOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateAggregateArgs","model","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","eb1","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","sql","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","sql","CountOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateCountArgs","model","subQueryName","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","eb1","buildFilter","select","key","value","Object","entries","buildSelectField","lit","as","buildSkipTake","skip","take","keys","map","cast","fn","countAll","count","sql","ref","result","executeQuery","rows","match","CreateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runCreate","inputValidator","validateCreateArgs","model","runCreateMany","validateCreateManyArgs","runCreateManyAndReturn","validateCreateManyAndReturnArgs","exhaustive","result","safeTransaction","tx","createResult","create","data","readUnique","select","include","omit","where","getIdValues","schema","hasPolicyEnabled","RejectedByPolicyError","undefined","count","createMany","kysely","read","OR","map","item","match","DeleteOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runDelete","inputValidator","validateDeleteArgs","model","runDeleteMany","validateDeleteManyArgs","exhaustive","existing","readUnique","kysely","select","include","omit","where","NotFoundError","safeTransaction","tx","result","delete","count","limit","FindOperationHandler","BaseOperationHandler","handle","operation","args","validateArgs","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateFindArgs","model","result","read","client","$qb","finalResult","expressionBuilder","match","GroupByOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateGroupByArgs","model","query","kysely","selectFrom","eb","subQuery","selectAll","where","eb1","dialect","buildFilter","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","as","fieldRef","field","expressionBuilder","bys","by","groupBy","map","orderBy","having","select","key","value","Object","entries","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","readBackResult","safeTransaction","tx","updateResult","update","where","data","readFilter","undefined","readUnique","select","include","omit","hasPolicyEnabled","RejectedByPolicyError","updateMany","limit","read","OR","map","item","getIdValues","schema","result","mutationResult","create","invariant","Decimal","stableStringify","match","P","z","InputValidator","schemaCache","Map","schema","validateFindArgs","model","unique","args","validate","options","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","operation","getSchema","cacheKey","stableStringify","get","set","error","safeParse","InputValidationError","message","fields","where","makeWhereSchema","optional","makeSelectSchema","makeIncludeSchema","makeOmitSchema","makeSkipSchema","makeTakeSchema","orArray","makeOrderBySchema","makeCursorSchema","makeDistinctSchema","result","z","strictObject","refineForSelectIncludeMutuallyExclusive","refineForSelectOmitMutuallyExclusive","makePrimitiveSchema","type","typeDefs","makeTypeDefSchema","match","with","string","number","int","boolean","union","bigint","instanceof","Decimal","date","datetime","Uint8Array","otherwise","unknown","key","typeDef","invariant","object","Object","fromEntries","entries","map","field","def","fieldSchema","array","passthrough","withoutRelationFields","withAggregations","modelDef","getModel","QueryError","keys","fieldDef","requireField","relation","lazy","nullableIf","some","every","none","is","isNot","enumDef","getEnum","length","makeEnumFilterSchema","makeArrayFilterSchema","makePrimitiveFilterSchema","uniqueFields","getUniqueFields","uniqueField","name","defs","never","custom","v","baseWhere","InternalError","required","refine","value","baseSchema","enum","components","makeCommonPrimitiveFilterComponents","equals","has","hasEvery","hasSome","isEmpty","makeTypeDefFilterSchema","makeStringFilterSchema","P","makeNumberFilterSchema","makeBooleanFilterSchema","makeDateTimeFilterSchema","makeBytesFilterSchema","any","exhaustive","_type","_optional","makeCommonPrimitiveFilterSchema","makeThis","supportedOperators","commonAggSchema","notEquals","in","notIn","lt","lte","gt","gte","not","includes","_count","_avg","_sum","_min","_max","extractFields","startsWith","endsWith","contains","providerSupportsCaseSensitivity","mode","makeStringModeSchema","literal","requireModel","makeRelationSelectIncludeSchema","toManyRelations","values","filter","select","reduce","acc","objSchema","include","omit","orderBy","skip","take","cursor","distinct","withRelation","WithAggregation","sort","relationOrderBy","extend","nulls","aggregationFields","agg","nonRelationFields","dataSchema","makeCreateDataSchema","data","makeCreateManyDataSchema","base","canBeArray","withoutFields","uncheckedVariantFields","checkedVariantFields","hasRelation","f","forEach","computed","isDelegateDiscriminator","excludeFields","oppositeField","opposite","push","oppositeFieldDef","makeRelationManipulationSchema","allFksOptional","fkDef","fieldHasDefaultValue","nullable","references","foreignKeyFor","originModel","discriminatorField","getDiscriminatorField","fieldType","create","connect","makeConnectDataSchema","connectOrCreate","makeConnectOrCreateDataSchema","makeDisconnectDataSchema","makeDeleteRelationDataSchema","makeUpdateDataSchema","update","makeSetDataSchema","toManyRelation","uniqueFilter","whereSchema","createSchema","skipDuplicates","limit","nonnegative","isNumericField","increment","decrement","multiply","divide","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","rollbackTransaction","destroy","isLevelEnabled","executeQuery","streamQuery","dis","compiledQuery","caughtError","startTime","performanceNow","call","error","chunkSize","level","query","queryDurationMillis","isStream","isTransactionConnection","registerTransactionCommitCallback","push","performance","now","Date","AndNode","DefaultQueryExecutor","DeleteQueryNode","InsertQueryNode","ReturningNode","SelectionNode","UpdateQueryNode","WhereNode","nanoid","match","invariant","AliasNode","ColumnNode","FromNode","IdentifierNode","OperationNodeTransformer","ReferenceNode","SelectAllNode","SelectionNode","TableNode","QueryNameMapper","OperationNodeTransformer","modelToTableMap","Map","fieldToColumnMap","modelScopes","schema","modelName","modelDef","Object","entries","models","mappedName","getMappedName","set","fieldName","fieldDef","fields","transformSelectQuery","node","from","froms","scopes","createScopesFromFroms","withScopes","processFrom","transformInsertQuery","into","withScope","model","table","identifier","name","processTableRef","transformReturning","kind","selections","processSelections","transformJoin","alias","innerNode","stripAlias","TableNode","is","hasMappedColumns","select","createSelectAll","wrapAlias","transformReference","ColumnNode","column","scope","resolveFieldFromScopes","namesMapped","mappedFieldName","mapFieldName","mappedTableName","mapTableName","ReferenceNode","create","undefined","transformColumn","transformUpdateQuery","innerTable","transformDeleteQuery","map","transformNode","FromNode","qualifier","toReversed","getModel","pushScope","push","fn","pop","forEach","s","AliasNode","IdentifierNode","ensureAlias","fallbackName","def","mapAttr","attributes","find","attr","nameArg","args","arg","value","field","get","tableName","invariant","keys","some","key","startsWith","filter","transformFrom","selectAll","requireModel","getModelFields","columnName","columnRef","aliased","SelectionNode","values","f","relation","computed","originModel","result","selection","SelectAllNode","processed","processSelectAll","Array","isArray","processSelection","extractFieldName","length","transformSelectAll","ZenStackQueryExecutor","DefaultQueryExecutor","nameMapper","client","driver","compiler","adapter","connectionProvider","plugins","QueryNameMapper","$schema","kysely","$qb","options","$options","executeQuery","compiledQuery","_queryId","queryNode","query","mutationInterceptionInfo","isMutationNode","hasMutationHooks","callMutationInterceptionFilters","task","callBeforeMutationHooks","oldQueryNode","InsertQueryNode","is","UpdateQueryNode","loadAfterMutationEntities","returning","ReturningNode","create","SelectionNode","createSelectAll","queryParams","$raw","parameters","undefined","result","proceedQueryWithKyselyInterceptors","callAfterMutationHooks","connection","proceed","q","proceedQuery","hooks","plugin","onKyselyQuery","push","bind","hook","_proceed","_p","r","hookResult","schema","finalQuery","transformNode","compiled","compileQuery","provideConnection","err","message","sql","QueryError","DeleteQueryNode","withPlugin","withPlugins","withPluginAtFront","withoutPlugins","withConnectionProvider","newExecutor","withExecutor","some","onEntityMutation","getMutationModel","match","when","node","into","table","identifier","name","from","froms","length","InternalError","otherwise","mutationModel","intercept","action","where","exhaustive","mutationInterceptionFilter","filterResult","model","loadBeforeMutationEntities","beforeMutationEntities","loadEntities","beforeEntityMutation","entities","queryResult","afterEntityMutation","inTransaction","isTransactionConnection","afterMutationEntities","rows","console","error","registerTransactionCommitCallback","selectQuery","selectFrom","selectAll","selectQueryNode","toOperationNode","andNodes","queryId","nanoid","condition1","condition2","WhereNode","AndNode","invariant","lowerCaseFirst","upperCaseFirst","sql","ValueNode","match","contains","eb","args","field","search","caseInsensitive","Error","searchExpr","fn","sql","lit","_eb","_args","startsWith","endsWith","has","hasEvery","hasSome","isEmpty","dialect","buildArrayLength","now","match","provider","with","raw","exhaustive","currentModel","model","result","casing","processCasing","currentOperation","operation","opNode","toOperationNode","invariant","ValueNode","is","value","toUpperCase","toLowerCase","upperCaseFirst","lowerCaseFirst","otherwise","invariant","sql","toposort","match","SchemaDbPusher","schema","kysely","push","transaction","execute","tx","enums","provider","type","name","enumDef","Object","entries","createEnum","createType","asEnum","values","sortedModels","sortModels","models","modelDef","createTable","createModelTable","graph","model","added","baseModel","baseDef","requireModel","field","fields","relation","references","targetModel","undefined","toposort","reverse","filter","m","table","ifNotExists","fieldName","fieldDef","originModel","id","addForeignKeyConstraint","isComputedField","createModelField","baseModelDef","idFields","cb","onDelete","onUpdate","addPrimaryKeyConstraint","addUniqueConstraint","attributes","some","a","length","f","key","value","uniqueFields","invariant","unique","keys","addColumn","mapFieldType","col","primaryKey","default","ExpressionUtils","isCall","function","defaultTo","sql","optional","array","notNull","isAutoIncrement","autoIncrement","ref","isCustomType","result","match","with","otherwise","Error","raw","typeDefs","def","mapCascadeAction","action","exhaustive","createZenStackPromise","callback","promise","cb","txClient","valueToPromise","err","Promise","reject","then","onFulfilled","onRejected","catch","finally","onFinally","Symbol","toStringTag","thing","resolve","invariant","Decimal","match","ResultProcessor","schema","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","transformJson","subModel","slice","length","idValues","getIdValues","values","some","v","processedSubRow","assign","fieldDef","getField","array","relation","processRelation","processFieldValue","type","transformScalar","relationData","typeDefs","match","with","transformBoolean","transformDate","transformBytes","transformDecimal","transformBigInt","otherwise","Decimal","invariant","BigInt","Date","Buffer","isBuffer","Uint8Array","from","take","reverse","selectInclude","include","select","ensureArray","field","provider","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","callback","txBuilder","transaction","isolationLevel","setIsolationLevel","execute","tx","txClient","arg","result","promise","push","$procedures","Object","keys","procedures","reduce","acc","name","args","handleProc","QueryError","procOptions","Error","apply","$disconnect","destroy","$pushSchema","SchemaDbPusher","$use","plugin","newPlugins","plugins","newOptions","$unuse","pluginId","id","$unuseAll","$setAuth","undefined","newClient","$auth","$executeRaw","query","values","createZenStackPromise","sql","Number","numAffectedRows","$executeRawUnsafe","compiledQuery","createRawCompiledQuery","executeQuery","$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","NotFoundError","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","sql"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/client-impl.ts","../src/client/crud/operations/aggregate.ts","../src/client/query-utils.ts","../src/schema/expression.ts","../src/utils/object-utils.ts","../src/client/errors.ts","../src/client/crud/operations/base.ts","../src/plugins/policy/errors.ts","../src/plugins/policy/policy-handler.ts","../src/client/crud/dialects/index.ts","../src/client/crud/dialects/postgresql.ts","../src/client/constants.ts","../src/client/crud/dialects/base.ts","../src/utils/enumerate.ts","../src/client/crud/dialects/sqlite.ts","../src/utils/default-operation-node-visitor.ts","../src/plugins/policy/column-collector.ts","../src/plugins/policy/expression-transformer.ts","../src/plugins/policy/expression-evaluator.ts","../src/plugins/policy/utils.ts","../src/plugins/policy/plugin.ts","../src/utils/clone.ts","../src/client/contract.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.ts","../src/client/executor/zenstack-driver.ts","../src/client/executor/zenstack-query-executor.ts","../src/client/executor/kysely-utils.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/client/index.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 { GetModels, ProcedureDef, SchemaDef } from '../schema';\nimport type { AuthType } from '../schema/auth';\nimport type { UnwrapTuplePromises } from '../utils/type-utils';\nimport type { ClientConstructor, ClientContract, ModelOperations, TransactionIsolationLevel } 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 { NotFoundError, QueryError } 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 type { ToKysely } from './query-builder';\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>(schema, options);\n} as unknown as ClientConstructor;\n\nexport class ClientImpl<Schema extends SchemaDef> {\n private kysely: ToKysely<Schema>;\n private kyselyRaw: ToKysely<any>;\n public readonly $options: ClientOptions<Schema>;\n public readonly $schema: Schema;\n readonly kyselyProps: KyselyProps;\n private auth: AuthType<Schema> | undefined;\n\n constructor(\n private readonly schema: Schema,\n private options: ClientOptions<Schema>,\n baseClient?: ClientImpl<Schema>,\n executor?: QueryExecutor,\n ) {\n this.$schema = schema;\n this.$options = options ?? ({} as ClientOptions<Schema>);\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<Schema>) => Promise<T>,\n options?: { isolationLevel?: TransactionIsolationLevel },\n ): Promise<T>;\n\n // overload for sequential transaction\n $transaction<P extends ZenStackPromise<Schema, 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<Schema>) => 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<Schema>);\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<Schema>(this.schema, this.$options, this);\n txClient.kysely = tx;\n return callback(txClient as unknown as ClientContract<Schema>);\n });\n }\n }\n\n private async sequentialTransaction(\n arg: ZenStackPromise<Schema, any>[],\n options?: { isolationLevel?: TransactionIsolationLevel },\n ) {\n const execute = async (tx: Kysely<any>) => {\n const txClient = new ClientImpl<Schema>(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<Schema>));\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 Kysely<any>));\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 new QueryError('Procedures are not configured for the client.');\n }\n\n const procOptions = this.$options.procedures as ProceduresOptions<\n Schema & {\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 $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<Schema>) {\n // tsc perf\n const newPlugins: RuntimePlugin<Schema>[] = [...(this.$options.plugins ?? []), plugin];\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $unuse(pluginId: string) {\n // tsc perf\n const newPlugins: RuntimePlugin<Schema>[] = [];\n for (const plugin of this.options.plugins ?? []) {\n if (plugin.id !== pluginId) {\n newPlugins.push(plugin);\n }\n }\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: newPlugins,\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $unuseAll() {\n // tsc perf\n const newOptions: ClientOptions<Schema> = {\n ...this.options,\n plugins: [] as RuntimePlugin<Schema>[],\n };\n return new ClientImpl<Schema>(this.schema, newOptions, this);\n }\n\n $setAuth(auth: AuthType<Schema> | undefined) {\n if (auth !== undefined && typeof auth !== 'object') {\n throw new Error('Invalid auth object');\n }\n const newClient = new ClientImpl<Schema>(this.schema, this.$options, this);\n newClient.auth = auth;\n return newClient;\n }\n\n get $auth() {\n return this.auth;\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<Schema extends SchemaDef>(client: ClientImpl<Schema>): ClientImpl<Schema> {\n const inputValidator = new InputValidator(client.$schema);\n const resultProcessor = new ResultProcessor(client.$schema);\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(\n client as unknown as ClientContract<Schema>,\n model as GetModels<Schema>,\n inputValidator,\n resultProcessor,\n );\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as unknown as ClientImpl<Schema>;\n}\n\nfunction createModelCrudHandler<Schema extends SchemaDef, Model extends GetModels<Schema>>(\n client: ClientContract<Schema>,\n model: Model,\n inputValidator: InputValidator<Schema>,\n resultProcessor: ResultProcessor<Schema>,\n): ModelOperations<Schema, Model> {\n const createPromise = (\n operation: CoreCrudOperation,\n nominalOperation: AllCrudOperation,\n args: unknown,\n handler: BaseOperationHandler<Schema>,\n postProcess = false,\n throwIfNoResult = false,\n ) => {\n return createZenStackPromise(async (txClient?: ClientContract<Schema>) => {\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 new NotFoundError(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n findUniqueOrThrow: (args: unknown) => {\n return createPromise(\n 'findUnique',\n 'findUniqueOrThrow',\n args,\n new FindOperationHandler<Schema>(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n findFirstOrThrow: (args: unknown) => {\n return createPromise(\n 'findFirst',\n 'findFirstOrThrow',\n args,\n new FindOperationHandler<Schema>(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<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n create: (args: unknown) => {\n return createPromise(\n 'create',\n 'create',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n createMany: (args: unknown) => {\n return createPromise(\n 'createMany',\n 'createMany',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n createManyAndReturn: (args: unknown) => {\n return createPromise(\n 'createManyAndReturn',\n 'createManyAndReturn',\n args,\n new CreateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n update: (args: unknown) => {\n return createPromise(\n 'update',\n 'update',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n updateMany: (args: unknown) => {\n return createPromise(\n 'updateMany',\n 'updateMany',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n updateManyAndReturn: (args: unknown) => {\n return createPromise(\n 'updateManyAndReturn',\n 'updateManyAndReturn',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n upsert: (args: unknown) => {\n return createPromise(\n 'upsert',\n 'upsert',\n args,\n new UpdateOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n delete: (args: unknown) => {\n return createPromise(\n 'delete',\n 'delete',\n args,\n new DeleteOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n\n deleteMany: (args: unknown) => {\n return createPromise(\n 'deleteMany',\n 'deleteMany',\n args,\n new DeleteOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n count: (args: unknown) => {\n return createPromise(\n 'count',\n 'count',\n args,\n new CountOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n aggregate: (args: unknown) => {\n return createPromise(\n 'aggregate',\n 'aggregate',\n args,\n new AggregateOperationHandler<Schema>(client, model, inputValidator),\n false,\n );\n },\n\n groupBy: (args: unknown) => {\n return createPromise(\n 'groupBy',\n 'groupBy',\n args,\n new GroupByOperationHandler<Schema>(client, model, inputValidator),\n true,\n );\n },\n } as ModelOperations<Schema, Model>;\n}\n","import type { ExpressionBuilder } from 'kysely';\nimport { sql } from 'kysely';\nimport { 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(eb as ExpressionBuilder<any, any>, this.model, this.model)\n .where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));\n\n // select fields: collect fields from aggregation body\n const selectedFields: string[] = [];\n for (const [key, value] of Object.entries(parsedArgs)) {\n if (key.startsWith('_') && value && typeof value === 'object') {\n // select fields\n Object.entries(value)\n .filter(([field]) => field !== '_all')\n .filter(([, val]) => val === true)\n .forEach(([field]) => {\n if (!selectedFields.includes(field)) selectedFields.push(field);\n });\n }\n }\n if (selectedFields.length > 0) {\n for (const field of selectedFields) {\n subQuery = this.dialect.buildSelectField(subQuery, this.model, this.model, field);\n }\n } else {\n // if no field is explicitly selected, just do a `select 1` so `_count` works\n subQuery = subQuery.select(() => eb.lit(1).as('_all'));\n }\n\n // skip & take\n const skip = parsedArgs?.skip;\n let take = parsedArgs?.take;\n let negateOrderBy = false;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n subQuery = this.dialect.buildSkipTake(subQuery, skip, take);\n\n // orderBy\n subQuery = this.dialect.buildOrderBy(\n subQuery,\n this.model,\n this.model,\n parsedArgs.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n return subQuery.as('$sub');\n });\n\n // aggregations\n for (const [key, value] of Object.entries(parsedArgs)) {\n switch (key) {\n case '_count': {\n if (value === true) {\n query = query.select((eb) => 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(sql.ref(`$sub.${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) => {\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(sql.ref(`$sub.${field}`)).as(`${key}.${field}`);\n });\n }\n });\n break;\n }\n }\n }\n\n const result = await this.executeQuery(this.kysely, query, 'aggregate');\n const ret: any = {};\n\n // postprocess result to convert flat fields into nested objects\n for (const [key, value] of Object.entries(result.rows[0] as object)) {\n if (key === '_count') {\n ret[key] = value;\n continue;\n }\n const parts = key.split('.');\n if (parts.length < 2) {\n continue;\n }\n\n const op = parts[0]!;\n const field = [...parts.slice(1)].join('.');\n\n let val: any = value;\n if (typeof value === 'string') {\n const fieldDef = getField(this.schema, this.model, field);\n if (fieldDef) {\n const type = fieldDef.type;\n if (op === '_avg') {\n val = parseFloat(val);\n } else {\n if (op === '_sum' || op === '_min' || op === '_max') {\n val = match(type)\n .with('Int', () => parseInt(value, 10))\n .with('BigInt', () => BigInt(value))\n .with('Float', () => parseFloat(value))\n .with('Decimal', () => parseFloat(value))\n .otherwise(() => value);\n }\n }\n }\n }\n\n ret[op] = {\n ...ret[op],\n [field]: val,\n };\n }\n\n return ret;\n }\n}\n","import type { Expression, ExpressionBuilder, ExpressionWrapper } 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 { InternalError, QueryError } from './errors';\nimport type { ClientOptions } from './options';\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 schema.models[model];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n const matchedName = Object.keys(schema.models).find((k) => k.toLowerCase() === model.toLowerCase());\n if (!matchedName) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\n return schema.models[matchedName]!;\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, model: string, field: string) {\n const modelDef = requireModel(schema, model);\n if (!modelDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in model \"${model}\"`);\n }\n return modelDef.fields[field];\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n const modelDef = requireModel(schema, model);\n return modelDef?.idFields as GetModels<Schema>[];\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 new InternalError(`Model \"${model}\" does not have ID field(s)`);\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 new InternalError(`Field \"${relationField}\" is not a relation`);\n }\n\n if (fieldDef.relation.fields) {\n if (!fieldDef.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\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 new InternalError(`Opposite relation not defined for field \"${relationField}\"`);\n }\n\n const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n if (!oppositeField.relation) {\n throw new InternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`);\n }\n if (!oppositeField.relation.fields) {\n throw new InternalError(`Relation fields not defined for field \"${relationField}\"`);\n }\n if (!oppositeField.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\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 new InternalError(`Invalid unique field definition for \"${key}\"`);\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 new InternalError(`ID fields not defined for model \"${model}\"`);\n }\n return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function buildFieldRef<Schema extends SchemaDef>(\n schema: Schema,\n model: string,\n field: string,\n options: ClientOptions<Schema>,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n): ExpressionWrapper<any, any, unknown> {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.computed) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n } else {\n if (!inlineComputedField) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n }\n let computer: Function | undefined;\n if ('computedFields' in options) {\n const computedFields = options.computedFields as Record<string, any>;\n computer = computedFields?.[model]?.[field];\n }\n if (!computer) {\n throw new QueryError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n }\n return computer(eb, { currentModel: modelAlias });\n }\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 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 = getIdFields(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 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 = [model, fieldDef.type].sort();\n\n let orderedFK: [string, string];\n if (model !== fieldDef.type) {\n // not a self-relation, model name's sort order determines fk order\n orderedFK = sortedModelNames[0] === model ? ['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 return {\n parentFkName: orderedFK[0],\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: orderedFK[1],\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 result: any = {};\n for (const [key, value] of Object.entries(filter)) {\n if (compoundUniques.some(({ name }) => name === key)) {\n // flatten the compound field\n Object.assign(result, value);\n } else {\n result[key] = value;\n }\n }\n return result;\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 safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n\nexport function extractIdFields(entity: any, schema: SchemaDef, model: string) {\n const idFields = getIdFields(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 new InternalError(`Discriminator field not defined for 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","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from '.';\n\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return {\n kind: 'literal',\n value,\n };\n },\n\n array: (items: Expression[]): ArrayExpression => {\n return {\n kind: 'array',\n items,\n };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return {\n kind: 'call',\n function: functionName,\n args,\n };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression): BinaryExpression => {\n return {\n kind: 'binary',\n op,\n left,\n right,\n };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return {\n kind: 'unary',\n op,\n operand,\n };\n },\n\n field: (field: string): FieldExpression => {\n return {\n kind: 'field',\n field,\n };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return {\n kind: 'member',\n receiver: receiver,\n members,\n };\n },\n\n _this: (): ThisExpression => {\n return {\n kind: 'this',\n };\n },\n\n _null: (): NullExpression => {\n return {\n kind: 'null',\n };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n};\n","/**\n * Extract fields from an object.\n */\nexport function extractFields(obj: any, fields: 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: string[]): Record<string, boolean> {\n return Object.fromEntries(fields.map((f) => [f, true]));\n}\n","/**\n * Error thrown when input validation fails.\n */\nexport class InputValidationError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when a query fails.\n */\nexport class QueryError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when an internal error occurs.\n */\nexport class InternalError extends Error {}\n\n/**\n * Error thrown when an entity is not found.\n */\nexport class NotFoundError extends Error {\n constructor(model: string) {\n super(`Entity not found for model \"${model}\"`);\n }\n}\n","import { createId } from '@paralleldrive/cuid2';\nimport { invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport {\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 { ClientContract } from '../..';\nimport { PolicyPlugin } from '../../../plugins/policy';\nimport type { BuiltinType, Expression, FieldDef } from '../../../schema';\nimport { ExpressionUtils, type GetModels, type ModelDef, type SchemaDef } from '../../../schema';\nimport { clone } from '../../../utils/clone';\nimport { enumerate } from '../../../utils/enumerate';\nimport { extractFields, fieldsToSelectObject } from '../../../utils/object-utils';\nimport { NUMERIC_FIELD_TYPES } from '../../constants';\nimport { TransactionIsolationLevel, type CRUD } from '../../contract';\nimport type { FindArgs, SelectIncludeOmit, WhereInput } from '../../crud-types';\nimport { InternalError, NotFoundError, QueryError } from '../../errors';\nimport type { ToKysely } from '../../query-builder';\nimport {\n ensureArray,\n extractIdFields,\n flattenCompoundUniqueFilters,\n getDiscriminatorField,\n getField,\n getIdFields,\n getIdValues,\n getManyToManyRelation,\n getModel,\n getRelationForeignKeyFieldPairs,\n isForeignKeyField,\n isRelationField,\n isScalarField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { getCrudDialect } from '../dialects';\nimport type { BaseCrudDialect } from '../dialects/base';\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\nexport type FromRelationContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n field: string;\n ids: any;\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() {\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 instanceof 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 const idFields = getIdFields(this.schema, model);\n const _filter = flattenCompoundUniqueFilters(this.schema, model, filter);\n const query = kysely\n .selectFrom(model)\n .where((eb) => eb.and(_filter))\n .select(idFields.map((f) => kysely.dynamic.ref(f)))\n .limit(1)\n .modifyEnd(this.makeContextComment({ model, operation: 'read' }));\n return this.executeQueryTakeFirst(kysely, query, 'exists');\n }\n\n protected async read(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true> | undefined,\n ): Promise<any[]> {\n // table\n let query = this.dialect.buildSelectModel(expressionBuilder(), 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 queryId = { queryId: `zenstack-${createId()}` };\n const compiled = kysely.getExecutor().compileQuery(query.toOperationNode(), queryId);\n try {\n const r = await kysely.getExecutor().executeQuery(compiled, queryId);\n result = r.rows;\n } catch (err) {\n const message = `Failed to execute query: ${err}, sql: ${compiled.sql}`;\n throw new QueryError(message, err);\n }\n\n return result;\n }\n\n protected async readUnique(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true>,\n ) {\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 new QueryError(`Field \"${field}\" doesn't support filtering`);\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: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation?: FromRelationContext<Schema>,\n creatingForDelegate = false,\n ): Promise<unknown> {\n const modelDef = this.requireModel(model);\n\n // additional validations\n if (modelDef.isDelegate && !creatingForDelegate) {\n throw new QueryError(`Model \"${this.model}\" is a delegate and cannot be created directly.`);\n }\n\n let createFields: any = {};\n let parentUpdateTask: ((entity: any) => Promise<unknown>) | 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 = this.buildFkAssignments(\n fromRelation.model,\n fromRelation.field,\n fromRelation.ids,\n );\n Object.assign(createFields, parentFkFields);\n } else {\n parentUpdateTask = (entity) => {\n const query = kysely\n .updateTable(fromRelation.model)\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: entity[pk],\n }),\n {} as any,\n ),\n )\n .where((eb) => eb.and(fromRelation.ids))\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n return this.executeQuery(kysely, query, 'update');\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.fillGeneratedValues(modelDef, createFields);\n const idFields = getIdFields(this.schema, model);\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(idFields 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 // let createdEntity: any;\n // try {\n // createdEntity = await this.executeQueryTakeFirst(kysely, query, 'create');\n // } catch (err) {\n // const { sql, parameters } = query.compile();\n // throw new QueryError(`Error during create: ${err}, sql: ${sql}, parameters: ${parameters}`);\n // }\n\n if (Object.keys(postCreateRelations).length > 0) {\n // process nested creates that need to happen after the current entity is created\n const relationPromises = Object.entries(postCreateRelations).map(([field, subPayload]) => {\n return this.processNoneOwnedRelationForCreate(kysely, model, field, subPayload, createdEntity);\n });\n\n // await relation creation\n await Promise.all(relationPromises);\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 (parentUpdateTask) {\n await parentUpdateTask(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 buildFkAssignments(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 throw new QueryError(`Field \"${pair.pk}\" not found in parent created data`);\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: ToKysely<Schema>,\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 implement 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 = getIdFields(this.schema, sortedRecords[0]!.model);\n const secondIds = getIdFields(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: ToKysely<Schema>, model: GetModels<Schema>, 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 new NotFoundError(`Could not find the entity for connect action`);\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 new QueryError(`Invalid relation action: ${action}`);\n }\n }\n\n return result;\n }\n\n private processNoneOwnedRelationForCreate(\n kysely: ToKysely<Schema>,\n contextModel: GetModels<Schema>,\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 tasks: Promise<unknown>[] = [];\n const fromRelationContext = {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\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 tasks.push(\n ...enumerate(subPayload).map((item) =>\n this.create(kysely, relationModel, item, fromRelationContext),\n ),\n );\n break;\n }\n\n case 'createMany': {\n invariant(relationFieldDef.array, 'relation must be an array for createMany');\n tasks.push(\n this.createMany(\n kysely,\n relationModel,\n subPayload as { data: any; skipDuplicates: boolean },\n false,\n fromRelationContext,\n ),\n );\n break;\n }\n\n case 'connect': {\n tasks.push(\n this.connectRelation(kysely, relationModel, subPayload, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n }),\n );\n break;\n }\n\n case 'connectOrCreate': {\n tasks.push(\n ...enumerate(subPayload).map((item) =>\n this.exists(kysely, relationModel, item.where).then((found) =>\n !found\n ? this.create(kysely, relationModel, item.create, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n })\n : this.connectRelation(kysely, relationModel, found, {\n model: contextModel,\n field: relationFieldName,\n ids: parentEntity,\n }),\n ),\n ),\n );\n break;\n }\n\n default:\n throw new QueryError(`Invalid relation action: ${action}`);\n }\n }\n\n return Promise.all(tasks);\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<Schema>,\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 new QueryError('incorrect relation hierarchy for createMany');\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.fillGeneratedValues(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 new QueryError('\"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 const idFields = getIdFields(this.schema, model);\n const result = await query.returning(idFields 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 fillGeneratedValues(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 fields[field]?.default === 'object' && 'kind' in fields[field].default) {\n const generated = this.evalGenerator(fields[field].default);\n if (generated !== undefined) {\n values[field] = generated;\n }\n } else if (fields[field]?.updatedAt) {\n // TODO: should this work at kysely level instead?\n values[field] = this.dialect.transformPrimitive(new Date(), 'DateTime', false);\n }\n }\n }\n return values;\n }\n\n private evalGenerator(defaultValue: Expression) {\n if (ExpressionUtils.isCall(defaultValue)) {\n return match(defaultValue.function)\n .with('cuid', () => createId())\n .with('uuid', () =>\n defaultValue.args?.[0] &&\n ExpressionUtils.isLiteral(defaultValue.args?.[0]) &&\n defaultValue.args[0].value === 7\n ? uuid.v7()\n : uuid.v4(),\n )\n .with('nanoid', () =>\n defaultValue.args?.[0] &&\n ExpressionUtils.isLiteral(defaultValue.args[0]) &&\n typeof defaultValue.args[0].value === 'number'\n ? nanoid(defaultValue.args[0].value)\n : nanoid(),\n )\n .with('ulid', () => ulid())\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 protected async update(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n data: any,\n fromRelation?: FromRelationContext<Schema>,\n allowRelationUpdate = true,\n throwIfNotFound = true,\n ): Promise<unknown> {\n if (!data || typeof data !== 'object') {\n throw new InternalError('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 // fill in automatically updated fields\n const modelDef = this.requireModel(model);\n let finalData = data;\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 }\n }\n\n if (Object.keys(finalData).length === 0) {\n // nothing to update, return the original filter so that caller can identify the entity\n return combinedWhere;\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 new NotFoundError(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\n const updateFields: any = {};\n let thisEntity: any = undefined;\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 new QueryError(`Relation update not allowed for field \"${field}\"`);\n }\n if (!thisEntity) {\n thisEntity = await this.readUnique(kysely, model, {\n where: combinedWhere,\n select: this.makeIdSelect(model),\n });\n if (!thisEntity) {\n if (throwIfNotFound) {\n throw new NotFoundError(model);\n } else {\n return null;\n }\n }\n }\n await this.processRelationUpdates(\n kysely,\n model,\n field,\n fieldDef,\n thisEntity,\n finalData[field],\n throwIfNotFound,\n );\n }\n }\n\n if (Object.keys(updateFields).length === 0) {\n // nothing to update, return the filter so that the caller can identify the entity\n return combinedWhere;\n } else {\n const idFields = getIdFields(this.schema, model);\n const query = kysely\n .updateTable(model)\n .where((eb) => this.dialect.buildFilter(eb, model, model, combinedWhere))\n .set(updateFields)\n .returning(idFields 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\n // try {\n // updatedEntity = await this.executeQueryTakeFirst(kysely, query, 'update');\n // } catch (err) {\n // const { sql, parameters } = query.compile();\n // throw new QueryError(\n // `Error during update: ${err}, sql: ${sql}, parameters: ${parameters}`\n // );\n // }\n\n if (!updatedEntity) {\n if (throwIfNotFound) {\n throw new NotFoundError(model);\n } else {\n return null;\n }\n }\n\n return updatedEntity;\n }\n }\n\n private processScalarFieldUpdateData(model: GetModels<Schema>, 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: GetModels<Schema>, filter: any) {\n if (!filter || typeof filter !== 'object') {\n return false;\n }\n const idFields = getIdFields(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: GetModels<Schema>,\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, eb);\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 new InternalError(`Invalid incremental update operation: ${key}`);\n });\n }\n\n private transformScalarListUpdate(\n model: GetModels<Schema>,\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, eb);\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 new InternalError(`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: GetModels<Schema>; 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: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n data: any,\n limit: number | undefined,\n returnData: ReturnData,\n filterModel?: GetModels<Schema>,\n ): Promise<Result> {\n if (typeof data !== 'object') {\n throw new InternalError('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 new QueryError('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((eb) => this.dialect.buildFilter(eb, 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(eb, filterModel, filterModel)\n .where(this.dialect.buildFilter(eb, 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 const idFields = getIdFields(this.schema, model);\n const result = await query.returning(idFields as any).execute();\n return result as Result;\n }\n }\n\n private async processBaseModelUpdateMany(\n kysely: ToKysely<Schema>,\n model: string,\n where: any,\n updateFields: any,\n filterModel: GetModels<Schema>,\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: ToKysely<Schema>, model: GetModels<Schema>) {\n const idFields = getIdFields(this.schema, model);\n return idFields.map((f) => kysely.dynamic.ref(`${model}.${f}`));\n }\n\n private async processRelationUpdates(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n field: string,\n fieldDef: FieldDef,\n parentIds: any,\n args: any,\n throwIfNotFound: boolean,\n ) {\n const tasks: Promise<unknown>[] = [];\n const fieldModel = fieldDef.type as GetModels<Schema>;\n const fromRelationContext = {\n model,\n field,\n ids: parentIds,\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 tasks.push(\n ...enumerate(value).map((item) => 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 tasks.push(\n this.createMany(\n kysely,\n fieldModel,\n value as { data: any; skipDuplicates: boolean },\n false,\n fromRelationContext,\n ),\n );\n break;\n }\n\n case 'connect': {\n tasks.push(this.connectRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'connectOrCreate': {\n tasks.push(this.connectOrCreateRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'disconnect': {\n tasks.push(this.disconnectRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'set': {\n invariant(fieldDef.array, 'relation must be an array');\n tasks.push(this.setRelation(kysely, fieldModel, value, fromRelationContext));\n break;\n }\n\n case 'update': {\n tasks.push(\n ...(enumerate(value) as { where: any; data: any }[]).map((item) => {\n let where;\n let data;\n if ('where' in item) {\n where = item.where;\n data = item.data;\n } else {\n where = undefined;\n data = item;\n }\n return this.update(\n kysely,\n fieldModel,\n where,\n data,\n fromRelationContext,\n true,\n throwIfNotFound,\n );\n }),\n );\n break;\n }\n\n case 'upsert': {\n tasks.push(\n ...(\n enumerate(value) as {\n where: any;\n create: any;\n update: any;\n }[]\n ).map(async (item) => {\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 return updated;\n } else {\n return this.create(kysely, fieldModel, item.create, fromRelationContext);\n }\n }),\n );\n break;\n }\n\n case 'updateMany': {\n tasks.push(\n ...(enumerate(value) as { where: any; data: any }[]).map((item) =>\n this.update(kysely, fieldModel, item.where, item.data, fromRelationContext, false, false),\n ),\n );\n break;\n }\n\n case 'delete': {\n tasks.push(this.deleteRelation(kysely, fieldModel, value, fromRelationContext, true));\n break;\n }\n\n case 'deleteMany': {\n tasks.push(this.deleteRelation(kysely, fieldModel, value, fromRelationContext, false));\n break;\n }\n\n default: {\n throw new Error('Not implemented yet');\n }\n }\n }\n\n await Promise.all(tasks);\n }\n\n // #region relation manipulation\n\n protected async connectRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 actions = _data.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n return 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 const results = await Promise.all(actions);\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw new NotFoundError(model);\n }\n } else {\n const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(\n this.schema,\n fromRelation.model,\n fromRelation.field,\n );\n let updateResult: QueryResult<unknown>;\n\n if (ownedByModel) {\n // set parent fk directly\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 new NotFoundError(model);\n }\n const query = kysely\n .updateTable(fromRelation.model)\n .where((eb) => eb.and(fromRelation.ids))\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: target[pk],\n }),\n {} as any,\n ),\n )\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n updateResult = await this.executeQuery(kysely, query, 'connect');\n } else {\n // disconnect current if it's a one-one relation\n const relationFieldDef = this.requireField(fromRelation.model, fromRelation.field);\n\n if (!relationFieldDef.array) {\n const query = kysely\n .updateTable(model)\n .where((eb) => eb.and(keyPairs.map(({ fk, pk }) => eb(sql.ref(fk), '=', fromRelation.ids[pk]))))\n .set(keyPairs.reduce((acc, { fk }) => ({ ...acc, [fk]: null }), {} as any))\n .modifyEnd(\n this.makeContextComment({\n model: fromRelation.model,\n operation: 'update',\n }),\n );\n await this.executeQuery(kysely, query, 'disconnect');\n }\n\n // connect\n const query = kysely\n .updateTable(model)\n .where((eb) => eb.or(_data.map((d) => eb.and(d))))\n .set(\n keyPairs.reduce(\n (acc, { fk, pk }) => ({\n ...acc,\n [fk]: fromRelation.ids[pk],\n }),\n {} as any,\n ),\n )\n .modifyEnd(\n this.makeContextComment({\n model,\n operation: 'update',\n }),\n );\n updateResult = await this.executeQuery(kysely, query, 'connect');\n }\n\n // validate connect result\n if (_data.length > updateResult.numAffectedRows!) {\n // some entities were not connected\n throw new NotFoundError(model);\n }\n }\n }\n\n protected async connectOrCreateRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\n const _data = enumerate(data);\n if (_data.length === 0) {\n return;\n }\n\n return Promise.all(\n _data.map(async ({ where, create }) => {\n const existing = await this.exists(kysely, model, where);\n if (existing) {\n return this.connectRelation(kysely, model, [where], fromRelation);\n } else {\n return this.create(kysely, model, create, fromRelation);\n }\n }),\n );\n }\n\n protected async disconnectRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 const actions = disconnectConditions.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n if (!ids) {\n // not found\n return;\n }\n return 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 await Promise.all(actions);\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 // set parent fk directly\n invariant(disconnectConditions.length === 1, 'only one entity can be disconnected');\n const condition = disconnectConditions[0];\n const query = kysely\n .updateTable(fromRelation.model)\n // id filter\n .where(eb.and(fromRelation.ids))\n // merge extra disconnect conditions\n .$if(condition !== true, (qb) =>\n qb.where(\n eb(\n // @ts-ignore\n eb.refTuple(...keyPairs.map(({ fk }) => fk)),\n 'in',\n eb\n .selectFrom(model)\n .select(keyPairs.map(({ pk }) => pk))\n .where(this.dialect.buildFilter(eb, model, model, condition)),\n ),\n ),\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 } 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(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\n ) {\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 actions = _data.map(async (d) => {\n const ids = await this.getEntityIds(kysely, model, d);\n return 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 const results = await Promise.all(actions);\n\n // validate connect result\n if (_data.length > results.filter((r) => !!r).length) {\n throw new NotFoundError(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 new InternalError('relation can only be set from the non-owning side');\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 (_data.length > r.numAffectedRows!) {\n // some entities were not connected\n throw new NotFoundError(model);\n }\n }\n }\n }\n\n protected async deleteRelation(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n data: any,\n fromRelation: FromRelationContext<Schema>,\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: { count: number };\n const m2m = getManyToManyRelation(this.schema, fromRelation.model, fromRelation.field);\n\n if (m2m) {\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 const fromEntity = await this.readUnique(kysely, fromRelation.model as GetModels<Schema>, {\n where: fromRelation.ids,\n });\n if (!fromEntity) {\n throw new NotFoundError(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 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.count) {\n // some entities were not deleted\n throw new NotFoundError(model);\n }\n }\n\n private normalizeRelationManipulationInput(model: GetModels<Schema>, data: any) {\n return enumerate(data).map((item) => flattenCompoundUniqueFilters(this.schema, model, item));\n }\n\n // #endregion\n\n protected async delete(\n kysely: ToKysely<Schema>,\n model: GetModels<Schema>,\n where: any,\n limit?: number,\n filterModel?: GetModels<Schema>,\n ): Promise<{ count: number }> {\n filterModel ??= model;\n\n const modelDef = this.requireModel(model);\n\n if (modelDef.baseModel) {\n if (limit !== undefined) {\n throw new QueryError('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 let query = kysely.deleteFrom(model);\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((eb) => this.dialect.buildFilter(eb, 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(eb, filterModel, filterModel)\n .where((eb) => this.dialect.buildFilter(eb, 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 const result = await this.executeQuery(kysely, query, 'delete');\n return { count: Number(result.numAffectedRows) };\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 new QueryError('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: ToKysely<Schema>,\n model: string,\n where: any,\n limit: number | undefined,\n filterModel: GetModels<Schema>,\n ) {\n return this.delete(kysely, model as GetModels<Schema>, 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>(\n callback: (tx: ToKysely<Schema>) => Promise<T>,\n isolationLevel?: IsolationLevel,\n ) {\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.RepeatableRead);\n return txBuilder.execute(callback);\n }\n }\n\n // Given a unique filter of a model, return the entity ids by trying to\n // reused the filter if it's a complete id filter (without extra fields)\n // otherwise, read the entity by the filter\n private getEntityIds(kysely: ToKysely<Schema>, model: GetModels<Schema>, uniqueFilter: any) {\n const idFields: string[] = getIdFields(this.schema, model);\n if (\n // all id fields are provided\n idFields.every((f) => f in uniqueFilter && uniqueFilter[f] !== undefined) &&\n // no non-id filter exists\n Object.keys(uniqueFilter).every((k) => idFields.includes(k))\n ) {\n return uniqueFilter;\n }\n\n return this.readUnique(kysely, model, {\n where: uniqueFilter,\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 makeQueryId(operation: string) {\n return { queryId: `${operation}-${createId()}` };\n }\n\n protected executeQuery(kysely: ToKysely<Schema>, query: Compilable, operation: string) {\n return kysely.executeQuery(query.compile(), this.makeQueryId(operation));\n }\n\n protected async executeQueryTakeFirst(kysely: ToKysely<Schema>, query: Compilable, operation: string) {\n const result = await kysely.executeQuery(query.compile(), this.makeQueryId(operation));\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(), this.makeQueryId(operation));\n if (result.rows.length === 0) {\n throw new QueryError('No rows found');\n }\n return result.rows[0];\n }\n}\n","/**\n * Error thrown when an operation is rejected by access policy.\n */\nexport class RejectedByPolicyError extends Error {\n constructor(\n public readonly model: string | undefined,\n public readonly reason?: string,\n ) {\n super(reason ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n OperationNodeTransformer,\n OperatorNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n ValueNode,\n ValuesNode,\n WhereNode,\n type OperationNode,\n type QueryResult,\n type RootOperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ClientContract } from '../../client';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getIdFields, requireField, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError } from './errors';\nimport { ExpressionTransformer } from './expression-transformer';\nimport type { Policy, PolicyOperation } from './types';\nimport { buildIsFalse, conjunction, disjunction, falseNode, getTableName } from './utils';\n\nexport type CrudQueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport type MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport class PolicyHandler<Schema extends SchemaDef> extends OperationNodeTransformer {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(private readonly client: ClientContract<Schema>) {\n super();\n this.dialect = getCrudDialect(this.client.$schema, this.client.$options);\n }\n\n get kysely() {\n return this.client.$qb;\n }\n\n async handle(\n node: RootOperationNode,\n proceed: ProceedKyselyQueryFunction /*, transaction: OnKyselyQueryTransaction*/,\n ) {\n if (!this.isCrudQueryNode(node)) {\n // non-CRUD queries are not allowed\n throw new RejectedByPolicyError(undefined, 'non-CRUD queries are not allowed');\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed read without transaction\n return proceed(this.transformNode(node));\n }\n\n let mutationRequiresTransaction = false;\n const mutationModel = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // reject create if unconditional deny\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n } else if (constCondition === undefined) {\n mutationRequiresTransaction = true;\n }\n }\n\n if (!mutationRequiresTransaction && !node.returning) {\n // transform and proceed mutation without transaction\n return proceed(this.transformNode(node));\n }\n\n if (InsertQueryNode.is(node)) {\n await this.enforcePreCreatePolicy(node, proceed);\n }\n const transformedNode = this.transformNode(node);\n const result = await proceed(transformedNode);\n\n if (!this.onlyReturningId(node)) {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n }\n return readBackResult;\n } else {\n return result;\n }\n\n // TODO: run in transaction\n //let readBackError = false;\n\n // transform and post-process in a transaction\n // const result = await transaction(async (txProceed) => {\n // if (InsertQueryNode.is(node)) {\n // await this.enforcePreCreatePolicy(node, txProceed);\n // }\n // const transformedNode = this.transformNode(node);\n // const result = await txProceed(transformedNode);\n\n // if (!this.onlyReturningId(node)) {\n // const readBackResult = await this.processReadBack(node, result, txProceed);\n // if (readBackResult.rows.length !== result.rows.length) {\n // readBackError = true;\n // }\n // return readBackResult;\n // } else {\n // return result;\n // }\n // });\n\n // if (readBackError) {\n // throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n // }\n\n // return result;\n }\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n const collector = new ColumnCollector();\n const selectedColumns = collector.collect(node.returning);\n return selectedColumns.every((c) => idFields.includes(c));\n }\n\n private async enforcePreCreatePolicy(node: InsertQueryNode, proceed: ProceedKyselyQueryFunction) {\n if (!node.columns || !node.values) {\n return;\n }\n\n const model = this.getMutationModel(node);\n const fields = node.columns.map((c) => c.column.name);\n const valueRows = this.unwrapCreateValueRows(node.values, model, fields);\n for (const values of valueRows) {\n await this.enforcePreCreatePolicyForOne(\n model,\n fields,\n values.map((v) => v.node),\n values.map((v) => v.raw),\n proceed,\n );\n }\n }\n\n private async enforcePreCreatePolicyForOne(\n model: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n valuesRaw: unknown[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const thisEntity: Record<string, OperationNode> = {};\n const thisEntityRaw: Record<string, unknown> = {};\n for (let i = 0; i < fields.length; i++) {\n thisEntity[fields[i]!] = values[i]!;\n thisEntityRaw[fields[i]!] = valuesRaw[i]!;\n }\n\n const filter = this.buildPolicyFilter(model, undefined, 'create', thisEntity, thisEntityRaw);\n const preCreateCheck: SelectQueryNode = {\n kind: 'SelectQueryNode',\n selections: [SelectionNode.create(AliasNode.create(filter, IdentifierNode.create('$condition')))],\n };\n const result = await proceed(preCreateCheck);\n if (!(result.rows[0] as any)?.$condition) {\n throw new RejectedByPolicyError(model);\n }\n }\n\n private unwrapCreateValueRows(node: OperationNode, model: GetModels<Schema>, fields: string[]) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(data: readonly unknown[], model: GetModels<Schema>, fields: string[]) {\n invariant(data.length === fields.length, 'data length must match fields length');\n const result: { node: OperationNode; raw: unknown }[] = [];\n for (let i = 0; i < data.length; i++) {\n const item = data[i]!;\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n if (typeof item === 'object' && item && 'kind' in item) {\n invariant(item.kind === 'ValueNode', 'expecting a ValueNode');\n result.push({\n node: ValueNode.create(\n this.dialect.transformPrimitive(\n (item as ValueNode).value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n ),\n ),\n raw: (item as ValueNode).value,\n });\n } else {\n const value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n if (Array.isArray(value)) {\n result.push({\n node: RawNode.createWithSql(this.dialect.buildArrayLiteralSQL(value)),\n raw: value,\n });\n } else {\n result.push({ node: ValueNode.create(value), raw: value });\n }\n }\n }\n return result;\n }\n\n private tryGetConstantPolicy(model: GetModels<Schema>, operation: PolicyOperation) {\n const policies = this.getModelPolicies(model, operation);\n if (!policies.some((p) => p.kind === 'allow')) {\n // no allow -> unconditional deny\n return false;\n } else if (\n // unconditional deny\n policies.some((p) => p.kind === 'deny' && this.isTrueExpr(p.condition))\n ) {\n return false;\n } else if (\n // unconditional allow\n !policies.some((p) => p.kind === 'deny') &&\n policies.some((p) => p.kind === 'allow' && this.isTrueExpr(p.condition))\n ) {\n return true;\n } else {\n return undefined;\n }\n }\n\n private isTrueExpr(expr: Expression) {\n return ExpressionUtils.isLiteral(expr) && expr.value === true;\n }\n\n private async processReadBack(node: CrudQueryNode, result: QueryResult<any>, proceed: ProceedKyselyQueryFunction) {\n if (result.rows.length === 0) {\n return result;\n }\n\n if (!this.isMutationQueryNode(node) || !node.returning) {\n return result;\n }\n\n // do a select (with policy) in place of returning\n const table = this.getMutationModel(node);\n if (!table) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n\n const idConditions = this.buildIdConditions(table, result.rows);\n const policyFilter = this.buildPolicyFilter(table, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(table)]),\n where: WhereNode.create(conjunction(this.dialect, [idConditions, policyFilter])),\n selections: node.returning.selections,\n };\n const selectResult = await proceed(select);\n return selectResult;\n }\n\n private buildIdConditions(table: string, rows: any[]): OperationNode {\n const idFields = getIdFields(this.client.$schema, table);\n return disjunction(\n this.dialect,\n rows.map((row) =>\n conjunction(\n this.dialect,\n idFields.map((field) =>\n BinaryOperationNode.create(\n ColumnNode.create(field),\n OperatorNode.create('='),\n ValueNode.create(row[field]),\n ),\n ),\n ),\n ),\n );\n }\n\n private getMutationModel(node: InsertQueryNode | UpdateQueryNode | DeleteQueryNode) {\n const r = match(node)\n .when(InsertQueryNode.is, (node) => getTableName(node.into) as GetModels<Schema>)\n .when(UpdateQueryNode.is, (node) => getTableName(node.table) as GetModels<Schema>)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError('Only one from table is supported for delete');\n }\n return getTableName(node.from.froms[0]) as GetModels<Schema>;\n })\n .exhaustive();\n if (!r) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n return r;\n }\n\n private isCrudQueryNode(node: RootOperationNode): node is CrudQueryNode {\n return (\n SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node)\n );\n }\n\n private isMutationQueryNode(node: RootOperationNode): node is MutationQueryNode {\n return InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node);\n }\n\n private buildPolicyFilter(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n const policies = this.getModelPolicies(model, operation);\n if (policies.length === 0) {\n return falseNode(this.dialect);\n }\n\n const allows = policies\n .filter((policy) => policy.kind === 'allow')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n let combinedPolicy: OperationNode;\n\n if (allows.length === 0) {\n // constant false\n combinedPolicy = falseNode(this.dialect);\n } else {\n // or(...allows)\n combinedPolicy = disjunction(this.dialect, allows);\n\n // and(...!denies)\n if (denies.length !== 0) {\n const combinedDenies = conjunction(\n this.dialect,\n denies.map((d) => buildIsFalse(d, this.dialect)),\n );\n // or(...allows) && and(...!denies)\n combinedPolicy = conjunction(this.dialect, [combinedPolicy, combinedDenies]);\n }\n }\n return combinedPolicy;\n }\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = node.where;\n\n node.from?.froms.forEach((from) => {\n const extractResult = this.extractTableName(from);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, filter]) : filter,\n );\n }\n });\n\n const baseResult = super.transformSelectQuery({\n ...node,\n where: undefined,\n });\n\n return {\n ...baseResult,\n where: whereNode,\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n const result = super.transformInsertQuery(node);\n if (!node.returning) {\n return result;\n }\n if (this.onlyReturningId(node)) {\n return result;\n } else {\n // only return ID fields, that's enough for reading back the inserted row\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n return {\n ...result,\n returning: ReturningNode.create(\n idFields.map((field) => SelectionNode.create(ColumnNode.create(field))),\n ),\n };\n }\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const result = super.transformUpdateQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'update');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n protected override transformDeleteQuery(node: DeleteQueryNode) {\n const result = super.transformDeleteQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'delete');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n private extractTableName(from: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(from)) {\n return { model: from.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(from)) {\n const inner = this.extractTableName(from.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(from.alias) ? from.alias.name : undefined,\n };\n } else {\n // this can happen for subqueries, which will be handled when nested\n // transformation happens\n return undefined;\n }\n }\n\n private transformPolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n return new ExpressionTransformer(this.client.$schema, this.client.$options, this.client.$auth).transform(\n policy.condition,\n {\n model,\n alias,\n operation,\n thisEntity,\n thisEntityRaw,\n auth: this.client.$auth,\n },\n );\n }\n\n private getModelPolicies(modelName: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, modelName);\n const result: Policy[] = [];\n\n const extractOperations = (expr: Expression) => {\n invariant(ExpressionUtils.isLiteral(expr), 'expecting a literal');\n invariant(typeof expr.value === 'string', 'expecting a string literal');\n return expr.value\n .split(',')\n .filter((v) => !!v)\n .map((v) => v.trim()) as PolicyOperation[];\n };\n\n if (modelDef.attributes) {\n result.push(\n ...modelDef.attributes\n .filter((attr) => attr.name === '@@allow' || attr.name === '@@deny')\n .map(\n (attr) =>\n ({\n kind: attr.name === '@@allow' ? 'allow' : 'deny',\n operations: extractOperations(attr.args![0]!.value),\n condition: attr.args![1]!.value,\n }) as const,\n )\n .filter((policy) => policy.operations.includes('all') || policy.operations.includes(operation)),\n );\n }\n return result;\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base';\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 {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\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 if (Array.isArray(value)) {\n if (type === 'Json' && !forArrayField) {\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 return JSON.stringify(value);\n } else {\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date ? value : typeof value === 'string' ? new Date(value) : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\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 joinedQuery = this.buildRelationJSON(model, query, relationField, parentAlias, payload);\n\n return joinedQuery.select(`${parentAlias}$${relationField}.$j as ${relationField}`);\n }\n\n private buildRelationJSON(\n model: string,\n qb: SelectQueryBuilder<any, any, any>,\n relationField: string,\n parentName: 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\n return qb.leftJoinLateral(\n (eb) => {\n const joinTableName = `${parentName}$${relationField}`;\n\n // simple select by default\n let result = eb.selectFrom(`${relationModel} as ${joinTableName}`);\n\n // however if there're filter/orderBy/take/skip,\n // we need to build a subquery to handle them before aggregation\n\n // give sub query an alias to avoid conflict with parent scope\n // (e.g., for cases like self-relation)\n const subQueryAlias = `${relationModel}$${relationField}$sub`;\n\n result = eb.selectFrom(() => {\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n subQuery = this.buildSelectAllFields(\n relationModel,\n subQuery,\n typeof payload === 'object' ? payload?.omit : undefined,\n subQueryAlias,\n );\n\n if (payload && typeof payload === 'object') {\n subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);\n }\n\n // add join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(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 subQuery = subQuery.where(\n eb(\n eb.ref(`${subQueryAlias}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n `${parentName}.${parentIds[0]}`,\n '=',\n `${m2m.joinTable}.${m2m.parentFkName}`,\n ),\n ),\n );\n } else {\n const joinPairs = buildJoinPairs(this.schema, model, parentName, relationField, subQueryAlias);\n subQuery = subQuery.where((eb) =>\n this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))),\n );\n }\n\n return subQuery.as(joinTableName);\n });\n\n result = this.buildRelationObjectSelect(\n relationModel,\n joinTableName,\n relationField,\n relationFieldDef,\n result,\n payload,\n parentName,\n );\n\n // add nested joins for each relation\n result = this.buildRelationJoins(relationModel, relationField, result, payload, parentName);\n\n // alias the join table\n return result.as(joinTableName);\n },\n (join) => join.onTrue(),\n );\n }\n\n private buildRelationObjectSelect(\n relationModel: string,\n relationModelAlias: string,\n relationField: string,\n relationFieldDef: FieldDef,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n qb = qb.select((eb) => {\n const objArgs = this.buildRelationObjectArgs(\n relationModel,\n relationModelAlias,\n relationField,\n eb,\n payload,\n parentName,\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('$j');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$j');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationModelAlias: string,\n relationField: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentAlias: 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 // TODO: descendant JSON shouldn't be joined and selected if none of its fields are selected\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\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [\n sql.lit(field),\n this.fieldRef(relationModel, field, eb, relationModelAlias, false),\n ])\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 `${parentAlias}$${relationField}`,\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(`${parentAlias}$${relationField}$${field}.$j`)\n : // reference a plain field\n this.fieldRef(relationModel, field, eb, undefined, 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(`${parentAlias}$${relationField}$${field}.$j`),\n ])\n .flatMap((v) => v),\n );\n }\n return objArgs;\n }\n\n private buildRelationJoins(\n relationModel: string,\n relationField: string,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n let result = qb;\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 `${parentName}$${relationField}`,\n value,\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(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return 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(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return 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 override get supportInsertWithDefault() {\n return true;\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', '$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 { 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 type { BuiltinType, DataSourceProviderType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { enumerate } from '../../../utils/enumerate';\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 { InternalError, QueryError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n aggregate,\n buildFieldRef,\n buildJoinPairs,\n ensureArray,\n flattenCompoundUniqueFilters,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n makeDefaultOrderBy,\n requireField,\n requireModel,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\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 // #region common query builders\n\n buildSelectModel(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string) {\n const modelDef = requireModel(this.schema, model);\n let result = 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: GetModels<Schema>,\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((eb) => this.buildFilter(eb, 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(\n result,\n model,\n modelAlias,\n args.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\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) => sql.ref(`${modelAlias}.${f}`)));\n } else {\n throw new QueryError(`\"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(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n where: boolean | object | undefined,\n ) {\n if (where === true || where === undefined) {\n return this.true(eb);\n }\n\n if (where === false) {\n return this.false(eb);\n }\n\n let result = this.true(eb);\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(eb, result, this.buildCompositeFilter(eb, 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(eb, result, this.buildRelationFilter(eb, 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(\n fieldDef.originModel ?? model,\n key,\n eb,\n fieldDef.originModel ?? modelAlias,\n );\n if (fieldDef.array) {\n result = this.and(eb, result, this.buildArrayFilter(eb, fieldRef, fieldDef, payload));\n } else {\n result = this.and(eb, result, this.buildPrimitiveFilter(eb, 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(eb, result, _where['$expr'](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 eb = expressionBuilder<any, any>();\n const subQueryAlias = `${model}$cursor$sub`;\n const cursorFilter = this.buildFilter(eb, 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 eb(\n eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(eb, model, subQueryAlias)\n .select(`${subQueryAlias}.${field}`)\n .where(cursorFilter),\n ),\n );\n }\n\n filters.push(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 eb: ExpressionBuilder<any, any>,\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(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('OR', () =>\n this.or(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('NOT', () => eb.not(this.buildCompositeFilter(eb, model, modelAlias, 'AND', payload)))\n .exhaustive();\n }\n\n private buildRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (!fieldDef.array) {\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n } else {\n return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n }\n }\n\n private buildToOneRelationFilter(\n eb: ExpressionBuilder<any, any>,\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(eb, ...keyPairs.map(({ fk }) => eb(sql.ref(`${modelAlias}.${fk}`), 'is', null)));\n } else {\n // translate it to `{ is: null }` filter\n return this.buildToOneRelationFilter(eb, 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 = eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))))\n .select(() => eb.fn.count(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(eb(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, 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(eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n eb,\n // is null\n eb(joinSelect, '=', 0),\n // found one that matches the filter\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\n }\n\n return this.and(eb, ...conditions);\n }\n\n private buildToManyRelationFilter(\n eb: ExpressionBuilder<any, any>,\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 eb(sql.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 const modelIdField = getIdFields(this.schema, model)[0]!;\n const relationIdField = getIdFields(this.schema, relationModel)[0]!;\n return eb(\n sql.ref(`${relationFilterSelectAlias}.${relationIdField}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n '=',\n sql.ref(`${modelAlias}.${modelIdField}`),\n ),\n );\n } else {\n const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n let result = this.true(eb);\n for (const { fk, pk } of relationKeyPairs.keyPairs) {\n if (relationKeyPairs.ownedByModel) {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${fk}`), '=', sql.ref(`${relationFilterSelectAlias}.${pk}`)),\n );\n } else {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${pk}`), '=', sql.ref(`${relationFilterSelectAlias}.${fk}`)),\n );\n }\n }\n return result;\n }\n };\n\n let result = this.true(eb);\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 eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n eb1.not(\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n }\n }\n\n return result;\n }\n\n private buildArrayFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\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(eb, fieldRef, fieldType, eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(eb(fieldRef, '@>', eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(eb(fieldRef, '@>', eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(eb(fieldRef, '&&', eb.val(value)));\n break;\n }\n\n case 'isEmpty': {\n clauses.push(eb(fieldRef, value === true ? '=' : '!=', eb.val([])));\n break;\n }\n\n default: {\n throw new InternalError(`Invalid array filter key: ${key}`);\n }\n }\n }\n\n return this.and(eb, ...clauses);\n }\n\n buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n if (payload === null) {\n return eb(fieldRef, 'is', null);\n }\n\n if (isEnum(this.schema, fieldDef.type)) {\n return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);\n }\n\n return (\n match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(eb, fieldRef, payload))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.buildNumberFilter(eb, fieldRef, type, payload),\n )\n .with('Boolean', () => this.buildBooleanFilter(eb, fieldRef, payload))\n .with('DateTime', () => this.buildDateTimeFilter(eb, fieldRef, payload))\n .with('Bytes', () => this.buildBytesFilter(eb, fieldRef, payload))\n // TODO: JSON filters\n .with('Json', () => {\n throw new InternalError('JSON filters are not supported yet');\n })\n .with('Unsupported', () => {\n throw new QueryError(`Unsupported field cannot be used in filters`);\n })\n .exhaustive()\n );\n }\n\n private buildLiteralFilter(eb: ExpressionBuilder<any, any>, lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\n }\n\n private buildStandardFilter(\n eb: ExpressionBuilder<any, any>,\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(eb, 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 ? eb(lhs, 'is', null) : 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(eb);\n } else {\n return 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(eb);\n } else {\n return eb.not(eb(lhs, 'in', rhs));\n }\n })\n .with('lt', () => eb(lhs, '<', rhs))\n .with('lte', () => eb(lhs, '<=', rhs))\n .with('gt', () => eb(lhs, '>', rhs))\n .with('gte', () => eb(lhs, '>=', rhs))\n .with('not', () => eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (op) => {\n const innerResult = this.buildStandardFilter(\n eb,\n type,\n value,\n aggregate(eb, lhs, op),\n getRhs,\n recurse,\n throwIfInvalid,\n );\n consumedKeys.push(...innerResult.consumedKeys);\n return this.and(eb, ...innerResult.conditions);\n })\n .otherwise(() => {\n if (throwIfInvalid) {\n throw new QueryError(`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(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: StringFilter<Schema, true, boolean>,\n ) {\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 eb,\n 'String',\n payload,\n mode === 'insensitive' ? eb.fn('lower', [fieldRef]) : fieldRef,\n (value) => this.prepStringCasing(eb, value, mode),\n (value) => this.buildStringFilter(eb, fieldRef, value as StringFilter<Schema, 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 const condition = match(key)\n .with('contains', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}%`))\n : eb(fieldRef, 'like', sql.val(`%${value}%`)),\n )\n .with('startsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`${value}%`))\n : eb(fieldRef, 'like', sql.val(`${value}%`)),\n )\n .with('endsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}`))\n : eb(fieldRef, 'like', sql.val(`%${value}`)),\n )\n .otherwise(() => {\n throw new QueryError(`Invalid string filter key: ${key}`);\n });\n\n if (condition) {\n conditions.push(condition);\n }\n }\n }\n\n return this.and(eb, ...conditions);\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(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n type: BuiltinType,\n payload: any,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n type,\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, type, false),\n (value) => this.buildNumberFilter(eb, fieldRef, type, value),\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBooleanFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BooleanFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'Boolean',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Boolean', false),\n (value) => this.buildBooleanFilter(eb, fieldRef, value as BooleanFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'not'],\n );\n return this.and(eb, ...conditions);\n }\n\n private buildDateTimeFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: DateTimeFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'DateTime',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'DateTime', false),\n (value) => this.buildDateTimeFilter(eb, fieldRef, value as DateTimeFilter<Schema, boolean, boolean>),\n true,\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBytesFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BytesFilter<Schema, boolean, boolean>,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'Bytes',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Bytes', false),\n (value) => this.buildBytesFilter(eb, fieldRef, value as BytesFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n private buildEnumFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n fieldRef,\n (value) => value,\n (value) => this.buildEnumFilter(eb, fieldRef, fieldDef, value),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...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 useDefaultIfEmpty: boolean,\n negated: boolean,\n ) {\n if (!orderBy) {\n if (useDefaultIfEmpty) {\n orderBy = makeDefaultOrderBy(this.schema, model);\n } else {\n return query;\n }\n }\n\n let result = query;\n enumerate(orderBy).forEach((orderBy) => {\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) =>\n aggregate(eb, this.fieldRef(model, k, eb, modelAlias), field as AGGREGATE_OPERATORS),\n sql.raw(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(this.fieldRef(model, k, eb, modelAlias)),\n sql.raw(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 = this.fieldRef(model, field, expressionBuilder(), 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(\n fieldRef,\n sql.raw(`${this.negateSort(value.sort, negated)} nulls ${value.nulls}`),\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 new QueryError(`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(eb, relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\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 result = result.leftJoin(relationModel, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n return join.on((eb) =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, fieldDef.type, relationModel, value, false, 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,\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 (omit?.[field] === true) {\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(eb, jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);\n });\n }\n\n return result;\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 if (fieldDef.computed) {\n // TODO: computed field from delegate base?\n return query.select((eb) => this.fieldRef(model, field, eb, modelAlias).as(field));\n } else if (!fieldDef.originModel) {\n // regular field\n return query.select(sql.ref(`${modelAlias}.${field}`).as(field));\n } else {\n return this.buildSelectField(query, fieldDef.originModel, fieldDef.originModel, field);\n }\n }\n\n buildDelegateJoin(\n thisModel: string,\n thisModelAlias: string,\n otherModelAlias: string,\n query: SelectQueryBuilder<any, any, any>,\n ) {\n const idFields = getIdFields(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;\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, fieldModel);\n\n // build a nested query to count the number of records in the relation\n let fieldCountQuery = eb.selectFrom(fieldModel).select(eb.fn.countAll().as(`_count$${field}`));\n\n // join conditions\n for (const [left, right] of joinPairs) {\n fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n }\n\n // merge _count filter\n if (\n value &&\n typeof value === 'object' &&\n 'where' in value &&\n value.where &&\n typeof value.where === 'object'\n ) {\n const filter = this.buildFilter(eb, fieldModel, fieldModel, value.where);\n fieldCountQuery = fieldCountQuery.where(filter);\n }\n\n jsonObject[field] = fieldCountQuery;\n }\n\n return this.buildJsonObject(eb, 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(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return 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 protected and(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonTrueArgs = args.filter((arg) => !this.isTrue(arg));\n if (nonTrueArgs.length === 0) {\n return this.true(eb);\n } else if (nonTrueArgs.length === 1) {\n return nonTrueArgs[0]!;\n } else {\n return eb.and(nonTrueArgs);\n }\n }\n\n protected or(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonFalseArgs = args.filter((arg) => !this.isFalse(arg));\n if (nonFalseArgs.length === 0) {\n return this.false(eb);\n } else if (nonFalseArgs.length === 1) {\n return nonFalseArgs[0]!;\n } else {\n return eb.or(nonFalseArgs);\n }\n }\n\n protected not(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n return eb.not(this.and(eb, ...args));\n }\n\n fieldRef(\n model: string,\n field: string,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n ) {\n return buildFieldRef(this.schema, model, field, this.options, eb, modelAlias, inlineComputedField);\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(\n eb: ExpressionBuilder<any, any>,\n value: Record<string, Expression<unknown>>,\n ): ExpressionWrapper<any, any, unknown>;\n\n /**\n * Builds an Kysely expression that returns the length of an array.\n */\n abstract buildArrayLength(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): 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 // #endregion\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\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 if (Array.isArray(value)) {\n return value.map((v) => this.transformPrimitive(v, type, false));\n } else {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return JSON.stringify(value);\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () => (value instanceof Date ? value.toISOString() : value))\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\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\n let tbl = eb.selectFrom(() => {\n // give sub query an alias to avoid conflict with parent scope\n // (e.g., for cases like self-relation)\n const subQueryAlias = `${parentAlias}$${relationField}$sub`;\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n\n subQuery = this.buildSelectAllFields(\n relationModel,\n subQuery,\n typeof payload === 'object' ? payload?.omit : undefined,\n subQueryAlias,\n );\n\n if (payload && typeof payload === 'object') {\n // take care of where, orderBy, skip, take, cursor, and distinct\n subQuery = this.buildFilterSortTake(relationModel, payload, subQuery, subQueryAlias);\n }\n\n // join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(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 subQuery = subQuery.where(\n eb(\n eb.ref(`${subQueryAlias}.${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 subQuery = subQuery.whereRef(`${subQueryAlias}.${pk}`, '=', `${parentAlias}.${fk}`);\n } else {\n // the relation side owns the fk\n subQuery = subQuery.whereRef(`${subQueryAlias}.${fk}`, '=', `${parentAlias}.${pk}`);\n }\n });\n }\n return subQuery.as(subQueryName);\n });\n\n tbl = tbl.select(() => {\n type ArgsType = Expression<any> | RawBuilder<any> | SelectQueryBuilder<any, any, any>;\n const objArgs: ArgsType[] = [];\n\n // TODO: descendant JSON shouldn't be joined and selected if none of its fields are selected\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\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [sql.lit(field), this.fieldRef(relationModel, field, eb, undefined, 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, eb, undefined, 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('$j');\n } else {\n return sql`json_object(${sql.join(objArgs)})`.as('data');\n }\n });\n\n return tbl;\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(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return eb.fn(\n 'json_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), 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(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return 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","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 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 LimitNode,\n ListNode,\n MatchedNode,\n MergeQueryNode,\n ModifyColumnNode,\n OffsetNode,\n OnConflictNode,\n OnDuplicateKeyNode,\n OnNode,\n OperationNodeVisitor,\n OperatorNode,\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 RenameColumnNode,\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}\n","import type { ColumnNode, OperationNode } from 'kysely';\nimport { DefaultOperationNodeVisitor } from '../../utils/default-operation-node-visitor';\n\n/**\n * Collects all column names from a query.\n */\nexport class ColumnCollector extends DefaultOperationNodeVisitor {\n private columns: string[] = [];\n\n collect(node: OperationNode) {\n this.columns = [];\n this.visitNode(node);\n return this.columns;\n }\n\n protected override visitColumn(node: ColumnNode): void {\n if (!this.columns.includes(node.column.name)) {\n this.columns.push(node.column.name);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n expressionBuilder,\n FromNode,\n FunctionNode,\n IdentifierNode,\n OperatorNode,\n ReferenceNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n ValueListNode,\n ValueNode,\n WhereNode,\n type ExpressionBuilder,\n type OperandExpression,\n type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ClientOptions } from '../../client/options';\nimport { getRelationForeignKeyFieldPairs, requireField } from '../../client/query-utils';\nimport type {\n BinaryExpression,\n BinaryOperator,\n BuiltinType,\n FieldDef,\n GetModels,\n LiteralExpression,\n MemberExpression,\n UnaryExpression,\n} from '../../schema';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type SchemaDef,\n} from '../../schema';\nimport { ExpressionEvaluator } from './expression-evaluator';\nimport { conjunction, disjunction, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\n thisEntity?: Record<string, OperationNode>;\n thisEntityRaw?: Record<string, unknown>;\n auth?: any;\n memberFilter?: OperationNode;\n memberSelect?: SelectionNode;\n};\n\n// a registry of expression handlers marked with @expr\nconst expressionHandlers = new Map<string, PropertyDescriptor>();\n\n// expression handler decorator\nfunction expr(kind: Expression['kind']) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!expressionHandlers.get(kind)) {\n expressionHandlers.set(kind, descriptor);\n }\n return descriptor;\n };\n}\n\nexport class ExpressionTransformer<Schema extends SchemaDef> {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(\n private readonly schema: Schema,\n private readonly clientOptions: ClientOptions<Schema>,\n private readonly auth: unknown | undefined,\n ) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get authType() {\n if (!this.schema.authType) {\n throw new InternalError('Schema does not have an \"authType\" specified');\n }\n return this.schema.authType;\n }\n\n transform(expression: Expression, context: ExpressionTransformerContext<Schema>): OperationNode {\n const handler = expressionHandlers.get(expression.kind);\n if (!handler) {\n throw new Error(`Unsupported expression kind: ${expression.kind}`);\n }\n return handler.value.call(this, expression, context);\n }\n\n @expr('literal')\n // @ts-expect-error\n private _literal(expr: LiteralExpression) {\n return this.transformValue(\n expr.value,\n typeof expr.value === 'string' ? 'String' : typeof expr.value === 'boolean' ? 'Boolean' : 'Int',\n );\n }\n\n @expr('array')\n // @ts-expect-error\n private _array(expr: ArrayExpression, context: ExpressionTransformerContext<Schema>) {\n return ValueListNode.create(expr.items.map((item) => this.transform(item, context)));\n }\n\n @expr('field')\n // @ts-expect-error\n private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n if (context.thisEntity) {\n return context.thisEntity[expr.field];\n } else {\n return this.createColumnRef(expr.field, context);\n }\n } else {\n const { memberFilter, memberSelect, ...restContext } = context;\n const relation = this.transformRelationAccess(expr.field, fieldDef.type, restContext);\n return {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n }\n\n private mergeWhere(where: WhereNode | undefined, memberFilter: OperationNode | undefined) {\n if (!where) {\n return WhereNode.create(memberFilter ?? trueNode(this.dialect));\n }\n if (!memberFilter) {\n return where;\n }\n return WhereNode.create(conjunction(this.dialect, [where.where, memberFilter]));\n }\n\n @expr('null')\n // @ts-ignore\n private _null() {\n return ValueNode.createImmediate(null);\n }\n\n @expr('binary')\n // @ts-ignore\n private _binary(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n if (expr.op === '&&') {\n return conjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n } else if (expr.op === '||') {\n return disjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n }\n\n if (this.isAuthCall(expr.left) || this.isAuthCall(expr.right)) {\n return this.transformAuthBinary(expr);\n }\n\n const op = expr.op;\n\n if (op === '?' || op === '!' || op === '^') {\n return this.transformCollectionPredicate(expr, context);\n }\n\n const left = this.transform(expr.left, context);\n const right = this.transform(expr.right, context);\n\n if (op === 'in') {\n if (this.isNullNode(left)) {\n return this.transformValue(false, 'Boolean');\n } else {\n if (ValueListNode.is(right)) {\n return BinaryOperationNode.create(left, OperatorNode.create('in'), right);\n } else {\n // array contains\n return BinaryOperationNode.create(\n left,\n OperatorNode.create('='),\n FunctionNode.create('any', [right]),\n );\n }\n }\n }\n\n if (this.isNullNode(right)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(left, OperatorNode.create('is'), right)\n : BinaryOperationNode.create(left, OperatorNode.create('is not'), right);\n } else if (this.isNullNode(left)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(right, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(right, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n\n private transformCollectionPredicate(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n invariant(expr.op === '?' || expr.op === '!' || expr.op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n if (this.isAuthCall(expr.left) || this.isAuthMember(expr.left)) {\n const value = new ExpressionEvaluator().evaluate(expr, {\n auth: this.auth,\n });\n return this.transformValue(value, 'Boolean');\n }\n\n invariant(\n ExpressionUtils.isField(expr.left) || ExpressionUtils.isMember(expr.left),\n 'left operand must be field or member access',\n );\n\n let newContextModel: string;\n if (ExpressionUtils.isField(expr.left)) {\n const fieldDef = requireField(this.schema, context.model, expr.left.field);\n newContextModel = fieldDef.type;\n } else {\n invariant(ExpressionUtils.isField(expr.left.receiver));\n const fieldDef = requireField(this.schema, context.model, expr.left.receiver.field);\n newContextModel = fieldDef.type;\n for (const member of expr.left.members) {\n const memberDef = requireField(this.schema, newContextModel, member);\n newContextModel = memberDef.type;\n }\n }\n\n let predicateFilter = this.transform(expr.right, {\n ...context,\n model: newContextModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (expr.op === '!') {\n predicateFilter = logicalNot(predicateFilter);\n }\n\n const count = FunctionNode.create('count', [ValueNode.createImmediate(1)]);\n\n const predicateResult = match(expr.op)\n .with('?', () => BinaryOperationNode.create(count, OperatorNode.create('>'), ValueNode.createImmediate(0)))\n .with('!', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .with('^', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .exhaustive();\n\n return this.transform(expr.left, {\n ...context,\n memberSelect: SelectionNode.create(AliasNode.create(predicateResult, IdentifierNode.create('$t'))),\n memberFilter: predicateFilter,\n });\n }\n\n private transformAuthBinary(expr: BinaryExpression) {\n if (expr.op !== '==' && expr.op !== '!=') {\n throw new Error(`Unsupported operator for auth call: ${expr.op}`);\n }\n let other: Expression;\n if (this.isAuthCall(expr.left)) {\n other = expr.right;\n } else {\n other = expr.left;\n }\n\n if (ExpressionUtils.isNull(other)) {\n return this.transformValue(expr.op === '==' ? !this.auth : !!this.auth, 'Boolean');\n } else {\n throw new Error('Unsupported binary expression with `auth()`');\n }\n }\n\n private transformValue(value: unknown, type: BuiltinType) {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\n\n @expr('unary')\n // @ts-ignore\n private _unary(expr: UnaryExpression, context: ExpressionTransformerContext<Schema>) {\n // only '!' operator for now\n invariant(expr.op === '!', 'only \"!\" operator is supported');\n return BinaryOperationNode.create(\n this.transform(expr.operand, context),\n this.transformOperator('!='),\n trueNode(this.dialect),\n );\n }\n\n private transformOperator(op: Exclude<BinaryOperator, '?' | '!' | '^'>) {\n const mappedOp = match(op)\n .with('==', () => '=' as const)\n .otherwise(() => op);\n return OperatorNode.create(mappedOp);\n }\n\n @expr('call')\n // @ts-ignore\n private _call(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const result = this.transformCall(expr, context);\n return result.toOperationNode();\n }\n\n private transformCall(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const func = this.clientOptions.functions?.[expr.function];\n if (!func) {\n throw new QueryError(`Function not implemented: ${expr.function}`);\n }\n const eb = expressionBuilder<any, any>();\n return func(\n eb,\n (expr.args ?? []).map((arg) => this.transformCallArg(eb, arg, context)),\n {\n dialect: this.dialect,\n model: context.model,\n operation: context.operation,\n },\n );\n }\n\n private transformCallArg(\n eb: ExpressionBuilder<any, any>,\n arg: Expression,\n context: ExpressionTransformerContext<Schema>,\n ): OperandExpression<any> {\n if (ExpressionUtils.isLiteral(arg)) {\n return eb.val(arg.value);\n }\n\n if (ExpressionUtils.isField(arg)) {\n return context.thisEntityRaw ? eb.val(context.thisEntityRaw[arg.field]) : eb.ref(arg.field);\n }\n\n if (ExpressionUtils.isCall(arg)) {\n return this.transformCall(arg, context);\n }\n\n if (this.isAuthMember(arg)) {\n const valNode = this.valueMemberAccess(context.auth, arg as MemberExpression, this.authType);\n return valNode ? eb.val(valNode.value) : eb.val(null);\n }\n\n // TODO\n // if (Expression.isMember(arg)) {\n // }\n\n throw new InternalError(`Unsupported argument expression: ${arg.kind}`);\n }\n\n @expr('member')\n // @ts-ignore\n private _member(expr: MemberExpression, context: ExpressionTransformerContext<Schema>) {\n // auth() member access\n if (this.isAuthCall(expr.receiver)) {\n return this.valueMemberAccess(this.auth, expr, this.authType);\n }\n\n invariant(ExpressionUtils.isField(expr.receiver), 'expect receiver to be field expression');\n\n const { memberFilter, memberSelect, ...restContext } = context;\n\n const receiver = this.transform(expr.receiver, restContext);\n invariant(SelectQueryNode.is(receiver), 'expected receiver to be select query');\n\n // relation member access\n const receiverField = requireField(this.schema, context.model, expr.receiver.field);\n\n // traverse forward to collect member types\n const memberFields: { fromModel: string; fieldDef: FieldDef }[] = [];\n let currType = receiverField.type;\n for (const member of expr.members) {\n const fieldDef = requireField(this.schema, currType, member);\n memberFields.push({ fieldDef, fromModel: currType });\n currType = fieldDef.type;\n }\n\n let currNode: SelectQueryNode | ColumnNode | ReferenceNode | undefined = undefined;\n\n for (let i = expr.members.length - 1; i >= 0; i--) {\n const member = expr.members[i]!;\n const { fieldDef, fromModel } = memberFields[i]!;\n\n if (fieldDef.relation) {\n const relation = this.transformRelationAccess(member, fieldDef.type, {\n ...restContext,\n model: fromModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (currNode) {\n invariant(SelectQueryNode.is(currNode), 'expected select query node');\n currNode = {\n ...relation,\n selections: [\n SelectionNode.create(\n AliasNode.create(currNode, IdentifierNode.create(expr.members[i + 1]!)),\n ),\n ],\n };\n } else {\n // inner most member, merge with member filter from the context\n currNode = {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n } else {\n invariant(i === expr.members.length - 1, 'plain field access must be the last segment');\n invariant(!currNode, 'plain field access must be the last segment');\n\n currNode = ColumnNode.create(member);\n }\n }\n\n return {\n ...receiver,\n selections: [SelectionNode.create(AliasNode.create(currNode!, IdentifierNode.create('$t')))],\n };\n }\n\n private valueMemberAccess(receiver: any, expr: MemberExpression, receiverType: string) {\n if (!receiver) {\n return ValueNode.createImmediate(null);\n }\n\n if (expr.members.length !== 1) {\n throw new Error(`Only single member access is supported`);\n }\n\n const field = expr.members[0]!;\n const fieldDef = requireField(this.schema, receiverType, field);\n const fieldValue = receiver[field] ?? null;\n return this.transformValue(fieldValue, fieldDef.type as BuiltinType);\n }\n\n private transformRelationAccess(\n field: string,\n relationModel: string,\n context: ExpressionTransformerContext<Schema>,\n ): SelectQueryNode {\n const fromModel = context.model;\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, fromModel, field);\n\n if (context.thisEntity) {\n let condition: OperationNode;\n if (ownedByModel) {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![fk]!,\n ),\n ),\n );\n } else {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![pk]!,\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n } else {\n let condition: OperationNode;\n if (ownedByModel) {\n // `fromModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n ),\n ),\n );\n } else {\n // `relationModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n }\n }\n\n private createColumnRef(column: string, context: ExpressionTransformerContext<Schema>): ReferenceNode {\n return ReferenceNode.create(ColumnNode.create(column), TableNode.create(context.alias ?? context.model));\n }\n\n private isAuthCall(value: unknown): value is CallExpression {\n return ExpressionUtils.isCall(value) && value.function === 'auth';\n }\n\n private isAuthMember(expr: Expression) {\n return ExpressionUtils.isMember(expr) && this.isAuthCall(expr.receiver);\n }\n\n private isNullNode(node: OperationNode) {\n return ValueNode.is(node) && node.value === null;\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type BinaryExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type LiteralExpression,\n type MemberExpression,\n type UnaryExpression,\n} from '../../schema';\n\ntype ExpressionEvaluatorContext = {\n auth?: any;\n thisValue?: any;\n};\n\n/**\n * Evaluate a schema expression into a JavaScript value.\n */\nexport class ExpressionEvaluator {\n evaluate(expression: Expression, context: ExpressionEvaluatorContext): any {\n const result = match(expression)\n .when(ExpressionUtils.isArray, (expr) => this.evaluateArray(expr, context))\n .when(ExpressionUtils.isBinary, (expr) => this.evaluateBinary(expr, context))\n .when(ExpressionUtils.isField, (expr) => this.evaluateField(expr, context))\n .when(ExpressionUtils.isLiteral, (expr) => this.evaluateLiteral(expr))\n .when(ExpressionUtils.isMember, (expr) => this.evaluateMember(expr, context))\n .when(ExpressionUtils.isUnary, (expr) => this.evaluateUnary(expr, context))\n .when(ExpressionUtils.isCall, (expr) => this.evaluateCall(expr, context))\n .when(ExpressionUtils.isThis, () => context.thisValue)\n .when(ExpressionUtils.isNull, () => null)\n .exhaustive();\n\n return result ?? null;\n }\n\n private evaluateCall(expr: CallExpression, context: ExpressionEvaluatorContext): any {\n if (expr.function === 'auth') {\n return context.auth;\n } else {\n throw new Error(`Unsupported call expression function: ${expr.function}`);\n }\n }\n\n private evaluateUnary(expr: UnaryExpression, context: ExpressionEvaluatorContext) {\n return match(expr.op)\n .with('!', () => !this.evaluate(expr.operand, context))\n .exhaustive();\n }\n\n private evaluateMember(expr: MemberExpression, context: ExpressionEvaluatorContext) {\n let val = this.evaluate(expr.receiver, context);\n for (const member of expr.members) {\n val = val?.[member];\n }\n return val;\n }\n\n private evaluateLiteral(expr: LiteralExpression): any {\n return expr.value;\n }\n\n private evaluateField(expr: FieldExpression, context: ExpressionEvaluatorContext): any {\n return context.thisValue?.[expr.field];\n }\n\n private evaluateArray(expr: ArrayExpression, context: ExpressionEvaluatorContext) {\n return expr.items.map((item) => this.evaluate(item, context));\n }\n\n private evaluateBinary(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n if (expr.op === '?' || expr.op === '!' || expr.op === '^') {\n return this.evaluateCollectionPredicate(expr, context);\n }\n\n const left = this.evaluate(expr.left, context);\n const right = this.evaluate(expr.right, context);\n\n return match(expr.op)\n .with('==', () => left === right)\n .with('!=', () => left !== right)\n .with('>', () => left > right)\n .with('>=', () => left >= right)\n .with('<', () => left < right)\n .with('<=', () => left <= right)\n .with('&&', () => left && right)\n .with('||', () => left || right)\n .with('in', () => {\n const _right = right ?? [];\n invariant(Array.isArray(_right), 'expected array for \"in\" operator');\n return _right.includes(left);\n })\n .exhaustive();\n }\n\n private evaluateCollectionPredicate(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n const op = expr.op;\n invariant(op === '?' || op === '!' || op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n const left = this.evaluate(expr.left, context);\n if (!left) {\n return false;\n }\n\n invariant(Array.isArray(left), 'expected array');\n\n return match(op)\n .with('?', () => left.some((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with('!', () => left.every((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with(\n '^',\n () =>\n !left.some((item: any) =>\n this.evaluate(expr.right, {\n ...context,\n thisValue: item,\n }),\n ),\n )\n .exhaustive();\n }\n}\n","import type { OperationNode } from 'kysely';\nimport {\n AliasNode,\n AndNode,\n BinaryOperationNode,\n FunctionNode,\n OperatorNode,\n OrNode,\n ParensNode,\n ReferenceNode,\n TableNode,\n UnaryOperationNode,\n ValueNode,\n} from 'kysely';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport type { SchemaDef } from '../../schema';\n\n/**\n * Creates a `true` value node.\n */\nexport function trueNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(true, 'Boolean', false));\n}\n\n/**\n * Creates a `false` value node.\n */\nexport function falseNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(false, 'Boolean', false));\n}\n\n/**\n * Checks if a node is a truthy value node.\n */\nexport function isTrueNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === true || node.value === 1);\n}\n\n/**\n * Checks if a node is a falsy value node.\n */\nexport function isFalseNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === false || node.value === 0);\n}\n\n/**\n * Builds a logical conjunction of a list of nodes.\n */\nexport function conjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isFalseNode)) {\n return falseNode(dialect);\n }\n const items = nodes.filter((n) => !isTrueNode(n));\n if (items.length === 0) {\n return trueNode(dialect);\n }\n return items.reduce((acc, node) =>\n OrNode.is(node)\n ? AndNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : AndNode.create(acc, node),\n );\n}\n\nexport function disjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isTrueNode)) {\n return trueNode(dialect);\n }\n const items = nodes.filter((n) => !isFalseNode(n));\n if (items.length === 0) {\n return falseNode(dialect);\n }\n return items.reduce((acc, node) =>\n AndNode.is(node)\n ? OrNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : OrNode.create(acc, node),\n );\n}\n\n/**\n * Negates a logical expression.\n */\nexport function logicalNot(node: OperationNode): OperationNode {\n return UnaryOperationNode.create(\n OperatorNode.create('not'),\n AndNode.is(node) || OrNode.is(node)\n ? ParensNode.create(node) // wraps parentheses\n : node,\n );\n}\n\n/**\n * Builds an expression node that checks if a node is true.\n */\nexport function buildIsTrue<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isTrueNode(node)) {\n return trueNode(dialect);\n } else if (isFalseNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(node, OperatorNode.create('='), trueNode(dialect));\n}\n\n/**\n * Builds an expression node that checks if a node is false.\n */\nexport function buildIsFalse<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isFalseNode(node)) {\n return trueNode(dialect);\n } else if (isTrueNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(\n // coalesce so null is treated as false\n FunctionNode.create('coalesce', [node, falseNode(dialect)]),\n OperatorNode.create('='),\n falseNode(dialect),\n );\n}\n\n/**\n * Gets the table name from a node.\n */\nexport function getTableName(node: OperationNode | undefined) {\n if (!node) {\n return node;\n }\n if (TableNode.is(node)) {\n return node.table.identifier.name;\n } else if (AliasNode.is(node)) {\n return getTableName(node.node);\n } else if (ReferenceNode.is(node) && node.table) {\n return getTableName(node.table);\n }\n return undefined;\n}\n","import { type OnKyselyQueryArgs, type RuntimePlugin } from '../../client/plugin';\nimport type { SchemaDef } from '../../schema';\nimport { PolicyHandler } from './policy-handler';\n\nexport class PolicyPlugin<Schema extends SchemaDef> implements RuntimePlugin<Schema> {\n get id() {\n return 'policy';\n }\n\n get name() {\n return 'Access Policy';\n }\n\n get description() {\n return 'Enforces access policies defined in the schema.';\n }\n\n onKyselyQuery({ query, client, proceed /*, transaction*/ }: OnKyselyQueryArgs<Schema>) {\n const handler = new PolicyHandler<Schema>(client);\n return handler.handle(query, proceed /*, transaction*/);\n }\n}\n","import { isPlainObject } from '@zenstackhq/common-helpers';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","import type { Decimal } from 'decimal.js';\nimport { type GetModels, type IsDelegateModel, type ProcedureDef, type SchemaDef } from '../schema';\nimport type { AuthType } from '../schema/auth';\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 DeleteArgs,\n DeleteManyArgs,\n FindArgs,\n FindUniqueArgs,\n GroupByArgs,\n GroupByResult,\n ModelResult,\n SelectSubset,\n Subset,\n UpdateArgs,\n UpdateManyAndReturnArgs,\n UpdateManyArgs,\n UpsertArgs,\n} from './crud-types';\nimport type { ClientOptions } 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> = {\n readonly $schema: Schema;\n\n /**\n * The client options.\n */\n readonly $options: ClientOptions<Schema>;\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>;\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: ToKysely<any>;\n\n /**\n * Starts an interactive transaction.\n */\n $transaction<T>(\n callback: (tx: Omit<ClientContract<Schema>, 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>;\n\n /**\n * Returns a new client with the specified plugin removed.\n */\n $unuse(pluginId: string): ClientContract<Schema>;\n\n /**\n * Returns a new client with all plugins removed.\n */\n $unuseAll(): ClientContract<Schema>;\n\n /**\n * Disconnects the underlying Kysely instance 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>;\n} & Procedures<Schema>;\n\n/**\n * The contract for a client in a transaction.\n */\nexport type TransactionClientContract<Schema extends SchemaDef> = Omit<\n ClientContract<Schema>,\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>(schema: Schema, options: ClientOptions<Schema>): ClientContract<Schema>;\n}\n\n/**\n * CRUD operations.\n */\nexport type CRUD = 'create' | 'read' | 'update' | 'delete';\n\n//#region Model operations\n\nexport type AllModelOperations<Schema extends SchemaDef, Model extends GetModels<Schema>> = {\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 FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n ): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;\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, Simplify<ModelResult<Schema, Model, T>> | 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, Simplify<ModelResult<Schema, Model, T>>>;\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 FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n ): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>> | 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 FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n ): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;\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, Simplify<ModelResult<Schema, Model, T>>>;\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, Simplify<ModelResult<Schema, Model, T>>[]>;\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, Simplify<ModelResult<Schema, Model, T>>>;\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, Simplify<ModelResult<Schema, Model, T>>[]>;\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, Simplify<ModelResult<Schema, Model, T>>>;\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, Simplify<ModelResult<Schema, Model, T>>>;\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 ModelOperations<Schema extends SchemaDef, Model extends GetModels<Schema>> = Omit<\n AllModelOperations<Schema, Model>,\n // exclude operations not applicable to delegate models\n IsDelegateModel<Schema, Model> extends true ? 'create' | 'createMany' | 'createManyAndReturn' | 'upsert' : never\n>;\n\n//#endregion\n","import type { ExpressionBuilder } from 'kysely';\nimport { sql } from 'kysely';\nimport 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(eb as ExpressionBuilder<any, any>, this.model, this.model)\n .where((eb1) => this.dialect.buildFilter(eb1, 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(sql.ref(`${subQueryName}.${key}`)), '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 { RejectedByPolicyError } from '../../../plugins/policy/errors';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { CreateArgs, CreateManyAndReturnArgs, CreateManyArgs, WhereInput } from '../../crud-types';\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 // 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);\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 });\n\n if (!result && this.hasPolicyEnabled) {\n throw new RejectedByPolicyError(this.model, `result is not allowed to be read back`);\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 // TODO: avoid using transaction for simple create\n return this.safeTransaction(async (tx) => {\n const createResult = await this.createMany(tx, this.model, args, true);\n return this.read(tx, this.model, {\n select: args.select,\n omit: args.omit,\n where: {\n OR: createResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n } as any, // TODO: fix type\n });\n });\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { DeleteArgs, DeleteManyArgs } from '../../crud-types';\nimport { NotFoundError } 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 const existing = await this.readUnique(this.kysely, this.model, {\n select: args.select,\n include: args.include,\n omit: args.omit,\n where: args.where,\n });\n if (!existing) {\n throw new NotFoundError(this.model);\n }\n\n // TODO: avoid using transaction for simple delete\n await this.safeTransaction(async (tx) => {\n const result = await this.delete(tx, this.model, args.where);\n if (result.count === 0) {\n throw new NotFoundError(this.model);\n }\n });\n\n return existing;\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 result;\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 // parse args\n const parsedArgs = validateArgs\n ? this.inputValidator.validateFindArgs(this.model, operation === 'findUnique', normalizedArgs)\n : normalizedArgs;\n\n // run query\n const result = await this.read(\n this.client.$qb,\n this.model,\n parsedArgs as FindArgs<Schema, GetModels<Schema>, true>,\n );\n\n const finalResult = operation === 'findMany' ? result : (result[0] ?? null);\n return finalResult;\n }\n}\n","import { expressionBuilder } from 'kysely';\nimport { 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.selectFrom((eb) => {\n // nested query for filtering and pagination\n\n // where\n let subQuery = eb\n .selectFrom(this.model)\n .selectAll()\n .where((eb1) => this.dialect.buildFilter(eb1, this.model, this.model, parsedArgs?.where));\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 // default orderBy\n subQuery = this.dialect.buildOrderBy(\n subQuery,\n this.model,\n this.model,\n undefined,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n return subQuery.as('$sub');\n });\n\n const fieldRef = (field: string) => this.dialect.fieldRef(this.model, field, expressionBuilder(), '$sub');\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 // orderBy\n if (parsedArgs.orderBy) {\n query = this.dialect.buildOrderBy(query, this.model, '$sub', parsedArgs.orderBy, false, false);\n }\n\n if (parsedArgs.having) {\n query = query.having((eb) => this.dialect.buildFilter(eb, this.model, '$sub', 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 { RejectedByPolicyError } from '../../../plugins/policy/errors';\nimport type { GetModels, SchemaDef } from '../../../schema';\nimport type { UpdateArgs, UpdateManyAndReturnArgs, UpdateManyArgs, UpsertArgs, WhereInput } from '../../crud-types';\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 const readBackResult = await this.safeTransaction(async (tx) => {\n const updateResult = await this.update(tx, this.model, args.where, args.data);\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 try {\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 } catch {\n // commit the update even if read-back failed\n }\n return readBackResult;\n });\n\n if (!readBackResult) {\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 new RejectedByPolicyError(this.model, 'result is not allowed to be read back');\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 readBackResult;\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 return this.safeTransaction(async (tx) => {\n const updateResult = await this.updateMany(tx, this.model, args.where, args.data, args.limit, true);\n return this.read(tx, this.model, {\n select: args.select,\n omit: args.omit,\n where: {\n OR: updateResult.map((item) => getIdValues(this.schema, this.model, item) as any),\n } as any, // TODO: fix type\n });\n });\n }\n\n private async runUpsert(args: UpsertArgs<Schema, GetModels<Schema>>) {\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 );\n\n if (!mutationResult) {\n // non-existing, create\n mutationResult = await this.create(tx, this.model, args.create);\n }\n\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 });\n\n if (!result && this.hasPolicyEnabled) {\n throw new RejectedByPolicyError(this.model, 'result is not allowed to be read back');\n }\n\n return result;\n }\n}\n","import { 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 { type BuiltinType, type EnumDef, type FieldDef, type GetModels, type SchemaDef } from '../../schema';\nimport { enumerate } from '../../utils/enumerate';\nimport { extractFields } from '../../utils/object-utils';\nimport { AGGREGATE_OPERATORS, LOGICAL_COMBINATORS, NUMERIC_FIELD_TYPES } from '../constants';\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 { InputValidationError, InternalError, QueryError } from '../errors';\nimport {\n fieldHasDefaultValue,\n getDiscriminatorField,\n getEnum,\n getModel,\n getUniqueFields,\n requireField,\n requireModel,\n} from '../query-utils';\n\ntype GetSchemaFunc<Schema extends SchemaDef, Options> = (model: GetModels<Schema>, options: Options) => ZodType;\n\nexport class InputValidator<Schema extends SchemaDef> {\n private schemaCache = new Map<string, ZodType>();\n\n constructor(private readonly schema: Schema) {}\n\n validateFindArgs(model: GetModels<Schema>, unique: boolean, args: unknown) {\n return this.validate<FindArgs<Schema, GetModels<Schema>, true>, Parameters<typeof this.makeFindSchema>[1]>(\n model,\n 'find',\n { unique },\n (model, options) => this.makeFindSchema(model, options),\n args,\n );\n }\n\n validateCreateArgs(model: GetModels<Schema>, args: unknown) {\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) {\n return this.validate<CreateManyArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'createMany',\n undefined,\n (model) => this.makeCreateManySchema(model),\n args,\n );\n }\n\n validateCreateManyAndReturnArgs(model: GetModels<Schema>, args: unknown) {\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) {\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) {\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(model: GetModels<Schema>, args: unknown) {\n return this.validate<UpdateManyAndReturnArgs<Schema, GetModels<Schema>> | undefined>(\n model,\n 'updateManyAndReturn',\n undefined,\n (model) => this.makeUpdateManyAndReturnSchema(model),\n args,\n );\n }\n\n validateUpsertArgs(model: GetModels<Schema>, args: unknown) {\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) {\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(model: GetModels<Schema>, args: unknown) {\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) {\n return this.validate<CountArgs<Schema, GetModels<Schema>> | undefined, undefined>(\n model,\n 'count',\n undefined,\n (model) => this.makeCountSchema(model),\n args,\n );\n }\n\n validateAggregateArgs(model: GetModels<Schema>, args: unknown) {\n return this.validate<AggregateArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'aggregate',\n undefined,\n (model) => this.makeAggregateSchema(model),\n args,\n );\n }\n\n validateGroupByArgs(model: GetModels<Schema>, args: unknown) {\n return this.validate<GroupByArgs<Schema, GetModels<Schema>>, undefined>(\n model,\n 'groupBy',\n undefined,\n (model) => this.makeGroupBySchema(model),\n args,\n );\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 model,\n operation,\n options,\n });\n let schema = this.schemaCache.get(cacheKey!);\n if (!schema) {\n schema = getSchema(model, options);\n this.schemaCache.set(cacheKey!, schema);\n }\n const { error } = schema.safeParse(args);\n if (error) {\n throw new InputValidationError(`Invalid ${operation} args: ${error.message}`, error);\n }\n return args as T;\n }\n\n // #region Find\n\n private makeFindSchema(model: string, options: { unique: 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();\n fields['include'] = this.makeIncludeSchema(model).optional();\n fields['omit'] = this.makeOmitSchema(model).optional();\n\n if (!options.unique) {\n fields['skip'] = this.makeSkipSchema().optional();\n fields['take'] = this.makeTakeSchema().optional();\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 makePrimitiveSchema(type: string) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n return this.makeTypeDefSchema(type);\n } else {\n return match(type)\n .with('String', () => z.string())\n .with('Int', () => z.number().int())\n .with('Float', () => z.number())\n .with('Boolean', () => z.boolean())\n .with('BigInt', () => z.union([z.number().int(), z.bigint()]))\n .with('Decimal', () => z.union([z.number(), z.instanceof(Decimal), z.string()]))\n .with('DateTime', () => z.union([z.date(), z.string().datetime()]))\n .with('Bytes', () => z.instanceof(Uint8Array))\n .otherwise(() => z.unknown());\n }\n }\n\n private makeTypeDefSchema(type: string): z.ZodType {\n const key = `$typedef-${type}`;\n let schema = this.schemaCache.get(key);\n if (schema) {\n return schema;\n }\n const typeDef = this.schema.typeDefs?.[type];\n invariant(typeDef, `Type definition \"${type}\" not found in schema`);\n schema = z\n .object(\n Object.fromEntries(\n Object.entries(typeDef.fields).map(([field, def]) => {\n let fieldSchema = this.makePrimitiveSchema(def.type);\n if (def.array) {\n fieldSchema = fieldSchema.array();\n }\n if (def.optional) {\n fieldSchema = fieldSchema.optional();\n }\n return [field, fieldSchema];\n }),\n ),\n )\n .passthrough();\n this.schemaCache.set(key, schema);\n return schema;\n }\n\n private makeWhereSchema(\n model: string,\n unique: boolean,\n withoutRelationFields = false,\n withAggregations = false,\n ): ZodType {\n const modelDef = getModel(this.schema, model);\n if (!modelDef) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\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).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 {\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).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').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 new InternalError(`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 makeEnumFilterSchema(enumDef: EnumDef, optional: boolean, withAggregations: boolean) {\n const baseSchema = z.enum(Object.keys(enumDef) 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.makePrimitiveSchema(type).array().optional(),\n has: this.makePrimitiveSchema(type).optional(),\n hasEvery: this.makePrimitiveSchema(type).array().optional(),\n hasSome: this.makePrimitiveSchema(type).array().optional(),\n isEmpty: z.boolean().optional(),\n });\n }\n\n private makePrimitiveFilterSchema(type: BuiltinType, optional: boolean, withAggregations: boolean) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return this.makeTypeDefFilterSchema(type, optional);\n }\n return (\n match(type)\n .with('String', () => this.makeStringFilterSchema(optional, withAggregations))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.makeNumberFilterSchema(this.makePrimitiveSchema(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 // TODO: JSON filters\n .with('Json', () => z.any())\n .with('Unsupported', () => z.never())\n .exhaustive()\n );\n }\n\n private makeTypeDefFilterSchema(_type: string, _optional: boolean) {\n // TODO: strong typed JSON filtering\n return z.never();\n }\n\n private makeDateTimeFilterSchema(optional: boolean, withAggregations: boolean): ZodType {\n return this.makeCommonPrimitiveFilterSchema(\n z.union([z.string().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 toManyRelations = Object.values(modelDef.fields).filter((def) => def.relation && def.array);\n\n if (toManyRelations.length > 0) {\n fields['_count'] = 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 }\n\n return z.strictObject(fields);\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.lazy(() => this.makeSelectSchema(fieldDef.type)).optional(),\n include: z.lazy(() => this.makeIncludeSchema(fieldDef.type)).optional(),\n omit: z.lazy(() => this.makeOmitSchema(fieldDef.type)).optional(),\n ...(fieldDef.array\n ? {\n // to-many relations can be ordered, skipped, taken, and cursor-located\n orderBy: z.lazy(() => this.makeOrderBySchema(fieldDef.type, true, false)).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 fields[field] = z.boolean().optional();\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 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 const schema = z.strictObject({\n data: dataSchema,\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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(),\n omit: this.makeOmitSchema(model).optional(),\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: ZodType = this.makePrimitiveSchema(fieldDef.type);\n\n if (fieldDef.array) {\n fieldSchema = z\n .union([\n z.array(fieldSchema),\n z.strictObject({\n set: z.array(fieldSchema),\n }),\n ])\n .optional();\n }\n\n if (fieldDef.optional || fieldHasDefaultValue(fieldDef)) {\n fieldSchema = fieldSchema.optional();\n }\n\n if (fieldDef.optional) {\n fieldSchema = fieldSchema.nullable();\n }\n\n uncheckedVariantFields[field] = fieldSchema;\n if (!fieldDef.foreignKeyFor) {\n // non-fk field\n checkedVariantFields[field] = fieldSchema;\n }\n }\n });\n\n if (!hasRelation) {\n return this.orArray(z.strictObject(uncheckedVariantFields), canBeArray);\n } else {\n return z.union([\n z.strictObject(uncheckedVariantFields),\n z.strictObject(checkedVariantFields),\n ...(canBeArray ? [z.array(z.strictObject(uncheckedVariantFields))] : []),\n ...(canBeArray ? [z.array(z.strictObject(checkedVariantFields))] : []),\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, true),\n data: this.makeUpdateDataSchema(fieldType, withoutFields),\n }),\n this.makeUpdateDataSchema(fieldType, withoutFields),\n ])\n .optional();\n\n fields['upsert'] = this.orArray(\n z.strictObject({\n where: this.makeWhereSchema(fieldType, true),\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 const schema = z.strictObject({\n where: this.makeWhereSchema(model, true),\n data: this.makeUpdateDataSchema(model),\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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 const result = base.extend({\n select: this.makeSelectSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectOmitMutuallyExclusive(result);\n }\n\n private makeUpsertSchema(model: string) {\n const schema = 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(),\n include: this.makeIncludeSchema(model).optional(),\n omit: this.makeOmitSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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: ZodType = this.makePrimitiveSchema(fieldDef.type).optional();\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),\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 fieldSchema = z\n .union([\n fieldSchema.array(),\n z\n .object({\n set: z.array(fieldSchema).optional(),\n push: this.orArray(fieldSchema, true).optional(),\n })\n .refine(\n (v) => Object.keys(v).length === 1,\n 'Only one of \"set\", \"push\" can be provided',\n ),\n ])\n .optional();\n }\n\n if (fieldDef.optional) {\n fieldSchema = fieldSchema.nullable();\n }\n\n uncheckedVariantFields[field] = fieldSchema;\n if (!fieldDef.foreignKeyFor) {\n // non-fk field\n checkedVariantFields[field] = fieldSchema;\n }\n }\n });\n\n if (!hasRelation) {\n return z.strictObject(uncheckedVariantFields);\n } else {\n return z.union([z.strictObject(uncheckedVariantFields), z.strictObject(checkedVariantFields)]);\n }\n }\n\n // #endregion\n\n // #region Delete\n\n private makeDeleteSchema(model: GetModels<Schema>) {\n const schema = z.strictObject({\n where: this.makeWhereSchema(model, true),\n select: this.makeSelectSchema(model).optional(),\n include: this.makeIncludeSchema(model).optional(),\n });\n return this.refineForSelectIncludeMutuallyExclusive(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) => {\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) => {\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 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 {\n AndNode,\n CompiledQuery,\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 { GetModels, SchemaDef } from '../../schema';\nimport { type ClientImpl } from '../client-impl';\nimport { TransactionIsolationLevel, type ClientContract } from '../contract';\nimport { InternalError, QueryError } from '../errors';\nimport type { AfterEntityMutationCallback, OnKyselyQueryCallback } from '../plugin';\nimport { stripAlias } from './kysely-utils';\nimport { QueryNameMapper } from './name-mapper';\nimport type { ZenStackDriver } from './zenstack-driver';\n\ntype QueryId = { queryId: string };\n\ntype MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\ntype MutationInfo<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n action: 'create' | 'update' | 'delete';\n where: WhereNode | undefined;\n};\n\nexport class ZenStackQueryExecutor<Schema extends SchemaDef> extends DefaultQueryExecutor {\n private readonly nameMapper: QueryNameMapper;\n\n constructor(\n private client: ClientImpl<Schema>,\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 this.nameMapper = new QueryNameMapper(client.$schema);\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 async executeQuery(compiledQuery: CompiledQuery, queryId: QueryId) {\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 const result = await this.proceedQueryWithKyselyInterceptors(compiledQuery.query, queryParams, queryId.queryId);\n\n return result.result;\n }\n\n private async proceedQueryWithKyselyInterceptors(\n queryNode: RootOperationNode,\n parameters: readonly unknown[] | undefined,\n queryId: string,\n ) {\n let proceed = (q: RootOperationNode) => this.proceedQuery(q, parameters, queryId);\n\n const hooks: OnKyselyQueryCallback<Schema>[] = [];\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 = async (q: RootOperationNode) => {\n const r = await _proceed(q);\n return r.result;\n };\n\n const hookResult = await hook!({\n client: this.client as ClientContract<Schema>,\n schema: this.client.$schema,\n kysely: this.kysely,\n query,\n proceed: _p,\n });\n return { result: hookResult };\n };\n }\n\n const result = await proceed(queryNode);\n\n return result;\n }\n\n private getMutationInfo(queryNode: MutationQueryNode): MutationInfo<Schema> {\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(query: RootOperationNode, parameters: readonly unknown[] | undefined, queryId: string) {\n let compiled: CompiledQuery | undefined;\n\n try {\n return await this.provideConnection(async (connection) => {\n if (this.suppressMutationHooks || !this.isMutationNode(query) || !this.hasEntityMutationPlugins) {\n // no need to handle mutation hooks, just proceed\n const finalQuery = this.nameMapper.transformNode(query);\n compiled = this.compileQuery(finalQuery);\n if (parameters) {\n compiled = { ...compiled, parameters };\n }\n const result = await connection.executeQuery<any>(compiled);\n return { result };\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.nameMapper.transformNode(query);\n compiled = this.compileQuery(finalQuery);\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 (\n beforeMutationEntities === undefined &&\n (UpdateQueryNode.is(query) || DeleteQueryNode.is(query))\n ) {\n beforeMutationEntities = await this.loadEntities(\n mutationInfo.model,\n mutationInfo.where,\n connection,\n );\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 // if mutation interceptor demands to run afterMutation hook in the transaction but we're not already\n // inside one, we need to create one on the fly\n const shouldCreateTx =\n this.hasPluginRequestingAfterMutationWithinTransaction &&\n !this.driver.isTransactionConnection(connection);\n\n if (!shouldCreateTx) {\n // if no on-the-fly tx is needed, just proceed with the query as is\n const result = await connection.executeQuery<any>(compiled);\n\n if (!this.driver.isTransactionConnection(connection)) {\n // not in a transaction, just call all after-mutation hooks\n await this.callAfterMutationHooks(\n result,\n finalQuery,\n mutationInfo,\n connectionClient,\n 'all',\n queryId,\n );\n } else {\n // run after-mutation hooks that are requested to be run inside tx\n await this.callAfterMutationHooks(\n result,\n finalQuery,\n mutationInfo,\n connectionClient,\n 'inTx',\n queryId,\n );\n\n // register other after-mutation hooks to be run after the tx is committed\n this.driver.registerTransactionCommitCallback(connection, () =>\n this.callAfterMutationHooks(\n result,\n finalQuery,\n mutationInfo,\n connectionClient,\n 'outTx',\n queryId,\n ),\n );\n }\n\n return { result };\n } else {\n // if an on-the-fly tx is created, create one and wrap the query execution inside\n await this.driver.beginTransaction(connection, {\n isolationLevel: TransactionIsolationLevel.ReadCommitted,\n });\n try {\n // execute the query inside the on-the-fly transaction\n const result = await connection.executeQuery<any>(compiled);\n\n // run after-mutation hooks that are requested to be run inside tx\n await this.callAfterMutationHooks(\n result,\n finalQuery,\n mutationInfo,\n connectionClient,\n 'inTx',\n queryId,\n );\n\n // commit the transaction\n await this.driver.commitTransaction(connection);\n\n // run other after-mutation hooks after the tx is committed\n await this.callAfterMutationHooks(\n result,\n finalQuery,\n mutationInfo,\n connectionClient,\n 'outTx',\n queryId,\n );\n\n return { result };\n } catch (err) {\n // rollback the transaction\n await this.driver.rollbackTransaction(connection);\n throw err;\n }\n }\n });\n } catch (err) {\n const message = `Failed to execute query: ${err}, sql: ${compiled?.sql}`;\n throw new QueryError(message, err);\n }\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 ClientContract<Schema>;\n }\n\n private get hasEntityMutationPlugins() {\n return (this.client.$options.plugins ?? []).some((plugin) => plugin.onEntityMutation);\n }\n\n private get hasEntityMutationPluginsWithAfterMutationHooks() {\n return (this.client.$options.plugins ?? []).some((plugin) => plugin.onEntityMutation?.afterEntityMutation);\n }\n\n private get hasPluginRequestingAfterMutationWithinTransaction() {\n return (this.client.$options.plugins ?? []).some(\n (plugin) => plugin.onEntityMutation?.runAfterMutationWithinTransaction,\n );\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): GetModels<Schema> {\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 new InternalError(`Invalid query node: ${node}`);\n }) as GetModels<Schema>;\n }\n\n private async callBeforeMutationHooks(\n queryNode: OperationNode,\n mutationInfo: MutationInfo<Schema>,\n loadBeforeMutationEntities: () => Promise<Record<string, unknown>[] | undefined>,\n client: ClientContract<Schema>,\n queryId: string,\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<Schema>,\n client: ClientContract<Schema>,\n filterFor: 'inTx' | 'outTx' | 'all',\n queryId: string,\n ) {\n const hooks: AfterEntityMutationCallback<Schema>[] = [];\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: GetModels<Schema>,\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);\n // execute the query directly with the given connection to avoid triggering\n // any other side effects\n const result = await connection.executeQuery(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","import { invariant } from '@zenstackhq/common-helpers';\nimport { type OperationNode, AliasNode, IdentifierNode } from 'kysely';\n\n/**\n * Strips alias from the node if it exists.\n */\nexport function stripAlias(node: OperationNode) {\n if (AliasNode.is(node)) {\n invariant(IdentifierNode.is(node.alias), 'Expected identifier as alias');\n return { alias: node.alias.name, node: node.node };\n } else {\n return { alias: undefined, node };\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n OperationNodeTransformer,\n ReferenceNode,\n ReturningNode,\n SelectAllNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n type OperationNode,\n} from 'kysely';\nimport type { FieldDef, ModelDef, SchemaDef } from '../../schema';\nimport { getModel, requireModel } from '../query-utils';\nimport { stripAlias } from './kysely-utils';\n\ntype Scope = {\n model: string;\n alias?: string;\n namesMapped?: boolean;\n};\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 modelScopes: 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 [fieldName, fieldDef] of Object.entries(modelDef.fields)) {\n const mappedName = this.getMappedName(fieldDef);\n if (mappedName) {\n this.fieldToColumnMap.set(`${modelName}.${fieldName}`, 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 // all table names in \"from\" are pushed as scopes, each \"from\" is expanded\n // as nested query to apply column name mapping, so the scopes are marked\n // \"namesMapped\" so no additional name mapping is applied when resolving\n // columns\n const scopes = this.createScopesFromFroms(node.from, true);\n return this.withScopes(scopes, () => {\n return {\n ...super.transformSelectQuery(node),\n // convert \"from\" to nested query as needed\n from: this.processFrom(node.from!),\n };\n });\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n if (!node.into) {\n return super.transformInsertQuery(node);\n }\n\n return this.withScope(\n { model: node.into.table.identifier.name },\n () =>\n ({\n ...super.transformInsertQuery(node),\n // map table name\n into: this.processTableRef(node.into!),\n }) satisfies InsertQueryNode,\n );\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 transformJoin(node: JoinNode) {\n const { alias, node: innerNode } = stripAlias(node.table);\n if (TableNode.is(innerNode!)) {\n const modelName = innerNode.table.identifier.name;\n if (this.hasMappedColumns(modelName)) {\n // create a nested query with all fields selected and names mapped\n const select = this.createSelectAll(modelName);\n return { ...super.transformJoin(node), table: this.wrapAlias(select, alias ?? modelName) };\n }\n }\n return super.transformJoin(node);\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 { fieldDef, modelDef, scope } = this.resolveFieldFromScopes(\n node.column.column.name,\n node.table?.table.identifier.name,\n );\n if (fieldDef && !scope.namesMapped) {\n // map column name and table name as needed\n const mappedFieldName = this.mapFieldName(modelDef.name, fieldDef.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 === 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\n return ReferenceNode.create(\n ColumnNode.create(mappedFieldName),\n mappedTableName ? TableNode.create(mappedTableName) : undefined,\n );\n } else {\n return super.transformReference(node);\n }\n }\n\n protected override transformColumn(node: ColumnNode) {\n const { modelDef, fieldDef, scope } = this.resolveFieldFromScopes(node.column.name);\n if (!fieldDef || scope.namesMapped) {\n return super.transformColumn(node);\n }\n const mappedName = this.mapFieldName(modelDef.name, fieldDef.name);\n return ColumnNode.create(mappedName);\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 return this.withScope({ model: innerTable.table.identifier.name, alias }, () => {\n return {\n ...super.transformUpdateQuery(node),\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 = this.createScopesFromFroms(node.from, false);\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 resolveFieldFromScopes(name: string, qualifier?: string) {\n for (const scope of this.modelScopes.toReversed()) {\n if (qualifier) {\n if (scope.alias) {\n if (qualifier !== scope.alias) {\n continue;\n }\n } else {\n if (qualifier !== scope.model) {\n continue;\n }\n }\n }\n const modelDef = getModel(this.schema, scope.model);\n if (!modelDef) {\n continue;\n }\n if (modelDef.fields[name]) {\n return { modelDef, fieldDef: modelDef.fields[name], scope };\n }\n }\n return { modelDef: undefined, fieldDef: undefined, scope: undefined };\n }\n\n private pushScope(scope: Scope) {\n this.modelScopes.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.modelScopes.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.modelScopes.pop());\n }\n }\n\n private wrapAlias<T extends OperationNode>(node: T, alias: string | undefined) {\n return alias ? AliasNode.create(node, IdentifierNode.create(alias)) : node;\n }\n\n private ensureAlias(node: OperationNode, alias: string | undefined, fallbackName: string) {\n if (!node) {\n return node;\n }\n return alias\n ? AliasNode.create(node, IdentifierNode.create(alias))\n : AliasNode.create(node, IdentifierNode.create(fallbackName));\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 return TableNode.create(this.mapTableName(node.table.identifier.name));\n }\n\n private getMappedName(def: ModelDef | FieldDef) {\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 private createScopesFromFroms(node: FromNode | undefined, namesMapped: boolean) {\n if (!node) {\n return [];\n }\n return node.froms\n .map((from) => {\n const { alias, node: innerNode } = stripAlias(from);\n if (innerNode && TableNode.is(innerNode)) {\n return { model: innerNode.table.identifier.name, alias, namesMapped };\n } else {\n return undefined;\n }\n })\n .filter((s) => !!s);\n }\n\n // convert a \"from\" node to a nested query if there are columns with name mapping\n private processFrom(node: FromNode): FromNode {\n return {\n ...super.transformFrom(node),\n froms: node.froms.map((from) => {\n const { alias, node: innerNode } = stripAlias(from);\n if (!innerNode) {\n return super.transformNode(from);\n }\n if (TableNode.is(innerNode)) {\n if (this.hasMappedColumns(innerNode.table.identifier.name)) {\n // create a nested query with all fields selected and names mapped\n const selectAll = this.createSelectAll(innerNode.table.identifier.name);\n\n // use the original alias or table name as the alias for the nested query\n // so its transparent to the outer scope\n return this.ensureAlias(selectAll, alias, innerNode.table.identifier.name);\n }\n }\n return this.transformNode(from);\n }),\n };\n }\n\n // create a `SelectQueryNode` for the given model with all columns mapped\n private createSelectAll(model: string): SelectQueryNode {\n const modelDef = requireModel(this.schema, model);\n const tableName = this.mapTableName(model);\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(tableName)]),\n selections: this.getModelFields(modelDef).map((fieldDef) => {\n const columnName = this.mapFieldName(model, fieldDef.name);\n const columnRef = ReferenceNode.create(ColumnNode.create(columnName), TableNode.create(tableName));\n if (columnName !== fieldDef.name) {\n const aliased = AliasNode.create(columnRef, IdentifierNode.create(fieldDef.name));\n return SelectionNode.create(aliased);\n } else {\n return SelectionNode.create(columnRef);\n }\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: AliasNode | ColumnNode | ReferenceNode) {\n let alias: string | undefined;\n if (!AliasNode.is(node)) {\n alias = this.extractFieldName(node);\n }\n const result = super.transformNode(node);\n return this.wrapAlias(result, alias);\n }\n\n private processSelectAll(node: SelectAllNode) {\n const scope = this.modelScopes[this.modelScopes.length - 1];\n invariant(scope);\n\n if (!this.hasMappedColumns(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(scope.model, fieldDef.name);\n const columnRef = ReferenceNode.create(ColumnNode.create(columnName));\n return columnName !== fieldDef.name ? this.wrapAlias(columnRef, fieldDef.name) : columnRef;\n });\n }\n\n private extractFieldName(node: ReferenceNode | ColumnNode) {\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\n // #endregion\n}\n","import { invariant, lowerCaseFirst, upperCaseFirst } from '@zenstackhq/common-helpers';\nimport { sql, ValueNode, type Expression, type ExpressionBuilder } 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: ExpressionBuilder<any, any>, args: Expression<any>[]) => {\n const [field, search, caseInsensitive = false] = 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 const searchExpr = eb.fn('CONCAT', [sql.lit('%'), search, sql.lit('%')]);\n return eb(field, caseInsensitive ? 'ilike' : 'like', searchExpr);\n};\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: 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, 'like', eb.fn('CONCAT', [search, sql.lit('%')]));\n};\n\nexport const endsWith: 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, 'like', eb.fn('CONCAT', [sql.lit('%'), search]));\n};\n\nexport const has: 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 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: 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 isEmpty: ZModelFunction<any> = (\n eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { dialect }: ZModelFunctionContext<any>,\n) => {\n const [field] = args;\n if (!field) {\n throw new Error('\"field\" parameter is required');\n }\n return eb(dialect.buildArrayLength(eb, field), '=', sql.lit(0));\n};\n\nexport const now: ZModelFunction<any> = (\n eb: ExpressionBuilder<any, any>,\n _args: Expression<any>[],\n { dialect }: ZModelFunctionContext<any>,\n) => {\n return match(dialect.provider)\n .with('postgresql', () => eb.fn('now'))\n .with('sqlite', () => sql.raw('CURRENT_TIMESTAMP'))\n .exhaustive();\n};\n\nexport const currentModel: ZModelFunction<any> = (\n _eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { model }: ZModelFunctionContext<any>,\n) => {\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> = (\n _eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { operation }: ZModelFunctionContext<any>,\n) => {\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","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 const createEnum = tx.schema.createType(name).asEnum(Object.values(enumDef));\n await createEnum.execute();\n }\n }\n\n // sort models so that target of fk constraints are created first\n const sortedModels = this.sortModels(this.schema.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: Record<string, ModelDef>): ModelDef[] {\n const graph: [ModelDef, ModelDef | undefined][] = [];\n\n for (const model of Object.values(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.createTable(modelDef.name).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,\n modelDef.baseModel,\n baseModelDef.idFields,\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 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(`pk_${modelDef.name}`, modelDef.idFields);\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 table = table.addUniqueConstraint(`unique_${modelDef.name}_${key}`, [key]);\n } else {\n // multi-field constraint\n table = table.addUniqueConstraint(`unique_${modelDef.name}_${key}`, Object.keys(value));\n }\n }\n return table;\n }\n\n private createModelField(table: CreateTableBuilder<any>, fieldDef: FieldDef, modelDef: ModelDef) {\n return table.addColumn(fieldDef.name, 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 table = table.addForeignKeyConstraint(\n `fk_${model}_${fieldName}`,\n fieldDef.relation.fields,\n fieldDef.type,\n fieldDef.relation.references,\n (cb) => {\n if (fieldDef.relation?.onDelete) {\n cb = cb.onDelete(this.mapCascadeAction(fieldDef.relation.onDelete));\n }\n if (fieldDef.relation?.onUpdate) {\n cb = cb.onUpdate(this.mapCascadeAction(fieldDef.relation.onUpdate));\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<Schema extends SchemaDef, T>(\n callback: (txClient?: ClientContract<Schema>) => Promise<T>,\n): ZenStackPromise<Schema, T> {\n let promise: Promise<T> | undefined;\n const cb = (txClient?: ClientContract<Schema>) => {\n try {\n return (promise ??= valueToPromise(callback(txClient)));\n } catch (err) {\n // deal with synchronous errors\n return Promise.reject<T>(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 { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from './constants';\nimport { ensureArray, getField, getIdValues } from './query-utils';\n\nexport class ResultProcessor<Schema extends SchemaDef> {\n constructor(private readonly schema: Schema) {}\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.transformJson(value);\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.transformScalar(v, type)));\n return value;\n } else {\n return this.transformScalar(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 transformScalar(value: unknown, type: BuiltinType) {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return this.transformJson(value);\n } else {\n return match(type)\n .with('Boolean', () => this.transformBoolean(value))\n .with('DateTime', () => this.transformDate(value))\n .with('Bytes', () => this.transformBytes(value))\n .with('Decimal', () => this.transformDecimal(value))\n .with('BigInt', () => this.transformBigInt(value))\n .with('Json', () => this.transformJson(value))\n .otherwise(() => value);\n }\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 transformBigInt(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 transformBoolean(value: unknown) {\n return !!value;\n }\n\n private transformDate(value: unknown) {\n if (typeof value === 'number') {\n return new Date(value);\n } else if (typeof value === 'string') {\n return new Date(Date.parse(value));\n } else {\n return value;\n }\n }\n\n private transformBytes(value: unknown) {\n return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\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 private transformJson(value: unknown) {\n return match(this.schema.provider.type)\n .with('sqlite', () => {\n // better-sqlite3 returns JSON as string\n invariant(typeof value === 'string', 'Expected string, got ' + typeof value);\n return JSON.parse(value as string);\n })\n .otherwise(() => value);\n }\n}\n","import type { OperationNode, QueryResult, RootOperationNode, UnknownRow } from 'kysely';\nimport type { ClientContract, ToKysely } from '.';\nimport type { GetModels, SchemaDef } from '../schema';\nimport type { MaybePromise } from '../utils/type-utils';\nimport type { AllCrudOperation } from './crud/operations/base';\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 /**\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: string;\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 kysely: ToKysely<Schema>;\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","export { ZenStackClient } from './client-impl';\nexport type { ClientConstructor, ClientContract } from './contract';\nexport type * from './crud-types';\nexport * from './errors';\nexport type { ClientOptions } from './options';\nexport { definePlugin } from './plugin';\nexport type { ZenStackPromise } from './promise';\nexport type { ToKysely } from './query-builder';\nexport { sql } from 'kysely';\n"],"mappings":"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","names":["invariant","CompiledQuery","DefaultConnectionProvider","DefaultQueryExecutor","Kysely","Log","sql","Transaction","sql","match","match","ExpressionUtils","literal","value","kind","array","items","call","functionName","args","function","binary","left","op","right","unary","operand","field","member","receiver","members","_this","_null","and","expr","expressions","reduce","acc","exp","or","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","extractFields","obj","fields","Object","fromEntries","entries","filter","key","includes","fieldsToSelectObject","map","f","InputValidationError","Error","message","cause","QueryError","InternalError","NotFoundError","model","getModel","schema","model","models","requireModel","matchedName","Object","keys","find","k","toLowerCase","QueryError","getField","field","modelDef","fields","requireField","getIdFields","idFields","getRelationForeignKeyFieldPairs","schema","model","relationField","fieldDef","requireField","relation","InternalError","fields","references","keyPairs","map","f","i","fk","pk","ownedByModel","opposite","oppositeField","type","isScalarField","field","getField","foreignKeyFor","isForeignKeyField","isRelationField","isInheritedField","originModel","getUniqueFields","modelDef","requireModel","result","key","value","Object","entries","uniqueFields","push","name","def","defs","fromEntries","keys","k","getIdValues","data","idFields","getIdFields","reduce","acc","buildFieldRef","options","eb","modelAlias","inlineComputedField","computed","ref","computer","computedFields","QueryError","currentModel","fieldHasDefaultValue","default","undefined","updatedAt","isEnum","enums","getEnum","buildJoinPairs","relationModelAlias","makeDefaultOrderBy","getManyToManyRelation","array","oppositeFieldDef","sortedModelNames","sort","orderedFK","sortedFieldNames","parentFkName","otherModel","otherField","otherFkName","joinTable","flattenCompoundUniqueFilters","filter","compoundUniques","u","length","some","assign","ensureArray","Array","isArray","extractIdFields","entity","schema","model","idFields","getIdFields","extractFields","getDiscriminatorField","modelDef","requireModel","delegateAttr","attributes","find","attr","name","undefined","discriminator","args","arg","ExpressionUtils","isField","value","InternalError","field","getDelegateDescendantModels","collected","Set","subModels","Object","values","models","filter","m","baseModel","forEach","def","has","add","aggregate","eb","expr","op","match","with","fn","count","sum","avg","min","max","exhaustive","createId","invariant","isPlainObject","expressionBuilder","sql","nanoid","match","ulid","uuid","RejectedByPolicyError","Error","model","reason","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","FromNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","TableNode","UpdateQueryNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","sql","match","NUMERIC_FIELD_TYPES","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","invariant","isPlainObject","expressionBuilder","sql","match","P","enumerate","x","undefined","Array","isArray","BaseCrudDialect","schema","options","transformPrimitive","value","_type","_forArrayField","buildSelectModel","eb","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","sql","ref","QueryError","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","expressionBuilder","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","modelIdField","getIdFields","relationIdField","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","InternalError","isEnum","buildEnumFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","lhs","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","invariant","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","mode","prepStringCasing","v","useDefaultIfEmpty","negated","forEach","k","raw","negateSort","sort","nulls","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","fields","isRelationField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","computed","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","filter","selections","reduce","acc","fieldModel","fieldCountQuery","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","buildFieldRef","PostgresCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toString","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","joinedQuery","buildRelationJSON","select","qb","parentName","relationFieldDef","requireField","schema","relationModel","leftJoinLateral","eb","joinTableName","result","selectFrom","subQueryAlias","subQuery","buildSelectModel","buildSelectAllFields","omit","buildFilterSortTake","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","sql","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","objArgs","buildRelationObjectArgs","array","fn","coalesce","relationModelDef","requireModel","descendantModels","getDelegateDescendantModels","push","subModel","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","Object","entries","fields","filter","relation","field","fieldRef","subJson","buildCountJson","fieldDef","fieldValue","include","selectInclude","isRelationField","forEach","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","supportInsertWithDefault","invariant","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","Array","isArray","map","v","schema","typeDefs","JSON","stringify","match","with","Date","toISOString","toString","Buffer","from","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","selectFrom","subQueryAlias","subQuery","buildSelectModel","buildSelectAllFields","omit","buildFilterSortTake","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","objArgs","descendantModels","getDelegateDescendantModels","push","subModel","sql","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","Object","entries","fields","filter","relation","field","fieldRef","subJson","buildCountJson","fieldDef","include","array","fn","coalesce","join","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","supportInsertWithDefault","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","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","ColumnCollector","DefaultOperationNodeVisitor","columns","collect","node","visitNode","visitColumn","includes","column","name","push","invariant","AliasNode","BinaryOperationNode","ColumnNode","expressionBuilder","FromNode","FunctionNode","IdentifierNode","OperatorNode","ReferenceNode","SelectionNode","SelectQueryNode","TableNode","ValueListNode","ValueNode","WhereNode","match","invariant","match","ExpressionEvaluator","evaluate","expression","context","result","match","when","ExpressionUtils","isArray","expr","evaluateArray","isBinary","evaluateBinary","isField","evaluateField","isLiteral","evaluateLiteral","isMember","evaluateMember","isUnary","evaluateUnary","isCall","evaluateCall","isThis","thisValue","isNull","exhaustive","function","auth","Error","op","with","operand","val","receiver","member","members","value","field","items","map","item","evaluateCollectionPredicate","left","right","_right","invariant","Array","includes","some","every","AliasNode","AndNode","BinaryOperationNode","FunctionNode","OperatorNode","OrNode","ParensNode","ReferenceNode","TableNode","UnaryOperationNode","ValueNode","trueNode","dialect","ValueNode","createImmediate","transformPrimitive","falseNode","isTrueNode","node","is","value","isFalseNode","conjunction","nodes","some","items","filter","n","length","reduce","acc","OrNode","AndNode","create","ParensNode","disjunction","logicalNot","UnaryOperationNode","OperatorNode","buildIsFalse","node","dialect","isFalseNode","trueNode","isTrueNode","falseNode","BinaryOperationNode","create","FunctionNode","OperatorNode","getTableName","TableNode","is","table","identifier","name","AliasNode","ReferenceNode","undefined","expressionHandlers","Map","expr","kind","_target","_propertyKey","descriptor","get","set","ExpressionTransformer","dialect","schema","clientOptions","auth","getCrudDialect","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","thisEntity","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformOperator","invariant","isAuthMember","ExpressionEvaluator","evaluate","ExpressionUtils","isField","isMember","newContextModel","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","other","isNull","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","result","transformCall","toOperationNode","func","functions","function","QueryError","eb","expressionBuilder","args","arg","transformCallArg","operation","isLiteral","val","thisEntityRaw","ref","isCall","valNode","valueMemberAccess","_member","SelectQueryNode","receiverField","memberFields","currType","push","fromModel","currNode","i","length","ColumnNode","receiverType","fieldValue","relationModel","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","column","node","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","isMutationQueryNode","transformNode","mutationRequiresTransaction","mutationModel","getMutationModel","InsertQueryNode","is","constCondition","tryGetConstantPolicy","returning","enforcePreCreatePolicy","transformedNode","result","onlyReturningId","readBackResult","processReadBack","rows","length","idFields","getIdFields","collector","ColumnCollector","selectedColumns","collect","every","c","includes","columns","values","model","fields","map","column","name","valueRows","unwrapCreateValueRows","enforcePreCreatePolicyForOne","v","raw","valuesRaw","thisEntity","thisEntityRaw","i","filter","buildPolicyFilter","preCreateCheck","kind","selections","SelectionNode","create","AliasNode","IdentifierNode","$condition","ValuesNode","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","invariant","item","fieldDef","requireField","push","ValueNode","transformPrimitive","value","type","array","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","table","idConditions","buildIdConditions","policyFilter","select","from","FromNode","TableNode","where","WhereNode","conjunction","selectResult","disjunction","row","field","BinaryOperationNode","ColumnNode","OperatorNode","r","match","when","getTableName","into","UpdateQueryNode","DeleteQueryNode","froms","exhaustive","SelectQueryNode","alias","falseNode","allows","policy","transformPolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","transformSelectQuery","whereNode","forEach","extractResult","extractTableName","baseResult","transformInsertQuery","ReturningNode","transformUpdateQuery","transformDeleteQuery","identifier","inner","ExpressionTransformer","$auth","transform","auth","modelName","modelDef","requireModel","extractOperations","split","trim","attributes","attr","operations","args","PolicyPlugin","id","name","description","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle","isPlainObject","clone","value","Array","isArray","map","v","isPlainObject","result","key","Object","keys","TransactionIsolationLevel","BaseOperationHandler","dialect","client","model","inputValidator","getCrudDialect","schema","$options","$schema","options","kysely","$qb","withClient","hasPolicyEnabled","plugins","some","plugin","PolicyPlugin","requireModel","getModel","requireField","field","getField","exists","filter","idFields","getIdFields","_filter","flattenCompoundUniqueFilters","query","selectFrom","where","eb","and","select","map","f","dynamic","ref","limit","modifyEnd","makeContextComment","operation","executeQueryTakeFirst","read","args","buildSelectModel","expressionBuilder","buildFilterSortTake","buildFieldSelection","buildSelectAllFields","omit","include","result","queryId","createId","compiled","getExecutor","compileQuery","toOperationNode","r","executeQuery","rows","err","message","sql","QueryError","readUnique","take","selectOrInclude","parentAlias","payload","Object","entries","buildCountSelection","fieldDef","relation","buildSelectField","array","optional","originModel","buildRelationSelection","buildCountJson","as","create","data","fromRelation","creatingForDelegate","modelDef","isDelegate","createFields","parentUpdateTask","undefined","m2m","getManyToManyRelation","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","parentFkFields","buildFkAssignments","ids","assign","entity","updateTable","set","reduce","acc","fk","pk","postCreateRelations","value","isScalarField","isForeignKeyField","Array","isArray","transformPrimitive","type","subM2M","fields","references","fkValues","processOwnedRelationForCreate","i","length","subPayload","baseModel","baseCreateResult","processBaseModelCreate","remainingFields","updatedData","fillGeneratedValues","insertInto","$if","keys","qb","defaultValues","values","returning","createdEntity","relationPromises","processNoneOwnedRelationForCreate","Promise","all","handleManyToManyRelation","otherModel","otherField","joinTable","forModel","thisCreateFields","forEach","discriminatorField","getDiscriminatorField","invariant","baseEntity","idValues","extractIdFields","relationField","pair","action","leftModel","leftField","leftEntity","rightModel","rightField","rightEntity","sortedRecords","sort","a","b","localeCompare","firstIds","secondIds","A","B","onConflict","oc","columns","doNothing","execute","deleteFrom","resetManyToManyRelation","parentIds","parentId","parentFkName","relationModel","created","getIdValues","referencedPkFields","extractedFks","extractFields","relationEntity","fieldsToSelectObject","NotFoundError","found","contextModel","relationFieldName","parentEntity","relationFieldDef","tasks","fromRelationContext","push","enumerate","item","createMany","connectRelation","then","input","returnData","count","relationKeyPairs","createData","newItem","name","supportInsertWithDefault","allPassedFields","includes","default","skipDuplicates","processBaseModelCreateMany","remainingFieldRows","Number","numAffectedRows","createRows","thisCreateRows","baseEntities","clone","generated","evalGenerator","updatedAt","Date","defaultValue","ExpressionUtils","isCall","match","function","with","isLiteral","v7","v4","nanoid","ulid","otherwise","isMember","receiver","val","$auth","member","members","update","allowRelationUpdate","throwIfNotFound","InternalError","parentWhere","fromEntity","fromRelationFieldDef","opposite","combinedWhere","AND","finalData","fieldName","needIdRead","isIdFilter","readResult","makeIdSelect","baseUpdateResult","processBaseModelUpdate","updateFields","thisEntity","processScalarFieldUpdateData","processRelationUpdates","buildFilter","updatedEntity","isNumericIncrementalUpdate","transformIncrementalUpdate","transformScalarListUpdate","isNumericField","key","every","thisUpdateFields","fieldRef","ensureArray","NUMERIC_FIELD_TYPES","_context","updateMany","filterModel","isRelationField","shouldFallbackToIdFilter","supportsUpdateWithLimit","resultFromBaseModel","baseResult","processBaseModelUpdateMany","refTuple","buildIdFieldRefs","fieldModel","connectOrCreateRelation","disconnectRelation","setRelation","updated","deleteRelation","Error","_data","normalizeRelationManipulationInput","actions","d","getEntityIds","results","updateResult","target","or","existing","disconnectConditions","condition","fromEntries","fkConditions","not","throwForNotFound","deleteConditions","expectedDeleteCount","deleteResult","delete","OR","processBaseModelDelete","needIdFilter","supportsDeleteWithLimit","processDelegateRelationDelete","oppositeModelDef","oppositeRelation","onDelete","trimResult","needReturnRelations","returnRelation","K","v","safeTransaction","callback","isolationLevel","isTransaction","txBuilder","transaction","setIsolationLevel","TransactionIsolationLevel","RepeatableRead","uniqueFilter","k","normalizeArgs","newArgs","doNormalizeArgs","isPlainObject","makeQueryId","compile","executeQueryTakeFirstOrThrow","AggregateOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateAggregateArgs","model","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","eb1","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","sql","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","sql","CountOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateCountArgs","model","subQueryName","query","kysely","selectFrom","eb","subQuery","dialect","buildSelectModel","where","eb1","buildFilter","select","key","value","Object","entries","buildSelectField","lit","as","buildSkipTake","skip","take","keys","map","cast","fn","countAll","count","sql","ref","result","executeQuery","rows","match","CreateOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runCreate","inputValidator","validateCreateArgs","model","runCreateMany","validateCreateManyArgs","runCreateManyAndReturn","validateCreateManyAndReturnArgs","exhaustive","result","safeTransaction","tx","createResult","create","data","readUnique","select","include","omit","where","getIdValues","schema","hasPolicyEnabled","RejectedByPolicyError","undefined","count","createMany","kysely","read","OR","map","item","match","DeleteOperationHandler","BaseOperationHandler","handle","operation","args","normalizedArgs","normalizeArgs","match","with","runDelete","inputValidator","validateDeleteArgs","model","runDeleteMany","validateDeleteManyArgs","exhaustive","existing","readUnique","kysely","select","include","omit","where","NotFoundError","safeTransaction","tx","result","delete","count","limit","FindOperationHandler","BaseOperationHandler","handle","operation","args","validateArgs","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateFindArgs","model","result","read","client","$qb","finalResult","expressionBuilder","match","GroupByOperationHandler","BaseOperationHandler","handle","_operation","args","normalizedArgs","normalizeArgs","parsedArgs","inputValidator","validateGroupByArgs","model","query","kysely","selectFrom","eb","subQuery","selectAll","where","eb1","dialect","buildFilter","skip","take","negateOrderBy","undefined","buildSkipTake","buildOrderBy","as","fieldRef","field","expressionBuilder","bys","by","groupBy","map","orderBy","having","select","key","value","Object","entries","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","readBackResult","safeTransaction","tx","updateResult","update","where","data","readFilter","undefined","readUnique","select","include","omit","hasPolicyEnabled","RejectedByPolicyError","updateMany","limit","read","OR","map","item","getIdValues","schema","result","mutationResult","create","invariant","Decimal","stableStringify","match","P","z","InputValidator","schemaCache","Map","schema","validateFindArgs","model","unique","args","validate","options","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","operation","getSchema","cacheKey","stableStringify","get","set","error","safeParse","InputValidationError","message","fields","where","makeWhereSchema","optional","makeSelectSchema","makeIncludeSchema","makeOmitSchema","makeSkipSchema","makeTakeSchema","orArray","makeOrderBySchema","makeCursorSchema","makeDistinctSchema","result","z","strictObject","refineForSelectIncludeMutuallyExclusive","refineForSelectOmitMutuallyExclusive","makePrimitiveSchema","type","typeDefs","makeTypeDefSchema","match","with","string","number","int","boolean","union","bigint","instanceof","Decimal","date","datetime","Uint8Array","otherwise","unknown","key","typeDef","invariant","object","Object","fromEntries","entries","map","field","def","fieldSchema","array","passthrough","withoutRelationFields","withAggregations","modelDef","getModel","QueryError","keys","fieldDef","requireField","relation","lazy","nullableIf","some","every","none","is","isNot","enumDef","getEnum","length","makeEnumFilterSchema","makeArrayFilterSchema","makePrimitiveFilterSchema","uniqueFields","getUniqueFields","uniqueField","name","defs","never","custom","v","baseWhere","InternalError","required","refine","value","baseSchema","enum","components","makeCommonPrimitiveFilterComponents","equals","has","hasEvery","hasSome","isEmpty","makeTypeDefFilterSchema","makeStringFilterSchema","P","makeNumberFilterSchema","makeBooleanFilterSchema","makeDateTimeFilterSchema","makeBytesFilterSchema","any","exhaustive","_type","_optional","makeCommonPrimitiveFilterSchema","makeThis","supportedOperators","commonAggSchema","notEquals","in","notIn","lt","lte","gt","gte","not","includes","_count","_avg","_sum","_min","_max","extractFields","startsWith","endsWith","contains","providerSupportsCaseSensitivity","mode","makeStringModeSchema","literal","requireModel","makeRelationSelectIncludeSchema","toManyRelations","values","filter","select","reduce","acc","objSchema","include","omit","orderBy","skip","take","cursor","distinct","withRelation","WithAggregation","sort","relationOrderBy","extend","nulls","aggregationFields","agg","nonRelationFields","dataSchema","makeCreateDataSchema","data","makeCreateManyDataSchema","base","canBeArray","withoutFields","uncheckedVariantFields","checkedVariantFields","hasRelation","f","forEach","computed","isDelegateDiscriminator","excludeFields","oppositeField","opposite","push","oppositeFieldDef","makeRelationManipulationSchema","allFksOptional","fkDef","fieldHasDefaultValue","nullable","references","foreignKeyFor","originModel","discriminatorField","getDiscriminatorField","fieldType","create","connect","makeConnectDataSchema","connectOrCreate","makeConnectOrCreateDataSchema","makeDisconnectDataSchema","makeDeleteRelationDataSchema","makeUpdateDataSchema","update","makeSetDataSchema","toManyRelation","uniqueFilter","whereSchema","createSchema","skipDuplicates","limit","nonnegative","isNumericField","increment","decrement","multiply","divide","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","DefaultQueryExecutor","DeleteQueryNode","InsertQueryNode","ReturningNode","SelectionNode","SingleConnectionProvider","TableNode","UpdateQueryNode","WhereNode","match","invariant","AliasNode","IdentifierNode","stripAlias","node","AliasNode","is","invariant","IdentifierNode","alias","name","undefined","invariant","AliasNode","ColumnNode","FromNode","IdentifierNode","OperationNodeTransformer","ReferenceNode","SelectAllNode","SelectionNode","TableNode","QueryNameMapper","OperationNodeTransformer","modelToTableMap","Map","fieldToColumnMap","modelScopes","schema","modelName","modelDef","Object","entries","models","mappedName","getMappedName","set","fieldName","fieldDef","fields","transformSelectQuery","node","from","froms","scopes","createScopesFromFroms","withScopes","processFrom","transformInsertQuery","into","withScope","model","table","identifier","name","processTableRef","transformReturning","kind","selections","processSelections","transformJoin","alias","innerNode","stripAlias","TableNode","is","hasMappedColumns","select","createSelectAll","wrapAlias","transformReference","ColumnNode","column","scope","resolveFieldFromScopes","namesMapped","mappedFieldName","mapFieldName","mappedTableName","mapTableName","ReferenceNode","create","undefined","transformColumn","transformUpdateQuery","innerTable","transformDeleteQuery","map","transformNode","FromNode","qualifier","toReversed","getModel","pushScope","push","fn","pop","forEach","s","AliasNode","IdentifierNode","ensureAlias","fallbackName","def","mapAttr","attributes","find","attr","nameArg","args","arg","value","field","get","tableName","keys","some","key","startsWith","filter","transformFrom","selectAll","requireModel","getModelFields","columnName","columnRef","aliased","SelectionNode","values","f","relation","computed","originModel","result","selection","SelectAllNode","processed","processSelectAll","Array","isArray","processSelection","extractFieldName","length","invariant","transformSelectAll","ZenStackQueryExecutor","DefaultQueryExecutor","nameMapper","client","driver","compiler","adapter","connectionProvider","plugins","suppressMutationHooks","QueryNameMapper","$schema","kysely","$qb","options","$options","executeQuery","compiledQuery","queryId","queryParams","$raw","parameters","undefined","result","proceedQueryWithKyselyInterceptors","query","queryNode","proceed","q","proceedQuery","hooks","plugin","onKyselyQuery","push","bind","hook","_proceed","_p","r","hookResult","schema","getMutationInfo","model","getMutationModel","action","where","match","when","InsertQueryNode","is","UpdateQueryNode","node","DeleteQueryNode","exhaustive","compiled","provideConnection","connection","isMutationNode","hasEntityMutationPlugins","finalQuery","transformNode","compileQuery","hasEntityMutationPluginsWithAfterMutationHooks","returning","ReturningNode","create","SelectionNode","createSelectAll","currentlyInTx","isTransactionConnection","connectionClient","createClientForConnection","mutationInfo","beforeMutationEntities","loadBeforeMutationEntities","loadEntities","callBeforeMutationHooks","shouldCreateTx","hasPluginRequestingAfterMutationWithinTransaction","callAfterMutationHooks","registerTransactionCommitCallback","beginTransaction","isolationLevel","TransactionIsolationLevel","ReadCommitted","commitTransaction","err","rollbackTransaction","message","sql","QueryError","inTx","innerExecutor","withConnectionProvider","SingleConnectionProvider","innerClient","withExecutor","forceTransaction","some","onEntityMutation","afterEntityMutation","runAfterMutationWithinTransaction","withPlugin","withPlugins","withPluginAtFront","withoutPlugins","newExecutor","invariant","into","table","identifier","name","tableNode","stripAlias","TableNode","from","froms","length","otherwise","InternalError","beforeEntityMutation","queryResult","filterFor","mutationModel","loadAfterMutationEntities","rows","selectQuery","selectFrom","selectAll","selectQueryNode","toOperationNode","andNodes","condition1","condition2","WhereNode","AndNode","invariant","lowerCaseFirst","upperCaseFirst","sql","ValueNode","match","contains","eb","args","field","search","caseInsensitive","Error","searchExpr","fn","sql","lit","_eb","_args","startsWith","endsWith","has","hasEvery","hasSome","isEmpty","dialect","buildArrayLength","now","match","provider","with","raw","exhaustive","currentModel","model","result","casing","processCasing","currentOperation","operation","opNode","toOperationNode","invariant","ValueNode","is","value","toUpperCase","toLowerCase","upperCaseFirst","lowerCaseFirst","otherwise","invariant","sql","toposort","match","SchemaDbPusher","schema","kysely","push","transaction","execute","tx","enums","provider","type","name","enumDef","Object","entries","createEnum","createType","asEnum","values","sortedModels","sortModels","models","modelDef","createTable","createModelTable","graph","model","added","baseModel","baseDef","requireModel","field","fields","relation","references","targetModel","undefined","toposort","reverse","filter","m","table","ifNotExists","fieldName","fieldDef","originModel","id","addForeignKeyConstraint","isComputedField","createModelField","baseModelDef","idFields","cb","onDelete","onUpdate","addPrimaryKeyConstraint","addUniqueConstraint","attributes","some","a","length","f","key","value","uniqueFields","invariant","unique","keys","addColumn","mapFieldType","col","primaryKey","default","ExpressionUtils","isCall","function","defaultTo","sql","optional","array","notNull","isAutoIncrement","autoIncrement","ref","isCustomType","result","match","with","otherwise","Error","raw","typeDefs","def","mapCascadeAction","action","exhaustive","createZenStackPromise","callback","promise","cb","txClient","valueToPromise","err","Promise","reject","then","onFulfilled","onRejected","catch","finally","onFinally","Symbol","toStringTag","thing","resolve","invariant","Decimal","match","ResultProcessor","schema","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","transformJson","subModel","slice","length","idValues","getIdValues","values","some","v","processedSubRow","assign","fieldDef","getField","array","relation","processRelation","processFieldValue","type","transformScalar","relationData","typeDefs","match","with","transformBoolean","transformDate","transformBytes","transformDecimal","transformBigInt","otherwise","Decimal","invariant","BigInt","Date","Buffer","isBuffer","Uint8Array","from","take","reverse","selectInclude","include","select","ensureArray","field","provider","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","QueryError","procOptions","Error","apply","$disconnect","destroy","$pushSchema","SchemaDbPusher","$use","plugin","newPlugins","plugins","newOptions","$unuse","pluginId","id","$unuseAll","$setAuth","undefined","newClient","$auth","$executeRaw","query","values","createZenStackPromise","sql","Number","numAffectedRows","$executeRawUnsafe","compiledQuery","createRawCompiledQuery","executeQuery","$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","NotFoundError","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","sql"]}
|