1import "dotenv/config";
2import { closeDb, getDb } from "../src/prisma/db";
3
4const seedUsers = [
5 {
6 email: "alice@example.com",
7 name: "Alice",
8 posts: [
9 {
10 title: "Deploying TanStack Start with Alchemy",
11 excerpt: "One stack owns Prisma Postgres, Prisma Compute, and app env.",
12 },
13 {
14 title: "Local dev without cloud credentials",
15 excerpt: "alchemy dev starts @prisma/dev and passes DATABASE_URL in.",
16 },
17 ],
18 },
19 {
20 email: "bob@example.com",
21 name: "Bob",
22 posts: [
23 {
24 title: "Prisma Next query helpers",
25 excerpt: "The route loader reads through src/prisma/queries.ts.",
26 },
27 ],
28 },
29] as const;
30
31async function main() {
32 const db = getDb();
33 const runtime = db.runtime();
34
35 for (const user of seedUsers) {
36 const existing = await runtime.execute(
37 db.sql.user
38 .select("id", "email")
39 .where((fields, fns) => fns.eq(fields.email, user.email))
40 .limit(1)
41 .build(),
42 );
43
44 const existingUser = existing[0];
45 if (existingUser) {
46 await runtime.execute(
47 db.sql.post
48 .delete()
49 .where((fields, fns) => fns.eq(fields.userId, existingUser.id))
50 .build(),
51 );
52 await runtime.execute(
53 db.sql.user
54 .delete()
55 .where((fields, fns) => fns.eq(fields.id, existingUser.id))
56 .build(),
57 );
58 }
59
60 const created = await runtime.execute(
61 db.sql.user
62 .insert({
63 email: user.email,
64 name: user.name,
65 createdAt: new Date(),
66 })
67 .returning("id", "email")
68 .build(),
69 );
70
71 const createdUser = created[0];
72 if (!createdUser) {
73 throw new Error(`Failed to seed ${user.email}`);
74 }
75
76 for (const post of user.posts) {
77 await runtime.execute(
78 db.sql.post
79 .insert({
80 title: post.title,
81 excerpt: post.excerpt,
82 userId: createdUser.id,
83 createdAt: new Date(),
84 })
85 .build(),
86 );
87 }
88 }
89
90 console.log(`Seeded ${seedUsers.length} users.`);
91}
92
93main()
94 .catch((error) => {
95 console.error("Seed failed:", error);
96 process.exitCode = 1;
97 })
98 .finally(async () => {
99 await closeDb();
100 });