@farming-labs/orm 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -98,6 +98,7 @@ function createOrm(options) {
98
98
  models[model2] = createModelClient(schema, driver, model2);
99
99
  }
100
100
  const orm = models;
101
+ orm.$driver = driver.handle;
101
102
  orm.transaction = (run) => driver.transaction(schema, async (txDriver) => {
102
103
  const tx = createOrm({
103
104
  schema,
@@ -1072,7 +1073,12 @@ function createMemoryDriver(seed) {
1072
1073
  )
1073
1074
  );
1074
1075
  }
1075
- const driver = {
1076
+ let driver;
1077
+ driver = {
1078
+ handle: {
1079
+ kind: "memory",
1080
+ client: state
1081
+ },
1076
1082
  async findMany(schema, model2, args) {
1077
1083
  const rows = applyQuery(getRows(model2), args);
1078
1084
  return Promise.all(rows.map((row) => projectRow(schema, model2, row, args.select)));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/fields.ts","../src/manifest.ts","../src/generators.ts","../src/memory.ts","../src/relations.ts","../src/schema.ts"],"sourcesContent":["export * from \"./client\";\nexport * from \"./fields\";\nexport * from \"./generators\";\nexport * from \"./manifest\";\nexport * from \"./memory\";\nexport * from \"./relations\";\nexport * from \"./schema\";\n","import type { SchemaDefinition } from \"./schema\";\nimport type {\n ModelName,\n RelationForName,\n RelationName,\n RelationTarget,\n ScalarRecord,\n} from \"./schema\";\n\ntype Direction = \"asc\" | \"desc\";\n\ntype JsonPrimitive = null | string | number | boolean;\ntype JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\ntype Comparable = string | number | Date;\n\ntype ValueFilter<T> = T extends string\n ? T | { eq?: T; contains?: string; in?: T[]; not?: T }\n : T extends Comparable\n ? T | { eq?: T; gt?: T; gte?: T; lt?: T; lte?: T; in?: T[]; not?: T }\n : T | { eq?: T; in?: T[]; not?: T };\n\nexport type Where<TRecord extends Record<string, unknown>> = {\n [K in keyof TRecord]?: ValueFilter<TRecord[K]>;\n} & {\n AND?: Array<Where<TRecord>>;\n OR?: Array<Where<TRecord>>;\n NOT?: Where<TRecord>;\n};\n\ntype RelationQuery<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: SelectShape<TSchema, TModelName>;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\ntype RelationSelectionValue<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n> = true | RelationQuery<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>;\n\nexport type SelectShape<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n [K in\n | (keyof ScalarRecord<TSchema, TModelName> & string)\n | RelationName<TSchema, TModelName>]?: K extends RelationName<TSchema, TModelName>\n ? true | RelationQuery<TSchema, any>\n : true;\n};\n\ntype IsManyRelation<TRelation> = TRelation extends { kind: \"hasMany\" | \"manyToMany\" }\n ? true\n : false;\n\ntype DefaultSelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = ScalarRecord<TSchema, TModelName>;\n\ntype SelectedScalars<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & keyof ScalarRecord<TSchema, TModelName> as TSelect[K] extends true\n ? K\n : never]: ScalarRecord<TSchema, TModelName>[K];\n};\n\ntype RelationResult<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n TValue extends RelationSelectionValue<TSchema, TModelName, TRelationName>,\n> = TValue extends true\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>>\n : DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>> | null\n : TValue extends RelationQuery<TSchema, infer Target>\n ? Target extends ModelName<TSchema>\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<\n SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n >\n >\n : SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n > | null\n : never\n : never;\n\ntype SelectedRelations<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & RelationName<TSchema, TModelName>]: RelationResult<\n TSchema,\n TModelName,\n K,\n Extract<TSelect[K], RelationSelectionValue<TSchema, TModelName, K>>\n >;\n};\n\nexport type SelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n> =\n TSelect extends SelectShape<TSchema, TModelName>\n ? SelectedScalars<TSchema, TModelName, TSelect> &\n SelectedRelations<TSchema, TModelName, TSelect>\n : DefaultSelectedRecord<TSchema, TModelName>;\n\nexport type FindManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\nexport type FindFirstArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindManyArgs<TSchema, TModelName, TSelect>;\n\nexport type FindOneArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindFirstArgs<TSchema, TModelName, TSelect>;\n\nexport type FindUniqueArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Array<Partial<ScalarRecord<TSchema, TModelName>>>;\n select?: TSelect;\n};\n\nexport type UpdateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type UpdateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type CountArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type UpsertArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n create: Partial<ScalarRecord<TSchema, TModelName>>;\n update: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport interface OrmDriver<TSchema extends SchemaDefinition<any>> {\n findMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findFirst<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args?: CountArgs<TSchema, TModelName>,\n ): Promise<number>;\n create<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: UpdateManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n upsert<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteArgs<TSchema, TModelName>,\n ): Promise<number>;\n deleteMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n transaction<TResult>(\n schema: TSchema,\n run: (driver: OrmDriver<TSchema>) => Promise<TResult>,\n ): Promise<TResult>;\n}\n\nexport type ModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findOne<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindOneArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findFirst<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count(args?: CountArgs<TSchema, TModelName>): Promise<number>;\n create<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany(args: UpdateManyArgs<TSchema, TModelName>): Promise<number>;\n upsert<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;\n deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;\n};\n\nexport type BatchTask<TSchema extends SchemaDefinition<any>, TResult> = (\n tx: OrmClient<TSchema>,\n) => Promise<TResult>;\n\nexport type OrmClient<TSchema extends SchemaDefinition<any>> = {\n [K in ModelName<TSchema>]: ModelClient<TSchema, K>;\n} & {\n transaction<TResult>(run: (tx: OrmClient<TSchema>) => Promise<TResult>): Promise<TResult>;\n batch<const TResult extends readonly unknown[]>(tasks: {\n [K in keyof TResult]: BatchTask<TSchema, TResult[K]>;\n }): Promise<TResult>;\n};\n\nfunction createModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n>(\n schema: TSchema,\n driver: OrmDriver<TSchema>,\n model: TModelName,\n): ModelClient<TSchema, TModelName> {\n return {\n findMany(args) {\n return driver.findMany(schema, model, (args ?? {}) as any) as any;\n },\n findOne(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findFirst(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findUnique(args) {\n return driver.findUnique(schema, model, args as any) as any;\n },\n count(args) {\n return driver.count(schema, model, args as any);\n },\n create(args) {\n return driver.create(schema, model, args as any) as any;\n },\n createMany(args) {\n return driver.createMany(schema, model, args as any) as any;\n },\n update(args) {\n return driver.update(schema, model, args as any) as any;\n },\n updateMany(args) {\n return driver.updateMany(schema, model, args as any);\n },\n upsert(args) {\n return driver.upsert(schema, model, args as any) as any;\n },\n delete(args) {\n return driver.delete(schema, model, args as any) as any;\n },\n deleteMany(args) {\n return driver.deleteMany(schema, model, args as any);\n },\n };\n}\n\nexport function createOrm<TSchema extends SchemaDefinition<any>>(options: {\n schema: TSchema;\n driver: OrmDriver<TSchema>;\n}): OrmClient<TSchema> {\n const { schema, driver } = options;\n const models: Record<string, unknown> = {};\n\n for (const model of Object.keys(schema.models)) {\n models[model] = createModelClient(schema, driver, model as ModelName<TSchema>);\n }\n\n const orm = models as OrmClient<TSchema>;\n orm.transaction = (run) =>\n driver.transaction(schema, async (txDriver) => {\n const tx = createOrm({\n schema,\n driver: txDriver,\n });\n return run(tx);\n });\n orm.batch = async (tasks) =>\n orm.transaction(async (tx) => {\n const results: unknown[] = [];\n for (const task of tasks) {\n results.push(await task(tx));\n }\n return results as any;\n });\n return orm;\n}\n","export type ScalarKind = \"id\" | \"string\" | \"boolean\" | \"datetime\" | \"integer\" | \"json\";\n\nexport type JsonValue =\n | null\n | string\n | number\n | boolean\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type FieldReference = `${string}.${string}`;\n\nexport type FieldConfig<\n Kind extends ScalarKind = ScalarKind,\n Nullable extends boolean = boolean,\n> = {\n kind: Kind;\n nullable: Nullable;\n unique: boolean;\n defaultValue?: unknown;\n generated?: \"id\" | \"now\";\n mappedName?: string;\n references?: FieldReference;\n description?: string;\n};\n\nexport type ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Kind extends \"datetime\"\n ? Date\n : Kind extends \"integer\"\n ? number\n : JsonValue;\n\nexport type AnyFieldBuilder = FieldBuilder<ScalarKind, boolean, ScalarValue<ScalarKind>>;\n\nconst cloneField = <\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder<Kind, Nullable, Value>(config);\n\nexport class FieldBuilder<\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n> {\n readonly _tag = \"field\";\n readonly __kind?: Kind;\n readonly __nullable?: Nullable;\n readonly __value?: Value;\n\n constructor(readonly config: FieldConfig<Kind, Nullable>) {}\n\n unique() {\n return cloneField({\n ...this.config,\n unique: true,\n });\n }\n\n nullable() {\n return cloneField<Kind, true, Value>({\n ...this.config,\n nullable: true,\n });\n }\n\n default(value: unknown) {\n return cloneField({\n ...this.config,\n defaultValue: value,\n });\n }\n\n defaultNow() {\n return cloneField({\n ...this.config,\n generated: \"now\",\n });\n }\n\n references(reference: FieldReference) {\n return cloneField({\n ...this.config,\n references: reference,\n });\n }\n\n map(name: string) {\n return cloneField({\n ...this.config,\n mappedName: name,\n });\n }\n\n describe(description: string) {\n return cloneField({\n ...this.config,\n description,\n });\n }\n}\n\nexport type FieldOutput<TField> = TField extends {\n __nullable?: infer Nullable;\n __value?: infer Value;\n}\n ? Nullable extends true\n ? Value | null\n : Value\n : never;\n\nexport function id() {\n return new FieldBuilder({\n kind: \"id\",\n nullable: false,\n unique: true,\n generated: \"id\",\n });\n}\n\nexport function string() {\n return new FieldBuilder({\n kind: \"string\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function boolean() {\n return new FieldBuilder({\n kind: \"boolean\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function datetime() {\n return new FieldBuilder({\n kind: \"datetime\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function integer() {\n return new FieldBuilder({\n kind: \"integer\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function json<TValue extends JsonValue = JsonValue>() {\n return new FieldBuilder<\"json\", false, TValue>({\n kind: \"json\",\n nullable: false,\n unique: false,\n });\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, ModelConstraints, SchemaDefinition } from \"./schema\";\n\nexport type ManifestField = {\n name: string;\n column: string;\n kind: ScalarKind;\n nullable: boolean;\n unique: boolean;\n generated?: \"id\" | \"now\";\n defaultValue?: unknown;\n references?: string;\n description?: string;\n};\n\nexport type ManifestConstraint = {\n name: string;\n fields: string[];\n columns: string[];\n unique: boolean;\n};\n\nexport type ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n constraints: {\n unique: ManifestConstraint[];\n indexes: ManifestConstraint[];\n };\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\n};\n\nexport type ManifestUniqueLookup = {\n kind: \"id\" | \"field\" | \"constraint\";\n fields: ManifestField[];\n values: Record<string, unknown>;\n constraint?: ManifestConstraint;\n};\n\nconst filterOperatorKeys = new Set([\"eq\", \"contains\", \"in\", \"not\", \"gt\", \"gte\", \"lt\", \"lte\"]);\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nexport function isOperatorFilterObject(value: unknown): value is Record<string, unknown> {\n if (!isFilterObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => filterOperatorKeys.has(key));\n}\n\nexport function equalValues(left: unknown, right: unknown) {\n return isDeepStrictEqual(left, right);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isOperatorFilterObject(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 requireEqualityValues(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n) {\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 === 0) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires a unique equality filter in \"where\".`,\n );\n }\n\n const values: Record<string, unknown> = {};\n\n for (const fieldName of keys) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n values[fieldName] = value;\n }\n\n return values;\n}\n\nfunction sameFieldSet(left: string[], right: string[]) {\n return left.length === right.length && left.every((fieldName) => right.includes(fieldName));\n}\n\nexport function requireUniqueLookup(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n): ManifestUniqueLookup {\n const values = requireEqualityValues(model, where, operation);\n const keys = Object.keys(values);\n\n if (keys.length === 1) {\n const field = model.fields[keys[0]!]!;\n if (field.kind === \"id\") {\n return {\n kind: \"id\",\n fields: [field],\n values,\n };\n }\n\n if (field.unique) {\n return {\n kind: \"field\",\n fields: [field],\n values,\n };\n }\n }\n\n const constraint = model.constraints.unique.find((candidate) =>\n sameFieldSet([...candidate.fields], keys),\n );\n\n if (!constraint) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" clause to match an id field, unique field, or declared unique constraint using equality values only.`,\n );\n }\n\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, values[fieldName]]),\n ),\n constraint,\n };\n}\n\nexport function resolveRowIdentityLookup(\n model: ManifestModel,\n row: Record<string, unknown>,\n): ManifestUniqueLookup {\n const idField = model.fields.id;\n if (idField && row[idField.name] !== undefined && row[idField.name] !== null) {\n return {\n kind: \"id\",\n fields: [idField],\n values: {\n [idField.name]: row[idField.name],\n },\n };\n }\n\n const uniqueField = Object.values(model.fields).find(\n (field) => field.unique && row[field.name] !== undefined && row[field.name] !== null,\n );\n if (uniqueField) {\n return {\n kind: \"field\",\n fields: [uniqueField],\n values: {\n [uniqueField.name]: row[uniqueField.name],\n },\n };\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n constraint.fields.every(\n (fieldName) => row[fieldName] !== undefined && row[fieldName] !== null,\n )\n ) {\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, row[fieldName]]),\n ),\n constraint,\n };\n }\n }\n\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field, unique field, or declared unique constraint with non-null values for identity lookups.`,\n );\n}\n\nexport function toUniqueLookupWhere(lookup: ManifestUniqueLookup) {\n return Object.fromEntries(lookup.fields.map((field) => [field.name, lookup.values[field.name]]));\n}\n\nexport function mergeUniqueLookupCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n const output = {\n ...createData,\n };\n\n for (const field of lookup.fields) {\n const currentValue = output[field.name];\n const expectedValue = lookup.values[field.name];\n if (currentValue !== undefined && !equalValues(currentValue, expectedValue)) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires create.${field.name} to match where.${field.name}.`,\n );\n }\n output[field.name] = currentValue ?? expectedValue;\n }\n\n return output;\n}\n\nexport function validateUniqueLookupUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n for (const field of lookup.fields) {\n const nextValue = updateData[field.name];\n if (nextValue !== undefined && !equalValues(nextValue, lookup.values[field.name])) {\n throw new Error(\n `${operation} on model \"${model.name}\" cannot change the conflict field \"${field.name}\".`,\n );\n }\n }\n}\n\nfunction createConstraintName(table: string, columns: string[], suffix: \"unique\" | \"idx\") {\n const base = [table, ...columns]\n .join(\"_\")\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return `${base}_${suffix}`;\n}\n\nfunction normalizeConstraints(\n modelName: string,\n table: string,\n fields: Record<string, ManifestField>,\n constraints: ModelConstraints<any>,\n) {\n const normalize = (entries: readonly (readonly string[])[] | undefined, unique: boolean) =>\n (entries ?? []).map((entry) => {\n if (!entry.length) {\n throw new Error(\n `Model \"${modelName}\" defines an empty ${unique ? \"unique\" : \"index\"} constraint.`,\n );\n }\n\n const columns = entry.map((fieldName) => {\n const field = fields[fieldName];\n if (!field) {\n throw new Error(\n `Model \"${modelName}\" defines a ${unique ? \"unique\" : \"index\"} constraint on unknown field \"${fieldName}\".`,\n );\n }\n return field.column;\n });\n\n return {\n name: createConstraintName(table, columns, unique ? \"unique\" : \"idx\"),\n fields: [...entry],\n columns,\n unique,\n } satisfies ManifestConstraint;\n });\n\n return {\n unique: normalize(constraints.unique, true),\n indexes: normalize(constraints.indexes, false),\n };\n}\n\nexport function createManifest<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema): SchemaManifest {\n const models = Object.fromEntries(\n (Object.entries(schema.models) as Array<[string, AnyModelDefinition]>).map(\n ([name, definition]) => {\n const fields = Object.fromEntries(\n (\n Object.entries(definition.fields) as Array<\n [string, AnyModelDefinition[\"fields\"][string]]\n >\n ).map(([fieldName, field]) => [\n fieldName,\n {\n name: fieldName,\n column: field.config.mappedName ?? fieldName,\n kind: field.config.kind,\n nullable: field.config.nullable,\n unique: field.config.unique,\n generated: field.config.generated,\n defaultValue: field.config.defaultValue,\n references: field.config.references,\n description: field.config.description,\n } satisfies ManifestField,\n ]),\n );\n\n return [\n name,\n {\n name,\n table: definition.table,\n description: definition.description,\n fields,\n relations: definition.relations,\n constraints: normalizeConstraints(\n name,\n definition.table,\n fields,\n definition.constraints,\n ),\n } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\n type ManifestConstraint,\n type ManifestField,\n type ManifestModel,\n type SchemaManifest,\n} from \"./manifest\";\nimport type { SchemaDefinition } from \"./schema\";\n\nexport type PrismaGenerationOptions = {\n provider?: \"postgresql\" | \"mysql\" | \"sqlite\";\n datasourceName?: string;\n generatorName?: string;\n};\n\nexport type DrizzleGenerationOptions = {\n dialect: \"pg\" | \"mysql\" | \"sqlite\";\n};\n\nexport type SqlGenerationOptions = {\n dialect: \"postgres\" | \"mysql\" | \"sqlite\";\n};\n\nconst capitalize = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);\nconst pluralize = (value: string) => (value.endsWith(\"s\") ? value : `${value}s`);\nconst camelize = (value: string) =>\n value\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[^a-zA-Z]+/, \"\")\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n\nfunction resolveReferenceTarget(\n manifest: SchemaManifest,\n model: ManifestModel,\n foreignKey: string,\n fallbackTarget: string,\n) {\n const reference = model.fields[foreignKey]?.references;\n if (!reference) {\n return {\n targetModel: fallbackTarget,\n targetField: \"id\",\n };\n }\n\n const [targetModel, targetField = \"id\"] = reference.split(\".\");\n return {\n targetModel,\n targetField,\n };\n}\n\nfunction hasExplicitInverseRelation(\n manifest: SchemaManifest,\n modelName: string,\n sourceModel: string,\n foreignKey: string,\n) {\n const model = manifest.models[modelName];\n if (!model) return false;\n\n return Object.values(model.relations).some((relation) => {\n if (relation.target !== sourceModel) return false;\n if (relation.kind === \"belongsTo\" || relation.kind === \"manyToMany\") return false;\n return relation.foreignKey === foreignKey;\n });\n}\n\nfunction prismaType(field: ManifestField) {\n switch (field.kind) {\n case \"id\":\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"integer\":\n return \"Int\";\n case \"json\":\n return \"Json\";\n }\n}\n\nfunction drizzleConstraintProperty(constraint: ManifestConstraint) {\n return camelize(constraint.name) || \"constraint\";\n}\n\nfunction constrainedFields(model: ManifestModel) {\n return new Set(\n [...model.constraints.unique, ...model.constraints.indexes].flatMap(\n (constraint) => constraint.fields,\n ),\n );\n}\n\nfunction drizzleImports(dialect: DrizzleGenerationOptions[\"dialect\"], manifest: SchemaManifest) {\n const models = Object.values(manifest.models) as ManifestModel[];\n const needsBoolean = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"boolean\"),\n );\n const needsDate = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"datetime\"),\n );\n const needsInteger = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"integer\"),\n );\n const needsJson = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"json\"),\n );\n const needsIndexes = models.some(\n (model) => model.constraints.indexes.length || model.constraints.unique.length,\n );\n\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"integer\" : null,\n needsDate ? \"timestamp\" : null,\n needsJson ? \"jsonb\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"int\" : null,\n needsDate ? \"datetime\" : null,\n needsJson ? \"json\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n return [\n \"sqliteTable\",\n \"text\",\n \"integer\",\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n}\n\nfunction drizzleColumn(\n field: ManifestField,\n dialect: DrizzleGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n const renderDefault = () => {\n if (field.defaultValue === undefined || field.kind === \"json\") return \"\";\n return `.default(${JSON.stringify(field.defaultValue)})`;\n };\n\n if (field.kind === \"id\") {\n if (dialect === \"mysql\") {\n return `varchar(\"${field.column}\", { length: 191 }).primaryKey()`;\n }\n return `text(\"${field.column}\").primaryKey()`;\n }\n\n if (field.kind === \"string\") {\n if (dialect === \"mysql\") {\n const base =\n field.unique || field.references || options.indexed\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"integer\") {\n if (dialect === \"mysql\") {\n return `int(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `integer(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"pg\") {\n return `jsonb(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"mysql\") {\n return `json(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `text(\"${field.column}\", { mode: \"json\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n\n if (dialect === \"mysql\") {\n return `datetime(\"${field.column}\", { mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"timestamp\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `timestamp(\"${field.column}\", { withTimezone: true, mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(\n field: ManifestField,\n dialect: SqlGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n if (field.kind === \"id\") {\n return dialect === \"mysql\" ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"string\") {\n return dialect === \"mysql\" && (field.unique || field.references || options.indexed)\n ? \"varchar(191)\"\n : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (field.kind === \"integer\") {\n return \"integer\";\n }\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") return \"jsonb\";\n if (dialect === \"mysql\") return \"json\";\n return \"text\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamptz\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\n}\n\nfunction sqlCreateIndexStatement(\n dialect: SqlGenerationOptions[\"dialect\"],\n table: string,\n constraint: ManifestConstraint,\n) {\n const indexName = sqlIdentifier(dialect, constraint.name);\n const tableName = sqlIdentifier(dialect, table);\n const columns = constraint.columns.map((column) => sqlIdentifier(dialect, column)).join(\", \");\n const createKeyword = constraint.unique ? \"create unique index\" : \"create index\";\n const ifNotExists = dialect === \"mysql\" ? \"\" : \" if not exists\";\n return `${createKeyword}${ifNotExists} ${indexName} on ${tableName}(${columns});`;\n}\n\nexport function renderPrismaSchema(\n schema: SchemaDefinition<any>,\n options: PrismaGenerationOptions = {},\n) {\n const manifest = createManifest(schema);\n const provider = options.provider ?? \"postgresql\";\n const generatorName = options.generatorName ?? \"client\";\n const datasourceName = options.datasourceName ?? \"db\";\n const reverseRelations = new Map<\n string,\n Array<{ sourceModel: string; foreignKey: string; many: boolean }>\n >();\n\n for (const model of Object.values(manifest.models) as ManifestModel[]) {\n for (const field of Object.values(model.fields)) {\n if (!field.references) continue;\n const [targetModel] = field.references.split(\".\");\n reverseRelations.set(targetModel, [\n ...(reverseRelations.get(targetModel) ?? []),\n {\n sourceModel: model.name,\n foreignKey: field.name,\n many: !field.unique,\n },\n ]);\n }\n }\n\n const blocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const lines: string[] = [];\n const modelName = capitalize(model.name);\n const relationFieldNames = new Set<string>();\n const handledForeignKeys = new Set<string>();\n\n for (const field of Object.values(model.fields)) {\n const fieldType = prismaType(field);\n const modifiers: string[] = [];\n if (field.kind === \"id\") modifiers.push(\"@id\");\n if (field.generated === \"id\") modifiers.push(\"@default(cuid())\");\n if (field.generated === \"now\") modifiers.push(\"@default(now())\");\n if (\n field.defaultValue !== undefined &&\n field.generated === undefined &&\n field.kind !== \"json\"\n ) {\n modifiers.push(\n typeof field.defaultValue === \"string\"\n ? `@default(\"${field.defaultValue}\")`\n : `@default(${String(field.defaultValue)})`,\n );\n }\n if (field.unique && field.kind !== \"id\") modifiers.push(\"@unique\");\n if (field.column !== field.name) modifiers.push(`@map(\"${field.column}\")`);\n\n lines.push(\n ` ${field.name} ${fieldType}${field.nullable ? \"?\" : \"\"}${modifiers.length ? ` ${modifiers.join(\" \")}` : \"\"}`,\n );\n }\n\n for (const [relationName, relation] of Object.entries(model.relations)) {\n if (relation.kind === \"manyToMany\") continue;\n\n relationFieldNames.add(relationName);\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n handledForeignKeys.add(relation.foreignKey);\n lines.push(\n ` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`,\n );\n continue;\n }\n\n if (relation.kind === \"hasOne\") {\n lines.push(` ${relationName} ${capitalize(relation.target)}?`);\n continue;\n }\n\n lines.push(` ${relationName} ${capitalize(relation.target)}[]`);\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.references || handledForeignKeys.has(field.name)) continue;\n const [targetModel, targetField] = field.references.split(\".\");\n if (relationFieldNames.has(targetModel)) continue;\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n if (\n hasExplicitInverseRelation(manifest, model.name, relation.sourceModel, relation.foreignKey)\n ) {\n continue;\n }\n\n const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;\n if (relationFieldNames.has(relationName)) continue;\n lines.push(\n relation.many\n ? ` ${relationName} ${capitalize(relation.sourceModel)}[]`\n : ` ${relationName} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const modelLines = [\n ...lines,\n ...model.constraints.unique.map(\n (constraint) => ` @@unique([${constraint.fields.join(\", \")}])`,\n ),\n ...model.constraints.indexes.map(\n (constraint) => ` @@index([${constraint.fields.join(\", \")}])`,\n ),\n ...(model.table !== modelName ? [` @@map(\"${model.table}\")`] : []),\n ];\n\n return `model ${modelName} {\\n${modelLines.join(\"\\n\")}\\n}`;\n });\n\n return (\n `generator ${generatorName} {\\n provider = \"prisma-client-js\"\\n}\\n\\n` +\n `datasource ${datasourceName} {\\n provider = \"${provider}\"\\n url = ${\n provider === \"sqlite\" ? '\"file:./dev.db\"' : 'env(\"DATABASE_URL\")'\n }\\n}\\n\\n${blocks.join(\"\\n\\n\")}\\n`\n );\n}\n\nexport function renderDrizzleSchema(\n schema: SchemaDefinition<any>,\n options: DrizzleGenerationOptions,\n) {\n const manifest = createManifest(schema);\n const coreImports = drizzleImports(options.dialect, manifest).join(\", \");\n const tableFactory =\n options.dialect === \"pg\"\n ? \"pgTable\"\n : options.dialect === \"mysql\"\n ? \"mysqlTable\"\n : \"sqliteTable\";\n\n const modelBlocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const indexedFields = constrainedFields(model);\n const lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect, { indexed: indexedFields.has(field.name) });\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n value += `.references(() => ${targetModel}.${targetField})`;\n }\n return ` ${field.name}: ${value}`;\n });\n\n const constraintLines = [\n ...model.constraints.unique.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: uniqueIndex(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ...model.constraints.indexes.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: index(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ];\n\n if (!constraintLines.length) {\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n }\n\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n}, (table) => ({\\n${constraintLines.join(\",\\n\")}\\n}));`;\n });\n\n const relationBlocks = (Object.values(manifest.models) as ManifestModel[])\n .map((model) => {\n const lines = Object.entries(model.relations)\n .flatMap(([relationName, relation]) => {\n if (relation.kind === \"manyToMany\") {\n return [];\n }\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n return [\n ` ${relationName}: one(${relation.target}, { fields: [${model.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`,\n ];\n }\n\n if (relation.kind === \"hasOne\") {\n return [` ${relationName}: one(${relation.target})`];\n }\n\n return [` ${relationName}: many(${relation.target})`];\n })\n .filter(Boolean);\n\n if (!lines.length) return null;\n\n return `export const ${model.name}Relations = relations(${model.name}, ({ one, many }) => ({\\n${lines.join(\",\\n\")}\\n}));`;\n })\n .filter(Boolean);\n\n const imports = [\n `import { ${coreImports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";`,\n relationBlocks.length ? `import { relations } from \"drizzle-orm\";` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return `${imports}\\n\\n${[...modelBlocks, ...relationBlocks].join(\"\\n\\n\")}\\n`;\n}\n\nexport function renderSafeSql(schema: SchemaDefinition<any>, options: SqlGenerationOptions) {\n const manifest = createManifest(schema);\n const statements = (Object.values(manifest.models) as ManifestModel[]).flatMap((model) => {\n const indexedFields = constrainedFields(model);\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect, {\n indexed: indexedFields.has(field.name),\n })}`,\n ];\n if (field.kind === \"id\") parts.push(\"primary key\");\n if (!field.nullable) parts.push(\"not null\");\n if (field.unique && field.kind !== \"id\") parts.push(\"unique\");\n if (field.defaultValue !== undefined && field.kind !== \"json\") {\n parts.push(\n `default ${\n typeof field.defaultValue === \"string\"\n ? `'${field.defaultValue}'`\n : String(field.defaultValue)\n }`,\n );\n }\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n const targetTable = manifest.models[targetModel]?.table ?? targetModel;\n const targetColumn =\n manifest.models[targetModel]?.fields[targetField]?.column ?? targetField;\n parts.push(\n `references ${sqlIdentifier(options.dialect, targetTable)}(${sqlIdentifier(\n options.dialect,\n targetColumn,\n )})`,\n );\n }\n return ` ${parts.join(\" \")}`;\n });\n\n return [\n `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\n\")}\\n);`,\n ...model.constraints.unique.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ...model.constraints.indexes.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ];\n });\n\n return `${statements.join(\"\\n\\n\")}\\n`;\n}\n\nexport function replaceGeneratedBlock(input: { current: string; label: string; content: string }) {\n const start = `// @farming-labs/orm:start:${input.label}`;\n const end = `// @farming-labs/orm:end:${input.label}`;\n const block = `${start}\\n${input.content.trim()}\\n${end}`;\n\n if (input.current.includes(start) && input.current.includes(end)) {\n const pattern = new RegExp(`${start}[\\\\s\\\\S]*?${end}`, \"m\");\n return input.current.replace(pattern, block);\n }\n\n return `${input.current.trim()}\\n\\n${block}\\n`;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n OrmDriver,\n SelectShape,\n SelectedRecord,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n Where,\n} from \"./client\";\nimport {\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n requireUniqueLookup,\n validateUniqueLookupUpdateData,\n} from \"./manifest\";\nimport type { ModelName, RelationName, SchemaDefinition } from \"./schema\";\n\ntype MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, Array<Record<string, unknown>>>\n>;\n\nconst manifestCache = new WeakMap<object, ReturnType<typeof createManifest>>();\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 evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n const record = filter;\n\n if (\"eq\" in record && !equalValues(value, record.eq)) return false;\n if (\"not\" in record && equalValues(value, record.not)) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in record) {\n if (typeof value !== \"string\" || typeof record.contains !== \"string\") return false;\n if (!value.includes(record.contains)) return false;\n }\n if (\"gt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value > record.gt!)) return false;\n }\n if (\"gte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value >= record.gte!)) return false;\n }\n if (\"lt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value < record.lt!)) return false;\n }\n if (\"lte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value <= record.lte!)) return false;\n }\n\n return true;\n}\n\nfunction matchesWhere<TRecord extends Record<string, unknown>>(\n record: TRecord,\n where?: Where<any>,\n) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesWhere(record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateFilter(record[key], filter)) return false;\n }\n\n return true;\n}\n\nfunction applyDefault(value: unknown, field: { generated?: string; defaultValue?: unknown }) {\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 sortRows(\n rows: Array<Record<string, unknown>>,\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>,\n) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left[field];\n const b = right[field];\n if (a === b) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n return 0;\n });\n}\n\nfunction pageRows(rows: Array<Record<string, unknown>>, skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\ntype QueryArgs = {\n where?: Where<any>;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n};\n\nfunction applyQuery(rows: Array<Record<string, unknown>>, args: QueryArgs = {}) {\n const filtered = rows.filter((row) => matchesWhere(row, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n}\n\nexport function createMemoryDriver<TSchema extends SchemaDefinition<any>>(\n seed?: MemoryStore<TSchema>,\n): OrmDriver<TSchema> {\n const state: MemoryStore<TSchema> = structuredClone(seed ?? {});\n\n function getRows<TModelName extends ModelName<TSchema>>(model: TModelName) {\n const rows = state[model] ?? [];\n state[model] = rows;\n return rows;\n }\n\n function buildRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n data: Partial<Record<string, unknown>>,\n ) {\n const modelDefinition = schema.models[model];\n const nextRow: Record<string, unknown> = {};\n\n for (const [fieldName, field] of Object.entries(modelDefinition.fields) as Array<\n [string, (typeof modelDefinition.fields)[string]]\n >) {\n nextRow[fieldName] = applyDefault(data[fieldName], field.config);\n }\n\n return nextRow;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n model: TModelName,\n row: Record<string, unknown>,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[model];\n const output: Record<string, unknown> = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.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 !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n model,\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 model: TModelName,\n relationName: TRelationName,\n row: Record<string, unknown>,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[model].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item.id === foreignValue,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const throughRows = getRows(relation.through as ModelName<TSchema>).filter(\n (item) => item[relation.from] === row.id,\n );\n const targetIds = throughRows.map((item) => item[relation.to]);\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter((item) =>\n targetIds.includes(item.id),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const driver = {\n async findMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = applyQuery(getRows(model), args);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async findFirst(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindFirstArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async findUnique(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindUniqueArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async count(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args?: CountArgs<TSchema, ModelName<TSchema>>,\n ) {\n return applyQuery(getRows(model), args).length;\n },\n async create(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const nextRow = buildRow(schema, model, args.data);\n getRows(model).push(nextRow);\n return projectRow(schema, model, nextRow, args.select);\n },\n async createMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = args.data.map((entry) => buildRow(schema, model, entry));\n getRows(model).push(...rows);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async update(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (!row) return null;\n Object.assign(row, args.data);\n return projectRow(schema, model, row, args.select);\n },\n async updateMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model).filter((item) => matchesWhere(item, args.where));\n for (const row of rows) {\n Object.assign(row, args.data);\n }\n return rows.length;\n },\n async upsert(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpsertArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const lookup = requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n getManifest(schema).models[model],\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (row) {\n Object.assign(row, args.update);\n return projectRow(schema, model, row, args.select);\n }\n\n const created = buildRow(\n schema,\n model,\n mergeUniqueLookupCreateData(\n getManifest(schema).models[model],\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n getRows(model).push(created);\n return projectRow(schema, model, created, args.select);\n },\n async delete(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const index = rows.findIndex((item) => matchesWhere(item, args.where));\n if (index === -1) return 0;\n rows.splice(index, 1);\n return 1;\n },\n async deleteMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const before = rows.length;\n state[model] = rows.filter((item) => !matchesWhere(item, args.where));\n return before - (state[model]?.length ?? 0);\n },\n async transaction<TResult>(\n _schema: TSchema,\n run: (driver: OrmDriver<TSchema>) => Promise<TResult>,\n ) {\n const snapshot = structuredClone(state);\n try {\n return await run(driver);\n } catch (error) {\n Object.keys(state).forEach((key) => {\n delete state[key as ModelName<TSchema>];\n });\n Object.assign(state, snapshot);\n throw error;\n }\n },\n } as OrmDriver<TSchema>;\n\n return driver;\n}\n","export type RelationKind = \"belongsTo\" | \"hasOne\" | \"hasMany\" | \"manyToMany\";\n\nexport type RelationDefinition<\n Target extends string = string,\n Kind extends RelationKind = RelationKind,\n> = Kind extends \"manyToMany\"\n ? {\n kind: Kind;\n target: Target;\n through: string;\n from: string;\n to: string;\n }\n : {\n kind: Kind;\n target: Target;\n foreignKey: string;\n };\n\nexport type AnyRelation = RelationDefinition<string, RelationKind>;\n\nexport function belongsTo<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"belongsTo\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"belongsTo\">;\n}\n\nexport function hasOne<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasOne\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasOne\">;\n}\n\nexport function hasMany<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasMany\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasMany\">;\n}\n\nexport function manyToMany<Target extends string>(\n target: Target,\n config: {\n through: string;\n from: string;\n to: string;\n },\n) {\n return {\n kind: \"manyToMany\",\n target,\n through: config.through,\n from: config.from,\n to: config.to,\n } satisfies RelationDefinition<Target, \"manyToMany\">;\n}\n","import type { AnyFieldBuilder, FieldOutput } from \"./fields\";\nimport type { AnyRelation, RelationDefinition } from \"./relations\";\n\nexport type FieldMap = Record<string, AnyFieldBuilder>;\nexport type RelationMap = Record<string, AnyRelation>;\nexport type ConstraintFieldName<Fields extends FieldMap> = keyof Fields & string;\nexport type ConstraintFieldSet<Fields extends FieldMap> = readonly [\n ConstraintFieldName<Fields>,\n ...ConstraintFieldName<Fields>[],\n];\nexport type ModelConstraints<Fields extends FieldMap = FieldMap> = {\n readonly unique?: readonly ConstraintFieldSet<Fields>[];\n readonly indexes?: readonly ConstraintFieldSet<Fields>[];\n};\n\nexport type ModelDefinition<\n Fields extends FieldMap = FieldMap,\n Relations extends RelationMap = RelationMap,\n> = {\n readonly _tag: \"model\";\n readonly table: string;\n readonly fields: Fields;\n readonly relations: Relations;\n readonly constraints: ModelConstraints<Fields>;\n readonly description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<any, any>;\n\nexport type SchemaDefinition<\n Models extends Record<string, AnyModelDefinition> = Record<string, AnyModelDefinition>,\n> = {\n readonly _tag: \"schema\";\n readonly models: Models;\n};\n\nexport function model<Fields extends FieldMap, Relations extends RelationMap = {}>(config: {\n table: string;\n fields: Fields;\n relations?: Relations;\n constraints?: ModelConstraints<Fields>;\n description?: string;\n}): ModelDefinition<Fields, Relations> {\n return {\n _tag: \"model\",\n table: config.table,\n fields: config.fields,\n relations: (config.relations ?? {}) as Relations,\n constraints: (config.constraints ?? {}) as ModelConstraints<Fields>,\n description: config.description,\n };\n}\n\nexport function defineSchema<Models extends Record<string, AnyModelDefinition>>(\n models: Models,\n): SchemaDefinition<Models> {\n return {\n _tag: \"schema\",\n models,\n };\n}\n\nexport type SchemaModels<TSchema> = TSchema extends SchemaDefinition<infer Models> ? Models : never;\n\nexport type ModelName<TSchema> = keyof SchemaModels<TSchema> & string;\n\nexport type ModelForName<TSchema, TName extends ModelName<TSchema>> = SchemaModels<TSchema>[TName];\n\nexport type ModelFields<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"fields\"];\n\nexport type ModelRelations<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"relations\"];\n\nexport type ScalarRecord<TSchema, TName extends ModelName<TSchema>> = {\n [K in keyof ModelFields<TSchema, TName> & string]: FieldOutput<ModelFields<TSchema, TName>[K]>;\n};\n\nexport type RelationName<TSchema, TName extends ModelName<TSchema>> = keyof ModelRelations<\n TSchema,\n TName\n> &\n string;\n\nexport type RelationForName<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> = ModelRelations<TSchema, TName>[TRelationName];\n\nexport type RelationTarget<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> =\n RelationForName<TSchema, TName, TRelationName> extends RelationDefinition<infer Target, any>\n ? Extract<Target, ModelName<TSchema>>\n : never;\n"],"mappings":"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","names":["model","model","model","model","targetRows","matchedRows"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/fields.ts","../src/manifest.ts","../src/generators.ts","../src/memory.ts","../src/relations.ts","../src/schema.ts"],"sourcesContent":["export * from \"./client\";\nexport * from \"./fields\";\nexport * from \"./generators\";\nexport * from \"./manifest\";\nexport * from \"./memory\";\nexport * from \"./relations\";\nexport * from \"./schema\";\n","import type { SchemaDefinition } from \"./schema\";\nimport type {\n ModelName,\n RelationForName,\n RelationName,\n RelationTarget,\n ScalarRecord,\n} from \"./schema\";\n\ntype Direction = \"asc\" | \"desc\";\n\ntype JsonPrimitive = null | string | number | boolean;\ntype JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\ntype Comparable = string | number | Date;\n\ntype ValueFilter<T> = T extends string\n ? T | { eq?: T; contains?: string; in?: T[]; not?: T }\n : T extends Comparable\n ? T | { eq?: T; gt?: T; gte?: T; lt?: T; lte?: T; in?: T[]; not?: T }\n : T | { eq?: T; in?: T[]; not?: T };\n\nexport type Where<TRecord extends Record<string, unknown>> = {\n [K in keyof TRecord]?: ValueFilter<TRecord[K]>;\n} & {\n AND?: Array<Where<TRecord>>;\n OR?: Array<Where<TRecord>>;\n NOT?: Where<TRecord>;\n};\n\ntype RelationQuery<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: SelectShape<TSchema, TModelName>;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\ntype RelationSelectionValue<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n> = true | RelationQuery<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>;\n\nexport type SelectShape<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n [K in\n | (keyof ScalarRecord<TSchema, TModelName> & string)\n | RelationName<TSchema, TModelName>]?: K extends RelationName<TSchema, TModelName>\n ? true | RelationQuery<TSchema, any>\n : true;\n};\n\ntype IsManyRelation<TRelation> = TRelation extends { kind: \"hasMany\" | \"manyToMany\" }\n ? true\n : false;\n\ntype DefaultSelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = ScalarRecord<TSchema, TModelName>;\n\ntype SelectedScalars<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & keyof ScalarRecord<TSchema, TModelName> as TSelect[K] extends true\n ? K\n : never]: ScalarRecord<TSchema, TModelName>[K];\n};\n\ntype RelationResult<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n TValue extends RelationSelectionValue<TSchema, TModelName, TRelationName>,\n> = TValue extends true\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>>\n : DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>> | null\n : TValue extends RelationQuery<TSchema, infer Target>\n ? Target extends ModelName<TSchema>\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<\n SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n >\n >\n : SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n > | null\n : never\n : never;\n\ntype SelectedRelations<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & RelationName<TSchema, TModelName>]: RelationResult<\n TSchema,\n TModelName,\n K,\n Extract<TSelect[K], RelationSelectionValue<TSchema, TModelName, K>>\n >;\n};\n\nexport type SelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n> =\n TSelect extends SelectShape<TSchema, TModelName>\n ? SelectedScalars<TSchema, TModelName, TSelect> &\n SelectedRelations<TSchema, TModelName, TSelect>\n : DefaultSelectedRecord<TSchema, TModelName>;\n\nexport type FindManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\nexport type FindFirstArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindManyArgs<TSchema, TModelName, TSelect>;\n\nexport type FindOneArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindFirstArgs<TSchema, TModelName, TSelect>;\n\nexport type FindUniqueArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Array<Partial<ScalarRecord<TSchema, TModelName>>>;\n select?: TSelect;\n};\n\nexport type UpdateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type UpdateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type CountArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type UpsertArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n create: Partial<ScalarRecord<TSchema, TModelName>>;\n update: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type OrmDriverHandle<\n TKind extends string = string,\n TClient = unknown,\n TDialect extends string | undefined = string | undefined,\n> = {\n kind: TKind;\n client: TClient;\n dialect?: TDialect;\n};\n\nexport interface OrmDriver<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> {\n readonly handle: THandle;\n findMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findFirst<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args?: CountArgs<TSchema, TModelName>,\n ): Promise<number>;\n create<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: UpdateManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n upsert<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteArgs<TSchema, TModelName>,\n ): Promise<number>;\n deleteMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n transaction<TResult>(\n schema: TSchema,\n run: (driver: OrmDriver<TSchema, THandle>) => Promise<TResult>,\n ): Promise<TResult>;\n}\n\nexport type ModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findOne<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindOneArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findFirst<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count(args?: CountArgs<TSchema, TModelName>): Promise<number>;\n create<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany(args: UpdateManyArgs<TSchema, TModelName>): Promise<number>;\n upsert<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;\n deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;\n};\n\nexport type BatchTask<\n TSchema extends SchemaDefinition<any>,\n TResult,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> = (tx: OrmClient<TSchema, THandle>) => Promise<TResult>;\n\nexport type OrmClient<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> = {\n [K in ModelName<TSchema>]: ModelClient<TSchema, K>;\n} & {\n $driver: THandle;\n transaction<TResult>(\n run: (tx: OrmClient<TSchema, THandle>) => Promise<TResult>,\n ): Promise<TResult>;\n batch<const TResult extends readonly unknown[]>(tasks: {\n [K in keyof TResult]: BatchTask<TSchema, TResult[K], THandle>;\n }): Promise<TResult>;\n};\n\nfunction createModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n>(\n schema: TSchema,\n driver: OrmDriver<TSchema, any>,\n model: TModelName,\n): ModelClient<TSchema, TModelName> {\n return {\n findMany(args) {\n return driver.findMany(schema, model, (args ?? {}) as any) as any;\n },\n findOne(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findFirst(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findUnique(args) {\n return driver.findUnique(schema, model, args as any) as any;\n },\n count(args) {\n return driver.count(schema, model, args as any);\n },\n create(args) {\n return driver.create(schema, model, args as any) as any;\n },\n createMany(args) {\n return driver.createMany(schema, model, args as any) as any;\n },\n update(args) {\n return driver.update(schema, model, args as any) as any;\n },\n updateMany(args) {\n return driver.updateMany(schema, model, args as any);\n },\n upsert(args) {\n return driver.upsert(schema, model, args as any) as any;\n },\n delete(args) {\n return driver.delete(schema, model, args as any) as any;\n },\n deleteMany(args) {\n return driver.deleteMany(schema, model, args as any);\n },\n };\n}\n\nexport function createOrm<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n>(options: { schema: TSchema; driver: OrmDriver<TSchema, THandle> }): OrmClient<TSchema, THandle> {\n const { schema, driver } = options;\n const models: Record<string, unknown> = {};\n\n for (const model of Object.keys(schema.models)) {\n models[model] = createModelClient(schema, driver, model as ModelName<TSchema>);\n }\n\n const orm = models as OrmClient<TSchema, THandle>;\n orm.$driver = driver.handle;\n orm.transaction = (run) =>\n driver.transaction(schema, async (txDriver) => {\n const tx = createOrm({\n schema,\n driver: txDriver,\n });\n return run(tx);\n });\n orm.batch = async (tasks) =>\n orm.transaction(async (tx) => {\n const results: unknown[] = [];\n for (const task of tasks) {\n results.push(await task(tx));\n }\n return results as any;\n });\n return orm;\n}\n","export type ScalarKind = \"id\" | \"string\" | \"boolean\" | \"datetime\" | \"integer\" | \"json\";\n\nexport type JsonValue =\n | null\n | string\n | number\n | boolean\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type FieldReference = `${string}.${string}`;\n\nexport type FieldConfig<\n Kind extends ScalarKind = ScalarKind,\n Nullable extends boolean = boolean,\n> = {\n kind: Kind;\n nullable: Nullable;\n unique: boolean;\n defaultValue?: unknown;\n generated?: \"id\" | \"now\";\n mappedName?: string;\n references?: FieldReference;\n description?: string;\n};\n\nexport type ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Kind extends \"datetime\"\n ? Date\n : Kind extends \"integer\"\n ? number\n : JsonValue;\n\nexport type AnyFieldBuilder = FieldBuilder<ScalarKind, boolean, ScalarValue<ScalarKind>>;\n\nconst cloneField = <\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder<Kind, Nullable, Value>(config);\n\nexport class FieldBuilder<\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n> {\n readonly _tag = \"field\";\n readonly __kind?: Kind;\n readonly __nullable?: Nullable;\n readonly __value?: Value;\n\n constructor(readonly config: FieldConfig<Kind, Nullable>) {}\n\n unique() {\n return cloneField({\n ...this.config,\n unique: true,\n });\n }\n\n nullable() {\n return cloneField<Kind, true, Value>({\n ...this.config,\n nullable: true,\n });\n }\n\n default(value: unknown) {\n return cloneField({\n ...this.config,\n defaultValue: value,\n });\n }\n\n defaultNow() {\n return cloneField({\n ...this.config,\n generated: \"now\",\n });\n }\n\n references(reference: FieldReference) {\n return cloneField({\n ...this.config,\n references: reference,\n });\n }\n\n map(name: string) {\n return cloneField({\n ...this.config,\n mappedName: name,\n });\n }\n\n describe(description: string) {\n return cloneField({\n ...this.config,\n description,\n });\n }\n}\n\nexport type FieldOutput<TField> = TField extends {\n __nullable?: infer Nullable;\n __value?: infer Value;\n}\n ? Nullable extends true\n ? Value | null\n : Value\n : never;\n\nexport function id() {\n return new FieldBuilder({\n kind: \"id\",\n nullable: false,\n unique: true,\n generated: \"id\",\n });\n}\n\nexport function string() {\n return new FieldBuilder({\n kind: \"string\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function boolean() {\n return new FieldBuilder({\n kind: \"boolean\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function datetime() {\n return new FieldBuilder({\n kind: \"datetime\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function integer() {\n return new FieldBuilder({\n kind: \"integer\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function json<TValue extends JsonValue = JsonValue>() {\n return new FieldBuilder<\"json\", false, TValue>({\n kind: \"json\",\n nullable: false,\n unique: false,\n });\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, ModelConstraints, SchemaDefinition } from \"./schema\";\n\nexport type ManifestField = {\n name: string;\n column: string;\n kind: ScalarKind;\n nullable: boolean;\n unique: boolean;\n generated?: \"id\" | \"now\";\n defaultValue?: unknown;\n references?: string;\n description?: string;\n};\n\nexport type ManifestConstraint = {\n name: string;\n fields: string[];\n columns: string[];\n unique: boolean;\n};\n\nexport type ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n constraints: {\n unique: ManifestConstraint[];\n indexes: ManifestConstraint[];\n };\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\n};\n\nexport type ManifestUniqueLookup = {\n kind: \"id\" | \"field\" | \"constraint\";\n fields: ManifestField[];\n values: Record<string, unknown>;\n constraint?: ManifestConstraint;\n};\n\nconst filterOperatorKeys = new Set([\"eq\", \"contains\", \"in\", \"not\", \"gt\", \"gte\", \"lt\", \"lte\"]);\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nexport function isOperatorFilterObject(value: unknown): value is Record<string, unknown> {\n if (!isFilterObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => filterOperatorKeys.has(key));\n}\n\nexport function equalValues(left: unknown, right: unknown) {\n return isDeepStrictEqual(left, right);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isOperatorFilterObject(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 requireEqualityValues(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n) {\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 === 0) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires a unique equality filter in \"where\".`,\n );\n }\n\n const values: Record<string, unknown> = {};\n\n for (const fieldName of keys) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n values[fieldName] = value;\n }\n\n return values;\n}\n\nfunction sameFieldSet(left: string[], right: string[]) {\n return left.length === right.length && left.every((fieldName) => right.includes(fieldName));\n}\n\nexport function requireUniqueLookup(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n): ManifestUniqueLookup {\n const values = requireEqualityValues(model, where, operation);\n const keys = Object.keys(values);\n\n if (keys.length === 1) {\n const field = model.fields[keys[0]!]!;\n if (field.kind === \"id\") {\n return {\n kind: \"id\",\n fields: [field],\n values,\n };\n }\n\n if (field.unique) {\n return {\n kind: \"field\",\n fields: [field],\n values,\n };\n }\n }\n\n const constraint = model.constraints.unique.find((candidate) =>\n sameFieldSet([...candidate.fields], keys),\n );\n\n if (!constraint) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" clause to match an id field, unique field, or declared unique constraint using equality values only.`,\n );\n }\n\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, values[fieldName]]),\n ),\n constraint,\n };\n}\n\nexport function resolveRowIdentityLookup(\n model: ManifestModel,\n row: Record<string, unknown>,\n): ManifestUniqueLookup {\n const idField = model.fields.id;\n if (idField && row[idField.name] !== undefined && row[idField.name] !== null) {\n return {\n kind: \"id\",\n fields: [idField],\n values: {\n [idField.name]: row[idField.name],\n },\n };\n }\n\n const uniqueField = Object.values(model.fields).find(\n (field) => field.unique && row[field.name] !== undefined && row[field.name] !== null,\n );\n if (uniqueField) {\n return {\n kind: \"field\",\n fields: [uniqueField],\n values: {\n [uniqueField.name]: row[uniqueField.name],\n },\n };\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n constraint.fields.every(\n (fieldName) => row[fieldName] !== undefined && row[fieldName] !== null,\n )\n ) {\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, row[fieldName]]),\n ),\n constraint,\n };\n }\n }\n\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field, unique field, or declared unique constraint with non-null values for identity lookups.`,\n );\n}\n\nexport function toUniqueLookupWhere(lookup: ManifestUniqueLookup) {\n return Object.fromEntries(lookup.fields.map((field) => [field.name, lookup.values[field.name]]));\n}\n\nexport function mergeUniqueLookupCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n const output = {\n ...createData,\n };\n\n for (const field of lookup.fields) {\n const currentValue = output[field.name];\n const expectedValue = lookup.values[field.name];\n if (currentValue !== undefined && !equalValues(currentValue, expectedValue)) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires create.${field.name} to match where.${field.name}.`,\n );\n }\n output[field.name] = currentValue ?? expectedValue;\n }\n\n return output;\n}\n\nexport function validateUniqueLookupUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n for (const field of lookup.fields) {\n const nextValue = updateData[field.name];\n if (nextValue !== undefined && !equalValues(nextValue, lookup.values[field.name])) {\n throw new Error(\n `${operation} on model \"${model.name}\" cannot change the conflict field \"${field.name}\".`,\n );\n }\n }\n}\n\nfunction createConstraintName(table: string, columns: string[], suffix: \"unique\" | \"idx\") {\n const base = [table, ...columns]\n .join(\"_\")\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return `${base}_${suffix}`;\n}\n\nfunction normalizeConstraints(\n modelName: string,\n table: string,\n fields: Record<string, ManifestField>,\n constraints: ModelConstraints<any>,\n) {\n const normalize = (entries: readonly (readonly string[])[] | undefined, unique: boolean) =>\n (entries ?? []).map((entry) => {\n if (!entry.length) {\n throw new Error(\n `Model \"${modelName}\" defines an empty ${unique ? \"unique\" : \"index\"} constraint.`,\n );\n }\n\n const columns = entry.map((fieldName) => {\n const field = fields[fieldName];\n if (!field) {\n throw new Error(\n `Model \"${modelName}\" defines a ${unique ? \"unique\" : \"index\"} constraint on unknown field \"${fieldName}\".`,\n );\n }\n return field.column;\n });\n\n return {\n name: createConstraintName(table, columns, unique ? \"unique\" : \"idx\"),\n fields: [...entry],\n columns,\n unique,\n } satisfies ManifestConstraint;\n });\n\n return {\n unique: normalize(constraints.unique, true),\n indexes: normalize(constraints.indexes, false),\n };\n}\n\nexport function createManifest<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema): SchemaManifest {\n const models = Object.fromEntries(\n (Object.entries(schema.models) as Array<[string, AnyModelDefinition]>).map(\n ([name, definition]) => {\n const fields = Object.fromEntries(\n (\n Object.entries(definition.fields) as Array<\n [string, AnyModelDefinition[\"fields\"][string]]\n >\n ).map(([fieldName, field]) => [\n fieldName,\n {\n name: fieldName,\n column: field.config.mappedName ?? fieldName,\n kind: field.config.kind,\n nullable: field.config.nullable,\n unique: field.config.unique,\n generated: field.config.generated,\n defaultValue: field.config.defaultValue,\n references: field.config.references,\n description: field.config.description,\n } satisfies ManifestField,\n ]),\n );\n\n return [\n name,\n {\n name,\n table: definition.table,\n description: definition.description,\n fields,\n relations: definition.relations,\n constraints: normalizeConstraints(\n name,\n definition.table,\n fields,\n definition.constraints,\n ),\n } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\n type ManifestConstraint,\n type ManifestField,\n type ManifestModel,\n type SchemaManifest,\n} from \"./manifest\";\nimport type { SchemaDefinition } from \"./schema\";\n\nexport type PrismaGenerationOptions = {\n provider?: \"postgresql\" | \"mysql\" | \"sqlite\";\n datasourceName?: string;\n generatorName?: string;\n};\n\nexport type DrizzleGenerationOptions = {\n dialect: \"pg\" | \"mysql\" | \"sqlite\";\n};\n\nexport type SqlGenerationOptions = {\n dialect: \"postgres\" | \"mysql\" | \"sqlite\";\n};\n\nconst capitalize = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);\nconst pluralize = (value: string) => (value.endsWith(\"s\") ? value : `${value}s`);\nconst camelize = (value: string) =>\n value\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[^a-zA-Z]+/, \"\")\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n\nfunction resolveReferenceTarget(\n manifest: SchemaManifest,\n model: ManifestModel,\n foreignKey: string,\n fallbackTarget: string,\n) {\n const reference = model.fields[foreignKey]?.references;\n if (!reference) {\n return {\n targetModel: fallbackTarget,\n targetField: \"id\",\n };\n }\n\n const [targetModel, targetField = \"id\"] = reference.split(\".\");\n return {\n targetModel,\n targetField,\n };\n}\n\nfunction hasExplicitInverseRelation(\n manifest: SchemaManifest,\n modelName: string,\n sourceModel: string,\n foreignKey: string,\n) {\n const model = manifest.models[modelName];\n if (!model) return false;\n\n return Object.values(model.relations).some((relation) => {\n if (relation.target !== sourceModel) return false;\n if (relation.kind === \"belongsTo\" || relation.kind === \"manyToMany\") return false;\n return relation.foreignKey === foreignKey;\n });\n}\n\nfunction prismaType(field: ManifestField) {\n switch (field.kind) {\n case \"id\":\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"integer\":\n return \"Int\";\n case \"json\":\n return \"Json\";\n }\n}\n\nfunction drizzleConstraintProperty(constraint: ManifestConstraint) {\n return camelize(constraint.name) || \"constraint\";\n}\n\nfunction constrainedFields(model: ManifestModel) {\n return new Set(\n [...model.constraints.unique, ...model.constraints.indexes].flatMap(\n (constraint) => constraint.fields,\n ),\n );\n}\n\nfunction drizzleImports(dialect: DrizzleGenerationOptions[\"dialect\"], manifest: SchemaManifest) {\n const models = Object.values(manifest.models) as ManifestModel[];\n const needsBoolean = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"boolean\"),\n );\n const needsDate = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"datetime\"),\n );\n const needsInteger = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"integer\"),\n );\n const needsJson = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"json\"),\n );\n const needsIndexes = models.some(\n (model) => model.constraints.indexes.length || model.constraints.unique.length,\n );\n\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"integer\" : null,\n needsDate ? \"timestamp\" : null,\n needsJson ? \"jsonb\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"int\" : null,\n needsDate ? \"datetime\" : null,\n needsJson ? \"json\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n return [\n \"sqliteTable\",\n \"text\",\n \"integer\",\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n}\n\nfunction drizzleColumn(\n field: ManifestField,\n dialect: DrizzleGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n const renderDefault = () => {\n if (field.defaultValue === undefined || field.kind === \"json\") return \"\";\n return `.default(${JSON.stringify(field.defaultValue)})`;\n };\n\n if (field.kind === \"id\") {\n if (dialect === \"mysql\") {\n return `varchar(\"${field.column}\", { length: 191 }).primaryKey()`;\n }\n return `text(\"${field.column}\").primaryKey()`;\n }\n\n if (field.kind === \"string\") {\n if (dialect === \"mysql\") {\n const base =\n field.unique || field.references || options.indexed\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"integer\") {\n if (dialect === \"mysql\") {\n return `int(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `integer(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"pg\") {\n return `jsonb(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"mysql\") {\n return `json(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `text(\"${field.column}\", { mode: \"json\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n\n if (dialect === \"mysql\") {\n return `datetime(\"${field.column}\", { mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"timestamp\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `timestamp(\"${field.column}\", { withTimezone: true, mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(\n field: ManifestField,\n dialect: SqlGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n if (field.kind === \"id\") {\n return dialect === \"mysql\" ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"string\") {\n return dialect === \"mysql\" && (field.unique || field.references || options.indexed)\n ? \"varchar(191)\"\n : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (field.kind === \"integer\") {\n return \"integer\";\n }\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") return \"jsonb\";\n if (dialect === \"mysql\") return \"json\";\n return \"text\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamptz\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\n}\n\nfunction sqlCreateIndexStatement(\n dialect: SqlGenerationOptions[\"dialect\"],\n table: string,\n constraint: ManifestConstraint,\n) {\n const indexName = sqlIdentifier(dialect, constraint.name);\n const tableName = sqlIdentifier(dialect, table);\n const columns = constraint.columns.map((column) => sqlIdentifier(dialect, column)).join(\", \");\n const createKeyword = constraint.unique ? \"create unique index\" : \"create index\";\n const ifNotExists = dialect === \"mysql\" ? \"\" : \" if not exists\";\n return `${createKeyword}${ifNotExists} ${indexName} on ${tableName}(${columns});`;\n}\n\nexport function renderPrismaSchema(\n schema: SchemaDefinition<any>,\n options: PrismaGenerationOptions = {},\n) {\n const manifest = createManifest(schema);\n const provider = options.provider ?? \"postgresql\";\n const generatorName = options.generatorName ?? \"client\";\n const datasourceName = options.datasourceName ?? \"db\";\n const reverseRelations = new Map<\n string,\n Array<{ sourceModel: string; foreignKey: string; many: boolean }>\n >();\n\n for (const model of Object.values(manifest.models) as ManifestModel[]) {\n for (const field of Object.values(model.fields)) {\n if (!field.references) continue;\n const [targetModel] = field.references.split(\".\");\n reverseRelations.set(targetModel, [\n ...(reverseRelations.get(targetModel) ?? []),\n {\n sourceModel: model.name,\n foreignKey: field.name,\n many: !field.unique,\n },\n ]);\n }\n }\n\n const blocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const lines: string[] = [];\n const modelName = capitalize(model.name);\n const relationFieldNames = new Set<string>();\n const handledForeignKeys = new Set<string>();\n\n for (const field of Object.values(model.fields)) {\n const fieldType = prismaType(field);\n const modifiers: string[] = [];\n if (field.kind === \"id\") modifiers.push(\"@id\");\n if (field.generated === \"id\") modifiers.push(\"@default(cuid())\");\n if (field.generated === \"now\") modifiers.push(\"@default(now())\");\n if (\n field.defaultValue !== undefined &&\n field.generated === undefined &&\n field.kind !== \"json\"\n ) {\n modifiers.push(\n typeof field.defaultValue === \"string\"\n ? `@default(\"${field.defaultValue}\")`\n : `@default(${String(field.defaultValue)})`,\n );\n }\n if (field.unique && field.kind !== \"id\") modifiers.push(\"@unique\");\n if (field.column !== field.name) modifiers.push(`@map(\"${field.column}\")`);\n\n lines.push(\n ` ${field.name} ${fieldType}${field.nullable ? \"?\" : \"\"}${modifiers.length ? ` ${modifiers.join(\" \")}` : \"\"}`,\n );\n }\n\n for (const [relationName, relation] of Object.entries(model.relations)) {\n if (relation.kind === \"manyToMany\") continue;\n\n relationFieldNames.add(relationName);\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n handledForeignKeys.add(relation.foreignKey);\n lines.push(\n ` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`,\n );\n continue;\n }\n\n if (relation.kind === \"hasOne\") {\n lines.push(` ${relationName} ${capitalize(relation.target)}?`);\n continue;\n }\n\n lines.push(` ${relationName} ${capitalize(relation.target)}[]`);\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.references || handledForeignKeys.has(field.name)) continue;\n const [targetModel, targetField] = field.references.split(\".\");\n if (relationFieldNames.has(targetModel)) continue;\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n if (\n hasExplicitInverseRelation(manifest, model.name, relation.sourceModel, relation.foreignKey)\n ) {\n continue;\n }\n\n const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;\n if (relationFieldNames.has(relationName)) continue;\n lines.push(\n relation.many\n ? ` ${relationName} ${capitalize(relation.sourceModel)}[]`\n : ` ${relationName} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const modelLines = [\n ...lines,\n ...model.constraints.unique.map(\n (constraint) => ` @@unique([${constraint.fields.join(\", \")}])`,\n ),\n ...model.constraints.indexes.map(\n (constraint) => ` @@index([${constraint.fields.join(\", \")}])`,\n ),\n ...(model.table !== modelName ? [` @@map(\"${model.table}\")`] : []),\n ];\n\n return `model ${modelName} {\\n${modelLines.join(\"\\n\")}\\n}`;\n });\n\n return (\n `generator ${generatorName} {\\n provider = \"prisma-client-js\"\\n}\\n\\n` +\n `datasource ${datasourceName} {\\n provider = \"${provider}\"\\n url = ${\n provider === \"sqlite\" ? '\"file:./dev.db\"' : 'env(\"DATABASE_URL\")'\n }\\n}\\n\\n${blocks.join(\"\\n\\n\")}\\n`\n );\n}\n\nexport function renderDrizzleSchema(\n schema: SchemaDefinition<any>,\n options: DrizzleGenerationOptions,\n) {\n const manifest = createManifest(schema);\n const coreImports = drizzleImports(options.dialect, manifest).join(\", \");\n const tableFactory =\n options.dialect === \"pg\"\n ? \"pgTable\"\n : options.dialect === \"mysql\"\n ? \"mysqlTable\"\n : \"sqliteTable\";\n\n const modelBlocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const indexedFields = constrainedFields(model);\n const lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect, { indexed: indexedFields.has(field.name) });\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n value += `.references(() => ${targetModel}.${targetField})`;\n }\n return ` ${field.name}: ${value}`;\n });\n\n const constraintLines = [\n ...model.constraints.unique.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: uniqueIndex(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ...model.constraints.indexes.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: index(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ];\n\n if (!constraintLines.length) {\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n }\n\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n}, (table) => ({\\n${constraintLines.join(\",\\n\")}\\n}));`;\n });\n\n const relationBlocks = (Object.values(manifest.models) as ManifestModel[])\n .map((model) => {\n const lines = Object.entries(model.relations)\n .flatMap(([relationName, relation]) => {\n if (relation.kind === \"manyToMany\") {\n return [];\n }\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n return [\n ` ${relationName}: one(${relation.target}, { fields: [${model.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`,\n ];\n }\n\n if (relation.kind === \"hasOne\") {\n return [` ${relationName}: one(${relation.target})`];\n }\n\n return [` ${relationName}: many(${relation.target})`];\n })\n .filter(Boolean);\n\n if (!lines.length) return null;\n\n return `export const ${model.name}Relations = relations(${model.name}, ({ one, many }) => ({\\n${lines.join(\",\\n\")}\\n}));`;\n })\n .filter(Boolean);\n\n const imports = [\n `import { ${coreImports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";`,\n relationBlocks.length ? `import { relations } from \"drizzle-orm\";` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return `${imports}\\n\\n${[...modelBlocks, ...relationBlocks].join(\"\\n\\n\")}\\n`;\n}\n\nexport function renderSafeSql(schema: SchemaDefinition<any>, options: SqlGenerationOptions) {\n const manifest = createManifest(schema);\n const statements = (Object.values(manifest.models) as ManifestModel[]).flatMap((model) => {\n const indexedFields = constrainedFields(model);\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect, {\n indexed: indexedFields.has(field.name),\n })}`,\n ];\n if (field.kind === \"id\") parts.push(\"primary key\");\n if (!field.nullable) parts.push(\"not null\");\n if (field.unique && field.kind !== \"id\") parts.push(\"unique\");\n if (field.defaultValue !== undefined && field.kind !== \"json\") {\n parts.push(\n `default ${\n typeof field.defaultValue === \"string\"\n ? `'${field.defaultValue}'`\n : String(field.defaultValue)\n }`,\n );\n }\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n const targetTable = manifest.models[targetModel]?.table ?? targetModel;\n const targetColumn =\n manifest.models[targetModel]?.fields[targetField]?.column ?? targetField;\n parts.push(\n `references ${sqlIdentifier(options.dialect, targetTable)}(${sqlIdentifier(\n options.dialect,\n targetColumn,\n )})`,\n );\n }\n return ` ${parts.join(\" \")}`;\n });\n\n return [\n `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\n\")}\\n);`,\n ...model.constraints.unique.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ...model.constraints.indexes.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ];\n });\n\n return `${statements.join(\"\\n\\n\")}\\n`;\n}\n\nexport function replaceGeneratedBlock(input: { current: string; label: string; content: string }) {\n const start = `// @farming-labs/orm:start:${input.label}`;\n const end = `// @farming-labs/orm:end:${input.label}`;\n const block = `${start}\\n${input.content.trim()}\\n${end}`;\n\n if (input.current.includes(start) && input.current.includes(end)) {\n const pattern = new RegExp(`${start}[\\\\s\\\\S]*?${end}`, \"m\");\n return input.current.replace(pattern, block);\n }\n\n return `${input.current.trim()}\\n\\n${block}\\n`;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n OrmDriver,\n OrmDriverHandle,\n SelectShape,\n SelectedRecord,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n Where,\n} from \"./client\";\nimport {\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n requireUniqueLookup,\n validateUniqueLookupUpdateData,\n} from \"./manifest\";\nimport type { ModelName, RelationName, SchemaDefinition } from \"./schema\";\n\ntype MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, Array<Record<string, unknown>>>\n>;\n\nconst manifestCache = new WeakMap<object, ReturnType<typeof createManifest>>();\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 evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n const record = filter;\n\n if (\"eq\" in record && !equalValues(value, record.eq)) return false;\n if (\"not\" in record && equalValues(value, record.not)) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in record) {\n if (typeof value !== \"string\" || typeof record.contains !== \"string\") return false;\n if (!value.includes(record.contains)) return false;\n }\n if (\"gt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value > record.gt!)) return false;\n }\n if (\"gte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value >= record.gte!)) return false;\n }\n if (\"lt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value < record.lt!)) return false;\n }\n if (\"lte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value <= record.lte!)) return false;\n }\n\n return true;\n}\n\nfunction matchesWhere<TRecord extends Record<string, unknown>>(\n record: TRecord,\n where?: Where<any>,\n) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesWhere(record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateFilter(record[key], filter)) return false;\n }\n\n return true;\n}\n\nfunction applyDefault(value: unknown, field: { generated?: string; defaultValue?: unknown }) {\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 sortRows(\n rows: Array<Record<string, unknown>>,\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>,\n) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left[field];\n const b = right[field];\n if (a === b) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n return 0;\n });\n}\n\nfunction pageRows(rows: Array<Record<string, unknown>>, skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\ntype QueryArgs = {\n where?: Where<any>;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n};\n\nfunction applyQuery(rows: Array<Record<string, unknown>>, args: QueryArgs = {}) {\n const filtered = rows.filter((row) => matchesWhere(row, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n}\n\nexport function createMemoryDriver<TSchema extends SchemaDefinition<any>>(\n seed?: MemoryStore<TSchema>,\n): OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>> {\n const state: MemoryStore<TSchema> = structuredClone(seed ?? {});\n\n function getRows<TModelName extends ModelName<TSchema>>(model: TModelName) {\n const rows = state[model] ?? [];\n state[model] = rows;\n return rows;\n }\n\n function buildRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n data: Partial<Record<string, unknown>>,\n ) {\n const modelDefinition = schema.models[model];\n const nextRow: Record<string, unknown> = {};\n\n for (const [fieldName, field] of Object.entries(modelDefinition.fields) as Array<\n [string, (typeof modelDefinition.fields)[string]]\n >) {\n nextRow[fieldName] = applyDefault(data[fieldName], field.config);\n }\n\n return nextRow;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n model: TModelName,\n row: Record<string, unknown>,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[model];\n const output: Record<string, unknown> = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.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 !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n model,\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 model: TModelName,\n relationName: TRelationName,\n row: Record<string, unknown>,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[model].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item.id === foreignValue,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const throughRows = getRows(relation.through as ModelName<TSchema>).filter(\n (item) => item[relation.from] === row.id,\n );\n const targetIds = throughRows.map((item) => item[relation.to]);\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter((item) =>\n targetIds.includes(item.id),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n let driver!: OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>;\n\n driver = {\n handle: {\n kind: \"memory\",\n client: state,\n },\n async findMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = applyQuery(getRows(model), args);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async findFirst(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindFirstArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async findUnique(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindUniqueArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async count(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args?: CountArgs<TSchema, ModelName<TSchema>>,\n ) {\n return applyQuery(getRows(model), args).length;\n },\n async create(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const nextRow = buildRow(schema, model, args.data);\n getRows(model).push(nextRow);\n return projectRow(schema, model, nextRow, args.select);\n },\n async createMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = args.data.map((entry) => buildRow(schema, model, entry));\n getRows(model).push(...rows);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async update(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (!row) return null;\n Object.assign(row, args.data);\n return projectRow(schema, model, row, args.select);\n },\n async updateMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model).filter((item) => matchesWhere(item, args.where));\n for (const row of rows) {\n Object.assign(row, args.data);\n }\n return rows.length;\n },\n async upsert(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpsertArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const lookup = requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n getManifest(schema).models[model],\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (row) {\n Object.assign(row, args.update);\n return projectRow(schema, model, row, args.select);\n }\n\n const created = buildRow(\n schema,\n model,\n mergeUniqueLookupCreateData(\n getManifest(schema).models[model],\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n getRows(model).push(created);\n return projectRow(schema, model, created, args.select);\n },\n async delete(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const index = rows.findIndex((item) => matchesWhere(item, args.where));\n if (index === -1) return 0;\n rows.splice(index, 1);\n return 1;\n },\n async deleteMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const before = rows.length;\n state[model] = rows.filter((item) => !matchesWhere(item, args.where));\n return before - (state[model]?.length ?? 0);\n },\n async transaction<TResult>(\n _schema: TSchema,\n run: (\n driver: OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>,\n ) => Promise<TResult>,\n ) {\n const snapshot = structuredClone(state);\n try {\n return await run(driver);\n } catch (error) {\n Object.keys(state).forEach((key) => {\n delete state[key as ModelName<TSchema>];\n });\n Object.assign(state, snapshot);\n throw error;\n }\n },\n } as OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>;\n\n return driver;\n}\n","export type RelationKind = \"belongsTo\" | \"hasOne\" | \"hasMany\" | \"manyToMany\";\n\nexport type RelationDefinition<\n Target extends string = string,\n Kind extends RelationKind = RelationKind,\n> = Kind extends \"manyToMany\"\n ? {\n kind: Kind;\n target: Target;\n through: string;\n from: string;\n to: string;\n }\n : {\n kind: Kind;\n target: Target;\n foreignKey: string;\n };\n\nexport type AnyRelation = RelationDefinition<string, RelationKind>;\n\nexport function belongsTo<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"belongsTo\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"belongsTo\">;\n}\n\nexport function hasOne<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasOne\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasOne\">;\n}\n\nexport function hasMany<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasMany\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasMany\">;\n}\n\nexport function manyToMany<Target extends string>(\n target: Target,\n config: {\n through: string;\n from: string;\n to: string;\n },\n) {\n return {\n kind: \"manyToMany\",\n target,\n through: config.through,\n from: config.from,\n to: config.to,\n } satisfies RelationDefinition<Target, \"manyToMany\">;\n}\n","import type { AnyFieldBuilder, FieldOutput } from \"./fields\";\nimport type { AnyRelation, RelationDefinition } from \"./relations\";\n\nexport type FieldMap = Record<string, AnyFieldBuilder>;\nexport type RelationMap = Record<string, AnyRelation>;\nexport type ConstraintFieldName<Fields extends FieldMap> = keyof Fields & string;\nexport type ConstraintFieldSet<Fields extends FieldMap> = readonly [\n ConstraintFieldName<Fields>,\n ...ConstraintFieldName<Fields>[],\n];\nexport type ModelConstraints<Fields extends FieldMap = FieldMap> = {\n readonly unique?: readonly ConstraintFieldSet<Fields>[];\n readonly indexes?: readonly ConstraintFieldSet<Fields>[];\n};\n\nexport type ModelDefinition<\n Fields extends FieldMap = FieldMap,\n Relations extends RelationMap = RelationMap,\n> = {\n readonly _tag: \"model\";\n readonly table: string;\n readonly fields: Fields;\n readonly relations: Relations;\n readonly constraints: ModelConstraints<Fields>;\n readonly description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<any, any>;\n\nexport type SchemaDefinition<\n Models extends Record<string, AnyModelDefinition> = Record<string, AnyModelDefinition>,\n> = {\n readonly _tag: \"schema\";\n readonly models: Models;\n};\n\nexport function model<Fields extends FieldMap, Relations extends RelationMap = {}>(config: {\n table: string;\n fields: Fields;\n relations?: Relations;\n constraints?: ModelConstraints<Fields>;\n description?: string;\n}): ModelDefinition<Fields, Relations> {\n return {\n _tag: \"model\",\n table: config.table,\n fields: config.fields,\n relations: (config.relations ?? {}) as Relations,\n constraints: (config.constraints ?? {}) as ModelConstraints<Fields>,\n description: config.description,\n };\n}\n\nexport function defineSchema<Models extends Record<string, AnyModelDefinition>>(\n models: Models,\n): SchemaDefinition<Models> {\n return {\n _tag: \"schema\",\n models,\n };\n}\n\nexport type SchemaModels<TSchema> = TSchema extends SchemaDefinition<infer Models> ? Models : never;\n\nexport type ModelName<TSchema> = keyof SchemaModels<TSchema> & string;\n\nexport type ModelForName<TSchema, TName extends ModelName<TSchema>> = SchemaModels<TSchema>[TName];\n\nexport type ModelFields<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"fields\"];\n\nexport type ModelRelations<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"relations\"];\n\nexport type ScalarRecord<TSchema, TName extends ModelName<TSchema>> = {\n [K in keyof ModelFields<TSchema, TName> & string]: FieldOutput<ModelFields<TSchema, TName>[K]>;\n};\n\nexport type RelationName<TSchema, TName extends ModelName<TSchema>> = keyof ModelRelations<\n TSchema,\n TName\n> &\n string;\n\nexport type RelationForName<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> = ModelRelations<TSchema, TName>[TRelationName];\n\nexport type RelationTarget<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> =\n RelationForName<TSchema, TName, TRelationName> extends RelationDefinition<infer Target, any>\n ? Extract<Target, ModelName<TSchema>>\n : never;\n"],"mappings":"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","names":["model","model","model","model","targetRows","matchedRows"]}
package/dist/index.d.cts CHANGED
@@ -226,7 +226,13 @@ type UpsertArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelN
226
226
  update: Partial<ScalarRecord<TSchema, TModelName>>;
227
227
  select?: TSelect;
228
228
  };
229
- interface OrmDriver<TSchema extends SchemaDefinition<any>> {
229
+ type OrmDriverHandle<TKind extends string = string, TClient = unknown, TDialect extends string | undefined = string | undefined> = {
230
+ kind: TKind;
231
+ client: TClient;
232
+ dialect?: TDialect;
233
+ };
234
+ interface OrmDriver<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle> {
235
+ readonly handle: THandle;
230
236
  findMany<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
231
237
  findFirst<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindFirstArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
232
238
  findUnique<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindUniqueArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
@@ -238,7 +244,7 @@ interface OrmDriver<TSchema extends SchemaDefinition<any>> {
238
244
  upsert<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: UpsertArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;
239
245
  delete<TModelName extends ModelName<TSchema>>(schema: TSchema, model: TModelName, args: DeleteArgs<TSchema, TModelName>): Promise<number>;
240
246
  deleteMany<TModelName extends ModelName<TSchema>>(schema: TSchema, model: TModelName, args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;
241
- transaction<TResult>(schema: TSchema, run: (driver: OrmDriver<TSchema>) => Promise<TResult>): Promise<TResult>;
247
+ transaction<TResult>(schema: TSchema, run: (driver: OrmDriver<TSchema, THandle>) => Promise<TResult>): Promise<TResult>;
242
248
  }
243
249
  type ModelClient<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
244
250
  findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args?: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
@@ -254,19 +260,20 @@ type ModelClient<TSchema extends SchemaDefinition<any>, TModelName extends Model
254
260
  delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;
255
261
  deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;
256
262
  };
257
- type BatchTask<TSchema extends SchemaDefinition<any>, TResult> = (tx: OrmClient<TSchema>) => Promise<TResult>;
258
- type OrmClient<TSchema extends SchemaDefinition<any>> = {
263
+ type BatchTask<TSchema extends SchemaDefinition<any>, TResult, THandle extends OrmDriverHandle = OrmDriverHandle> = (tx: OrmClient<TSchema, THandle>) => Promise<TResult>;
264
+ type OrmClient<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle> = {
259
265
  [K in ModelName<TSchema>]: ModelClient<TSchema, K>;
260
266
  } & {
261
- transaction<TResult>(run: (tx: OrmClient<TSchema>) => Promise<TResult>): Promise<TResult>;
267
+ $driver: THandle;
268
+ transaction<TResult>(run: (tx: OrmClient<TSchema, THandle>) => Promise<TResult>): Promise<TResult>;
262
269
  batch<const TResult extends readonly unknown[]>(tasks: {
263
- [K in keyof TResult]: BatchTask<TSchema, TResult[K]>;
270
+ [K in keyof TResult]: BatchTask<TSchema, TResult[K], THandle>;
264
271
  }): Promise<TResult>;
265
272
  };
266
- declare function createOrm<TSchema extends SchemaDefinition<any>>(options: {
273
+ declare function createOrm<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle>(options: {
267
274
  schema: TSchema;
268
- driver: OrmDriver<TSchema>;
269
- }): OrmClient<TSchema>;
275
+ driver: OrmDriver<TSchema, THandle>;
276
+ }): OrmClient<TSchema, THandle>;
270
277
 
271
278
  type PrismaGenerationOptions = {
272
279
  provider?: "postgresql" | "mysql" | "sqlite";
@@ -339,6 +346,6 @@ declare function validateUniqueLookupUpdateData(model: ManifestModel, updateData
339
346
  declare function createManifest<TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>>(schema: TSchema): SchemaManifest;
340
347
 
341
348
  type MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, Array<Record<string, unknown>>>>;
342
- declare function createMemoryDriver<TSchema extends SchemaDefinition<any>>(seed?: MemoryStore<TSchema>): OrmDriver<TSchema>;
349
+ declare function createMemoryDriver<TSchema extends SchemaDefinition<any>>(seed?: MemoryStore<TSchema>): OrmDriver<TSchema, OrmDriverHandle<"memory", MemoryStore<TSchema>>>;
343
350
 
344
- export { type AnyFieldBuilder, type AnyModelDefinition, type AnyRelation, type BatchTask, type ConstraintFieldName, type ConstraintFieldSet, type CountArgs, type CreateArgs, type CreateManyArgs, type DeleteArgs, type DeleteManyArgs, type DrizzleGenerationOptions, FieldBuilder, type FieldConfig, type FieldMap, type FieldOutput, type FieldReference, type FindFirstArgs, type FindManyArgs, type FindOneArgs, type FindUniqueArgs, type JsonValue, type ManifestConstraint, type ManifestField, type ManifestModel, type ManifestUniqueLookup, type ModelClient, type ModelConstraints, type ModelDefinition, type ModelFields, type ModelForName, type ModelName, type ModelRelations, type OrmClient, type OrmDriver, type PrismaGenerationOptions, type RelationDefinition, type RelationForName, type RelationKind, type RelationMap, type RelationName, type RelationTarget, type ScalarKind, type ScalarRecord, type ScalarValue, type SchemaDefinition, type SchemaManifest, type SchemaModels, type SelectShape, type SelectedRecord, type SqlGenerationOptions, type UpdateArgs, type UpdateManyArgs, type UpsertArgs, type Where, belongsTo, boolean, createManifest, createMemoryDriver, createOrm, datetime, defineSchema, equalValues, hasMany, hasOne, id, integer, isOperatorFilterObject, json, manyToMany, mergeUniqueLookupCreateData, model, renderDrizzleSchema, renderPrismaSchema, renderSafeSql, replaceGeneratedBlock, requireUniqueLookup, resolveRowIdentityLookup, string, toUniqueLookupWhere, validateUniqueLookupUpdateData };
351
+ export { type AnyFieldBuilder, type AnyModelDefinition, type AnyRelation, type BatchTask, type ConstraintFieldName, type ConstraintFieldSet, type CountArgs, type CreateArgs, type CreateManyArgs, type DeleteArgs, type DeleteManyArgs, type DrizzleGenerationOptions, FieldBuilder, type FieldConfig, type FieldMap, type FieldOutput, type FieldReference, type FindFirstArgs, type FindManyArgs, type FindOneArgs, type FindUniqueArgs, type JsonValue, type ManifestConstraint, type ManifestField, type ManifestModel, type ManifestUniqueLookup, type ModelClient, type ModelConstraints, type ModelDefinition, type ModelFields, type ModelForName, type ModelName, type ModelRelations, type OrmClient, type OrmDriver, type OrmDriverHandle, type PrismaGenerationOptions, type RelationDefinition, type RelationForName, type RelationKind, type RelationMap, type RelationName, type RelationTarget, type ScalarKind, type ScalarRecord, type ScalarValue, type SchemaDefinition, type SchemaManifest, type SchemaModels, type SelectShape, type SelectedRecord, type SqlGenerationOptions, type UpdateArgs, type UpdateManyArgs, type UpsertArgs, type Where, belongsTo, boolean, createManifest, createMemoryDriver, createOrm, datetime, defineSchema, equalValues, hasMany, hasOne, id, integer, isOperatorFilterObject, json, manyToMany, mergeUniqueLookupCreateData, model, renderDrizzleSchema, renderPrismaSchema, renderSafeSql, replaceGeneratedBlock, requireUniqueLookup, resolveRowIdentityLookup, string, toUniqueLookupWhere, validateUniqueLookupUpdateData };
package/dist/index.d.ts CHANGED
@@ -226,7 +226,13 @@ type UpsertArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelN
226
226
  update: Partial<ScalarRecord<TSchema, TModelName>>;
227
227
  select?: TSelect;
228
228
  };
229
- interface OrmDriver<TSchema extends SchemaDefinition<any>> {
229
+ type OrmDriverHandle<TKind extends string = string, TClient = unknown, TDialect extends string | undefined = string | undefined> = {
230
+ kind: TKind;
231
+ client: TClient;
232
+ dialect?: TDialect;
233
+ };
234
+ interface OrmDriver<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle> {
235
+ readonly handle: THandle;
230
236
  findMany<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
231
237
  findFirst<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindFirstArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
232
238
  findUnique<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindUniqueArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
@@ -238,7 +244,7 @@ interface OrmDriver<TSchema extends SchemaDefinition<any>> {
238
244
  upsert<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: UpsertArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;
239
245
  delete<TModelName extends ModelName<TSchema>>(schema: TSchema, model: TModelName, args: DeleteArgs<TSchema, TModelName>): Promise<number>;
240
246
  deleteMany<TModelName extends ModelName<TSchema>>(schema: TSchema, model: TModelName, args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;
241
- transaction<TResult>(schema: TSchema, run: (driver: OrmDriver<TSchema>) => Promise<TResult>): Promise<TResult>;
247
+ transaction<TResult>(schema: TSchema, run: (driver: OrmDriver<TSchema, THandle>) => Promise<TResult>): Promise<TResult>;
242
248
  }
243
249
  type ModelClient<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
244
250
  findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args?: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
@@ -254,19 +260,20 @@ type ModelClient<TSchema extends SchemaDefinition<any>, TModelName extends Model
254
260
  delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;
255
261
  deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;
256
262
  };
257
- type BatchTask<TSchema extends SchemaDefinition<any>, TResult> = (tx: OrmClient<TSchema>) => Promise<TResult>;
258
- type OrmClient<TSchema extends SchemaDefinition<any>> = {
263
+ type BatchTask<TSchema extends SchemaDefinition<any>, TResult, THandle extends OrmDriverHandle = OrmDriverHandle> = (tx: OrmClient<TSchema, THandle>) => Promise<TResult>;
264
+ type OrmClient<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle> = {
259
265
  [K in ModelName<TSchema>]: ModelClient<TSchema, K>;
260
266
  } & {
261
- transaction<TResult>(run: (tx: OrmClient<TSchema>) => Promise<TResult>): Promise<TResult>;
267
+ $driver: THandle;
268
+ transaction<TResult>(run: (tx: OrmClient<TSchema, THandle>) => Promise<TResult>): Promise<TResult>;
262
269
  batch<const TResult extends readonly unknown[]>(tasks: {
263
- [K in keyof TResult]: BatchTask<TSchema, TResult[K]>;
270
+ [K in keyof TResult]: BatchTask<TSchema, TResult[K], THandle>;
264
271
  }): Promise<TResult>;
265
272
  };
266
- declare function createOrm<TSchema extends SchemaDefinition<any>>(options: {
273
+ declare function createOrm<TSchema extends SchemaDefinition<any>, THandle extends OrmDriverHandle = OrmDriverHandle>(options: {
267
274
  schema: TSchema;
268
- driver: OrmDriver<TSchema>;
269
- }): OrmClient<TSchema>;
275
+ driver: OrmDriver<TSchema, THandle>;
276
+ }): OrmClient<TSchema, THandle>;
270
277
 
271
278
  type PrismaGenerationOptions = {
272
279
  provider?: "postgresql" | "mysql" | "sqlite";
@@ -339,6 +346,6 @@ declare function validateUniqueLookupUpdateData(model: ManifestModel, updateData
339
346
  declare function createManifest<TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>>(schema: TSchema): SchemaManifest;
340
347
 
341
348
  type MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, Array<Record<string, unknown>>>>;
342
- declare function createMemoryDriver<TSchema extends SchemaDefinition<any>>(seed?: MemoryStore<TSchema>): OrmDriver<TSchema>;
349
+ declare function createMemoryDriver<TSchema extends SchemaDefinition<any>>(seed?: MemoryStore<TSchema>): OrmDriver<TSchema, OrmDriverHandle<"memory", MemoryStore<TSchema>>>;
343
350
 
344
- export { type AnyFieldBuilder, type AnyModelDefinition, type AnyRelation, type BatchTask, type ConstraintFieldName, type ConstraintFieldSet, type CountArgs, type CreateArgs, type CreateManyArgs, type DeleteArgs, type DeleteManyArgs, type DrizzleGenerationOptions, FieldBuilder, type FieldConfig, type FieldMap, type FieldOutput, type FieldReference, type FindFirstArgs, type FindManyArgs, type FindOneArgs, type FindUniqueArgs, type JsonValue, type ManifestConstraint, type ManifestField, type ManifestModel, type ManifestUniqueLookup, type ModelClient, type ModelConstraints, type ModelDefinition, type ModelFields, type ModelForName, type ModelName, type ModelRelations, type OrmClient, type OrmDriver, type PrismaGenerationOptions, type RelationDefinition, type RelationForName, type RelationKind, type RelationMap, type RelationName, type RelationTarget, type ScalarKind, type ScalarRecord, type ScalarValue, type SchemaDefinition, type SchemaManifest, type SchemaModels, type SelectShape, type SelectedRecord, type SqlGenerationOptions, type UpdateArgs, type UpdateManyArgs, type UpsertArgs, type Where, belongsTo, boolean, createManifest, createMemoryDriver, createOrm, datetime, defineSchema, equalValues, hasMany, hasOne, id, integer, isOperatorFilterObject, json, manyToMany, mergeUniqueLookupCreateData, model, renderDrizzleSchema, renderPrismaSchema, renderSafeSql, replaceGeneratedBlock, requireUniqueLookup, resolveRowIdentityLookup, string, toUniqueLookupWhere, validateUniqueLookupUpdateData };
351
+ export { type AnyFieldBuilder, type AnyModelDefinition, type AnyRelation, type BatchTask, type ConstraintFieldName, type ConstraintFieldSet, type CountArgs, type CreateArgs, type CreateManyArgs, type DeleteArgs, type DeleteManyArgs, type DrizzleGenerationOptions, FieldBuilder, type FieldConfig, type FieldMap, type FieldOutput, type FieldReference, type FindFirstArgs, type FindManyArgs, type FindOneArgs, type FindUniqueArgs, type JsonValue, type ManifestConstraint, type ManifestField, type ManifestModel, type ManifestUniqueLookup, type ModelClient, type ModelConstraints, type ModelDefinition, type ModelFields, type ModelForName, type ModelName, type ModelRelations, type OrmClient, type OrmDriver, type OrmDriverHandle, type PrismaGenerationOptions, type RelationDefinition, type RelationForName, type RelationKind, type RelationMap, type RelationName, type RelationTarget, type ScalarKind, type ScalarRecord, type ScalarValue, type SchemaDefinition, type SchemaManifest, type SchemaModels, type SelectShape, type SelectedRecord, type SqlGenerationOptions, type UpdateArgs, type UpdateManyArgs, type UpsertArgs, type Where, belongsTo, boolean, createManifest, createMemoryDriver, createOrm, datetime, defineSchema, equalValues, hasMany, hasOne, id, integer, isOperatorFilterObject, json, manyToMany, mergeUniqueLookupCreateData, model, renderDrizzleSchema, renderPrismaSchema, renderSafeSql, replaceGeneratedBlock, requireUniqueLookup, resolveRowIdentityLookup, string, toUniqueLookupWhere, validateUniqueLookupUpdateData };
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ function createOrm(options) {
46
46
  models[model2] = createModelClient(schema, driver, model2);
47
47
  }
48
48
  const orm = models;
49
+ orm.$driver = driver.handle;
49
50
  orm.transaction = (run) => driver.transaction(schema, async (txDriver) => {
50
51
  const tx = createOrm({
51
52
  schema,
@@ -1020,7 +1021,12 @@ function createMemoryDriver(seed) {
1020
1021
  )
1021
1022
  );
1022
1023
  }
1023
- const driver = {
1024
+ let driver;
1025
+ driver = {
1026
+ handle: {
1027
+ kind: "memory",
1028
+ client: state
1029
+ },
1024
1030
  async findMany(schema, model2, args) {
1025
1031
  const rows = applyQuery(getRows(model2), args);
1026
1032
  return Promise.all(rows.map((row) => projectRow(schema, model2, row, args.select)));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/fields.ts","../src/manifest.ts","../src/generators.ts","../src/memory.ts","../src/relations.ts","../src/schema.ts"],"sourcesContent":["import type { SchemaDefinition } from \"./schema\";\nimport type {\n ModelName,\n RelationForName,\n RelationName,\n RelationTarget,\n ScalarRecord,\n} from \"./schema\";\n\ntype Direction = \"asc\" | \"desc\";\n\ntype JsonPrimitive = null | string | number | boolean;\ntype JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\ntype Comparable = string | number | Date;\n\ntype ValueFilter<T> = T extends string\n ? T | { eq?: T; contains?: string; in?: T[]; not?: T }\n : T extends Comparable\n ? T | { eq?: T; gt?: T; gte?: T; lt?: T; lte?: T; in?: T[]; not?: T }\n : T | { eq?: T; in?: T[]; not?: T };\n\nexport type Where<TRecord extends Record<string, unknown>> = {\n [K in keyof TRecord]?: ValueFilter<TRecord[K]>;\n} & {\n AND?: Array<Where<TRecord>>;\n OR?: Array<Where<TRecord>>;\n NOT?: Where<TRecord>;\n};\n\ntype RelationQuery<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: SelectShape<TSchema, TModelName>;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\ntype RelationSelectionValue<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n> = true | RelationQuery<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>;\n\nexport type SelectShape<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n [K in\n | (keyof ScalarRecord<TSchema, TModelName> & string)\n | RelationName<TSchema, TModelName>]?: K extends RelationName<TSchema, TModelName>\n ? true | RelationQuery<TSchema, any>\n : true;\n};\n\ntype IsManyRelation<TRelation> = TRelation extends { kind: \"hasMany\" | \"manyToMany\" }\n ? true\n : false;\n\ntype DefaultSelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = ScalarRecord<TSchema, TModelName>;\n\ntype SelectedScalars<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & keyof ScalarRecord<TSchema, TModelName> as TSelect[K] extends true\n ? K\n : never]: ScalarRecord<TSchema, TModelName>[K];\n};\n\ntype RelationResult<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n TValue extends RelationSelectionValue<TSchema, TModelName, TRelationName>,\n> = TValue extends true\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>>\n : DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>> | null\n : TValue extends RelationQuery<TSchema, infer Target>\n ? Target extends ModelName<TSchema>\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<\n SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n >\n >\n : SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n > | null\n : never\n : never;\n\ntype SelectedRelations<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & RelationName<TSchema, TModelName>]: RelationResult<\n TSchema,\n TModelName,\n K,\n Extract<TSelect[K], RelationSelectionValue<TSchema, TModelName, K>>\n >;\n};\n\nexport type SelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n> =\n TSelect extends SelectShape<TSchema, TModelName>\n ? SelectedScalars<TSchema, TModelName, TSelect> &\n SelectedRelations<TSchema, TModelName, TSelect>\n : DefaultSelectedRecord<TSchema, TModelName>;\n\nexport type FindManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\nexport type FindFirstArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindManyArgs<TSchema, TModelName, TSelect>;\n\nexport type FindOneArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindFirstArgs<TSchema, TModelName, TSelect>;\n\nexport type FindUniqueArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Array<Partial<ScalarRecord<TSchema, TModelName>>>;\n select?: TSelect;\n};\n\nexport type UpdateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type UpdateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type CountArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type UpsertArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n create: Partial<ScalarRecord<TSchema, TModelName>>;\n update: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport interface OrmDriver<TSchema extends SchemaDefinition<any>> {\n findMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findFirst<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args?: CountArgs<TSchema, TModelName>,\n ): Promise<number>;\n create<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: UpdateManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n upsert<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteArgs<TSchema, TModelName>,\n ): Promise<number>;\n deleteMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n transaction<TResult>(\n schema: TSchema,\n run: (driver: OrmDriver<TSchema>) => Promise<TResult>,\n ): Promise<TResult>;\n}\n\nexport type ModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findOne<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindOneArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findFirst<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count(args?: CountArgs<TSchema, TModelName>): Promise<number>;\n create<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany(args: UpdateManyArgs<TSchema, TModelName>): Promise<number>;\n upsert<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;\n deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;\n};\n\nexport type BatchTask<TSchema extends SchemaDefinition<any>, TResult> = (\n tx: OrmClient<TSchema>,\n) => Promise<TResult>;\n\nexport type OrmClient<TSchema extends SchemaDefinition<any>> = {\n [K in ModelName<TSchema>]: ModelClient<TSchema, K>;\n} & {\n transaction<TResult>(run: (tx: OrmClient<TSchema>) => Promise<TResult>): Promise<TResult>;\n batch<const TResult extends readonly unknown[]>(tasks: {\n [K in keyof TResult]: BatchTask<TSchema, TResult[K]>;\n }): Promise<TResult>;\n};\n\nfunction createModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n>(\n schema: TSchema,\n driver: OrmDriver<TSchema>,\n model: TModelName,\n): ModelClient<TSchema, TModelName> {\n return {\n findMany(args) {\n return driver.findMany(schema, model, (args ?? {}) as any) as any;\n },\n findOne(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findFirst(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findUnique(args) {\n return driver.findUnique(schema, model, args as any) as any;\n },\n count(args) {\n return driver.count(schema, model, args as any);\n },\n create(args) {\n return driver.create(schema, model, args as any) as any;\n },\n createMany(args) {\n return driver.createMany(schema, model, args as any) as any;\n },\n update(args) {\n return driver.update(schema, model, args as any) as any;\n },\n updateMany(args) {\n return driver.updateMany(schema, model, args as any);\n },\n upsert(args) {\n return driver.upsert(schema, model, args as any) as any;\n },\n delete(args) {\n return driver.delete(schema, model, args as any) as any;\n },\n deleteMany(args) {\n return driver.deleteMany(schema, model, args as any);\n },\n };\n}\n\nexport function createOrm<TSchema extends SchemaDefinition<any>>(options: {\n schema: TSchema;\n driver: OrmDriver<TSchema>;\n}): OrmClient<TSchema> {\n const { schema, driver } = options;\n const models: Record<string, unknown> = {};\n\n for (const model of Object.keys(schema.models)) {\n models[model] = createModelClient(schema, driver, model as ModelName<TSchema>);\n }\n\n const orm = models as OrmClient<TSchema>;\n orm.transaction = (run) =>\n driver.transaction(schema, async (txDriver) => {\n const tx = createOrm({\n schema,\n driver: txDriver,\n });\n return run(tx);\n });\n orm.batch = async (tasks) =>\n orm.transaction(async (tx) => {\n const results: unknown[] = [];\n for (const task of tasks) {\n results.push(await task(tx));\n }\n return results as any;\n });\n return orm;\n}\n","export type ScalarKind = \"id\" | \"string\" | \"boolean\" | \"datetime\" | \"integer\" | \"json\";\n\nexport type JsonValue =\n | null\n | string\n | number\n | boolean\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type FieldReference = `${string}.${string}`;\n\nexport type FieldConfig<\n Kind extends ScalarKind = ScalarKind,\n Nullable extends boolean = boolean,\n> = {\n kind: Kind;\n nullable: Nullable;\n unique: boolean;\n defaultValue?: unknown;\n generated?: \"id\" | \"now\";\n mappedName?: string;\n references?: FieldReference;\n description?: string;\n};\n\nexport type ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Kind extends \"datetime\"\n ? Date\n : Kind extends \"integer\"\n ? number\n : JsonValue;\n\nexport type AnyFieldBuilder = FieldBuilder<ScalarKind, boolean, ScalarValue<ScalarKind>>;\n\nconst cloneField = <\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder<Kind, Nullable, Value>(config);\n\nexport class FieldBuilder<\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n> {\n readonly _tag = \"field\";\n readonly __kind?: Kind;\n readonly __nullable?: Nullable;\n readonly __value?: Value;\n\n constructor(readonly config: FieldConfig<Kind, Nullable>) {}\n\n unique() {\n return cloneField({\n ...this.config,\n unique: true,\n });\n }\n\n nullable() {\n return cloneField<Kind, true, Value>({\n ...this.config,\n nullable: true,\n });\n }\n\n default(value: unknown) {\n return cloneField({\n ...this.config,\n defaultValue: value,\n });\n }\n\n defaultNow() {\n return cloneField({\n ...this.config,\n generated: \"now\",\n });\n }\n\n references(reference: FieldReference) {\n return cloneField({\n ...this.config,\n references: reference,\n });\n }\n\n map(name: string) {\n return cloneField({\n ...this.config,\n mappedName: name,\n });\n }\n\n describe(description: string) {\n return cloneField({\n ...this.config,\n description,\n });\n }\n}\n\nexport type FieldOutput<TField> = TField extends {\n __nullable?: infer Nullable;\n __value?: infer Value;\n}\n ? Nullable extends true\n ? Value | null\n : Value\n : never;\n\nexport function id() {\n return new FieldBuilder({\n kind: \"id\",\n nullable: false,\n unique: true,\n generated: \"id\",\n });\n}\n\nexport function string() {\n return new FieldBuilder({\n kind: \"string\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function boolean() {\n return new FieldBuilder({\n kind: \"boolean\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function datetime() {\n return new FieldBuilder({\n kind: \"datetime\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function integer() {\n return new FieldBuilder({\n kind: \"integer\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function json<TValue extends JsonValue = JsonValue>() {\n return new FieldBuilder<\"json\", false, TValue>({\n kind: \"json\",\n nullable: false,\n unique: false,\n });\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, ModelConstraints, SchemaDefinition } from \"./schema\";\n\nexport type ManifestField = {\n name: string;\n column: string;\n kind: ScalarKind;\n nullable: boolean;\n unique: boolean;\n generated?: \"id\" | \"now\";\n defaultValue?: unknown;\n references?: string;\n description?: string;\n};\n\nexport type ManifestConstraint = {\n name: string;\n fields: string[];\n columns: string[];\n unique: boolean;\n};\n\nexport type ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n constraints: {\n unique: ManifestConstraint[];\n indexes: ManifestConstraint[];\n };\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\n};\n\nexport type ManifestUniqueLookup = {\n kind: \"id\" | \"field\" | \"constraint\";\n fields: ManifestField[];\n values: Record<string, unknown>;\n constraint?: ManifestConstraint;\n};\n\nconst filterOperatorKeys = new Set([\"eq\", \"contains\", \"in\", \"not\", \"gt\", \"gte\", \"lt\", \"lte\"]);\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nexport function isOperatorFilterObject(value: unknown): value is Record<string, unknown> {\n if (!isFilterObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => filterOperatorKeys.has(key));\n}\n\nexport function equalValues(left: unknown, right: unknown) {\n return isDeepStrictEqual(left, right);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isOperatorFilterObject(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 requireEqualityValues(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n) {\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 === 0) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires a unique equality filter in \"where\".`,\n );\n }\n\n const values: Record<string, unknown> = {};\n\n for (const fieldName of keys) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n values[fieldName] = value;\n }\n\n return values;\n}\n\nfunction sameFieldSet(left: string[], right: string[]) {\n return left.length === right.length && left.every((fieldName) => right.includes(fieldName));\n}\n\nexport function requireUniqueLookup(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n): ManifestUniqueLookup {\n const values = requireEqualityValues(model, where, operation);\n const keys = Object.keys(values);\n\n if (keys.length === 1) {\n const field = model.fields[keys[0]!]!;\n if (field.kind === \"id\") {\n return {\n kind: \"id\",\n fields: [field],\n values,\n };\n }\n\n if (field.unique) {\n return {\n kind: \"field\",\n fields: [field],\n values,\n };\n }\n }\n\n const constraint = model.constraints.unique.find((candidate) =>\n sameFieldSet([...candidate.fields], keys),\n );\n\n if (!constraint) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" clause to match an id field, unique field, or declared unique constraint using equality values only.`,\n );\n }\n\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, values[fieldName]]),\n ),\n constraint,\n };\n}\n\nexport function resolveRowIdentityLookup(\n model: ManifestModel,\n row: Record<string, unknown>,\n): ManifestUniqueLookup {\n const idField = model.fields.id;\n if (idField && row[idField.name] !== undefined && row[idField.name] !== null) {\n return {\n kind: \"id\",\n fields: [idField],\n values: {\n [idField.name]: row[idField.name],\n },\n };\n }\n\n const uniqueField = Object.values(model.fields).find(\n (field) => field.unique && row[field.name] !== undefined && row[field.name] !== null,\n );\n if (uniqueField) {\n return {\n kind: \"field\",\n fields: [uniqueField],\n values: {\n [uniqueField.name]: row[uniqueField.name],\n },\n };\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n constraint.fields.every(\n (fieldName) => row[fieldName] !== undefined && row[fieldName] !== null,\n )\n ) {\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, row[fieldName]]),\n ),\n constraint,\n };\n }\n }\n\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field, unique field, or declared unique constraint with non-null values for identity lookups.`,\n );\n}\n\nexport function toUniqueLookupWhere(lookup: ManifestUniqueLookup) {\n return Object.fromEntries(lookup.fields.map((field) => [field.name, lookup.values[field.name]]));\n}\n\nexport function mergeUniqueLookupCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n const output = {\n ...createData,\n };\n\n for (const field of lookup.fields) {\n const currentValue = output[field.name];\n const expectedValue = lookup.values[field.name];\n if (currentValue !== undefined && !equalValues(currentValue, expectedValue)) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires create.${field.name} to match where.${field.name}.`,\n );\n }\n output[field.name] = currentValue ?? expectedValue;\n }\n\n return output;\n}\n\nexport function validateUniqueLookupUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n for (const field of lookup.fields) {\n const nextValue = updateData[field.name];\n if (nextValue !== undefined && !equalValues(nextValue, lookup.values[field.name])) {\n throw new Error(\n `${operation} on model \"${model.name}\" cannot change the conflict field \"${field.name}\".`,\n );\n }\n }\n}\n\nfunction createConstraintName(table: string, columns: string[], suffix: \"unique\" | \"idx\") {\n const base = [table, ...columns]\n .join(\"_\")\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return `${base}_${suffix}`;\n}\n\nfunction normalizeConstraints(\n modelName: string,\n table: string,\n fields: Record<string, ManifestField>,\n constraints: ModelConstraints<any>,\n) {\n const normalize = (entries: readonly (readonly string[])[] | undefined, unique: boolean) =>\n (entries ?? []).map((entry) => {\n if (!entry.length) {\n throw new Error(\n `Model \"${modelName}\" defines an empty ${unique ? \"unique\" : \"index\"} constraint.`,\n );\n }\n\n const columns = entry.map((fieldName) => {\n const field = fields[fieldName];\n if (!field) {\n throw new Error(\n `Model \"${modelName}\" defines a ${unique ? \"unique\" : \"index\"} constraint on unknown field \"${fieldName}\".`,\n );\n }\n return field.column;\n });\n\n return {\n name: createConstraintName(table, columns, unique ? \"unique\" : \"idx\"),\n fields: [...entry],\n columns,\n unique,\n } satisfies ManifestConstraint;\n });\n\n return {\n unique: normalize(constraints.unique, true),\n indexes: normalize(constraints.indexes, false),\n };\n}\n\nexport function createManifest<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema): SchemaManifest {\n const models = Object.fromEntries(\n (Object.entries(schema.models) as Array<[string, AnyModelDefinition]>).map(\n ([name, definition]) => {\n const fields = Object.fromEntries(\n (\n Object.entries(definition.fields) as Array<\n [string, AnyModelDefinition[\"fields\"][string]]\n >\n ).map(([fieldName, field]) => [\n fieldName,\n {\n name: fieldName,\n column: field.config.mappedName ?? fieldName,\n kind: field.config.kind,\n nullable: field.config.nullable,\n unique: field.config.unique,\n generated: field.config.generated,\n defaultValue: field.config.defaultValue,\n references: field.config.references,\n description: field.config.description,\n } satisfies ManifestField,\n ]),\n );\n\n return [\n name,\n {\n name,\n table: definition.table,\n description: definition.description,\n fields,\n relations: definition.relations,\n constraints: normalizeConstraints(\n name,\n definition.table,\n fields,\n definition.constraints,\n ),\n } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\n type ManifestConstraint,\n type ManifestField,\n type ManifestModel,\n type SchemaManifest,\n} from \"./manifest\";\nimport type { SchemaDefinition } from \"./schema\";\n\nexport type PrismaGenerationOptions = {\n provider?: \"postgresql\" | \"mysql\" | \"sqlite\";\n datasourceName?: string;\n generatorName?: string;\n};\n\nexport type DrizzleGenerationOptions = {\n dialect: \"pg\" | \"mysql\" | \"sqlite\";\n};\n\nexport type SqlGenerationOptions = {\n dialect: \"postgres\" | \"mysql\" | \"sqlite\";\n};\n\nconst capitalize = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);\nconst pluralize = (value: string) => (value.endsWith(\"s\") ? value : `${value}s`);\nconst camelize = (value: string) =>\n value\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[^a-zA-Z]+/, \"\")\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n\nfunction resolveReferenceTarget(\n manifest: SchemaManifest,\n model: ManifestModel,\n foreignKey: string,\n fallbackTarget: string,\n) {\n const reference = model.fields[foreignKey]?.references;\n if (!reference) {\n return {\n targetModel: fallbackTarget,\n targetField: \"id\",\n };\n }\n\n const [targetModel, targetField = \"id\"] = reference.split(\".\");\n return {\n targetModel,\n targetField,\n };\n}\n\nfunction hasExplicitInverseRelation(\n manifest: SchemaManifest,\n modelName: string,\n sourceModel: string,\n foreignKey: string,\n) {\n const model = manifest.models[modelName];\n if (!model) return false;\n\n return Object.values(model.relations).some((relation) => {\n if (relation.target !== sourceModel) return false;\n if (relation.kind === \"belongsTo\" || relation.kind === \"manyToMany\") return false;\n return relation.foreignKey === foreignKey;\n });\n}\n\nfunction prismaType(field: ManifestField) {\n switch (field.kind) {\n case \"id\":\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"integer\":\n return \"Int\";\n case \"json\":\n return \"Json\";\n }\n}\n\nfunction drizzleConstraintProperty(constraint: ManifestConstraint) {\n return camelize(constraint.name) || \"constraint\";\n}\n\nfunction constrainedFields(model: ManifestModel) {\n return new Set(\n [...model.constraints.unique, ...model.constraints.indexes].flatMap(\n (constraint) => constraint.fields,\n ),\n );\n}\n\nfunction drizzleImports(dialect: DrizzleGenerationOptions[\"dialect\"], manifest: SchemaManifest) {\n const models = Object.values(manifest.models) as ManifestModel[];\n const needsBoolean = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"boolean\"),\n );\n const needsDate = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"datetime\"),\n );\n const needsInteger = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"integer\"),\n );\n const needsJson = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"json\"),\n );\n const needsIndexes = models.some(\n (model) => model.constraints.indexes.length || model.constraints.unique.length,\n );\n\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"integer\" : null,\n needsDate ? \"timestamp\" : null,\n needsJson ? \"jsonb\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"int\" : null,\n needsDate ? \"datetime\" : null,\n needsJson ? \"json\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n return [\n \"sqliteTable\",\n \"text\",\n \"integer\",\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n}\n\nfunction drizzleColumn(\n field: ManifestField,\n dialect: DrizzleGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n const renderDefault = () => {\n if (field.defaultValue === undefined || field.kind === \"json\") return \"\";\n return `.default(${JSON.stringify(field.defaultValue)})`;\n };\n\n if (field.kind === \"id\") {\n if (dialect === \"mysql\") {\n return `varchar(\"${field.column}\", { length: 191 }).primaryKey()`;\n }\n return `text(\"${field.column}\").primaryKey()`;\n }\n\n if (field.kind === \"string\") {\n if (dialect === \"mysql\") {\n const base =\n field.unique || field.references || options.indexed\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"integer\") {\n if (dialect === \"mysql\") {\n return `int(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `integer(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"pg\") {\n return `jsonb(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"mysql\") {\n return `json(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `text(\"${field.column}\", { mode: \"json\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n\n if (dialect === \"mysql\") {\n return `datetime(\"${field.column}\", { mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"timestamp\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `timestamp(\"${field.column}\", { withTimezone: true, mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(\n field: ManifestField,\n dialect: SqlGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n if (field.kind === \"id\") {\n return dialect === \"mysql\" ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"string\") {\n return dialect === \"mysql\" && (field.unique || field.references || options.indexed)\n ? \"varchar(191)\"\n : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (field.kind === \"integer\") {\n return \"integer\";\n }\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") return \"jsonb\";\n if (dialect === \"mysql\") return \"json\";\n return \"text\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamptz\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\n}\n\nfunction sqlCreateIndexStatement(\n dialect: SqlGenerationOptions[\"dialect\"],\n table: string,\n constraint: ManifestConstraint,\n) {\n const indexName = sqlIdentifier(dialect, constraint.name);\n const tableName = sqlIdentifier(dialect, table);\n const columns = constraint.columns.map((column) => sqlIdentifier(dialect, column)).join(\", \");\n const createKeyword = constraint.unique ? \"create unique index\" : \"create index\";\n const ifNotExists = dialect === \"mysql\" ? \"\" : \" if not exists\";\n return `${createKeyword}${ifNotExists} ${indexName} on ${tableName}(${columns});`;\n}\n\nexport function renderPrismaSchema(\n schema: SchemaDefinition<any>,\n options: PrismaGenerationOptions = {},\n) {\n const manifest = createManifest(schema);\n const provider = options.provider ?? \"postgresql\";\n const generatorName = options.generatorName ?? \"client\";\n const datasourceName = options.datasourceName ?? \"db\";\n const reverseRelations = new Map<\n string,\n Array<{ sourceModel: string; foreignKey: string; many: boolean }>\n >();\n\n for (const model of Object.values(manifest.models) as ManifestModel[]) {\n for (const field of Object.values(model.fields)) {\n if (!field.references) continue;\n const [targetModel] = field.references.split(\".\");\n reverseRelations.set(targetModel, [\n ...(reverseRelations.get(targetModel) ?? []),\n {\n sourceModel: model.name,\n foreignKey: field.name,\n many: !field.unique,\n },\n ]);\n }\n }\n\n const blocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const lines: string[] = [];\n const modelName = capitalize(model.name);\n const relationFieldNames = new Set<string>();\n const handledForeignKeys = new Set<string>();\n\n for (const field of Object.values(model.fields)) {\n const fieldType = prismaType(field);\n const modifiers: string[] = [];\n if (field.kind === \"id\") modifiers.push(\"@id\");\n if (field.generated === \"id\") modifiers.push(\"@default(cuid())\");\n if (field.generated === \"now\") modifiers.push(\"@default(now())\");\n if (\n field.defaultValue !== undefined &&\n field.generated === undefined &&\n field.kind !== \"json\"\n ) {\n modifiers.push(\n typeof field.defaultValue === \"string\"\n ? `@default(\"${field.defaultValue}\")`\n : `@default(${String(field.defaultValue)})`,\n );\n }\n if (field.unique && field.kind !== \"id\") modifiers.push(\"@unique\");\n if (field.column !== field.name) modifiers.push(`@map(\"${field.column}\")`);\n\n lines.push(\n ` ${field.name} ${fieldType}${field.nullable ? \"?\" : \"\"}${modifiers.length ? ` ${modifiers.join(\" \")}` : \"\"}`,\n );\n }\n\n for (const [relationName, relation] of Object.entries(model.relations)) {\n if (relation.kind === \"manyToMany\") continue;\n\n relationFieldNames.add(relationName);\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n handledForeignKeys.add(relation.foreignKey);\n lines.push(\n ` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`,\n );\n continue;\n }\n\n if (relation.kind === \"hasOne\") {\n lines.push(` ${relationName} ${capitalize(relation.target)}?`);\n continue;\n }\n\n lines.push(` ${relationName} ${capitalize(relation.target)}[]`);\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.references || handledForeignKeys.has(field.name)) continue;\n const [targetModel, targetField] = field.references.split(\".\");\n if (relationFieldNames.has(targetModel)) continue;\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n if (\n hasExplicitInverseRelation(manifest, model.name, relation.sourceModel, relation.foreignKey)\n ) {\n continue;\n }\n\n const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;\n if (relationFieldNames.has(relationName)) continue;\n lines.push(\n relation.many\n ? ` ${relationName} ${capitalize(relation.sourceModel)}[]`\n : ` ${relationName} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const modelLines = [\n ...lines,\n ...model.constraints.unique.map(\n (constraint) => ` @@unique([${constraint.fields.join(\", \")}])`,\n ),\n ...model.constraints.indexes.map(\n (constraint) => ` @@index([${constraint.fields.join(\", \")}])`,\n ),\n ...(model.table !== modelName ? [` @@map(\"${model.table}\")`] : []),\n ];\n\n return `model ${modelName} {\\n${modelLines.join(\"\\n\")}\\n}`;\n });\n\n return (\n `generator ${generatorName} {\\n provider = \"prisma-client-js\"\\n}\\n\\n` +\n `datasource ${datasourceName} {\\n provider = \"${provider}\"\\n url = ${\n provider === \"sqlite\" ? '\"file:./dev.db\"' : 'env(\"DATABASE_URL\")'\n }\\n}\\n\\n${blocks.join(\"\\n\\n\")}\\n`\n );\n}\n\nexport function renderDrizzleSchema(\n schema: SchemaDefinition<any>,\n options: DrizzleGenerationOptions,\n) {\n const manifest = createManifest(schema);\n const coreImports = drizzleImports(options.dialect, manifest).join(\", \");\n const tableFactory =\n options.dialect === \"pg\"\n ? \"pgTable\"\n : options.dialect === \"mysql\"\n ? \"mysqlTable\"\n : \"sqliteTable\";\n\n const modelBlocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const indexedFields = constrainedFields(model);\n const lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect, { indexed: indexedFields.has(field.name) });\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n value += `.references(() => ${targetModel}.${targetField})`;\n }\n return ` ${field.name}: ${value}`;\n });\n\n const constraintLines = [\n ...model.constraints.unique.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: uniqueIndex(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ...model.constraints.indexes.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: index(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ];\n\n if (!constraintLines.length) {\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n }\n\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n}, (table) => ({\\n${constraintLines.join(\",\\n\")}\\n}));`;\n });\n\n const relationBlocks = (Object.values(manifest.models) as ManifestModel[])\n .map((model) => {\n const lines = Object.entries(model.relations)\n .flatMap(([relationName, relation]) => {\n if (relation.kind === \"manyToMany\") {\n return [];\n }\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n return [\n ` ${relationName}: one(${relation.target}, { fields: [${model.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`,\n ];\n }\n\n if (relation.kind === \"hasOne\") {\n return [` ${relationName}: one(${relation.target})`];\n }\n\n return [` ${relationName}: many(${relation.target})`];\n })\n .filter(Boolean);\n\n if (!lines.length) return null;\n\n return `export const ${model.name}Relations = relations(${model.name}, ({ one, many }) => ({\\n${lines.join(\",\\n\")}\\n}));`;\n })\n .filter(Boolean);\n\n const imports = [\n `import { ${coreImports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";`,\n relationBlocks.length ? `import { relations } from \"drizzle-orm\";` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return `${imports}\\n\\n${[...modelBlocks, ...relationBlocks].join(\"\\n\\n\")}\\n`;\n}\n\nexport function renderSafeSql(schema: SchemaDefinition<any>, options: SqlGenerationOptions) {\n const manifest = createManifest(schema);\n const statements = (Object.values(manifest.models) as ManifestModel[]).flatMap((model) => {\n const indexedFields = constrainedFields(model);\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect, {\n indexed: indexedFields.has(field.name),\n })}`,\n ];\n if (field.kind === \"id\") parts.push(\"primary key\");\n if (!field.nullable) parts.push(\"not null\");\n if (field.unique && field.kind !== \"id\") parts.push(\"unique\");\n if (field.defaultValue !== undefined && field.kind !== \"json\") {\n parts.push(\n `default ${\n typeof field.defaultValue === \"string\"\n ? `'${field.defaultValue}'`\n : String(field.defaultValue)\n }`,\n );\n }\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n const targetTable = manifest.models[targetModel]?.table ?? targetModel;\n const targetColumn =\n manifest.models[targetModel]?.fields[targetField]?.column ?? targetField;\n parts.push(\n `references ${sqlIdentifier(options.dialect, targetTable)}(${sqlIdentifier(\n options.dialect,\n targetColumn,\n )})`,\n );\n }\n return ` ${parts.join(\" \")}`;\n });\n\n return [\n `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\n\")}\\n);`,\n ...model.constraints.unique.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ...model.constraints.indexes.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ];\n });\n\n return `${statements.join(\"\\n\\n\")}\\n`;\n}\n\nexport function replaceGeneratedBlock(input: { current: string; label: string; content: string }) {\n const start = `// @farming-labs/orm:start:${input.label}`;\n const end = `// @farming-labs/orm:end:${input.label}`;\n const block = `${start}\\n${input.content.trim()}\\n${end}`;\n\n if (input.current.includes(start) && input.current.includes(end)) {\n const pattern = new RegExp(`${start}[\\\\s\\\\S]*?${end}`, \"m\");\n return input.current.replace(pattern, block);\n }\n\n return `${input.current.trim()}\\n\\n${block}\\n`;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n OrmDriver,\n SelectShape,\n SelectedRecord,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n Where,\n} from \"./client\";\nimport {\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n requireUniqueLookup,\n validateUniqueLookupUpdateData,\n} from \"./manifest\";\nimport type { ModelName, RelationName, SchemaDefinition } from \"./schema\";\n\ntype MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, Array<Record<string, unknown>>>\n>;\n\nconst manifestCache = new WeakMap<object, ReturnType<typeof createManifest>>();\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 evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n const record = filter;\n\n if (\"eq\" in record && !equalValues(value, record.eq)) return false;\n if (\"not\" in record && equalValues(value, record.not)) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in record) {\n if (typeof value !== \"string\" || typeof record.contains !== \"string\") return false;\n if (!value.includes(record.contains)) return false;\n }\n if (\"gt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value > record.gt!)) return false;\n }\n if (\"gte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value >= record.gte!)) return false;\n }\n if (\"lt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value < record.lt!)) return false;\n }\n if (\"lte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value <= record.lte!)) return false;\n }\n\n return true;\n}\n\nfunction matchesWhere<TRecord extends Record<string, unknown>>(\n record: TRecord,\n where?: Where<any>,\n) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesWhere(record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateFilter(record[key], filter)) return false;\n }\n\n return true;\n}\n\nfunction applyDefault(value: unknown, field: { generated?: string; defaultValue?: unknown }) {\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 sortRows(\n rows: Array<Record<string, unknown>>,\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>,\n) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left[field];\n const b = right[field];\n if (a === b) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n return 0;\n });\n}\n\nfunction pageRows(rows: Array<Record<string, unknown>>, skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\ntype QueryArgs = {\n where?: Where<any>;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n};\n\nfunction applyQuery(rows: Array<Record<string, unknown>>, args: QueryArgs = {}) {\n const filtered = rows.filter((row) => matchesWhere(row, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n}\n\nexport function createMemoryDriver<TSchema extends SchemaDefinition<any>>(\n seed?: MemoryStore<TSchema>,\n): OrmDriver<TSchema> {\n const state: MemoryStore<TSchema> = structuredClone(seed ?? {});\n\n function getRows<TModelName extends ModelName<TSchema>>(model: TModelName) {\n const rows = state[model] ?? [];\n state[model] = rows;\n return rows;\n }\n\n function buildRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n data: Partial<Record<string, unknown>>,\n ) {\n const modelDefinition = schema.models[model];\n const nextRow: Record<string, unknown> = {};\n\n for (const [fieldName, field] of Object.entries(modelDefinition.fields) as Array<\n [string, (typeof modelDefinition.fields)[string]]\n >) {\n nextRow[fieldName] = applyDefault(data[fieldName], field.config);\n }\n\n return nextRow;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n model: TModelName,\n row: Record<string, unknown>,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[model];\n const output: Record<string, unknown> = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.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 !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n model,\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 model: TModelName,\n relationName: TRelationName,\n row: Record<string, unknown>,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[model].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item.id === foreignValue,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const throughRows = getRows(relation.through as ModelName<TSchema>).filter(\n (item) => item[relation.from] === row.id,\n );\n const targetIds = throughRows.map((item) => item[relation.to]);\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter((item) =>\n targetIds.includes(item.id),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const driver = {\n async findMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = applyQuery(getRows(model), args);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async findFirst(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindFirstArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async findUnique(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindUniqueArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async count(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args?: CountArgs<TSchema, ModelName<TSchema>>,\n ) {\n return applyQuery(getRows(model), args).length;\n },\n async create(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const nextRow = buildRow(schema, model, args.data);\n getRows(model).push(nextRow);\n return projectRow(schema, model, nextRow, args.select);\n },\n async createMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = args.data.map((entry) => buildRow(schema, model, entry));\n getRows(model).push(...rows);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async update(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (!row) return null;\n Object.assign(row, args.data);\n return projectRow(schema, model, row, args.select);\n },\n async updateMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model).filter((item) => matchesWhere(item, args.where));\n for (const row of rows) {\n Object.assign(row, args.data);\n }\n return rows.length;\n },\n async upsert(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpsertArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const lookup = requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n getManifest(schema).models[model],\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (row) {\n Object.assign(row, args.update);\n return projectRow(schema, model, row, args.select);\n }\n\n const created = buildRow(\n schema,\n model,\n mergeUniqueLookupCreateData(\n getManifest(schema).models[model],\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n getRows(model).push(created);\n return projectRow(schema, model, created, args.select);\n },\n async delete(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const index = rows.findIndex((item) => matchesWhere(item, args.where));\n if (index === -1) return 0;\n rows.splice(index, 1);\n return 1;\n },\n async deleteMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const before = rows.length;\n state[model] = rows.filter((item) => !matchesWhere(item, args.where));\n return before - (state[model]?.length ?? 0);\n },\n async transaction<TResult>(\n _schema: TSchema,\n run: (driver: OrmDriver<TSchema>) => Promise<TResult>,\n ) {\n const snapshot = structuredClone(state);\n try {\n return await run(driver);\n } catch (error) {\n Object.keys(state).forEach((key) => {\n delete state[key as ModelName<TSchema>];\n });\n Object.assign(state, snapshot);\n throw error;\n }\n },\n } as OrmDriver<TSchema>;\n\n return driver;\n}\n","export type RelationKind = \"belongsTo\" | \"hasOne\" | \"hasMany\" | \"manyToMany\";\n\nexport type RelationDefinition<\n Target extends string = string,\n Kind extends RelationKind = RelationKind,\n> = Kind extends \"manyToMany\"\n ? {\n kind: Kind;\n target: Target;\n through: string;\n from: string;\n to: string;\n }\n : {\n kind: Kind;\n target: Target;\n foreignKey: string;\n };\n\nexport type AnyRelation = RelationDefinition<string, RelationKind>;\n\nexport function belongsTo<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"belongsTo\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"belongsTo\">;\n}\n\nexport function hasOne<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasOne\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasOne\">;\n}\n\nexport function hasMany<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasMany\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasMany\">;\n}\n\nexport function manyToMany<Target extends string>(\n target: Target,\n config: {\n through: string;\n from: string;\n to: string;\n },\n) {\n return {\n kind: \"manyToMany\",\n target,\n through: config.through,\n from: config.from,\n to: config.to,\n } satisfies RelationDefinition<Target, \"manyToMany\">;\n}\n","import type { AnyFieldBuilder, FieldOutput } from \"./fields\";\nimport type { AnyRelation, RelationDefinition } from \"./relations\";\n\nexport type FieldMap = Record<string, AnyFieldBuilder>;\nexport type RelationMap = Record<string, AnyRelation>;\nexport type ConstraintFieldName<Fields extends FieldMap> = keyof Fields & string;\nexport type ConstraintFieldSet<Fields extends FieldMap> = readonly [\n ConstraintFieldName<Fields>,\n ...ConstraintFieldName<Fields>[],\n];\nexport type ModelConstraints<Fields extends FieldMap = FieldMap> = {\n readonly unique?: readonly ConstraintFieldSet<Fields>[];\n readonly indexes?: readonly ConstraintFieldSet<Fields>[];\n};\n\nexport type ModelDefinition<\n Fields extends FieldMap = FieldMap,\n Relations extends RelationMap = RelationMap,\n> = {\n readonly _tag: \"model\";\n readonly table: string;\n readonly fields: Fields;\n readonly relations: Relations;\n readonly constraints: ModelConstraints<Fields>;\n readonly description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<any, any>;\n\nexport type SchemaDefinition<\n Models extends Record<string, AnyModelDefinition> = Record<string, AnyModelDefinition>,\n> = {\n readonly _tag: \"schema\";\n readonly models: Models;\n};\n\nexport function model<Fields extends FieldMap, Relations extends RelationMap = {}>(config: {\n table: string;\n fields: Fields;\n relations?: Relations;\n constraints?: ModelConstraints<Fields>;\n description?: string;\n}): ModelDefinition<Fields, Relations> {\n return {\n _tag: \"model\",\n table: config.table,\n fields: config.fields,\n relations: (config.relations ?? {}) as Relations,\n constraints: (config.constraints ?? {}) as ModelConstraints<Fields>,\n description: config.description,\n };\n}\n\nexport function defineSchema<Models extends Record<string, AnyModelDefinition>>(\n models: Models,\n): SchemaDefinition<Models> {\n return {\n _tag: \"schema\",\n models,\n };\n}\n\nexport type SchemaModels<TSchema> = TSchema extends SchemaDefinition<infer Models> ? Models : never;\n\nexport type ModelName<TSchema> = keyof SchemaModels<TSchema> & string;\n\nexport type ModelForName<TSchema, TName extends ModelName<TSchema>> = SchemaModels<TSchema>[TName];\n\nexport type ModelFields<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"fields\"];\n\nexport type ModelRelations<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"relations\"];\n\nexport type ScalarRecord<TSchema, TName extends ModelName<TSchema>> = {\n [K in keyof ModelFields<TSchema, TName> & string]: FieldOutput<ModelFields<TSchema, TName>[K]>;\n};\n\nexport type RelationName<TSchema, TName extends ModelName<TSchema>> = keyof ModelRelations<\n TSchema,\n TName\n> &\n string;\n\nexport type RelationForName<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> = ModelRelations<TSchema, TName>[TRelationName];\n\nexport type RelationTarget<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> =\n RelationForName<TSchema, TName, TRelationName> extends RelationDefinition<infer Target, any>\n ? Extract<Target, ModelName<TSchema>>\n : never;\n"],"mappings":"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","names":["model","model","model","model","targetRows","matchedRows"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/fields.ts","../src/manifest.ts","../src/generators.ts","../src/memory.ts","../src/relations.ts","../src/schema.ts"],"sourcesContent":["import type { SchemaDefinition } from \"./schema\";\nimport type {\n ModelName,\n RelationForName,\n RelationName,\n RelationTarget,\n ScalarRecord,\n} from \"./schema\";\n\ntype Direction = \"asc\" | \"desc\";\n\ntype JsonPrimitive = null | string | number | boolean;\ntype JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\ntype Comparable = string | number | Date;\n\ntype ValueFilter<T> = T extends string\n ? T | { eq?: T; contains?: string; in?: T[]; not?: T }\n : T extends Comparable\n ? T | { eq?: T; gt?: T; gte?: T; lt?: T; lte?: T; in?: T[]; not?: T }\n : T | { eq?: T; in?: T[]; not?: T };\n\nexport type Where<TRecord extends Record<string, unknown>> = {\n [K in keyof TRecord]?: ValueFilter<TRecord[K]>;\n} & {\n AND?: Array<Where<TRecord>>;\n OR?: Array<Where<TRecord>>;\n NOT?: Where<TRecord>;\n};\n\ntype RelationQuery<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: SelectShape<TSchema, TModelName>;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\ntype RelationSelectionValue<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n> = true | RelationQuery<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>;\n\nexport type SelectShape<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n [K in\n | (keyof ScalarRecord<TSchema, TModelName> & string)\n | RelationName<TSchema, TModelName>]?: K extends RelationName<TSchema, TModelName>\n ? true | RelationQuery<TSchema, any>\n : true;\n};\n\ntype IsManyRelation<TRelation> = TRelation extends { kind: \"hasMany\" | \"manyToMany\" }\n ? true\n : false;\n\ntype DefaultSelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = ScalarRecord<TSchema, TModelName>;\n\ntype SelectedScalars<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & keyof ScalarRecord<TSchema, TModelName> as TSelect[K] extends true\n ? K\n : never]: ScalarRecord<TSchema, TModelName>[K];\n};\n\ntype RelationResult<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n TValue extends RelationSelectionValue<TSchema, TModelName, TRelationName>,\n> = TValue extends true\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>>\n : DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>> | null\n : TValue extends RelationQuery<TSchema, infer Target>\n ? Target extends ModelName<TSchema>\n ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true\n ? Array<\n SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n >\n >\n : SelectedRecord<\n TSchema,\n Target,\n TValue[\"select\"] extends SelectShape<TSchema, Target> ? TValue[\"select\"] : undefined\n > | null\n : never\n : never;\n\ntype SelectedRelations<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName>,\n> = {\n [K in keyof TSelect & RelationName<TSchema, TModelName>]: RelationResult<\n TSchema,\n TModelName,\n K,\n Extract<TSelect[K], RelationSelectionValue<TSchema, TModelName, K>>\n >;\n};\n\nexport type SelectedRecord<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n> =\n TSelect extends SelectShape<TSchema, TModelName>\n ? SelectedScalars<TSchema, TModelName, TSelect> &\n SelectedRelations<TSchema, TModelName, TSelect>\n : DefaultSelectedRecord<TSchema, TModelName>;\n\nexport type FindManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;\n take?: number;\n skip?: number;\n};\n\nexport type FindFirstArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindManyArgs<TSchema, TModelName, TSelect>;\n\nexport type FindOneArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = FindFirstArgs<TSchema, TModelName, TSelect>;\n\nexport type FindUniqueArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type CreateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n data: Array<Partial<ScalarRecord<TSchema, TModelName>>>;\n select?: TSelect;\n};\n\nexport type UpdateArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type UpdateManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n data: Partial<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type DeleteManyArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type CountArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n where?: Where<ScalarRecord<TSchema, TModelName>>;\n};\n\nexport type UpsertArgs<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n> = {\n where: Where<ScalarRecord<TSchema, TModelName>>;\n create: Partial<ScalarRecord<TSchema, TModelName>>;\n update: Partial<ScalarRecord<TSchema, TModelName>>;\n select?: TSelect;\n};\n\nexport type OrmDriverHandle<\n TKind extends string = string,\n TClient = unknown,\n TDialect extends string | undefined = string | undefined,\n> = {\n kind: TKind;\n client: TClient;\n dialect?: TDialect;\n};\n\nexport interface OrmDriver<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> {\n readonly handle: THandle;\n findMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findFirst<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args?: CountArgs<TSchema, TModelName>,\n ): Promise<number>;\n create<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: UpdateManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n upsert<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined,\n >(\n schema: TSchema,\n model: TModelName,\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteArgs<TSchema, TModelName>,\n ): Promise<number>;\n deleteMany<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n args: DeleteManyArgs<TSchema, TModelName>,\n ): Promise<number>;\n transaction<TResult>(\n schema: TSchema,\n run: (driver: OrmDriver<TSchema, THandle>) => Promise<TResult>,\n ): Promise<TResult>;\n}\n\nexport type ModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n> = {\n findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n findOne<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindOneArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findFirst<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args?: FindFirstArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n findUnique<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: FindUniqueArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n count(args?: CountArgs<TSchema, TModelName>): Promise<number>;\n create<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n createMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: CreateManyArgs<TSchema, TModelName, TSelect>,\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;\n update<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpdateArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;\n updateMany(args: UpdateManyArgs<TSchema, TModelName>): Promise<number>;\n upsert<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(\n args: UpsertArgs<TSchema, TModelName, TSelect>,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;\n delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;\n deleteMany(args: DeleteManyArgs<TSchema, TModelName>): Promise<number>;\n};\n\nexport type BatchTask<\n TSchema extends SchemaDefinition<any>,\n TResult,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> = (tx: OrmClient<TSchema, THandle>) => Promise<TResult>;\n\nexport type OrmClient<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n> = {\n [K in ModelName<TSchema>]: ModelClient<TSchema, K>;\n} & {\n $driver: THandle;\n transaction<TResult>(\n run: (tx: OrmClient<TSchema, THandle>) => Promise<TResult>,\n ): Promise<TResult>;\n batch<const TResult extends readonly unknown[]>(tasks: {\n [K in keyof TResult]: BatchTask<TSchema, TResult[K], THandle>;\n }): Promise<TResult>;\n};\n\nfunction createModelClient<\n TSchema extends SchemaDefinition<any>,\n TModelName extends ModelName<TSchema>,\n>(\n schema: TSchema,\n driver: OrmDriver<TSchema, any>,\n model: TModelName,\n): ModelClient<TSchema, TModelName> {\n return {\n findMany(args) {\n return driver.findMany(schema, model, (args ?? {}) as any) as any;\n },\n findOne(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findFirst(args) {\n return driver.findFirst(schema, model, (args ?? {}) as any) as any;\n },\n findUnique(args) {\n return driver.findUnique(schema, model, args as any) as any;\n },\n count(args) {\n return driver.count(schema, model, args as any);\n },\n create(args) {\n return driver.create(schema, model, args as any) as any;\n },\n createMany(args) {\n return driver.createMany(schema, model, args as any) as any;\n },\n update(args) {\n return driver.update(schema, model, args as any) as any;\n },\n updateMany(args) {\n return driver.updateMany(schema, model, args as any);\n },\n upsert(args) {\n return driver.upsert(schema, model, args as any) as any;\n },\n delete(args) {\n return driver.delete(schema, model, args as any) as any;\n },\n deleteMany(args) {\n return driver.deleteMany(schema, model, args as any);\n },\n };\n}\n\nexport function createOrm<\n TSchema extends SchemaDefinition<any>,\n THandle extends OrmDriverHandle = OrmDriverHandle,\n>(options: { schema: TSchema; driver: OrmDriver<TSchema, THandle> }): OrmClient<TSchema, THandle> {\n const { schema, driver } = options;\n const models: Record<string, unknown> = {};\n\n for (const model of Object.keys(schema.models)) {\n models[model] = createModelClient(schema, driver, model as ModelName<TSchema>);\n }\n\n const orm = models as OrmClient<TSchema, THandle>;\n orm.$driver = driver.handle;\n orm.transaction = (run) =>\n driver.transaction(schema, async (txDriver) => {\n const tx = createOrm({\n schema,\n driver: txDriver,\n });\n return run(tx);\n });\n orm.batch = async (tasks) =>\n orm.transaction(async (tx) => {\n const results: unknown[] = [];\n for (const task of tasks) {\n results.push(await task(tx));\n }\n return results as any;\n });\n return orm;\n}\n","export type ScalarKind = \"id\" | \"string\" | \"boolean\" | \"datetime\" | \"integer\" | \"json\";\n\nexport type JsonValue =\n | null\n | string\n | number\n | boolean\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type FieldReference = `${string}.${string}`;\n\nexport type FieldConfig<\n Kind extends ScalarKind = ScalarKind,\n Nullable extends boolean = boolean,\n> = {\n kind: Kind;\n nullable: Nullable;\n unique: boolean;\n defaultValue?: unknown;\n generated?: \"id\" | \"now\";\n mappedName?: string;\n references?: FieldReference;\n description?: string;\n};\n\nexport type ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Kind extends \"datetime\"\n ? Date\n : Kind extends \"integer\"\n ? number\n : JsonValue;\n\nexport type AnyFieldBuilder = FieldBuilder<ScalarKind, boolean, ScalarValue<ScalarKind>>;\n\nconst cloneField = <\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder<Kind, Nullable, Value>(config);\n\nexport class FieldBuilder<\n Kind extends ScalarKind,\n Nullable extends boolean = false,\n Value = ScalarValue<Kind>,\n> {\n readonly _tag = \"field\";\n readonly __kind?: Kind;\n readonly __nullable?: Nullable;\n readonly __value?: Value;\n\n constructor(readonly config: FieldConfig<Kind, Nullable>) {}\n\n unique() {\n return cloneField({\n ...this.config,\n unique: true,\n });\n }\n\n nullable() {\n return cloneField<Kind, true, Value>({\n ...this.config,\n nullable: true,\n });\n }\n\n default(value: unknown) {\n return cloneField({\n ...this.config,\n defaultValue: value,\n });\n }\n\n defaultNow() {\n return cloneField({\n ...this.config,\n generated: \"now\",\n });\n }\n\n references(reference: FieldReference) {\n return cloneField({\n ...this.config,\n references: reference,\n });\n }\n\n map(name: string) {\n return cloneField({\n ...this.config,\n mappedName: name,\n });\n }\n\n describe(description: string) {\n return cloneField({\n ...this.config,\n description,\n });\n }\n}\n\nexport type FieldOutput<TField> = TField extends {\n __nullable?: infer Nullable;\n __value?: infer Value;\n}\n ? Nullable extends true\n ? Value | null\n : Value\n : never;\n\nexport function id() {\n return new FieldBuilder({\n kind: \"id\",\n nullable: false,\n unique: true,\n generated: \"id\",\n });\n}\n\nexport function string() {\n return new FieldBuilder({\n kind: \"string\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function boolean() {\n return new FieldBuilder({\n kind: \"boolean\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function datetime() {\n return new FieldBuilder({\n kind: \"datetime\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function integer() {\n return new FieldBuilder({\n kind: \"integer\",\n nullable: false,\n unique: false,\n });\n}\n\nexport function json<TValue extends JsonValue = JsonValue>() {\n return new FieldBuilder<\"json\", false, TValue>({\n kind: \"json\",\n nullable: false,\n unique: false,\n });\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, ModelConstraints, SchemaDefinition } from \"./schema\";\n\nexport type ManifestField = {\n name: string;\n column: string;\n kind: ScalarKind;\n nullable: boolean;\n unique: boolean;\n generated?: \"id\" | \"now\";\n defaultValue?: unknown;\n references?: string;\n description?: string;\n};\n\nexport type ManifestConstraint = {\n name: string;\n fields: string[];\n columns: string[];\n unique: boolean;\n};\n\nexport type ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n constraints: {\n unique: ManifestConstraint[];\n indexes: ManifestConstraint[];\n };\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\n};\n\nexport type ManifestUniqueLookup = {\n kind: \"id\" | \"field\" | \"constraint\";\n fields: ManifestField[];\n values: Record<string, unknown>;\n constraint?: ManifestConstraint;\n};\n\nconst filterOperatorKeys = new Set([\"eq\", \"contains\", \"in\", \"not\", \"gt\", \"gte\", \"lt\", \"lte\"]);\n\nfunction isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\n}\n\nexport function isOperatorFilterObject(value: unknown): value is Record<string, unknown> {\n if (!isFilterObject(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => filterOperatorKeys.has(key));\n}\n\nexport function equalValues(left: unknown, right: unknown) {\n return isDeepStrictEqual(left, right);\n}\n\nfunction extractEqualityValue(filter: unknown) {\n if (!isOperatorFilterObject(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 requireEqualityValues(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n) {\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 === 0) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires a unique equality filter in \"where\".`,\n );\n }\n\n const values: Record<string, unknown> = {};\n\n for (const fieldName of keys) {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n values[fieldName] = value;\n }\n\n return values;\n}\n\nfunction sameFieldSet(left: string[], right: string[]) {\n return left.length === right.length && left.every((fieldName) => right.includes(fieldName));\n}\n\nexport function requireUniqueLookup(\n model: ManifestModel,\n where: Record<string, unknown>,\n operation: string,\n): ManifestUniqueLookup {\n const values = requireEqualityValues(model, where, operation);\n const keys = Object.keys(values);\n\n if (keys.length === 1) {\n const field = model.fields[keys[0]!]!;\n if (field.kind === \"id\") {\n return {\n kind: \"id\",\n fields: [field],\n values,\n };\n }\n\n if (field.unique) {\n return {\n kind: \"field\",\n fields: [field],\n values,\n };\n }\n }\n\n const constraint = model.constraints.unique.find((candidate) =>\n sameFieldSet([...candidate.fields], keys),\n );\n\n if (!constraint) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires the \"where\" clause to match an id field, unique field, or declared unique constraint using equality values only.`,\n );\n }\n\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, values[fieldName]]),\n ),\n constraint,\n };\n}\n\nexport function resolveRowIdentityLookup(\n model: ManifestModel,\n row: Record<string, unknown>,\n): ManifestUniqueLookup {\n const idField = model.fields.id;\n if (idField && row[idField.name] !== undefined && row[idField.name] !== null) {\n return {\n kind: \"id\",\n fields: [idField],\n values: {\n [idField.name]: row[idField.name],\n },\n };\n }\n\n const uniqueField = Object.values(model.fields).find(\n (field) => field.unique && row[field.name] !== undefined && row[field.name] !== null,\n );\n if (uniqueField) {\n return {\n kind: \"field\",\n fields: [uniqueField],\n values: {\n [uniqueField.name]: row[uniqueField.name],\n },\n };\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n constraint.fields.every(\n (fieldName) => row[fieldName] !== undefined && row[fieldName] !== null,\n )\n ) {\n return {\n kind: \"constraint\",\n fields: constraint.fields.map((fieldName) => model.fields[fieldName]!),\n values: Object.fromEntries(\n constraint.fields.map((fieldName) => [fieldName, row[fieldName]]),\n ),\n constraint,\n };\n }\n }\n\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field, unique field, or declared unique constraint with non-null values for identity lookups.`,\n );\n}\n\nexport function toUniqueLookupWhere(lookup: ManifestUniqueLookup) {\n return Object.fromEntries(lookup.fields.map((field) => [field.name, lookup.values[field.name]]));\n}\n\nexport function mergeUniqueLookupCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n const output = {\n ...createData,\n };\n\n for (const field of lookup.fields) {\n const currentValue = output[field.name];\n const expectedValue = lookup.values[field.name];\n if (currentValue !== undefined && !equalValues(currentValue, expectedValue)) {\n throw new Error(\n `${operation} on model \"${model.name}\" requires create.${field.name} to match where.${field.name}.`,\n );\n }\n output[field.name] = currentValue ?? expectedValue;\n }\n\n return output;\n}\n\nexport function validateUniqueLookupUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n lookup: ManifestUniqueLookup,\n operation: string,\n) {\n for (const field of lookup.fields) {\n const nextValue = updateData[field.name];\n if (nextValue !== undefined && !equalValues(nextValue, lookup.values[field.name])) {\n throw new Error(\n `${operation} on model \"${model.name}\" cannot change the conflict field \"${field.name}\".`,\n );\n }\n }\n}\n\nfunction createConstraintName(table: string, columns: string[], suffix: \"unique\" | \"idx\") {\n const base = [table, ...columns]\n .join(\"_\")\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return `${base}_${suffix}`;\n}\n\nfunction normalizeConstraints(\n modelName: string,\n table: string,\n fields: Record<string, ManifestField>,\n constraints: ModelConstraints<any>,\n) {\n const normalize = (entries: readonly (readonly string[])[] | undefined, unique: boolean) =>\n (entries ?? []).map((entry) => {\n if (!entry.length) {\n throw new Error(\n `Model \"${modelName}\" defines an empty ${unique ? \"unique\" : \"index\"} constraint.`,\n );\n }\n\n const columns = entry.map((fieldName) => {\n const field = fields[fieldName];\n if (!field) {\n throw new Error(\n `Model \"${modelName}\" defines a ${unique ? \"unique\" : \"index\"} constraint on unknown field \"${fieldName}\".`,\n );\n }\n return field.column;\n });\n\n return {\n name: createConstraintName(table, columns, unique ? \"unique\" : \"idx\"),\n fields: [...entry],\n columns,\n unique,\n } satisfies ManifestConstraint;\n });\n\n return {\n unique: normalize(constraints.unique, true),\n indexes: normalize(constraints.indexes, false),\n };\n}\n\nexport function createManifest<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema): SchemaManifest {\n const models = Object.fromEntries(\n (Object.entries(schema.models) as Array<[string, AnyModelDefinition]>).map(\n ([name, definition]) => {\n const fields = Object.fromEntries(\n (\n Object.entries(definition.fields) as Array<\n [string, AnyModelDefinition[\"fields\"][string]]\n >\n ).map(([fieldName, field]) => [\n fieldName,\n {\n name: fieldName,\n column: field.config.mappedName ?? fieldName,\n kind: field.config.kind,\n nullable: field.config.nullable,\n unique: field.config.unique,\n generated: field.config.generated,\n defaultValue: field.config.defaultValue,\n references: field.config.references,\n description: field.config.description,\n } satisfies ManifestField,\n ]),\n );\n\n return [\n name,\n {\n name,\n table: definition.table,\n description: definition.description,\n fields,\n relations: definition.relations,\n constraints: normalizeConstraints(\n name,\n definition.table,\n fields,\n definition.constraints,\n ),\n } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\n type ManifestConstraint,\n type ManifestField,\n type ManifestModel,\n type SchemaManifest,\n} from \"./manifest\";\nimport type { SchemaDefinition } from \"./schema\";\n\nexport type PrismaGenerationOptions = {\n provider?: \"postgresql\" | \"mysql\" | \"sqlite\";\n datasourceName?: string;\n generatorName?: string;\n};\n\nexport type DrizzleGenerationOptions = {\n dialect: \"pg\" | \"mysql\" | \"sqlite\";\n};\n\nexport type SqlGenerationOptions = {\n dialect: \"postgres\" | \"mysql\" | \"sqlite\";\n};\n\nconst capitalize = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);\nconst pluralize = (value: string) => (value.endsWith(\"s\") ? value : `${value}s`);\nconst camelize = (value: string) =>\n value\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[^a-zA-Z]+/, \"\")\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n\nfunction resolveReferenceTarget(\n manifest: SchemaManifest,\n model: ManifestModel,\n foreignKey: string,\n fallbackTarget: string,\n) {\n const reference = model.fields[foreignKey]?.references;\n if (!reference) {\n return {\n targetModel: fallbackTarget,\n targetField: \"id\",\n };\n }\n\n const [targetModel, targetField = \"id\"] = reference.split(\".\");\n return {\n targetModel,\n targetField,\n };\n}\n\nfunction hasExplicitInverseRelation(\n manifest: SchemaManifest,\n modelName: string,\n sourceModel: string,\n foreignKey: string,\n) {\n const model = manifest.models[modelName];\n if (!model) return false;\n\n return Object.values(model.relations).some((relation) => {\n if (relation.target !== sourceModel) return false;\n if (relation.kind === \"belongsTo\" || relation.kind === \"manyToMany\") return false;\n return relation.foreignKey === foreignKey;\n });\n}\n\nfunction prismaType(field: ManifestField) {\n switch (field.kind) {\n case \"id\":\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"integer\":\n return \"Int\";\n case \"json\":\n return \"Json\";\n }\n}\n\nfunction drizzleConstraintProperty(constraint: ManifestConstraint) {\n return camelize(constraint.name) || \"constraint\";\n}\n\nfunction constrainedFields(model: ManifestModel) {\n return new Set(\n [...model.constraints.unique, ...model.constraints.indexes].flatMap(\n (constraint) => constraint.fields,\n ),\n );\n}\n\nfunction drizzleImports(dialect: DrizzleGenerationOptions[\"dialect\"], manifest: SchemaManifest) {\n const models = Object.values(manifest.models) as ManifestModel[];\n const needsBoolean = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"boolean\"),\n );\n const needsDate = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"datetime\"),\n );\n const needsInteger = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"integer\"),\n );\n const needsJson = models.some((model) =>\n Object.values(model.fields).some((field) => field.kind === \"json\"),\n );\n const needsIndexes = models.some(\n (model) => model.constraints.indexes.length || model.constraints.unique.length,\n );\n\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"integer\" : null,\n needsDate ? \"timestamp\" : null,\n needsJson ? \"jsonb\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsInteger ? \"int\" : null,\n needsDate ? \"datetime\" : null,\n needsJson ? \"json\" : null,\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n }\n\n return [\n \"sqliteTable\",\n \"text\",\n \"integer\",\n needsIndexes ? \"index\" : null,\n needsIndexes ? \"uniqueIndex\" : null,\n ].filter(Boolean);\n}\n\nfunction drizzleColumn(\n field: ManifestField,\n dialect: DrizzleGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n const renderDefault = () => {\n if (field.defaultValue === undefined || field.kind === \"json\") return \"\";\n return `.default(${JSON.stringify(field.defaultValue)})`;\n };\n\n if (field.kind === \"id\") {\n if (dialect === \"mysql\") {\n return `varchar(\"${field.column}\", { length: 191 }).primaryKey()`;\n }\n return `text(\"${field.column}\").primaryKey()`;\n }\n\n if (field.kind === \"string\") {\n if (dialect === \"mysql\") {\n const base =\n field.unique || field.references || options.indexed\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${renderDefault()}`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"integer\") {\n if (dialect === \"mysql\") {\n return `int(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n return `integer(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${renderDefault()}`;\n }\n\n if (field.kind === \"json\") {\n if (dialect === \"pg\") {\n return `jsonb(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"mysql\") {\n return `json(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `text(\"${field.column}\", { mode: \"json\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n\n if (dialect === \"mysql\") {\n return `datetime(\"${field.column}\", { mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"timestamp\" })${field.nullable ? \"\" : \".notNull()\"}`;\n }\n return `timestamp(\"${field.column}\", { withTimezone: true, mode: \"date\" })${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(\n field: ManifestField,\n dialect: SqlGenerationOptions[\"dialect\"],\n options: { indexed?: boolean } = {},\n) {\n if (field.kind === \"id\") {\n return dialect === \"mysql\" ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"string\") {\n return dialect === \"mysql\" && (field.unique || field.references || options.indexed)\n ? \"varchar(191)\"\n : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (field.kind === \"integer\") {\n return \"integer\";\n }\n if (field.kind === \"json\") {\n if (dialect === \"postgres\") return \"jsonb\";\n if (dialect === \"mysql\") return \"json\";\n return \"text\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamptz\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\n}\n\nfunction sqlCreateIndexStatement(\n dialect: SqlGenerationOptions[\"dialect\"],\n table: string,\n constraint: ManifestConstraint,\n) {\n const indexName = sqlIdentifier(dialect, constraint.name);\n const tableName = sqlIdentifier(dialect, table);\n const columns = constraint.columns.map((column) => sqlIdentifier(dialect, column)).join(\", \");\n const createKeyword = constraint.unique ? \"create unique index\" : \"create index\";\n const ifNotExists = dialect === \"mysql\" ? \"\" : \" if not exists\";\n return `${createKeyword}${ifNotExists} ${indexName} on ${tableName}(${columns});`;\n}\n\nexport function renderPrismaSchema(\n schema: SchemaDefinition<any>,\n options: PrismaGenerationOptions = {},\n) {\n const manifest = createManifest(schema);\n const provider = options.provider ?? \"postgresql\";\n const generatorName = options.generatorName ?? \"client\";\n const datasourceName = options.datasourceName ?? \"db\";\n const reverseRelations = new Map<\n string,\n Array<{ sourceModel: string; foreignKey: string; many: boolean }>\n >();\n\n for (const model of Object.values(manifest.models) as ManifestModel[]) {\n for (const field of Object.values(model.fields)) {\n if (!field.references) continue;\n const [targetModel] = field.references.split(\".\");\n reverseRelations.set(targetModel, [\n ...(reverseRelations.get(targetModel) ?? []),\n {\n sourceModel: model.name,\n foreignKey: field.name,\n many: !field.unique,\n },\n ]);\n }\n }\n\n const blocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const lines: string[] = [];\n const modelName = capitalize(model.name);\n const relationFieldNames = new Set<string>();\n const handledForeignKeys = new Set<string>();\n\n for (const field of Object.values(model.fields)) {\n const fieldType = prismaType(field);\n const modifiers: string[] = [];\n if (field.kind === \"id\") modifiers.push(\"@id\");\n if (field.generated === \"id\") modifiers.push(\"@default(cuid())\");\n if (field.generated === \"now\") modifiers.push(\"@default(now())\");\n if (\n field.defaultValue !== undefined &&\n field.generated === undefined &&\n field.kind !== \"json\"\n ) {\n modifiers.push(\n typeof field.defaultValue === \"string\"\n ? `@default(\"${field.defaultValue}\")`\n : `@default(${String(field.defaultValue)})`,\n );\n }\n if (field.unique && field.kind !== \"id\") modifiers.push(\"@unique\");\n if (field.column !== field.name) modifiers.push(`@map(\"${field.column}\")`);\n\n lines.push(\n ` ${field.name} ${fieldType}${field.nullable ? \"?\" : \"\"}${modifiers.length ? ` ${modifiers.join(\" \")}` : \"\"}`,\n );\n }\n\n for (const [relationName, relation] of Object.entries(model.relations)) {\n if (relation.kind === \"manyToMany\") continue;\n\n relationFieldNames.add(relationName);\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n handledForeignKeys.add(relation.foreignKey);\n lines.push(\n ` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`,\n );\n continue;\n }\n\n if (relation.kind === \"hasOne\") {\n lines.push(` ${relationName} ${capitalize(relation.target)}?`);\n continue;\n }\n\n lines.push(` ${relationName} ${capitalize(relation.target)}[]`);\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.references || handledForeignKeys.has(field.name)) continue;\n const [targetModel, targetField] = field.references.split(\".\");\n if (relationFieldNames.has(targetModel)) continue;\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n if (\n hasExplicitInverseRelation(manifest, model.name, relation.sourceModel, relation.foreignKey)\n ) {\n continue;\n }\n\n const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;\n if (relationFieldNames.has(relationName)) continue;\n lines.push(\n relation.many\n ? ` ${relationName} ${capitalize(relation.sourceModel)}[]`\n : ` ${relationName} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const modelLines = [\n ...lines,\n ...model.constraints.unique.map(\n (constraint) => ` @@unique([${constraint.fields.join(\", \")}])`,\n ),\n ...model.constraints.indexes.map(\n (constraint) => ` @@index([${constraint.fields.join(\", \")}])`,\n ),\n ...(model.table !== modelName ? [` @@map(\"${model.table}\")`] : []),\n ];\n\n return `model ${modelName} {\\n${modelLines.join(\"\\n\")}\\n}`;\n });\n\n return (\n `generator ${generatorName} {\\n provider = \"prisma-client-js\"\\n}\\n\\n` +\n `datasource ${datasourceName} {\\n provider = \"${provider}\"\\n url = ${\n provider === \"sqlite\" ? '\"file:./dev.db\"' : 'env(\"DATABASE_URL\")'\n }\\n}\\n\\n${blocks.join(\"\\n\\n\")}\\n`\n );\n}\n\nexport function renderDrizzleSchema(\n schema: SchemaDefinition<any>,\n options: DrizzleGenerationOptions,\n) {\n const manifest = createManifest(schema);\n const coreImports = drizzleImports(options.dialect, manifest).join(\", \");\n const tableFactory =\n options.dialect === \"pg\"\n ? \"pgTable\"\n : options.dialect === \"mysql\"\n ? \"mysqlTable\"\n : \"sqliteTable\";\n\n const modelBlocks = (Object.values(manifest.models) as ManifestModel[]).map((model) => {\n const indexedFields = constrainedFields(model);\n const lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect, { indexed: indexedFields.has(field.name) });\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n value += `.references(() => ${targetModel}.${targetField})`;\n }\n return ` ${field.name}: ${value}`;\n });\n\n const constraintLines = [\n ...model.constraints.unique.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: uniqueIndex(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ...model.constraints.indexes.map(\n (constraint) =>\n ` ${drizzleConstraintProperty(constraint)}: index(\"${constraint.name}\").on(${constraint.fields\n .map((fieldName) => `table.${fieldName}`)\n .join(\", \")})`,\n ),\n ];\n\n if (!constraintLines.length) {\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n }\n\n return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n}, (table) => ({\\n${constraintLines.join(\",\\n\")}\\n}));`;\n });\n\n const relationBlocks = (Object.values(manifest.models) as ManifestModel[])\n .map((model) => {\n const lines = Object.entries(model.relations)\n .flatMap(([relationName, relation]) => {\n if (relation.kind === \"manyToMany\") {\n return [];\n }\n\n if (relation.kind === \"belongsTo\") {\n const { targetField } = resolveReferenceTarget(\n manifest,\n model,\n relation.foreignKey,\n relation.target,\n );\n return [\n ` ${relationName}: one(${relation.target}, { fields: [${model.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`,\n ];\n }\n\n if (relation.kind === \"hasOne\") {\n return [` ${relationName}: one(${relation.target})`];\n }\n\n return [` ${relationName}: many(${relation.target})`];\n })\n .filter(Boolean);\n\n if (!lines.length) return null;\n\n return `export const ${model.name}Relations = relations(${model.name}, ({ one, many }) => ({\\n${lines.join(\",\\n\")}\\n}));`;\n })\n .filter(Boolean);\n\n const imports = [\n `import { ${coreImports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";`,\n relationBlocks.length ? `import { relations } from \"drizzle-orm\";` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return `${imports}\\n\\n${[...modelBlocks, ...relationBlocks].join(\"\\n\\n\")}\\n`;\n}\n\nexport function renderSafeSql(schema: SchemaDefinition<any>, options: SqlGenerationOptions) {\n const manifest = createManifest(schema);\n const statements = (Object.values(manifest.models) as ManifestModel[]).flatMap((model) => {\n const indexedFields = constrainedFields(model);\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect, {\n indexed: indexedFields.has(field.name),\n })}`,\n ];\n if (field.kind === \"id\") parts.push(\"primary key\");\n if (!field.nullable) parts.push(\"not null\");\n if (field.unique && field.kind !== \"id\") parts.push(\"unique\");\n if (field.defaultValue !== undefined && field.kind !== \"json\") {\n parts.push(\n `default ${\n typeof field.defaultValue === \"string\"\n ? `'${field.defaultValue}'`\n : String(field.defaultValue)\n }`,\n );\n }\n if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n const targetTable = manifest.models[targetModel]?.table ?? targetModel;\n const targetColumn =\n manifest.models[targetModel]?.fields[targetField]?.column ?? targetField;\n parts.push(\n `references ${sqlIdentifier(options.dialect, targetTable)}(${sqlIdentifier(\n options.dialect,\n targetColumn,\n )})`,\n );\n }\n return ` ${parts.join(\" \")}`;\n });\n\n return [\n `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\n\")}\\n);`,\n ...model.constraints.unique.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ...model.constraints.indexes.map((constraint) =>\n sqlCreateIndexStatement(options.dialect, model.table, constraint),\n ),\n ];\n });\n\n return `${statements.join(\"\\n\\n\")}\\n`;\n}\n\nexport function replaceGeneratedBlock(input: { current: string; label: string; content: string }) {\n const start = `// @farming-labs/orm:start:${input.label}`;\n const end = `// @farming-labs/orm:end:${input.label}`;\n const block = `${start}\\n${input.content.trim()}\\n${end}`;\n\n if (input.current.includes(start) && input.current.includes(end)) {\n const pattern = new RegExp(`${start}[\\\\s\\\\S]*?${end}`, \"m\");\n return input.current.replace(pattern, block);\n }\n\n return `${input.current.trim()}\\n\\n${block}\\n`;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n OrmDriver,\n OrmDriverHandle,\n SelectShape,\n SelectedRecord,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n Where,\n} from \"./client\";\nimport {\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n requireUniqueLookup,\n validateUniqueLookupUpdateData,\n} from \"./manifest\";\nimport type { ModelName, RelationName, SchemaDefinition } from \"./schema\";\n\ntype MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, Array<Record<string, unknown>>>\n>;\n\nconst manifestCache = new WeakMap<object, ReturnType<typeof createManifest>>();\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 evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n const record = filter;\n\n if (\"eq\" in record && !equalValues(value, record.eq)) return false;\n if (\"not\" in record && equalValues(value, record.not)) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in record) {\n if (typeof value !== \"string\" || typeof record.contains !== \"string\") return false;\n if (!value.includes(record.contains)) return false;\n }\n if (\"gt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value > record.gt!)) return false;\n }\n if (\"gte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value >= record.gte!)) return false;\n }\n if (\"lt\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value < record.lt!)) return false;\n }\n if (\"lte\" in record && value !== undefined) {\n if (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) {\n return false;\n }\n if (!(value <= record.lte!)) return false;\n }\n\n return true;\n}\n\nfunction matchesWhere<TRecord extends Record<string, unknown>>(\n record: TRecord,\n where?: Where<any>,\n) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause: Where<any>) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesWhere(record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateFilter(record[key], filter)) return false;\n }\n\n return true;\n}\n\nfunction applyDefault(value: unknown, field: { generated?: string; defaultValue?: unknown }) {\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 sortRows(\n rows: Array<Record<string, unknown>>,\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>,\n) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left[field];\n const b = right[field];\n if (a === b) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n return 0;\n });\n}\n\nfunction pageRows(rows: Array<Record<string, unknown>>, skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\ntype QueryArgs = {\n where?: Where<any>;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n};\n\nfunction applyQuery(rows: Array<Record<string, unknown>>, args: QueryArgs = {}) {\n const filtered = rows.filter((row) => matchesWhere(row, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n}\n\nexport function createMemoryDriver<TSchema extends SchemaDefinition<any>>(\n seed?: MemoryStore<TSchema>,\n): OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>> {\n const state: MemoryStore<TSchema> = structuredClone(seed ?? {});\n\n function getRows<TModelName extends ModelName<TSchema>>(model: TModelName) {\n const rows = state[model] ?? [];\n state[model] = rows;\n return rows;\n }\n\n function buildRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n model: TModelName,\n data: Partial<Record<string, unknown>>,\n ) {\n const modelDefinition = schema.models[model];\n const nextRow: Record<string, unknown> = {};\n\n for (const [fieldName, field] of Object.entries(modelDefinition.fields) as Array<\n [string, (typeof modelDefinition.fields)[string]]\n >) {\n nextRow[fieldName] = applyDefault(data[fieldName], field.config);\n }\n\n return nextRow;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n model: TModelName,\n row: Record<string, unknown>,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[model];\n const output: Record<string, unknown> = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.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 !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n model,\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 model: TModelName,\n relationName: TRelationName,\n row: Record<string, unknown>,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[model].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item.id === foreignValue,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(schema, relation.target as ModelName<TSchema>, target, relationArgs.select)\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter(\n (item) => item[relation.foreignKey] === row.id,\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n const throughRows = getRows(relation.through as ModelName<TSchema>).filter(\n (item) => item[relation.from] === row.id,\n );\n const targetIds = throughRows.map((item) => item[relation.to]);\n const targetRows = getRows(relation.target as ModelName<TSchema>).filter((item) =>\n targetIds.includes(item.id),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item, relationArgs.select),\n ),\n );\n }\n\n let driver!: OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>;\n\n driver = {\n handle: {\n kind: \"memory\",\n client: state,\n },\n async findMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = applyQuery(getRows(model), args);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async findFirst(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindFirstArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async findUnique(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: FindUniqueArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n const row = applyQuery(getRows(model), args)[0];\n if (!row) return null;\n return projectRow(schema, model, row, args.select);\n },\n async count(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args?: CountArgs<TSchema, ModelName<TSchema>>,\n ) {\n return applyQuery(getRows(model), args).length;\n },\n async create(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const nextRow = buildRow(schema, model, args.data);\n getRows(model).push(nextRow);\n return projectRow(schema, model, nextRow, args.select);\n },\n async createMany(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: CreateManyArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const rows = args.data.map((entry) => buildRow(schema, model, entry));\n getRows(model).push(...rows);\n return Promise.all(rows.map((row) => projectRow(schema, model, row, args.select)));\n },\n async update(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (!row) return null;\n Object.assign(row, args.data);\n return projectRow(schema, model, row, args.select);\n },\n async updateMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: UpdateManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model).filter((item) => matchesWhere(item, args.where));\n for (const row of rows) {\n Object.assign(row, args.data);\n }\n return rows.length;\n },\n async upsert(\n schema: TSchema,\n model: ModelName<TSchema>,\n args: UpsertArgs<TSchema, ModelName<TSchema>, any>,\n ) {\n const lookup = requireUniqueLookup(\n getManifest(schema).models[model],\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n getManifest(schema).models[model],\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const row = getRows(model).find((item) => matchesWhere(item, args.where));\n if (row) {\n Object.assign(row, args.update);\n return projectRow(schema, model, row, args.select);\n }\n\n const created = buildRow(\n schema,\n model,\n mergeUniqueLookupCreateData(\n getManifest(schema).models[model],\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n getRows(model).push(created);\n return projectRow(schema, model, created, args.select);\n },\n async delete(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const index = rows.findIndex((item) => matchesWhere(item, args.where));\n if (index === -1) return 0;\n rows.splice(index, 1);\n return 1;\n },\n async deleteMany(\n _schema: TSchema,\n model: ModelName<TSchema>,\n args: DeleteManyArgs<TSchema, ModelName<TSchema>>,\n ) {\n const rows = getRows(model);\n const before = rows.length;\n state[model] = rows.filter((item) => !matchesWhere(item, args.where));\n return before - (state[model]?.length ?? 0);\n },\n async transaction<TResult>(\n _schema: TSchema,\n run: (\n driver: OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>,\n ) => Promise<TResult>,\n ) {\n const snapshot = structuredClone(state);\n try {\n return await run(driver);\n } catch (error) {\n Object.keys(state).forEach((key) => {\n delete state[key as ModelName<TSchema>];\n });\n Object.assign(state, snapshot);\n throw error;\n }\n },\n } as OrmDriver<TSchema, OrmDriverHandle<\"memory\", MemoryStore<TSchema>>>;\n\n return driver;\n}\n","export type RelationKind = \"belongsTo\" | \"hasOne\" | \"hasMany\" | \"manyToMany\";\n\nexport type RelationDefinition<\n Target extends string = string,\n Kind extends RelationKind = RelationKind,\n> = Kind extends \"manyToMany\"\n ? {\n kind: Kind;\n target: Target;\n through: string;\n from: string;\n to: string;\n }\n : {\n kind: Kind;\n target: Target;\n foreignKey: string;\n };\n\nexport type AnyRelation = RelationDefinition<string, RelationKind>;\n\nexport function belongsTo<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"belongsTo\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"belongsTo\">;\n}\n\nexport function hasOne<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasOne\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasOne\">;\n}\n\nexport function hasMany<Target extends string>(target: Target, config: { foreignKey: string }) {\n return {\n kind: \"hasMany\",\n target,\n foreignKey: config.foreignKey,\n } satisfies RelationDefinition<Target, \"hasMany\">;\n}\n\nexport function manyToMany<Target extends string>(\n target: Target,\n config: {\n through: string;\n from: string;\n to: string;\n },\n) {\n return {\n kind: \"manyToMany\",\n target,\n through: config.through,\n from: config.from,\n to: config.to,\n } satisfies RelationDefinition<Target, \"manyToMany\">;\n}\n","import type { AnyFieldBuilder, FieldOutput } from \"./fields\";\nimport type { AnyRelation, RelationDefinition } from \"./relations\";\n\nexport type FieldMap = Record<string, AnyFieldBuilder>;\nexport type RelationMap = Record<string, AnyRelation>;\nexport type ConstraintFieldName<Fields extends FieldMap> = keyof Fields & string;\nexport type ConstraintFieldSet<Fields extends FieldMap> = readonly [\n ConstraintFieldName<Fields>,\n ...ConstraintFieldName<Fields>[],\n];\nexport type ModelConstraints<Fields extends FieldMap = FieldMap> = {\n readonly unique?: readonly ConstraintFieldSet<Fields>[];\n readonly indexes?: readonly ConstraintFieldSet<Fields>[];\n};\n\nexport type ModelDefinition<\n Fields extends FieldMap = FieldMap,\n Relations extends RelationMap = RelationMap,\n> = {\n readonly _tag: \"model\";\n readonly table: string;\n readonly fields: Fields;\n readonly relations: Relations;\n readonly constraints: ModelConstraints<Fields>;\n readonly description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<any, any>;\n\nexport type SchemaDefinition<\n Models extends Record<string, AnyModelDefinition> = Record<string, AnyModelDefinition>,\n> = {\n readonly _tag: \"schema\";\n readonly models: Models;\n};\n\nexport function model<Fields extends FieldMap, Relations extends RelationMap = {}>(config: {\n table: string;\n fields: Fields;\n relations?: Relations;\n constraints?: ModelConstraints<Fields>;\n description?: string;\n}): ModelDefinition<Fields, Relations> {\n return {\n _tag: \"model\",\n table: config.table,\n fields: config.fields,\n relations: (config.relations ?? {}) as Relations,\n constraints: (config.constraints ?? {}) as ModelConstraints<Fields>,\n description: config.description,\n };\n}\n\nexport function defineSchema<Models extends Record<string, AnyModelDefinition>>(\n models: Models,\n): SchemaDefinition<Models> {\n return {\n _tag: \"schema\",\n models,\n };\n}\n\nexport type SchemaModels<TSchema> = TSchema extends SchemaDefinition<infer Models> ? Models : never;\n\nexport type ModelName<TSchema> = keyof SchemaModels<TSchema> & string;\n\nexport type ModelForName<TSchema, TName extends ModelName<TSchema>> = SchemaModels<TSchema>[TName];\n\nexport type ModelFields<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"fields\"];\n\nexport type ModelRelations<TSchema, TName extends ModelName<TSchema>> = ModelForName<\n TSchema,\n TName\n>[\"relations\"];\n\nexport type ScalarRecord<TSchema, TName extends ModelName<TSchema>> = {\n [K in keyof ModelFields<TSchema, TName> & string]: FieldOutput<ModelFields<TSchema, TName>[K]>;\n};\n\nexport type RelationName<TSchema, TName extends ModelName<TSchema>> = keyof ModelRelations<\n TSchema,\n TName\n> &\n string;\n\nexport type RelationForName<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> = ModelRelations<TSchema, TName>[TRelationName];\n\nexport type RelationTarget<\n TSchema,\n TName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TName>,\n> =\n RelationForName<TSchema, TName, TRelationName> extends RelationDefinition<infer Target, any>\n ? Extract<Target, ModelName<TSchema>>\n : never;\n"],"mappings":"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","names":["model","model","model","model","targetRows","matchedRows"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/orm",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "files": [
5
5
  "dist"
6
6
  ],