@farming-labs/orm-sql 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n isOperatorFilterObject,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n type JsonValue,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlWhere = Where<Record<string, unknown>>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") {\n return value;\n }\n return JSON.stringify(value);\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n if (field.kind === \"integer\") {\n return typeof value === \"number\" ? value : Number(value);\n }\n\n if (field.kind === \"json\") {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as JsonValue;\n } catch {\n return value;\n }\n }\n return value;\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n const createValueExpression = (value: unknown) => {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n if (field.kind === \"json\" && dialect === \"mysql\") {\n return `cast(${placeholder} as json)`;\n }\n return placeholder;\n };\n\n if (!isOperatorFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n return `${column} = ${createValueExpression(filter)}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n clauses.push(`${column} = ${createValueExpression(filter.eq)}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n clauses.push(`${column} <> ${createValueExpression(filter.not)}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) => createValueExpression(value));\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n isOperatorFilterObject,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n type JsonValue,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlWhere = Where<Record<string, unknown>>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst nativeNodeIdentity = Symbol(\"nativeNodeIdentity\");\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") {\n return value;\n }\n return JSON.stringify(value);\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n if (field.kind === \"integer\") {\n return typeof value === \"number\" ? value : Number(value);\n }\n\n if (field.kind === \"json\") {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as JsonValue;\n } catch {\n return value;\n }\n }\n return value;\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n tableAlias = model.table,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(tableAlias, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n const createValueExpression = (value: unknown) => {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n if (field.kind === \"json\" && dialect === \"mysql\") {\n return `cast(${placeholder} as json)`;\n }\n return placeholder;\n };\n\n if (!isOperatorFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n return `${column} = ${createValueExpression(filter)}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n clauses.push(`${column} = ${createValueExpression(filter.eq)}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n clauses.push(`${column} <> ${createValueExpression(filter.not)}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) => createValueExpression(value));\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n tableAlias = model.table,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state, tableAlias))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state, tableAlias))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state, tableAlias);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state, tableAlias));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n tableAlias = model.table,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(tableAlias, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n tableAlias?: string;\n },\n) {\n const state: QueryState = { params: [] };\n const tableAlias = args.tableAlias ?? model.table;\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(tableAlias, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)} as ${quoteIdentifier(tableAlias, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state, tableAlias);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect, tableAlias);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const nativeRows = await loadRowsWithNativeJoins(schema, modelName, args);\n if (nativeRows) {\n return nativeRows;\n }\n\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n type NativeJoinPlanNode = {\n modelName: ModelName<TSchema>;\n model: ManifestModel;\n alias: string;\n presenceAlias: string;\n includeAllScalars: boolean;\n selectedScalarKeys: string[];\n relationName?: string;\n relationKind?: \"belongsTo\" | \"hasOne\" | \"hasMany\" | \"manyToMany\";\n sourceField?: ManifestField;\n targetField?: ManifestField;\n throughModel?: ManifestModel;\n throughAlias?: string;\n throughFromField?: ManifestField;\n throughToField?: ManifestField;\n children: NativeJoinPlanNode[];\n };\n\n type NativeProjectedRow = SqlRow & {\n [nativeNodeIdentity]?: unknown;\n };\n\n function createNativePresenceAlias(\n model: ManifestModel,\n alias: string,\n includeAllScalars: boolean,\n selectedScalarKeys: string[],\n ) {\n const occupiedAliases = new Set(\n (includeAllScalars ? Object.keys(model.fields) : selectedScalarKeys).map(\n (fieldName) => `${alias}__${fieldName}`,\n ),\n );\n let candidate = `${alias}__orm_presence`;\n let suffix = 0;\n\n while (occupiedAliases.has(candidate)) {\n suffix += 1;\n candidate = `${alias}__orm_presence_${suffix}`;\n }\n\n return candidate;\n }\n\n function buildNativeJoinPlan<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n select: TSelect,\n aliasState: { next: number },\n ): NativeJoinPlanNode | null {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const alias = `t${aliasState.next++}`;\n const entries = select ? Object.entries(select) : [];\n const selectedScalarKeys = select\n ? entries.filter(([key, value]) => key in model.fields && value === true).map(([key]) => key)\n : Object.keys(model.fields);\n const node: NativeJoinPlanNode = {\n modelName,\n model,\n alias,\n presenceAlias: createNativePresenceAlias(model, alias, !select, selectedScalarKeys),\n includeAllScalars: !select,\n selectedScalarKeys,\n children: [],\n };\n\n for (const [key, value] of entries) {\n if (value === undefined || !(key in schema.models[modelName].relations)) continue;\n\n const relation = schema.models[modelName].relations[key as RelationName<TSchema, TModelName>];\n const relationArgs = (value === true ? {} : value) as Partial<\n FindManyArgs<TSchema, any, any>\n >;\n if (\n relationArgs.where !== undefined ||\n relationArgs.orderBy !== undefined ||\n relationArgs.take !== undefined ||\n relationArgs.skip !== undefined\n ) {\n return null;\n }\n\n const child = buildNativeJoinPlan(\n schema,\n relation.target as ModelName<TSchema>,\n relationArgs.select,\n aliasState,\n );\n if (!child) return null;\n\n child.relationName = key;\n child.relationKind = relation.kind;\n\n if (relation.kind === \"belongsTo\") {\n const sourceField = model.fields[relation.foreignKey];\n if (!sourceField) return null;\n const targetReference = parseReference(sourceField.references);\n const targetFieldName =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const targetField = child.model.fields[targetFieldName];\n if (!targetField) return null;\n child.sourceField = sourceField;\n child.targetField = targetField;\n } else if (relation.kind === \"hasOne\" || relation.kind === \"hasMany\") {\n const targetForeignField = child.model.fields[relation.foreignKey];\n if (!targetForeignField) return null;\n const sourceReference = parseReference(targetForeignField.references);\n const sourceFieldName =\n sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceField = model.fields[sourceFieldName];\n if (!sourceField) return null;\n child.sourceField = sourceField;\n child.targetField = targetForeignField;\n } else {\n const throughModel = manifest.models[relation.through];\n const throughFromField = throughModel.fields[relation.from];\n const throughToField = throughModel.fields[relation.to];\n if (!throughFromField || !throughToField) return null;\n const throughFromReference = parseReference(throughFromField.references);\n const throughToReference = parseReference(throughToField.references);\n const sourceFieldName =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetFieldName = throughToReference?.field ?? identityField(child.model).name;\n const sourceField = model.fields[sourceFieldName];\n const targetField = child.model.fields[targetFieldName];\n if (!sourceField || !targetField) return null;\n child.sourceField = sourceField;\n child.targetField = targetField;\n child.throughModel = throughModel;\n child.throughAlias = `t${aliasState.next++}`;\n child.throughFromField = throughFromField;\n child.throughToField = throughToField;\n }\n\n node.children.push(child);\n }\n\n return node;\n }\n\n function hasNativeJoinableRelations<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(schema: TSchema, modelName: TModelName, select: TSelect) {\n if (!select) return false;\n const plan = buildNativeJoinPlan(schema, modelName, select, { next: 0 });\n return !!plan && plan.children.length > 0;\n }\n\n function collectNativeJoinSelects(node: NativeJoinPlanNode, selectList: string[]) {\n const scalarKeys = node.includeAllScalars\n ? Object.keys(node.model.fields)\n : node.selectedScalarKeys;\n\n for (const fieldName of scalarKeys) {\n const field = node.model.fields[fieldName];\n if (!field) continue;\n selectList.push(\n `${quoteIdentifier(node.alias, adapter.dialect)}.${quoteIdentifier(field.column, adapter.dialect)} as ${quoteIdentifier(`${node.alias}__${field.name}`, adapter.dialect)}`,\n );\n }\n\n const identity = identityField(node.model);\n selectList.push(\n `${quoteIdentifier(node.alias, adapter.dialect)}.${quoteIdentifier(identity.column, adapter.dialect)} as ${quoteIdentifier(node.presenceAlias, adapter.dialect)}`,\n );\n\n for (const child of node.children) {\n collectNativeJoinSelects(child, selectList);\n }\n }\n\n function collectNativeJoinClauses(node: NativeJoinPlanNode, joins: string[]) {\n for (const child of node.children) {\n if (child.relationKind === \"manyToMany\") {\n joins.push(\n ` left join ${quoteIdentifier(child.throughModel!.table, adapter.dialect)} as ${quoteIdentifier(child.throughAlias!, adapter.dialect)} on ${quoteIdentifier(node.alias, adapter.dialect)}.${quoteIdentifier(child.sourceField!.column, adapter.dialect)} = ${quoteIdentifier(child.throughAlias!, adapter.dialect)}.${quoteIdentifier(child.throughFromField!.column, adapter.dialect)}`,\n );\n joins.push(\n ` left join ${quoteIdentifier(child.model.table, adapter.dialect)} as ${quoteIdentifier(child.alias, adapter.dialect)} on ${quoteIdentifier(child.throughAlias!, adapter.dialect)}.${quoteIdentifier(child.throughToField!.column, adapter.dialect)} = ${quoteIdentifier(child.alias, adapter.dialect)}.${quoteIdentifier(child.targetField!.column, adapter.dialect)}`,\n );\n } else {\n const leftColumn =\n child.relationKind === \"belongsTo\"\n ? `${quoteIdentifier(node.alias, adapter.dialect)}.${quoteIdentifier(child.sourceField!.column, adapter.dialect)}`\n : `${quoteIdentifier(child.alias, adapter.dialect)}.${quoteIdentifier(child.targetField!.column, adapter.dialect)}`;\n const rightColumn =\n child.relationKind === \"belongsTo\"\n ? `${quoteIdentifier(child.alias, adapter.dialect)}.${quoteIdentifier(child.targetField!.column, adapter.dialect)}`\n : `${quoteIdentifier(node.alias, adapter.dialect)}.${quoteIdentifier(child.sourceField!.column, adapter.dialect)}`;\n joins.push(\n ` left join ${quoteIdentifier(child.model.table, adapter.dialect)} as ${quoteIdentifier(child.alias, adapter.dialect)} on ${leftColumn} = ${rightColumn}`,\n );\n }\n collectNativeJoinClauses(child, joins);\n }\n }\n\n function buildNativeJoinRootSource(\n root: NativeJoinPlanNode,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const state: QueryState = { params: [] };\n const sourceAlias = `${root.alias}__src`;\n const selectList = Object.values(root.model.fields).map(\n (field) =>\n `${quoteIdentifier(sourceAlias, adapter.dialect)}.${quoteIdentifier(field.column, adapter.dialect)} as ${quoteIdentifier(field.column, adapter.dialect)}`,\n );\n\n let sql =\n `select ${selectList.join(\", \")}` +\n ` from ${quoteIdentifier(root.model.table, adapter.dialect)} as ${quoteIdentifier(sourceAlias, adapter.dialect)}`;\n const where = compileWhere(root.model, args.where, adapter.dialect, state, sourceAlias);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(root.model, args.orderBy, adapter.dialect, sourceAlias);\n sql += compilePagination(adapter.dialect, args.take, args.skip);\n\n return {\n sql: `(${sql})`,\n params: state.params,\n };\n }\n\n function buildNativeJoinStatement(\n root: NativeJoinPlanNode,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const state: QueryState = { params: [] };\n const selectList: string[] = [];\n const joins: string[] = [];\n collectNativeJoinSelects(root, selectList);\n collectNativeJoinClauses(root, joins);\n const rootSource = buildNativeJoinRootSource(root, args);\n state.params.push(...rootSource.params);\n\n let sql =\n `select ${selectList.join(\", \")}` +\n ` from ${rootSource.sql} as ${quoteIdentifier(root.alias, adapter.dialect)}`;\n if (joins.length) sql += joins.join(\"\");\n sql += compileOrderBy(root.model, args.orderBy, adapter.dialect, root.alias);\n\n return { sql, params: state.params };\n }\n\n function nodePresenceValue(node: NativeJoinPlanNode, rawRow: SqlRow) {\n return rawRow[node.presenceAlias];\n }\n\n function projectNativeJoinNode(\n node: NativeJoinPlanNode,\n rawRow: SqlRow,\n ): NativeProjectedRow | null {\n if (nodePresenceValue(node, rawRow) == null) {\n return null;\n }\n\n const output: NativeProjectedRow = {};\n Object.defineProperty(output, nativeNodeIdentity, {\n value: rawRow[node.presenceAlias],\n enumerable: false,\n configurable: true,\n });\n const scalarKeys = node.includeAllScalars\n ? Object.keys(node.model.fields)\n : node.selectedScalarKeys;\n\n for (const fieldName of scalarKeys) {\n const field = node.model.fields[fieldName];\n if (!field) continue;\n output[field.name] = decodeValue(\n field,\n adapter.dialect,\n rawRow[`${node.alias}__${field.name}`],\n );\n }\n\n for (const child of node.children) {\n const childValue = projectNativeJoinNode(child, rawRow);\n output[child.relationName!] =\n child.relationKind === \"hasMany\" || child.relationKind === \"manyToMany\"\n ? childValue\n ? [childValue]\n : []\n : childValue;\n }\n\n return output;\n }\n\n function mergeNativeJoinNode(\n node: NativeJoinPlanNode,\n target: NativeProjectedRow,\n next: NativeProjectedRow,\n ) {\n for (const child of node.children) {\n const relationName = child.relationName!;\n if (child.relationKind === \"hasMany\" || child.relationKind === \"manyToMany\") {\n const targetRows = Array.isArray(target[relationName])\n ? (target[relationName] as NativeProjectedRow[])\n : [];\n const nextRows = Array.isArray(next[relationName])\n ? (next[relationName] as NativeProjectedRow[])\n : [];\n if (!Array.isArray(target[relationName])) {\n target[relationName] = targetRows;\n }\n\n for (const nextRow of nextRows) {\n const identity = nextRow[nativeNodeIdentity];\n const existing = targetRows.find((entry) => entry[nativeNodeIdentity] === identity);\n if (existing) {\n mergeNativeJoinNode(child, existing, nextRow);\n } else {\n targetRows.push(nextRow);\n }\n }\n continue;\n }\n\n const nextValue = next[relationName];\n if (nextValue === undefined) continue;\n if (nextValue === null) {\n if (!(relationName in target)) {\n target[relationName] = null;\n }\n continue;\n }\n\n const existing = target[relationName];\n if (!existing || typeof existing !== \"object\") {\n target[relationName] = nextValue;\n continue;\n }\n\n mergeNativeJoinNode(child, existing as NativeProjectedRow, nextValue as NativeProjectedRow);\n }\n }\n\n async function loadRowsWithNativeJoins<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>> | null> {\n if (!hasNativeJoinableRelations(schema, modelName, args.select)) {\n return null;\n }\n\n const plan = buildNativeJoinPlan(schema, modelName, args.select, { next: 0 });\n if (!plan || !plan.children.length) {\n return null;\n }\n\n const statement = buildNativeJoinStatement(plan, args);\n const result = await adapter.query(statement.sql, statement.params);\n const groupedRows: NativeProjectedRow[] = [];\n const groupedByIdentity = new Map<unknown, NativeProjectedRow>();\n\n for (const row of result.rows) {\n const projected = projectNativeJoinNode(plan, row);\n if (!projected) continue;\n const identity = projected[nativeNodeIdentity];\n const existing = groupedByIdentity.get(identity);\n if (existing) {\n mergeNativeJoinNode(plan, existing, projected);\n continue;\n }\n groupedByIdentity.set(identity, projected);\n groupedRows.push(projected);\n }\n\n return groupedRows as Array<SelectedRecord<TSchema, TModelName, TSelect>>;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","existing","targetField","sourceField","sourceValue"]}