@farming-labs/orm-sql 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -598,7 +598,12 @@ function createMysqlPoolAdapter(pool) {
598
598
  }
599
599
  };
600
600
  }
601
- function createSqlDriver(adapter) {
601
+ function createSqlDriver(adapter, handle) {
602
+ const resolvedHandle = handle ?? {
603
+ kind: "sql",
604
+ client: adapter,
605
+ dialect: adapter.dialect
606
+ };
602
607
  async function loadRows(schema, modelName, args) {
603
608
  const nativeRows = await loadRowsWithNativeJoins(schema, modelName, args);
604
609
  if (nativeRows) {
@@ -993,6 +998,7 @@ function createSqlDriver(adapter) {
993
998
  });
994
999
  }
995
1000
  const driver = {
1001
+ handle: resolvedHandle,
996
1002
  async findMany(schema, model, args) {
997
1003
  return loadRows(schema, model, args);
998
1004
  },
@@ -1139,26 +1145,56 @@ function createSqlDriver(adapter) {
1139
1145
  return result.affectedRows;
1140
1146
  },
1141
1147
  async transaction(_schema, run) {
1142
- return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));
1148
+ return adapter.transaction(
1149
+ async (txAdapter) => run(createSqlDriver(txAdapter, resolvedHandle))
1150
+ );
1143
1151
  }
1144
1152
  };
1145
1153
  return driver;
1146
1154
  }
1147
1155
  function createSqliteDriver(database) {
1148
- return createSqlDriver(createSqliteAdapter(database));
1156
+ return createSqlDriver(
1157
+ createSqliteAdapter(database),
1158
+ {
1159
+ kind: "sql",
1160
+ client: database,
1161
+ dialect: "sqlite"
1162
+ }
1163
+ );
1149
1164
  }
