@farming-labs/orm-sql 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -101,6 +101,15 @@ function normalizeNaiveSqlDate(value) {
101
101
  )
102
102
  );
103
103
  }
104
+ function parseSqlDateString(value) {
105
+ const trimmed = value.trim();
106
+ const hasTimezone = /(?:z|[+-]\d{2}(?::?\d{2})?)$/i.test(trimmed);
107
+ const naiveSqlDate = /^\d{4}-\d{2}-\d{2}[ t]\d{2}:\d{2}:\d{2}(?:\.\d+)?$/i.test(trimmed);
108
+ if (naiveSqlDate && !hasTimezone) {
109
+ return /* @__PURE__ */ new Date(trimmed.replace(" ", "T") + "Z");
110
+ }
111
+ return new Date(trimmed);
112
+ }
104
113
  function decodeValue(field, dialect, value) {
105
114
  if (value === void 0) return value;
106
115
  if (value === null) return null;
@@ -113,7 +122,10 @@ function decodeValue(field, dialect, value) {
113
122
  }
114
123
  if (field.kind === "datetime") {
115
124
  if (value instanceof Date) {
116
- return dialect === "mysql" || dialect === "postgres" ? normalizeNaiveSqlDate(value) : value;
125
+ return dialect === "mysql" ? normalizeNaiveSqlDate(value) : value;
126
+ }
127
+ if (typeof value === "string") {
128
+ return parseSqlDateString(value);
117
129
  }
118
130
  return new Date(String(value));
119
131
  }
@@ -137,73 +149,6 @@ function mergeWhere(...clauses) {
137
149
  function isFilterObject(value) {
138
150
  return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
139
151
  }
140
- function extractEqualityValue(filter) {
141
- if (!isFilterObject(filter)) {
142
- return {
143
- supported: true,
144
- value: filter
145
- };
146
- }
147
- const keys = Object.keys(filter);
148
- if (keys.length === 1 && "eq" in filter) {
149
- return {
150
- supported: true,
151
- value: filter.eq
152
- };
153
- }
154
- return {
155
- supported: false,
156
- value: void 0
157
- };
158
- }
159
- function extractUpsertConflict(model, where) {
160
- const keys = Object.keys(where).filter((key) => key !== "AND" && key !== "OR" && key !== "NOT");
161
- if ("AND" in where || "OR" in where || "NOT" in where || keys.length !== 1) {
162
- throw new Error(
163
- `Upsert on model "${model.name}" requires a single unique equality filter in "where".`
164
- );
165
- }
166
- const fieldName = keys[0];
167
- const field = model.fields[fieldName];
168
- if (!field) {
169
- throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
170
- }
171
- if (!(field.kind === "id" || field.unique)) {
172
- throw new Error(
173
- `Upsert on model "${model.name}" requires the "where" field "${fieldName}" to be unique or an id field.`
174
- );
175
- }
176
- const { supported, value } = extractEqualityValue(where[fieldName]);
177
- if (!supported || value === void 0 || value === null) {
178
- throw new Error(
179
- `Upsert on model "${model.name}" requires the "where" field "${fieldName}" to use a single non-null equality value.`
180
- );
181
- }
182
- return {
183
- field,
184
- value
185
- };
186
- }
187
- function mergeUpsertCreateData(model, createData, conflict) {
188
- const currentValue = createData[conflict.field.name];
189
- if (currentValue !== void 0 && currentValue !== conflict.value) {
190
- throw new Error(
191
- `Upsert on model "${model.name}" requires create.${conflict.field.name} to match where.${conflict.field.name}.`
192
- );
193
- }
194
- return {
195
- ...createData,
196
- [conflict.field.name]: currentValue ?? conflict.value
197
- };
198
- }
199
- function validateUpsertUpdateData(model, updateData, conflict) {
200
- const nextValue = updateData[conflict.field.name];
201
- if (nextValue !== void 0 && nextValue !== conflict.value) {
202
- throw new Error(
203
- `Upsert on model "${model.name}" cannot change the conflict field "${conflict.field.name}".`
204
- );
205
- }
206
- }
207
152
  function compileFieldFilter(model, fieldName, filter, dialect, state) {
208
153
  const field = model.fields[fieldName];
209
154
  if (!field) {
@@ -353,16 +298,7 @@ function buildInsertRow(model, data) {
353
298
  return row;
354
299
  }
355
300
  function buildIdentityWhere(model, row) {
356
- const field = identityField(model);
357
- const value = row[field.name];
358
- if (value === void 0) {
359
- throw new Error(
360
- `Model "${model.name}" could not resolve the identity field "${field.name}" from the current row.`
361
- );
362
- }
363
- return {
364
- [field.name]: value
365
- };
301
+ return (0, import_orm.toUniqueLookupWhere)((0, import_orm.resolveRowIdentityLookup)(model, row));
366
302
  }
367
303
  function buildInsertStatement(model, dialect, row) {
368
304
  const state = { params: [] };
@@ -376,7 +312,7 @@ function buildInsertStatement(model, dialect, row) {
376
312
  params: state.params
377
313
  };
378
314
  }
379
- function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
315
+ function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
380
316
  const state = { params: [] };
381
317
  const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
382
318
  const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
@@ -384,9 +320,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
384
320
  (field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
385
321
  );
386
322
  const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
387
- const conflictColumn = quoteIdentifier(conflictField.column, dialect);
323
+ const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
388
324
  let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
389
325
  if (dialect === "mysql") {
326
+ const noopColumn = conflictColumns[0];
390
327
  const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
391
328
  const field = model.fields[fieldName];
392
329
  if (!field) {
@@ -394,7 +331,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
394
331
  }
395
332
  const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
396
333
  return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
397
- }) : [`${conflictColumn} = ${conflictColumn}`];
334
+ }) : [`${noopColumn} = ${noopColumn}`];
398
335
  sql += ` on duplicate key update ${updateClause2.join(", ")}`;
399
336
  return {
400
337
  sql,
@@ -402,7 +339,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
402
339
  };
403
340
  }
404
341
  if (!updateEntries.length) {
405
- sql += ` on conflict (${conflictColumn}) do nothing`;
342
+ sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
406
343
  return {
407
344
  sql,
408
345
  params: state.params
@@ -416,7 +353,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
416
353
  const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
417
354
  return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
418
355
  });
