@farming-labs/orm 0.0.2 → 0.0.3
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 +92 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +92 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -226,6 +226,29 @@ function createManifest(schema) {
|
|
|
226
226
|
// src/generators.ts
|
|
227
227
|
var capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
|
|
228
228
|
var pluralize = (value) => value.endsWith("s") ? value : `${value}s`;
|
|
229
|
+
function resolveReferenceTarget(manifest, model2, foreignKey, fallbackTarget) {
|
|
230
|
+
const reference = model2.fields[foreignKey]?.references;
|
|
231
|
+
if (!reference) {
|
|
232
|
+
return {
|
|
233
|
+
targetModel: fallbackTarget,
|
|
234
|
+
targetField: "id"
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const [targetModel, targetField = "id"] = reference.split(".");
|
|
238
|
+
return {
|
|
239
|
+
targetModel,
|
|
240
|
+
targetField
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function hasExplicitInverseRelation(manifest, modelName, sourceModel, foreignKey) {
|
|
244
|
+
const model2 = manifest.models[modelName];
|
|
245
|
+
if (!model2) return false;
|
|
246
|
+
return Object.values(model2.relations).some((relation) => {
|
|
247
|
+
if (relation.target !== sourceModel) return false;
|
|
248
|
+
if (relation.kind === "belongsTo" || relation.kind === "manyToMany") return false;
|
|
249
|
+
return relation.foreignKey === foreignKey;
|
|
250
|
+
});
|
|
251
|
+
}
|
|
229
252
|
function prismaType(field) {
|
|
230
253
|
switch (field.kind) {
|
|
231
254
|
case "id":
|
|
@@ -330,6 +353,7 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
330
353
|
...reverseRelations.get(targetModel) ?? [],
|
|
331
354
|
{
|
|
332
355
|
sourceModel: model2.name,
|
|
356
|
+
foreignKey: field.name,
|
|
333
357
|
many: !field.unique
|
|
334
358
|
}
|
|
335
359
|
]);
|
|
@@ -338,6 +362,8 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
338
362
|
const blocks = Object.values(manifest.models).map((model2) => {
|
|
339
363
|
const lines = [];
|
|
340
364
|
const modelName = capitalize(model2.name);
|
|
365
|
+
const relationFieldNames = /* @__PURE__ */ new Set();
|
|
366
|
+
const handledForeignKeys = /* @__PURE__ */ new Set();
|
|
341
367
|
for (const field of Object.values(model2.fields)) {
|
|
342
368
|
const fieldType = prismaType(field);
|
|
343
369
|
const modifiers = [];
|
|
@@ -354,16 +380,45 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
354
380
|
lines.push(
|
|
355
381
|
` ${field.name} ${fieldType}${field.nullable ? "?" : ""}${modifiers.length ? ` ${modifiers.join(" ")}` : ""}`
|
|
356
382
|
);
|
|
357
|
-
|
|
358
|
-
|
|
383
|
+
}
|
|
384
|
+
for (const [relationName, relation] of Object.entries(model2.relations)) {
|
|
385
|
+
if (relation.kind === "manyToMany") continue;
|
|
386
|
+
relationFieldNames.add(relationName);
|
|
387
|
+
if (relation.kind === "belongsTo") {
|
|
388
|
+
const { targetField } = resolveReferenceTarget(
|
|
389
|
+
manifest,
|
|
390
|
+
model2,
|
|
391
|
+
relation.foreignKey,
|
|
392
|
+
relation.target
|
|
393
|
+
);
|
|
394
|
+
handledForeignKeys.add(relation.foreignKey);
|
|
359
395
|
lines.push(
|
|
360
|
-
` ${
|
|
396
|
+
` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`
|
|
361
397
|
);
|
|
398
|
+
continue;
|
|
362
399
|
}
|
|
400
|
+
if (relation.kind === "hasOne") {
|
|
401
|
+
lines.push(` ${relationName} ${capitalize(relation.target)}?`);
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
lines.push(` ${relationName} ${capitalize(relation.target)}[]`);
|
|
405
|
+
}
|
|
406
|
+
for (const field of Object.values(model2.fields)) {
|
|
407
|
+
if (!field.references || handledForeignKeys.has(field.name)) continue;
|
|
408
|
+
const [targetModel, targetField] = field.references.split(".");
|
|
409
|
+
if (relationFieldNames.has(targetModel)) continue;
|
|
410
|
+
lines.push(
|
|
411
|
+
` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`
|
|
412
|
+
);
|
|
363
413
|
}
|
|
364
414
|
for (const relation of reverseRelations.get(model2.name) ?? []) {
|
|
415
|
+
if (hasExplicitInverseRelation(manifest, model2.name, relation.sourceModel, relation.foreignKey)) {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;
|
|
419
|
+
if (relationFieldNames.has(relationName)) continue;
|
|
365
420
|
lines.push(
|
|
366
|
-
relation.many ? ` ${
|
|
421
|
+
relation.many ? ` ${relationName} ${capitalize(relation.sourceModel)}[]` : ` ${relationName} ${capitalize(relation.sourceModel)}?`
|
|
367
422
|
);
|
|
368
423
|
}
|
|
369
424
|
const mapLine = model2.table !== modelName ? `
|
|
@@ -386,7 +441,7 @@ ${blocks.join("\n\n")}
|
|
|
386
441
|
}
|
|
387
442
|
function renderDrizzleSchema(schema, options) {
|
|
388
443
|
const manifest = createManifest(schema);
|
|
389
|
-
const
|
|
444
|
+
const coreImports = drizzleImports(options.dialect, manifest).join(", ");
|
|
390
445
|
const tableFactory = options.dialect === "pg" ? "pgTable" : options.dialect === "mysql" ? "mysqlTable" : "sqliteTable";
|
|
391
446
|
const modelBlocks = Object.values(manifest.models).map((model2) => {
|
|
392
447
|
const lines = Object.values(model2.fields).map((field) => {
|
|
@@ -401,9 +456,39 @@ function renderDrizzleSchema(schema, options) {
|
|
|
401
456
|
${lines.join(",\n")}
|
|
402
457
|
});`;
|
|
403
458
|
});
|
|
404
|
-
|
|
459
|
+
const relationBlocks = Object.values(manifest.models).map((model2) => {
|
|
460
|
+
const lines = Object.entries(model2.relations).flatMap(([relationName, relation]) => {
|
|
461
|
+
if (relation.kind === "manyToMany") {
|
|
462
|
+
return [];
|
|
463
|
+
}
|
|
464
|
+
if (relation.kind === "belongsTo") {
|
|
465
|
+
const { targetField } = resolveReferenceTarget(
|
|
466
|
+
manifest,
|
|
467
|
+
model2,
|
|
468
|
+
relation.foreignKey,
|
|
469
|
+
relation.target
|
|
470
|
+
);
|
|
471
|
+
return [
|
|
472
|
+
` ${relationName}: one(${relation.target}, { fields: [${model2.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`
|
|
473
|
+
];
|
|
474
|
+
}
|
|
475
|
+
if (relation.kind === "hasOne") {
|
|
476
|
+
return [` ${relationName}: one(${relation.target})`];
|
|
477
|
+
}
|
|
478
|
+
return [` ${relationName}: many(${relation.target})`];
|
|
479
|
+
}).filter(Boolean);
|
|
480
|
+
if (!lines.length) return null;
|
|
481
|
+
return `export const ${model2.name}Relations = relations(${model2.name}, ({ one, many }) => ({
|
|
482
|
+
${lines.join(",\n")}
|
|
483
|
+
}));`;
|
|
484
|
+
}).filter(Boolean);
|
|
485
|
+
const imports = [
|
|
486
|
+
`import { ${coreImports} } from "drizzle-orm/${options.dialect === "pg" ? "pg-core" : options.dialect === "mysql" ? "mysql-core" : "sqlite-core"}";`,
|
|
487
|
+
relationBlocks.length ? `import { relations } from "drizzle-orm";` : null
|
|
488
|
+
].filter(Boolean).join("\n");
|
|
489
|
+
return `${imports}
|
|
405
490
|
|
|
406
|
-
${modelBlocks.join("\n\n")}
|
|
491
|
+
${[...modelBlocks, ...relationBlocks].join("\n\n")}
|
|
407
492
|
`;
|
|
408
493
|
}
|
|
409
494
|
function renderSafeSql(schema, options) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 Primitive = string | number | boolean | Date | null;\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, Primitive>> = {\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\";\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 AnyFieldBuilder = FieldBuilder<ScalarKind, boolean>;\n\nconst cloneField = <Kind extends ScalarKind, Nullable extends boolean = false>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder(config);\n\nexport class FieldBuilder<Kind extends ScalarKind, Nullable extends boolean = false> {\n readonly _tag = \"field\";\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>({\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 ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Date;\n\nexport type FieldOutput<TField> =\n TField extends FieldBuilder<infer Kind, infer Nullable>\n ? Nullable extends true\n ? ScalarValue<Kind> | null\n : ScalarValue<Kind>\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","import type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, 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 ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\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 } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\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`);\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 }\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\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"timestamp\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"datetime\" : null,\n ].filter(Boolean);\n }\n\n return [\"sqliteTable\", \"text\", \"integer\"];\n}\n\nfunction drizzleColumn(field: ManifestField, dialect: DrizzleGenerationOptions[\"dialect\"]) {\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\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\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}\")${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(field: ManifestField, dialect: SqlGenerationOptions[\"dialect\"]) {\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) ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamp\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\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<string, Array<{ sourceModel: string; many: boolean }>>();\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 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\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 (field.defaultValue !== undefined && field.generated === undefined) {\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 if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n lines.push(\n relation.many\n ? ` ${pluralize(relation.sourceModel)} ${capitalize(relation.sourceModel)}[]`\n : ` ${relation.sourceModel} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const mapLine = model.table !== modelName ? `\\n @@map(\"${model.table}\")` : \"\";\n return `model ${modelName} {\\n${lines.join(\"\\n\")}${mapLine}\\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 imports = 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 lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect);\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 return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n });\n\n return `import { ${imports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";\\n\\n${modelBlocks.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[]).map((model) => {\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect)}`,\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) {\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 `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\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 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 isDate = (value: unknown): value is Date => value instanceof Date;\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (\n filter === undefined ||\n filter === null ||\n typeof filter !== \"object\" ||\n isDate(filter) ||\n Array.isArray(filter)\n ) {\n return value === filter;\n }\n\n const record = filter as Record<string, unknown>;\n\n if (\"eq\" in record && value !== record.eq) return false;\n if (\"not\" in record && value === record.not) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.includes(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 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 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(schema, model, args.create);\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>;\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 description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<FieldMap, RelationMap>;\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 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 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","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 Primitive = string | number | boolean | Date | null;\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, Primitive>> = {\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\";\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 AnyFieldBuilder = FieldBuilder<ScalarKind, boolean>;\n\nconst cloneField = <Kind extends ScalarKind, Nullable extends boolean = false>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder(config);\n\nexport class FieldBuilder<Kind extends ScalarKind, Nullable extends boolean = false> {\n readonly _tag = \"field\";\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>({\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 ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Date;\n\nexport type FieldOutput<TField> =\n TField extends FieldBuilder<infer Kind, infer Nullable>\n ? Nullable extends true\n ? ScalarValue<Kind> | null\n : ScalarValue<Kind>\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","import type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, 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 ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\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 } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\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`);\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 }\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\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"timestamp\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"datetime\" : null,\n ].filter(Boolean);\n }\n\n return [\"sqliteTable\", \"text\", \"integer\"];\n}\n\nfunction drizzleColumn(field: ManifestField, dialect: DrizzleGenerationOptions[\"dialect\"]) {\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\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\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}\")${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(field: ManifestField, dialect: SqlGenerationOptions[\"dialect\"]) {\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) ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamp\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\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 (field.defaultValue !== undefined && field.generated === undefined) {\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 mapLine = model.table !== modelName ? `\\n @@map(\"${model.table}\")` : \"\";\n return `model ${modelName} {\\n${lines.join(\"\\n\")}${mapLine}\\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 lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect);\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 return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.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[]).map((model) => {\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect)}`,\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) {\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 `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\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 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 isDate = (value: unknown): value is Date => value instanceof Date;\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (\n filter === undefined ||\n filter === null ||\n typeof filter !== \"object\" ||\n isDate(filter) ||\n Array.isArray(filter)\n ) {\n return value === filter;\n }\n\n const record = filter as Record<string, unknown>;\n\n if (\"eq\" in record && value !== record.eq) return false;\n if (\"not\" in record && value === record.not) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.includes(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 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 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(schema, model, args.create);\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>;\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 description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<FieldMap, RelationMap>;\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 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 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","targetRows","matchedRows"]}
|
package/dist/index.js
CHANGED
|
@@ -183,6 +183,29 @@ function createManifest(schema) {
|
|
|
183
183
|
// src/generators.ts
|
|
184
184
|
var capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
|
|
185
185
|
var pluralize = (value) => value.endsWith("s") ? value : `${value}s`;
|
|
186
|
+
function resolveReferenceTarget(manifest, model2, foreignKey, fallbackTarget) {
|
|
187
|
+
const reference = model2.fields[foreignKey]?.references;
|
|
188
|
+
if (!reference) {
|
|
189
|
+
return {
|
|
190
|
+
targetModel: fallbackTarget,
|
|
191
|
+
targetField: "id"
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
const [targetModel, targetField = "id"] = reference.split(".");
|
|
195
|
+
return {
|
|
196
|
+
targetModel,
|
|
197
|
+
targetField
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function hasExplicitInverseRelation(manifest, modelName, sourceModel, foreignKey) {
|
|
201
|
+
const model2 = manifest.models[modelName];
|
|
202
|
+
if (!model2) return false;
|
|
203
|
+
return Object.values(model2.relations).some((relation) => {
|
|
204
|
+
if (relation.target !== sourceModel) return false;
|
|
205
|
+
if (relation.kind === "belongsTo" || relation.kind === "manyToMany") return false;
|
|
206
|
+
return relation.foreignKey === foreignKey;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
186
209
|
function prismaType(field) {
|
|
187
210
|
switch (field.kind) {
|
|
188
211
|
case "id":
|
|
@@ -287,6 +310,7 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
287
310
|
...reverseRelations.get(targetModel) ?? [],
|
|
288
311
|
{
|
|
289
312
|
sourceModel: model2.name,
|
|
313
|
+
foreignKey: field.name,
|
|
290
314
|
many: !field.unique
|
|
291
315
|
}
|
|
292
316
|
]);
|
|
@@ -295,6 +319,8 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
295
319
|
const blocks = Object.values(manifest.models).map((model2) => {
|
|
296
320
|
const lines = [];
|
|
297
321
|
const modelName = capitalize(model2.name);
|
|
322
|
+
const relationFieldNames = /* @__PURE__ */ new Set();
|
|
323
|
+
const handledForeignKeys = /* @__PURE__ */ new Set();
|
|
298
324
|
for (const field of Object.values(model2.fields)) {
|
|
299
325
|
const fieldType = prismaType(field);
|
|
300
326
|
const modifiers = [];
|
|
@@ -311,16 +337,45 @@ function renderPrismaSchema(schema, options = {}) {
|
|
|
311
337
|
lines.push(
|
|
312
338
|
` ${field.name} ${fieldType}${field.nullable ? "?" : ""}${modifiers.length ? ` ${modifiers.join(" ")}` : ""}`
|
|
313
339
|
);
|
|
314
|
-
|
|
315
|
-
|
|
340
|
+
}
|
|
341
|
+
for (const [relationName, relation] of Object.entries(model2.relations)) {
|
|
342
|
+
if (relation.kind === "manyToMany") continue;
|
|
343
|
+
relationFieldNames.add(relationName);
|
|
344
|
+
if (relation.kind === "belongsTo") {
|
|
345
|
+
const { targetField } = resolveReferenceTarget(
|
|
346
|
+
manifest,
|
|
347
|
+
model2,
|
|
348
|
+
relation.foreignKey,
|
|
349
|
+
relation.target
|
|
350
|
+
);
|
|
351
|
+
handledForeignKeys.add(relation.foreignKey);
|
|
316
352
|
lines.push(
|
|
317
|
-
` ${
|
|
353
|
+
` ${relationName} ${capitalize(relation.target)} @relation(fields: [${relation.foreignKey}], references: [${targetField}])`
|
|
318
354
|
);
|
|
355
|
+
continue;
|
|
319
356
|
}
|
|
357
|
+
if (relation.kind === "hasOne") {
|
|
358
|
+
lines.push(` ${relationName} ${capitalize(relation.target)}?`);
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
lines.push(` ${relationName} ${capitalize(relation.target)}[]`);
|
|
362
|
+
}
|
|
363
|
+
for (const field of Object.values(model2.fields)) {
|
|
364
|
+
if (!field.references || handledForeignKeys.has(field.name)) continue;
|
|
365
|
+
const [targetModel, targetField] = field.references.split(".");
|
|
366
|
+
if (relationFieldNames.has(targetModel)) continue;
|
|
367
|
+
lines.push(
|
|
368
|
+
` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`
|
|
369
|
+
);
|
|
320
370
|
}
|
|
321
371
|
for (const relation of reverseRelations.get(model2.name) ?? []) {
|
|
372
|
+
if (hasExplicitInverseRelation(manifest, model2.name, relation.sourceModel, relation.foreignKey)) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
const relationName = relation.many ? pluralize(relation.sourceModel) : relation.sourceModel;
|
|
376
|
+
if (relationFieldNames.has(relationName)) continue;
|
|
322
377
|
lines.push(
|
|
323
|
-
relation.many ? ` ${
|
|
378
|
+
relation.many ? ` ${relationName} ${capitalize(relation.sourceModel)}[]` : ` ${relationName} ${capitalize(relation.sourceModel)}?`
|
|
324
379
|
);
|
|
325
380
|
}
|
|
326
381
|
const mapLine = model2.table !== modelName ? `
|
|
@@ -343,7 +398,7 @@ ${blocks.join("\n\n")}
|
|
|
343
398
|
}
|
|
344
399
|
function renderDrizzleSchema(schema, options) {
|
|
345
400
|
const manifest = createManifest(schema);
|
|
346
|
-
const
|
|
401
|
+
const coreImports = drizzleImports(options.dialect, manifest).join(", ");
|
|
347
402
|
const tableFactory = options.dialect === "pg" ? "pgTable" : options.dialect === "mysql" ? "mysqlTable" : "sqliteTable";
|
|
348
403
|
const modelBlocks = Object.values(manifest.models).map((model2) => {
|
|
349
404
|
const lines = Object.values(model2.fields).map((field) => {
|
|
@@ -358,9 +413,39 @@ function renderDrizzleSchema(schema, options) {
|
|
|
358
413
|
${lines.join(",\n")}
|
|
359
414
|
});`;
|
|
360
415
|
});
|
|
361
|
-
|
|
416
|
+
const relationBlocks = Object.values(manifest.models).map((model2) => {
|
|
417
|
+
const lines = Object.entries(model2.relations).flatMap(([relationName, relation]) => {
|
|
418
|
+
if (relation.kind === "manyToMany") {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
if (relation.kind === "belongsTo") {
|
|
422
|
+
const { targetField } = resolveReferenceTarget(
|
|
423
|
+
manifest,
|
|
424
|
+
model2,
|
|
425
|
+
relation.foreignKey,
|
|
426
|
+
relation.target
|
|
427
|
+
);
|
|
428
|
+
return [
|
|
429
|
+
` ${relationName}: one(${relation.target}, { fields: [${model2.name}.${relation.foreignKey}], references: [${relation.target}.${targetField}] })`
|
|
430
|
+
];
|
|
431
|
+
}
|
|
432
|
+
if (relation.kind === "hasOne") {
|
|
433
|
+
return [` ${relationName}: one(${relation.target})`];
|
|
434
|
+
}
|
|
435
|
+
return [` ${relationName}: many(${relation.target})`];
|
|
436
|
+
}).filter(Boolean);
|
|
437
|
+
if (!lines.length) return null;
|
|
438
|
+
return `export const ${model2.name}Relations = relations(${model2.name}, ({ one, many }) => ({
|
|
439
|
+
${lines.join(",\n")}
|
|
440
|
+
}));`;
|
|
441
|
+
}).filter(Boolean);
|
|
442
|
+
const imports = [
|
|
443
|
+
`import { ${coreImports} } from "drizzle-orm/${options.dialect === "pg" ? "pg-core" : options.dialect === "mysql" ? "mysql-core" : "sqlite-core"}";`,
|
|
444
|
+
relationBlocks.length ? `import { relations } from "drizzle-orm";` : null
|
|
445
|
+
].filter(Boolean).join("\n");
|
|
446
|
+
return `${imports}
|
|
362
447
|
|
|
363
|
-
${modelBlocks.join("\n\n")}
|
|
448
|
+
${[...modelBlocks, ...relationBlocks].join("\n\n")}
|
|
364
449
|
`;
|
|
365
450
|
}
|
|
366
451
|
function renderSafeSql(schema, options) {
|
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 Primitive = string | number | boolean | Date | null;\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, Primitive>> = {\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\";\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 AnyFieldBuilder = FieldBuilder<ScalarKind, boolean>;\n\nconst cloneField = <Kind extends ScalarKind, Nullable extends boolean = false>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder(config);\n\nexport class FieldBuilder<Kind extends ScalarKind, Nullable extends boolean = false> {\n readonly _tag = \"field\";\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>({\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 ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Date;\n\nexport type FieldOutput<TField> =\n TField extends FieldBuilder<infer Kind, infer Nullable>\n ? Nullable extends true\n ? ScalarValue<Kind> | null\n : ScalarValue<Kind>\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","import type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, 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 ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\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 } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\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`);\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 }\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\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"timestamp\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"datetime\" : null,\n ].filter(Boolean);\n }\n\n return [\"sqliteTable\", \"text\", \"integer\"];\n}\n\nfunction drizzleColumn(field: ManifestField, dialect: DrizzleGenerationOptions[\"dialect\"]) {\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\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\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}\")${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(field: ManifestField, dialect: SqlGenerationOptions[\"dialect\"]) {\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) ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamp\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\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<string, Array<{ sourceModel: string; many: boolean }>>();\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 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\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 (field.defaultValue !== undefined && field.generated === undefined) {\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 if (field.references) {\n const [targetModel, targetField] = field.references.split(\".\");\n lines.push(\n ` ${targetModel} ${capitalize(targetModel)} @relation(fields: [${field.name}], references: [${targetField}])`,\n );\n }\n }\n\n for (const relation of reverseRelations.get(model.name) ?? []) {\n lines.push(\n relation.many\n ? ` ${pluralize(relation.sourceModel)} ${capitalize(relation.sourceModel)}[]`\n : ` ${relation.sourceModel} ${capitalize(relation.sourceModel)}?`,\n );\n }\n\n const mapLine = model.table !== modelName ? `\\n @@map(\"${model.table}\")` : \"\";\n return `model ${modelName} {\\n${lines.join(\"\\n\")}${mapLine}\\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 imports = 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 lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect);\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 return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.join(\",\\n\")}\\n});`;\n });\n\n return `import { ${imports} } from \"drizzle-orm/${\n options.dialect === \"pg\"\n ? \"pg-core\"\n : options.dialect === \"mysql\"\n ? \"mysql-core\"\n : \"sqlite-core\"\n }\";\\n\\n${modelBlocks.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[]).map((model) => {\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect)}`,\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) {\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 `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\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 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 isDate = (value: unknown): value is Date => value instanceof Date;\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (\n filter === undefined ||\n filter === null ||\n typeof filter !== \"object\" ||\n isDate(filter) ||\n Array.isArray(filter)\n ) {\n return value === filter;\n }\n\n const record = filter as Record<string, unknown>;\n\n if (\"eq\" in record && value !== record.eq) return false;\n if (\"not\" in record && value === record.not) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.includes(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 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 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(schema, model, args.create);\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>;\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 description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<FieldMap, RelationMap>;\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 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 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","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 Primitive = string | number | boolean | Date | null;\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, Primitive>> = {\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\";\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 AnyFieldBuilder = FieldBuilder<ScalarKind, boolean>;\n\nconst cloneField = <Kind extends ScalarKind, Nullable extends boolean = false>(\n config: FieldConfig<Kind, Nullable>,\n) => new FieldBuilder(config);\n\nexport class FieldBuilder<Kind extends ScalarKind, Nullable extends boolean = false> {\n readonly _tag = \"field\";\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>({\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 ScalarValue<Kind extends ScalarKind> = Kind extends \"id\"\n ? string\n : Kind extends \"string\"\n ? string\n : Kind extends \"boolean\"\n ? boolean\n : Date;\n\nexport type FieldOutput<TField> =\n TField extends FieldBuilder<infer Kind, infer Nullable>\n ? Nullable extends true\n ? ScalarValue<Kind> | null\n : ScalarValue<Kind>\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","import type { ScalarKind } from \"./fields\";\nimport type { AnyRelation } from \"./relations\";\nimport type { AnyModelDefinition, 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 ManifestModel = {\n name: string;\n table: string;\n description?: string;\n fields: Record<string, ManifestField>;\n relations: Record<string, AnyRelation>;\n};\n\nexport type SchemaManifest = {\n models: Record<string, ManifestModel>;\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 } satisfies ManifestModel,\n ];\n },\n ),\n );\n\n return { models };\n}\n","import {\n createManifest,\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`);\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 }\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\n if (dialect === \"pg\") {\n return [\n \"pgTable\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"timestamp\" : null,\n ].filter(Boolean);\n }\n\n if (dialect === \"mysql\") {\n return [\n \"mysqlTable\",\n \"varchar\",\n \"text\",\n needsBoolean ? \"boolean\" : null,\n needsDate ? \"datetime\" : null,\n ].filter(Boolean);\n }\n\n return [\"sqliteTable\", \"text\", \"integer\"];\n}\n\nfunction drizzleColumn(field: ManifestField, dialect: DrizzleGenerationOptions[\"dialect\"]) {\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\n ? `varchar(\"${field.column}\", { length: 191 })`\n : `text(\"${field.column}\")`;\n return `${base}${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n return `text(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${field.unique ? \".unique()\" : \"\"}${\n field.defaultValue !== undefined ? `.default(${JSON.stringify(field.defaultValue)})` : \"\"\n }`;\n }\n\n if (field.kind === \"boolean\") {\n if (dialect === \"sqlite\") {\n return `integer(\"${field.column}\", { mode: \"boolean\" })${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\n }\n return `boolean(\"${field.column}\")${field.nullable ? \"\" : \".notNull()\"}${\n field.defaultValue !== undefined ? `.default(${String(field.defaultValue)})` : \"\"\n }`;\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}\")${field.nullable ? \"\" : \".notNull()\"}`;\n}\n\nfunction sqlType(field: ManifestField, dialect: SqlGenerationOptions[\"dialect\"]) {\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) ? \"varchar(191)\" : \"text\";\n }\n if (field.kind === \"boolean\") {\n return dialect === \"sqlite\" ? \"integer\" : \"boolean\";\n }\n if (dialect === \"mysql\") {\n return \"datetime\";\n }\n if (dialect === \"sqlite\") {\n return \"text\";\n }\n return \"timestamp\";\n}\n\nfunction sqlIdentifier(dialect: SqlGenerationOptions[\"dialect\"], value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value}\\``;\n }\n\n return `\"${value}\"`;\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 (field.defaultValue !== undefined && field.generated === undefined) {\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 mapLine = model.table !== modelName ? `\\n @@map(\"${model.table}\")` : \"\";\n return `model ${modelName} {\\n${lines.join(\"\\n\")}${mapLine}\\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 lines = Object.values(model.fields).map((field) => {\n let value = drizzleColumn(field, options.dialect);\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 return `export const ${model.name} = ${tableFactory}(\"${model.table}\", {\\n${lines.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[]).map((model) => {\n const columns = Object.values(model.fields).map((field) => {\n const parts = [\n `${sqlIdentifier(options.dialect, field.column)} ${sqlType(field, options.dialect)}`,\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) {\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 `create table if not exists ${sqlIdentifier(options.dialect, model.table)} (\\n${columns.join(\",\\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 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 isDate = (value: unknown): value is Date => value instanceof Date;\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (\n filter === undefined ||\n filter === null ||\n typeof filter !== \"object\" ||\n isDate(filter) ||\n Array.isArray(filter)\n ) {\n return value === filter;\n }\n\n const record = filter as Record<string, unknown>;\n\n if (\"eq\" in record && value !== record.eq) return false;\n if (\"not\" in record && value === record.not) return false;\n if (\"in\" in record) {\n const values = Array.isArray(record.in) ? record.in : [];\n if (!values.includes(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 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 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(schema, model, args.create);\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>;\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 description?: string;\n};\n\nexport type AnyModelDefinition = ModelDefinition<FieldMap, RelationMap>;\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 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 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","targetRows","matchedRows"]}
|