1150
- function createSqlDriverFromAdapter(adapter) {
1151
- return createSqlDriver(adapter);
1165
+ function createSqlDriverFromAdapter(adapter, handle) {
1166
+ return createSqlDriver(adapter, handle);
1152
1167
  }
1153
1168
  function createPgPoolDriver(pool) {
1154
- return createSqlDriver(createPgPoolAdapter(pool));
1169
+ return createSqlDriver(
1170
+ createPgPoolAdapter(pool),
1171
+ {
1172
+ kind: "sql",
1173
+ client: pool,
1174
+ dialect: "postgres"
1175
+ }
1176
+ );
1155
1177
  }
1156
1178
  function createPgClientDriver(client) {
1157
- return createSqlDriver(createPgTransactionalAdapter(client));
1179
+ return createSqlDriver(
1180
+ createPgTransactionalAdapter(client),
1181
+ {
1182
+ kind: "sql",
1183
+ client,
1184
+ dialect: "postgres"
1185
+ }
1186
+ );
1158
1187
  }
1159
1188
  function createMysqlDriver(poolOrConnection) {
1160
1189
  const adapter = "getConnection" in poolOrConnection ? createMysqlPoolAdapter(poolOrConnection) : createMysqlTransactionalAdapter(poolOrConnection);
1161
- return createSqlDriver(adapter);
1190
+ return createSqlDriver(
1191
+ adapter,
1192
+ {
1193
+ kind: "sql",
1194
+ client: poolOrConnection,
1195
+ dialect: "mysql"
1196
+ }
1197
+ );
1162
1198
  }
1163
1199
  // Annotate the CommonJS export names for ESM import in node:
1164
1200
  0 && (module.exports = {
@@ -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 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"]}
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 type OrmDriverHandle,\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 SqlDriverHandle<\n TClient = unknown,\n TDialect extends SqlDialect = SqlDialect,\n> = OrmDriverHandle<\"sql\", TClient, TDialect>;\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<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>,\n>(adapter: SqlAdapterLike, handle?: THandle): OrmDriver<TSchema, THandle> {\n const resolvedHandle = (handle ??\n ({\n kind: \"sql\",\n client: adapter,\n dialect: adapter.dialect,\n } satisfies SqlDriverHandle<SqlAdapterLike>)) as THandle;\n\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, THandle> = {\n handle: resolvedHandle,\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) =>\n run(createSqlDriver(txAdapter, resolvedHandle)),\n );\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema, SqlDriverHandle<SqliteDatabaseLike, \"sqlite\">>(\n createSqliteAdapter(database),\n {\n kind: \"sql\",\n client: database,\n dialect: \"sqlite\",\n },\n );\n}\n\nexport function createSqlDriverFromAdapter<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>,\n>(adapter: SqlAdapterLike, handle?: THandle) {\n return createSqlDriver<TSchema, THandle>(adapter, handle);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema, SqlDriverHandle<PgPoolLike, \"postgres\">>(\n createPgPoolAdapter(pool),\n {\n kind: \"sql\",\n client: pool,\n dialect: \"postgres\",\n },\n );\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema, SqlDriverHandle<PgClientLike, \"postgres\">>(\n createPgTransactionalAdapter(client),\n {\n kind: \"sql\",\n client,\n dialect: \"postgres\",\n },\n );\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, SqlDriverHandle<MysqlPoolLike | MysqlConnectionLike, \"mysql\">>(\n adapter,\n {\n kind: \"sql\",\n client: poolOrConnection,\n dialect: \"mysql\",\n },\n );\n}\n"],"mappings":"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","names":["updateClause","existing","targetField","sourceField","sourceValue"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SchemaDefinition, OrmDriver } from '@farming-labs/orm';
1
+ import { OrmDriverHandle, SchemaDefinition, OrmDriver } from '@farming-labs/orm';
2
2
 
3
3
  type SqlDialect = "sqlite" | "mysql" | "postgres";
4
4
  type SqlRow = Record<string, unknown>;
@@ -6,6 +6,7 @@ type SqlQueryResult = {
6
6
  rows: SqlRow[];
7
7
  affectedRows: number;
8
8
  };
9
+ type SqlDriverHandle<TClient = unknown, TDialect extends SqlDialect = SqlDialect> = OrmDriverHandle<"sql", TClient, TDialect>;
9
10
  type SqlAdapterLike = {
10
11
  dialect: SqlDialect;
11
12
  query(sql: string, params: unknown[]): Promise<SqlQueryResult>;
@@ -47,10 +48,10 @@ type SqliteDatabaseLike = {
47
48
  prepare(sql: string): SqliteStatementLike;
48
49
  exec(sql: string): void;
49
50
  };
50
- declare function createSqliteDriver<TSchema extends SchemaDefinition<any>>(database: SqliteDatabaseLike): OrmDriver<TSchema>;
51
- declare function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(adapter: SqlAdapterLike): OrmDriver<TSchema>;
52
- declare function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike): OrmDriver<TSchema>;
53
- declare function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike): OrmDriver<TSchema>;
54
- declare function createMysqlDriver<TSchema extends SchemaDefinition<any>>(poolOrConnection: MysqlPoolLike | MysqlConnectionLike): OrmDriver<TSchema>;
51
+ declare function createSqliteDriver<TSchema extends SchemaDefinition<any>>(database: SqliteDatabaseLike): OrmDriver<TSchema, SqlDriverHandle<SqliteDatabaseLike, "sqlite">>;
52
+ declare function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>>(adapter: SqlAdapterLike, handle?: THandle): OrmDriver<TSchema, THandle>;
53
+ declare function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike): OrmDriver<TSchema, SqlDriverHandle<PgPoolLike, "postgres">>;
54
+ declare function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike): OrmDriver<TSchema, SqlDriverHandle<PgClientLike, "postgres">>;
55
+ declare function createMysqlDriver<TSchema extends SchemaDefinition<any>>(poolOrConnection: MysqlPoolLike | MysqlConnectionLike): OrmDriver<TSchema, SqlDriverHandle<MysqlConnectionLike | MysqlPoolLike, "mysql">>;
55
56
 
56
- export { type MysqlConnectionLike, type MysqlPoolLike, type PgClientLike, type PgPoolLike, type SqlAdapterLike, type SqliteDatabaseLike, type SqliteStatementLike, createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqlDriverFromAdapter, createSqliteDriver };
57
+ export { type MysqlConnectionLike, type MysqlPoolLike, type PgClientLike, type PgPoolLike, type SqlAdapterLike, type SqlDriverHandle, type SqliteDatabaseLike, type SqliteStatementLike, createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqlDriverFromAdapter, createSqliteDriver };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SchemaDefinition, OrmDriver } from '@farming-labs/orm';
1
+ import { OrmDriverHandle, SchemaDefinition, OrmDriver } from '@farming-labs/orm';
2
2
 
