@farming-labs/orm-sql 0.0.9 → 0.0.10
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 +27 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +33 -91
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -149,73 +149,6 @@ function mergeWhere(...clauses) {
|
|
|
149
149
|
function isFilterObject(value) {
|
|
150
150
|
return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
|
|
151
151
|
}
|
|
152
|
-
function extractEqualityValue(filter) {
|
|
153
|
-
if (!isFilterObject(filter)) {
|
|
154
|
-
return {
|
|
155
|
-
supported: true,
|
|
156
|
-
value: filter
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
const keys = Object.keys(filter);
|
|
160
|
-
if (keys.length === 1 && "eq" in filter) {
|
|
161
|
-
return {
|
|
162
|
-
supported: true,
|
|
163
|
-
value: filter.eq
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
return {
|
|
167
|
-
supported: false,
|
|
168
|
-
value: void 0
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
function extractUpsertConflict(model, where) {
|
|
172
|
-
const keys = Object.keys(where).filter((key) => key !== "AND" && key !== "OR" && key !== "NOT");
|
|
173
|
-
if ("AND" in where || "OR" in where || "NOT" in where || keys.length !== 1) {
|
|
174
|
-
throw new Error(
|
|
175
|
-
`Upsert on model "${model.name}" requires a single unique equality filter in "where".`
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
const fieldName = keys[0];
|
|
179
|
-
const field = model.fields[fieldName];
|
|
180
|
-
if (!field) {
|
|
181
|
-
throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
|
|
182
|
-
}
|
|
183
|
-
if (!(field.kind === "id" || field.unique)) {
|
|
184
|
-
throw new Error(
|
|
185
|
-
`Upsert on model "${model.name}" requires the "where" field "${fieldName}" to be unique or an id field.`
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
const { supported, value } = extractEqualityValue(where[fieldName]);
|
|
189
|
-
if (!supported || value === void 0 || value === null) {
|
|
190
|
-
throw new Error(
|
|
191
|
-
`Upsert on model "${model.name}" requires the "where" field "${fieldName}" to use a single non-null equality value.`
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
return {
|
|
195
|
-
field,
|
|
196
|
-
value
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
function mergeUpsertCreateData(model, createData, conflict) {
|
|
200
|
-
const currentValue = createData[conflict.field.name];
|
|
201
|
-
if (currentValue !== void 0 && currentValue !== conflict.value) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
`Upsert on model "${model.name}" requires create.${conflict.field.name} to match where.${conflict.field.name}.`
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
return {
|
|
207
|
-
...createData,
|
|
208
|
-
[conflict.field.name]: currentValue ?? conflict.value
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
function validateUpsertUpdateData(model, updateData, conflict) {
|
|
212
|
-
const nextValue = updateData[conflict.field.name];
|
|
213
|
-
if (nextValue !== void 0 && nextValue !== conflict.value) {
|
|
214
|
-
throw new Error(
|
|
215
|
-
`Upsert on model "${model.name}" cannot change the conflict field "${conflict.field.name}".`
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
152
|
function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
220
153
|
const field = model.fields[fieldName];
|
|
221
154
|
if (!field) {
|
|
@@ -365,16 +298,7 @@ function buildInsertRow(model, data) {
|
|
|
365
298
|
return row;
|
|
366
299
|
}
|
|
367
300
|
function buildIdentityWhere(model, row) {
|
|
368
|
-
|
|
369
|
-
const value = row[field.name];
|
|
370
|
-
if (value === void 0) {
|
|
371
|
-
throw new Error(
|
|
372
|
-
`Model "${model.name}" could not resolve the identity field "${field.name}" from the current row.`
|
|
373
|
-
);
|
|
374
|
-
}
|
|
375
|
-
return {
|
|
376
|
-
[field.name]: value
|
|
377
|
-
};
|
|
301
|
+
return (0, import_orm.toUniqueLookupWhere)((0, import_orm.resolveRowIdentityLookup)(model, row));
|
|
378
302
|
}
|
|
379
303
|
function buildInsertStatement(model, dialect, row) {
|
|
380
304
|
const state = { params: [] };
|
|
@@ -388,7 +312,7 @@ function buildInsertStatement(model, dialect, row) {
|
|
|
388
312
|
params: state.params
|
|
389
313
|
};
|
|
390
314
|
}
|
|
391
|
-
function buildUpsertStatement(model, dialect, row, updateData,
|
|
315
|
+
function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
|
|
392
316
|
const state = { params: [] };
|
|
393
317
|
const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
|
|
394
318
|
const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
@@ -396,9 +320,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
396
320
|
(field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
|
|
397
321
|
);
|
|
398
322
|
const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
|
|
399
|
-
const
|
|
323
|
+
const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
400
324
|
let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
|
|
401
325
|
if (dialect === "mysql") {
|
|
326
|
+
const noopColumn = conflictColumns[0];
|
|
402
327
|
const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
|
|
403
328
|
const field = model.fields[fieldName];
|
|
404
329
|
if (!field) {
|
|
@@ -406,7 +331,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
406
331
|
}
|
|
407
332
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
408
333
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
409
|
-
}) : [`${
|
|
334
|
+
}) : [`${noopColumn} = ${noopColumn}`];
|
|
410
335
|
sql += ` on duplicate key update ${updateClause2.join(", ")}`;
|
|
411
336
|
return {
|
|
412
337
|
sql,
|
|
@@ -414,7 +339,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
414
339
|
};
|
|
415
340
|
}
|
|
416
341
|
if (!updateEntries.length) {
|
|
417
|
-
sql += ` on conflict (${
|
|
342
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
|
|
418
343
|
return {
|
|
419
344
|
sql,
|
|
420
345
|
params: state.params
|
|
@@ -428,7 +353,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
428
353
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
429
354
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
430
355
|
});
|
|
431
|
-
sql += ` on conflict (${
|
|
356
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
|
|
432
357
|
return {
|
|
433
358
|
sql,
|
|
434
359
|
params: state.params
|
|
@@ -805,6 +730,12 @@ function createSqlDriver(adapter) {
|
|
|
805
730
|
return loadOneRow(schema, model, args);
|
|
806
731
|
},
|
|
807
732
|
async findUnique(schema, model, args) {
|
|
733
|
+
const manifest = getManifest(schema);
|
|
734
|
+
(0, import_orm.requireUniqueLookup)(
|
|
735
|
+
manifest.models[model],
|
|
736
|
+
args.where,
|
|
737
|
+
"FindUnique"
|
|
738
|
+
);
|
|
808
739
|
return loadOneRow(schema, model, args);
|
|
809
740
|
},
|
|
810
741
|
async count(schema, model, args) {
|
|
@@ -821,15 +752,15 @@ function createSqlDriver(adapter) {
|
|
|
821
752
|
},
|
|
822
753
|
async create(schema, model, args) {
|
|
823
754
|
const manifest = getManifest(schema);
|
|
824
|
-
identityField(manifest.models[model]);
|
|
825
755
|
const row = buildInsertRow(
|
|
826
756
|
manifest.models[model],
|
|
827
757
|
args.data
|
|
828
758
|
);
|
|
759
|
+
const identityWhere = buildIdentityWhere(manifest.models[model], row);
|
|
829
760
|
const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
|
|
830
761
|
await adapter.query(statement.sql, statement.params);
|
|
831
762
|
return loadOneRow(schema, model, {
|
|
832
|
-
where:
|
|
763
|
+
where: identityWhere,
|
|
833
764
|
select: args.select
|
|
834
765
|
});
|
|
835
766
|
},
|
|
@@ -880,18 +811,24 @@ function createSqlDriver(adapter) {
|
|
|
880
811
|
async upsert(schema, model, args) {
|
|
881
812
|
const manifest = getManifest(schema);
|
|
882
813
|
const modelManifest = manifest.models[model];
|
|
883
|
-
const
|
|
884
|
-
|
|
814
|
+
const lookup = (0, import_orm.requireUniqueLookup)(
|
|
815
|
+
modelManifest,
|
|
816
|
+
args.where,
|
|
817
|
+
"Upsert"
|
|
818
|
+
);
|
|
819
|
+
(0, import_orm.validateUniqueLookupUpdateData)(
|
|
885
820
|
modelManifest,
|
|
886
821
|
args.update,
|
|
887
|
-
|
|
822
|
+
lookup,
|
|
823
|
+
"Upsert"
|
|
888
824
|
);
|
|
889
825
|
const row = buildInsertRow(
|
|
890
826
|
modelManifest,
|
|
891
|
-
|
|
827
|
+
(0, import_orm.mergeUniqueLookupCreateData)(
|
|
892
828
|
modelManifest,
|
|
893
829
|
args.create,
|
|
894
|
-
|
|
830
|
+
lookup,
|
|
831
|
+
"Upsert"
|
|
895
832
|
)
|
|
896
833
|
);
|
|
897
834
|
const statement = buildUpsertStatement(
|
|
@@ -899,7 +836,7 @@ function createSqlDriver(adapter) {
|
|
|
899
836
|
adapter.dialect,
|
|
900
837
|
row,
|
|
901
838
|
args.update,
|
|
902
|
-
|
|
839
|
+
lookup.fields
|
|
903
840
|
);
|
|
904
841
|
await adapter.query(statement.sql, statement.params);
|
|
905
842
|
return loadOneRow(schema, model, {
|
package/dist/index.cjs.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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\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 SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"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 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 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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: SqlWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\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 const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\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) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n const field = identityField(model);\n const value = row[field.name];\n if (value === undefined) {\n throw new Error(\n `Model \"${model.name}\" could not resolve the identity field \"${field.name}\" from the current row.`,\n );\n }\n return {\n [field.name]: value,\n } 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 conflictField: 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 conflictColumn = quoteIdentifier(conflictField.column, dialect);\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\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 : [`${conflictColumn} = ${conflictColumn}`];\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 (${conflictColumn}) 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 (${conflictColumn}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n 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 identityField(manifest.models[model]);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\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: buildIdentityWhere(manifest.models[model], row),\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 conflict = extractUpsertConflict(modelManifest, args.where as SqlWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n conflict.field,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n 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} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"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 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 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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\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 const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\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) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import {
|
|
4
|
-
createManifest
|
|
4
|
+
createManifest,
|
|
5
|
+
mergeUniqueLookupCreateData,
|
|
6
|
+
requireUniqueLookup,
|
|
7
|
+
resolveRowIdentityLookup,
|
|
8
|
+
toUniqueLookupWhere,
|
|
9
|
+
validateUniqueLookupUpdateData
|
|
5
10
|
} from "@farming-labs/orm";
|
|
6
11
|
var manifestCache = /* @__PURE__ */ new WeakMap();
|
|
7
12
|
function getManifest(schema) {
|
|
@@ -123,73 +128,6 @@ function mergeWhere(...clauses) {
|
|
|
123
128
|
function isFilterObject(value) {
|
|
124
129
|
return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
|
|
125
130
|
}
|
|
126
|
-
function extractEqualityValue(filter) {
|
|
127
|
-
if (!isFilterObject(filter)) {
|
|
128
|
-
return {
|
|
129
|
-
supported: true,
|
|
130
|
-
value: filter
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
const keys = Object.keys(filter);
|
|
134
|
-
if (keys.length === 1 && "eq" in filter) {
|
|
135
|
-
return {
|
|
136
|
-
supported: true,
|
|
137
|
-
value: filter.eq
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
return {
|
|
141
|
-
supported: false,
|
|
142
|
-
value: void 0
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
function extractUpsertConflict(model, where) {
|
|
146
|
-
const keys = Object.keys(where).filter((key) => key !== "AND" && key !== "OR" && key !== "NOT");
|
|
147
|
-
if ("AND" in where || "OR" in where || "NOT" in where || keys.length !== 1) {
|
|
148
|
-
throw new Error(
|
|
149
|
-
`Upsert on model "${model.name}" requires a single unique equality filter in "where".`
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
const fieldName = keys[0];
|
|
153
|
-
const field = model.fields[fieldName];
|
|
154
|
-
if (!field) {
|
|
155
|
-
throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
|
|
156
|
-
}
|
|
157
|
-
if (!(field.kind === "id" || field.unique)) {
|
|
158
|
-
throw new Error(
|
|
159
|
-
`Upsert on model "${model.name}" requires the "where" field "${fieldName}" to be unique or an id field.`
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
const { supported, value } = extractEqualityValue(where[fieldName]);
|
|
163
|
-
if (!supported || value === void 0 || value === null) {
|
|
164
|
-
throw new Error(
|
|
165
|
-
`Upsert on model "${model.name}" requires the "where" field "${fieldName}" to use a single non-null equality value.`
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
field,
|
|
170
|
-
value
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function mergeUpsertCreateData(model, createData, conflict) {
|
|
174
|
-
const currentValue = createData[conflict.field.name];
|
|
175
|
-
if (currentValue !== void 0 && currentValue !== conflict.value) {
|
|
176
|
-
throw new Error(
|
|
177
|
-
`Upsert on model "${model.name}" requires create.${conflict.field.name} to match where.${conflict.field.name}.`
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
...createData,
|
|
182
|
-
[conflict.field.name]: currentValue ?? conflict.value
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
function validateUpsertUpdateData(model, updateData, conflict) {
|
|
186
|
-
const nextValue = updateData[conflict.field.name];
|
|
187
|
-
if (nextValue !== void 0 && nextValue !== conflict.value) {
|
|
188
|
-
throw new Error(
|
|
189
|
-
`Upsert on model "${model.name}" cannot change the conflict field "${conflict.field.name}".`
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
131
|
function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
194
132
|
const field = model.fields[fieldName];
|
|
195
133
|
if (!field) {
|
|
@@ -339,16 +277,7 @@ function buildInsertRow(model, data) {
|
|
|
339
277
|
return row;
|
|
340
278
|
}
|
|
341
279
|
function buildIdentityWhere(model, row) {
|
|
342
|
-
|
|
343
|
-
const value = row[field.name];
|
|
344
|
-
if (value === void 0) {
|
|
345
|
-
throw new Error(
|
|
346
|
-
`Model "${model.name}" could not resolve the identity field "${field.name}" from the current row.`
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
|
-
return {
|
|
350
|
-
[field.name]: value
|
|
351
|
-
};
|
|
280
|
+
return toUniqueLookupWhere(resolveRowIdentityLookup(model, row));
|
|
352
281
|
}
|
|
353
282
|
function buildInsertStatement(model, dialect, row) {
|
|
354
283
|
const state = { params: [] };
|
|
@@ -362,7 +291,7 @@ function buildInsertStatement(model, dialect, row) {
|
|
|
362
291
|
params: state.params
|
|
363
292
|
};
|
|
364
293
|
}
|
|
365
|
-
function buildUpsertStatement(model, dialect, row, updateData,
|
|
294
|
+
function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
|
|
366
295
|
const state = { params: [] };
|
|
367
296
|
const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
|
|
368
297
|
const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
@@ -370,9 +299,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
370
299
|
(field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
|
|
371
300
|
);
|
|
372
301
|
const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
|
|
373
|
-
const
|
|
302
|
+
const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
374
303
|
let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
|
|
375
304
|
if (dialect === "mysql") {
|
|
305
|
+
const noopColumn = conflictColumns[0];
|
|
376
306
|
const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
|
|
377
307
|
const field = model.fields[fieldName];
|
|
378
308
|
if (!field) {
|
|
@@ -380,7 +310,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
380
310
|
}
|
|
381
311
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
382
312
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
383
|
-
}) : [`${
|
|
313
|
+
}) : [`${noopColumn} = ${noopColumn}`];
|
|
384
314
|
sql += ` on duplicate key update ${updateClause2.join(", ")}`;
|
|
385
315
|
return {
|
|
386
316
|
sql,
|
|
@@ -388,7 +318,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
388
318
|
};
|
|
389
319
|
}
|
|
390
320
|
if (!updateEntries.length) {
|
|
391
|
-
sql += ` on conflict (${
|
|
321
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
|
|
392
322
|
return {
|
|
393
323
|
sql,
|
|
394
324
|
params: state.params
|
|
@@ -402,7 +332,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
402
332
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
403
333
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
404
334
|
});
|
|
405
|
-
sql += ` on conflict (${
|
|
335
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
|
|
406
336
|
return {
|
|
407
337
|
sql,
|
|
408
338
|
params: state.params
|
|
@@ -779,6 +709,12 @@ function createSqlDriver(adapter) {
|
|
|
779
709
|
return loadOneRow(schema, model, args);
|
|
780
710
|
},
|
|
781
711
|
async findUnique(schema, model, args) {
|
|
712
|
+
const manifest = getManifest(schema);
|
|
713
|
+
requireUniqueLookup(
|
|
714
|
+
manifest.models[model],
|
|
715
|
+
args.where,
|
|
716
|
+
"FindUnique"
|
|
717
|
+
);
|
|
782
718
|
return loadOneRow(schema, model, args);
|
|
783
719
|
},
|
|
784
720
|
async count(schema, model, args) {
|
|
@@ -795,15 +731,15 @@ function createSqlDriver(adapter) {
|
|
|
795
731
|
},
|
|
796
732
|
async create(schema, model, args) {
|
|
797
733
|
const manifest = getManifest(schema);
|
|
798
|
-
identityField(manifest.models[model]);
|
|
799
734
|
const row = buildInsertRow(
|
|
800
735
|
manifest.models[model],
|
|
801
736
|
args.data
|
|
802
737
|
);
|
|
738
|
+
const identityWhere = buildIdentityWhere(manifest.models[model], row);
|
|
803
739
|
const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
|
|
804
740
|
await adapter.query(statement.sql, statement.params);
|
|
805
741
|
return loadOneRow(schema, model, {
|
|
806
|
-
where:
|
|
742
|
+
where: identityWhere,
|
|
807
743
|
select: args.select
|
|
808
744
|
});
|
|
809
745
|
},
|
|
@@ -854,18 +790,24 @@ function createSqlDriver(adapter) {
|
|
|
854
790
|
async upsert(schema, model, args) {
|
|
855
791
|
const manifest = getManifest(schema);
|
|
856
792
|
const modelManifest = manifest.models[model];
|
|
857
|
-
const
|
|
858
|
-
|
|
793
|
+
const lookup = requireUniqueLookup(
|
|
794
|
+
modelManifest,
|
|
795
|
+
args.where,
|
|
796
|
+
"Upsert"
|
|
797
|
+
);
|
|
798
|
+
validateUniqueLookupUpdateData(
|
|
859
799
|
modelManifest,
|
|
860
800
|
args.update,
|
|
861
|
-
|
|
801
|
+
lookup,
|
|
802
|
+
"Upsert"
|
|
862
803
|
);
|
|
863
804
|
const row = buildInsertRow(
|
|
864
805
|
modelManifest,
|
|
865
|
-
|
|
806
|
+
mergeUniqueLookupCreateData(
|
|
866
807
|
modelManifest,
|
|
867
808
|
args.create,
|
|
868
|
-
|
|
809
|
+
lookup,
|
|
810
|
+
"Upsert"
|
|
869
811
|
)
|
|
870
812
|
);
|
|
871
813
|
const statement = buildUpsertStatement(
|
|
@@ -873,7 +815,7 @@ function createSqlDriver(adapter) {
|
|
|
873
815
|
adapter.dialect,
|
|
874
816
|
row,
|
|
875
817
|
args.update,
|
|
876
|
-
|
|
818
|
+
lookup.fields
|
|
877
819
|
);
|
|
878
820
|
await adapter.query(statement.sql, statement.params);
|
|
879
821
|
return loadOneRow(schema, model, {
|
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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\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 SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"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 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 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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: SqlWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\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 const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\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) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n const field = identityField(model);\n const value = row[field.name];\n if (value === undefined) {\n throw new Error(\n `Model \"${model.name}\" could not resolve the identity field \"${field.name}\" from the current row.`,\n );\n }\n return {\n [field.name]: value,\n } 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 conflictField: 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 conflictColumn = quoteIdentifier(conflictField.column, dialect);\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\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 : [`${conflictColumn} = ${conflictColumn}`];\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 (${conflictColumn}) 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 (${conflictColumn}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n 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 identityField(manifest.models[model]);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\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: buildIdentityWhere(manifest.models[model], row),\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 conflict = extractUpsertConflict(modelManifest, args.where as SqlWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n conflict.field,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n 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} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"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 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 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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\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 const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\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) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farming-labs/orm-sql",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
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.
|
|
22
|
+
"@farming-labs/orm": "0.0.10"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/pg": "^8.15.6",
|