419
- sql += ` on conflict (${conflictColumn}) do update set ${updateClause.join(", ")}`;
356
+ sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
420
357
  return {
421
358
  sql,
422
359
  params: state.params
@@ -793,6 +730,12 @@ function createSqlDriver(adapter) {
793
730
  return loadOneRow(schema, model, args);
794
731
  },
795
732
  async findUnique(schema, model, args) {
733
+ const manifest = getManifest(schema);
734
+ (0, import_orm.requireUniqueLookup)(
735
+ manifest.models[model],
736
+ args.where,
737
+ "FindUnique"
738
+ );
796
739
  return loadOneRow(schema, model, args);
797
740
  },
798
741
  async count(schema, model, args) {
@@ -809,15 +752,15 @@ function createSqlDriver(adapter) {
809
752
  },
810
753
  async create(schema, model, args) {
811
754
  const manifest = getManifest(schema);
812
- identityField(manifest.models[model]);
813
755
  const row = buildInsertRow(
814
756
  manifest.models[model],
815
757
  args.data
816
758
  );
759
+ const identityWhere = buildIdentityWhere(manifest.models[model], row);
817
760
  const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
818
761
  await adapter.query(statement.sql, statement.params);
819
762
  return loadOneRow(schema, model, {
820
- where: buildIdentityWhere(manifest.models[model], row),
763
+ where: identityWhere,
821
764
  select: args.select
822
765
  });
823
766
  },
@@ -868,18 +811,24 @@ function createSqlDriver(adapter) {
868
811
  async upsert(schema, model, args) {
869
812
  const manifest = getManifest(schema);
870
813
  const modelManifest = manifest.models[model];
871
- const conflict = extractUpsertConflict(modelManifest, args.where);
872
- validateUpsertUpdateData(
814
+ const lookup = (0, import_orm.requireUniqueLookup)(
815
+ modelManifest,
816
+ args.where,
817
+ "Upsert"
818
+ );
819
+ (0, import_orm.validateUniqueLookupUpdateData)(
873
820
  modelManifest,
874
821
  args.update,
875
- conflict
822
+ lookup,
823
+ "Upsert"
876
824
  );
877
825
  const row = buildInsertRow(
878
826
  modelManifest,
879
- mergeUpsertCreateData(
827
+ (0, import_orm.mergeUniqueLookupCreateData)(
880
828
  modelManifest,
881
829
  args.create,
882
- conflict
830
+ lookup,
831
+ "Upsert"
883
832
  )
884
833
  );
885
834
  const statement = buildUpsertStatement(
@@ -887,7 +836,7 @@ function createSqlDriver(adapter) {
887
836
  adapter.dialect,
888
837
  row,
889
838
  args.update,
890
- conflict.field
839
+ lookup.fields
891
840
  );
892
841
  await adapter.query(statement.sql, statement.params);
893
842
  return loadOneRow(schema, model, {
@@ -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 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\" || dialect === \"postgres\" ? normalizeNaiveSqlDate(value) : value;\n }\n return new Date(String(value));\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: SqlWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n const field = identityField(model);\n const value = row[field.name];\n if (value === undefined) {\n throw new Error(\n `Model \"${model.name}\" could not resolve the identity field \"${field.name}\" from the current row.`,\n );\n }\n return {\n [field.name]: value,\n } as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictField: ManifestField,\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumn = quoteIdentifier(conflictField.column, dialect);\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${conflictColumn} = ${conflictColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumn}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumn}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n identityField(manifest.models[model]);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], row),\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const conflict = extractUpsertConflict(modelManifest, args.where as SqlWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n conflict.field,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,iBA0BO;AAoEP,IAAM,gBAAgB,oBAAI,QAAgC;AAE1D,SAAS,YAAY,QAA+B;AAClD,QAAM,SAAS,cAAc,IAAI,MAAM;AACvC,MAAI,OAAQ,QAAO;AACnB,QAAM,WAAO,2BAAe,MAAM;AAClC,gBAAc,IAAI,QAAQ,IAAI;AAC9B,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,SAAqB;AAC3D,MAAI,YAAY,SAAS;AACvB,WAAO,KAAK,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACvC;AAEA,SAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC;AAEA,SAAS,kBAAkB,SAAqB,OAAmB,OAAgB;AACjF,QAAM,OAAO,KAAK,KAAK;AACvB,SAAO,YAAY,aAAa,IAAI,MAAM,OAAO,MAAM,KAAK;AAC9D;AAEA,SAAS,eAAe,WAAoB;AAC1C,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,CAAC,OAAO,KAAK,IAAI,UAAU,MAAM,GAAG;AAC1C,MAAI,CAAC,SAAS,CAAC,MAAO,QAAO;AAC7B,SAAO,EAAE,OAAO,MAAM;AACxB;AAEA,SAAS,cAAc,OAAsB;AAC3C,MAAI,MAAM,OAAO,GAAI,QAAO,MAAM,OAAO;AACzC,QAAM,cAAc,OAAO,OAAO,MAAM,MAAM,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM;AAC5E,MAAI,YAAa,QAAO;AACxB,QAAM,IAAI;AAAA,IACR,UAAU,MAAM,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,aAAa,OAAgB,OAAsB;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,cAAc,KAAM,YAAO,+BAAW;AAChD,MAAI,MAAM,cAAc,MAAO,QAAO,oBAAI,KAAK;AAC/C,MAAI,OAAO,MAAM,iBAAiB,YAAY;AAC5C,WAAQ,MAAM,aAA+B;AAAA,EAC/C;AACA,SAAO,MAAM;AACf;AAEA,SAAS,YAAY,OAAsB,SAAqB,OAAgB;AAC9E,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAE3B,MAAI,MAAM,SAAS,WAAW;AAC5B,QAAI,YAAY,WAAY,QAAO,QAAQ,KAAK;AAChD,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,QAAI,iBAAiB,MAAM;AACzB,UAAI,YAAY,SAAS;AACvB,eAAO,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAAA,MAC1D;AACA,aAAO,MAAM,YAAY;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAa;AAC1C,SAAO,IAAI;AAAA,IACT,KAAK;AAAA,MACH,MAAM,YAAY;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,MAAM,SAAS;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,MAAM,WAAW;AAAA,MACjB,MAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAe;AACzC,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,cAAc,gCAAgC,KAAK,OAAO;AAChE,QAAM,eAAe,sDAAsD,KAAK,OAAO;AAEvF,MAAI,gBAAgB,CAAC,aAAa;AAChC,WAAO,oBAAI,KAAK,QAAQ,QAAQ,KAAK,GAAG,IAAI,GAAG;AAAA,EACjD;AAEA,SAAO,IAAI,KAAK,OAAO;AACzB;AAEA,SAAS,YAAY,OAAsB,SAAqB,OAAgB;AAC9E,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAE3B,MAAI,MAAM,SAAS,WAAW;AAC5B,QAAI,OAAO,UAAU,UAAW,QAAO;AACvC,QAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,UAAU,OAAO,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,QAAI,iBAAiB,MAAM;AACzB,aAAO,YAAY,UAAU,sBAAsB,KAAK,IAAI;AAAA,IAC9D;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,mBAAmB,KAAK;AAAA,IACjC;AACA,WAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAsB,SAAqB,KAAa;AACzE,QAAM,SAAiB,CAAC;AAExB,aAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,WAAO,MAAM,IAAI,IAAI,YAAY,OAAO,SAAS,IAAI,MAAM,IAAI,CAAC;AAAA,EAClE;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAsC;AAC3D,QAAM,UAAU,QAAQ,OAAO,OAAO;AACtC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,SAAO;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEA,SAAS,eAAe,OAAkD;AACxE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,iBAAiB,SAAS,CAAC,MAAM,QAAQ,KAAK;AACjG;AAEA,SAAS,mBACP,OACA,WACA,QACA,SACA,OACA;AACA,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,EAC1E;AAEA,QAAM,SAAS,GAAG,gBAAgB,MAAM,OAAO,OAAO,CAAC,IAAI,gBAAgB,MAAM,QAAQ,OAAO,CAAC;AAEjG,MAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,QAAI,WAAW,KAAM,QAAO,GAAG,MAAM;AACrC,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,MAAM,CAAC;AACzF,WAAO,GAAG,MAAM,MAAM,WAAW;AAAA,EACnC;AAEA,QAAM,UAAoB,CAAC;AAE3B,MAAI,QAAQ,QAAQ;AAClB,QAAI,OAAO,OAAO,MAAM;AACtB,cAAQ,KAAK,GAAG,MAAM,UAAU;AAAA,IAClC,OAAO;AACL,YAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,OAAO,EAAE,CAAC;AAC5F,cAAQ,KAAK,GAAG,MAAM,MAAM,WAAW,EAAE;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,QAAI,OAAO,QAAQ,MAAM;AACvB,cAAQ,KAAK,GAAG,MAAM,cAAc;AAAA,IACtC,OAAO;AACL,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,YAAY,OAAO,SAAS,OAAO,GAAG;AAAA,MACxC;AACA,cAAQ,KAAK,GAAG,MAAM,OAAO,WAAW,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,SAAS,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC;AACvD,QAAI,CAAC,OAAO,QAAQ;AAClB,cAAQ,KAAK,OAAO;AAAA,IACtB,OAAO;AACL,YAAM,eAAe,OAAO;AAAA,QAAI,CAAC,UAC/B,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,KAAK,CAAC;AAAA,MACtE;AACA,cAAQ,KAAK,GAAG,MAAM,QAAQ,aAAa,KAAK,IAAI,CAAC,GAAG;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,cAAc,QAAQ;AACxB,UAAM,cAAc,kBAAkB,SAAS,OAAO,OAAO,OAAO,YAAY,EAAE,CAAC;AACnF,YAAQ;AAAA,MACN,YAAY,aACR,UAAU,MAAM,KAAK,WAAW,UAChC,SAAS,MAAM,KAAK,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,OAAO,EAAE,CAAC;AAC5F,YAAQ,KAAK,GAAG,MAAM,MAAM,WAAW,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,OAAO,GAAG,CAAC;AAC7F,YAAQ,KAAK,GAAG,MAAM,OAAO,WAAW,EAAE;AAAA,EAC5C;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,OAAO,EAAE,CAAC;AAC5F,YAAQ,KAAK,GAAG,MAAM,MAAM,WAAW,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,OAAO,GAAG,CAAC;AAC7F,YAAQ,KAAK,GAAG,MAAM,OAAO,WAAW,EAAE;AAAA,EAC5C;AAEA,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,SAAO,IAAI,QAAQ,KAAK,OAAO,CAAC;AAClC;AAEA,SAAS,aACP,OACA,OACA,SACA,OACoB;AACpB,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAoB,CAAC;AAE3B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC9C,UAAI,CAAC,MAAM,OAAQ;AACnB,YAAM,SAAS,MACZ,IAAI,CAAC,SAAS,aAAa,OAAO,MAAkB,SAAS,KAAK,CAAC,EACnE,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AAC5B,UAAI,OAAO,OAAQ,SAAQ,KAAK,OAAO,KAAK,OAAO,CAAC;AACpD;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC9C,UAAI,CAAC,MAAM,OAAQ;AACnB,YAAM,SAAS,MACZ,IAAI,CAAC,SAAS,aAAa,OAAO,MAAkB,SAAS,KAAK,CAAC,EACnE,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AAC5B,UAAI,OAAO,OAAQ,SAAQ,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC,GAAG;AAC1D;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AACjB,YAAM,SAAS,aAAa,OAAO,OAAmB,SAAS,KAAK;AACpE,UAAI,OAAQ,SAAQ,KAAK,QAAQ,MAAM,GAAG;AAC1C;AAAA,IACF;AAEA,YAAQ,KAAK,mBAAmB,OAAO,KAAK,OAAO,SAAS,KAAK,CAAC;AAAA,EACpE;AAEA,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,SAAO,QAAQ,KAAK,OAAO;AAC7B;AAEA,SAAS,eACP,OACA,SACA,SACA;AACA,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,OAAO,QAAQ,OAAO,EACjC,OAAO,CAAC,CAAC,SAAS,MAAM,aAAa,MAAM,MAAM,EACjD,IAAI,CAAC,CAAC,WAAW,SAAS,MAAM;AAC/B,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,WAAO,GAAG,gBAAgB,MAAM,OAAO,OAAO,CAAC,IAAI,gBAAgB,MAAM,QAAQ,OAAO,CAAC,IACvF,cAAc,SAAS,SAAS,KAClC;AAAA,EACF,CAAC;AAEH,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,SAAO,aAAa,MAAM,KAAK,IAAI,CAAC;AACtC;AAEA,SAAS,kBACP,SACA,MACA,MACA;AACA,MAAI,SAAS,UAAa,SAAS,OAAW,QAAO;AAErD,MAAI,SAAS,UAAa,SAAS,QAAW;AAC5C,WAAO,UAAU,IAAI,WAAW,IAAI;AAAA,EACtC;AAEA,MAAI,SAAS,QAAW;AACtB,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,MAAI,YAAY,YAAY;AAC1B,WAAO,WAAW,QAAQ,CAAC;AAAA,EAC7B;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO,sCAAsC,QAAQ,CAAC;AAAA,EACxD;AAEA,SAAO,oBAAoB,QAAQ,CAAC;AACtC;AAEA,SAAS,qBACP,OACA,SACA,MAMA;AACA,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,QAAM,aAAa,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,IAC7C,CAAC,UACC,GAAG,gBAAgB,MAAM,OAAO,OAAO,CAAC,IAAI,gBAAgB,MAAM,QAAQ,OAAO,CAAC,OAAO,gBAAgB,MAAM,MAAM,OAAO,CAAC;AAAA,EACjI;AAEA,MAAI,MAAM,UAAU,WAAW,KAAK,IAAI,CAAC,SAAS,gBAAgB,MAAM,OAAO,OAAO,CAAC;AACvF,QAAM,QAAQ,aAAa,OAAO,KAAK,OAAO,SAAS,KAAK;AAC5D,MAAI,MAAO,QAAO,UAAU,KAAK;AACjC,SAAO,eAAe,OAAO,KAAK,SAAS,OAAO;AAClD,SAAO,kBAAkB,SAAS,KAAK,MAAM,KAAK,IAAI;AAEtD,SAAO,EAAE,KAAK,QAAQ,MAAM,OAAO;AACrC;AAEA,SAAS,oBACP,OACA,SACA,OACA;AACA,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,MAAI,MAAM,sBAAsB,gBAAgB,SAAS,OAAO,CAAC,SAAS,gBAAgB,MAAM,OAAO,OAAO,CAAC;AAC/G,QAAM,gBAAgB,aAAa,OAAO,OAAO,SAAS,KAAK;AAC/D,MAAI,cAAe,QAAO,UAAU,aAAa;AACjD,SAAO,EAAE,KAAK,QAAQ,MAAM,OAAO;AACrC;AAEA,SAAS,eAAe,OAAsB,MAAwC;AACpF,QAAM,MAAc,CAAC;AAErB,aAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,QAAI,MAAM,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,GAAG,KAAK;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAsB,KAAa;AAC7D,aAAO,oCAAoB,qCAAyB,OAAO,GAAG,CAAC;AACjE;AAEA,SAAS,qBAAqB,OAAsB,SAAqB,KAAa;AACpF,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,QAAM,SAAS,OAAO,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,MAAM,IAAI,MAAM,MAAS;AAC1F,QAAM,UAAU,OAAO,IAAI,CAAC,UAAU,gBAAgB,MAAM,QAAQ,OAAO,CAAC;AAC5E,QAAM,SAAS,OAAO;AAAA,IAAI,CAAC,UACzB,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,EAChF;AAEA,SAAO;AAAA,IACL,KAAK,eAAe,gBAAgB,MAAM,OAAO,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,CAAC,aAAa,OAAO,KAAK,IAAI,CAAC;AAAA,IAC9G,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,qBACP,OACA,SACA,KACA,YACA,gBACA;AACA,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,QAAM,eAAe,OAAO,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,MAAM,IAAI,MAAM,MAAS;AAChG,QAAM,UAAU,aAAa,IAAI,CAAC,UAAU,gBAAgB,MAAM,QAAQ,OAAO,CAAC;AAClF,QAAM,SAAS,aAAa;AAAA,IAAI,CAAC,UAC/B,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,EAChF;AACA,QAAM,gBAAgB,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAC1F,QAAM,kBAAkB,eAAe,IAAI,CAAC,UAAU,gBAAgB,MAAM,QAAQ,OAAO,CAAC;AAE5F,MAAI,MAAM,eAAe,gBAAgB,MAAM,OAAO,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,CAAC,aAAa,OAAO,KAAK,IAAI,CAAC;AAEnH,MAAI,YAAY,SAAS;AACvB,UAAM,aAAa,gBAAgB,CAAC;AACpC,UAAMA,gBAAe,cAAc,SAC/B,cAAc,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM;AACxC,YAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,MAC1E;AACA,YAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,KAAK,CAAC;AACxF,aAAO,GAAG,gBAAgB,MAAM,QAAQ,OAAO,CAAC,MAAM,WAAW;AAAA,IACnE,CAAC,IACD,CAAC,GAAG,UAAU,MAAM,UAAU,EAAE;AAEpC,WAAO,4BAA4BA,cAAa,KAAK,IAAI,CAAC;AAE1D,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,QAAQ;AACzB,WAAO,iBAAiB,gBAAgB,KAAK,IAAI,CAAC;AAClD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM;AAC7D,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,IAC1E;AACA,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,KAAK,CAAC;AACxF,WAAO,GAAG,gBAAgB,MAAM,QAAQ,OAAO,CAAC,MAAM,WAAW;AAAA,EACnE,CAAC;AAED,SAAO,iBAAiB,gBAAgB,KAAK,IAAI,CAAC,mBAAmB,aAAa,KAAK,IAAI,CAAC;AAE5F,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,qBACP,OACA,SACA,MACA,OACA;AACA,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,QAAM,UAAU,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAE9E,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM;AACpD,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,IAC1E;AACA,UAAM,cAAc,kBAAkB,SAAS,OAAO,YAAY,OAAO,SAAS,KAAK,CAAC;AACxF,WAAO,GAAG,gBAAgB,MAAM,QAAQ,OAAO,CAAC,MAAM,WAAW;AAAA,EACnE,CAAC;AAED,QAAM,gBAAgB,aAAa,OAAO,OAAO,SAAS,KAAK;AAC/D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,oBAAoB,MAAM,IAAI,4BAA4B;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,KAAK,UAAU,gBAAgB,MAAM,OAAO,OAAO,CAAC,QAAQ,UAAU,KAAK,IAAI,CAAC,UAAU,aAAa;AAAA,IACvG,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,qBAAqB,OAAsB,SAAqB,OAAiB;AACxF,QAAM,QAAoB,EAAE,QAAQ,CAAC,EAAE;AACvC,QAAM,gBAAgB,aAAa,OAAO,OAAO,SAAS,KAAK;AAC/D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,oBAAoB,MAAM,IAAI,4BAA4B;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,KAAK,eAAe,gBAAgB,MAAM,OAAO,OAAO,CAAC,UAAU,aAAa;AAAA,IAChF,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,oBAAoB,UAA8C;AACzE,MAAI,mBAAmB;AAEvB,QAAM,UAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,YAAY,SAAS,QAAQ,GAAG;AACtC,UAAI,uBAAuB,KAAK,GAAG,GAAG;AACpC,cAAM,OAAO,UAAU,IAAI,GAAG,MAAM;AACpC,eAAO;AAAA,UACL;AAAA,UACA,cAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,SAAS,UAAU,IAAI,GAAG,MAAM;AACtC,aAAO;AAAA,QACL,MAAM,CAAC;AAAA,QACP,cAAc,OAAO,QAAQ,WAAW,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AACrB,YAAM,YAAY,gBAAgB,mBAAmB,CAAC;AAEtD,UAAI,qBAAqB,GAAG;AAC1B,iBAAS,KAAK,OAAO;AAAA,MACvB,OAAO;AACL,iBAAS,KAAK,aAAa,SAAS,EAAE;AAAA,MACxC;AAEA,0BAAoB;AAEpB,UAAI;AACF,cAAM,SAAS,MAAM,IAAI,OAAO;AAChC,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,mBAAS,KAAK,QAAQ;AAAA,QACxB,OAAO;AACL,mBAAS,KAAK,qBAAqB,SAAS,EAAE;AAAA,QAChD;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,mBAAS,KAAK,UAAU;AAAA,QAC1B,OAAO;AACL,mBAAS,KAAK,yBAAyB,SAAS,EAAE;AAClD,mBAAS,KAAK,qBAAqB,SAAS,EAAE;AAAA,QAChD;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,6BAA6B,QAAsC;AAC1E,MAAI,mBAAmB;AAEvB,QAAM,UAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,SAAS,MAAM,OAAO,MAAM,KAAK,MAAM;AAC7C,aAAO;AAAA,QACL,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,cAAc,OAAO,OAAO,YAAY,OAAO,MAAM,UAAU,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AACrB,YAAM,YAAY,gBAAgB,mBAAmB,CAAC;AAEtD,UAAI,qBAAqB,GAAG;AAC1B,cAAM,OAAO,MAAM,OAAO;AAAA,MAC5B,OAAO;AACL,cAAM,OAAO,MAAM,aAAa,SAAS,EAAE;AAAA,MAC7C;AAEA,0BAAoB;AAEpB,UAAI;AACF,cAAM,SAAS,MAAM,IAAI,OAAO;AAChC,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,gBAAM,OAAO,MAAM,QAAQ;AAAA,QAC7B,OAAO;AACL,gBAAM,OAAO,MAAM,qBAAqB,SAAS,EAAE;AAAA,QACrD;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,gBAAM,OAAO,MAAM,UAAU;AAAA,QAC/B,OAAO;AACL,gBAAM,OAAO,MAAM,yBAAyB,SAAS,EAAE;AACvD,gBAAM,OAAO,MAAM,qBAAqB,SAAS,EAAE;AAAA,QACrD;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAkC;AAC7D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,SAAS,MAAM,KAAK,MAAM,KAAK,MAAM;AAC3C,aAAO;AAAA,QACL,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,cAAc,OAAO,OAAO,YAAY,OAAO,MAAM,UAAU,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AACrB,YAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,UAAI;AACF,eAAO,MAAM,6BAA6B,MAAM,EAAE,YAAY,GAAG;AAAA,MACnE,UAAE;AACA,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gCAAgC,YAAiD;AACxF,MAAI,mBAAmB;AAEvB,QAAM,UAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,CAAC,MAAM,IAAI,MAAM,WAAW,QAAQ,KAAK,MAAM;AACrD,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,OAAO;AAAA,QACvB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM,CAAC;AAAA,QACP,cAAc,OAAQ,OAA8B,gBAAgB,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AACrB,YAAM,YAAY,gBAAgB,mBAAmB,CAAC;AAEtD,UAAI,qBAAqB,GAAG;AAC1B,cAAM,WAAW,iBAAiB;AAAA,MACpC,OAAO;AACL,cAAM,WAAW,QAAQ,aAAa,SAAS,EAAE;AAAA,MACnD;AAEA,0BAAoB;AAEpB,UAAI;AACF,cAAM,SAAS,MAAM,IAAI,OAAO;AAChC,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,gBAAM,WAAW,OAAO;AAAA,QAC1B,OAAO;AACL,gBAAM,WAAW,QAAQ,qBAAqB,SAAS,EAAE;AAAA,QAC3D;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,4BAAoB;AAEpB,YAAI,qBAAqB,GAAG;AAC1B,gBAAM,WAAW,SAAS;AAAA,QAC5B,OAAO;AACL,gBAAM,WAAW,QAAQ,yBAAyB,SAAS,EAAE;AAC7D,gBAAM,WAAW,QAAQ,qBAAqB,SAAS,EAAE;AAAA,QAC3D;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAqC;AACnE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,KAAK,MAAM;AAC/C,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,OAAO;AAAA,QACvB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM,CAAC;AAAA,QACP,cAAc,OAAQ,OAA8B,gBAAgB,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AACrB,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,UAAI;AACF,eAAO,MAAM,gCAAgC,UAAU,EAAE,YAAY,GAAG;AAAA,MAC1E,UAAE;AACA,mBAAW,UAAU;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBACP,SACoB;AACpB,iBAAe,SAIb,QACA,WACA,MAO8D;AAC9D,UAAM,WAAW,YAAY,MAAM;AACnC,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,YAAY,qBAAqB,OAAO,QAAQ,SAAS,IAAI;AACnE,UAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAClE,UAAM,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,UAAU,OAAO,QAAQ,SAAS,GAAG,CAAC;AAE5E,WAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,QAAQ,WAAW,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,EACvF;AAEA,iBAAe,WAIb,QACA,WACA,MAKA;AACA,UAAM,OAAO,MAAM,SAAS,QAAQ,WAAW;AAAA,MAC7C,GAAG;AAAA,MACH,MAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAEA,iBAAe,cACb,QACA,WACA,MAIA;AACA,UAAM,WAAW,YAAY,MAAM;AACnC,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,YAAY,qBAAqB,OAAO,QAAQ,SAAS;AAAA,MAC7D,GAAG;AAAA,MACH,MAAM;AAAA,IACR,CAAC;AACD,UAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAClE,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,WAAO,MAAM,UAAU,OAAO,QAAQ,SAAS,GAAG,IAAI;AAAA,EACxD;AAEA,iBAAe,WAIb,QACA,WACA,KACA,QACuD;AACvD,UAAM,WAAW,YAAY,MAAM;AACnC,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,SAAiB,CAAC;AAExB,QAAI,CAAC,QAAQ;AACX,iBAAW,aAAa,OAAO,KAAK,MAAM,MAAM,GAAG;AACjD,eAAO,SAAS,IAAI,IAAI,SAAS;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,OAAW;AAEzB,UAAI,OAAO,MAAM,UAAU,UAAU,MAAM;AACzC,eAAO,GAAG,IAAI,IAAI,GAAG;AACrB;AAAA,MACF;AAEA,UAAI,OAAO,OAAO,OAAO,SAAS,EAAE,WAAW;AAC7C,eAAO,GAAG,IAAI,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,gBAIb,QACA,WACA,cACA,KACA,OACA;AACA,UAAM,WAAW,YAAY,MAAM;AACnC,UAAM,WAAW,OAAO,OAAO,SAAS,EAAE,UAAU,YAAY;AAChE,UAAM,eAAe,UAAU,OAAO,CAAC,IAAI;AAE3C,QAAI,SAAS,SAAS,aAAa;AACjC,YAAM,eAAe,SAAS,OAAO,SAAS,EAAE,OAAO,SAAS,UAAU;AAC1E,YAAM,kBAAkB,eAAe,cAAc,UAAU;AAC/D,YAAMC,eACJ,iBAAiB,SAAS,cAAc,SAAS,OAAO,SAAS,MAAM,CAAC,EAAE;AAC5E,YAAM,eAAe,IAAI,SAAS,UAAU;AAE5C,UAAI,gBAAgB,KAAM,QAAO;AAEjC,aAAO,WAAW,QAAQ,SAAS,QAA8B;AAAA,QAC/D,OAAO;AAAA,UACL,aAAa;AAAA,UACb;AAAA,YACE,CAACA,YAAW,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,cAAc,SAAS,OAAO,SAAS,MAAM;AACnD,YAAM,eAAe,YAAY,OAAO,SAAS,UAAU;AAC3D,YAAM,kBAAkB,eAAe,cAAc,UAAU;AAC/D,YAAMC,eAAc,iBAAiB,SAAS,cAAc,SAAS,OAAO,SAAS,CAAC,EAAE;AACxF,YAAMC,eAAc,IAAID,YAAW;AAEnC,UAAIC,gBAAe,KAAM,QAAO;AAEhC,aAAO,WAAW,QAAQ,SAAS,QAA8B;AAAA,QAC/D,OAAO;AAAA,UACL,aAAa;AAAA,UACb;AAAA,YACE,CAAC,SAAS,UAAU,GAAGA;AAAA,UACzB;AAAA,QACF;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,SAAS,WAAW;AAC/B,YAAM,cAAc,SAAS,OAAO,SAAS,MAAM;AACnD,YAAM,eAAe,YAAY,OAAO,SAAS,UAAU;AAC3D,YAAM,kBAAkB,eAAe,cAAc,UAAU;AAC/D,YAAMD,eAAc,iBAAiB,SAAS,cAAc,SAAS,OAAO,SAAS,CAAC,EAAE;AACxF,YAAMC,eAAc,IAAID,YAAW;AAEnC,UAAIC,gBAAe,KAAM,QAAO,CAAC;AAEjC,aAAO,SAAS,QAAQ,SAAS,QAA8B;AAAA,QAC7D,OAAO;AAAA,UACL,aAAa;AAAA,UACb;AAAA,YACE,CAAC,SAAS,UAAU,GAAGA;AAAA,UACzB;AAAA,QACF;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,SAAS,OAAO,SAAS,OAAO;AACrD,UAAM,uBAAuB,eAAe,aAAa,OAAO,SAAS,IAAI,GAAG,UAAU;AAC1F,UAAM,qBAAqB,eAAe,aAAa,OAAO,SAAS,EAAE,GAAG,UAAU;AACtF,UAAM,cACJ,sBAAsB,SAAS,cAAc,SAAS,OAAO,SAAS,CAAC,EAAE;AAC3E,UAAM,cACJ,oBAAoB,SAAS,cAAc,SAAS,OAAO,SAAS,MAAM,CAAC,EAAE;AAC/E,UAAM,cAAc,IAAI,WAAW;AAEnC,QAAI,eAAe,KAAM,QAAO,CAAC;AAEjC,UAAM,cAAc,MAAM,SAAS,QAAQ,SAAS,SAA+B;AAAA,MACjF,OAAO;AAAA,QACL,CAAC,SAAS,IAAI,GAAG;AAAA,MACnB;AAAA,IACF,CAAC;AAED,UAAM,YAAY,YACf,IAAI,CAAC,SAAiB,KAAK,SAAS,EAAE,CAAC,EACvC,OAAO,CAAC,SAAS,QAAQ,IAAI;AAChC,QAAI,CAAC,UAAU,OAAQ,QAAO,CAAC;AAE/B,WAAO,SAAS,QAAQ,SAAS,QAA8B;AAAA,MAC7D,OAAO;AAAA,QACL,aAAa;AAAA,QACb;AAAA,UACE,CAAC,WAAW,GAAG;AAAA,YACb,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,aAAa;AAAA,MACtB,MAAM,aAAa;AAAA,MACnB,MAAM,aAAa;AAAA,MACnB,QAAQ,aAAa;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,QAAM,SAA6B;AAAA,IACjC,MAAM,SAAS,QAAQ,OAAO,MAAM;AAClC,aAAO,SAAS,QAAQ,OAAO,IAAI;AAAA,IACrC;AAAA,IACA,MAAM,UAAU,QAAQ,OAAO,MAAM;AACnC,aAAO,WAAW,QAAQ,OAAO,IAAI;AAAA,IACvC;AAAA,IACA,MAAM,WAAW,QAAQ,OAAO,MAAM;AACpC,YAAM,WAAW,YAAY,MAAM;AACnC;AAAA,QACE,SAAS,OAAO,KAAK;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,MACF;AACA,aAAO,WAAW,QAAQ,OAAO,IAAI;AAAA,IACvC;AAAA,IACA,MAAM,MAAM,QAAQ,OAAO,MAA+C;AACxE,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,YAAY;AAAA,QAChB,SAAS,OAAO,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AACA,YAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAClE,YAAM,WAAW,OAAO,KAAK,CAAC,GAAG;AACjC,UAAI,OAAO,aAAa,SAAU,QAAO;AACzC,aAAO,OAAO,SAAS,OAAO,YAAY,CAAC,GAAG,EAAE;AAAA,IAClD;AAAA,IACA,MAAM,OAAO,QAAQ,OAAO,MAAM;AAChC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,MAAM;AAAA,QACV,SAAS,OAAO,KAAK;AAAA,QACrB,KAAK;AAAA,MACP;AACA,YAAM,gBAAgB,mBAAmB,SAAS,OAAO,KAAK,GAAG,GAAG;AACpE,YAAM,YAAY,qBAAqB,SAAS,OAAO,KAAK,GAAG,QAAQ,SAAS,GAAG;AACnF,YAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AACnD,aAAO,WAAW,QAAQ,OAAO;AAAA,QAC/B,OAAO;AAAA,QACP,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,MAAM,WAAW,QAAQ,OAAO,MAAM;AACpC,YAAM,UAAqB,CAAC;AAC5B,iBAAW,SAAS,KAAK,MAAM;AAC7B,gBAAQ;AAAA,UACN,MAAM,OAAO,OAAO,QAAQ,OAAO;AAAA,YACjC,MAAM;AAAA,YACN,QAAQ,KAAK;AAAA,UACf,CAAiD;AAAA,QACnD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,QAAQ,OAAO,MAAM;AAChC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,UAAU,MAAM,cAAc,QAAQ,OAAO;AAAA,QACjD,OAAO,KAAK;AAAA,MACd,CAAC;AAED,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,SAAS;AAAA,QACb,SAAS,OAAO,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,mBAAmB,SAAS,OAAO,KAAK,GAAG,OAAO;AAAA,MACpD;AAEA,UAAI,QAAQ;AACV,cAAM,QAAQ,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,MAC/C;AAEA,aAAO,WAAW,QAAQ,OAAO;AAAA,QAC/B,OAAO,mBAAmB,SAAS,OAAO,KAAK,GAAG,OAAO;AAAA,QACzD,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,MAAM,WAAW,QAAQ,OAAO,MAAM;AACpC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,SAAS;AAAA,QACb,SAAS,OAAO,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAEA,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,SAAS,MAAM,QAAQ,MAAM,OAAO,KAAK,OAAO,MAAM;AAC5D,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,MAAM,OAAO,QAAQ,OAAO,MAAM;AAChC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,gBAAgB,SAAS,OAAO,KAAK;AAC3C,YAAM,aAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACF;AACA;AAAA,QACE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,YAAM,MAAM;AAAA,QACV;AAAA,YACA;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAEA,YAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAEnD,aAAO,WAAW,QAAQ,OAAO;AAAA,QAC/B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,MAAM,OAAO,QAAQ,OAAO,MAAM;AAChC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,UAAU,MAAM,cAAc,QAAQ,OAAO;AAAA,QACjD,OAAO,KAAK;AAAA,MACd,CAAC;AAED,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,YAAY;AAAA,QAChB,SAAS,OAAO,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,mBAAmB,SAAS,OAAO,KAAK,GAAG,OAAO;AAAA,MACpD;AACA,YAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAClE,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,MAAM,WAAW,QAAQ,OAAO,MAAM;AACpC,YAAM,WAAW,YAAY,MAAM;AACnC,YAAM,YAAY;AAAA,QAChB,SAAS,OAAO,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AACA,YAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAClE,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,MAAM,YAAY,SAAS,KAAK;AAC9B,aAAO,QAAQ,YAAY,OAAO,cAAc,IAAI,gBAAgB,SAAS,CAAC,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,UACA;AACA,SAAO,gBAAyB,oBAAoB,QAAQ,CAAC;AAC/D;AAEO,SAAS,2BACd,SACA;AACA,SAAO,gBAAyB,OAAO;AACzC;AAEO,SAAS,mBAA0D,MAAkB;AAC1F,SAAO,gBAAyB,oBAAoB,IAAI,CAAC;AAC3D;AAEO,SAAS,qBAA4D,QAAsB;AAChG,SAAO,gBAAyB,6BAA6B,MAAM,CAAC;AACtE;AAEO,SAAS,kBACd,kBACA;AACA,QAAM,UACJ,mBAAmB,mBACf,uBAAuB,gBAAgB,IACvC,gCAAgC,gBAAgB;AACtD,SAAO,gBAAyB,OAAO;AACzC;","names":["updateClause","targetField","sourceField","sourceValue"]}
package/dist/index.js CHANGED
@@ -1,7 +1,12 @@
1
1
  // src/index.ts
2
2
  import { randomUUID } from "crypto";
3
3
  import {
4
- createManifest
4
+ createManifest,
5
+ mergeUniqueLookupCreateData,
6
+ requireUniqueLookup,
7
+ resolveRowIdentityLookup,
8
+ toUniqueLookupWhere,
9
+ validateUniqueLookupUpdateData
5
10
  } from "@farming-labs/orm";
6
11
  var manifestCache = /* @__PURE__ */ new WeakMap();
7
12
  function getManifest(schema) {
@@ -75,6 +80,15 @@ function normalizeNaiveSqlDate(value) {
75
80
  )
76
81
  );
77
82
  }
83
+ function parseSqlDateString(value) {
84
+ const trimmed = value.trim();
85
+ const hasTimezone = /(?:z|[+-]\d{2}(?::?\d{2})?)$/i.test(trimmed);
86
+ const naiveSqlDate = /^\d{4}-\d{2}-\d{2}[ t]\d{2}:\d{2}:\d{2}(?:\.\d+)?$/i.test(trimmed);
87
+ if (naiveSqlDate && !hasTimezone) {
88
+ return /* @__PURE__ */ new Date(trimmed.replace(" ", "T") + "Z");
89
+ }
90
+ return new Date(trimmed);
91
+ }
78
92
  function decodeValue(field, dialect, value) {
79
93
  if (value === void 0) return value;
80
94
  if (value === null) return null;
@@ -87,7 +101,10 @@ function decodeValue(field, dialect, value) {
87
101
  }
88
102
  if (field.kind === "datetime") {
89
103
  if (value instanceof Date) {
90
- return dialect === "mysql" || dialect === "postgres" ? normalizeNaiveSqlDate(value) : value;
104
+ return dialect === "mysql" ? normalizeNaiveSqlDate(value) : value;
105
+ }
106
+ if (typeof value === "string") {
107
+ return parseSqlDateString(value);
91
108
  }
92
109
  return new Date(String(value));
93
110
  }
@@ -111,73 +128,6 @@ function mergeWhere(...clauses) {
111
128
  function isFilterObject(value) {
112
129
  return !!value && typeof value === "object" && !(value instanceof Date) && !Array.isArray(value);
113
130
  }
114
- function extractEqualityValue(filter) {
115
- if (!isFilterObject(filter)) {
116
- return {
117
- supported: true,
118
- value: filter
119
- };
120
- }
121
- const keys = Object.keys(filter);
122
- if (keys.length === 1 && "eq" in filter) {
123
- return {
124
- supported: true,
125
- value: filter.eq
126
- };
127
- }
128
- return {
129
- supported: false,
130
- value: void 0
131
- };
132
- }
133
- function extractUpsertConflict(model, where) {
134
- const keys = Object.keys(where).filter((key) => key !== "AND" && key !== "OR" && key !== "NOT");
135
- if ("AND" in where || "OR" in where || "NOT" in where || keys.length !== 1) {
136
- throw new Error(
137
- `Upsert on model "${model.name}" requires a single unique equality filter in "where".`
138
- );
139
- }
140
- const fieldName = keys[0];
141
- const field = model.fields[fieldName];
142
- if (!field) {
143
- throw new Error(`Unknown field "${fieldName}" on model "${model.name}".`);
144
- }
145
- if (!(field.kind === "id" || field.unique)) {
146
- throw new Error(
147
- `Upsert on model "${model.name}" requires the "where" field "${fieldName}" to be unique or an id field.`
148
- );
149
- }
150
- const { supported, value } = extractEqualityValue(where[fieldName]);
151
- if (!supported || value === void 0 || value === null) {
152
- throw new Error(
153
- `Upsert on model "${model.name}" requires the "where" field "${fieldName}" to use a single non-null equality value.`
154
- );
155
- }
156
- return {
157
- field,
158
- value
159
- };
160
- }
161
- function mergeUpsertCreateData(model, createData, conflict) {
162
- const currentValue = createData[conflict.field.name];
163
- if (currentValue !== void 0 && currentValue !== conflict.value) {
164
- throw new Error(
165
- `Upsert on model "${model.name}" requires create.${conflict.field.name} to match where.${conflict.field.name}.`
166
- );
167
- }
168
- return {
169
- ...createData,
170
- [conflict.field.name]: currentValue ?? conflict.value
171
- };
172
- }
173
- function validateUpsertUpdateData(model, updateData, conflict) {
174
- const nextValue = updateData[conflict.field.name];
175
- if (nextValue !== void 0 && nextValue !== conflict.value) {
176
- throw new Error(
177
- `Upsert on model "${model.name}" cannot change the conflict field "${conflict.field.name}".`
178
- );
179
- }
180
- }
181
131
  function compileFieldFilter(model, fieldName, filter, dialect, state) {
182
132
  const field = model.fields[fieldName];
183
133
  if (!field) {
@@ -327,16 +277,7 @@ function buildInsertRow(model, data) {
327
277
  return row;
328
278
  }
329
279
  function buildIdentityWhere(model, row) {
330
- const field = identityField(model);
331
- const value = row[field.name];
332
- if (value === void 0) {
333
- throw new Error(
334
- `Model "${model.name}" could not resolve the identity field "${field.name}" from the current row.`
335
- );
336
- }
337
- return {
338
- [field.name]: value
339
- };
280
+ return toUniqueLookupWhere(resolveRowIdentityLookup(model, row));
340
281
  }
341
282
  function buildInsertStatement(model, dialect, row) {
342
283
  const state = { params: [] };
@@ -350,7 +291,7 @@ function buildInsertStatement(model, dialect, row) {
350
291
  params: state.params
351
292
  };
352
293
  }
353
- function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
294
+ function buildUpsertStatement(model, dialect, row, updateData, conflictFields) {
354
295
  const state = { params: [] };
355
296
  const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== void 0);
356
297
  const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));
@@ -358,9 +299,10 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
358
299
  (field) => createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name]))
359
300
  );
360
301
  const updateEntries = Object.entries(updateData).filter(([, value]) => value !== void 0);
361
- const conflictColumn = quoteIdentifier(conflictField.column, dialect);
302
+ const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));
362
303
  let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(", ")}) values (${values.join(", ")})`;
363
304
  if (dialect === "mysql") {
305
+ const noopColumn = conflictColumns[0];
364
306
  const updateClause2 = updateEntries.length ? updateEntries.map(([fieldName, value]) => {
365
307
  const field = model.fields[fieldName];
366
308
  if (!field) {
@@ -368,7 +310,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
368
310
  }
369
311
  const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
370
312
  return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
371
- }) : [`${conflictColumn} = ${conflictColumn}`];
313
+ }) : [`${noopColumn} = ${noopColumn}`];
372
314
  sql += ` on duplicate key update ${updateClause2.join(", ")}`;
373
315
  return {
374
316
  sql,
@@ -376,7 +318,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
376
318
  };
377
319
  }
378
320
  if (!updateEntries.length) {
379
- sql += ` on conflict (${conflictColumn}) do nothing`;
321
+ sql += ` on conflict (${conflictColumns.join(", ")}) do nothing`;
380
322
  return {
381
323
  sql,
382
324
  params: state.params
@@ -390,7 +332,7 @@ function buildUpsertStatement(model, dialect, row, updateData, conflictField) {
390
332
  const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));
391
333
  return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;
392
334
  });
393
- sql += ` on conflict (${conflictColumn}) do update set ${updateClause.join(", ")}`;
335
+ sql += ` on conflict (${conflictColumns.join(", ")}) do update set ${updateClause.join(", ")}`;
394
336
  return {
395
337
  sql,
396
338
  params: state.params
@@ -767,6 +709,12 @@ function createSqlDriver(adapter) {
767
709
  return loadOneRow(schema, model, args);
768
710
  },
769
711
  async findUnique(schema, model, args) {
712
+ const manifest = getManifest(schema);
713
+ requireUniqueLookup(
714
+ manifest.models[model],
715
+ args.where,
716
+ "FindUnique"
717
+ );
770
718
  return loadOneRow(schema, model, args);
771
719
  },
772
720
  async count(schema, model, args) {
@@ -783,15 +731,15 @@ function createSqlDriver(adapter) {
783
731
  },
784
732
  async create(schema, model, args) {
785
733
  const manifest = getManifest(schema);
786
- identityField(manifest.models[model]);
787
734
  const row = buildInsertRow(
788
735
  manifest.models[model],
789
736
  args.data
790
737
  );
738
+ const identityWhere = buildIdentityWhere(manifest.models[model], row);
791
739
  const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);
792
740
  await adapter.query(statement.sql, statement.params);
793
741
  return loadOneRow(schema, model, {
794
- where: buildIdentityWhere(manifest.models[model], row),
742
+ where: identityWhere,
795
743
  select: args.select
796
744
  });
797
745
  },
@@ -842,18 +790,24 @@ function createSqlDriver(adapter) {
842
790
  async upsert(schema, model, args) {
843
791
  const manifest = getManifest(schema);
844
792
  const modelManifest = manifest.models[model];
845
- const conflict = extractUpsertConflict(modelManifest, args.where);
846
- validateUpsertUpdateData(
793
+ const lookup = requireUniqueLookup(
794
+ modelManifest,
795
+ args.where,
796
+ "Upsert"
797
+ );
798
+ validateUniqueLookupUpdateData(
847
799
  modelManifest,
848
800
  args.update,
849
- conflict
801
+ lookup,
802
+ "Upsert"
850
803
  );
851
804
  const row = buildInsertRow(
852
805
  modelManifest,
853
- mergeUpsertCreateData(
806
+ mergeUniqueLookupCreateData(
854
807
  modelManifest,
855
808
  args.create,
856
- conflict
809
+ lookup,
810
+ "Upsert"
857
811
  )
858
812
  );
859
813
  const statement = buildUpsertStatement(
@@ -861,7 +815,7 @@ function createSqlDriver(adapter) {
861
815
  adapter.dialect,
862
816
  row,
863
817
  args.update,
864
- conflict.field
818
+ lookup.fields
865
819
  );
866
820
  await adapter.query(statement.sql, statement.params);
867
821
  return loadOneRow(schema, model, {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction 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\" || dialect === \"postgres\" ? normalizeNaiveSqlDate(value) : value;\n }\n return new Date(String(value));\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: SqlWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n const field = identityField(model);\n const value = row[field.name];\n if (value === undefined) {\n throw new Error(\n `Model \"${model.name}\" could not resolve the identity field \"${field.name}\" from the current row.`,\n );\n }\n return {\n [field.name]: value,\n } as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictField: ManifestField,\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumn = quoteIdentifier(conflictField.column, dialect);\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${conflictColumn} = ${conflictColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumn}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumn}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n identityField(manifest.models[model]);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], row),\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const conflict = extractUpsertConflict(modelManifest, args.where as SqlWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n conflict.field,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n requireUniqueLookup,\n resolveRowIdentityLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n toUniqueLookupWhere,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype SqlDialect = \"sqlite\" | \"mysql\" | \"postgres\";\ntype SqlRow = Record<string, unknown>;\ntype SqlFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype SqlWhere = Where<SqlFilterRecord>;\n\ntype SqlQueryResult = {\n rows: SqlRow[];\n affectedRows: number;\n};\n\nexport type SqlAdapterLike = {\n dialect: SqlDialect;\n query(sql: string, params: unknown[]): Promise<SqlQueryResult>;\n transaction<TResult>(run: (adapter: SqlAdapterLike) => Promise<TResult>): Promise<TResult>;\n};\n\ntype PgQueryResultLike = {\n rows?: SqlRow[];\n rowCount?: number | null;\n};\n\nexport type PgClientLike = {\n query(sql: string, params?: unknown[]): Promise<PgQueryResultLike>;\n release?: () => void;\n};\n\nexport type PgPoolLike = PgClientLike & {\n connect(): Promise<PgClientLike>;\n};\n\ntype MysqlExecuteResult = {\n affectedRows?: number;\n};\n\nexport type MysqlConnectionLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n beginTransaction(): Promise<void>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n release?: () => void;\n};\n\nexport type MysqlPoolLike = {\n execute(sql: string, params?: unknown[]): Promise<[SqlRow[] | MysqlExecuteResult, unknown]>;\n getConnection(): Promise<MysqlConnectionLike>;\n};\n\ntype SqliteRunResult = {\n changes?: number | bigint;\n};\n\nexport type SqliteStatementLike = {\n all(...params: unknown[]): unknown[];\n run(...params: unknown[]): SqliteRunResult;\n};\n\nexport type SqliteDatabaseLike = {\n prepare(sql: string): SqliteStatementLike;\n exec(sql: string): void;\n};\n\ntype QueryState = {\n params: unknown[];\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction quoteIdentifier(value: string, dialect: SqlDialect) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createPlaceholder(dialect: SqlDialect, state: QueryState, value: unknown) {\n state.params.push(value);\n return dialect === \"postgres\" ? `$${state.params.length}` : \"?\";\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the SQL runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction encodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (dialect === \"postgres\") return Boolean(value);\n return value ? 1 : 0;\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n if (dialect === \"mysql\") {\n return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n }\n return value.toISOString();\n }\n return value;\n }\n\n return value;\n}\n\nfunction normalizeNaiveSqlDate(value: Date) {\n return new Date(\n Date.UTC(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n value.getHours(),\n value.getMinutes(),\n value.getSeconds(),\n value.getMilliseconds(),\n ),\n );\n}\n\nfunction parseSqlDateString(value: string) {\n const trimmed = value.trim();\n const hasTimezone = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const naiveSqlDate = /^\\d{4}-\\d{2}-\\d{2}[ t]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/i.test(trimmed);\n\n if (naiveSqlDate && !hasTimezone) {\n return new Date(trimmed.replace(\" \", \"T\") + \"Z\");\n }\n\n return new Date(trimmed);\n}\n\nfunction decodeValue(field: ManifestField, dialect: SqlDialect, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n if (field.kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"t\";\n }\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) {\n return dialect === \"mysql\" ? normalizeNaiveSqlDate(value) : value;\n }\n if (typeof value === \"string\") {\n return parseSqlDateString(value);\n }\n return new Date(String(value));\n }\n\n return value;\n}\n\nfunction decodeRow(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const output: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(field, dialect, row[field.name]);\n }\n\n return output;\n}\n\nfunction mergeWhere(...clauses: Array<SqlWhere | undefined>) {\n const defined = clauses.filter(Boolean) as SqlWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as SqlWhere;\n}\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nfunction compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n dialect: SqlDialect,\n state: QueryState,\n) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const column = `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)}`;\n\n if (!isFilterObject(filter)) {\n if (filter === null) return `${column} is null`;\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter));\n return `${column} = ${placeholder}`;\n }\n\n const clauses: string[] = [];\n\n if (\"eq\" in filter) {\n if (filter.eq === null) {\n clauses.push(`${column} is null`);\n } else {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.eq));\n clauses.push(`${column} = ${placeholder}`);\n }\n }\n\n if (\"not\" in filter) {\n if (filter.not === null) {\n clauses.push(`${column} is not null`);\n } else {\n const placeholder = createPlaceholder(\n dialect,\n state,\n encodeValue(field, dialect, filter.not),\n );\n clauses.push(`${column} <> ${placeholder}`);\n }\n }\n\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.length) {\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = values.map((value) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, value)),\n );\n clauses.push(`${column} in (${placeholders.join(\", \")})`);\n }\n }\n\n if (\"contains\" in filter) {\n const placeholder = createPlaceholder(dialect, state, String(filter.contains ?? \"\"));\n clauses.push(\n dialect === \"postgres\"\n ? `strpos(${column}, ${placeholder}) > 0`\n : `instr(${column}, ${placeholder}) > 0`,\n );\n }\n\n if (\"gt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gt));\n clauses.push(`${column} > ${placeholder}`);\n }\n\n if (\"gte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.gte));\n clauses.push(`${column} >= ${placeholder}`);\n }\n\n if (\"lt\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lt));\n clauses.push(`${column} < ${placeholder}`);\n }\n\n if (\"lte\" in filter) {\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, filter.lte));\n clauses.push(`${column} <= ${placeholder}`);\n }\n\n if (!clauses.length) return \"1 = 1\";\n if (clauses.length === 1) return clauses[0];\n return `(${clauses.join(\" and \")})`;\n}\n\nfunction compileWhere(\n model: ManifestModel,\n where: SqlWhere | undefined,\n dialect: SqlDialect,\n state: QueryState,\n): string | undefined {\n if (!where) return undefined;\n\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(nested.join(\" and \"));\n continue;\n }\n\n if (key === \"OR\") {\n const items = Array.isArray(value) ? value : [];\n if (!items.length) continue;\n const nested = items\n .map((item) => compileWhere(model, item as SqlWhere, dialect, state))\n .filter(Boolean)\n .map((item) => `(${item})`);\n if (nested.length) clauses.push(`(${nested.join(\" or \")})`);\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as SqlWhere, dialect, state);\n if (nested) clauses.push(`not (${nested})`);\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value, dialect, state));\n }\n\n if (!clauses.length) return undefined;\n return clauses.join(\" and \");\n}\n\nfunction compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n dialect: SqlDialect,\n) {\n if (!orderBy) return \"\";\n\n const parts = Object.entries(orderBy)\n .filter(([fieldName]) => fieldName in model.fields)\n .map(([fieldName, direction]) => {\n const field = model.fields[fieldName];\n return `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} ${\n direction === \"desc\" ? \"desc\" : \"asc\"\n }`;\n });\n\n if (!parts.length) return \"\";\n return ` order by ${parts.join(\", \")}`;\n}\n\nfunction compilePagination(\n dialect: SqlDialect,\n take: number | undefined,\n skip: number | undefined,\n) {\n if (take === undefined && skip === undefined) return \"\";\n\n if (take !== undefined && skip !== undefined) {\n return ` limit ${take} offset ${skip}`;\n }\n\n if (take !== undefined) {\n return ` limit ${take}`;\n }\n\n if (dialect === \"postgres\") {\n return ` offset ${skip ?? 0}`;\n }\n\n if (dialect === \"mysql\") {\n return ` limit 18446744073709551615 offset ${skip ?? 0}`;\n }\n\n return ` limit -1 offset ${skip ?? 0}`;\n}\n\nfunction buildSelectStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n) {\n const state: QueryState = { params: [] };\n const selectList = Object.values(model.fields).map(\n (field) =>\n `${quoteIdentifier(model.table, dialect)}.${quoteIdentifier(field.column, dialect)} as ${quoteIdentifier(field.name, dialect)}`,\n );\n\n let sql = `select ${selectList.join(\", \")} from ${quoteIdentifier(model.table, dialect)}`;\n const where = compileWhere(model, args.where, dialect, state);\n if (where) sql += ` where ${where}`;\n sql += compileOrderBy(model, args.orderBy, dialect);\n sql += compilePagination(dialect, args.take, args.skip);\n\n return { sql, params: state.params };\n}\n\nfunction buildCountStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n where: SqlWhere | undefined,\n) {\n const state: QueryState = { params: [] };\n let sql = `select count(*) as ${quoteIdentifier(\"count\", dialect)} from ${quoteIdentifier(model.table, dialect)}`;\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (compiledWhere) sql += ` where ${compiledWhere}`;\n return { sql, params: state.params };\n}\n\nfunction buildInsertRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const row: SqlRow = {};\n\n for (const field of Object.values(model.fields)) {\n row[field.name] = applyDefault(data[field.name], field);\n }\n\n return row;\n}\n\nfunction buildIdentityWhere(model: ManifestModel, row: SqlRow) {\n return toUniqueLookupWhere(resolveRowIdentityLookup(model, row)) as SqlWhere;\n}\n\nfunction buildInsertStatement(model: ManifestModel, dialect: SqlDialect, row: SqlRow) {\n const state: QueryState = { params: [] };\n const fields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = fields.map((field) => quoteIdentifier(field.column, dialect));\n const values = fields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n\n return {\n sql: `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`,\n params: state.params,\n };\n}\n\nfunction buildUpsertStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n row: SqlRow,\n updateData: Partial<Record<string, unknown>>,\n conflictFields: ManifestField[],\n) {\n const state: QueryState = { params: [] };\n const insertFields = Object.values(model.fields).filter((field) => row[field.name] !== undefined);\n const columns = insertFields.map((field) => quoteIdentifier(field.column, dialect));\n const values = insertFields.map((field) =>\n createPlaceholder(dialect, state, encodeValue(field, dialect, row[field.name])),\n );\n const updateEntries = Object.entries(updateData).filter(([, value]) => value !== undefined);\n const conflictColumns = conflictFields.map((field) => quoteIdentifier(field.column, dialect));\n\n let sql = `insert into ${quoteIdentifier(model.table, dialect)} (${columns.join(\", \")}) values (${values.join(\", \")})`;\n\n if (dialect === \"mysql\") {\n const noopColumn = conflictColumns[0]!;\n const updateClause = updateEntries.length\n ? updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n })\n : [`${noopColumn} = ${noopColumn}`];\n\n sql += ` on duplicate key update ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n }\n\n if (!updateEntries.length) {\n sql += ` on conflict (${conflictColumns.join(\", \")}) do nothing`;\n return {\n sql,\n params: state.params,\n };\n }\n\n const updateClause = updateEntries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n sql += ` on conflict (${conflictColumns.join(\", \")}) do update set ${updateClause.join(\", \")}`;\n\n return {\n sql,\n params: state.params,\n };\n}\n\nfunction buildUpdateStatement(\n model: ManifestModel,\n dialect: SqlDialect,\n data: Partial<Record<string, unknown>>,\n where: SqlWhere,\n) {\n const state: QueryState = { params: [] };\n const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n\n if (!entries.length) {\n return null;\n }\n\n const setClause = entries.map(([fieldName, value]) => {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const placeholder = createPlaceholder(dialect, state, encodeValue(field, dialect, value));\n return `${quoteIdentifier(field.column, dialect)} = ${placeholder}`;\n });\n\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Update on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `update ${quoteIdentifier(model.table, dialect)} set ${setClause.join(\", \")} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction buildDeleteStatement(model: ManifestModel, dialect: SqlDialect, where: SqlWhere) {\n const state: QueryState = { params: [] };\n const compiledWhere = compileWhere(model, where, dialect, state);\n if (!compiledWhere) {\n throw new Error(`Delete on model \"${model.name}\" requires a where clause.`);\n }\n\n return {\n sql: `delete from ${quoteIdentifier(model.table, dialect)} where ${compiledWhere}`,\n params: state.params,\n };\n}\n\nfunction createSqliteAdapter(database: SqliteDatabaseLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"sqlite\",\n async query(sql, params) {\n const statement = database.prepare(sql);\n if (/^\\s*(select|with)\\b/i.test(sql)) {\n const rows = statement.all(...params) as SqlRow[];\n return {\n rows,\n affectedRows: rows.length,\n };\n }\n\n const result = statement.run(...params) as SqliteRunResult;\n return {\n rows: [],\n affectedRows: Number(result?.changes ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n database.exec(\"begin\");\n } else {\n database.exec(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"commit\");\n } else {\n database.exec(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n database.exec(\"rollback\");\n } else {\n database.exec(`rollback to savepoint ${savepoint}`);\n database.exec(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgTransactionalAdapter(client: PgClientLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await client.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await client.query(\"begin\");\n } else {\n await client.query(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"commit\");\n } else {\n await client.query(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await client.query(\"rollback\");\n } else {\n await client.query(`rollback to savepoint ${savepoint}`);\n await client.query(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createPgPoolAdapter(pool: PgPoolLike): SqlAdapterLike {\n return {\n dialect: \"postgres\",\n async query(sql, params) {\n const result = await pool.query(sql, params);\n return {\n rows: result.rows ?? [],\n affectedRows: Number(result.rowCount ?? result.rows?.length ?? 0),\n };\n },\n async transaction(run) {\n const client = await pool.connect();\n try {\n return await createPgTransactionalAdapter(client).transaction(run);\n } finally {\n client.release?.();\n }\n },\n };\n}\n\nfunction createMysqlTransactionalAdapter(connection: MysqlConnectionLike): SqlAdapterLike {\n let transactionDepth = 0;\n\n const adapter: SqlAdapterLike = {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await connection.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const savepoint = `farming_labs_${transactionDepth + 1}`;\n\n if (transactionDepth === 0) {\n await connection.beginTransaction();\n } else {\n await connection.execute(`savepoint ${savepoint}`);\n }\n\n transactionDepth += 1;\n\n try {\n const result = await run(adapter);\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.commit();\n } else {\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n return result;\n } catch (error) {\n transactionDepth -= 1;\n\n if (transactionDepth === 0) {\n await connection.rollback();\n } else {\n await connection.execute(`rollback to savepoint ${savepoint}`);\n await connection.execute(`release savepoint ${savepoint}`);\n }\n\n throw error;\n }\n },\n };\n\n return adapter;\n}\n\nfunction createMysqlPoolAdapter(pool: MysqlPoolLike): SqlAdapterLike {\n return {\n dialect: \"mysql\",\n async query(sql, params) {\n const [result] = await pool.execute(sql, params);\n if (Array.isArray(result)) {\n return {\n rows: result as SqlRow[],\n affectedRows: result.length,\n };\n }\n\n return {\n rows: [],\n affectedRows: Number((result as MysqlExecuteResult).affectedRows ?? 0),\n };\n },\n async transaction(run) {\n const connection = await pool.getConnection();\n try {\n return await createMysqlTransactionalAdapter(connection).transaction(run);\n } finally {\n connection.release?.();\n }\n },\n };\n}\n\nfunction createSqlDriver<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n): OrmDriver<TSchema> {\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, args);\n const result = await adapter.query(statement.sql, statement.params);\n const rows = result.rows.map((row) => decodeRow(model, adapter.dialect, row));\n\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: SqlWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const statement = buildSelectStatement(model, adapter.dialect, {\n ...args,\n take: 1,\n });\n const result = await adapter.query(statement.sql, statement.params);\n const row = result.rows[0];\n return row ? decodeRow(model, adapter.dialect, row) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: SqlRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: SqlRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: SqlRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: foreignValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as SqlWhere,\n });\n\n const targetIds = throughRows\n .map((item: SqlRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as SqlWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as SqlWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const driver: OrmDriver<TSchema> = {\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const statement = buildCountStatement(\n manifest.models[model],\n adapter.dialect,\n args?.where as SqlWhere | undefined,\n );\n const result = await adapter.query(statement.sql, statement.params);\n const rawCount = result.rows[0]?.count;\n if (typeof rawCount === \"number\") return rawCount;\n return Number.parseInt(String(rawCount ?? 0), 10);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const row = buildInsertRow(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const identityWhere = buildIdentityWhere(manifest.models[model], row);\n const statement = buildInsertStatement(manifest.models[model], adapter.dialect, row);\n await adapter.query(statement.sql, statement.params);\n return loadOneRow(schema, model, {\n where: identityWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return null;\n\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n buildIdentityWhere(manifest.models[model], current),\n );\n\n if (update) {\n await adapter.query(update.sql, update.params);\n }\n\n return loadOneRow(schema, model, {\n where: buildIdentityWhere(manifest.models[model], current),\n select: args.select,\n }) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdateStatement(\n manifest.models[model],\n adapter.dialect,\n args.data as Partial<Record<string, unknown>>,\n args.where as SqlWhere,\n );\n\n if (!update) return 0;\n const result = await adapter.query(update.sql, update.params);\n return result.affectedRows;\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = buildInsertRow(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const statement = buildUpsertStatement(\n modelManifest,\n adapter.dialect,\n row,\n args.update as Partial<Record<string, unknown>>,\n lookup.fields,\n );\n\n await adapter.query(statement.sql, statement.params);\n\n return loadOneRow(schema, model, {\n where: args.where as SqlWhere,\n select: args.select,\n }) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const current = await loadRawOneRow(schema, model, {\n where: args.where as SqlWhere,\n });\n\n if (!current) return 0;\n\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n buildIdentityWhere(manifest.models[model], current),\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const statement = buildDeleteStatement(\n manifest.models[model],\n adapter.dialect,\n args.where as SqlWhere,\n );\n const result = await adapter.query(statement.sql, statement.params);\n return result.affectedRows;\n },\n async transaction(_schema, run) {\n return adapter.transaction(async (txAdapter) => run(createSqlDriver(txAdapter)));\n },\n };\n\n return driver;\n}\n\nexport function createSqliteDriver<TSchema extends SchemaDefinition<any>>(\n database: SqliteDatabaseLike,\n) {\n return createSqlDriver<TSchema>(createSqliteAdapter(database));\n}\n\nexport function createSqlDriverFromAdapter<TSchema extends SchemaDefinition<any>>(\n adapter: SqlAdapterLike,\n) {\n return createSqlDriver<TSchema>(adapter);\n}\n\nexport function createPgPoolDriver<TSchema extends SchemaDefinition<any>>(pool: PgPoolLike) {\n return createSqlDriver<TSchema>(createPgPoolAdapter(pool));\n}\n\nexport function createPgClientDriver<TSchema extends SchemaDefinition<any>>(client: PgClientLike) {\n return createSqlDriver<TSchema>(createPgTransactionalAdapter(client));\n}\n\nexport function createMysqlDriver<TSchema extends SchemaDefinition<any>>(\n poolOrConnection: MysqlPoolLike | MysqlConnectionLike,\n) {\n const adapter =\n \"getConnection\" in poolOrConnection\n ? createMysqlPoolAdapter(poolOrConnection)\n : createMysqlTransactionalAdapter(poolOrConnection);\n return createSqlDriver<TSchema>(adapter);\n}\n"],"mappings":"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","names":["updateClause","targetField","sourceField","sourceValue"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/orm-sql",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -19,7 +19,7 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@farming-labs/orm": "0.0.8"
22
+ "@farming-labs/orm": "0.0.10"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/pg": "^8.15.6",