3
3
  type SqlDialect = "sqlite" | "mysql" | "postgres";
4
4
  type SqlRow = Record<string, unknown>;
@@ -6,6 +6,7 @@ type SqlQueryResult = {
6
6
  rows: SqlRow[];
7
7
  affectedRows: number;
8
8
  };
9
+ type SqlDriverHandle<TClient = unknown, TDialect extends SqlDialect = SqlDialect> = OrmDriverHandle<"sql", TClient, TDialect>;
9
10
  type SqlAdapterLike = {
10
11
  dialect: SqlDialect;
11
12
  query(sql: string, params: unknown[]): Promise<SqlQueryResult>;
@@ -47,10 +48,10 @@ type SqliteDatabaseLike = {
47
48
  prepare(sql: string): SqliteStatementLike;
48
49
  exec(sql: string): void;
49
50
  };
50
- declare function createSqliteDriver<TSchema extends SchemaDefinition<any>>(database: SqliteDatabaseLike): OrmDriver<TSchema>;
51
- declare function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(adapter: SqlAdapterLike): OrmDriver<TSchema>;
52
- declare function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike): OrmDriver<TSchema>;
53
- declare function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike): OrmDriver<TSchema>;
54
- declare function createMysqlDriver<TSchema extends SchemaDefinition<any>>(poolOrConnection: MysqlPoolLike | MysqlConnectionLike): OrmDriver<TSchema>;
51
+ declare function createSqliteDriver<TSchema extends SchemaDefinition<any>>(database: SqliteDatabaseLike): OrmDriver<TSchema, SqlDriverHandle<SqliteDatabaseLike, "sqlite">>;
52
+ declare function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>>(adapter: SqlAdapterLike, handle?: THandle): OrmDriver<TSchema, THandle>;
53
+ declare function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike): OrmDriver<TSchema, SqlDriverHandle<PgPoolLike, "postgres">>;
54
+ declare function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike): OrmDriver<TSchema, SqlDriverHandle<PgClientLike, "postgres">>;
55
+ declare function createMysqlDriver<TSchema extends SchemaDefinition<any>>(poolOrConnection: MysqlPoolLike | MysqlConnectionLike): OrmDriver<TSchema, SqlDriverHandle<MysqlConnectionLike | MysqlPoolLike, "mysql">>;
55
56
 
56
- export { type MysqlConnectionLike, type MysqlPoolLike, type PgClientLike, type PgPoolLike, type SqlAdapterLike, type SqliteDatabaseLike, type SqliteStatementLike, createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqlDriverFromAdapter, createSqliteDriver };
57
+ export { type MysqlConnectionLike, type MysqlPoolLike, type PgClientLike, type PgPoolLike, type SqlAdapterLike, type SqlDriverHandle, type SqliteDatabaseLike, type SqliteStatementLike, createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqlDriverFromAdapter, createSqliteDriver };
package/dist/index.js CHANGED
@@ -578,7 +578,12 @@ function createMysqlPoolAdapter(pool) {
578
578
  }
579
579
  };
580
580
  }
581
- function createSqlDriver(adapter) {
581
+ function createSqlDriver(adapter, handle) {
582
+ const resolvedHandle = handle ?? {
583
+ kind: "sql",
584
+ client: adapter,
585
+ dialect: adapter.dialect
586
+ };
582
587
  async function loadRows(schema, modelName, args) {
583
588
  const nativeRows = await loadRowsWithNativeJoins(schema, modelName, args);
584
589
  if (nativeRows) {
@@ -973,6 +978,7 @@ function createSqlDriver(adapter) {
973
978
  });
974
979
  }
975
980
  const driver = {
981
+ handle: resolvedHandle,
976
982
  async findMany(schema, model, args) {
977
983
  return loadRows(schema, model, args);
978
984
  },
@@ -1119,26 +1125,56 @@ function createSqlDriver(adapter) {
1119
1125
  return result.affectedRows;
1120
1126
  },
1121
1127
  async transaction(_schema, run) {
1122
- return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));
1128
+ return adapter.transaction(
1129
+ async (txAdapter) => run(createSqlDriver(txAdapter, resolvedHandle))
1130
+ );
1123
1131
  }
1124
1132
  };
