| 1 | import "dotenv/config"; |
| 2 | import { closeDb, getDb } from "../src/prisma/db"; |
| 3 | |
| 4 | const 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 | |
| 31 | async 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 | |
| 93 | main() |
| 94 | .catch((error) => { |
| 95 | console.error("Seed failed:", error); |
| 96 | process.exitCode = 1; |
| 97 | }) |
| 98 | .finally(async () => { |
| 99 | await closeDb(); |
| 100 | }); |