@zenstackhq/runtime 3.0.0-beta.7 → 3.0.0-beta.9

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/plugins/policy/errors.ts","../../../src/plugins/policy/functions.ts","../../../src/client/contract.ts","../../../src/client/kysely-utils.ts","../../../src/client/query-utils.ts","../../../src/schema/expression.ts","../../../src/client/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-dialect.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"],"sourcesContent":["/**\n * Reason code for policy rejection.\n */\nexport enum RejectedByPolicyReason {\n /**\n * Rejected because the operation is not allowed by policy.\n */\n NO_ACCESS = 'no-access',\n\n /**\n * Rejected because the result cannot be read back after mutation due to policy.\n */\n CANNOT_READ_BACK = 'cannot-read-back',\n\n /**\n * Other reasons.\n */\n OTHER = 'other',\n}\n\n/**\n * 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: RejectedByPolicyReason = RejectedByPolicyReason.NO_ACCESS,\n message?: string,\n ) {\n super(message ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { ExpressionWrapper, ValueNode, type Expression, type ExpressionBuilder } from 'kysely';\nimport { CRUD } from '../../client/contract';\nimport { extractFieldName } from '../../client/kysely-utils';\nimport type { ZModelFunction, ZModelFunctionContext } from '../../client/options';\nimport { buildJoinPairs, requireField } from '../../client/query-utils';\nimport { PolicyHandler } from './policy-handler';\n\n/**\n * Relation checker implementation.\n */\nexport const check: ZModelFunction<any> = (\n eb: ExpressionBuilder<any, any>,\n args: Expression<any>[],\n { client, model, modelAlias, operation }: ZModelFunctionContext<any>,\n) => {\n invariant(args.length === 1 || args.length === 2, '\"check\" function requires 1 or 2 arguments');\n\n const arg1Node = args[0]!.toOperationNode();\n\n const arg2Node = args.length === 2 ? args[1]!.toOperationNode() : undefined;\n if (arg2Node) {\n invariant(\n ValueNode.is(arg2Node) && typeof arg2Node.value === 'string',\n '\"operation\" parameter must be a string literal when provided',\n );\n invariant(\n CRUD.includes(arg2Node.value as CRUD),\n '\"operation\" parameter must be one of \"create\", \"read\", \"update\", \"delete\"',\n );\n }\n\n // first argument must be a field reference\n const fieldName = extractFieldName(arg1Node);\n invariant(fieldName, 'Failed to extract field name from the first argument of \"check\" function');\n const fieldDef = requireField(client.$schema, model, fieldName);\n invariant(fieldDef.relation, `Field \"${fieldName}\" is not a relation field in model \"${model}\"`);\n invariant(!fieldDef.array, `Field \"${fieldName}\" is a to-many relation, which is not supported by \"check\"`);\n const relationModel = fieldDef.type;\n\n const op = arg2Node ? (arg2Node.value as CRUD) : operation;\n\n const policyHandler = new PolicyHandler(client);\n\n // join with parent model\n const joinPairs = buildJoinPairs(client.$schema, model, modelAlias, fieldName, relationModel);\n const joinCondition =\n joinPairs.length === 1\n ? eb(eb.ref(joinPairs[0]![0]), '=', eb.ref(joinPairs[0]![1]))\n : eb.and(joinPairs.map(([left, right]) => eb(eb.ref(left), '=', eb.ref(right))));\n\n // policy condition of the related model\n const policyCondition = policyHandler.buildPolicyFilter(relationModel, undefined, op);\n\n // build the final nested select that evaluates the policy condition\n const result = eb\n .selectFrom(relationModel)\n .where(joinCondition)\n .select(new ExpressionWrapper(policyCondition).as('$condition'));\n\n return result;\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/**\n * CRUD operations.\n */\nexport const CRUD = ['create', 'read', 'update', 'delete'] as const;\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 OperationNode, AliasNode, ColumnNode, ReferenceNode, TableNode } 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 return { alias: node.alias, node: node.node };\n } else {\n return { alias: undefined, node };\n }\n}\n\n/**\n * Extracts model name from an OperationNode.\n */\nexport function extractModelName(node: OperationNode) {\n const { node: innerNode } = stripAlias(node);\n return TableNode.is(innerNode!) ? innerNode!.table.identifier.name : undefined;\n}\n\n/**\n * Extracts field name from an OperationNode.\n */\nexport function extractFieldName(node: OperationNode) {\n if (ReferenceNode.is(node) && ColumnNode.is(node.column)) {\n return node.column.column.name;\n } else if (ColumnNode.is(node)) {\n return node.column.name;\n } else {\n return undefined;\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport 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 Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());\n}\n\nexport function getTypeDef(schema: SchemaDef, type: string) {\n return schema.typeDefs?.[type];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n const modelDef = getModel(schema, model);\n if (!modelDef) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\n return modelDef;\n}\n\nexport function getField(schema: SchemaDef, model: string, field: string) {\n const modelDef = getModel(schema, model);\n return modelDef?.fields[field];\n}\n\nexport function requireField(schema: SchemaDef, modelOrType: string, field: string) {\n const modelDef = getModel(schema, modelOrType);\n if (modelDef) {\n if (!modelDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in model \"${modelOrType}\"`);\n } else {\n return modelDef.fields[field];\n }\n }\n const typeDef = getTypeDef(schema, modelOrType);\n if (typeDef) {\n if (!typeDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in type \"${modelOrType}\"`);\n } else {\n return typeDef.fields[field];\n }\n }\n throw new QueryError(`Model or type \"${modelOrType}\" not found in schema`);\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n const modelDef = getModel(schema, model);\n return modelDef?.idFields;\n}\n\nexport function requireIdFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result = modelDef?.idFields;\n if (!result) {\n throw 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, { 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 = requireIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.array || !fieldDef.relation?.opposite) {\n return undefined;\n }\n 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 const modelIdFields = requireIdFields(schema, model);\n invariant(modelIdFields.length === 1, 'Only single-field ID is supported for many-to-many relation');\n const otherIdFields = requireIdFields(schema, fieldDef.type);\n invariant(otherIdFields.length === 1, 'Only single-field ID is supported for many-to-many relation');\n\n return {\n parentFkName: orderedFK[0],\n parentPKName: modelIdFields[0]!,\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: orderedFK[1],\n otherPKName: otherIdFields[0]!,\n joinTable: fieldDef.relation.name\n ? `_${fieldDef.relation.name}`\n : `_${sortedModelNames[0]}To${sortedModelNames[1]}`,\n };\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`\n */\nexport function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) {\n if (typeof filter !== 'object' || !filter) {\n return filter;\n }\n\n const uniqueFields = getUniqueFields(schema, model);\n const compoundUniques = uniqueFields.filter((u) => 'defs' in u);\n if (compoundUniques.length === 0) {\n return filter;\n }\n\n const 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 = requireIdFields(schema, model);\n return extractFields(entity, idFields);\n}\n\nexport function getDiscriminatorField(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n if (!delegateAttr) {\n return undefined;\n }\n const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n throw 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 not: (expr: Expression) => {\n return ExpressionUtils.unary('!', 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 getLiteralValue: (expr: Expression): string | number | boolean | undefined => {\n return ExpressionUtils.isLiteral(expr) ? expr.value : undefined;\n },\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, details?: string) {\n super(`Entity not found for model \"${model}\"${details ? `: ${details}` : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n expressionBuilder,\n ExpressionWrapper,\n FromNode,\n FunctionNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n OperationNodeTransformer,\n OperatorNode,\n ParensNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n sql,\n TableNode,\n UpdateQueryNode,\n ValueListNode,\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-dialect';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getManyToManyRelation, requireField, requireIdFields, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError, RejectedByPolicyReason } 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(\n undefined,\n RejectedByPolicyReason.OTHER,\n 'non-CRUD queries are not allowed',\n );\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed with read directly\n return proceed(this.transformNode(node));\n }\n\n const { mutationModel } = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // pre-create policy evaluation happens before execution of the query\n const isManyToManyJoinTable = this.isManyToManyJoinTable(mutationModel);\n let needCheckPreCreate = true;\n\n // many-to-many join table is not a model so can't have policies on it\n if (!isManyToManyJoinTable) {\n // check constant policies\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === true) {\n needCheckPreCreate = false;\n } else if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n }\n }\n\n if (needCheckPreCreate) {\n await this.enforcePreCreatePolicy(node, mutationModel, isManyToManyJoinTable, proceed);\n }\n }\n\n // proceed with query\n\n const result = await proceed(this.transformNode(node));\n\n if (!node.returning || this.onlyReturningId(node)) {\n return result;\n } else {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(\n mutationModel,\n RejectedByPolicyReason.CANNOT_READ_BACK,\n 'result is not allowed to be read back',\n );\n }\n return readBackResult;\n }\n }\n\n // #region overrides\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = this.transformNode(node.where);\n\n // get combined policy filter for all froms, and merge into where clause\n const policyFilter = this.createPolicyFilterForFrom(node.from);\n if (policyFilter) {\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, policyFilter]) : policyFilter,\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 transformJoin(node: JoinNode) {\n const table = this.extractTableName(node.table);\n if (!table) {\n // unable to extract table name, can be a subquery, which will be handled when nested transformation happens\n return super.transformJoin(node);\n }\n\n // build a nested query with policy filter applied\n const filter = this.buildPolicyFilter(table.model, table.alias, 'read');\n const nestedSelect: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([node.table]),\n selections: [SelectionNode.createSelectAll()],\n where: WhereNode.create(filter),\n };\n return {\n ...node,\n table: AliasNode.create(ParensNode.create(nestedSelect), IdentifierNode.create(table.alias ?? table.model)),\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n // pre-insert check is done in `handle()`\n\n let onConflict = node.onConflict;\n\n if (onConflict?.updates) {\n // for \"on conflict do update\", we need to apply policy filter to the \"where\" clause\n const { mutationModel, alias } = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, alias, 'update');\n if (onConflict.updateWhere) {\n onConflict = {\n ...onConflict,\n updateWhere: WhereNode.create(conjunction(this.dialect, [onConflict.updateWhere.where, filter])),\n };\n } else {\n onConflict = {\n ...onConflict,\n updateWhere: WhereNode.create(filter),\n };\n }\n }\n\n // merge updated onConflict\n const processedNode = onConflict ? { ...node, onConflict } : node;\n\n const result = super.transformInsertQuery(processedNode);\n\n if (!node.returning) {\n return result;\n }\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 { mutationModel } = this.getMutationModel(node);\n const idFields = requireIdFields(this.client.$schema, mutationModel);\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, alias } = this.getMutationModel(node);\n let filter = this.buildPolicyFilter(mutationModel, alias, 'update');\n\n if (node.from) {\n // for update with from (join), we need to merge join tables' policy filters to the \"where\" clause\n const joinFilter = this.createPolicyFilterForFrom(node.from);\n if (joinFilter) {\n filter = conjunction(this.dialect, [filter, joinFilter]);\n }\n }\n\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, alias } = this.getMutationModel(node);\n let filter = this.buildPolicyFilter(mutationModel, alias, 'delete');\n\n if (node.using) {\n // for delete with using (join), we need to merge join tables' policy filters to the \"where\" clause\n const joinFilter = this.createPolicyFilterForTables(node.using.tables);\n if (joinFilter) {\n filter = conjunction(this.dialect, [filter, joinFilter]);\n }\n }\n\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n // #endregion\n\n // #region helpers\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const { mutationModel } = this.getMutationModel(node);\n const idFields = requireIdFields(this.client.$schema, mutationModel);\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(\n node: InsertQueryNode,\n mutationModel: GetModels<Schema>,\n isManyToManyJoinTable: boolean,\n proceed: ProceedKyselyQueryFunction,\n ) {\n const fields = node.columns?.map((c) => c.column.name) ?? [];\n const valueRows = node.values\n ? this.unwrapCreateValueRows(node.values, mutationModel, fields, isManyToManyJoinTable)\n : [[]];\n for (const values of valueRows) {\n if (isManyToManyJoinTable) {\n await this.enforcePreCreatePolicyForManyToManyJoinTable(\n mutationModel,\n fields,\n values.map((v) => v.node),\n proceed,\n );\n } else {\n await this.enforcePreCreatePolicyForOne(\n mutationModel,\n fields,\n values.map((v) => v.node),\n proceed,\n );\n }\n }\n }\n\n private async enforcePreCreatePolicyForManyToManyJoinTable(\n tableName: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const m2m = this.resolveManyToManyJoinTable(tableName);\n invariant(m2m);\n\n // m2m create requires both sides to be updatable\n invariant(fields.includes('A') && fields.includes('B'), 'many-to-many join table must have A and B fk fields');\n\n const aIndex = fields.indexOf('A');\n const aNode = values[aIndex]!;\n const bIndex = fields.indexOf('B');\n const bNode = values[bIndex]!;\n invariant(ValueNode.is(aNode) && ValueNode.is(bNode), 'A and B values must be ValueNode');\n\n const aValue = aNode.value;\n const bValue = bNode.value;\n invariant(aValue !== null && aValue !== undefined, 'A value cannot be null or undefined');\n invariant(bValue !== null && bValue !== undefined, 'B value cannot be null or undefined');\n\n const eb = expressionBuilder<any, any>();\n\n const filterA = this.buildPolicyFilter(m2m.firstModel as GetModels<Schema>, undefined, 'update');\n const queryA = eb\n .selectFrom(m2m.firstModel)\n .where(eb(eb.ref(`${m2m.firstModel}.${m2m.firstIdField}`), '=', aValue))\n .select(() => new ExpressionWrapper(filterA).as('$t'));\n\n const filterB = this.buildPolicyFilter(m2m.secondModel as GetModels<Schema>, undefined, 'update');\n const queryB = eb\n .selectFrom(m2m.secondModel)\n .where(eb(eb.ref(`${m2m.secondModel}.${m2m.secondIdField}`), '=', bValue))\n .select(() => new ExpressionWrapper(filterB).as('$t'));\n\n // select both conditions in one query\n const queryNode: SelectQueryNode = {\n kind: 'SelectQueryNode',\n selections: [\n SelectionNode.create(AliasNode.create(queryA.toOperationNode(), IdentifierNode.create('$conditionA'))),\n SelectionNode.create(AliasNode.create(queryB.toOperationNode(), IdentifierNode.create('$conditionB'))),\n ],\n };\n\n const result = await proceed(queryNode);\n if (!result.rows[0]?.$conditionA) {\n throw new RejectedByPolicyError(\n m2m.firstModel as GetModels<Schema>,\n RejectedByPolicyReason.CANNOT_READ_BACK,\n `many-to-many relation participant model \"${m2m.firstModel}\" not updatable`,\n );\n }\n if (!result.rows[0]?.$conditionB) {\n throw new RejectedByPolicyError(\n m2m.secondModel as GetModels<Schema>,\n RejectedByPolicyReason.NO_ACCESS,\n `many-to-many relation participant model \"${m2m.secondModel}\" not updatable`,\n );\n }\n }\n\n private async enforcePreCreatePolicyForOne(\n model: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const allFields = Object.entries(requireModel(this.client.$schema, model).fields).filter(\n ([, def]) => !def.relation,\n );\n const allValues: OperationNode[] = [];\n\n for (const [name, _def] of allFields) {\n const index = fields.indexOf(name);\n if (index >= 0) {\n allValues.push(values[index]!);\n } else {\n // set non-provided fields to null\n allValues.push(ValueNode.createImmediate(null));\n }\n }\n\n // create a `SELECT column1 as field1, column2 as field2, ... FROM (VALUES (...))` table for policy evaluation\n const eb = expressionBuilder<any, any>();\n\n const constTable: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([\n AliasNode.create(\n ParensNode.create(ValuesNode.create([ValueListNode.create(allValues)])),\n IdentifierNode.create('$t'),\n ),\n ]),\n selections: allFields.map(([name, def], index) => {\n const castedColumnRef =\n sql`CAST(${eb.ref(`column${index + 1}`)} as ${sql.raw(this.dialect.getFieldSqlType(def))})`.as(\n name,\n );\n return SelectionNode.create(castedColumnRef.toOperationNode());\n }),\n };\n\n const filter = this.buildPolicyFilter(model, undefined, 'create');\n\n const preCreateCheck: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([AliasNode.create(constTable, IdentifierNode.create(model))]),\n selections: [\n SelectionNode.create(\n AliasNode.create(\n BinaryOperationNode.create(\n FunctionNode.create('COUNT', [ValueNode.createImmediate(1)]),\n OperatorNode.create('>'),\n ValueNode.createImmediate(0),\n ),\n IdentifierNode.create('$condition'),\n ),\n ),\n ],\n where: WhereNode.create(filter),\n };\n\n const result = await proceed(preCreateCheck);\n if (!result.rows[0]?.$condition) {\n throw new RejectedByPolicyError(model);\n }\n }\n\n private unwrapCreateValueRows(\n node: OperationNode,\n model: GetModels<Schema>,\n fields: string[],\n isManyToManyJoinTable: boolean,\n ) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields, isManyToManyJoinTable));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields, isManyToManyJoinTable)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(\n data: readonly unknown[],\n model: GetModels<Schema>,\n fields: string[],\n isImplicitManyToManyJoinTable: boolean,\n ) {\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 if (typeof item === 'object' && item && 'kind' in item) {\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\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 let value: unknown = item;\n\n // many-to-many join table is not a model so we don't have field definitions,\n // but there's no need to transform values anyway because they're the fields\n // are all foreign keys\n if (!isImplicitManyToManyJoinTable) {\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n }\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 { mutationModel } = this.getMutationModel(node);\n const idConditions = this.buildIdConditions(mutationModel, result.rows);\n const policyFilter = this.buildPolicyFilter(mutationModel, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(mutationModel)]),\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 = requireIdFields(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) => ({\n mutationModel: getTableName(node.into) as GetModels<Schema>,\n alias: undefined,\n }))\n .when(UpdateQueryNode.is, (node) => {\n if (!node.table) {\n throw new QueryError('Update query must have a table');\n }\n const r = this.extractTableName(node.table);\n return r ? { mutationModel: r.model, alias: r.alias } : undefined;\n })\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new QueryError('Only one from table is supported for delete');\n }\n const r = this.extractTableName(node.from.froms[0]!);\n return r ? { mutationModel: r.model, alias: r.alias } : undefined;\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 buildPolicyFilter(model: GetModels<Schema>, alias: string | undefined, operation: CRUD) {\n // first check if it's a many-to-many join table, and if so, handle specially\n const m2mFilter = this.getModelPolicyFilterForManyToManyJoinTable(model, alias, operation);\n if (m2mFilter) {\n return m2mFilter;\n }\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.compilePolicyCondition(model, alias, operation, policy));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.compilePolicyCondition(model, alias, operation, policy));\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 private extractTableName(node: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(node)) {\n return { model: node.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(node)) {\n const inner = this.extractTableName(node.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(node.alias) ? node.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 createPolicyFilterForFrom(node: FromNode | undefined) {\n if (!node) {\n return undefined;\n }\n return this.createPolicyFilterForTables(node.froms);\n }\n\n private createPolicyFilterForTables(tables: readonly OperationNode[]) {\n return tables.reduce<OperationNode | undefined>((acc, table) => {\n const extractResult = this.extractTableName(table);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n return acc ? conjunction(this.dialect, [acc, filter]) : filter;\n }\n return acc;\n }, undefined);\n }\n\n private compilePolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n ) {\n return new ExpressionTransformer(this.client).transform(policy.condition, {\n model,\n alias,\n operation,\n auth: this.client.$auth,\n });\n }\n\n private getModelPolicies(model: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, model);\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 private resolveManyToManyJoinTable(tableName: string) {\n for (const model of Object.values(this.client.$schema.models)) {\n for (const field of Object.values(model.fields)) {\n const m2m = getManyToManyRelation(this.client.$schema, model.name, field.name);\n if (m2m?.joinTable === tableName) {\n const sortedRecord = [\n {\n model: model.name,\n field: field.name,\n },\n {\n model: m2m.otherModel,\n field: m2m.otherField,\n },\n ].sort(this.manyToManySorter);\n\n const firstIdFields = requireIdFields(this.client.$schema, sortedRecord[0]!.model);\n const secondIdFields = requireIdFields(this.client.$schema, sortedRecord[1]!.model);\n invariant(\n firstIdFields.length === 1 && secondIdFields.length === 1,\n 'only single-field id is supported for implicit many-to-many join table',\n );\n\n return {\n firstModel: sortedRecord[0]!.model,\n firstField: sortedRecord[0]!.field,\n firstIdField: firstIdFields[0]!,\n secondModel: sortedRecord[1]!.model,\n secondField: sortedRecord[1]!.field,\n secondIdField: secondIdFields[0]!,\n };\n }\n }\n }\n return undefined;\n }\n\n private manyToManySorter(a: { model: string; field: string }, b: { model: string; field: string }): number {\n // the implicit m2m join table's \"A\", \"B\" fk fields' order is determined\n // by model name's sort order, and when identical (for self-relations),\n // field name's sort order\n return a.model !== b.model ? a.model.localeCompare(b.model) : a.field.localeCompare(b.field);\n }\n\n private isManyToManyJoinTable(tableName: string) {\n return !!this.resolveManyToManyJoinTable(tableName);\n }\n\n private getModelPolicyFilterForManyToManyJoinTable(\n tableName: string,\n alias: string | undefined,\n operation: PolicyOperation,\n ): OperationNode | undefined {\n const m2m = this.resolveManyToManyJoinTable(tableName);\n if (!m2m) {\n return undefined;\n }\n\n // join table's permission:\n // - read: requires both sides to be readable\n // - mutation: requires both sides to be updatable\n\n const checkForOperation = operation === 'read' ? 'read' : 'update';\n const eb = expressionBuilder<any, any>();\n const joinTable = alias ?? tableName;\n\n const aQuery = eb\n .selectFrom(m2m.firstModel)\n .whereRef(`${m2m.firstModel}.${m2m.firstIdField}`, '=', `${joinTable}.A`)\n .select(() =>\n new ExpressionWrapper(\n this.buildPolicyFilter(m2m.firstModel as GetModels<Schema>, undefined, checkForOperation),\n ).as('$conditionA'),\n );\n\n const bQuery = eb\n .selectFrom(m2m.secondModel)\n .whereRef(`${m2m.secondModel}.${m2m.secondIdField}`, '=', `${joinTable}.B`)\n .select(() =>\n new ExpressionWrapper(\n this.buildPolicyFilter(m2m.secondModel as GetModels<Schema>, undefined, checkForOperation),\n ).as('$conditionB'),\n );\n\n return eb.and([aQuery, bQuery]).toOperationNode();\n }\n\n // #endregion\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base-dialect';\nimport { PostgresCrudDialect } from './postgresql';\nimport { SqliteCrudDialect } from './sqlite';\n\nexport function getCrudDialect<Schema extends SchemaDef>(\n schema: Schema,\n options: ClientOptions<Schema>,\n): BaseCrudDialect<Schema> {\n return match(schema.provider.type)\n .with('sqlite', () => new SqliteCrudDialect(schema, options))\n .with('postgresql', () => new PostgresCrudDialect(schema, options))\n .exhaustive();\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport Decimal from 'decimal.js';\nimport {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} 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 { QueryError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n constructor(schema: Schema, options: ClientOptions<Schema>) {\n super(schema, options);\n }\n\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n 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\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\n }\n\n override transformOutput(value: unknown, type: BuiltinType) {\n if (value === null || value === undefined) {\n return value;\n }\n return match(type)\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Decimal', () => this.transformDecimal(value))\n .otherwise(() => super.transformOutput(value, type));\n }\n\n private transformOutputBigInt(value: unknown) {\n if (typeof value === 'bigint') {\n return value;\n }\n invariant(\n typeof value === 'string' || typeof value === 'number',\n `Expected string or number, got ${typeof value}`,\n );\n return BigInt(value);\n }\n\n private transformDecimal(value: unknown) {\n if (value instanceof Decimal) {\n return value;\n }\n invariant(\n typeof value === 'string' || typeof value === 'number' || value instanceof Decimal,\n `Expected string, number or Decimal, got ${typeof value}`,\n );\n return new Decimal(value);\n }\n\n private transformOutputDate(value: unknown) {\n if (typeof value === 'string') {\n return new Date(value);\n } else if (value instanceof Date && this.options.fixPostgresTimezone !== false) {\n // SPECIAL NOTES:\n // node-pg has a terrible quirk that it returns the date value in local timezone\n // as a `Date` object although for `DateTime` field the data in DB is stored in UTC\n // see: https://github.com/brianc/node-postgres/issues/429\n return new Date(value.getTime() - value.getTimezoneOffset() * 60 * 1000);\n } else {\n return value;\n }\n }\n\n private transformOutputBytes(value: unknown) {\n return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const relationResultName = `${parentAlias}$${relationField}`;\n const joinedQuery = this.buildRelationJSON(\n model,\n query,\n relationField,\n parentAlias,\n payload,\n relationResultName,\n );\n return joinedQuery.select(`${relationResultName}.$data as ${relationField}`);\n }\n\n private buildRelationJSON(\n model: string,\n qb: SelectQueryBuilder<any, any, any>,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n resultName: string,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n\n return qb.leftJoinLateral(\n (eb) => {\n const relationSelectName = `${resultName}$sub`;\n const relationModelDef = requireModel(this.schema, relationModel);\n\n let tbl: SelectQueryBuilder<any, any, any>;\n\n if (this.canJoinWithoutNestedSelect(relationModelDef, payload)) {\n // build join directly\n tbl = this.buildModelSelect(eb, relationModel, relationSelectName, payload, false);\n\n // parent join filter\n tbl = this.buildRelationJoinFilter(\n tbl,\n model,\n relationField,\n relationModel,\n relationSelectName,\n parentAlias,\n );\n } else {\n // join with a nested query\n tbl = eb.selectFrom(() => {\n let subQuery = this.buildModelSelect(\n eb,\n relationModel,\n `${relationSelectName}$t`,\n payload,\n true,\n );\n\n // parent join filter\n subQuery = this.buildRelationJoinFilter(\n subQuery,\n model,\n relationField,\n relationModel,\n `${relationSelectName}$t`,\n parentAlias,\n );\n\n return subQuery.as(relationSelectName);\n });\n }\n\n // select relation result\n tbl = this.buildRelationObjectSelect(\n relationModel,\n relationSelectName,\n relationFieldDef,\n tbl,\n payload,\n resultName,\n );\n\n // add nested joins for each relation\n tbl = this.buildRelationJoins(tbl, relationModel, relationSelectName, payload, resultName);\n\n // alias the join table\n return tbl.as(resultName);\n },\n (join) => join.onTrue(),\n );\n }\n\n private buildRelationJoinFilter(\n query: SelectQueryBuilder<any, any, {}>,\n model: string,\n relationField: string,\n relationModel: GetModels<Schema>,\n relationModelAlias: string,\n parentAlias: string,\n ) {\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n if (m2m) {\n // many-to-many relation\n const parentIds = requireIdFields(this.schema, model);\n const relationIds = requireIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n query = query.where((eb) =>\n eb(\n eb.ref(`${relationModelAlias}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(`${parentAlias}.${parentIds[0]}`, '=', `${m2m.joinTable}.${m2m.parentFkName}`),\n ),\n );\n } else {\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, relationField, relationModelAlias);\n query = query.where((eb) =>\n this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))),\n );\n }\n return query;\n }\n\n private buildRelationObjectSelect(\n relationModel: string,\n relationModelAlias: string,\n relationFieldDef: FieldDef,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentResultName: string,\n ) {\n qb = qb.select((eb) => {\n const objArgs = this.buildRelationObjectArgs(\n relationModel,\n relationModelAlias,\n eb,\n payload,\n parentResultName,\n );\n\n if (relationFieldDef.array) {\n return eb.fn\n .coalesce(sql`jsonb_agg(jsonb_build_object(${sql.join(objArgs)}))`, sql`'[]'::jsonb`)\n .as('$data');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$data');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationModelAlias: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentResultName: string,\n ) {\n const relationModelDef = requireModel(this.schema, relationModel);\n const objArgs: Array<\n string | ExpressionWrapper<any, any, any> | SelectQueryBuilder<any, any, any> | RawBuilder<any>\n > = [];\n\n const descendantModels = getDelegateDescendantModels(this.schema, relationModel);\n if (descendantModels.length > 0) {\n // select all JSONs built from delegate descendants\n objArgs.push(\n ...descendantModels\n .map((subModel) => [\n sql.lit(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n eb.ref(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n ])\n .flatMap((v) => v),\n );\n }\n\n if (payload === true || !payload.select) {\n // select all scalar fields\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 relationModelAlias,\n value,\n );\n return [sql.lit(field), subJson];\n } else {\n const fieldDef = requireField(this.schema, relationModel, field);\n const fieldValue = fieldDef.relation\n ? // reference the synthesized JSON field\n eb.ref(`${parentResultName}$${field}.$data`)\n : // reference a plain field\n this.fieldRef(relationModel, field, eb, relationModelAlias, false);\n return [sql.lit(field), fieldValue];\n }\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field]) => [\n sql.lit(field),\n // reference the synthesized JSON field\n eb.ref(`${parentResultName}$${field}.$data`),\n ])\n .flatMap((v) => v),\n );\n }\n return objArgs;\n }\n\n private buildRelationJoins(\n query: SelectQueryBuilder<any, any, any>,\n relationModel: string,\n relationModelAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentResultName: string,\n ) {\n let result = query;\n if (typeof payload === 'object') {\n const selectInclude = payload.include ?? payload.select;\n if (selectInclude && typeof selectInclude === 'object') {\n Object.entries<any>(selectInclude)\n .filter(([, value]) => value)\n .filter(([field]) => isRelationField(this.schema, relationModel, field))\n .forEach(([field, value]) => {\n result = this.buildRelationJSON(\n relationModel,\n result,\n field,\n relationModelAlias,\n value,\n `${parentResultName}$${field}`,\n );\n });\n }\n }\n return result;\n }\n\n override buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ) {\n if (take !== undefined) {\n query = query.limit(take);\n }\n if (skip !== undefined) {\n query = query.offset(skip);\n }\n return query;\n }\n\n override buildJsonObject(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 override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw new QueryError('Cannot get SQL type of a relation field');\n }\n\n let result: string;\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are treated as text\n result = 'text';\n } else {\n result = match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'bigint')\n .with('Float', () => 'double precision')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'timestamp')\n .with('Bytes', () => 'bytea')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text');\n }\n\n if (fieldDef.array) {\n result += '[]';\n }\n\n return result;\n }\n\n override getStringCasingBehavior() {\n // Postgres `LIKE` is case-sensitive, `ILIKE` is case-insensitive\n return { supportsILike: true, likeCaseSensitive: true };\n }\n}\n","/**\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, ModelDef, 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 getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n makeDefaultOrderBy,\n requireField,\n requireIdFields,\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 transformOutput(value: unknown, _type: BuiltinType) {\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\n const modelIdFields = requireIdFields(this.schema, model);\n invariant(modelIdFields.length === 1, 'many-to-many relation must have exactly one id field');\n const relationIdFields = requireIdFields(this.schema, relationModel);\n invariant(relationIdFields.length === 1, 'many-to-many relation must have exactly one id field');\n\n return eb(\n sql.ref(`${relationFilterSelectAlias}.${relationIdFields[0]}`),\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}.${modelIdFields[0]}`),\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 protected buildModelSelect(\n eb: ExpressionBuilder<any, any>,\n model: GetModels<Schema>,\n subQueryAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n selectAllFields: boolean,\n ) {\n let subQuery = this.buildSelectModel(eb, model, subQueryAlias);\n\n if (selectAllFields) {\n subQuery = this.buildSelectAllFields(\n model,\n subQuery,\n typeof payload === 'object' ? payload?.omit : undefined,\n subQueryAlias,\n );\n }\n\n if (payload && typeof payload === 'object') {\n subQuery = this.buildFilterSortTake(model, payload, subQuery, subQueryAlias);\n }\n\n return subQuery;\n }\n\n buildSelectField(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n modelAlias: string,\n field: string,\n ): SelectQueryBuilder<any, any, any> {\n const fieldDef = requireField(this.schema, model, field);\n 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 = requireIdFields(this.schema, thisModel);\n query = query.leftJoin(otherModelAlias, (qb) => {\n for (const idField of idFields) {\n qb = qb.onRef(`${thisModelAlias}.${idField}`, '=', `${otherModelAlias}.${idField}`);\n }\n return qb;\n });\n return query;\n }\n\n buildCountJson(model: string, eb: ExpressionBuilder<any, any>, parentAlias: string, payload: any) {\n const modelDef = requireModel(this.schema, model);\n const toManyRelations = Object.entries(modelDef.fields).filter(([, field]) => field.relation && field.array);\n\n const selections =\n payload === true\n ? {\n select: toManyRelations.reduce(\n (acc, [field]) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n ),\n }\n : payload;\n\n const jsonObject: Record<string, Expression<any>> = {};\n\n for (const [field, value] of Object.entries(selections.select)) {\n const fieldDef = requireField(this.schema, model, field);\n const fieldModel = fieldDef.type;\n let fieldCountQuery: SelectQueryBuilder<any, any, any>;\n\n // join conditions\n const m2m = getManyToManyRelation(this.schema, model, field);\n if (m2m) {\n // many-to-many relation, count the join table\n fieldCountQuery = eb\n .selectFrom(fieldModel)\n .innerJoin(m2m.joinTable, (join) =>\n join\n .onRef(`${m2m.joinTable}.${m2m.otherFkName}`, '=', `${fieldModel}.${m2m.otherPKName}`)\n .onRef(`${m2m.joinTable}.${m2m.parentFkName}`, '=', `${parentAlias}.${m2m.parentPKName}`),\n )\n .select(eb.fn.countAll().as(`_count$${field}`));\n } else {\n // build a nested query to count the number of records in the relation\n fieldCountQuery = eb.selectFrom(fieldModel).select(eb.fn.countAll().as(`_count$${field}`));\n\n // join conditions\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, fieldModel);\n for (const [left, right] of joinPairs) {\n fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n }\n }\n\n // 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 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 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 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 protected canJoinWithoutNestedSelect(\n modelDef: ModelDef,\n payload: boolean | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n if (modelDef.computedFields) {\n // computed fields requires explicit select\n return false;\n }\n\n if (modelDef.baseModel || modelDef.isDelegate) {\n // delegate models require upward/downward joins\n return false;\n }\n\n if (\n typeof payload === 'object' &&\n (payload.orderBy ||\n payload.skip !== undefined ||\n payload.take !== undefined ||\n payload.cursor ||\n (payload as any).distinct)\n ) {\n // ordering/pagination/distinct needs to be handled before joining\n return false;\n }\n\n return true;\n }\n\n // #endregion\n\n // #region abstract methods\n\n abstract get provider(): DataSourceProviderType;\n\n /**\n * Builds selection for a relation field.\n */\n abstract buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any>;\n\n /**\n * Builds skip and take clauses.\n */\n abstract buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ): SelectQueryBuilder<any, any, any>;\n\n /**\n * Builds an Kysely expression that returns a JSON object for the given key-value pairs.\n */\n abstract buildJsonObject(\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 /**\n * Gets the SQL column type for the given field definition.\n */\n abstract getFieldSqlType(fieldDef: FieldDef): string;\n\n /*\n * Gets the string casing behavior for the dialect.\n */\n abstract getStringCasingBehavior(): { supportsILike: boolean; likeCaseSensitive: boolean };\n\n // #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 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, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport { QueryError } from '../../errors';\nimport {\n getDelegateDescendantModels,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireIdFields,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\n\nexport class SqliteCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'sqlite' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, _forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n 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', () =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'string'\n ? new Date(value).toISOString()\n : value,\n )\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\n }\n\n override transformOutput(value: unknown, type: BuiltinType) {\n if (value === null || value === undefined) {\n return value;\n } else if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return this.transformOutputJson(value);\n } else {\n return match(type)\n .with('Boolean', () => this.transformOutputBoolean(value))\n .with('DateTime', () => this.transformOutputDate(value))\n .with('Bytes', () => this.transformOutputBytes(value))\n .with('Decimal', () => this.transformOutputDecimal(value))\n .with('BigInt', () => this.transformOutputBigInt(value))\n .with('Json', () => this.transformOutputJson(value))\n .otherwise(() => super.transformOutput(value, type));\n }\n }\n\n private transformOutputDecimal(value: unknown) {\n if (value instanceof Decimal) {\n return value;\n }\n invariant(\n typeof value === 'string' || typeof value === 'number' || value instanceof Decimal,\n `Expected string, number or Decimal, got ${typeof value}`,\n );\n return new Decimal(value);\n }\n\n private transformOutputBigInt(value: unknown) {\n if (typeof value === 'bigint') {\n return value;\n }\n invariant(\n typeof value === 'string' || typeof value === 'number',\n `Expected string or number, got ${typeof value}`,\n );\n return BigInt(value);\n }\n\n private transformOutputBoolean(value: unknown) {\n return !!value;\n }\n\n private transformOutputDate(value: unknown) {\n if (typeof value === 'number') {\n return new Date(value);\n } else if (typeof value === 'string') {\n return new Date(value);\n } else {\n return value;\n }\n }\n\n private transformOutputBytes(value: unknown) {\n return Buffer.isBuffer(value) ? Uint8Array.from(value) : value;\n }\n\n private transformOutputJson(value: unknown) {\n // better-sqlite3 typically returns JSON as string; be tolerant\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch (e) {\n throw new QueryError('Invalid JSON returned', e);\n }\n }\n return value;\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n return query.select((eb) =>\n this.buildRelationJSON(model, eb, relationField, parentAlias, payload).as(relationField),\n );\n }\n\n private buildRelationJSON(\n model: string,\n eb: ExpressionBuilder<any, any>,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n const relationModelDef = requireModel(this.schema, relationModel);\n\n const subQueryName = `${parentAlias}$${relationField}`;\n let tbl: SelectQueryBuilder<any, any, any>;\n\n if (this.canJoinWithoutNestedSelect(relationModelDef, payload)) {\n // join without needing a nested select on relation model\n tbl = this.buildModelSelect(eb, relationModel, subQueryName, payload, false);\n\n // add parent join filter\n tbl = this.buildRelationJoinFilter(tbl, model, relationField, subQueryName, parentAlias);\n } else {\n // need to make a nested select on relation model\n tbl = eb.selectFrom(() => {\n // nested query name\n const selectModelAlias = `${parentAlias}$${relationField}$sub`;\n\n // select all fields\n let selectModelQuery = this.buildModelSelect(eb, relationModel, selectModelAlias, payload, true);\n\n // add parent join filter\n selectModelQuery = this.buildRelationJoinFilter(\n selectModelQuery,\n model,\n relationField,\n selectModelAlias,\n parentAlias,\n );\n return selectModelQuery.as(subQueryName);\n });\n }\n\n tbl = tbl.select(() => {\n type ArgsType = Expression<any> | RawBuilder<any> | SelectQueryBuilder<any, any, any>;\n const objArgs: ArgsType[] = [];\n\n const descendantModels = getDelegateDescendantModels(this.schema, relationModel);\n if (descendantModels.length > 0) {\n // select all JSONs built from delegate descendants\n objArgs.push(\n ...descendantModels\n .map((subModel) => [\n sql.lit(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n eb.ref(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`),\n ])\n .flatMap((v) => v),\n );\n }\n\n if (payload === true || !payload.select) {\n // select all scalar fields\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, subQueryName, 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,\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, subQueryName, false) as ArgsType,\n ];\n }\n }\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field, value]) => {\n const subJson = this.buildRelationJSON(\n relationModel,\n eb,\n field,\n `${parentAlias}$${relationField}`,\n value,\n );\n return [sql.lit(field), subJson];\n })\n .flatMap((v) => v),\n );\n }\n\n if (relationFieldDef.array) {\n return eb.fn\n .coalesce(sql`json_group_array(json_object(${sql.join(objArgs)}))`, sql`json_array()`)\n .as('$data');\n } else {\n return sql`json_object(${sql.join(objArgs)})`.as('$data');\n }\n });\n\n return tbl;\n }\n\n private buildRelationJoinFilter(\n selectModelQuery: SelectQueryBuilder<any, any, {}>,\n model: string,\n relationField: string,\n relationModelAlias: string,\n parentAlias: string,\n ) {\n const fieldDef = requireField(this.schema, model, relationField);\n const relationModel = fieldDef.type as GetModels<Schema>;\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n if (m2m) {\n // many-to-many relation\n const parentIds = requireIdFields(this.schema, model);\n const relationIds = requireIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n selectModelQuery = selectModelQuery.where((eb) =>\n eb(\n eb.ref(`${relationModelAlias}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(`${parentAlias}.${parentIds[0]}`, '=', `${m2m.joinTable}.${m2m.parentFkName}`),\n ),\n );\n } else {\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, model, relationField);\n keyPairs.forEach(({ fk, pk }) => {\n if (ownedByModel) {\n // the parent model owns the fk\n selectModelQuery = selectModelQuery.whereRef(\n `${relationModelAlias}.${pk}`,\n '=',\n `${parentAlias}.${fk}`,\n );\n } else {\n // the relation side owns the fk\n selectModelQuery = selectModelQuery.whereRef(\n `${relationModelAlias}.${fk}`,\n '=',\n `${parentAlias}.${pk}`,\n );\n }\n });\n }\n return selectModelQuery;\n }\n\n override buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ) {\n if (take !== undefined) {\n query = query.limit(take);\n }\n if (skip !== undefined) {\n query = query.offset(skip);\n if (take === undefined) {\n // SQLite requires offset to be used with limit\n query = query.limit(-1);\n }\n }\n return query;\n }\n\n override buildJsonObject(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 override getFieldSqlType(fieldDef: FieldDef) {\n // TODO: respect `@db.x` attributes\n if (fieldDef.relation) {\n throw new QueryError('Cannot get SQL type of a relation field');\n }\n if (fieldDef.array) {\n throw new QueryError('SQLite does not support scalar list type');\n }\n\n if (this.schema.enums?.[fieldDef.type]) {\n // enums are stored as text\n return 'text';\n }\n\n return (\n match(fieldDef.type)\n .with('String', () => 'text')\n .with('Boolean', () => 'integer')\n .with('Int', () => 'integer')\n .with('BigInt', () => 'integer')\n .with('Float', () => 'real')\n .with('Decimal', () => 'decimal')\n .with('DateTime', () => 'numeric')\n .with('Bytes', () => 'blob')\n .with('Json', () => 'jsonb')\n // fallback to text\n .otherwise(() => 'text')\n );\n }\n\n override getStringCasingBehavior() {\n // SQLite `LIKE` is case-insensitive, and there is no `ILIKE`\n return { supportsILike: false, likeCaseSensitive: false };\n }\n}\n","import {\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 { ClientContract, CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base-dialect';\nimport { InternalError, QueryError } from '../../client/errors';\nimport {\n getManyToManyRelation,\n getModel,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireIdFields,\n} 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, falseNode, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\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(private readonly client: ClientContract<Schema>) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get schema() {\n return this.client.$schema;\n }\n\n get clientOptions() {\n return this.client.$options;\n }\n\n get auth() {\n return this.client.$auth;\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 private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n return this.createColumnRef(expr.field, context);\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, context);\n }\n\n const op = expr.op;\n\n if (op === '?' || op === '!' || op === '^') {\n return this.transformCollectionPredicate(expr, context);\n }\n\n const { normalizedLeft, normalizedRight } = this.normalizeBinaryOperationOperands(expr, context);\n const left = this.transform(normalizedLeft, context);\n const right = this.transform(normalizedRight, 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 this.transformNullCheck(left, expr.op);\n } else if (this.isNullNode(left)) {\n return this.transformNullCheck(right, expr.op);\n } else {\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n }\n\n private transformNullCheck(expr: OperationNode, operator: BinaryOperator) {\n invariant(operator === '==' || operator === '!=', 'operator must be \"==\" or \"!=\" for null comparison');\n if (ValueNode.is(expr)) {\n if (expr.value === null) {\n return operator === '==' ? trueNode(this.dialect) : falseNode(this.dialect);\n } else {\n return operator === '==' ? falseNode(this.dialect) : trueNode(this.dialect);\n }\n } else {\n return operator === '=='\n ? BinaryOperationNode.create(expr, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(expr, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n }\n\n private normalizeBinaryOperationOperands(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n // if relation fields are used directly in comparison, it can only be compared with null,\n // so we normalize the args with the id field (use the first id field if multiple)\n let normalizedLeft: Expression = expr.left;\n if (this.isRelationField(expr.left, context.model)) {\n invariant(ExpressionUtils.isNull(expr.right), 'only null comparison is supported for relation field');\n const leftRelDef = this.getFieldDefFromFieldRef(expr.left, context.model);\n invariant(leftRelDef, 'failed to get relation field definition');\n const idFields = requireIdFields(this.schema, leftRelDef.type);\n normalizedLeft = this.makeOrAppendMember(normalizedLeft, idFields[0]!);\n }\n let normalizedRight: Expression = expr.right;\n if (this.isRelationField(expr.right, context.model)) {\n invariant(ExpressionUtils.isNull(expr.left), 'only null comparison is supported for relation field');\n const rightRelDef = this.getFieldDefFromFieldRef(expr.right, context.model);\n invariant(rightRelDef, 'failed to get relation field definition');\n const idFields = requireIdFields(this.schema, rightRelDef.type);\n normalizedRight = this.makeOrAppendMember(normalizedRight, idFields[0]!);\n }\n return { normalizedLeft, normalizedRight };\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 const fieldDef = this.getFieldDefFromFieldRef(expr.left, context.model);\n if (fieldDef) {\n invariant(fieldDef.relation, `field is not a relation: ${JSON.stringify(expr.left)}`);\n newContextModel = fieldDef.type;\n } else {\n invariant(\n ExpressionUtils.isMember(expr.left) && ExpressionUtils.isField(expr.left.receiver),\n 'left operand must be member access with field receiver',\n );\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 });\n\n if (expr.op === '!') {\n predicateFilter = logicalNot(this.dialect, 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, context: ExpressionTransformerContext<Schema>) {\n if (expr.op !== '==' && expr.op !== '!=') {\n throw new QueryError(\n `Unsupported operator for \\`auth()\\` in policy of model \"${context.model}\": ${expr.op}`,\n );\n }\n\n let authExpr: Expression;\n let other: Expression;\n if (this.isAuthCall(expr.left)) {\n authExpr = expr.left;\n other = expr.right;\n } else {\n authExpr = expr.right;\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 const authModel = getModel(this.schema, this.authType);\n if (!authModel) {\n throw new QueryError(\n `Unsupported use of \\`auth()\\` in policy of model \"${context.model}\", comparing with \\`auth()\\` is only possible when auth type is a model`,\n );\n }\n\n const idFields = Object.values(authModel.fields)\n .filter((f) => f.id)\n .map((f) => f.name);\n invariant(idFields.length > 0, 'auth type model must have at least one id field');\n\n // convert `auth() == other` into `auth().id == other.id`\n const conditions = idFields.map((fieldName) =>\n ExpressionUtils.binary(\n ExpressionUtils.member(authExpr, [fieldName]),\n '==',\n this.makeOrAppendMember(other, fieldName),\n ),\n );\n let result = this.buildAnd(conditions);\n if (expr.op === '!=') {\n result = this.buildLogicalNot(result);\n }\n return this.transform(result, context);\n }\n }\n\n private makeOrAppendMember(other: Expression, fieldName: string): Expression {\n if (ExpressionUtils.isMember(other)) {\n return ExpressionUtils.member(other.receiver, [...other.members, fieldName]);\n } else {\n return ExpressionUtils.member(other, [fieldName]);\n }\n }\n\n private transformValue(value: unknown, type: BuiltinType) {\n if (value === true) {\n return trueNode(this.dialect);\n } else if (value === false) {\n return falseNode(this.dialect);\n } else {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\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 logicalNot(this.dialect, this.transform(expr.operand, context));\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.getFunctionImpl(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 client: this.client,\n dialect: this.dialect,\n model: context.model,\n modelAlias: context.alias ?? context.model,\n operation: context.operation,\n },\n );\n }\n\n private getFunctionImpl(functionName: string) {\n // check built-in functions\n let func = this.clientOptions.functions?.[functionName];\n if (!func) {\n // check plugins\n for (const plugin of this.clientOptions.plugins ?? []) {\n if (plugin.functions?.[functionName]) {\n func = plugin.functions[functionName];\n break;\n }\n }\n }\n return func;\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 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(\n ExpressionUtils.isField(expr.receiver) || ExpressionUtils.isThis(expr.receiver),\n 'expect receiver to be field expression or \"this\"',\n );\n\n let members = expr.members;\n let receiver: OperationNode;\n const { memberFilter, memberSelect, ...restContext } = context;\n\n if (ExpressionUtils.isThis(expr.receiver)) {\n if (expr.members.length === 1) {\n // `this.relation` case, equivalent to field access\n return this._field(ExpressionUtils.field(expr.members[0]!), context);\n } else {\n // transform the first segment into a relation access, then continue with the rest of the members\n const firstMemberFieldDef = requireField(this.schema, context.model, expr.members[0]!);\n receiver = this.transformRelationAccess(expr.members[0]!, firstMemberFieldDef.type, restContext);\n members = expr.members.slice(1);\n }\n } else {\n receiver = this.transform(expr.receiver, restContext);\n }\n\n invariant(SelectQueryNode.is(receiver), 'expected receiver to be select query');\n\n let startType: string;\n if (ExpressionUtils.isField(expr.receiver)) {\n const receiverField = requireField(this.schema, context.model, expr.receiver.field);\n startType = receiverField.type;\n } else {\n // \"this.\" case, start type is the model of the context\n startType = context.model;\n }\n\n // traverse forward to collect member types\n const memberFields: { fromModel: string; fieldDef: FieldDef }[] = [];\n let currType = startType;\n for (const member of 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 = members.length - 1; i >= 0; i--) {\n const member = 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 });\n\n if (currNode) {\n invariant(SelectQueryNode.is(currNode), 'expected select query node');\n currNode = {\n ...relation,\n selections: [\n SelectionNode.create(AliasNode.create(currNode, IdentifierNode.create(members[i + 1]!))),\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 === 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 m2m = getManyToManyRelation(this.schema, context.model, field);\n if (m2m) {\n return this.transformManyToManyRelationAccess(m2m, context);\n }\n\n const fromModel = context.model;\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, fromModel, field);\n\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 private transformManyToManyRelationAccess(\n m2m: NonNullable<ReturnType<typeof getManyToManyRelation>>,\n context: ExpressionTransformerContext<Schema>,\n ) {\n const eb = expressionBuilder<any, any>();\n const relationQuery = eb\n .selectFrom(m2m.otherModel)\n // inner join with join table and additionally filter by the parent model\n .innerJoin(m2m.joinTable, (join) =>\n join\n // relation model pk to join table fk\n .onRef(`${m2m.otherModel}.${m2m.otherPKName}`, '=', `${m2m.joinTable}.${m2m.otherFkName}`)\n // parent model pk to join table fk\n .onRef(\n `${m2m.joinTable}.${m2m.parentFkName}`,\n '=',\n `${context.alias ?? context.model}.${m2m.parentPKName}`,\n ),\n );\n return relationQuery.toOperationNode();\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 private buildLogicalNot(result: Expression): Expression {\n return ExpressionUtils.unary('!', result);\n }\n\n private buildAnd(conditions: BinaryExpression[]): Expression {\n if (conditions.length === 0) {\n return ExpressionUtils.literal(true);\n } else if (conditions.length === 1) {\n return conditions[0]!;\n } else {\n return conditions.reduce((acc, condition) => ExpressionUtils.binary(acc, '&&', condition));\n }\n }\n\n private isRelationField(expr: Expression, model: GetModels<Schema>) {\n const fieldDef = this.getFieldDefFromFieldRef(expr, model);\n return !!fieldDef?.relation;\n }\n\n private getFieldDefFromFieldRef(expr: Expression, model: GetModels<Schema>): FieldDef | undefined {\n if (ExpressionUtils.isField(expr)) {\n return requireField(this.schema, model, expr.field);\n } else if (\n ExpressionUtils.isMember(expr) &&\n expr.members.length === 1 &&\n ExpressionUtils.isThis(expr.receiver)\n ) {\n return requireField(this.schema, model, expr.members[0]!);\n } else {\n return undefined;\n }\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-dialect';\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.length === 0) {\n return trueNode(dialect);\n }\n if (nodes.length === 1) {\n return nodes[0]!;\n }\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) => AndNode.create(wrapParensIf(acc, OrNode.is), wrapParensIf(node, OrNode.is)));\n}\n\nexport function disjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.length === 0) {\n return falseNode(dialect);\n }\n if (nodes.length === 1) {\n return nodes[0]!;\n }\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) => OrNode.create(wrapParensIf(acc, AndNode.is), wrapParensIf(node, AndNode.is)));\n}\n\n/**\n * Negates a logical expression.\n */\nexport function logicalNot<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n node: OperationNode,\n): OperationNode {\n if (isTrueNode(node)) {\n return falseNode(dialect);\n }\n if (isFalseNode(node)) {\n return trueNode(dialect);\n }\n return UnaryOperationNode.create(\n OperatorNode.create('not'),\n wrapParensIf(node, (n) => AndNode.is(n) || OrNode.is(n)),\n );\n}\n\nfunction wrapParensIf(node: OperationNode, predicate: (node: OperationNode) => boolean): OperationNode {\n return predicate(node) ? ParensNode.create(node) : node;\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 { check } from './functions';\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 get functions() {\n return {\n check,\n };\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"],"mappings":"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","names":["RejectedByPolicyReason","RejectedByPolicyError","Error","model","reason","message","invariant","ExpressionWrapper","ValueNode","CRUD","AliasNode","ColumnNode","ReferenceNode","TableNode","extractFieldName","node","ReferenceNode","is","ColumnNode","column","name","undefined","invariant","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","not","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","getLiteralValue","undefined","QueryError","Error","message","cause","InternalError","getModel","schema","model","Object","values","models","find","m","name","toLowerCase","getTypeDef","type","typeDefs","requireModel","modelDef","QueryError","getField","field","fields","requireField","modelOrType","typeDef","requireIdFields","schema","model","modelDef","requireModel","result","idFields","InternalError","getRelationForeignKeyFieldPairs","relationField","fieldDef","requireField","relation","fields","references","keyPairs","map","f","i","fk","pk","ownedByModel","opposite","oppositeField","type","isRelationField","schema","model","field","fieldDef","getField","relation","isInheritedField","originModel","getUniqueFields","modelDef","requireModel","result","key","value","Object","entries","uniqueFields","InternalError","type","push","name","def","requireField","defs","fromEntries","keys","map","k","buildFieldRef","schema","model","field","options","eb","modelAlias","inlineComputedField","fieldDef","requireField","computed","ref","computer","computedFields","QueryError","isEnum","schema","type","enums","buildJoinPairs","schema","model","modelAlias","relationField","relationModelAlias","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","map","fk","pk","makeDefaultOrderBy","idFields","requireIdFields","f","getManyToManyRelation","field","fieldDef","requireField","array","relation","opposite","undefined","oppositeFieldDef","type","sortedModelNames","sort","orderedFK","sortedFieldNames","name","modelIdFields","invariant","length","otherIdFields","parentFkName","parentPKName","otherModel","otherField","otherFkName","otherPKName","joinTable","flattenCompoundUniqueFilters","filter","uniqueFields","getUniqueFields","compoundUniques","u","result","key","value","Object","entries","some","assign","ensureArray","Array","isArray","getDelegateDescendantModels","schema","model","collected","Set","subModels","Object","values","models","filter","m","baseModel","forEach","def","has","add","name","aggregate","eb","expr","op","match","with","fn","count","sum","avg","min","max","exhaustive","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","expressionBuilder","ExpressionWrapper","FromNode","FunctionNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","ParensNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","sql","TableNode","UpdateQueryNode","ValueListNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","Decimal","sql","match","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","transformOutput","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","modelIdFields","requireIdFields","invariant","relationIdFields","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","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","buildModelSelect","selectAllFields","computed","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","filter","selections","reduce","acc","fieldModel","fieldCountQuery","innerJoin","otherPKName","parentPKName","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","buildFieldRef","canJoinWithoutNestedSelect","computedFields","isDelegate","PostgresCrudDialect","BaseCrudDialect","schema","options","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toISOString","toString","otherwise","transformOutput","transformOutputDate","transformOutputBytes","transformOutputBigInt","transformDecimal","invariant","BigInt","Decimal","fixPostgresTimezone","getTime","getTimezoneOffset","Buffer","isBuffer","Uint8Array","from","buildRelationSelection","query","model","relationField","parentAlias","payload","relationResultName","joinedQuery","buildRelationJSON","select","qb","resultName","relationFieldDef","requireField","relationModel","leftJoinLateral","eb","relationSelectName","relationModelDef","requireModel","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","subQuery","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","length","where","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","sql","parentResultName","objArgs","buildRelationObjectArgs","array","fn","coalesce","descendantModels","getDelegateDescendantModels","push","subModel","lit","DELEGATE_JOINED_FIELD_PREFIX","name","flatMap","Object","entries","fields","filter","relation","omit","field","fieldRef","subJson","buildCountJson","fieldDef","fieldValue","include","result","selectInclude","isRelationField","forEach","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","supportInsertWithDefault","getFieldSqlType","QueryError","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","invariant","Decimal","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","transformOutput","transformOutputJson","transformOutputBoolean","transformOutputDate","transformOutputBytes","transformOutputDecimal","transformOutputBigInt","Decimal","invariant","BigInt","isBuffer","Uint8Array","parse","e","QueryError","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","selectModelAlias","selectModelQuery","objArgs","descendantModels","getDelegateDescendantModels","length","push","subModel","sql","lit","DELEGATE_JOINED_FIELD_PREFIX","name","ref","flatMap","Object","entries","fields","filter","relation","omit","field","fieldRef","subJson","buildCountJson","fieldDef","include","array","fn","coalesce","join","relationModelAlias","m2m","getManyToManyRelation","parentIds","requireIdFields","relationIds","where","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","buildSkipTake","skip","take","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","supportInsertWithDefault","getFieldSqlType","enums","getStringCasingBehavior","supportsILike","likeCaseSensitive","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","length","some","items","filter","n","reduce","acc","AndNode","create","wrapParensIf","OrNode","disjunction","logicalNot","UnaryOperationNode","OperatorNode","predicate","ParensNode","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","client","getCrudDialect","schema","clientOptions","$schema","$options","auth","$auth","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","normalizedLeft","normalizedRight","normalizeBinaryOperationOperands","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformNullCheck","transformOperator","operator","invariant","falseNode","isRelationField","ExpressionUtils","isNull","leftRelDef","getFieldDefFromFieldRef","idFields","requireIdFields","makeOrAppendMember","rightRelDef","isAuthMember","ExpressionEvaluator","evaluate","isField","isMember","newContextModel","JSON","stringify","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","QueryError","authExpr","other","authModel","getModel","Object","values","fields","filter","f","id","name","length","conditions","fieldName","binary","result","buildAnd","buildLogicalNot","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","transformCall","toOperationNode","func","getFunctionImpl","function","eb","expressionBuilder","args","arg","transformCallArg","modelAlias","operation","functionName","functions","plugin","plugins","isLiteral","val","ref","isCall","valNode","valueMemberAccess","_member","isThis","firstMemberFieldDef","slice","SelectQueryNode","startType","receiverField","memberFields","currType","push","fromModel","currNode","i","ColumnNode","receiverType","fieldValue","relationModel","m2m","getManyToManyRelation","transformManyToManyRelationAccess","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","relationQuery","selectFrom","otherModel","innerJoin","joinTable","join","onRef","otherPKName","otherFkName","parentFkName","parentPKName","column","node","unary","literal","reduce","acc","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","RejectedByPolicyReason","OTHER","isMutationQueryNode","transformNode","mutationModel","getMutationModel","InsertQueryNode","is","isManyToManyJoinTable","needCheckPreCreate","constCondition","tryGetConstantPolicy","enforcePreCreatePolicy","result","returning","onlyReturningId","readBackResult","processReadBack","rows","length","CANNOT_READ_BACK","transformSelectQuery","whereNode","where","policyFilter","createPolicyFilterForFrom","from","WhereNode","create","conjunction","baseResult","transformJoin","table","extractTableName","filter","buildPolicyFilter","model","alias","nestedSelect","kind","FromNode","selections","SelectionNode","createSelectAll","AliasNode","ParensNode","IdentifierNode","transformInsertQuery","onConflict","updates","updateWhere","processedNode","idFields","requireIdFields","ReturningNode","map","field","ColumnNode","transformUpdateQuery","joinFilter","transformDeleteQuery","using","createPolicyFilterForTables","tables","collector","ColumnCollector","selectedColumns","collect","every","c","includes","fields","columns","column","name","valueRows","values","unwrapCreateValueRows","enforcePreCreatePolicyForManyToManyJoinTable","v","enforcePreCreatePolicyForOne","tableName","m2m","resolveManyToManyJoinTable","invariant","aIndex","indexOf","aNode","bIndex","bNode","ValueNode","aValue","value","bValue","eb","expressionBuilder","filterA","firstModel","queryA","selectFrom","ref","firstIdField","select","ExpressionWrapper","as","filterB","secondModel","queryB","secondIdField","queryNode","toOperationNode","$conditionA","$conditionB","NO_ACCESS","allFields","Object","entries","requireModel","def","relation","allValues","_def","index","push","createImmediate","constTable","ValuesNode","ValueListNode","castedColumnRef","sql","raw","getFieldSqlType","preCreateCheck","BinaryOperationNode","FunctionNode","OperatorNode","$condition","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","isImplicitManyToManyJoinTable","i","item","fieldDef","requireField","transformPrimitive","type","array","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","idConditions","buildIdConditions","TableNode","selectResult","disjunction","row","r","match","when","getTableName","into","UpdateQueryNode","QueryError","DeleteQueryNode","froms","exhaustive","SelectQueryNode","m2mFilter","getModelPolicyFilterForManyToManyJoinTable","falseNode","allows","policy","compilePolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","identifier","inner","reduce","acc","extractResult","ExpressionTransformer","transform","auth","$auth","modelDef","extractOperations","split","trim","attributes","attr","operations","args","models","getManyToManyRelation","joinTable","sortedRecord","otherModel","otherField","sort","manyToManySorter","firstIdFields","secondIdFields","firstField","secondField","a","b","localeCompare","checkForOperation","aQuery","whereRef","bQuery","and","check","eb","args","client","model","modelAlias","operation","invariant","length","arg1Node","toOperationNode","arg2Node","undefined","ValueNode","is","value","CRUD","includes","fieldName","extractFieldName","fieldDef","requireField","$schema","relation","array","relationModel","type","op","policyHandler","PolicyHandler","joinPairs","buildJoinPairs","joinCondition","ref","and","map","left","right","policyCondition","buildPolicyFilter","result","selectFrom","where","select","ExpressionWrapper","as","PolicyPlugin","id","name","description","functions","check","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle"]}