1125
1133
  return driver;
1126
1134
  }
1127
1135
  function createSqliteDriver(database) {
1128
- return createSqlDriver(createSqliteAdapter(database));
1136
+ return createSqlDriver(
1137
+ createSqliteAdapter(database),
1138
+ {
1139
+ kind: "sql",
1140
+ client: database,
1141
+ dialect: "sqlite"
1142
+ }
1143
+ );
1129
1144
  }
1130
- function createSqlDriverFromAdapter(adapter) {
1131
- return createSqlDriver(adapter);
1145
+ function createSqlDriverFromAdapter(adapter, handle) {
1146
+ return createSqlDriver(adapter, handle);
1132
1147
  }
1133
1148
  function createPgPoolDriver(pool) {
1134
- return createSqlDriver(createPgPoolAdapter(pool));
1149
+ return createSqlDriver(
1150
+ createPgPoolAdapter(pool),
1151
+ {
1152
+ kind: "sql",
1153
+ client: pool,
1154
+ dialect: "postgres"
1155
+ }
1156
+ );
1135
1157
  }
1136
1158
  function createPgClientDriver(client) {
1137
- return createSqlDriver(createPgTransactionalAdapter(client));
1159
+ return createSqlDriver(
1160
+ createPgTransactionalAdapter(client),
1161
+ {
1162
+ kind: "sql",
1163
+ client,
1164
+ dialect: "postgres"
1165
+ }
1166
+ );
1138
1167
  }
1139
1168
  function createMysqlDriver(poolOrConnection) {
1140
1169
  const adapter = "getConnection" in poolOrConnection ? createMysqlPoolAdapter(poolOrConnection) : createMysqlTransactionalAdapter(poolOrConnection);
1141
- return createSqlDriver(adapter);
1170
+ return createSqlDriver(
1171
+ adapter,
1172
+ {
1173
+ kind: "sql",
1174
+ client: poolOrConnection,
1175
+ dialect: "mysql"
1176
+ }
1177
+ );
1142
1178
  }
1143
1179
  export {
1144
1180
  createMysqlDriver,
package/dist/index.js.map CHANGED
@@ -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 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"]}
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 type OrmDriverHandle,\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 SqlDriverHandle<\n TClient = unknown,\n TDialect extends SqlDialect = SqlDialect,\n> = OrmDriverHandle<\"sql\", TClient, TDialect>;\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<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>,\n>(adapter: SqlAdapterLike, handle?: THandle): OrmDriver<TSchema, THandle> {\n const resolvedHandle = (handle ??\n ({\n kind: \"sql\",\n client: adapter,\n dialect: adapter.dialect,\n } satisfies SqlDriverHandle<SqlAdapterLike>)) as THandle;\n\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, THandle> = {\n handle: resolvedHandle,\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) =>\n run(createSqlDriver(txAdapter, resolvedHandle)),\n );\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema, SqlDriverHandle<SqliteDatabaseLike, \"sqlite\">>(\n createSqliteAdapter(database),\n {\n kind: \"sql\",\n client: database,\n dialect: \"sqlite\",\n },\n );\n}\n\nexport function createSqlDriverFromAdapter<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = SqlDriverHandle<SqlAdapterLike>,\n>(adapter: SqlAdapterLike, handle?: THandle) {\n return createSqlDriver<TSchema, THandle>(adapter, handle);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema, SqlDriverHandle<PgPoolLike, \"postgres\">>(\n createPgPoolAdapter(pool),\n {\n kind: \"sql\",\n client: pool,\n dialect: \"postgres\",\n },\n );\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema, SqlDriverHandle<PgClientLike, \"postgres\">>(\n createPgTransactionalAdapter(client),\n {\n kind: \"sql\",\n client,\n dialect: \"postgres\",\n },\n );\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, SqlDriverHandle<MysqlPoolLike | MysqlConnectionLike, \"mysql\">>(\n adapter,\n {\n kind: \"sql\",\n client: poolOrConnection,\n dialect: \"mysql\",\n },\n );\n}\n"],"mappings":"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","names":["updateClause","existing","targetField","sourceField","sourceValue"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/orm-sql",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -19,7 +19,7 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@farming-labs/orm": "0.0.12"
22
+ "@farming-labs/orm": "0.0.13"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/pg": "^8.15.6",