import { expect, test } from "@effect/vitest";import * as Drizzle from "../src/adapters/drizzle/generate";import * as Prisma from "../src/adapters/prisma/generate";import * as TypeORM from "../src/adapters/typeorm/generate";import { type AnySchema, column, idColumn, schema, table } from "../src/schema"; const tests = [ { type: "prisma", provider: "postgresql" }, { type: "prisma", provider: "cockroachdb" }, { type: "prisma", provider: "sqlite" }, { type: "prisma", provider: "mongodb" }, { type: "drizzle-orm", provider: "postgresql", }, { type: "drizzle-orm", provider: "mysql", }, { type: "drizzle-orm", provider: "sqlite", }, { type: "typeorm", provider: "postgresql", },] as const; const testSchema = schema({ version: "1.0.0", tables: { users: table("users", { id: idColumn("id", "varchar(255)").defaultTo$("auto"), name: column("name", "varchar(255)"), email: column("email", "varchar(255)"), image: column("image", "varchar(200)").nullable().defaultTo("my-avatar"), }), accounts: table("accounts", { id: idColumn("id", "varchar(255)"), }), posts: table("posts", { id: idColumn("id", "varchar(255)").defaultTo$("auto"), authorId: column("author_id", "varchar(255)"), content: column("content", "string"), image: column("image", "binary").nullable(), }), }, relations: { users: ({ one, many }) => ({ account: one("accounts", ["id", "id"]).foreignKey(), posts: many("posts"), }), accounts: ({ one }) => ({ user: one("users"), }), posts: ({ one }) => ({ author: one("users", ["authorId", "id"]).foreignKey(), }), },}); function generateSchema( schema: AnySchema, config: (typeof tests)[number]): string { if (config.type === "prisma") { return Prisma.generateSchema(schema, config.provider); } if (config.type === "drizzle-orm") { return Drizzle.generateSchema(schema, config.provider); } if (config.type === "typeorm") { return TypeORM.generateSchema(schema, config.provider); } throw new Error(`Unsupported ORM: ${(config as any).type}`);} // UUID test schemaconst uuidSchema = schema({ version: "1.0.0", tables: { users: table("users", { id: idColumn("id", "uuid"), email: column("email", "varchar(255)"), sessionToken: column("session_token", "uuid").nullable(), }), },}); for (const item of tests) { test(`generate schema: ${item.type}`, async () => { let generated = generateSchema(testSchema, item); let file: string; if (item.type === "prisma") { file = `snapshots/generate/${item.type}.${item.provider}/schema.prisma`; generated += `\ndatasource db { provider = "${item.provider}" url = env("DATABASE_URL")}`; } else { file = `snapshots/generate/${item.type}.${item.provider}.ts`; } await expect(generated).toMatchFileSnapshot(file); }); test(`generate schema with UUID: ${item.type} (${item.provider})`, async () => { let generated = generateSchema(uuidSchema, item); let file: string; if (item.type === "prisma") { file = `snapshots/generate-uuid/${item.type}.${item.provider}/schema.prisma`; generated += `\ndatasource db { provider = "${item.provider}" url = env("DATABASE_URL")}`; } else { file = `snapshots/generate-uuid/${item.type}.${item.provider}.ts`; } await expect(generated).toMatchFileSnapshot(file); });}
import { expect, test } from "@effect/vitest";
import * as Drizzle from "../src/adapters/drizzle/generate";
import * as Prisma from "../src/adapters/prisma/generate";
import * as TypeORM from "../src/adapters/typeorm/generate";
import { type AnySchema, column, idColumn, schema, table } from "../src/schema";
const tests = [
{ type: "prisma", provider: "postgresql" },
{ type: "prisma", provider: "cockroachdb" },
{ type: "prisma", provider: "sqlite" },
{ type: "prisma", provider: "mongodb" },
{
type: "drizzle-orm",
provider: "postgresql",
},
{
type: "drizzle-orm",
provider: "mysql",
},
{
type: "drizzle-orm",
provider: "sqlite",
},
{
type: "typeorm",
provider: "postgresql",
},
] as const;
const testSchema = schema({
version: "1.0.0",
tables: {
users: table("users", {
id: idColumn("id", "varchar(255)").defaultTo$("auto"),
name: column("name", "varchar(255)"),
email: column("email", "varchar(255)"),
image: column("image", "varchar(200)").nullable().defaultTo("my-avatar"),
}),
accounts: table("accounts", {
id: idColumn("id", "varchar(255)"),
}),
posts: table("posts", {
id: idColumn("id", "varchar(255)").defaultTo$("auto"),
authorId: column("author_id", "varchar(255)"),
content: column("content", "string"),
image: column("image", "binary").nullable(),
}),
},
relations: {
users: ({ one, many }) => ({
account: one("accounts", ["id", "id"]).foreignKey(),
posts: many("posts"),
}),
accounts: ({ one }) => ({
user: one("users"),
}),
posts: ({ one }) => ({
author: one("users", ["authorId", "id"]).foreignKey(),
}),
},
});
function generateSchema(
schema: AnySchema,
config: (typeof tests)[number]
): string {
if (config.type === "prisma") {
return Prisma.generateSchema(schema, config.provider);
}
if (config.type === "drizzle-orm") {
return Drizzle.generateSchema(schema, config.provider);
}
if (config.type === "typeorm") {
return TypeORM.generateSchema(schema, config.provider);
}
throw new Error(`Unsupported ORM: ${(config as any).type}`);
}
// UUID test schema
const uuidSchema = schema({
version: "1.0.0",
tables: {
users: table("users", {
id: idColumn("id", "uuid"),
email: column("email", "varchar(255)"),
sessionToken: column("session_token", "uuid").nullable(),
}),
},
});
for (const item of tests) {
test(`generate schema: ${item.type}`, async () => {
let generated = generateSchema(testSchema, item);
let file: string;
if (item.type === "prisma") {
file = `snapshots/generate/${item.type}.${item.provider}/schema.prisma`;
generated += `\ndatasource db {
provider = "${item.provider}"
url = env("DATABASE_URL")
}`;
} else {
file = `snapshots/generate/${item.type}.${item.provider}.ts`;
}
await expect(generated).toMatchFileSnapshot(file);
});
test(`generate schema with UUID: ${item.type} (${item.provider})`, async () => {
let generated = generateSchema(uuidSchema, item);
let file: string;
if (item.type === "prisma") {
file = `snapshots/generate-uuid/${item.type}.${item.provider}/schema.prisma`;
generated += `\ndatasource db {
provider = "${item.provider}"
url = env("DATABASE_URL")
}`;
} else {
file = `snapshots/generate-uuid/${item.type}.${item.provider}.ts`;
}
await expect(generated).toMatchFileSnapshot(file);
});
}