@farming-labs/orm-sql 0.0.9 → 0.0.11
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 +61 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +68 -108
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -77,6 +77,9 @@ function encodeValue(field, dialect, value) {
|
|
|
77
77
|
if (dialect === "postgres") return Boolean(value);
|
|
78
78
|
return value ? 1 : 0;
|
|
79
79
|
}
|
|
80
|
+
if (field.kind === "integer") {
|
|
81
|
+
return Number(value);
|
|
82
|
+
}
|
|
80
83
|
if (field.kind === "datetime") {
|
|
81
84
|
if (value instanceof Date) {
|
|
82
85
|
if (dialect === "mysql") {
|
|
@@ -86,6 +89,12 @@ function encodeValue(field, dialect, value) {
|
|
|
86
89
|
}
|
|
87
90
|
return value;
|
|
88
91
|
}
|
|
92
|
+
if (field.kind === "json") {
|
|
93
|
+
if (dialect === "postgres") {
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
return JSON.stringify(value);
|
|
97
|
+
}
|
|
89
98
|
return value;
|
|
90
99
|
}
|
|
91
100
|
function normalizeNaiveSqlDate(value) {
|
|
@@ -129,6 +138,19 @@ function decodeValue(field, dialect, value) {
|
|
|
129
138
|
}
|
|
130
139
|
return new Date(String(value));
|
|
131
140
|
}
|
|
141
|
+
if (field.kind === "integer") {
|
|
142
|
+
return typeof value === "number" ? value : Number(value);
|
|
143
|
+
}
|
|
144
|
+
if (field.kind === "json") {
|
|
145
|
+
if (typeof value === "string") {
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(value);
|
|
148
|
+
} catch {
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return value;
|
|
153
|
+
}
|
|
132
154
|
return value;
|
|
133
155
|
}
|
|
134
156
|
function decodeRow(model, dialect, row) {
|
|
@@ -146,106 +168,36 @@ function mergeWhere(...clauses) {
|
|
|
146
168
|
AND: defined
|
|
147
169
|
};
|
|
148
170
|
}
|
|
149
|
-
function isFilterObject(value) {
|
|
150
|
-
return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
|
|
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
171
|
function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
220
172
|
const field = model.fields[fieldName];
|
|
221
173
|
if (!field) {
|
|
222
174
|
throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
|
|
223
175
|
}
|
|
224
176
|
const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;
|
|
225
|
-
|
|
177
|
+
const createValueExpression = (value) => {
|
|
178
|
+
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
179
|
+
if (field.kind === "json" && dialect === "mysql") {
|
|
180
|
+
return `cast(${placeholder} as json)`;
|
|
181
|
+
}
|
|
182
|
+
return placeholder;
|
|
183
|
+
};
|
|
184
|
+
if (!(0, import_orm.isOperatorFilterObject)(filter)) {
|
|
226
185
|
if (filter === null) return `${column} is null`;
|
|
227
|
-
|
|
228
|
-
return `${column} = ${placeholder}`;
|
|
186
|
+
return `${column} = ${createValueExpression(filter)}`;
|
|
229
187
|
}
|
|
230
188
|
const clauses = [];
|
|
231
189
|
if ("eq" in filter) {
|
|
232
190
|
if (filter.eq === null) {
|
|
233
191
|
clauses.push(`${column} is null`);
|
|
234
192
|
} else {
|
|
235
|
-
|
|
236
|
-
clauses.push(`${column} = ${placeholder}`);
|
|
193
|
+
clauses.push(`${column} = ${createValueExpression(filter.eq)}`);
|
|
237
194
|
}
|
|
238
195
|
}
|
|
239
196
|
if ("not" in filter) {
|
|
240
197
|
if (filter.not === null) {
|
|
241
198
|
clauses.push(`${column} is not null`);
|
|
242
199
|
} else {
|
|
243
|
-
|
|
244
|
-
dialect,
|
|
245
|
-
state,
|
|
246
|
-
encodeValue(field, dialect, filter.not)
|
|
247
|
-
);
|
|
248
|
-
clauses.push(`${column} <> ${placeholder}`);
|
|
200
|
+
clauses.push(`${column} <> ${createValueExpression(filter.not)}`);
|
|
249
201
|
}
|
|
250
202
|
}
|
|
251
203
|
if ("in" in filter) {
|
|
@@ -253,9 +205,7 @@ function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
|
253
205
|
if (!values.length) {
|
|
254
206
|
clauses.push("1 = 0");
|
|
255
207
|
} else {
|
|
256
|
-
const placeholders = values.map(
|
|
257
|
-
(value) => createPlaceholder(dialect, state, encodeValue(field, dialect, value))
|
|
258
|
-
);
|
|
208
|
+
const placeholders = values.map((value) => createValueExpression(value));
|
|
259
209
|
clauses.push(`${column} in (${placeholders.join(", ")})`);
|
|
260
210
|
}
|
|
261
211
|
}
|
|
@@ -365,16 +315,7 @@ function buildInsertRow(model, data) {
|
|
|
365
315
|
return row;
|
|
366
316
|
}
|
|
367
317
|
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
|
-
};
|
|
318
|
+
return (0, import_orm.toUniqueLookupWhere)((0, import_orm.resolveRowIdentityLookup)(model, row));
|
|
378
319
|
}
|
|
379
320
|
function buildInsertStatement(model, dialect, row) {
|
|
380
321
|
const state = { params: [] };
|
|
@@ -388,7 +329,7 @@ function buildInsertStatement(model, dialect, row) {
|
|
|
388
329
|
params: state.params
|
|
389
330
|
};
|
|
390
331
|
}
|
|
391
|
-
function buildUpsertStatement(model, dialect, row, updateData,
|
|
332
|
+
function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
|
|
392
333
|
const state = { params: [] };
|
|
393
334
|
const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
|
|
394
335
|
const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
@@ -396,9 +337,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
396
337
|
(field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
|
|
397
338
|
);
|
|
398
339
|
const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
|
|
399
|
-
const
|
|
340
|
+
const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
400
341
|
let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
|
|
401
342
|
if (dialect === "mysql") {
|
|
343
|
+
const noopColumn = conflictColumns[0];
|
|
402
344
|
const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
|
|
403
345
|
const field = model.fields[fieldName];
|
|
404
346
|
if (!field) {
|
|
@@ -406,7 +348,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
406
348
|
}
|
|
407
349
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
408
350
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
409
|
-
}) : [`${
|
|
351
|
+
}) : [`${noopColumn} = ${noopColumn}`];
|
|
410
352
|
sql += ` on duplicate key update ${updateClause2.join(", ")}`;
|
|
411
353
|
return {
|
|
412
354
|
sql,
|
|
@@ -414,7 +356,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
414
356
|
};
|
|
415
357
|
}
|
|
416
358
|
if (!updateEntries.length) {
|
|
417
|
-
sql += ` on conflict (${
|
|
359
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
|
|
418
360
|
return {
|
|
419
361
|
sql,
|
|
420
362
|
params: state.params
|
|
@@ -428,7 +370,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
428
370
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
429
371
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
430
372
|
});
|
|
431
|
-
sql += ` on conflict (${
|
|
373
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
|
|
432
374
|
return {
|
|
433
375
|
sql,
|
|
434
376
|
params: state.params
|
|
@@ -805,6 +747,12 @@ function createSqlDriver(adapter) {
|
|
|
805
747
|
return loadOneRow(schema, model, args);
|
|
806
748
|
},
|
|
807
749
|
async findUnique(schema, model, args) {
|
|
750
|
+
const manifest = getManifest(schema);
|
|
751
|
+
(0, import_orm.requireUniqueLookup)(
|
|
752
|
+
manifest.models[model],
|
|
753
|
+
args.where,
|
|
754
|
+
"FindUnique"
|
|
755
|
+
);
|
|
808
756
|
return loadOneRow(schema, model, args);
|
|
809
757
|
},
|
|
810
758
|
async count(schema, model, args) {
|
|
@@ -821,15 +769,15 @@ function createSqlDriver(adapter) {
|
|
|
821
769
|
},
|
|
822
770
|
async create(schema, model, args) {
|
|
823
771
|
const manifest = getManifest(schema);
|
|
824
|
-
identityField(manifest.models[model]);
|
|
825
772
|
const row = buildInsertRow(
|
|
826
773
|
manifest.models[model],
|
|
827
774
|
args.data
|
|
828
775
|
);
|
|
776
|
+
const identityWhere = buildIdentityWhere(manifest.models[model], row);
|
|
829
777
|
const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
|
|
830
778
|
await adapter.query(statement.sql, statement.params);
|
|
831
779
|
return loadOneRow(schema, model, {
|
|
832
|
-
where:
|
|
780
|
+
where: identityWhere,
|
|
833
781
|
select: args.select
|
|
834
782
|
});
|
|
835
783
|
},
|
|
@@ -880,18 +828,24 @@ function createSqlDriver(adapter) {
|
|
|
880
828
|
async upsert(schema, model, args) {
|
|
881
829
|
const manifest = getManifest(schema);
|
|
882
830
|
const modelManifest = manifest.models[model];
|
|
883
|
-
const
|
|
884
|
-
|
|
831
|
+
const lookup = (0, import_orm.requireUniqueLookup)(
|
|
832
|
+
modelManifest,
|
|
833
|
+
args.where,
|
|
834
|
+
"Upsert"
|
|
835
|
+
);
|
|
836
|
+
(0, import_orm.validateUniqueLookupUpdateData)(
|
|
885
837
|
modelManifest,
|
|
886
838
|
args.update,
|
|
887
|
-
|
|
839
|
+
lookup,
|
|
840
|
+
"Upsert"
|
|
888
841
|
);
|
|
889
842
|
const row = buildInsertRow(
|
|
890
843
|
modelManifest,
|
|
891
|
-
|
|
844
|
+
(0, import_orm.mergeUniqueLookupCreateData)(
|
|
892
845
|
modelManifest,
|
|
893
846
|
args.create,
|
|
894
|
-
|
|
847
|
+
lookup,
|
|
848
|
+
"Upsert"
|
|
895
849
|
)
|
|
896
850
|
);
|
|
897
851
|
const statement = buildUpsertStatement(
|
|
@@ -899,7 +853,7 @@ function createSqlDriver(adapter) {
|
|
|
899
853
|
adapter.dialect,
|
|
900
854
|
row,
|
|
901
855
|
args.update,
|
|
902
|
-
|
|
856
|
+
lookup.fields
|
|
903
857
|
);
|
|
904
858
|
await adapter.query(statement.sql, statement.params);
|
|
905
859
|
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 isOperatorFilterObject,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n type JsonValue,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlWhere = Where<Record<string, unknown>>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") {\n return value;\n }\n return JSON.stringify(value);\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n if (field.kind === \"integer\") {\n return typeof value === \"number\" ? value : Number(value);\n }\n\n if (field.kind === \"json\") {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as JsonValue;\n } catch {\n return value;\n }\n }\n return value;\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n const createValueExpression = (value: unknown) => {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n if (field.kind === \"json\" && dialect === \"mysql\") {\n return `cast(${placeholder} as json)`;\n }\n return placeholder;\n };\n\n if (!isOperatorFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n return `${column} = ${createValueExpression(filter)}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n clauses.push(`${column} = ${createValueExpression(filter.eq)}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n clauses.push(`${column} <> ${createValueExpression(filter.not)}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) => createValueExpression(value));\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import {
|
|
4
|
-
createManifest
|
|
4
|
+
createManifest,
|
|
5
|
+
mergeUniqueLookupCreateData,
|
|
6
|
+
isOperatorFilterObject,
|
|
7
|
+
requireUniqueLookup,
|
|
8
|
+
resolveRowIdentityLookup,
|
|
9
|
+
toUniqueLookupWhere,
|
|
10
|
+
validateUniqueLookupUpdateData
|
|
5
11
|
} from "@farming-labs/orm";
|
|
6
12
|
var manifestCache = /* @__PURE__ */ new WeakMap();
|
|
7
13
|
function getManifest(schema) {
|
|
@@ -51,6 +57,9 @@ function encodeValue(field, dialect, value) {
|
|
|
51
57
|
if (dialect === "postgres") return Boolean(value);
|
|
52
58
|
return value ? 1 : 0;
|
|
53
59
|
}
|
|
60
|
+
if (field.kind === "integer") {
|
|
61
|
+
return Number(value);
|
|
62
|
+
}
|
|
54
63
|
if (field.kind === "datetime") {
|
|
55
64
|
if (value instanceof Date) {
|
|
56
65
|
if (dialect === "mysql") {
|
|
@@ -60,6 +69,12 @@ function encodeValue(field, dialect, value) {
|
|
|
60
69
|
}
|
|
61
70
|
return value;
|
|
62
71
|
}
|
|
72
|
+
if (field.kind === "json") {
|
|
73
|
+
if (dialect === "postgres") {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
return JSON.stringify(value);
|
|
77
|
+
}
|
|
63
78
|
return value;
|
|
64
79
|
}
|
|
65
80
|
function normalizeNaiveSqlDate(value) {
|
|
@@ -103,6 +118,19 @@ function decodeValue(field, dialect, value) {
|
|
|
103
118
|
}
|
|
104
119
|
return new Date(String(value));
|
|
105
120
|
}
|
|
121
|
+
if (field.kind === "integer") {
|
|
122
|
+
return typeof value === "number" ? value : Number(value);
|
|
123
|
+
}
|
|
124
|
+
if (field.kind === "json") {
|
|
125
|
+
if (typeof value === "string") {
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(value);
|
|
128
|
+
} catch {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
106
134
|
return value;
|
|
107
135
|
}
|
|
108
136
|
function decodeRow(model, dialect, row) {
|
|
@@ -120,106 +148,36 @@ function mergeWhere(...clauses) {
|
|
|
120
148
|
AND: defined
|
|
121
149
|
};
|
|
122
150
|
}
|
|
123
|
-
function isFilterObject(value) {
|
|
124
|
-
return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
|
|
125
|
-
}
|
|
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
151
|
function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
194
152
|
const field = model.fields[fieldName];
|
|
195
153
|
if (!field) {
|
|
196
154
|
throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
|
|
197
155
|
}
|
|
198
156
|
const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;
|
|
199
|
-
|
|
157
|
+
const createValueExpression = (value) => {
|
|
158
|
+
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
159
|
+
if (field.kind === "json" && dialect === "mysql") {
|
|
160
|
+
return `cast(${placeholder} as json)`;
|
|
161
|
+
}
|
|
162
|
+
return placeholder;
|
|
163
|
+
};
|
|
164
|
+
if (!isOperatorFilterObject(filter)) {
|
|
200
165
|
if (filter === null) return `${column} is null`;
|
|
201
|
-
|
|
202
|
-
return `${column} = ${placeholder}`;
|
|
166
|
+
return `${column} = ${createValueExpression(filter)}`;
|
|
203
167
|
}
|
|
204
168
|
const clauses = [];
|
|
205
169
|
if ("eq" in filter) {
|
|
206
170
|
if (filter.eq === null) {
|
|
207
171
|
clauses.push(`${column} is null`);
|
|
208
172
|
} else {
|
|
209
|
-
|
|
210
|
-
clauses.push(`${column} = ${placeholder}`);
|
|
173
|
+
clauses.push(`${column} = ${createValueExpression(filter.eq)}`);
|
|
211
174
|
}
|
|
212
175
|
}
|
|
213
176
|
if ("not" in filter) {
|
|
214
177
|
if (filter.not === null) {
|
|
215
178
|
clauses.push(`${column} is not null`);
|
|
216
179
|
} else {
|
|
217
|
-
|
|
218
|
-
dialect,
|
|
219
|
-
state,
|
|
220
|
-
encodeValue(field, dialect, filter.not)
|
|
221
|
-
);
|
|
222
|
-
clauses.push(`${column} <> ${placeholder}`);
|
|
180
|
+
clauses.push(`${column} <> ${createValueExpression(filter.not)}`);
|
|
223
181
|
}
|
|
224
182
|
}
|
|
225
183
|
if ("in" in filter) {
|
|
@@ -227,9 +185,7 @@ function compileFieldFilter(model, fieldName, filter, dialect, state) {
|
|
|
227
185
|
if (!values.length) {
|
|
228
186
|
clauses.push("1 = 0");
|
|
229
187
|
} else {
|
|
230
|
-
const placeholders = values.map(
|
|
231
|
-
(value) => createPlaceholder(dialect, state, encodeValue(field, dialect, value))
|
|
232
|
-
);
|
|
188
|
+
const placeholders = values.map((value) => createValueExpression(value));
|
|
233
189
|
clauses.push(`${column} in (${placeholders.join(", ")})`);
|
|
234
190
|
}
|
|
235
191
|
}
|
|
@@ -339,16 +295,7 @@ function buildInsertRow(model, data) {
|
|
|
339
295
|
return row;
|
|
340
296
|
}
|
|
341
297
|
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
|
-
};
|
|
298
|
+
return toUniqueLookupWhere(resolveRowIdentityLookup(model, row));
|
|
352
299
|
}
|
|
353
300
|
function buildInsertStatement(model, dialect, row) {
|
|
354
301
|
const state = { params: [] };
|
|
@@ -362,7 +309,7 @@ function buildInsertStatement(model, dialect, row) {
|
|
|
362
309
|
params: state.params
|
|
363
310
|
};
|
|
364
311
|
}
|
|
365
|
-
function buildUpsertStatement(model, dialect, row, updateData,
|
|
312
|
+
function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
|
|
366
313
|
const state = { params: [] };
|
|
367
314
|
const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
|
|
368
315
|
const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
@@ -370,9 +317,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
370
317
|
(field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
|
|
371
318
|
);
|
|
372
319
|
const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
|
|
373
|
-
const
|
|
320
|
+
const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
|
|
374
321
|
let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
|
|
375
322
|
if (dialect === "mysql") {
|
|
323
|
+
const noopColumn = conflictColumns[0];
|
|
376
324
|
const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
|
|
377
325
|
const field = model.fields[fieldName];
|
|
378
326
|
if (!field) {
|
|
@@ -380,7 +328,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
380
328
|
}
|
|
381
329
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
382
330
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
383
|
-
}) : [`${
|
|
331
|
+
}) : [`${noopColumn} = ${noopColumn}`];
|
|
384
332
|
sql += ` on duplicate key update ${updateClause2.join(", ")}`;
|
|
385
333
|
return {
|
|
386
334
|
sql,
|
|
@@ -388,7 +336,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
388
336
|
};
|
|
389
337
|
}
|
|
390
338
|
if (!updateEntries.length) {
|
|
391
|
-
sql += ` on conflict (${
|
|
339
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
|
|
392
340
|
return {
|
|
393
341
|
sql,
|
|
394
342
|
params: state.params
|
|
@@ -402,7 +350,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
|
|
|
402
350
|
const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
|
|
403
351
|
return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
|
|
404
352
|
});
|
|
405
|
-
sql += ` on conflict (${
|
|
353
|
+
sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
|
|
406
354
|
return {
|
|
407
355
|
sql,
|
|
408
356
|
params: state.params
|
|
@@ -779,6 +727,12 @@ function createSqlDriver(adapter) {
|
|
|
779
727
|
return loadOneRow(schema, model, args);
|
|
780
728
|
},
|
|
781
729
|
async findUnique(schema, model, args) {
|
|
730
|
+
const manifest = getManifest(schema);
|
|
731
|
+
requireUniqueLookup(
|
|
732
|
+
manifest.models[model],
|
|
733
|
+
args.where,
|
|
734
|
+
"FindUnique"
|
|
735
|
+
);
|
|
782
736
|
return loadOneRow(schema, model, args);
|
|
783
737
|
},
|
|
784
738
|
async count(schema, model, args) {
|
|
@@ -795,15 +749,15 @@ function createSqlDriver(adapter) {
|
|
|
795
749
|
},
|
|
796
750
|
async create(schema, model, args) {
|
|
797
751
|
const manifest = getManifest(schema);
|
|
798
|
-
identityField(manifest.models[model]);
|
|
799
752
|
const row = buildInsertRow(
|
|
800
753
|
manifest.models[model],
|
|
801
754
|
args.data
|
|
802
755
|
);
|
|
756
|
+
const identityWhere = buildIdentityWhere(manifest.models[model], row);
|
|
803
757
|
const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
|
|
804
758
|
await adapter.query(statement.sql, statement.params);
|
|
805
759
|
return loadOneRow(schema, model, {
|
|
806
|
-
where:
|
|
760
|
+
where: identityWhere,
|
|
807
761
|
select: args.select
|
|
808
762
|
});
|
|
809
763
|
},
|
|
@@ -854,18 +808,24 @@ function createSqlDriver(adapter) {
|
|
|
854
808
|
async upsert(schema, model, args) {
|
|
855
809
|
const manifest = getManifest(schema);
|
|
856
810
|
const modelManifest = manifest.models[model];
|
|
857
|
-
const
|
|
858
|
-
|
|
811
|
+
const lookup = requireUniqueLookup(
|
|
812
|
+
modelManifest,
|
|
813
|
+
args.where,
|
|
814
|
+
"Upsert"
|
|
815
|
+
);
|
|
816
|
+
validateUniqueLookupUpdateData(
|
|
859
817
|
modelManifest,
|
|
860
818
|
args.update,
|
|
861
|
-
|
|
819
|
+
lookup,
|
|
820
|
+
"Upsert"
|
|
862
821
|
);
|
|
863
822
|
const row = buildInsertRow(
|
|
864
823
|
modelManifest,
|
|
865
|
-
|
|
824
|
+
mergeUniqueLookupCreateData(
|
|
866
825
|
modelManifest,
|
|
867
826
|
args.create,
|
|
868
|
-
|
|
827
|
+
lookup,
|
|
828
|
+
"Upsert"
|
|
869
829
|
)
|
|
870
830
|
);
|
|
871
831
|
const statement = buildUpsertStatement(
|
|
@@ -873,7 +833,7 @@ function createSqlDriver(adapter) {
|
|
|
873
833
|
adapter.dialect,
|
|
874
834
|
row,
|
|
875
835
|
args.update,
|
|
876
|
-
|
|
836
|
+
lookup.fields
|
|
877
837
|
);
|
|
878
838
|
await adapter.query(statement.sql, statement.params);
|
|
879
839
|
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 isOperatorFilterObject,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n type JsonValue,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlWhere = Where<Record<string, unknown>>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") {\n return value;\n }\n return JSON.stringify(value);\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n if (field.kind === \"integer\") {\n return typeof value === \"number\" ? value : Number(value);\n }\n\n if (field.kind === \"json\") {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as JsonValue;\n } catch {\n return value;\n }\n }\n return value;\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n const createValueExpression = (value: unknown) => {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n if (field.kind === \"json\" && dialect === \"mysql\") {\n return `cast(${placeholder} as json)`;\n }\n return placeholder;\n };\n\n if (!isOperatorFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n return `${column} = ${createValueExpression(filter)}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n clauses.push(`${column} = ${createValueExpression(filter.eq)}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n clauses.push(`${column} <> ${createValueExpression(filter.not)}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) => createValueExpression(value));\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
|
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.11",
|
|
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.11"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/pg": "^8.15.6",
|