@zenstackhq/runtime 3.0.0-beta.3 → 3.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{contract-CusA0mQO.d.cts → contract-hoS-Sd87.d.cts} +4 -5
- package/dist/{contract-CusA0mQO.d.ts → contract-hoS-Sd87.d.ts} +4 -5
- package/dist/index.cjs +284 -190
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +287 -193
- package/dist/index.js.map +1 -1
- package/dist/plugins/policy/index.cjs +172 -88
- package/dist/plugins/policy/index.cjs.map +1 -1
- package/dist/plugins/policy/index.d.cts +1 -1
- package/dist/plugins/policy/index.d.ts +1 -1
- package/dist/plugins/policy/index.js +173 -89
- package/dist/plugins/policy/index.js.map +1 -1
- package/dist/schema.cjs +3 -0
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +1 -0
- package/dist/schema.d.ts +1 -0
- package/dist/schema.js +3 -0
- package/dist/schema.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/plugins/policy/errors.ts","../../../src/plugins/policy/policy-handler.ts","../../../src/client/crud/dialects/index.ts","../../../src/client/crud/dialects/postgresql.ts","../../../src/client/constants.ts","../../../src/client/query-utils.ts","../../../src/schema/expression.ts","../../../src/client/errors.ts","../../../src/client/crud/dialects/base.ts","../../../src/utils/enumerate.ts","../../../src/client/crud/dialects/sqlite.ts","../../../src/utils/default-operation-node-visitor.ts","../../../src/plugins/policy/column-collector.ts","../../../src/plugins/policy/expression-transformer.ts","../../../src/plugins/policy/expression-evaluator.ts","../../../src/plugins/policy/utils.ts","../../../src/plugins/policy/plugin.ts"],"sourcesContent":["/**\n * Error thrown when an operation is rejected by access policy.\n */\nexport class RejectedByPolicyError extends Error {\n constructor(\n public readonly model: string | undefined,\n public readonly reason?: string,\n ) {\n super(reason ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n OperationNodeTransformer,\n OperatorNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n ValueNode,\n ValuesNode,\n WhereNode,\n type OperationNode,\n type QueryResult,\n type RootOperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ClientContract } from '../../client';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getIdFields, requireField, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError } from './errors';\nimport { ExpressionTransformer } from './expression-transformer';\nimport type { Policy, PolicyOperation } from './types';\nimport { buildIsFalse, conjunction, disjunction, falseNode, getTableName } from './utils';\n\nexport type CrudQueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport type MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport class PolicyHandler<Schema extends SchemaDef> extends OperationNodeTransformer {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(private readonly client: ClientContract<Schema>) {\n super();\n this.dialect = getCrudDialect(this.client.$schema, this.client.$options);\n }\n\n get kysely() {\n return this.client.$qb;\n }\n\n async handle(\n node: RootOperationNode,\n proceed: ProceedKyselyQueryFunction /*, transaction: OnKyselyQueryTransaction*/,\n ) {\n if (!this.isCrudQueryNode(node)) {\n // non-CRUD queries are not allowed\n throw new RejectedByPolicyError(undefined, 'non-CRUD queries are not allowed');\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed read without transaction\n return proceed(this.transformNode(node));\n }\n\n let mutationRequiresTransaction = false;\n const mutationModel = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // reject create if unconditional deny\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n } else if (constCondition === undefined) {\n mutationRequiresTransaction = true;\n }\n }\n\n if (!mutationRequiresTransaction && !node.returning) {\n // transform and proceed mutation without transaction\n return proceed(this.transformNode(node));\n }\n\n if (InsertQueryNode.is(node)) {\n await this.enforcePreCreatePolicy(node, proceed);\n }\n const transformedNode = this.transformNode(node);\n const result = await proceed(transformedNode);\n\n if (!this.onlyReturningId(node)) {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n }\n return readBackResult;\n } else {\n return result;\n }\n\n // TODO: run in transaction\n //let readBackError = false;\n\n // transform and post-process in a transaction\n // const result = await transaction(async (txProceed) => {\n // if (InsertQueryNode.is(node)) {\n // await this.enforcePreCreatePolicy(node, txProceed);\n // }\n // const transformedNode = this.transformNode(node);\n // const result = await txProceed(transformedNode);\n\n // if (!this.onlyReturningId(node)) {\n // const readBackResult = await this.processReadBack(node, result, txProceed);\n // if (readBackResult.rows.length !== result.rows.length) {\n // readBackError = true;\n // }\n // return readBackResult;\n // } else {\n // return result;\n // }\n // });\n\n // if (readBackError) {\n // throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n // }\n\n // return result;\n }\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n const collector = new ColumnCollector();\n const selectedColumns = collector.collect(node.returning);\n return selectedColumns.every((c) => idFields.includes(c));\n }\n\n private async enforcePreCreatePolicy(node: InsertQueryNode, proceed: ProceedKyselyQueryFunction) {\n if (!node.columns || !node.values) {\n return;\n }\n\n const model = this.getMutationModel(node);\n const fields = node.columns.map((c) => c.column.name);\n const valueRows = this.unwrapCreateValueRows(node.values, model, fields);\n for (const values of valueRows) {\n await this.enforcePreCreatePolicyForOne(\n model,\n fields,\n values.map((v) => v.node),\n values.map((v) => v.raw),\n proceed,\n );\n }\n }\n\n private async enforcePreCreatePolicyForOne(\n model: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n valuesRaw: unknown[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const thisEntity: Record<string, OperationNode> = {};\n const thisEntityRaw: Record<string, unknown> = {};\n for (let i = 0; i < fields.length; i++) {\n thisEntity[fields[i]!] = values[i]!;\n thisEntityRaw[fields[i]!] = valuesRaw[i]!;\n }\n\n const filter = this.buildPolicyFilter(model, undefined, 'create', thisEntity, thisEntityRaw);\n const preCreateCheck: SelectQueryNode = {\n kind: 'SelectQueryNode',\n selections: [SelectionNode.create(AliasNode.create(filter, IdentifierNode.create('$condition')))],\n };\n const result = await proceed(preCreateCheck);\n if (!(result.rows[0] as any)?.$condition) {\n throw new RejectedByPolicyError(model);\n }\n }\n\n private unwrapCreateValueRows(node: OperationNode, model: GetModels<Schema>, fields: string[]) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(data: readonly unknown[], model: GetModels<Schema>, fields: string[]) {\n invariant(data.length === fields.length, 'data length must match fields length');\n const result: { node: OperationNode; raw: unknown }[] = [];\n for (let i = 0; i < data.length; i++) {\n const item = data[i]!;\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n if (typeof item === 'object' && item && 'kind' in item) {\n invariant(item.kind === 'ValueNode', 'expecting a ValueNode');\n result.push({\n node: ValueNode.create(\n this.dialect.transformPrimitive(\n (item as ValueNode).value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n ),\n ),\n raw: (item as ValueNode).value,\n });\n } else {\n const value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n if (Array.isArray(value)) {\n result.push({\n node: RawNode.createWithSql(this.dialect.buildArrayLiteralSQL(value)),\n raw: value,\n });\n } else {\n result.push({ node: ValueNode.create(value), raw: value });\n }\n }\n }\n return result;\n }\n\n private tryGetConstantPolicy(model: GetModels<Schema>, operation: PolicyOperation) {\n const policies = this.getModelPolicies(model, operation);\n if (!policies.some((p) => p.kind === 'allow')) {\n // no allow -> unconditional deny\n return false;\n } else if (\n // unconditional deny\n policies.some((p) => p.kind === 'deny' && this.isTrueExpr(p.condition))\n ) {\n return false;\n } else if (\n // unconditional allow\n !policies.some((p) => p.kind === 'deny') &&\n policies.some((p) => p.kind === 'allow' && this.isTrueExpr(p.condition))\n ) {\n return true;\n } else {\n return undefined;\n }\n }\n\n private isTrueExpr(expr: Expression) {\n return ExpressionUtils.isLiteral(expr) && expr.value === true;\n }\n\n private async processReadBack(node: CrudQueryNode, result: QueryResult<any>, proceed: ProceedKyselyQueryFunction) {\n if (result.rows.length === 0) {\n return result;\n }\n\n if (!this.isMutationQueryNode(node) || !node.returning) {\n return result;\n }\n\n // do a select (with policy) in place of returning\n const table = this.getMutationModel(node);\n if (!table) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n\n const idConditions = this.buildIdConditions(table, result.rows);\n const policyFilter = this.buildPolicyFilter(table, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(table)]),\n where: WhereNode.create(conjunction(this.dialect, [idConditions, policyFilter])),\n selections: node.returning.selections,\n };\n const selectResult = await proceed(select);\n return selectResult;\n }\n\n private buildIdConditions(table: string, rows: any[]): OperationNode {\n const idFields = getIdFields(this.client.$schema, table);\n return disjunction(\n this.dialect,\n rows.map((row) =>\n conjunction(\n this.dialect,\n idFields.map((field) =>\n BinaryOperationNode.create(\n ColumnNode.create(field),\n OperatorNode.create('='),\n ValueNode.create(row[field]),\n ),\n ),\n ),\n ),\n );\n }\n\n private getMutationModel(node: InsertQueryNode | UpdateQueryNode | DeleteQueryNode) {\n const r = match(node)\n .when(InsertQueryNode.is, (node) => getTableName(node.into) as GetModels<Schema>)\n .when(UpdateQueryNode.is, (node) => getTableName(node.table) as GetModels<Schema>)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError('Only one from table is supported for delete');\n }\n return getTableName(node.from.froms[0]) as GetModels<Schema>;\n })\n .exhaustive();\n if (!r) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n return r;\n }\n\n private isCrudQueryNode(node: RootOperationNode): node is CrudQueryNode {\n return (\n SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node)\n );\n }\n\n private isMutationQueryNode(node: RootOperationNode): node is MutationQueryNode {\n return InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node);\n }\n\n private buildPolicyFilter(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n const policies = this.getModelPolicies(model, operation);\n if (policies.length === 0) {\n return falseNode(this.dialect);\n }\n\n const allows = policies\n .filter((policy) => policy.kind === 'allow')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n let combinedPolicy: OperationNode;\n\n if (allows.length === 0) {\n // constant false\n combinedPolicy = falseNode(this.dialect);\n } else {\n // or(...allows)\n combinedPolicy = disjunction(this.dialect, allows);\n\n // and(...!denies)\n if (denies.length !== 0) {\n const combinedDenies = conjunction(\n this.dialect,\n denies.map((d) => buildIsFalse(d, this.dialect)),\n );\n // or(...allows) && and(...!denies)\n combinedPolicy = conjunction(this.dialect, [combinedPolicy, combinedDenies]);\n }\n }\n return combinedPolicy;\n }\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = node.where;\n\n node.from?.froms.forEach((from) => {\n const extractResult = this.extractTableName(from);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, filter]) : filter,\n );\n }\n });\n\n const baseResult = super.transformSelectQuery({\n ...node,\n where: undefined,\n });\n\n return {\n ...baseResult,\n where: whereNode,\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n const result = super.transformInsertQuery(node);\n if (!node.returning) {\n return result;\n }\n if (this.onlyReturningId(node)) {\n return result;\n } else {\n // only return ID fields, that's enough for reading back the inserted row\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n return {\n ...result,\n returning: ReturningNode.create(\n idFields.map((field) => SelectionNode.create(ColumnNode.create(field))),\n ),\n };\n }\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const result = super.transformUpdateQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'update');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n protected override transformDeleteQuery(node: DeleteQueryNode) {\n const result = super.transformDeleteQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'delete');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n private extractTableName(from: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(from)) {\n return { model: from.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(from)) {\n const inner = this.extractTableName(from.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(from.alias) ? from.alias.name : undefined,\n };\n } else {\n // this can happen for subqueries, which will be handled when nested\n // transformation happens\n return undefined;\n }\n }\n\n private transformPolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n return new ExpressionTransformer(this.client.$schema, this.client.$options, this.client.$auth).transform(\n policy.condition,\n {\n model,\n alias,\n operation,\n thisEntity,\n thisEntityRaw,\n auth: this.client.$auth,\n },\n );\n }\n\n private getModelPolicies(modelName: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, modelName);\n const result: Policy[] = [];\n\n const extractOperations = (expr: Expression) => {\n invariant(ExpressionUtils.isLiteral(expr), 'expecting a literal');\n invariant(typeof expr.value === 'string', 'expecting a string literal');\n return expr.value\n .split(',')\n .filter((v) => !!v)\n .map((v) => v.trim()) as PolicyOperation[];\n };\n\n if (modelDef.attributes) {\n result.push(\n ...modelDef.attributes\n .filter((attr) => attr.name === '@@allow' || attr.name === '@@deny')\n .map(\n (attr) =>\n ({\n kind: attr.name === '@@allow' ? 'allow' : 'deny',\n operations: extractOperations(attr.args![0]!.value),\n condition: attr.args![1]!.value,\n }) as const,\n )\n .filter((policy) => policy.operations.includes('all') || policy.operations.includes(operation)),\n );\n }\n return result;\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base';\nimport { PostgresCrudDialect } from './postgresql';\nimport { SqliteCrudDialect } from './sqlite';\n\nexport function getCrudDialect<Schema extends SchemaDef>(\n schema: Schema,\n options: ClientOptions<Schema>,\n): BaseCrudDialect<Schema> {\n return match(schema.provider.type)\n .with('sqlite', () => new SqliteCrudDialect(schema, options))\n .with('postgresql', () => new PostgresCrudDialect(schema, options))\n .exhaustive();\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (type === 'Json' && !forArrayField) {\n // node-pg incorrectly handles array values passed to non-array JSON fields,\n // the workaround is to JSON stringify the value\n // https://github.com/brianc/node-postgres/issues/374\n return JSON.stringify(value);\n } else {\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date ? value : typeof value === 'string' ? new Date(value) : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const 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 = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n 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","/**\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 type { Expression, ExpressionBuilder, ExpressionWrapper } from 'kysely';\nimport { match } from 'ts-pattern';\nimport { ExpressionUtils, type FieldDef, type GetModels, type ModelDef, type SchemaDef } from '../schema';\nimport { extractFields } from '../utils/object-utils';\nimport type { AGGREGATE_OPERATORS } from './constants';\nimport type { OrderBy } from './crud-types';\nimport { InternalError, QueryError } from './errors';\nimport type { ClientOptions } from './options';\n\nexport function hasModel(schema: SchemaDef, model: string) {\n return Object.keys(schema.models)\n .map((k) => k.toLowerCase())\n .includes(model.toLowerCase());\n}\n\nexport function getModel(schema: SchemaDef, model: string) {\n return schema.models[model];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n const matchedName = Object.keys(schema.models).find((k) => k.toLowerCase() === model.toLowerCase());\n if (!matchedName) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\n return schema.models[matchedName]!;\n}\n\nexport function getField(schema: SchemaDef, model: string, field: string) {\n const modelDef = getModel(schema, model);\n return modelDef?.fields[field];\n}\n\nexport function requireField(schema: SchemaDef, model: string, field: string) {\n const modelDef = requireModel(schema, model);\n if (!modelDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in model \"${model}\"`);\n }\n return modelDef.fields[field];\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n const modelDef = requireModel(schema, model);\n return modelDef?.idFields as GetModels<Schema>[];\n}\n\nexport function requireIdFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result = modelDef?.idFields;\n if (!result) {\n throw new InternalError(`Model \"${model}\" does not have ID field(s)`);\n }\n return result;\n}\n\nexport function getRelationForeignKeyFieldPairs(schema: SchemaDef, model: string, relationField: string) {\n const fieldDef = requireField(schema, model, relationField);\n\n if (!fieldDef?.relation) {\n throw new InternalError(`Field \"${relationField}\" is not a relation`);\n }\n\n if (fieldDef.relation.fields) {\n if (!fieldDef.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n // this model owns the fk\n return {\n keyPairs: fieldDef.relation.fields.map((f, i) => ({\n fk: f,\n pk: fieldDef.relation!.references![i]!,\n })),\n ownedByModel: true,\n };\n } else {\n if (!fieldDef.relation.opposite) {\n throw new InternalError(`Opposite relation not defined for field \"${relationField}\"`);\n }\n\n const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n if (!oppositeField.relation) {\n throw new InternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`);\n }\n if (!oppositeField.relation.fields) {\n throw new InternalError(`Relation fields not defined for field \"${relationField}\"`);\n }\n if (!oppositeField.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n\n // the opposite model owns the fk\n return {\n keyPairs: oppositeField.relation.fields.map((f, i) => ({\n fk: f,\n pk: oppositeField.relation!.references![i]!,\n })),\n ownedByModel: false,\n };\n }\n}\n\nexport function isScalarField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !fieldDef?.relation && !fieldDef?.foreignKeyFor;\n}\n\nexport function isForeignKeyField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.foreignKeyFor;\n}\n\nexport function isRelationField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.relation;\n}\n\nexport function isInheritedField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.originModel;\n}\n\nexport function getUniqueFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result: Array<\n // single field unique\n | { name: string; def: FieldDef }\n // multi-field unique\n | { name: string; defs: Record<string, FieldDef> }\n > = [];\n for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n if (typeof value !== 'object') {\n throw new InternalError(`Invalid unique field definition for \"${key}\"`);\n }\n\n if (typeof value.type === 'string') {\n // singular unique field\n result.push({ name: key, def: requireField(schema, model, key) });\n } else {\n // compound unique field\n result.push({\n name: key,\n defs: Object.fromEntries(Object.keys(value).map((k) => [k, requireField(schema, model, k)])),\n });\n }\n }\n return result;\n}\n\nexport function getIdValues(schema: SchemaDef, model: string, data: any): Record<string, any> {\n const idFields = getIdFields(schema, model);\n if (!idFields) {\n throw new InternalError(`ID fields not defined for model \"${model}\"`);\n }\n return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function buildFieldRef<Schema extends SchemaDef>(\n schema: Schema,\n model: string,\n field: string,\n options: ClientOptions<Schema>,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n): ExpressionWrapper<any, any, unknown> {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.computed) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n } else {\n if (!inlineComputedField) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n }\n let computer: Function | undefined;\n if ('computedFields' in options) {\n const computedFields = options.computedFields as Record<string, any>;\n computer = computedFields?.[model]?.[field];\n }\n if (!computer) {\n throw new QueryError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n }\n return computer(eb, { currentModel: modelAlias });\n }\n}\n\nexport function fieldHasDefaultValue(fieldDef: FieldDef) {\n return fieldDef.default !== undefined || fieldDef.updatedAt;\n}\n\nexport function isEnum(schema: SchemaDef, type: string) {\n return !!schema.enums?.[type];\n}\n\nexport function getEnum(schema: SchemaDef, type: string) {\n return schema.enums?.[type];\n}\n\nexport function buildJoinPairs(\n schema: SchemaDef,\n model: string,\n modelAlias: string,\n relationField: string,\n relationModelAlias: string,\n): [string, string][] {\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(schema, model, relationField);\n\n return keyPairs.map(({ fk, pk }) => {\n if (ownedByModel) {\n // the parent model owns the fk\n return [`${relationModelAlias}.${pk}`, `${modelAlias}.${fk}`];\n } else {\n // the relation side owns the fk\n return [`${relationModelAlias}.${fk}`, `${modelAlias}.${pk}`];\n }\n });\n}\n\nexport function makeDefaultOrderBy<Schema extends SchemaDef>(schema: SchemaDef, model: string) {\n const idFields = getIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.array || !fieldDef.relation?.opposite) {\n return undefined;\n }\n const oppositeFieldDef = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n if (oppositeFieldDef.array) {\n // Prisma's convention for many-to-many relation:\n // - model are sorted alphabetically by name\n // - join table is named _<model1>To<model2>, unless an explicit name is provided by `@relation`\n // - foreign keys are named A and B (based on the order of the model)\n const sortedModelNames = [model, fieldDef.type].sort();\n\n let orderedFK: [string, string];\n if (model !== fieldDef.type) {\n // not a self-relation, model name's sort order determines fk order\n orderedFK = sortedModelNames[0] === model ? ['A', 'B'] : ['B', 'A'];\n } else {\n // for self-relations, since model names are identical, relation field name's\n // sort order determines fk order\n const sortedFieldNames = [field, oppositeFieldDef.name].sort();\n orderedFK = sortedFieldNames[0] === field ? ['A', 'B'] : ['B', 'A'];\n }\n\n return {\n parentFkName: orderedFK[0],\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: orderedFK[1],\n joinTable: fieldDef.relation.name\n ? `_${fieldDef.relation.name}`\n : `_${sortedModelNames[0]}To${sortedModelNames[1]}`,\n };\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`\n */\nexport function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) {\n if (typeof filter !== 'object' || !filter) {\n return filter;\n }\n\n const uniqueFields = getUniqueFields(schema, model);\n const compoundUniques = uniqueFields.filter((u) => 'defs' in u);\n if (compoundUniques.length === 0) {\n return filter;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(filter)) {\n if (compoundUniques.some(({ name }) => name === key)) {\n // flatten the compound field\n Object.assign(result, value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n } else {\n return [value];\n }\n}\n\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n\nexport function extractIdFields(entity: any, schema: SchemaDef, model: string) {\n const idFields = getIdFields(schema, model);\n return extractFields(entity, idFields);\n}\n\nexport function getDiscriminatorField(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n if (!delegateAttr) {\n return undefined;\n }\n const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n throw new InternalError(`Discriminator field not defined for model \"${model}\"`);\n }\n return discriminator.value.field;\n}\n\nexport function getDelegateDescendantModels(\n schema: SchemaDef,\n model: string,\n collected: Set<ModelDef> = new Set<ModelDef>(),\n): ModelDef[] {\n const subModels = Object.values(schema.models).filter((m) => m.baseModel === model);\n subModels.forEach((def) => {\n if (!collected.has(def)) {\n collected.add(def);\n getDelegateDescendantModels(schema, def.name, collected);\n }\n });\n return [...collected];\n}\n\nexport function aggregate(eb: ExpressionBuilder<any, any>, expr: Expression<any>, op: AGGREGATE_OPERATORS) {\n return match(op)\n .with('_count', () => eb.fn.count(expr))\n .with('_sum', () => eb.fn.sum(expr))\n .with('_avg', () => eb.fn.avg(expr))\n .with('_min', () => eb.fn.min(expr))\n .with('_max', () => eb.fn.max(expr))\n .exhaustive();\n}\n","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from '.';\n\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return {\n kind: 'literal',\n value,\n };\n },\n\n array: (items: Expression[]): ArrayExpression => {\n return {\n kind: 'array',\n items,\n };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return {\n kind: 'call',\n function: functionName,\n args,\n };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression): BinaryExpression => {\n return {\n kind: 'binary',\n op,\n left,\n right,\n };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return {\n kind: 'unary',\n op,\n operand,\n };\n },\n\n field: (field: string): FieldExpression => {\n return {\n kind: 'field',\n field,\n };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return {\n kind: 'member',\n receiver: receiver,\n members,\n };\n },\n\n _this: (): ThisExpression => {\n return {\n kind: 'this',\n };\n },\n\n _null: (): NullExpression => {\n return {\n kind: 'null',\n };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n\n 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) {\n super(`Entity not found for model \"${model}\"`);\n }\n}\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 getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n makeDefaultOrderBy,\n requireField,\n requireModel,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\n constructor(\n protected readonly schema: Schema,\n protected readonly options: ClientOptions<Schema>,\n ) {}\n\n transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean) {\n return value;\n }\n\n // #region common query builders\n\n buildSelectModel(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string) {\n const modelDef = requireModel(this.schema, model);\n let result = eb.selectFrom(model === modelAlias ? model : `${model} as ${modelAlias}`);\n // join all delegate bases\n let joinBase = modelDef.baseModel;\n while (joinBase) {\n result = this.buildDelegateJoin(model, modelAlias, joinBase, result);\n joinBase = requireModel(this.schema, joinBase).baseModel;\n }\n return result;\n }\n\n buildFilterSortTake(\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true>,\n query: SelectQueryBuilder<any, any, {}>,\n modelAlias: string,\n ) {\n let result = query;\n\n // where\n if (args.where) {\n result = result.where((eb) => this.buildFilter(eb, model, modelAlias, args?.where));\n }\n\n // skip && take\n let negateOrderBy = false;\n const skip = args.skip;\n let take = args.take;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n result = this.buildSkipTake(result, skip, take);\n\n // orderBy\n result = this.buildOrderBy(\n result,\n model,\n modelAlias,\n args.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n // distinct\n if ('distinct' in args && (args as any).distinct) {\n const distinct = ensureArray((args as any).distinct) as string[];\n if (this.supportsDistinctOn) {\n result = result.distinctOn(distinct.map((f) => sql.ref(`${modelAlias}.${f}`)));\n } else {\n throw new QueryError(`\"distinct\" is not supported by \"${this.schema.provider.type}\" provider`);\n }\n }\n\n if (args.cursor) {\n result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy, modelAlias);\n }\n return result;\n }\n\n buildFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n where: boolean | object | undefined,\n ) {\n if (where === true || where === undefined) {\n return this.true(eb);\n }\n\n if (where === false) {\n return this.false(eb);\n }\n\n let result = this.true(eb);\n const _where = flattenCompoundUniqueFilters(this.schema, model, where);\n\n for (const [key, payload] of Object.entries(_where)) {\n if (payload === undefined) {\n continue;\n }\n\n if (key.startsWith('$')) {\n continue;\n }\n\n if (this.isLogicalCombinator(key)) {\n result = this.and(eb, result, this.buildCompositeFilter(eb, model, modelAlias, key, payload));\n continue;\n }\n\n const fieldDef = requireField(this.schema, model, key);\n\n if (fieldDef.relation) {\n result = this.and(eb, result, this.buildRelationFilter(eb, model, modelAlias, key, fieldDef, payload));\n } else {\n // if the field is from a base model, build a reference from that model\n const fieldRef = this.fieldRef(\n fieldDef.originModel ?? model,\n key,\n eb,\n fieldDef.originModel ?? modelAlias,\n );\n if (fieldDef.array) {\n result = this.and(eb, result, this.buildArrayFilter(eb, fieldRef, fieldDef, payload));\n } else {\n result = this.and(eb, result, this.buildPrimitiveFilter(eb, fieldRef, fieldDef, payload));\n }\n }\n }\n\n // call expression builder and combine the results\n if ('$expr' in _where && typeof _where['$expr'] === 'function') {\n result = this.and(eb, result, _where['$expr'](eb));\n }\n\n return result;\n }\n\n private buildCursorFilter(\n model: string,\n query: SelectQueryBuilder<any, any, any>,\n cursor: FindArgs<Schema, GetModels<Schema>, true>['cursor'],\n orderBy: FindArgs<Schema, GetModels<Schema>, true>['orderBy'],\n negateOrderBy: boolean,\n modelAlias: string,\n ) {\n const _orderBy = orderBy ?? makeDefaultOrderBy(this.schema, model);\n\n const orderByItems = ensureArray(_orderBy).flatMap((obj) => Object.entries<SortOrder>(obj));\n\n const eb = expressionBuilder<any, any>();\n const subQueryAlias = `${model}$cursor$sub`;\n const cursorFilter = this.buildFilter(eb, model, subQueryAlias, cursor);\n\n let result = query;\n const filters: ExpressionWrapper<any, any, any>[] = [];\n\n for (let i = orderByItems.length - 1; i >= 0; i--) {\n const andFilters: ExpressionWrapper<any, any, any>[] = [];\n\n for (let j = 0; j <= i; j++) {\n const [field, order] = orderByItems[j]!;\n const _order = negateOrderBy ? (order === 'asc' ? 'desc' : 'asc') : order;\n const op = j === i ? (_order === 'asc' ? '>=' : '<=') : '=';\n andFilters.push(\n eb(\n eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(eb, model, subQueryAlias)\n .select(`${subQueryAlias}.${field}`)\n .where(cursorFilter),\n ),\n );\n }\n\n filters.push(eb.and(andFilters));\n }\n\n result = result.where((eb) => eb.or(filters));\n\n return result;\n }\n\n private isLogicalCombinator(key: string): key is (typeof LOGICAL_COMBINATORS)[number] {\n return LOGICAL_COMBINATORS.includes(key as any);\n }\n\n protected buildCompositeFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n key: (typeof LOGICAL_COMBINATORS)[number],\n payload: any,\n ): Expression<SqlBool> {\n return match(key)\n .with('AND', () =>\n this.and(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('OR', () =>\n this.or(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('NOT', () => eb.not(this.buildCompositeFilter(eb, model, modelAlias, 'AND', payload)))\n .exhaustive();\n }\n\n private buildRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (!fieldDef.array) {\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n } else {\n return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n }\n }\n\n private buildToOneRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ): Expression<SqlBool> {\n if (payload === null) {\n const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n if (ownedByModel && !fieldDef.originModel) {\n // can be short-circuited to FK null check\n return this.and(eb, ...keyPairs.map(({ fk }) => eb(sql.ref(`${modelAlias}.${fk}`), 'is', null)));\n } else {\n // translate it to `{ is: null }` filter\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, { is: null });\n }\n }\n\n const joinAlias = `${modelAlias}$${field}`;\n const joinPairs = buildJoinPairs(\n this.schema,\n model,\n // if field is from a base, use the base model to join\n fieldDef.originModel ?? modelAlias,\n field,\n joinAlias,\n );\n const filterResultField = `${field}$filter`;\n\n const joinSelect = eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))))\n .select(() => eb.fn.count(eb.lit(1)).as(filterResultField));\n\n const conditions: Expression<SqlBool>[] = [];\n\n if ('is' in payload || 'isNot' in payload) {\n if ('is' in payload) {\n if (payload.is === null) {\n // check if not found\n conditions.push(eb(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.is)),\n '>',\n 0,\n ),\n );\n }\n }\n\n if ('isNot' in payload) {\n if (payload.isNot === null) {\n // check if found\n conditions.push(eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n eb,\n // is null\n eb(joinSelect, '=', 0),\n // found one that matches the filter\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\n }\n\n return this.and(eb, ...conditions);\n }\n\n private buildToManyRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n // null check needs to be converted to fk \"is null\" checks\n if (payload === null) {\n return eb(sql.ref(`${modelAlias}.${field}`), 'is', null);\n }\n\n const relationModel = fieldDef.type;\n\n // evaluating the filter involves creating an inner select,\n // give it an alias to avoid conflict\n const relationFilterSelectAlias = `${modelAlias}$${field}$filter`;\n\n const buildPkFkWhereRefs = (eb: ExpressionBuilder<any, any>) => {\n const m2m = getManyToManyRelation(this.schema, model, field);\n if (m2m) {\n // many-to-many relation\n const modelIdField = getIdFields(this.schema, model)[0]!;\n const relationIdField = getIdFields(this.schema, relationModel)[0]!;\n return eb(\n sql.ref(`${relationFilterSelectAlias}.${relationIdField}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n '=',\n sql.ref(`${modelAlias}.${modelIdField}`),\n ),\n );\n } else {\n const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n let result = this.true(eb);\n for (const { fk, pk } of relationKeyPairs.keyPairs) {\n if (relationKeyPairs.ownedByModel) {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${fk}`), '=', sql.ref(`${relationFilterSelectAlias}.${pk}`)),\n );\n } else {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${pk}`), '=', sql.ref(`${relationFilterSelectAlias}.${fk}`)),\n );\n }\n }\n return result;\n }\n };\n\n let result = this.true(eb);\n\n for (const [key, subPayload] of Object.entries(payload)) {\n if (!subPayload) {\n continue;\n }\n\n switch (key) {\n case 'some': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n eb1.not(\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n }\n }\n\n return result;\n }\n\n private buildArrayFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const clauses: Expression<SqlBool>[] = [];\n const fieldType = fieldDef.type as BuiltinType;\n\n for (const [key, _value] of Object.entries(payload)) {\n if (_value === undefined) {\n continue;\n }\n\n const value = this.transformPrimitive(_value, fieldType, !!fieldDef.array);\n\n switch (key) {\n case 'equals': {\n clauses.push(this.buildLiteralFilter(eb, fieldRef, fieldType, eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(eb(fieldRef, '@>', eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(eb(fieldRef, '@>', eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(eb(fieldRef, '&&', eb.val(value)));\n break;\n }\n\n case 'isEmpty': {\n clauses.push(eb(fieldRef, value === true ? '=' : '!=', eb.val([])));\n break;\n }\n\n default: {\n throw new InternalError(`Invalid array filter key: ${key}`);\n }\n }\n }\n\n return this.and(eb, ...clauses);\n }\n\n buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n if (payload === null) {\n return eb(fieldRef, 'is', null);\n }\n\n if (isEnum(this.schema, fieldDef.type)) {\n return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);\n }\n\n return (\n match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(eb, fieldRef, payload))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.buildNumberFilter(eb, fieldRef, type, payload),\n )\n .with('Boolean', () => this.buildBooleanFilter(eb, fieldRef, payload))\n .with('DateTime', () => this.buildDateTimeFilter(eb, fieldRef, payload))\n .with('Bytes', () => this.buildBytesFilter(eb, fieldRef, payload))\n // TODO: JSON filters\n .with('Json', () => {\n throw new InternalError('JSON filters are not supported yet');\n })\n .with('Unsupported', () => {\n throw new QueryError(`Unsupported field cannot be used in filters`);\n })\n .exhaustive()\n );\n }\n\n private buildLiteralFilter(eb: ExpressionBuilder<any, any>, lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\n }\n\n private buildStandardFilter(\n eb: ExpressionBuilder<any, any>,\n type: BuiltinType,\n payload: any,\n lhs: Expression<any>,\n getRhs: (value: unknown) => any,\n recurse: (value: unknown) => Expression<SqlBool>,\n throwIfInvalid = false,\n onlyForKeys: string[] | undefined = undefined,\n excludeKeys: string[] = [],\n ) {\n if (payload === null || !isPlainObject(payload)) {\n return {\n conditions: [this.buildLiteralFilter(eb, lhs, type, payload)],\n consumedKeys: [],\n };\n }\n\n const conditions: Expression<SqlBool>[] = [];\n const consumedKeys: string[] = [];\n\n for (const [op, value] of Object.entries(payload)) {\n if (onlyForKeys && !onlyForKeys.includes(op)) {\n continue;\n }\n if (excludeKeys.includes(op)) {\n continue;\n }\n const rhs = Array.isArray(value) ? value.map(getRhs) : getRhs(value);\n const condition = match(op)\n .with('equals', () => (rhs === null ? eb(lhs, 'is', null) : eb(lhs, '=', rhs)))\n .with('in', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.false(eb);\n } else {\n return eb(lhs, 'in', rhs);\n }\n })\n .with('notIn', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.true(eb);\n } else {\n return eb.not(eb(lhs, 'in', rhs));\n }\n })\n .with('lt', () => eb(lhs, '<', rhs))\n .with('lte', () => eb(lhs, '<=', rhs))\n .with('gt', () => eb(lhs, '>', rhs))\n .with('gte', () => eb(lhs, '>=', rhs))\n .with('not', () => eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (op) => {\n const innerResult = this.buildStandardFilter(\n eb,\n type,\n value,\n aggregate(eb, lhs, op),\n getRhs,\n recurse,\n throwIfInvalid,\n );\n consumedKeys.push(...innerResult.consumedKeys);\n return this.and(eb, ...innerResult.conditions);\n })\n .otherwise(() => {\n if (throwIfInvalid) {\n throw new QueryError(`Invalid filter key: ${op}`);\n } else {\n return undefined;\n }\n });\n\n if (condition) {\n conditions.push(condition);\n consumedKeys.push(op);\n }\n }\n\n return { conditions, consumedKeys };\n }\n\n private buildStringFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: StringFilter<Schema, true, boolean>,\n ) {\n let mode: 'default' | 'insensitive' | undefined;\n if (payload && typeof payload === 'object' && 'mode' in payload) {\n mode = payload.mode;\n }\n\n const { conditions, consumedKeys } = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n mode === 'insensitive' ? eb.fn('lower', [fieldRef]) : fieldRef,\n (value) => this.prepStringCasing(eb, value, mode),\n (value) => this.buildStringFilter(eb, fieldRef, value as StringFilter<Schema, true, boolean>),\n );\n\n if (payload && typeof payload === 'object') {\n for (const [key, value] of Object.entries(payload)) {\n if (key === 'mode' || consumedKeys.includes(key)) {\n // already consumed\n continue;\n }\n\n const condition = match(key)\n .with('contains', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}%`))\n : eb(fieldRef, 'like', sql.val(`%${value}%`)),\n )\n .with('startsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`${value}%`))\n : eb(fieldRef, 'like', sql.val(`${value}%`)),\n )\n .with('endsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}`))\n : eb(fieldRef, 'like', sql.val(`%${value}`)),\n )\n .otherwise(() => {\n throw new QueryError(`Invalid string filter key: ${key}`);\n });\n\n if (condition) {\n conditions.push(condition);\n }\n }\n }\n\n return this.and(eb, ...conditions);\n }\n\n private prepStringCasing(\n eb: ExpressionBuilder<any, any>,\n value: unknown,\n mode: 'default' | 'insensitive' | undefined,\n ): any {\n if (!mode || mode === 'default') {\n return value === null ? value : sql.val(value);\n }\n\n if (typeof value === 'string') {\n return eb.fn('lower', [sql.val(value)]);\n } else if (Array.isArray(value)) {\n return value.map((v) => this.prepStringCasing(eb, v, mode));\n } else {\n return value === null ? null : sql.val(value);\n }\n }\n\n private buildNumberFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n type: BuiltinType,\n payload: any,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n type,\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, type, false),\n (value) => this.buildNumberFilter(eb, fieldRef, type, value),\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBooleanFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BooleanFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'Boolean',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Boolean', false),\n (value) => this.buildBooleanFilter(eb, fieldRef, value as BooleanFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'not'],\n );\n return this.and(eb, ...conditions);\n }\n\n private buildDateTimeFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: DateTimeFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'DateTime',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'DateTime', false),\n (value) => this.buildDateTimeFilter(eb, fieldRef, value as DateTimeFilter<Schema, boolean, boolean>),\n true,\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBytesFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BytesFilter<Schema, boolean, boolean>,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'Bytes',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Bytes', false),\n (value) => this.buildBytesFilter(eb, fieldRef, value as BytesFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n private buildEnumFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n fieldRef,\n (value) => value,\n (value) => this.buildEnumFilter(eb, fieldRef, fieldDef, value),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n buildOrderBy(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n modelAlias: string,\n orderBy: OrArray<OrderBy<Schema, GetModels<Schema>, boolean, boolean>> | undefined,\n useDefaultIfEmpty: boolean,\n negated: boolean,\n ) {\n if (!orderBy) {\n if (useDefaultIfEmpty) {\n orderBy = makeDefaultOrderBy(this.schema, model);\n } else {\n return query;\n }\n }\n\n let result = query;\n enumerate(orderBy).forEach((orderBy) => {\n for (const [field, value] of Object.entries<any>(orderBy)) {\n if (!value) {\n continue;\n }\n\n // aggregations\n if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n invariant(value && typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\n for (const [k, v] of Object.entries<SortOrder>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) =>\n aggregate(eb, this.fieldRef(model, k, eb, modelAlias), field as AGGREGATE_OPERATORS),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n\n switch (field) {\n case '_count': {\n invariant(value && typeof value === 'object', 'invalid orderBy value for field \"_count\"');\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn.count(this.fieldRef(model, k, eb, modelAlias)),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n default:\n break;\n }\n\n const fieldDef = requireField(this.schema, model, field);\n\n if (!fieldDef.relation) {\n const fieldRef = this.fieldRef(model, field, expressionBuilder(), modelAlias);\n if (value === 'asc' || value === 'desc') {\n result = result.orderBy(fieldRef, this.negateSort(value, negated));\n } else if (\n value &&\n typeof value === 'object' &&\n 'nulls' in value &&\n 'sort' in value &&\n (value.sort === 'asc' || value.sort === 'desc') &&\n (value.nulls === 'first' || value.nulls === 'last')\n ) {\n result = result.orderBy(\n fieldRef,\n sql.raw(`${this.negateSort(value.sort, negated)} nulls ${value.nulls}`),\n );\n }\n } else {\n // order by relation\n const relationModel = fieldDef.type;\n\n if (fieldDef.array) {\n // order by to-many relation\n if (typeof value !== 'object') {\n throw new QueryError(`invalid orderBy value for field \"${field}\"`);\n }\n if ('_count' in value) {\n invariant(\n value._count === 'asc' || value._count === 'desc',\n 'invalid orderBy value for field \"_count\"',\n );\n const sort = this.negateSort(value._count, negated);\n result = result.orderBy((eb) => {\n const subQueryAlias = `${modelAlias}$orderBy$${field}$count`;\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n return subQuery;\n }, sort);\n }\n } else {\n // order by to-one relation\n result = result.leftJoin(relationModel, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n return join.on((eb) =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, fieldDef.type, relationModel, value, false, negated);\n }\n }\n }\n });\n\n return result;\n }\n\n buildSelectAllFields(\n model: string,\n query: SelectQueryBuilder<any, any, any>,\n omit: Record<string, boolean | undefined> | undefined,\n modelAlias: string,\n ) {\n const modelDef = requireModel(this.schema, model);\n let result = query;\n\n for (const field of Object.keys(modelDef.fields)) {\n if (isRelationField(this.schema, model, field)) {\n continue;\n }\n if (omit?.[field] === true) {\n continue;\n }\n result = this.buildSelectField(result, model, modelAlias, field);\n }\n\n // select all fields from delegate descendants and pack into a JSON field `$delegate$Model`\n const descendants = getDelegateDescendantModels(this.schema, model);\n for (const subModel of descendants) {\n result = this.buildDelegateJoin(model, modelAlias, subModel.name, result);\n result = result.select((eb) => {\n const jsonObject: Record<string, Expression<any>> = {};\n for (const field of Object.keys(subModel.fields)) {\n if (\n isRelationField(this.schema, subModel.name, field) ||\n isInheritedField(this.schema, subModel.name, field)\n ) {\n continue;\n }\n jsonObject[field] = eb.ref(`${subModel.name}.${field}`);\n }\n return this.buildJsonObject(eb, jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);\n });\n }\n\n return result;\n }\n\n 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 = getIdFields(this.schema, thisModel);\n query = query.leftJoin(otherModelAlias, (qb) => {\n for (const idField of idFields) {\n qb = qb.onRef(`${thisModelAlias}.${idField}`, '=', `${otherModelAlias}.${idField}`);\n }\n return qb;\n });\n return query;\n }\n\n buildCountJson(model: string, eb: ExpressionBuilder<any, any>, parentAlias: string, payload: any) {\n const modelDef = requireModel(this.schema, model);\n const toManyRelations = Object.entries(modelDef.fields).filter(([, field]) => field.relation && field.array);\n\n const selections =\n payload === true\n ? {\n select: toManyRelations.reduce(\n (acc, [field]) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n ),\n }\n : payload;\n\n const jsonObject: Record<string, Expression<any>> = {};\n\n for (const [field, value] of Object.entries(selections.select)) {\n const fieldDef = requireField(this.schema, model, field);\n const fieldModel = fieldDef.type;\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, fieldModel);\n\n // build a nested query to count the number of records in the relation\n let fieldCountQuery = eb.selectFrom(fieldModel).select(eb.fn.countAll().as(`_count$${field}`));\n\n // join conditions\n for (const [left, right] of joinPairs) {\n fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n }\n\n // merge _count filter\n if (\n value &&\n typeof value === 'object' &&\n 'where' in value &&\n value.where &&\n typeof value.where === 'object'\n ) {\n const filter = this.buildFilter(eb, fieldModel, fieldModel, value.where);\n fieldCountQuery = fieldCountQuery.where(filter);\n }\n\n jsonObject[field] = fieldCountQuery;\n }\n\n return this.buildJsonObject(eb, jsonObject);\n }\n\n // #endregion\n\n // #region utils\n\n private negateSort(sort: SortOrder, negated: boolean) {\n return negated ? (sort === 'asc' ? 'desc' : 'asc') : sort;\n }\n\n public true(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(false, 'Boolean', false) as boolean);\n }\n\n public isTrue(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === true || (node as ValueNode).value === 1;\n }\n\n public isFalse(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === false || (node as ValueNode).value === 0;\n }\n\n protected and(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonTrueArgs = args.filter((arg) => !this.isTrue(arg));\n if (nonTrueArgs.length === 0) {\n return this.true(eb);\n } else if (nonTrueArgs.length === 1) {\n return nonTrueArgs[0]!;\n } else {\n return eb.and(nonTrueArgs);\n }\n }\n\n protected or(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonFalseArgs = args.filter((arg) => !this.isFalse(arg));\n if (nonFalseArgs.length === 0) {\n return this.false(eb);\n } else if (nonFalseArgs.length === 1) {\n return nonFalseArgs[0]!;\n } else {\n return eb.or(nonFalseArgs);\n }\n }\n\n protected not(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n return eb.not(this.and(eb, ...args));\n }\n\n fieldRef(\n model: string,\n field: string,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n ) {\n return buildFieldRef(this.schema, model, field, this.options, eb, modelAlias, inlineComputedField);\n }\n\n 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 // #endregion\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class SqliteCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'sqlite' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, _forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => this.transformPrimitive(v, type, false));\n } else {\n if (this.schema.typeDefs && type in this.schema.typeDefs) {\n // typed JSON field\n return JSON.stringify(value);\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () => (value instanceof Date ? value.toISOString() : value))\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n return query.select((eb) =>\n this.buildRelationJSON(model, eb, relationField, parentAlias, payload).as(relationField),\n );\n }\n\n private buildRelationJSON(\n model: string,\n eb: ExpressionBuilder<any, any>,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n const relationModelDef = requireModel(this.schema, relationModel);\n\n const subQueryName = `${parentAlias}$${relationField}`;\n 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 = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n 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","import {\n AddColumnNode,\n AddConstraintNode,\n AddIndexNode,\n AggregateFunctionNode,\n AliasNode,\n AlterColumnNode,\n AlterTableNode,\n AndNode,\n BinaryOperationNode,\n CaseNode,\n CastNode,\n CheckConstraintNode,\n ColumnDefinitionNode,\n ColumnNode,\n ColumnUpdateNode,\n CommonTableExpressionNameNode,\n CommonTableExpressionNode,\n CreateIndexNode,\n CreateSchemaNode,\n CreateTableNode,\n CreateTypeNode,\n CreateViewNode,\n DataTypeNode,\n DefaultInsertValueNode,\n DefaultValueNode,\n DeleteQueryNode,\n DropColumnNode,\n DropConstraintNode,\n DropIndexNode,\n DropSchemaNode,\n DropTableNode,\n DropTypeNode,\n DropViewNode,\n ExplainNode,\n FetchNode,\n ForeignKeyConstraintNode,\n FromNode,\n FunctionNode,\n GeneratedNode,\n GroupByItemNode,\n GroupByNode,\n HavingNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n JSONOperatorChainNode,\n JSONPathLegNode,\n JSONPathNode,\n JSONReferenceNode,\n LimitNode,\n ListNode,\n MatchedNode,\n MergeQueryNode,\n ModifyColumnNode,\n OffsetNode,\n OnConflictNode,\n OnDuplicateKeyNode,\n OnNode,\n OperationNodeVisitor,\n OperatorNode,\n OrderByItemNode,\n OrderByNode,\n OrNode,\n OutputNode,\n OverNode,\n ParensNode,\n PartitionByItemNode,\n PartitionByNode,\n PrimitiveValueListNode,\n RawNode,\n ReferenceNode,\n ReferencesNode,\n RenameColumnNode,\n ReturningNode,\n SchemableIdentifierNode,\n SelectAllNode,\n SelectionNode,\n SelectModifierNode,\n SelectQueryNode,\n SetOperationNode,\n TableNode,\n TopNode,\n TupleNode,\n UnaryOperationNode,\n UniqueConstraintNode,\n UpdateQueryNode,\n UsingNode,\n ValueListNode,\n ValueNode,\n ValuesNode,\n WhenNode,\n WhereNode,\n WithNode,\n type OperationNode,\n type PrimaryKeyConstraintNode,\n} from 'kysely';\n\nexport class DefaultOperationNodeVisitor extends OperationNodeVisitor {\n protected defaultVisit(node: OperationNode) {\n Object.values(node).forEach((value) => {\n if (!value) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((el) => this.defaultVisit(el));\n }\n if (typeof value === 'object' && 'kind' in value && typeof value.kind === 'string') {\n this.visitNode(value);\n }\n });\n }\n\n protected override visitSelectQuery(node: SelectQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelection(node: SelectionNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumn(node: ColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlias(node: AliasNode): void {\n this.defaultVisit(node);\n }\n protected override visitTable(node: TableNode): void {\n this.defaultVisit(node);\n }\n protected override visitFrom(node: FromNode): void {\n this.defaultVisit(node);\n }\n protected override visitReference(node: ReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitAnd(node: AndNode): void {\n this.defaultVisit(node);\n }\n protected override visitOr(node: OrNode): void {\n this.defaultVisit(node);\n }\n protected override visitValueList(node: ValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitParens(node: ParensNode): void {\n this.defaultVisit(node);\n }\n protected override visitJoin(node: JoinNode): void {\n this.defaultVisit(node);\n }\n protected override visitRaw(node: RawNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhere(node: WhereNode): void {\n this.defaultVisit(node);\n }\n protected override visitInsertQuery(node: InsertQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitDeleteQuery(node: DeleteQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitReturning(node: ReturningNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateTable(node: CreateTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddColumn(node: AddColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnDefinition(node: ColumnDefinitionNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropTable(node: DropTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderBy(node: OrderByNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderByItem(node: OrderByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupBy(node: GroupByNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupByItem(node: GroupByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitUpdateQuery(node: UpdateQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnUpdate(node: ColumnUpdateNode): void {\n this.defaultVisit(node);\n }\n protected override visitLimit(node: LimitNode): void {\n this.defaultVisit(node);\n }\n protected override visitOffset(node: OffsetNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnConflict(node: OnConflictNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnDuplicateKey(node: OnDuplicateKeyNode): void {\n this.defaultVisit(node);\n }\n protected override visitCheckConstraint(node: CheckConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDataType(node: DataTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectAll(node: SelectAllNode): void {\n this.defaultVisit(node);\n }\n protected override visitIdentifier(node: IdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitSchemableIdentifier(node: SchemableIdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitValue(node: ValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimitiveValueList(node: PrimitiveValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitOperator(node: OperatorNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateIndex(node: CreateIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropIndex(node: DropIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitList(node: ListNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimaryKeyConstraint(node: PrimaryKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitUniqueConstraint(node: UniqueConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitReferences(node: ReferencesNode): void {\n this.defaultVisit(node);\n }\n protected override visitWith(node: WithNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpression(node: CommonTableExpressionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void {\n this.defaultVisit(node);\n }\n protected override visitHaving(node: HavingNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateSchema(node: CreateSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropSchema(node: DropSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterTable(node: AlterTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropColumn(node: DropColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitRenameColumn(node: RenameColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterColumn(node: AlterColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitModifyColumn(node: ModifyColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddConstraint(node: AddConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropConstraint(node: DropConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateView(node: CreateViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropView(node: DropViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitGenerated(node: GeneratedNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultValue(node: DefaultValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitOn(node: OnNode): void {\n this.defaultVisit(node);\n }\n protected override visitValues(node: ValuesNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectModifier(node: SelectModifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateType(node: CreateTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropType(node: DropTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitExplain(node: ExplainNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultInsertValue(node: DefaultInsertValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitAggregateFunction(node: AggregateFunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitOver(node: OverNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionBy(node: PartitionByNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionByItem(node: PartitionByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitSetOperation(node: SetOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitBinaryOperation(node: BinaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUnaryOperation(node: UnaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUsing(node: UsingNode): void {\n this.defaultVisit(node);\n }\n protected override visitFunction(node: FunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCase(node: CaseNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhen(node: WhenNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONReference(node: JSONReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPath(node: JSONPathNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPathLeg(node: JSONPathLegNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONOperatorChain(node: JSONOperatorChainNode): void {\n this.defaultVisit(node);\n }\n protected override visitTuple(node: TupleNode): void {\n this.defaultVisit(node);\n }\n protected override visitMergeQuery(node: MergeQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitMatched(node: MatchedNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddIndex(node: AddIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitCast(node: CastNode): void {\n this.defaultVisit(node);\n }\n protected override visitFetch(node: FetchNode): void {\n this.defaultVisit(node);\n }\n protected override visitTop(node: TopNode): void {\n this.defaultVisit(node);\n }\n protected override visitOutput(node: OutputNode): void {\n this.defaultVisit(node);\n }\n}\n","import type { ColumnNode, OperationNode } from 'kysely';\nimport { DefaultOperationNodeVisitor } from '../../utils/default-operation-node-visitor';\n\n/**\n * Collects all column names from a query.\n */\nexport class ColumnCollector extends DefaultOperationNodeVisitor {\n private columns: string[] = [];\n\n collect(node: OperationNode) {\n this.columns = [];\n this.visitNode(node);\n return this.columns;\n }\n\n protected override visitColumn(node: ColumnNode): void {\n if (!this.columns.includes(node.column.name)) {\n this.columns.push(node.column.name);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n expressionBuilder,\n FromNode,\n FunctionNode,\n IdentifierNode,\n OperatorNode,\n ReferenceNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n ValueListNode,\n ValueNode,\n WhereNode,\n type ExpressionBuilder,\n type OperandExpression,\n type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ClientOptions } from '../../client/options';\nimport { getRelationForeignKeyFieldPairs, requireField } from '../../client/query-utils';\nimport type {\n BinaryExpression,\n BinaryOperator,\n BuiltinType,\n FieldDef,\n GetModels,\n LiteralExpression,\n MemberExpression,\n UnaryExpression,\n} from '../../schema';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type SchemaDef,\n} from '../../schema';\nimport { ExpressionEvaluator } from './expression-evaluator';\nimport { conjunction, disjunction, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\n thisEntity?: Record<string, OperationNode>;\n thisEntityRaw?: Record<string, unknown>;\n auth?: any;\n memberFilter?: OperationNode;\n memberSelect?: SelectionNode;\n};\n\n// a registry of expression handlers marked with @expr\nconst expressionHandlers = new Map<string, PropertyDescriptor>();\n\n// expression handler decorator\nfunction expr(kind: Expression['kind']) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!expressionHandlers.get(kind)) {\n expressionHandlers.set(kind, descriptor);\n }\n return descriptor;\n };\n}\n\nexport class ExpressionTransformer<Schema extends SchemaDef> {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(\n private readonly schema: Schema,\n private readonly clientOptions: ClientOptions<Schema>,\n private readonly auth: unknown | undefined,\n ) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get authType() {\n if (!this.schema.authType) {\n throw new InternalError('Schema does not have an \"authType\" specified');\n }\n return this.schema.authType;\n }\n\n transform(expression: Expression, context: ExpressionTransformerContext<Schema>): OperationNode {\n const handler = expressionHandlers.get(expression.kind);\n if (!handler) {\n throw new Error(`Unsupported expression kind: ${expression.kind}`);\n }\n return handler.value.call(this, expression, context);\n }\n\n @expr('literal')\n // @ts-expect-error\n private _literal(expr: LiteralExpression) {\n return this.transformValue(\n expr.value,\n typeof expr.value === 'string' ? 'String' : typeof expr.value === 'boolean' ? 'Boolean' : 'Int',\n );\n }\n\n @expr('array')\n // @ts-expect-error\n private _array(expr: ArrayExpression, context: ExpressionTransformerContext<Schema>) {\n return ValueListNode.create(expr.items.map((item) => this.transform(item, context)));\n }\n\n @expr('field')\n // @ts-expect-error\n private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n if (context.thisEntity) {\n return context.thisEntity[expr.field];\n } else {\n return this.createColumnRef(expr.field, context);\n }\n } else {\n const { memberFilter, memberSelect, ...restContext } = context;\n const relation = this.transformRelationAccess(expr.field, fieldDef.type, restContext);\n return {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n }\n\n private mergeWhere(where: WhereNode | undefined, memberFilter: OperationNode | undefined) {\n if (!where) {\n return WhereNode.create(memberFilter ?? trueNode(this.dialect));\n }\n if (!memberFilter) {\n return where;\n }\n return WhereNode.create(conjunction(this.dialect, [where.where, memberFilter]));\n }\n\n @expr('null')\n // @ts-ignore\n private _null() {\n return ValueNode.createImmediate(null);\n }\n\n @expr('binary')\n // @ts-ignore\n private _binary(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n if (expr.op === '&&') {\n return conjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n } else if (expr.op === '||') {\n return disjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n }\n\n if (this.isAuthCall(expr.left) || this.isAuthCall(expr.right)) {\n return this.transformAuthBinary(expr);\n }\n\n const op = expr.op;\n\n if (op === '?' || op === '!' || op === '^') {\n return this.transformCollectionPredicate(expr, context);\n }\n\n const left = this.transform(expr.left, context);\n const right = this.transform(expr.right, context);\n\n if (op === 'in') {\n if (this.isNullNode(left)) {\n return this.transformValue(false, 'Boolean');\n } else {\n if (ValueListNode.is(right)) {\n return BinaryOperationNode.create(left, OperatorNode.create('in'), right);\n } else {\n // array contains\n return BinaryOperationNode.create(\n left,\n OperatorNode.create('='),\n FunctionNode.create('any', [right]),\n );\n }\n }\n }\n\n if (this.isNullNode(right)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(left, OperatorNode.create('is'), right)\n : BinaryOperationNode.create(left, OperatorNode.create('is not'), right);\n } else if (this.isNullNode(left)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(right, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(right, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n\n private transformCollectionPredicate(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n invariant(expr.op === '?' || expr.op === '!' || expr.op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n if (this.isAuthCall(expr.left) || this.isAuthMember(expr.left)) {\n const value = new ExpressionEvaluator().evaluate(expr, {\n auth: this.auth,\n });\n return this.transformValue(value, 'Boolean');\n }\n\n invariant(\n ExpressionUtils.isField(expr.left) || ExpressionUtils.isMember(expr.left),\n 'left operand must be field or member access',\n );\n\n let newContextModel: string;\n if (ExpressionUtils.isField(expr.left)) {\n const fieldDef = requireField(this.schema, context.model, expr.left.field);\n newContextModel = fieldDef.type;\n } else {\n invariant(ExpressionUtils.isField(expr.left.receiver));\n const fieldDef = requireField(this.schema, context.model, expr.left.receiver.field);\n newContextModel = fieldDef.type;\n for (const member of expr.left.members) {\n const memberDef = requireField(this.schema, newContextModel, member);\n newContextModel = memberDef.type;\n }\n }\n\n let predicateFilter = this.transform(expr.right, {\n ...context,\n model: newContextModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (expr.op === '!') {\n predicateFilter = logicalNot(predicateFilter);\n }\n\n const count = FunctionNode.create('count', [ValueNode.createImmediate(1)]);\n\n const predicateResult = match(expr.op)\n .with('?', () => BinaryOperationNode.create(count, OperatorNode.create('>'), ValueNode.createImmediate(0)))\n .with('!', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .with('^', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .exhaustive();\n\n return this.transform(expr.left, {\n ...context,\n memberSelect: SelectionNode.create(AliasNode.create(predicateResult, IdentifierNode.create('$t'))),\n memberFilter: predicateFilter,\n });\n }\n\n private transformAuthBinary(expr: BinaryExpression) {\n if (expr.op !== '==' && expr.op !== '!=') {\n throw new Error(`Unsupported operator for auth call: ${expr.op}`);\n }\n let other: Expression;\n if (this.isAuthCall(expr.left)) {\n other = expr.right;\n } else {\n other = expr.left;\n }\n\n if (ExpressionUtils.isNull(other)) {\n return this.transformValue(expr.op === '==' ? !this.auth : !!this.auth, 'Boolean');\n } else {\n throw new Error('Unsupported binary expression with `auth()`');\n }\n }\n\n private transformValue(value: unknown, type: BuiltinType) {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\n\n @expr('unary')\n // @ts-ignore\n private _unary(expr: UnaryExpression, context: ExpressionTransformerContext<Schema>) {\n // only '!' operator for now\n invariant(expr.op === '!', 'only \"!\" operator is supported');\n return BinaryOperationNode.create(\n this.transform(expr.operand, context),\n this.transformOperator('!='),\n trueNode(this.dialect),\n );\n }\n\n private transformOperator(op: Exclude<BinaryOperator, '?' | '!' | '^'>) {\n const mappedOp = match(op)\n .with('==', () => '=' as const)\n .otherwise(() => op);\n return OperatorNode.create(mappedOp);\n }\n\n @expr('call')\n // @ts-ignore\n private _call(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const result = this.transformCall(expr, context);\n return result.toOperationNode();\n }\n\n private transformCall(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const func = this.clientOptions.functions?.[expr.function];\n if (!func) {\n throw new QueryError(`Function not implemented: ${expr.function}`);\n }\n const eb = expressionBuilder<any, any>();\n return func(\n eb,\n (expr.args ?? []).map((arg) => this.transformCallArg(eb, arg, context)),\n {\n dialect: this.dialect,\n model: context.model,\n operation: context.operation,\n },\n );\n }\n\n private transformCallArg(\n eb: ExpressionBuilder<any, any>,\n arg: Expression,\n context: ExpressionTransformerContext<Schema>,\n ): OperandExpression<any> {\n if (ExpressionUtils.isLiteral(arg)) {\n return eb.val(arg.value);\n }\n\n if (ExpressionUtils.isField(arg)) {\n return context.thisEntityRaw ? eb.val(context.thisEntityRaw[arg.field]) : eb.ref(arg.field);\n }\n\n if (ExpressionUtils.isCall(arg)) {\n return this.transformCall(arg, context);\n }\n\n if (this.isAuthMember(arg)) {\n const valNode = this.valueMemberAccess(context.auth, arg as MemberExpression, this.authType);\n return valNode ? eb.val(valNode.value) : eb.val(null);\n }\n\n // TODO\n // if (Expression.isMember(arg)) {\n // }\n\n throw new InternalError(`Unsupported argument expression: ${arg.kind}`);\n }\n\n @expr('member')\n // @ts-ignore\n private _member(expr: MemberExpression, context: ExpressionTransformerContext<Schema>) {\n // auth() member access\n if (this.isAuthCall(expr.receiver)) {\n return this.valueMemberAccess(this.auth, expr, this.authType);\n }\n\n invariant(ExpressionUtils.isField(expr.receiver), 'expect receiver to be field expression');\n\n const { memberFilter, memberSelect, ...restContext } = context;\n\n const receiver = this.transform(expr.receiver, restContext);\n invariant(SelectQueryNode.is(receiver), 'expected receiver to be select query');\n\n // relation member access\n const receiverField = requireField(this.schema, context.model, expr.receiver.field);\n\n // traverse forward to collect member types\n const memberFields: { fromModel: string; fieldDef: FieldDef }[] = [];\n let currType = receiverField.type;\n for (const member of expr.members) {\n const fieldDef = requireField(this.schema, currType, member);\n memberFields.push({ fieldDef, fromModel: currType });\n currType = fieldDef.type;\n }\n\n let currNode: SelectQueryNode | ColumnNode | ReferenceNode | undefined = undefined;\n\n for (let i = expr.members.length - 1; i >= 0; i--) {\n const member = expr.members[i]!;\n const { fieldDef, fromModel } = memberFields[i]!;\n\n if (fieldDef.relation) {\n const relation = this.transformRelationAccess(member, fieldDef.type, {\n ...restContext,\n model: fromModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (currNode) {\n invariant(SelectQueryNode.is(currNode), 'expected select query node');\n currNode = {\n ...relation,\n selections: [\n SelectionNode.create(\n AliasNode.create(currNode, IdentifierNode.create(expr.members[i + 1]!)),\n ),\n ],\n };\n } else {\n // inner most member, merge with member filter from the context\n currNode = {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n } else {\n invariant(i === expr.members.length - 1, 'plain field access must be the last segment');\n invariant(!currNode, 'plain field access must be the last segment');\n\n currNode = ColumnNode.create(member);\n }\n }\n\n return {\n ...receiver,\n selections: [SelectionNode.create(AliasNode.create(currNode!, IdentifierNode.create('$t')))],\n };\n }\n\n private valueMemberAccess(receiver: any, expr: MemberExpression, receiverType: string) {\n if (!receiver) {\n return ValueNode.createImmediate(null);\n }\n\n if (expr.members.length !== 1) {\n throw new Error(`Only single member access is supported`);\n }\n\n const field = expr.members[0]!;\n const fieldDef = requireField(this.schema, receiverType, field);\n const fieldValue = receiver[field] ?? null;\n return this.transformValue(fieldValue, fieldDef.type as BuiltinType);\n }\n\n private transformRelationAccess(\n field: string,\n relationModel: string,\n context: ExpressionTransformerContext<Schema>,\n ): SelectQueryNode {\n const fromModel = context.model;\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, fromModel, field);\n\n if (context.thisEntity) {\n let condition: OperationNode;\n if (ownedByModel) {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![fk]!,\n ),\n ),\n );\n } else {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![pk]!,\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n } else {\n let condition: OperationNode;\n if (ownedByModel) {\n // `fromModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n ),\n ),\n );\n } else {\n // `relationModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n }\n }\n\n private createColumnRef(column: string, context: ExpressionTransformerContext<Schema>): ReferenceNode {\n return ReferenceNode.create(ColumnNode.create(column), TableNode.create(context.alias ?? context.model));\n }\n\n private isAuthCall(value: unknown): value is CallExpression {\n return ExpressionUtils.isCall(value) && value.function === 'auth';\n }\n\n private isAuthMember(expr: Expression) {\n return ExpressionUtils.isMember(expr) && this.isAuthCall(expr.receiver);\n }\n\n private isNullNode(node: OperationNode) {\n return ValueNode.is(node) && node.value === null;\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type BinaryExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type LiteralExpression,\n type MemberExpression,\n type UnaryExpression,\n} from '../../schema';\n\ntype ExpressionEvaluatorContext = {\n auth?: any;\n thisValue?: any;\n};\n\n/**\n * Evaluate a schema expression into a JavaScript value.\n */\nexport class ExpressionEvaluator {\n evaluate(expression: Expression, context: ExpressionEvaluatorContext): any {\n const result = match(expression)\n .when(ExpressionUtils.isArray, (expr) => this.evaluateArray(expr, context))\n .when(ExpressionUtils.isBinary, (expr) => this.evaluateBinary(expr, context))\n .when(ExpressionUtils.isField, (expr) => this.evaluateField(expr, context))\n .when(ExpressionUtils.isLiteral, (expr) => this.evaluateLiteral(expr))\n .when(ExpressionUtils.isMember, (expr) => this.evaluateMember(expr, context))\n .when(ExpressionUtils.isUnary, (expr) => this.evaluateUnary(expr, context))\n .when(ExpressionUtils.isCall, (expr) => this.evaluateCall(expr, context))\n .when(ExpressionUtils.isThis, () => context.thisValue)\n .when(ExpressionUtils.isNull, () => null)\n .exhaustive();\n\n return result ?? null;\n }\n\n private evaluateCall(expr: CallExpression, context: ExpressionEvaluatorContext): any {\n if (expr.function === 'auth') {\n return context.auth;\n } else {\n throw new Error(`Unsupported call expression function: ${expr.function}`);\n }\n }\n\n private evaluateUnary(expr: UnaryExpression, context: ExpressionEvaluatorContext) {\n return match(expr.op)\n .with('!', () => !this.evaluate(expr.operand, context))\n .exhaustive();\n }\n\n private evaluateMember(expr: MemberExpression, context: ExpressionEvaluatorContext) {\n let val = this.evaluate(expr.receiver, context);\n for (const member of expr.members) {\n val = val?.[member];\n }\n return val;\n }\n\n private evaluateLiteral(expr: LiteralExpression): any {\n return expr.value;\n }\n\n private evaluateField(expr: FieldExpression, context: ExpressionEvaluatorContext): any {\n return context.thisValue?.[expr.field];\n }\n\n private evaluateArray(expr: ArrayExpression, context: ExpressionEvaluatorContext) {\n return expr.items.map((item) => this.evaluate(item, context));\n }\n\n private evaluateBinary(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n if (expr.op === '?' || expr.op === '!' || expr.op === '^') {\n return this.evaluateCollectionPredicate(expr, context);\n }\n\n const left = this.evaluate(expr.left, context);\n const right = this.evaluate(expr.right, context);\n\n return match(expr.op)\n .with('==', () => left === right)\n .with('!=', () => left !== right)\n .with('>', () => left > right)\n .with('>=', () => left >= right)\n .with('<', () => left < right)\n .with('<=', () => left <= right)\n .with('&&', () => left && right)\n .with('||', () => left || right)\n .with('in', () => {\n const _right = right ?? [];\n invariant(Array.isArray(_right), 'expected array for \"in\" operator');\n return _right.includes(left);\n })\n .exhaustive();\n }\n\n private evaluateCollectionPredicate(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n const op = expr.op;\n invariant(op === '?' || op === '!' || op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n const left = this.evaluate(expr.left, context);\n if (!left) {\n return false;\n }\n\n invariant(Array.isArray(left), 'expected array');\n\n return match(op)\n .with('?', () => left.some((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with('!', () => left.every((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with(\n '^',\n () =>\n !left.some((item: any) =>\n this.evaluate(expr.right, {\n ...context,\n thisValue: item,\n }),\n ),\n )\n .exhaustive();\n }\n}\n","import type { OperationNode } from 'kysely';\nimport {\n AliasNode,\n AndNode,\n BinaryOperationNode,\n FunctionNode,\n OperatorNode,\n OrNode,\n ParensNode,\n ReferenceNode,\n TableNode,\n UnaryOperationNode,\n ValueNode,\n} from 'kysely';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport type { SchemaDef } from '../../schema';\n\n/**\n * Creates a `true` value node.\n */\nexport function trueNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(true, 'Boolean', false));\n}\n\n/**\n * Creates a `false` value node.\n */\nexport function falseNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(false, 'Boolean', false));\n}\n\n/**\n * Checks if a node is a truthy value node.\n */\nexport function isTrueNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === true || node.value === 1);\n}\n\n/**\n * Checks if a node is a falsy value node.\n */\nexport function isFalseNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === false || node.value === 0);\n}\n\n/**\n * Builds a logical conjunction of a list of nodes.\n */\nexport function conjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isFalseNode)) {\n return falseNode(dialect);\n }\n const items = nodes.filter((n) => !isTrueNode(n));\n if (items.length === 0) {\n return trueNode(dialect);\n }\n return items.reduce((acc, node) =>\n OrNode.is(node)\n ? AndNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : AndNode.create(acc, node),\n );\n}\n\nexport function disjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isTrueNode)) {\n return trueNode(dialect);\n }\n const items = nodes.filter((n) => !isFalseNode(n));\n if (items.length === 0) {\n return falseNode(dialect);\n }\n return items.reduce((acc, node) =>\n AndNode.is(node)\n ? OrNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : OrNode.create(acc, node),\n );\n}\n\n/**\n * Negates a logical expression.\n */\nexport function logicalNot(node: OperationNode): OperationNode {\n return UnaryOperationNode.create(\n OperatorNode.create('not'),\n AndNode.is(node) || OrNode.is(node)\n ? ParensNode.create(node) // wraps parentheses\n : node,\n );\n}\n\n/**\n * Builds an expression node that checks if a node is true.\n */\nexport function buildIsTrue<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isTrueNode(node)) {\n return trueNode(dialect);\n } else if (isFalseNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(node, OperatorNode.create('='), trueNode(dialect));\n}\n\n/**\n * Builds an expression node that checks if a node is false.\n */\nexport function buildIsFalse<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isFalseNode(node)) {\n return trueNode(dialect);\n } else if (isTrueNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(\n // coalesce so null is treated as false\n FunctionNode.create('coalesce', [node, falseNode(dialect)]),\n OperatorNode.create('='),\n falseNode(dialect),\n );\n}\n\n/**\n * Gets the table name from a node.\n */\nexport function getTableName(node: OperationNode | undefined) {\n if (!node) {\n return node;\n }\n if (TableNode.is(node)) {\n return node.table.identifier.name;\n } else if (AliasNode.is(node)) {\n return getTableName(node.node);\n } else if (ReferenceNode.is(node) && node.table) {\n return getTableName(node.table);\n }\n return undefined;\n}\n","import { type OnKyselyQueryArgs, type RuntimePlugin } from '../../client/plugin';\nimport type { SchemaDef } from '../../schema';\nimport { PolicyHandler } from './policy-handler';\n\nexport class PolicyPlugin<Schema extends SchemaDef> implements RuntimePlugin<Schema> {\n get id() {\n return 'policy';\n }\n\n get name() {\n return 'Access Policy';\n }\n\n get description() {\n return 'Enforces access policies defined in the schema.';\n }\n\n onKyselyQuery({ query, client, proceed /*, transaction*/ }: OnKyselyQueryArgs<Schema>) {\n const handler = new PolicyHandler<Schema>(client);\n return handler.handle(query, proceed /*, transaction*/);\n }\n}\n"],"mappings":"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","names":["RejectedByPolicyError","Error","model","reason","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","FromNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","TableNode","UpdateQueryNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","sql","match","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","match","ExpressionUtils","literal","value","kind","array","items","call","functionName","args","function","binary","left","op","right","unary","operand","field","member","receiver","members","_this","_null","and","expr","expressions","reduce","acc","exp","or","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","getLiteralValue","undefined","QueryError","Error","message","cause","InternalError","getModel","schema","model","models","requireModel","matchedName","Object","keys","find","k","toLowerCase","QueryError","getField","field","modelDef","fields","requireField","getIdFields","idFields","getRelationForeignKeyFieldPairs","schema","model","relationField","fieldDef","requireField","relation","InternalError","fields","references","keyPairs","map","f","i","fk","pk","ownedByModel","opposite","oppositeField","type","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","currentModel","isEnum","schema","type","enums","buildJoinPairs","schema","model","modelAlias","relationField","relationModelAlias","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","map","fk","pk","makeDefaultOrderBy","idFields","getIdFields","f","getManyToManyRelation","field","fieldDef","requireField","array","relation","opposite","undefined","oppositeFieldDef","type","sortedModelNames","sort","orderedFK","sortedFieldNames","name","parentFkName","otherModel","otherField","otherFkName","joinTable","flattenCompoundUniqueFilters","filter","uniqueFields","getUniqueFields","compoundUniques","u","length","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","isPlainObject","expressionBuilder","sql","match","P","enumerate","x","undefined","Array","isArray","BaseCrudDialect","schema","options","transformPrimitive","value","_type","_forArrayField","buildSelectModel","eb","model","modelAlias","modelDef","requireModel","result","selectFrom","joinBase","baseModel","buildDelegateJoin","buildFilterSortTake","args","query","where","buildFilter","negateOrderBy","skip","take","undefined","buildSkipTake","buildOrderBy","orderBy","distinct","ensureArray","supportsDistinctOn","distinctOn","map","f","sql","ref","QueryError","provider","type","cursor","buildCursorFilter","true","false","_where","flattenCompoundUniqueFilters","key","payload","Object","entries","startsWith","isLogicalCombinator","and","buildCompositeFilter","fieldDef","requireField","relation","buildRelationFilter","fieldRef","originModel","array","buildArrayFilter","buildPrimitiveFilter","_orderBy","makeDefaultOrderBy","orderByItems","flatMap","obj","expressionBuilder","subQueryAlias","cursorFilter","filters","i","length","andFilters","j","field","order","_order","op","push","select","or","LOGICAL_COMBINATORS","includes","match","with","enumerate","subPayload","not","exhaustive","buildToOneRelationFilter","buildToManyRelationFilter","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","fk","is","joinAlias","joinPairs","buildJoinPairs","filterResultField","joinSelect","left","right","fn","count","lit","as","conditions","isNot","relationModel","relationFilterSelectAlias","buildPkFkWhereRefs","m2m","getManyToManyRelation","modelIdField","getIdFields","relationIdField","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","InternalError","isEnum","buildEnumFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","lhs","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","invariant","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","mode","prepStringCasing","v","useDefaultIfEmpty","negated","forEach","k","raw","negateSort","sort","nulls","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","fields","isRelationField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","buildModelSelect","selectAllFields","computed","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","filter","selections","reduce","acc","fieldModel","fieldCountQuery","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","buildFieldRef","canJoinWithoutNestedSelect","computedFields","isDelegate","PostgresCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toString","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","relationResultName","joinedQuery","buildRelationJSON","select","qb","resultName","relationFieldDef","requireField","schema","relationModel","leftJoinLateral","eb","relationSelectName","relationModelDef","requireModel","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","subQuery","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","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","invariant","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","Array","isArray","map","v","schema","typeDefs","JSON","stringify","match","with","Date","toISOString","toString","Buffer","from","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","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","getIdFields","relationIds","invariant","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","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","OperationNodeVisitor","DefaultOperationNodeVisitor","OperationNodeVisitor","defaultVisit","node","Object","values","forEach","value","Array","isArray","el","kind","visitNode","visitSelectQuery","visitSelection","visitColumn","visitAlias","visitTable","visitFrom","visitReference","visitAnd","visitOr","visitValueList","visitParens","visitJoin","visitRaw","visitWhere","visitInsertQuery","visitDeleteQuery","visitReturning","visitCreateTable","visitAddColumn","visitColumnDefinition","visitDropTable","visitOrderBy","visitOrderByItem","visitGroupBy","visitGroupByItem","visitUpdateQuery","visitColumnUpdate","visitLimit","visitOffset","visitOnConflict","visitOnDuplicateKey","visitCheckConstraint","visitDataType","visitSelectAll","visitIdentifier","visitSchemableIdentifier","visitValue","visitPrimitiveValueList","visitOperator","visitCreateIndex","visitDropIndex","visitList","visitPrimaryKeyConstraint","visitUniqueConstraint","visitReferences","visitWith","visitCommonTableExpression","visitCommonTableExpressionName","visitHaving","visitCreateSchema","visitDropSchema","visitAlterTable","visitDropColumn","visitRenameColumn","visitAlterColumn","visitModifyColumn","visitAddConstraint","visitDropConstraint","visitForeignKeyConstraint","visitCreateView","visitDropView","visitGenerated","visitDefaultValue","visitOn","visitValues","visitSelectModifier","visitCreateType","visitDropType","visitExplain","visitDefaultInsertValue","visitAggregateFunction","visitOver","visitPartitionBy","visitPartitionByItem","visitSetOperation","visitBinaryOperation","visitUnaryOperation","visitUsing","visitFunction","visitCase","visitWhen","visitJSONReference","visitJSONPath","visitJSONPathLeg","visitJSONOperatorChain","visitTuple","visitMergeQuery","visitMatched","visitAddIndex","visitCast","visitFetch","visitTop","visitOutput","ColumnCollector","DefaultOperationNodeVisitor","columns","collect","node","visitNode","visitColumn","includes","column","name","push","invariant","AliasNode","BinaryOperationNode","ColumnNode","expressionBuilder","FromNode","FunctionNode","IdentifierNode","OperatorNode","ReferenceNode","SelectionNode","SelectQueryNode","TableNode","ValueListNode","ValueNode","WhereNode","match","invariant","match","ExpressionEvaluator","evaluate","expression","context","result","match","when","ExpressionUtils","isArray","expr","evaluateArray","isBinary","evaluateBinary","isField","evaluateField","isLiteral","evaluateLiteral","isMember","evaluateMember","isUnary","evaluateUnary","isCall","evaluateCall","isThis","thisValue","isNull","exhaustive","function","auth","Error","op","with","operand","val","receiver","member","members","value","field","items","map","item","evaluateCollectionPredicate","left","right","_right","invariant","Array","includes","some","every","AliasNode","AndNode","BinaryOperationNode","FunctionNode","OperatorNode","OrNode","ParensNode","ReferenceNode","TableNode","UnaryOperationNode","ValueNode","trueNode","dialect","ValueNode","createImmediate","transformPrimitive","falseNode","isTrueNode","node","is","value","isFalseNode","conjunction","nodes","some","items","filter","n","length","reduce","acc","OrNode","AndNode","create","ParensNode","disjunction","logicalNot","UnaryOperationNode","OperatorNode","buildIsFalse","node","dialect","isFalseNode","trueNode","isTrueNode","falseNode","BinaryOperationNode","create","FunctionNode","OperatorNode","getTableName","TableNode","is","table","identifier","name","AliasNode","ReferenceNode","undefined","expressionHandlers","Map","expr","kind","_target","_propertyKey","descriptor","get","set","ExpressionTransformer","dialect","schema","clientOptions","auth","getCrudDialect","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","thisEntity","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformOperator","invariant","isAuthMember","ExpressionEvaluator","evaluate","ExpressionUtils","isField","isMember","newContextModel","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","other","isNull","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","result","transformCall","toOperationNode","func","functions","function","QueryError","eb","expressionBuilder","args","arg","transformCallArg","operation","isLiteral","val","thisEntityRaw","ref","isCall","valNode","valueMemberAccess","_member","SelectQueryNode","receiverField","memberFields","currType","push","fromModel","currNode","i","length","ColumnNode","receiverType","fieldValue","relationModel","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","column","node","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","isMutationQueryNode","transformNode","mutationRequiresTransaction","mutationModel","getMutationModel","InsertQueryNode","is","constCondition","tryGetConstantPolicy","returning","enforcePreCreatePolicy","transformedNode","result","onlyReturningId","readBackResult","processReadBack","rows","length","idFields","getIdFields","collector","ColumnCollector","selectedColumns","collect","every","c","includes","columns","values","model","fields","map","column","name","valueRows","unwrapCreateValueRows","enforcePreCreatePolicyForOne","v","raw","valuesRaw","thisEntity","thisEntityRaw","i","filter","buildPolicyFilter","preCreateCheck","kind","selections","SelectionNode","create","AliasNode","IdentifierNode","$condition","ValuesNode","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","invariant","item","fieldDef","requireField","push","ValueNode","transformPrimitive","value","type","array","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","table","idConditions","buildIdConditions","policyFilter","select","from","FromNode","TableNode","where","WhereNode","conjunction","selectResult","disjunction","row","field","BinaryOperationNode","ColumnNode","OperatorNode","r","match","when","getTableName","into","UpdateQueryNode","DeleteQueryNode","froms","exhaustive","SelectQueryNode","alias","falseNode","allows","policy","transformPolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","transformSelectQuery","whereNode","forEach","extractResult","extractTableName","baseResult","transformInsertQuery","ReturningNode","transformUpdateQuery","transformDeleteQuery","identifier","inner","ExpressionTransformer","$auth","transform","auth","modelName","modelDef","requireModel","extractOperations","split","trim","attributes","attr","operations","args","PolicyPlugin","id","name","description","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/plugins/policy/errors.ts","../../../src/plugins/policy/policy-handler.ts","../../../src/client/crud/dialects/index.ts","../../../src/client/crud/dialects/postgresql.ts","../../../src/client/constants.ts","../../../src/client/query-utils.ts","../../../src/schema/expression.ts","../../../src/client/errors.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 * Error thrown when an operation is rejected by access policy.\n */\nexport class RejectedByPolicyError extends Error {\n constructor(\n public readonly model: string | undefined,\n public readonly reason?: string,\n ) {\n super(reason ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n FunctionNode,\n IdentifierNode,\n InsertQueryNode,\n OperationNodeTransformer,\n OperatorNode,\n ParensNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\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 } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getIdFields, requireField, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError } from './errors';\nimport { ExpressionTransformer } from './expression-transformer';\nimport type { Policy, PolicyOperation } from './types';\nimport { buildIsFalse, conjunction, disjunction, falseNode, getTableName } from './utils';\n\nexport type CrudQueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport type MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport class PolicyHandler<Schema extends SchemaDef> extends OperationNodeTransformer {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(private readonly client: ClientContract<Schema>) {\n super();\n this.dialect = getCrudDialect(this.client.$schema, this.client.$options);\n }\n\n get kysely() {\n return this.client.$qb;\n }\n\n async handle(\n node: RootOperationNode,\n proceed: ProceedKyselyQueryFunction /*, transaction: OnKyselyQueryTransaction*/,\n ) {\n if (!this.isCrudQueryNode(node)) {\n // non-CRUD queries are not allowed\n throw new RejectedByPolicyError(undefined, 'non-CRUD queries are not allowed');\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed read without transaction\n return proceed(this.transformNode(node));\n }\n\n let mutationRequiresTransaction = false;\n const mutationModel = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // reject create if unconditional deny\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n } else if (constCondition === undefined) {\n mutationRequiresTransaction = true;\n }\n }\n\n if (!mutationRequiresTransaction && !node.returning) {\n // transform and proceed mutation without transaction\n return proceed(this.transformNode(node));\n }\n\n if (InsertQueryNode.is(node)) {\n await this.enforcePreCreatePolicy(node, proceed);\n }\n const transformedNode = this.transformNode(node);\n const result = await proceed(transformedNode);\n\n if (!this.onlyReturningId(node)) {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n }\n return readBackResult;\n } else {\n return result;\n }\n\n // TODO: run in transaction\n // let readBackError = false;\n\n // transform and post-process in a transaction\n // const result = await transaction(async (txProceed) => {\n // if (InsertQueryNode.is(node)) {\n // await this.enforcePreCreatePolicy(node, txProceed);\n // }\n // const transformedNode = this.transformNode(node);\n // const result = await txProceed(transformedNode);\n\n // if (!this.onlyReturningId(node)) {\n // const readBackResult = await this.processReadBack(node, result, txProceed);\n // if (readBackResult.rows.length !== result.rows.length) {\n // readBackError = true;\n // }\n // return readBackResult;\n // } else {\n // return result;\n // }\n // });\n\n // if (readBackError) {\n // throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n // }\n\n // return result;\n }\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n const collector = new ColumnCollector();\n const selectedColumns = collector.collect(node.returning);\n return selectedColumns.every((c) => idFields.includes(c));\n }\n\n private async enforcePreCreatePolicy(node: InsertQueryNode, proceed: ProceedKyselyQueryFunction) {\n const model = this.getMutationModel(node);\n const fields = node.columns?.map((c) => c.column.name) ?? [];\n const valueRows = node.values ? this.unwrapCreateValueRows(node.values, model, fields) : [[]];\n for (const values of valueRows) {\n await this.enforcePreCreatePolicyForOne(\n model,\n fields,\n values.map((v) => v.node),\n proceed,\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.keys(requireModel(this.client.$schema, model).fields);\n const allValues: OperationNode[] = [];\n\n for (const fieldName of allFields) {\n const index = fields.indexOf(fieldName);\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 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((field, index) =>\n SelectionNode.create(\n AliasNode.create(ColumnNode.create(`column${index + 1}`), IdentifierNode.create(field)),\n ),\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(node: OperationNode, model: GetModels<Schema>, fields: string[]) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(data: readonly unknown[], model: GetModels<Schema>, fields: string[]) {\n invariant(data.length === fields.length, 'data length must match fields length');\n const result: { node: OperationNode; raw: unknown }[] = [];\n for (let i = 0; i < data.length; i++) {\n const item = data[i]!;\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n if (typeof item === 'object' && item && 'kind' in item) {\n invariant(item.kind === 'ValueNode', 'expecting a ValueNode');\n result.push({\n node: ValueNode.create(\n this.dialect.transformPrimitive(\n (item as ValueNode).value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n ),\n ),\n raw: (item as ValueNode).value,\n });\n } else {\n const value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n if (Array.isArray(value)) {\n result.push({\n node: RawNode.createWithSql(this.dialect.buildArrayLiteralSQL(value)),\n raw: value,\n });\n } else {\n result.push({ node: ValueNode.create(value), raw: value });\n }\n }\n }\n return result;\n }\n\n private tryGetConstantPolicy(model: GetModels<Schema>, operation: PolicyOperation) {\n const policies = this.getModelPolicies(model, operation);\n if (!policies.some((p) => p.kind === 'allow')) {\n // no allow -> unconditional deny\n return false;\n } else if (\n // unconditional deny\n policies.some((p) => p.kind === 'deny' && this.isTrueExpr(p.condition))\n ) {\n return false;\n } else if (\n // unconditional allow\n !policies.some((p) => p.kind === 'deny') &&\n policies.some((p) => p.kind === 'allow' && this.isTrueExpr(p.condition))\n ) {\n return true;\n } else {\n return undefined;\n }\n }\n\n private isTrueExpr(expr: Expression) {\n return ExpressionUtils.isLiteral(expr) && expr.value === true;\n }\n\n private async processReadBack(node: CrudQueryNode, result: QueryResult<any>, proceed: ProceedKyselyQueryFunction) {\n if (result.rows.length === 0) {\n return result;\n }\n\n if (!this.isMutationQueryNode(node) || !node.returning) {\n return result;\n }\n\n // do a select (with policy) in place of returning\n const table = this.getMutationModel(node);\n if (!table) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n\n const idConditions = this.buildIdConditions(table, result.rows);\n const policyFilter = this.buildPolicyFilter(table, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(table)]),\n where: WhereNode.create(conjunction(this.dialect, [idConditions, policyFilter])),\n selections: node.returning.selections,\n };\n const selectResult = await proceed(select);\n return selectResult;\n }\n\n private buildIdConditions(table: string, rows: any[]): OperationNode {\n const idFields = getIdFields(this.client.$schema, table);\n return disjunction(\n this.dialect,\n rows.map((row) =>\n conjunction(\n this.dialect,\n idFields.map((field) =>\n BinaryOperationNode.create(\n ColumnNode.create(field),\n OperatorNode.create('='),\n ValueNode.create(row[field]),\n ),\n ),\n ),\n ),\n );\n }\n\n private getMutationModel(node: InsertQueryNode | UpdateQueryNode | DeleteQueryNode) {\n const r = match(node)\n .when(InsertQueryNode.is, (node) => getTableName(node.into) as GetModels<Schema>)\n .when(UpdateQueryNode.is, (node) => getTableName(node.table) as GetModels<Schema>)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError('Only one from table is supported for delete');\n }\n return getTableName(node.from.froms[0]) as GetModels<Schema>;\n })\n .exhaustive();\n if (!r) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n return r;\n }\n\n private isCrudQueryNode(node: RootOperationNode): node is CrudQueryNode {\n return (\n SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node)\n );\n }\n\n private isMutationQueryNode(node: RootOperationNode): node is MutationQueryNode {\n return InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node);\n }\n\n private buildPolicyFilter(model: GetModels<Schema>, alias: string | undefined, operation: CRUD) {\n const policies = this.getModelPolicies(model, operation);\n if (policies.length === 0) {\n return falseNode(this.dialect);\n }\n\n const allows = policies\n .filter((policy) => policy.kind === 'allow')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.transformPolicyCondition(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 protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = node.where;\n\n node.from?.froms.forEach((from) => {\n const extractResult = this.extractTableName(from);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, filter]) : filter,\n );\n }\n });\n\n const baseResult = super.transformSelectQuery({\n ...node,\n where: undefined,\n });\n\n return {\n ...baseResult,\n where: whereNode,\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n const result = super.transformInsertQuery(node);\n if (!node.returning) {\n return result;\n }\n if (this.onlyReturningId(node)) {\n return result;\n } else {\n // only return ID fields, that's enough for reading back the inserted row\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n return {\n ...result,\n returning: ReturningNode.create(\n idFields.map((field) => SelectionNode.create(ColumnNode.create(field))),\n ),\n };\n }\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const result = super.transformUpdateQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'update');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n protected override transformDeleteQuery(node: DeleteQueryNode) {\n const result = super.transformDeleteQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'delete');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n private extractTableName(from: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(from)) {\n return { model: from.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(from)) {\n const inner = this.extractTableName(from.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(from.alias) ? from.alias.name : undefined,\n };\n } else {\n // this can happen for subqueries, which will be handled when nested\n // transformation happens\n return undefined;\n }\n }\n\n private transformPolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n ) {\n return new ExpressionTransformer(this.client.$schema, this.client.$options, this.client.$auth).transform(\n policy.condition,\n {\n model,\n alias,\n operation,\n auth: this.client.$auth,\n },\n );\n }\n\n private getModelPolicies(modelName: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, modelName);\n const result: Policy[] = [];\n\n const extractOperations = (expr: Expression) => {\n invariant(ExpressionUtils.isLiteral(expr), 'expecting a literal');\n invariant(typeof expr.value === 'string', 'expecting a string literal');\n return expr.value\n .split(',')\n .filter((v) => !!v)\n .map((v) => v.trim()) as PolicyOperation[];\n };\n\n if (modelDef.attributes) {\n result.push(\n ...modelDef.attributes\n .filter((attr) => attr.name === '@@allow' || attr.name === '@@deny')\n .map(\n (attr) =>\n ({\n kind: attr.name === '@@allow' ? 'allow' : 'deny',\n operations: extractOperations(attr.args![0]!.value),\n condition: attr.args![1]!.value,\n }) as const,\n )\n .filter((policy) => policy.operations.includes('all') || policy.operations.includes(operation)),\n );\n }\n return result;\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base-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 {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildJoinPairs,\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-dialect';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (type === 'Json' && !forArrayField) {\n // node-pg incorrectly handles array values passed to non-array JSON fields,\n // the workaround is to JSON stringify the value\n // https://github.com/brianc/node-postgres/issues/374\n return JSON.stringify(value);\n } else {\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date ? value : typeof value === 'string' ? new Date(value) : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const 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 = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n 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","/**\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 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 = requireModel(schema, model);\n return modelDef?.idFields as GetModels<Schema>[];\n}\n\nexport function requireIdFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result = modelDef?.idFields;\n if (!result) {\n throw new InternalError(`Model \"${model}\" does not have ID field(s)`);\n }\n return result;\n}\n\nexport function getRelationForeignKeyFieldPairs(schema: SchemaDef, model: string, relationField: string) {\n const fieldDef = requireField(schema, model, relationField);\n\n if (!fieldDef?.relation) {\n throw new InternalError(`Field \"${relationField}\" is not a relation`);\n }\n\n if (fieldDef.relation.fields) {\n if (!fieldDef.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n // this model owns the fk\n return {\n keyPairs: fieldDef.relation.fields.map((f, i) => ({\n fk: f,\n pk: fieldDef.relation!.references![i]!,\n })),\n ownedByModel: true,\n };\n } else {\n if (!fieldDef.relation.opposite) {\n throw new InternalError(`Opposite relation not defined for field \"${relationField}\"`);\n }\n\n const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n if (!oppositeField.relation) {\n throw new InternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`);\n }\n if (!oppositeField.relation.fields) {\n throw new InternalError(`Relation fields not defined for field \"${relationField}\"`);\n }\n if (!oppositeField.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n\n // the opposite model owns the fk\n return {\n keyPairs: oppositeField.relation.fields.map((f, i) => ({\n fk: f,\n pk: oppositeField.relation!.references![i]!,\n })),\n ownedByModel: false,\n };\n }\n}\n\nexport function isScalarField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !fieldDef?.relation && !fieldDef?.foreignKeyFor;\n}\n\nexport function isForeignKeyField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.foreignKeyFor;\n}\n\nexport function isRelationField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.relation;\n}\n\nexport function isInheritedField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = getField(schema, model, field);\n return !!fieldDef?.originModel;\n}\n\nexport function getUniqueFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result: Array<\n // single field unique\n | { name: string; def: FieldDef }\n // multi-field unique\n | { name: string; defs: Record<string, FieldDef> }\n > = [];\n for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n if (typeof value !== 'object') {\n throw new InternalError(`Invalid unique field definition for \"${key}\"`);\n }\n\n if (typeof value.type === 'string') {\n // singular unique field\n result.push({ name: key, def: requireField(schema, model, key) });\n } else {\n // compound unique field\n result.push({\n name: key,\n defs: Object.fromEntries(Object.keys(value).map((k) => [k, requireField(schema, model, k)])),\n });\n }\n }\n return result;\n}\n\nexport function getIdValues(schema: SchemaDef, model: string, data: any): Record<string, any> {\n const idFields = getIdFields(schema, model);\n if (!idFields) {\n throw new InternalError(`ID fields not defined for model \"${model}\"`);\n }\n return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function buildFieldRef<Schema extends SchemaDef>(\n schema: Schema,\n model: string,\n field: string,\n options: ClientOptions<Schema>,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n inlineComputedField = true,\n): ExpressionWrapper<any, any, unknown> {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.computed) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n } else {\n if (!inlineComputedField) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n }\n let computer: Function | undefined;\n if ('computedFields' in options) {\n const computedFields = options.computedFields as Record<string, any>;\n computer = computedFields?.[model]?.[field];\n }\n if (!computer) {\n throw new QueryError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n }\n return computer(eb, { currentModel: modelAlias });\n }\n}\n\nexport function fieldHasDefaultValue(fieldDef: FieldDef) {\n return fieldDef.default !== undefined || fieldDef.updatedAt;\n}\n\nexport function isEnum(schema: SchemaDef, type: string) {\n return !!schema.enums?.[type];\n}\n\nexport function getEnum(schema: SchemaDef, type: string) {\n return schema.enums?.[type];\n}\n\nexport function buildJoinPairs(\n schema: SchemaDef,\n model: string,\n modelAlias: string,\n relationField: string,\n relationModelAlias: string,\n): [string, string][] {\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(schema, model, relationField);\n\n return keyPairs.map(({ fk, pk }) => {\n if (ownedByModel) {\n // the parent model owns the fk\n return [`${relationModelAlias}.${pk}`, `${modelAlias}.${fk}`];\n } else {\n // the relation side owns the fk\n return [`${relationModelAlias}.${fk}`, `${modelAlias}.${pk}`];\n }\n });\n}\n\nexport function makeDefaultOrderBy<Schema extends SchemaDef>(schema: SchemaDef, model: string) {\n const idFields = getIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.array || !fieldDef.relation?.opposite) {\n return undefined;\n }\n const oppositeFieldDef = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n if (oppositeFieldDef.array) {\n // Prisma's convention for many-to-many relation:\n // - model are sorted alphabetically by name\n // - join table is named _<model1>To<model2>, unless an explicit name is provided by `@relation`\n // - foreign keys are named A and B (based on the order of the model)\n const sortedModelNames = [model, fieldDef.type].sort();\n\n let orderedFK: [string, string];\n if (model !== fieldDef.type) {\n // not a self-relation, model name's sort order determines fk order\n orderedFK = sortedModelNames[0] === model ? ['A', 'B'] : ['B', 'A'];\n } else {\n // for self-relations, since model names are identical, relation field name's\n // sort order determines fk order\n const sortedFieldNames = [field, oppositeFieldDef.name].sort();\n orderedFK = sortedFieldNames[0] === field ? ['A', 'B'] : ['B', 'A'];\n }\n\n return {\n parentFkName: orderedFK[0],\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: orderedFK[1],\n joinTable: fieldDef.relation.name\n ? `_${fieldDef.relation.name}`\n : `_${sortedModelNames[0]}To${sortedModelNames[1]}`,\n };\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`\n */\nexport function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) {\n if (typeof filter !== 'object' || !filter) {\n return filter;\n }\n\n const uniqueFields = getUniqueFields(schema, model);\n const compoundUniques = uniqueFields.filter((u) => 'defs' in u);\n if (compoundUniques.length === 0) {\n return filter;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(filter)) {\n if (compoundUniques.some(({ name }) => name === key)) {\n // flatten the compound field\n Object.assign(result, value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n } else {\n return [value];\n }\n}\n\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n\nexport function extractIdFields(entity: any, schema: SchemaDef, model: string) {\n const idFields = getIdFields(schema, model);\n return extractFields(entity, idFields);\n}\n\nexport function getDiscriminatorField(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n if (!delegateAttr) {\n return undefined;\n }\n const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n throw new InternalError(`Discriminator field not defined for model \"${model}\"`);\n }\n return discriminator.value.field;\n}\n\nexport function getDelegateDescendantModels(\n schema: SchemaDef,\n model: string,\n collected: Set<ModelDef> = new Set<ModelDef>(),\n): ModelDef[] {\n const subModels = Object.values(schema.models).filter((m) => m.baseModel === model);\n subModels.forEach((def) => {\n if (!collected.has(def)) {\n collected.add(def);\n getDelegateDescendantModels(schema, def.name, collected);\n }\n });\n return [...collected];\n}\n\nexport function aggregate(eb: ExpressionBuilder<any, any>, expr: Expression<any>, op: AGGREGATE_OPERATORS) {\n return match(op)\n .with('_count', () => eb.fn.count(expr))\n .with('_sum', () => eb.fn.sum(expr))\n .with('_avg', () => eb.fn.avg(expr))\n .with('_min', () => eb.fn.min(expr))\n .with('_max', () => eb.fn.max(expr))\n .exhaustive();\n}\n","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from '.';\n\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return {\n kind: 'literal',\n value,\n };\n },\n\n array: (items: Expression[]): ArrayExpression => {\n return {\n kind: 'array',\n items,\n };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return {\n kind: 'call',\n function: functionName,\n args,\n };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression): BinaryExpression => {\n return {\n kind: 'binary',\n op,\n left,\n right,\n };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return {\n kind: 'unary',\n op,\n operand,\n };\n },\n\n field: (field: string): FieldExpression => {\n return {\n kind: 'field',\n field,\n };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return {\n kind: 'member',\n receiver: receiver,\n members,\n };\n },\n\n _this: (): ThisExpression => {\n return {\n kind: 'this',\n };\n },\n\n _null: (): NullExpression => {\n return {\n kind: 'null',\n };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n 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, 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 getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n isInheritedField,\n isRelationField,\n makeDefaultOrderBy,\n requireField,\n requireModel,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\n constructor(\n protected readonly schema: Schema,\n protected readonly options: ClientOptions<Schema>,\n ) {}\n\n transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean) {\n return value;\n }\n\n // #region common query builders\n\n buildSelectModel(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string) {\n const modelDef = requireModel(this.schema, model);\n let result = eb.selectFrom(model === modelAlias ? model : `${model} as ${modelAlias}`);\n // join all delegate bases\n let joinBase = modelDef.baseModel;\n while (joinBase) {\n result = this.buildDelegateJoin(model, modelAlias, joinBase, result);\n joinBase = requireModel(this.schema, joinBase).baseModel;\n }\n return result;\n }\n\n buildFilterSortTake(\n model: GetModels<Schema>,\n args: FindArgs<Schema, GetModels<Schema>, true>,\n query: SelectQueryBuilder<any, any, {}>,\n modelAlias: string,\n ) {\n let result = query;\n\n // where\n if (args.where) {\n result = result.where((eb) => this.buildFilter(eb, model, modelAlias, args?.where));\n }\n\n // skip && take\n let negateOrderBy = false;\n const skip = args.skip;\n let take = args.take;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n result = this.buildSkipTake(result, skip, take);\n\n // orderBy\n result = this.buildOrderBy(\n result,\n model,\n modelAlias,\n args.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n\n // distinct\n if ('distinct' in args && (args as any).distinct) {\n const distinct = ensureArray((args as any).distinct) as string[];\n if (this.supportsDistinctOn) {\n result = result.distinctOn(distinct.map((f) => sql.ref(`${modelAlias}.${f}`)));\n } else {\n throw new QueryError(`\"distinct\" is not supported by \"${this.schema.provider.type}\" provider`);\n }\n }\n\n if (args.cursor) {\n result = this.buildCursorFilter(model, result, args.cursor, args.orderBy, negateOrderBy, modelAlias);\n }\n return result;\n }\n\n buildFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n where: boolean | object | undefined,\n ) {\n if (where === true || where === undefined) {\n return this.true(eb);\n }\n\n if (where === false) {\n return this.false(eb);\n }\n\n let result = this.true(eb);\n const _where = flattenCompoundUniqueFilters(this.schema, model, where);\n\n for (const [key, payload] of Object.entries(_where)) {\n if (payload === undefined) {\n continue;\n }\n\n if (key.startsWith('$')) {\n continue;\n }\n\n if (this.isLogicalCombinator(key)) {\n result = this.and(eb, result, this.buildCompositeFilter(eb, model, modelAlias, key, payload));\n continue;\n }\n\n const fieldDef = requireField(this.schema, model, key);\n\n if (fieldDef.relation) {\n result = this.and(eb, result, this.buildRelationFilter(eb, model, modelAlias, key, fieldDef, payload));\n } else {\n // if the field is from a base model, build a reference from that model\n const fieldRef = this.fieldRef(\n fieldDef.originModel ?? model,\n key,\n eb,\n fieldDef.originModel ?? modelAlias,\n );\n if (fieldDef.array) {\n result = this.and(eb, result, this.buildArrayFilter(eb, fieldRef, fieldDef, payload));\n } else {\n result = this.and(eb, result, this.buildPrimitiveFilter(eb, fieldRef, fieldDef, payload));\n }\n }\n }\n\n // call expression builder and combine the results\n if ('$expr' in _where && typeof _where['$expr'] === 'function') {\n result = this.and(eb, result, _where['$expr'](eb));\n }\n\n return result;\n }\n\n private buildCursorFilter(\n model: string,\n query: SelectQueryBuilder<any, any, any>,\n cursor: FindArgs<Schema, GetModels<Schema>, true>['cursor'],\n orderBy: FindArgs<Schema, GetModels<Schema>, true>['orderBy'],\n negateOrderBy: boolean,\n modelAlias: string,\n ) {\n const _orderBy = orderBy ?? makeDefaultOrderBy(this.schema, model);\n\n const orderByItems = ensureArray(_orderBy).flatMap((obj) => Object.entries<SortOrder>(obj));\n\n const eb = expressionBuilder<any, any>();\n const subQueryAlias = `${model}$cursor$sub`;\n const cursorFilter = this.buildFilter(eb, model, subQueryAlias, cursor);\n\n let result = query;\n const filters: ExpressionWrapper<any, any, any>[] = [];\n\n for (let i = orderByItems.length - 1; i >= 0; i--) {\n const andFilters: ExpressionWrapper<any, any, any>[] = [];\n\n for (let j = 0; j <= i; j++) {\n const [field, order] = orderByItems[j]!;\n const _order = negateOrderBy ? (order === 'asc' ? 'desc' : 'asc') : order;\n const op = j === i ? (_order === 'asc' ? '>=' : '<=') : '=';\n andFilters.push(\n eb(\n eb.ref(`${modelAlias}.${field}`),\n op,\n this.buildSelectModel(eb, model, subQueryAlias)\n .select(`${subQueryAlias}.${field}`)\n .where(cursorFilter),\n ),\n );\n }\n\n filters.push(eb.and(andFilters));\n }\n\n result = result.where((eb) => eb.or(filters));\n\n return result;\n }\n\n private isLogicalCombinator(key: string): key is (typeof LOGICAL_COMBINATORS)[number] {\n return LOGICAL_COMBINATORS.includes(key as any);\n }\n\n protected buildCompositeFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n key: (typeof LOGICAL_COMBINATORS)[number],\n payload: any,\n ): Expression<SqlBool> {\n return match(key)\n .with('AND', () =>\n this.and(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('OR', () =>\n this.or(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('NOT', () => eb.not(this.buildCompositeFilter(eb, model, modelAlias, 'AND', payload)))\n .exhaustive();\n }\n\n private buildRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (!fieldDef.array) {\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n } else {\n return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n }\n }\n\n private buildToOneRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ): Expression<SqlBool> {\n if (payload === null) {\n const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n if (ownedByModel && !fieldDef.originModel) {\n // can be short-circuited to FK null check\n return this.and(eb, ...keyPairs.map(({ fk }) => eb(sql.ref(`${modelAlias}.${fk}`), 'is', null)));\n } else {\n // translate it to `{ is: null }` filter\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, { is: null });\n }\n }\n\n const joinAlias = `${modelAlias}$${field}`;\n const joinPairs = buildJoinPairs(\n this.schema,\n model,\n // if field is from a base, use the base model to join\n fieldDef.originModel ?? modelAlias,\n field,\n joinAlias,\n );\n const filterResultField = `${field}$filter`;\n\n const joinSelect = eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))))\n .select(() => eb.fn.count(eb.lit(1)).as(filterResultField));\n\n const conditions: Expression<SqlBool>[] = [];\n\n if ('is' in payload || 'isNot' in payload) {\n if ('is' in payload) {\n if (payload.is === null) {\n // check if not found\n conditions.push(eb(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.is)),\n '>',\n 0,\n ),\n );\n }\n }\n\n if ('isNot' in payload) {\n if (payload.isNot === null) {\n // check if found\n conditions.push(eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n eb,\n // is null\n eb(joinSelect, '=', 0),\n // found one that matches the filter\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\n }\n\n return this.and(eb, ...conditions);\n }\n\n private buildToManyRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n // null check needs to be converted to fk \"is null\" checks\n if (payload === null) {\n return eb(sql.ref(`${modelAlias}.${field}`), 'is', null);\n }\n\n const relationModel = fieldDef.type;\n\n // evaluating the filter involves creating an inner select,\n // give it an alias to avoid conflict\n const relationFilterSelectAlias = `${modelAlias}$${field}$filter`;\n\n const buildPkFkWhereRefs = (eb: ExpressionBuilder<any, any>) => {\n const m2m = getManyToManyRelation(this.schema, model, field);\n if (m2m) {\n // many-to-many relation\n const modelIdField = getIdFields(this.schema, model)[0]!;\n const relationIdField = getIdFields(this.schema, relationModel)[0]!;\n return eb(\n sql.ref(`${relationFilterSelectAlias}.${relationIdField}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n '=',\n sql.ref(`${modelAlias}.${modelIdField}`),\n ),\n );\n } else {\n const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n let result = this.true(eb);\n for (const { fk, pk } of relationKeyPairs.keyPairs) {\n if (relationKeyPairs.ownedByModel) {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${fk}`), '=', sql.ref(`${relationFilterSelectAlias}.${pk}`)),\n );\n } else {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${modelAlias}.${pk}`), '=', sql.ref(`${relationFilterSelectAlias}.${fk}`)),\n );\n }\n }\n return result;\n }\n };\n\n let result = this.true(eb);\n\n for (const [key, subPayload] of Object.entries(payload)) {\n if (!subPayload) {\n continue;\n }\n\n switch (key) {\n case 'some': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n eb1.not(\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n eb,\n result,\n eb(\n this.buildSelectModel(eb, relationModel, relationFilterSelectAlias)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('$count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n this.buildFilter(eb1, relationModel, relationFilterSelectAlias, subPayload),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n }\n }\n\n return result;\n }\n\n private buildArrayFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const clauses: Expression<SqlBool>[] = [];\n const fieldType = fieldDef.type as BuiltinType;\n\n for (const [key, _value] of Object.entries(payload)) {\n if (_value === undefined) {\n continue;\n }\n\n const value = this.transformPrimitive(_value, fieldType, !!fieldDef.array);\n\n switch (key) {\n case 'equals': {\n clauses.push(this.buildLiteralFilter(eb, fieldRef, fieldType, eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(eb(fieldRef, '@>', eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(eb(fieldRef, '@>', eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(eb(fieldRef, '&&', eb.val(value)));\n break;\n }\n\n case 'isEmpty': {\n clauses.push(eb(fieldRef, value === true ? '=' : '!=', eb.val([])));\n break;\n }\n\n default: {\n throw new InternalError(`Invalid array filter key: ${key}`);\n }\n }\n }\n\n return this.and(eb, ...clauses);\n }\n\n buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, fieldRef: Expression<any>, fieldDef: FieldDef, payload: any) {\n if (payload === null) {\n return eb(fieldRef, 'is', null);\n }\n\n if (isEnum(this.schema, fieldDef.type)) {\n return this.buildEnumFilter(eb, fieldRef, fieldDef, payload);\n }\n\n return (\n match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(eb, fieldRef, payload))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.buildNumberFilter(eb, fieldRef, type, payload),\n )\n .with('Boolean', () => this.buildBooleanFilter(eb, fieldRef, payload))\n .with('DateTime', () => this.buildDateTimeFilter(eb, fieldRef, payload))\n .with('Bytes', () => this.buildBytesFilter(eb, fieldRef, payload))\n // TODO: JSON filters\n .with('Json', () => {\n throw new InternalError('JSON filters are not supported yet');\n })\n .with('Unsupported', () => {\n throw new QueryError(`Unsupported field cannot be used in filters`);\n })\n .exhaustive()\n );\n }\n\n private buildLiteralFilter(eb: ExpressionBuilder<any, any>, lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\n }\n\n private buildStandardFilter(\n eb: ExpressionBuilder<any, any>,\n type: BuiltinType,\n payload: any,\n lhs: Expression<any>,\n getRhs: (value: unknown) => any,\n recurse: (value: unknown) => Expression<SqlBool>,\n throwIfInvalid = false,\n onlyForKeys: string[] | undefined = undefined,\n excludeKeys: string[] = [],\n ) {\n if (payload === null || !isPlainObject(payload)) {\n return {\n conditions: [this.buildLiteralFilter(eb, lhs, type, payload)],\n consumedKeys: [],\n };\n }\n\n const conditions: Expression<SqlBool>[] = [];\n const consumedKeys: string[] = [];\n\n for (const [op, value] of Object.entries(payload)) {\n if (onlyForKeys && !onlyForKeys.includes(op)) {\n continue;\n }\n if (excludeKeys.includes(op)) {\n continue;\n }\n const rhs = Array.isArray(value) ? value.map(getRhs) : getRhs(value);\n const condition = match(op)\n .with('equals', () => (rhs === null ? eb(lhs, 'is', null) : eb(lhs, '=', rhs)))\n .with('in', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.false(eb);\n } else {\n return eb(lhs, 'in', rhs);\n }\n })\n .with('notIn', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.true(eb);\n } else {\n return eb.not(eb(lhs, 'in', rhs));\n }\n })\n .with('lt', () => eb(lhs, '<', rhs))\n .with('lte', () => eb(lhs, '<=', rhs))\n .with('gt', () => eb(lhs, '>', rhs))\n .with('gte', () => eb(lhs, '>=', rhs))\n .with('not', () => eb.not(recurse(value)))\n // aggregations\n .with(P.union(...AGGREGATE_OPERATORS), (op) => {\n const innerResult = this.buildStandardFilter(\n eb,\n type,\n value,\n aggregate(eb, lhs, op),\n getRhs,\n recurse,\n throwIfInvalid,\n );\n consumedKeys.push(...innerResult.consumedKeys);\n return this.and(eb, ...innerResult.conditions);\n })\n .otherwise(() => {\n if (throwIfInvalid) {\n throw new QueryError(`Invalid filter key: ${op}`);\n } else {\n return undefined;\n }\n });\n\n if (condition) {\n conditions.push(condition);\n consumedKeys.push(op);\n }\n }\n\n return { conditions, consumedKeys };\n }\n\n private buildStringFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: StringFilter<Schema, true, boolean>,\n ) {\n let mode: 'default' | 'insensitive' | undefined;\n if (payload && typeof payload === 'object' && 'mode' in payload) {\n mode = payload.mode;\n }\n\n const { conditions, consumedKeys } = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n mode === 'insensitive' ? eb.fn('lower', [fieldRef]) : fieldRef,\n (value) => this.prepStringCasing(eb, value, mode),\n (value) => this.buildStringFilter(eb, fieldRef, value as StringFilter<Schema, true, boolean>),\n );\n\n if (payload && typeof payload === 'object') {\n for (const [key, value] of Object.entries(payload)) {\n if (key === 'mode' || consumedKeys.includes(key)) {\n // already consumed\n continue;\n }\n\n const condition = match(key)\n .with('contains', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}%`))\n : eb(fieldRef, 'like', sql.val(`%${value}%`)),\n )\n .with('startsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`${value}%`))\n : eb(fieldRef, 'like', sql.val(`${value}%`)),\n )\n .with('endsWith', () =>\n mode === 'insensitive'\n ? eb(fieldRef, 'ilike', sql.val(`%${value}`))\n : eb(fieldRef, 'like', sql.val(`%${value}`)),\n )\n .otherwise(() => {\n throw new QueryError(`Invalid string filter key: ${key}`);\n });\n\n if (condition) {\n conditions.push(condition);\n }\n }\n }\n\n return this.and(eb, ...conditions);\n }\n\n private prepStringCasing(\n eb: ExpressionBuilder<any, any>,\n value: unknown,\n mode: 'default' | 'insensitive' | undefined,\n ): any {\n if (!mode || mode === 'default') {\n return value === null ? value : sql.val(value);\n }\n\n if (typeof value === 'string') {\n return eb.fn('lower', [sql.val(value)]);\n } else if (Array.isArray(value)) {\n return value.map((v) => this.prepStringCasing(eb, v, mode));\n } else {\n return value === null ? null : sql.val(value);\n }\n }\n\n private buildNumberFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n type: BuiltinType,\n payload: any,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n type,\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, type, false),\n (value) => this.buildNumberFilter(eb, fieldRef, type, value),\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBooleanFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BooleanFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'Boolean',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Boolean', false),\n (value) => this.buildBooleanFilter(eb, fieldRef, value as BooleanFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'not'],\n );\n return this.and(eb, ...conditions);\n }\n\n private buildDateTimeFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: DateTimeFilter<Schema, boolean, boolean>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'DateTime',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'DateTime', false),\n (value) => this.buildDateTimeFilter(eb, fieldRef, value as DateTimeFilter<Schema, boolean, boolean>),\n true,\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBytesFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n payload: BytesFilter<Schema, boolean, boolean>,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'Bytes',\n payload,\n fieldRef,\n (value) => this.transformPrimitive(value, 'Bytes', false),\n (value) => this.buildBytesFilter(eb, fieldRef, value as BytesFilter<Schema, boolean, boolean>),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n private buildEnumFilter(\n eb: ExpressionBuilder<any, any>,\n fieldRef: Expression<any>,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n fieldRef,\n (value) => value,\n (value) => this.buildEnumFilter(eb, fieldRef, fieldDef, value),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n buildOrderBy(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n modelAlias: string,\n orderBy: OrArray<OrderBy<Schema, GetModels<Schema>, boolean, boolean>> | undefined,\n useDefaultIfEmpty: boolean,\n negated: boolean,\n ) {\n if (!orderBy) {\n if (useDefaultIfEmpty) {\n orderBy = makeDefaultOrderBy(this.schema, model);\n } else {\n return query;\n }\n }\n\n let result = query;\n enumerate(orderBy).forEach((orderBy) => {\n for (const [field, value] of Object.entries<any>(orderBy)) {\n if (!value) {\n continue;\n }\n\n // aggregations\n if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n invariant(value && typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\n for (const [k, v] of Object.entries<SortOrder>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) =>\n aggregate(eb, this.fieldRef(model, k, eb, modelAlias), field as AGGREGATE_OPERATORS),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n\n switch (field) {\n case '_count': {\n invariant(value && typeof value === 'object', 'invalid orderBy value for field \"_count\"');\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn.count(this.fieldRef(model, k, eb, modelAlias)),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n default:\n break;\n }\n\n const fieldDef = requireField(this.schema, model, field);\n\n if (!fieldDef.relation) {\n const fieldRef = this.fieldRef(model, field, expressionBuilder(), modelAlias);\n if (value === 'asc' || value === 'desc') {\n result = result.orderBy(fieldRef, this.negateSort(value, negated));\n } else if (\n value &&\n typeof value === 'object' &&\n 'nulls' in value &&\n 'sort' in value &&\n (value.sort === 'asc' || value.sort === 'desc') &&\n (value.nulls === 'first' || value.nulls === 'last')\n ) {\n result = result.orderBy(\n fieldRef,\n sql.raw(`${this.negateSort(value.sort, negated)} nulls ${value.nulls}`),\n );\n }\n } else {\n // order by relation\n const relationModel = fieldDef.type;\n\n if (fieldDef.array) {\n // order by to-many relation\n if (typeof value !== 'object') {\n throw new QueryError(`invalid orderBy value for field \"${field}\"`);\n }\n if ('_count' in value) {\n invariant(\n value._count === 'asc' || value._count === 'desc',\n 'invalid orderBy value for field \"_count\"',\n );\n const sort = this.negateSort(value._count, negated);\n result = result.orderBy((eb) => {\n const subQueryAlias = `${modelAlias}$orderBy$${field}$count`;\n let subQuery = this.buildSelectModel(eb, relationModel, subQueryAlias);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, subQueryAlias);\n subQuery = subQuery.where(() =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n return subQuery;\n }, sort);\n }\n } else {\n // order by to-one relation\n result = result.leftJoin(relationModel, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n return join.on((eb) =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, fieldDef.type, relationModel, value, false, negated);\n }\n }\n }\n });\n\n return result;\n }\n\n buildSelectAllFields(\n model: string,\n query: SelectQueryBuilder<any, any, any>,\n omit: Record<string, boolean | undefined> | undefined,\n modelAlias: string,\n ) {\n const modelDef = requireModel(this.schema, model);\n let result = query;\n\n for (const field of Object.keys(modelDef.fields)) {\n if (isRelationField(this.schema, model, field)) {\n continue;\n }\n if (omit?.[field] === true) {\n continue;\n }\n result = this.buildSelectField(result, model, modelAlias, field);\n }\n\n // select all fields from delegate descendants and pack into a JSON field `$delegate$Model`\n const descendants = getDelegateDescendantModels(this.schema, model);\n for (const subModel of descendants) {\n result = this.buildDelegateJoin(model, modelAlias, subModel.name, result);\n result = result.select((eb) => {\n const jsonObject: Record<string, Expression<any>> = {};\n for (const field of Object.keys(subModel.fields)) {\n if (\n isRelationField(this.schema, subModel.name, field) ||\n isInheritedField(this.schema, subModel.name, field)\n ) {\n continue;\n }\n jsonObject[field] = eb.ref(`${subModel.name}.${field}`);\n }\n return this.buildJsonObject(eb, jsonObject).as(`${DELEGATE_JOINED_FIELD_PREFIX}${subModel.name}`);\n });\n }\n\n return result;\n }\n\n 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 = getIdFields(this.schema, thisModel);\n query = query.leftJoin(otherModelAlias, (qb) => {\n for (const idField of idFields) {\n qb = qb.onRef(`${thisModelAlias}.${idField}`, '=', `${otherModelAlias}.${idField}`);\n }\n return qb;\n });\n return query;\n }\n\n buildCountJson(model: string, eb: ExpressionBuilder<any, any>, parentAlias: string, payload: any) {\n const modelDef = requireModel(this.schema, model);\n const toManyRelations = Object.entries(modelDef.fields).filter(([, field]) => field.relation && field.array);\n\n const selections =\n payload === true\n ? {\n select: toManyRelations.reduce(\n (acc, [field]) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n ),\n }\n : payload;\n\n const jsonObject: Record<string, Expression<any>> = {};\n\n for (const [field, value] of Object.entries(selections.select)) {\n const fieldDef = requireField(this.schema, model, field);\n const fieldModel = fieldDef.type;\n const joinPairs = buildJoinPairs(this.schema, model, parentAlias, field, fieldModel);\n\n // build a nested query to count the number of records in the relation\n let fieldCountQuery = eb.selectFrom(fieldModel).select(eb.fn.countAll().as(`_count$${field}`));\n\n // join conditions\n for (const [left, right] of joinPairs) {\n fieldCountQuery = fieldCountQuery.whereRef(left, '=', right);\n }\n\n // merge _count filter\n if (\n value &&\n typeof value === 'object' &&\n 'where' in value &&\n value.where &&\n typeof value.where === 'object'\n ) {\n const filter = this.buildFilter(eb, fieldModel, fieldModel, value.where);\n fieldCountQuery = fieldCountQuery.where(filter);\n }\n\n jsonObject[field] = fieldCountQuery;\n }\n\n return this.buildJsonObject(eb, jsonObject);\n }\n\n // #endregion\n\n // #region utils\n\n private negateSort(sort: SortOrder, negated: boolean) {\n return negated ? (sort === 'asc' ? 'desc' : 'asc') : sort;\n }\n\n public true(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(false, 'Boolean', false) as boolean);\n }\n\n public isTrue(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === true || (node as ValueNode).value === 1;\n }\n\n public isFalse(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === false || (node as ValueNode).value === 0;\n }\n\n 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 // #endregion\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, GetModels, SchemaDef } from '../../../schema';\nimport { DELEGATE_JOINED_FIELD_PREFIX } from '../../constants';\nimport type { FindArgs } from '../../crud-types';\nimport {\n getDelegateDescendantModels,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base-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', () => (value instanceof Date ? value.toISOString() : value))\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n return query.select((eb) =>\n this.buildRelationJSON(model, eb, relationField, parentAlias, payload).as(relationField),\n );\n }\n\n private buildRelationJSON(\n model: string,\n eb: ExpressionBuilder<any, any>,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n const relationModelDef = requireModel(this.schema, relationModel);\n\n const subQueryName = `${parentAlias}$${relationField}`;\n 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 = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n 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","import {\n AddColumnNode,\n AddConstraintNode,\n AddIndexNode,\n AggregateFunctionNode,\n AliasNode,\n AlterColumnNode,\n AlterTableNode,\n AndNode,\n BinaryOperationNode,\n CaseNode,\n CastNode,\n CheckConstraintNode,\n ColumnDefinitionNode,\n ColumnNode,\n ColumnUpdateNode,\n CommonTableExpressionNameNode,\n CommonTableExpressionNode,\n CreateIndexNode,\n CreateSchemaNode,\n CreateTableNode,\n CreateTypeNode,\n CreateViewNode,\n DataTypeNode,\n DefaultInsertValueNode,\n DefaultValueNode,\n DeleteQueryNode,\n DropColumnNode,\n DropConstraintNode,\n DropIndexNode,\n DropSchemaNode,\n DropTableNode,\n DropTypeNode,\n DropViewNode,\n ExplainNode,\n FetchNode,\n ForeignKeyConstraintNode,\n FromNode,\n FunctionNode,\n GeneratedNode,\n GroupByItemNode,\n GroupByNode,\n HavingNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n JSONOperatorChainNode,\n JSONPathLegNode,\n JSONPathNode,\n JSONReferenceNode,\n LimitNode,\n ListNode,\n MatchedNode,\n MergeQueryNode,\n ModifyColumnNode,\n OffsetNode,\n OnConflictNode,\n OnDuplicateKeyNode,\n OnNode,\n OperationNodeVisitor,\n OperatorNode,\n OrderByItemNode,\n OrderByNode,\n OrNode,\n OutputNode,\n OverNode,\n ParensNode,\n PartitionByItemNode,\n PartitionByNode,\n PrimitiveValueListNode,\n RawNode,\n ReferenceNode,\n ReferencesNode,\n RenameColumnNode,\n ReturningNode,\n SchemableIdentifierNode,\n SelectAllNode,\n SelectionNode,\n SelectModifierNode,\n SelectQueryNode,\n SetOperationNode,\n TableNode,\n TopNode,\n TupleNode,\n UnaryOperationNode,\n UniqueConstraintNode,\n UpdateQueryNode,\n UsingNode,\n ValueListNode,\n ValueNode,\n ValuesNode,\n WhenNode,\n WhereNode,\n WithNode,\n type OperationNode,\n type PrimaryKeyConstraintNode,\n} from 'kysely';\n\nexport class DefaultOperationNodeVisitor extends OperationNodeVisitor {\n protected defaultVisit(node: OperationNode) {\n Object.values(node).forEach((value) => {\n if (!value) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((el) => this.defaultVisit(el));\n }\n if (typeof value === 'object' && 'kind' in value && typeof value.kind === 'string') {\n this.visitNode(value);\n }\n });\n }\n\n protected override visitSelectQuery(node: SelectQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelection(node: SelectionNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumn(node: ColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlias(node: AliasNode): void {\n this.defaultVisit(node);\n }\n protected override visitTable(node: TableNode): void {\n this.defaultVisit(node);\n }\n protected override visitFrom(node: FromNode): void {\n this.defaultVisit(node);\n }\n protected override visitReference(node: ReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitAnd(node: AndNode): void {\n this.defaultVisit(node);\n }\n protected override visitOr(node: OrNode): void {\n this.defaultVisit(node);\n }\n protected override visitValueList(node: ValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitParens(node: ParensNode): void {\n this.defaultVisit(node);\n }\n protected override visitJoin(node: JoinNode): void {\n this.defaultVisit(node);\n }\n protected override visitRaw(node: RawNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhere(node: WhereNode): void {\n this.defaultVisit(node);\n }\n protected override visitInsertQuery(node: InsertQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitDeleteQuery(node: DeleteQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitReturning(node: ReturningNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateTable(node: CreateTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddColumn(node: AddColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnDefinition(node: ColumnDefinitionNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropTable(node: DropTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderBy(node: OrderByNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderByItem(node: OrderByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupBy(node: GroupByNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupByItem(node: GroupByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitUpdateQuery(node: UpdateQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnUpdate(node: ColumnUpdateNode): void {\n this.defaultVisit(node);\n }\n protected override visitLimit(node: LimitNode): void {\n this.defaultVisit(node);\n }\n protected override visitOffset(node: OffsetNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnConflict(node: OnConflictNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnDuplicateKey(node: OnDuplicateKeyNode): void {\n this.defaultVisit(node);\n }\n protected override visitCheckConstraint(node: CheckConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDataType(node: DataTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectAll(node: SelectAllNode): void {\n this.defaultVisit(node);\n }\n protected override visitIdentifier(node: IdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitSchemableIdentifier(node: SchemableIdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitValue(node: ValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimitiveValueList(node: PrimitiveValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitOperator(node: OperatorNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateIndex(node: CreateIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropIndex(node: DropIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitList(node: ListNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimaryKeyConstraint(node: PrimaryKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitUniqueConstraint(node: UniqueConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitReferences(node: ReferencesNode): void {\n this.defaultVisit(node);\n }\n protected override visitWith(node: WithNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpression(node: CommonTableExpressionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void {\n this.defaultVisit(node);\n }\n protected override visitHaving(node: HavingNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateSchema(node: CreateSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropSchema(node: DropSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterTable(node: AlterTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropColumn(node: DropColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitRenameColumn(node: RenameColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterColumn(node: AlterColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitModifyColumn(node: ModifyColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddConstraint(node: AddConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropConstraint(node: DropConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateView(node: CreateViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropView(node: DropViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitGenerated(node: GeneratedNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultValue(node: DefaultValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitOn(node: OnNode): void {\n this.defaultVisit(node);\n }\n protected override visitValues(node: ValuesNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectModifier(node: SelectModifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateType(node: CreateTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropType(node: DropTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitExplain(node: ExplainNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultInsertValue(node: DefaultInsertValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitAggregateFunction(node: AggregateFunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitOver(node: OverNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionBy(node: PartitionByNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionByItem(node: PartitionByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitSetOperation(node: SetOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitBinaryOperation(node: BinaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUnaryOperation(node: UnaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUsing(node: UsingNode): void {\n this.defaultVisit(node);\n }\n protected override visitFunction(node: FunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCase(node: CaseNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhen(node: WhenNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONReference(node: JSONReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPath(node: JSONPathNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPathLeg(node: JSONPathLegNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONOperatorChain(node: JSONOperatorChainNode): void {\n this.defaultVisit(node);\n }\n protected override visitTuple(node: TupleNode): void {\n this.defaultVisit(node);\n }\n protected override visitMergeQuery(node: MergeQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitMatched(node: MatchedNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddIndex(node: AddIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitCast(node: CastNode): void {\n this.defaultVisit(node);\n }\n protected override visitFetch(node: FetchNode): void {\n this.defaultVisit(node);\n }\n protected override visitTop(node: TopNode): void {\n this.defaultVisit(node);\n }\n protected override visitOutput(node: OutputNode): void {\n this.defaultVisit(node);\n }\n}\n","import type { ColumnNode, OperationNode } from 'kysely';\nimport { DefaultOperationNodeVisitor } from '../../utils/default-operation-node-visitor';\n\n/**\n * Collects all column names from a query.\n */\nexport class ColumnCollector extends DefaultOperationNodeVisitor {\n private columns: string[] = [];\n\n collect(node: OperationNode) {\n this.columns = [];\n this.visitNode(node);\n return this.columns;\n }\n\n protected override visitColumn(node: ColumnNode): void {\n if (!this.columns.includes(node.column.name)) {\n this.columns.push(node.column.name);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n expressionBuilder,\n FromNode,\n FunctionNode,\n IdentifierNode,\n OperatorNode,\n ReferenceNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n ValueListNode,\n ValueNode,\n WhereNode,\n type ExpressionBuilder,\n type OperandExpression,\n type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base-dialect';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ClientOptions } from '../../client/options';\nimport { getModel, getRelationForeignKeyFieldPairs, requireField } from '../../client/query-utils';\nimport type {\n BinaryExpression,\n BinaryOperator,\n BuiltinType,\n FieldDef,\n GetModels,\n LiteralExpression,\n MemberExpression,\n UnaryExpression,\n} from '../../schema';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type SchemaDef,\n} from '../../schema';\nimport { ExpressionEvaluator } from './expression-evaluator';\nimport { conjunction, disjunction, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\n auth?: any;\n memberFilter?: OperationNode;\n memberSelect?: SelectionNode;\n};\n\n// a registry of expression handlers marked with @expr\nconst expressionHandlers = new Map<string, PropertyDescriptor>();\n\n// expression handler decorator\nfunction expr(kind: Expression['kind']) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!expressionHandlers.get(kind)) {\n expressionHandlers.set(kind, descriptor);\n }\n return descriptor;\n };\n}\n\nexport class ExpressionTransformer<Schema extends SchemaDef> {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(\n private readonly schema: Schema,\n private readonly clientOptions: ClientOptions<Schema>,\n private readonly auth: unknown | undefined,\n ) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get authType() {\n if (!this.schema.authType) {\n throw new InternalError('Schema does not have an \"authType\" specified');\n }\n return this.schema.authType!;\n }\n\n transform(expression: Expression, context: ExpressionTransformerContext<Schema>): OperationNode {\n const handler = expressionHandlers.get(expression.kind);\n if (!handler) {\n throw new Error(`Unsupported expression kind: ${expression.kind}`);\n }\n return handler.value.call(this, expression, context);\n }\n\n @expr('literal')\n // @ts-expect-error\n private _literal(expr: LiteralExpression) {\n return this.transformValue(\n expr.value,\n typeof expr.value === 'string' ? 'String' : typeof expr.value === 'boolean' ? 'Boolean' : 'Int',\n );\n }\n\n @expr('array')\n // @ts-expect-error\n private _array(expr: ArrayExpression, context: ExpressionTransformerContext<Schema>) {\n return ValueListNode.create(expr.items.map((item) => this.transform(item, context)));\n }\n\n @expr('field')\n // @ts-expect-error\n private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n 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 left = this.transform(expr.left, context);\n const right = this.transform(expr.right, context);\n\n if (op === 'in') {\n if (this.isNullNode(left)) {\n return this.transformValue(false, 'Boolean');\n } else {\n if (ValueListNode.is(right)) {\n return BinaryOperationNode.create(left, OperatorNode.create('in'), right);\n } else {\n // array contains\n return BinaryOperationNode.create(\n left,\n OperatorNode.create('='),\n FunctionNode.create('any', [right]),\n );\n }\n }\n }\n\n if (this.isNullNode(right)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(left, OperatorNode.create('is'), right)\n : BinaryOperationNode.create(left, OperatorNode.create('is not'), right);\n } else if (this.isNullNode(left)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(right, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(right, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n\n private transformCollectionPredicate(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n invariant(expr.op === '?' || expr.op === '!' || expr.op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n if (this.isAuthCall(expr.left) || this.isAuthMember(expr.left)) {\n const value = new ExpressionEvaluator().evaluate(expr, {\n auth: this.auth,\n });\n return this.transformValue(value, 'Boolean');\n }\n\n invariant(\n ExpressionUtils.isField(expr.left) || ExpressionUtils.isMember(expr.left),\n 'left operand must be field or member access',\n );\n\n let newContextModel: string;\n if (ExpressionUtils.isField(expr.left)) {\n const fieldDef = requireField(this.schema, context.model, expr.left.field);\n newContextModel = fieldDef.type;\n } else {\n invariant(ExpressionUtils.isField(expr.left.receiver));\n const fieldDef = requireField(this.schema, context.model, expr.left.receiver.field);\n newContextModel = fieldDef.type;\n for (const member of expr.left.members) {\n const memberDef = requireField(this.schema, newContextModel, member);\n newContextModel = memberDef.type;\n }\n }\n\n let predicateFilter = this.transform(expr.right, {\n ...context,\n model: newContextModel as GetModels<Schema>,\n alias: undefined,\n });\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 const conditions = idFields.map((fieldName) =>\n ExpressionUtils.binary(\n ExpressionUtils.member(authExpr, [fieldName]),\n '==',\n ExpressionUtils.member(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 transformValue(value: unknown, type: BuiltinType) {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\n\n @expr('unary')\n // @ts-ignore\n private _unary(expr: UnaryExpression, context: ExpressionTransformerContext<Schema>) {\n // only '!' operator for now\n invariant(expr.op === '!', 'only \"!\" operator is supported');\n return 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.clientOptions.functions?.[expr.function];\n if (!func) {\n throw new QueryError(`Function not implemented: ${expr.function}`);\n }\n const eb = expressionBuilder<any, any>();\n return func(\n eb,\n (expr.args ?? []).map((arg) => this.transformCallArg(eb, arg, context)),\n {\n dialect: this.dialect,\n model: context.model,\n operation: context.operation,\n },\n );\n }\n\n private transformCallArg(\n eb: ExpressionBuilder<any, any>,\n arg: Expression,\n context: ExpressionTransformerContext<Schema>,\n ): OperandExpression<any> {\n if (ExpressionUtils.isLiteral(arg)) {\n return eb.val(arg.value);\n }\n\n if (ExpressionUtils.isField(arg)) {\n return 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 // optimize for the simple this.scalar case\n const fieldDef = requireField(this.schema, context.model, expr.members[0]!);\n invariant(!fieldDef.relation, 'this.relation access should have been transformed into relation access');\n return this.createColumnRef(expr.members[0]!, restContext);\n }\n\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 } 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 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 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","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 { PolicyHandler } from './policy-handler';\n\nexport class PolicyPlugin<Schema extends SchemaDef> implements RuntimePlugin<Schema> {\n get id() {\n return 'policy';\n }\n\n get name() {\n return 'Access Policy';\n }\n\n get description() {\n return 'Enforces access policies defined in the schema.';\n }\n\n onKyselyQuery({ query, client, proceed /*, transaction*/ }: OnKyselyQueryArgs<Schema>) {\n const handler = new PolicyHandler<Schema>(client);\n return handler.handle(query, proceed /*, transaction*/);\n }\n}\n"],"mappings":"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","names":["RejectedByPolicyError","Error","model","reason","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","FromNode","FunctionNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","ParensNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","TableNode","UpdateQueryNode","ValueListNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","sql","match","DELEGATE_JOINED_FIELD_PREFIX","LOGICAL_COMBINATORS","AGGREGATE_OPERATORS","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","getIdFields","idFields","getRelationForeignKeyFieldPairs","schema","model","relationField","fieldDef","requireField","relation","InternalError","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","currentModel","isEnum","schema","type","enums","buildJoinPairs","schema","model","modelAlias","relationField","relationModelAlias","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","map","fk","pk","makeDefaultOrderBy","idFields","getIdFields","f","getManyToManyRelation","field","fieldDef","requireField","array","relation","opposite","undefined","oppositeFieldDef","type","sortedModelNames","sort","orderedFK","sortedFieldNames","name","parentFkName","otherModel","otherField","otherFkName","joinTable","flattenCompoundUniqueFilters","filter","uniqueFields","getUniqueFields","compoundUniques","u","length","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","isPlainObject","expressionBuilder","sql","match","P","enumerate","x","undefined","Array","isArray","BaseCrudDialect","schema","options","transformPrimitive","value","_type","_forArrayField","buildSelectModel","eb","model","modelAlias","modelDef","requireModel","result","selectFrom","joinBase","baseModel","buildDelegateJoin","buildFilterSortTake","args","query","where","buildFilter","negateOrderBy","skip","take","undefined","buildSkipTake","buildOrderBy","orderBy","distinct","ensureArray","supportsDistinctOn","distinctOn","map","f","sql","ref","QueryError","provider","type","cursor","buildCursorFilter","true","false","_where","flattenCompoundUniqueFilters","key","payload","Object","entries","startsWith","isLogicalCombinator","and","buildCompositeFilter","fieldDef","requireField","relation","buildRelationFilter","fieldRef","originModel","array","buildArrayFilter","buildPrimitiveFilter","_orderBy","makeDefaultOrderBy","orderByItems","flatMap","obj","expressionBuilder","subQueryAlias","cursorFilter","filters","i","length","andFilters","j","field","order","_order","op","push","select","or","LOGICAL_COMBINATORS","includes","match","with","enumerate","subPayload","not","exhaustive","buildToOneRelationFilter","buildToManyRelationFilter","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","fk","is","joinAlias","joinPairs","buildJoinPairs","filterResultField","joinSelect","left","right","fn","count","lit","as","conditions","isNot","relationModel","relationFilterSelectAlias","buildPkFkWhereRefs","m2m","getManyToManyRelation","modelIdField","getIdFields","relationIdField","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","_value","buildLiteralFilter","val","InternalError","isEnum","buildEnumFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","lhs","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","excludeKeys","isPlainObject","consumedKeys","Array","isArray","condition","invariant","AGGREGATE_OPERATORS","innerResult","aggregate","otherwise","mode","prepStringCasing","v","useDefaultIfEmpty","negated","forEach","k","raw","negateSort","sort","nulls","_count","subQuery","leftJoin","join","on","buildSelectAllFields","omit","keys","fields","isRelationField","buildSelectField","descendants","getDelegateDescendantModels","subModel","name","jsonObject","isInheritedField","buildJsonObject","DELEGATE_JOINED_FIELD_PREFIX","buildModelSelect","selectAllFields","computed","thisModel","thisModelAlias","otherModelAlias","idFields","qb","idField","onRef","buildCountJson","parentAlias","toManyRelations","filter","selections","reduce","acc","fieldModel","fieldCountQuery","countAll","isTrue","expression","node","toOperationNode","kind","isFalse","nonTrueArgs","arg","nonFalseArgs","inlineComputedField","buildFieldRef","canJoinWithoutNestedSelect","computedFields","isDelegate","PostgresCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toString","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","relationResultName","joinedQuery","buildRelationJSON","select","qb","resultName","relationFieldDef","requireField","schema","relationModel","leftJoinLateral","eb","relationSelectName","relationModelDef","requireModel","tbl","canJoinWithoutNestedSelect","buildModelSelect","buildRelationJoinFilter","selectFrom","subQuery","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","relationModelAlias","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","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","invariant","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","Array","isArray","map","v","schema","typeDefs","JSON","stringify","match","with","Date","toISOString","toString","Buffer","from","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","relationFieldDef","requireField","relationModel","relationModelDef","requireModel","subQueryName","tbl","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","getIdFields","relationIds","invariant","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","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","schema","clientOptions","auth","getCrudDialect","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformOperator","invariant","isAuthMember","ExpressionEvaluator","evaluate","ExpressionUtils","isField","isMember","newContextModel","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","QueryError","authExpr","other","isNull","authModel","getModel","idFields","Object","values","fields","filter","f","id","name","length","conditions","fieldName","binary","result","buildAnd","buildLogicalNot","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","transformCall","toOperationNode","func","functions","function","eb","expressionBuilder","args","arg","transformCallArg","operation","isLiteral","val","ref","isCall","valNode","valueMemberAccess","_member","isThis","firstMemberFieldDef","slice","SelectQueryNode","startType","receiverField","memberFields","currType","push","fromModel","currNode","i","ColumnNode","receiverType","fieldValue","relationModel","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","column","node","unary","literal","reduce","acc","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","isMutationQueryNode","transformNode","mutationRequiresTransaction","mutationModel","getMutationModel","InsertQueryNode","is","constCondition","tryGetConstantPolicy","returning","enforcePreCreatePolicy","transformedNode","result","onlyReturningId","readBackResult","processReadBack","rows","length","idFields","getIdFields","collector","ColumnCollector","selectedColumns","collect","every","c","includes","model","fields","columns","map","column","name","valueRows","values","unwrapCreateValueRows","enforcePreCreatePolicyForOne","v","allFields","Object","keys","requireModel","allValues","fieldName","index","indexOf","push","ValueNode","createImmediate","constTable","kind","from","FromNode","create","AliasNode","ParensNode","ValuesNode","ValueListNode","IdentifierNode","selections","field","SelectionNode","ColumnNode","filter","buildPolicyFilter","preCreateCheck","BinaryOperationNode","FunctionNode","OperatorNode","where","WhereNode","$condition","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","invariant","i","item","fieldDef","requireField","transformPrimitive","value","type","array","raw","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","table","idConditions","buildIdConditions","policyFilter","select","TableNode","conjunction","selectResult","disjunction","row","r","match","when","getTableName","into","UpdateQueryNode","DeleteQueryNode","froms","exhaustive","SelectQueryNode","alias","falseNode","allows","policy","transformPolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","transformSelectQuery","whereNode","forEach","extractResult","extractTableName","baseResult","transformInsertQuery","ReturningNode","transformUpdateQuery","transformDeleteQuery","identifier","inner","ExpressionTransformer","$auth","transform","auth","modelName","modelDef","extractOperations","split","trim","attributes","attr","operations","args","PolicyPlugin","id","name","description","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle"]}
|