create-prisma 0.4.1 → 0.4.2-next.37.102.1
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/README.md +50 -44
- package/dist/cli.mjs +1 -1
- package/dist/{create-H6Tk0JlE.mjs → create-DsDWZbPE.mjs} +875 -1010
- package/dist/index.d.mts +30 -39
- package/dist/index.mjs +3 -3
- package/package.json +7 -2
- package/templates/create/_shared/prisma/seed.ts.hbs +52 -0
- package/templates/create/astro/README.md.hbs +25 -15
- package/templates/create/astro/astro.config.mjs +6 -1
- package/templates/create/astro/deno.json.hbs +1 -1
- package/templates/create/astro/package.json.hbs +3 -2
- package/templates/create/astro/src/lib/prisma.ts.hbs +60 -40
- package/templates/create/astro/src/pages/api/users.ts.hbs +6 -22
- package/templates/create/astro/src/pages/index.astro.hbs +18 -55
- package/templates/create/elysia/README.md.hbs +27 -17
- package/templates/create/elysia/deno.json.hbs +1 -1
- package/templates/create/elysia/src/index.ts.hbs +15 -11
- package/templates/create/elysia/src/lib/prisma.ts.hbs +60 -43
- package/templates/create/elysia/tsconfig.json +1 -0
- package/templates/create/hono/README.md.hbs +27 -17
- package/templates/create/hono/deno.json.hbs +1 -1
- package/templates/create/hono/src/index.ts.hbs +9 -10
- package/templates/create/hono/src/lib/prisma.ts.hbs +60 -43
- package/templates/create/hono/tsconfig.json +1 -0
- package/templates/create/minimal/.yarnrc.yml.hbs +3 -0
- package/templates/create/minimal/README.md.hbs +39 -0
- package/templates/create/{turborepo → minimal}/deno.json.hbs +1 -1
- package/templates/create/minimal/package.json.hbs +13 -0
- package/templates/create/minimal/src/index.ts.hbs +43 -0
- package/templates/create/minimal/src/lib/prisma.ts.hbs +73 -0
- package/templates/create/{turborepo/apps/api → minimal}/tsconfig.json +3 -4
- package/templates/create/nest/README.md.hbs +28 -17
- package/templates/create/nest/deno.json.hbs +1 -1
- package/templates/create/nest/src/app.module.ts.hbs +5 -6
- package/templates/create/nest/src/lib/prisma.ts.hbs +60 -45
- package/templates/create/nest/src/prisma.service.ts.hbs +6 -5
- package/templates/create/nest/src/users.controller.ts.hbs +1 -2
- package/templates/create/nest/src/users.service.ts.hbs +2 -8
- package/templates/create/nest/tsconfig.json +1 -0
- package/templates/create/next/README.md.hbs +25 -13
- package/templates/create/next/deno.json.hbs +1 -1
- package/templates/create/next/src/app/page.tsx.hbs +16 -57
- package/templates/create/next/src/lib/prisma.ts.hbs +60 -40
- package/templates/create/next/tsconfig.json +1 -0
- package/templates/create/nuxt/README.md.hbs +26 -13
- package/templates/create/nuxt/app/pages/index.vue.hbs +12 -45
- package/templates/create/nuxt/deno.json.hbs +1 -1
- package/templates/create/nuxt/nuxt.config.ts +21 -0
- package/templates/create/nuxt/package.json.hbs +2 -1
- package/templates/create/nuxt/server/api/users.get.ts.hbs +4 -15
- package/templates/create/nuxt/server/utils/prisma.ts.hbs +60 -40
- package/templates/create/svelte/README.md.hbs +25 -15
- package/templates/create/svelte/deno.json.hbs +1 -1
- package/templates/create/svelte/package.json.hbs +1 -1
- package/templates/create/svelte/src/lib/server/prisma.ts.hbs +61 -41
- package/templates/create/svelte/src/routes/+page.server.ts.hbs +4 -15
- package/templates/create/svelte/src/routes/+page.svelte.hbs +13 -163
- package/templates/create/svelte/vite.config.ts +2 -1
- package/templates/create/tanstack-start/README.md.hbs +26 -13
- package/templates/create/tanstack-start/deno.json.hbs +1 -2
- package/templates/create/tanstack-start/package.json.hbs +1 -2
- package/templates/create/tanstack-start/src/lib/prisma.server.ts.hbs +60 -40
- package/templates/create/tanstack-start/src/routes/__root.tsx.hbs +2 -3
- package/templates/create/tanstack-start/src/routes/index.tsx.hbs +26 -77
- package/templates/create/tanstack-start/tsconfig.json +1 -0
- package/templates/create/tanstack-start/vite.config.ts +7 -1
- package/templates/create/astro/prisma/schema.prisma.hbs +0 -21
- package/templates/create/astro/prisma/seed.ts.hbs +0 -38
- package/templates/create/astro/prisma.config.ts +0 -13
- package/templates/create/elysia/prisma/schema.prisma.hbs +0 -25
- package/templates/create/elysia/prisma/seed.ts.hbs +0 -42
- package/templates/create/elysia/prisma.config.ts.hbs +0 -15
- package/templates/create/hono/prisma/schema.prisma.hbs +0 -25
- package/templates/create/hono/prisma/seed.ts.hbs +0 -42
- package/templates/create/hono/prisma.config.ts.hbs +0 -15
- package/templates/create/nest/prisma/schema.prisma.hbs +0 -25
- package/templates/create/nest/prisma/seed.ts.hbs +0 -44
- package/templates/create/nest/prisma.config.ts.hbs +0 -15
- package/templates/create/next/prisma/schema.prisma.hbs +0 -21
- package/templates/create/next/prisma/seed.ts.hbs +0 -38
- package/templates/create/next/prisma.config.ts +0 -13
- package/templates/create/nuxt/prisma/schema.prisma.hbs +0 -21
- package/templates/create/nuxt/prisma/seed.ts.hbs +0 -38
- package/templates/create/nuxt/prisma.config.ts +0 -13
- package/templates/create/svelte/prisma/schema.prisma.hbs +0 -21
- package/templates/create/svelte/prisma/seed.ts.hbs +0 -87
- package/templates/create/svelte/prisma.config.ts +0 -13
- package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -21
- package/templates/create/tanstack-start/prisma/seed.ts.hbs +0 -37
- package/templates/create/tanstack-start/prisma.config.ts +0 -13
- package/templates/create/turborepo/README.md.hbs +0 -29
- package/templates/create/turborepo/apps/api/package.json.hbs +0 -19
- package/templates/create/turborepo/apps/api/src/index.ts.hbs +0 -51
- package/templates/create/turborepo/package.json.hbs +0 -24
- package/templates/create/turborepo/packages/db/package.json.hbs +0 -17
- package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +0 -21
- package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +0 -38
- package/templates/create/turborepo/packages/db/prisma.config.ts +0 -13
- package/templates/create/turborepo/packages/db/src/client.ts.hbs +0 -58
- package/templates/create/turborepo/packages/db/src/index.ts +0 -2
- package/templates/create/turborepo/packages/db/tsconfig.json +0 -15
- package/templates/create/turborepo/turbo.json +0 -28
- /package/templates/create/{turborepo → elysia}/.yarnrc.yml.hbs +0 -0
package/dist/index.d.mts
CHANGED
|
@@ -177,13 +177,12 @@ type ErrorMap = { [key in ORPCErrorCode]?: ErrorMapItem<AnySchema> };
|
|
|
177
177
|
type MergedErrorMap<T1 extends ErrorMap, T2 extends ErrorMap> = Omit<T1, keyof T2> & T2;
|
|
178
178
|
//#endregion
|
|
179
179
|
//#region src/types.d.ts
|
|
180
|
-
declare const DatabaseProviderSchema: z.ZodEnum<{
|
|
180
|
+
declare const DatabaseProviderSchema: z.ZodPipe<z.ZodEnum<{
|
|
181
|
+
postgres: "postgres";
|
|
181
182
|
postgresql: "postgresql";
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
cockroachdb: "cockroachdb";
|
|
186
|
-
}>;
|
|
183
|
+
mongo: "mongo";
|
|
184
|
+
mongodb: "mongodb";
|
|
185
|
+
}>, z.ZodTransform<"postgres" | "mongo", "postgres" | "postgresql" | "mongo" | "mongodb">>;
|
|
187
186
|
declare const PackageManagerSchema: z.ZodEnum<{
|
|
188
187
|
npm: "npm";
|
|
189
188
|
pnpm: "pnpm";
|
|
@@ -191,11 +190,12 @@ declare const PackageManagerSchema: z.ZodEnum<{
|
|
|
191
190
|
bun: "bun";
|
|
192
191
|
deno: "deno";
|
|
193
192
|
}>;
|
|
194
|
-
declare const
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
declare const AuthoringStyleSchema: z.ZodEnum<{
|
|
194
|
+
psl: "psl";
|
|
195
|
+
typescript: "typescript";
|
|
197
196
|
}>;
|
|
198
197
|
declare const CreateTemplateSchema: z.ZodEnum<{
|
|
198
|
+
minimal: "minimal";
|
|
199
199
|
hono: "hono";
|
|
200
200
|
elysia: "elysia";
|
|
201
201
|
nest: "nest";
|
|
@@ -204,18 +204,20 @@ declare const CreateTemplateSchema: z.ZodEnum<{
|
|
|
204
204
|
astro: "astro";
|
|
205
205
|
nuxt: "nuxt";
|
|
206
206
|
"tanstack-start": "tanstack-start";
|
|
207
|
-
turborepo: "turborepo";
|
|
208
207
|
}>;
|
|
209
208
|
declare const DatabaseUrlSchema: z.ZodString;
|
|
210
209
|
declare const CreateCommandInputSchema: z.ZodObject<{
|
|
211
210
|
yes: z.ZodOptional<z.ZodBoolean>;
|
|
212
211
|
verbose: z.ZodOptional<z.ZodBoolean>;
|
|
213
|
-
provider: z.ZodOptional<z.ZodEnum<{
|
|
212
|
+
provider: z.ZodOptional<z.ZodPipe<z.ZodEnum<{
|
|
213
|
+
postgres: "postgres";
|
|
214
214
|
postgresql: "postgresql";
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
215
|
+
mongo: "mongo";
|
|
216
|
+
mongodb: "mongodb";
|
|
217
|
+
}>, z.ZodTransform<"postgres" | "mongo", "postgres" | "postgresql" | "mongo" | "mongodb">>>;
|
|
218
|
+
authoring: z.ZodOptional<z.ZodEnum<{
|
|
219
|
+
psl: "psl";
|
|
220
|
+
typescript: "typescript";
|
|
219
221
|
}>>;
|
|
220
222
|
packageManager: z.ZodOptional<z.ZodEnum<{
|
|
221
223
|
npm: "npm";
|
|
@@ -227,13 +229,10 @@ declare const CreateCommandInputSchema: z.ZodObject<{
|
|
|
227
229
|
prismaPostgres: z.ZodOptional<z.ZodBoolean>;
|
|
228
230
|
databaseUrl: z.ZodOptional<z.ZodString>;
|
|
229
231
|
install: z.ZodOptional<z.ZodBoolean>;
|
|
230
|
-
|
|
231
|
-
schemaPreset: z.ZodOptional<z.ZodEnum<{
|
|
232
|
-
empty: "empty";
|
|
233
|
-
basic: "basic";
|
|
234
|
-
}>>;
|
|
232
|
+
emit: z.ZodOptional<z.ZodBoolean>;
|
|
235
233
|
name: z.ZodOptional<z.ZodString>;
|
|
236
234
|
template: z.ZodOptional<z.ZodEnum<{
|
|
235
|
+
minimal: "minimal";
|
|
237
236
|
hono: "hono";
|
|
238
237
|
elysia: "elysia";
|
|
239
238
|
nest: "nest";
|
|
@@ -242,11 +241,7 @@ declare const CreateCommandInputSchema: z.ZodObject<{
|
|
|
242
241
|
astro: "astro";
|
|
243
242
|
nuxt: "nuxt";
|
|
244
243
|
"tanstack-start": "tanstack-start";
|
|
245
|
-
turborepo: "turborepo";
|
|
246
244
|
}>>;
|
|
247
|
-
skills: z.ZodOptional<z.ZodBoolean>;
|
|
248
|
-
mcp: z.ZodOptional<z.ZodBoolean>;
|
|
249
|
-
extension: z.ZodOptional<z.ZodBoolean>;
|
|
250
245
|
force: z.ZodOptional<z.ZodBoolean>;
|
|
251
246
|
}, z.core.$strip>;
|
|
252
247
|
type CreateCommandInput = z.infer<typeof CreateCommandInputSchema>;
|
|
@@ -256,12 +251,15 @@ declare const router: {
|
|
|
256
251
|
create: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, zod.ZodOptional<zod.ZodObject<{
|
|
257
252
|
yes: zod.ZodOptional<zod.ZodBoolean>;
|
|
258
253
|
verbose: zod.ZodOptional<zod.ZodBoolean>;
|
|
259
|
-
provider: zod.ZodOptional<zod.ZodEnum<{
|
|
254
|
+
provider: zod.ZodOptional<zod.ZodPipe<zod.ZodEnum<{
|
|
255
|
+
postgres: "postgres";
|
|
260
256
|
postgresql: "postgresql";
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
257
|
+
mongo: "mongo";
|
|
258
|
+
mongodb: "mongodb";
|
|
259
|
+
}>, zod.ZodTransform<"postgres" | "mongo", "postgres" | "postgresql" | "mongo" | "mongodb">>>;
|
|
260
|
+
authoring: zod.ZodOptional<zod.ZodEnum<{
|
|
261
|
+
psl: "psl";
|
|
262
|
+
typescript: "typescript";
|
|
265
263
|
}>>;
|
|
266
264
|
packageManager: zod.ZodOptional<zod.ZodEnum<{
|
|
267
265
|
npm: "npm";
|
|
@@ -273,13 +271,10 @@ declare const router: {
|
|
|
273
271
|
prismaPostgres: zod.ZodOptional<zod.ZodBoolean>;
|
|
274
272
|
databaseUrl: zod.ZodOptional<zod.ZodString>;
|
|
275
273
|
install: zod.ZodOptional<zod.ZodBoolean>;
|
|
276
|
-
|
|
277
|
-
schemaPreset: zod.ZodOptional<zod.ZodEnum<{
|
|
278
|
-
empty: "empty";
|
|
279
|
-
basic: "basic";
|
|
280
|
-
}>>;
|
|
274
|
+
emit: zod.ZodOptional<zod.ZodBoolean>;
|
|
281
275
|
name: zod.ZodOptional<zod.ZodString>;
|
|
282
276
|
template: zod.ZodOptional<zod.ZodEnum<{
|
|
277
|
+
minimal: "minimal";
|
|
283
278
|
hono: "hono";
|
|
284
279
|
elysia: "elysia";
|
|
285
280
|
nest: "nest";
|
|
@@ -288,15 +283,11 @@ declare const router: {
|
|
|
288
283
|
astro: "astro";
|
|
289
284
|
nuxt: "nuxt";
|
|
290
285
|
"tanstack-start": "tanstack-start";
|
|
291
|
-
turborepo: "turborepo";
|
|
292
286
|
}>>;
|
|
293
|
-
skills: zod.ZodOptional<zod.ZodBoolean>;
|
|
294
|
-
mcp: zod.ZodOptional<zod.ZodBoolean>;
|
|
295
|
-
extension: zod.ZodOptional<zod.ZodBoolean>;
|
|
296
287
|
force: zod.ZodOptional<zod.ZodBoolean>;
|
|
297
288
|
}, zod_v4_core0.$strip>>, Schema<void, void>, MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
|
|
298
289
|
};
|
|
299
290
|
declare function createCreatePrismaCli(): trpc_cli0.TrpcCli;
|
|
300
291
|
declare function create(input?: CreateCommandInput): Promise<void>;
|
|
301
292
|
//#endregion
|
|
302
|
-
export { type CreateCommandInput, CreateCommandInputSchema, CreateTemplateSchema, DatabaseProviderSchema, DatabaseUrlSchema, PackageManagerSchema,
|
|
293
|
+
export { AuthoringStyleSchema, type CreateCommandInput, CreateCommandInputSchema, CreateTemplateSchema, DatabaseProviderSchema, DatabaseUrlSchema, PackageManagerSchema, create, createCreatePrismaCli, router };
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as
|
|
2
|
+
import { a as DatabaseProviderSchema, i as CreateTemplateSchema, n as AuthoringStyleSchema, o as DatabaseUrlSchema, r as CreateCommandInputSchema, s as PackageManagerSchema, t as runCreateCommand } from "./create-DsDWZbPE.mjs";
|
|
3
3
|
import { os } from "@orpc/server";
|
|
4
4
|
import { createCli } from "trpc-cli";
|
|
5
5
|
|
|
6
6
|
//#region src/index.ts
|
|
7
|
-
const CLI_VERSION = "0.4.1";
|
|
7
|
+
const CLI_VERSION = "0.4.2-next.37.102.1";
|
|
8
8
|
const router = os.router({ create: os.meta({
|
|
9
9
|
description: "Create a new project with Prisma setup",
|
|
10
10
|
default: true,
|
|
@@ -24,4 +24,4 @@ async function create(input = {}) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
//#endregion
|
|
27
|
-
export { CreateCommandInputSchema, CreateTemplateSchema, DatabaseProviderSchema, DatabaseUrlSchema, PackageManagerSchema,
|
|
27
|
+
export { AuthoringStyleSchema, CreateCommandInputSchema, CreateTemplateSchema, DatabaseProviderSchema, DatabaseUrlSchema, PackageManagerSchema, create, createCreatePrismaCli, router };
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-prisma",
|
|
3
|
-
"version": "0.4.1",
|
|
3
|
+
"version": "0.4.2-next.37.102.1",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "Create Prisma
|
|
5
|
+
"description": "Create Prisma Next projects with first-party templates and great DX.",
|
|
6
6
|
"homepage": "https://github.com/prisma/create-prisma",
|
|
7
7
|
"bugs": {
|
|
8
8
|
"url": "https://github.com/prisma/create-prisma/issues"
|
|
@@ -36,6 +36,9 @@
|
|
|
36
36
|
"build": "tsdown",
|
|
37
37
|
"dev": "tsdown --watch",
|
|
38
38
|
"start": "bun run ./dist/cli.mjs",
|
|
39
|
+
"test": "bun run test:unit && bun run test:e2e",
|
|
40
|
+
"test:unit": "bun test ./tests/install.test.ts ./tests/telemetry.test.ts",
|
|
41
|
+
"test:e2e": "bun test --timeout 180000 ./tests/e2e/create-prisma.e2e.test.ts",
|
|
39
42
|
"check": "bun run format:check && bun run lint",
|
|
40
43
|
"lint": "oxlint . --deny-warnings",
|
|
41
44
|
"lint:fix": "oxlint . --fix",
|
|
@@ -57,10 +60,12 @@
|
|
|
57
60
|
"zod": "^4.3.6"
|
|
58
61
|
},
|
|
59
62
|
"devDependencies": {
|
|
63
|
+
"@prisma/dev": "0.24.7",
|
|
60
64
|
"@types/bun": "^1.3.9",
|
|
61
65
|
"@types/fs-extra": "^11.0.4",
|
|
62
66
|
"@types/node": "^25.3.0",
|
|
63
67
|
"changelogithub": "^14.0.0",
|
|
68
|
+
"mongodb-memory-server": "11.1.0",
|
|
64
69
|
"oxfmt": "^0.37.0",
|
|
65
70
|
"oxlint": "^1.52.0",
|
|
66
71
|
"tsdown": "^0.20.3",
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{{#if (requiresDotenvConfigImport packageManager)}}
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
{{/if}}
|
|
4
|
+
{{#if (eq template "nuxt")}}
|
|
5
|
+
import { db } from "../server/utils/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
6
|
+
{{else}}
|
|
7
|
+
{{#if (eq template "svelte")}}
|
|
8
|
+
import { db } from "../src/lib/server/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
9
|
+
{{else}}
|
|
10
|
+
{{#if (eq template "tanstack-start")}}
|
|
11
|
+
import { db } from "../src/lib/prisma.server{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
12
|
+
{{else}}
|
|
13
|
+
import { db } from "../src/lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
14
|
+
{{/if}}
|
|
15
|
+
{{/if}}
|
|
16
|
+
{{/if}}
|
|
17
|
+
|
|
18
|
+
const seedUsers = [
|
|
19
|
+
{ email: "alice@prisma.io", username: "alice", name: "Alice" },
|
|
20
|
+
{ email: "bob@prisma.io", username: "bob", name: "Bob" },
|
|
21
|
+
{ email: "carol@prisma.io", username: "carol", name: "Carol" },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
let createdCount = 0;
|
|
25
|
+
|
|
26
|
+
{{#if (eq provider "mongo")}}
|
|
27
|
+
try {
|
|
28
|
+
for (const user of seedUsers) {
|
|
29
|
+
const existingUser = await db.orm.users.where({ email: user.email }).first();
|
|
30
|
+
if (!existingUser) {
|
|
31
|
+
createdCount += await db.orm.users.createCount([user]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
console.log(`Seeded ${createdCount} user${createdCount === 1 ? "" : "s"}.`);
|
|
36
|
+
} finally {
|
|
37
|
+
await db.close();
|
|
38
|
+
}
|
|
39
|
+
{{else}}
|
|
40
|
+
try {
|
|
41
|
+
for (const user of seedUsers) {
|
|
42
|
+
const existingUser = await db.orm.User.where({ email: user.email }).first();
|
|
43
|
+
if (!existingUser) {
|
|
44
|
+
createdCount += await db.orm.User.createCount([user]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log(`Seeded ${createdCount} user${createdCount === 1 ? "" : "s"}.`);
|
|
49
|
+
} finally {
|
|
50
|
+
await db.runtime().close();
|
|
51
|
+
}
|
|
52
|
+
{{/if}}
|
|
@@ -9,27 +9,37 @@ Generated by `create-prisma` with the Astro template.
|
|
|
9
9
|
- `{{runScriptCommand packageManager "preview"}}` - preview the production build
|
|
10
10
|
- `{{runScriptCommand packageManager "astro"}}` - run Astro CLI commands
|
|
11
11
|
|
|
12
|
-
## Prisma
|
|
12
|
+
## Prisma Next
|
|
13
13
|
|
|
14
|
-
Prisma setup is scaffolded
|
|
14
|
+
Prisma Next setup is scaffolded in:
|
|
15
15
|
|
|
16
|
-
- `prisma/
|
|
17
|
-
- `prisma
|
|
16
|
+
- `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
|
|
17
|
+
- `prisma-next.config.ts`
|
|
18
18
|
- `src/lib/prisma.ts`
|
|
19
19
|
- `src/pages/api/users.ts`
|
|
20
|
-
- `prisma.config.ts`
|
|
21
|
-
- `src/generated/prisma`
|
|
22
20
|
|
|
23
21
|
Database helper scripts are added to `package.json`:
|
|
24
22
|
|
|
25
|
-
- `
|
|
26
|
-
|
|
27
|
-
- `db:
|
|
28
|
-
- `db:
|
|
29
|
-
{{
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
- `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
|
|
24
|
+
{{#if (eq provider "mongo")}}
|
|
25
|
+
- `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
|
|
26
|
+
- `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
|
|
27
|
+
- `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
|
|
28
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
|
|
29
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
|
|
32
30
|
{{else}}
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
- `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
|
|
32
|
+
- `{{runScriptCommand packageManager "db:update"}}` - update database state manually
|
|
33
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
|
|
34
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
|
|
35
35
|
{{/if}}
|
|
36
|
+
|
|
37
|
+
- `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
|
|
38
|
+
|
|
39
|
+
For provider-specific Prisma Next reference docs, see `prisma-next.md`. Prisma Next skills live in the upstream `skills/` directory: https://github.com/prisma/prisma-next/tree/main/skills.
|
|
40
|
+
The Astro Vite dev server also auto-emits Prisma Next contract artifacts when the contract changes.
|
|
41
|
+
|
|
42
|
+
Node-based Prisma Next projects expect Node.js 24 LTS or newer.
|
|
43
|
+
|
|
44
|
+
The starter page queries a basic `User` model in `src/pages/index.astro`, and `src/pages/api/users.ts` shows an Astro API route backed by the same Prisma Next helper.
|
|
45
|
+
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import { prismaVitePlugin } from "@prisma-next/vite-plugin-contract-emit";
|
|
2
3
|
import { defineConfig } from "astro/config";
|
|
3
4
|
|
|
4
5
|
// https://astro.build/config
|
|
5
|
-
export default defineConfig({
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
vite: {
|
|
8
|
+
plugins: [prismaVitePlugin()],
|
|
9
|
+
},
|
|
10
|
+
});
|
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
"astro": "astro"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"astro": "^
|
|
15
|
+
"astro": "^6.3.3"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/node": "^24.3.0",
|
|
19
19
|
"tsx": "^4.7.1",
|
|
20
|
-
"typescript": "^5.9.3"
|
|
20
|
+
"typescript": "^5.9.3",
|
|
21
|
+
"vite": "^7.3.3"
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -1,53 +1,73 @@
|
|
|
1
1
|
import "dotenv/config";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
{{#if (eq provider "cockroachdb")}}
|
|
7
|
-
import { PrismaPg } from "@prisma/adapter-pg";
|
|
8
|
-
{{/if}}
|
|
9
|
-
{{#if (eq provider "mysql")}}
|
|
10
|
-
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
|
|
11
|
-
{{/if}}
|
|
12
|
-
{{#if (eq provider "sqlite")}}
|
|
13
|
-
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
|
14
|
-
{{/if}}
|
|
15
|
-
{{#if (eq provider "sqlserver")}}
|
|
16
|
-
import { PrismaMssql } from "@prisma/adapter-mssql";
|
|
2
|
+
{{#if (eq provider "mongo")}}
|
|
3
|
+
import mongo from "@prisma-next/mongo/runtime";
|
|
4
|
+
{{else}}
|
|
5
|
+
import postgres from "@prisma-next/postgres/runtime";
|
|
17
6
|
{{/if}}
|
|
18
7
|
|
|
19
|
-
{{#if (eq provider "
|
|
20
|
-
|
|
21
|
-
import.meta.env?.DATABASE_URL ?? process.env.DATABASE_URL ?? "file:./dev.db";
|
|
8
|
+
{{#if (eq provider "mongo")}}
|
|
9
|
+
import type { DefaultModelRow } from "@prisma-next/mongo-orm";
|
|
22
10
|
{{else}}
|
|
23
|
-
|
|
24
|
-
if (!databaseUrl) {
|
|
25
|
-
throw new Error("DATABASE_URL is required");
|
|
26
|
-
}
|
|
11
|
+
import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
|
|
27
12
|
{{/if}}
|
|
28
13
|
|
|
29
|
-
{
|
|
30
|
-
|
|
31
|
-
|
|
14
|
+
import type { Contract } from "../../prisma/contract.d";
|
|
15
|
+
import contractJson from "../../prisma/contract.json" with { type: "json" };
|
|
16
|
+
|
|
17
|
+
{{#if (eq provider "mongo")}}
|
|
18
|
+
export const db = mongo<Contract>({
|
|
19
|
+
contractJson,
|
|
20
|
+
url: process.env["DATABASE_URL"]!,
|
|
32
21
|
});
|
|
33
|
-
{{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
22
|
+
{{else}}
|
|
23
|
+
export const db = postgres<Contract>({
|
|
24
|
+
contractJson,
|
|
25
|
+
url: process.env["DATABASE_URL"]!,
|
|
37
26
|
});
|
|
38
27
|
{{/if}}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{{#if (eq provider "
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
28
|
+
|
|
29
|
+
type UserRow = DefaultModelRow<Contract, "User">;
|
|
30
|
+
|
|
31
|
+
{{#if (eq provider "mongo")}}
|
|
32
|
+
function toStarterUser(user: Pick<UserRow, "_id" | "email" | "username" | "name">) {
|
|
33
|
+
return {
|
|
34
|
+
id: String(user._id),
|
|
35
|
+
email: user.email,
|
|
36
|
+
username: user.username ?? null,
|
|
37
|
+
name: user.name ?? null,
|
|
38
|
+
createdAt: null as Date | null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
{{else}}
|
|
42
|
+
function toStarterUser(user: Pick<UserRow, "id" | "email" | "username" | "name" | "createdAt">) {
|
|
43
|
+
return {
|
|
44
|
+
id: String(user.id),
|
|
45
|
+
email: user.email,
|
|
46
|
+
username: user.username ?? null,
|
|
47
|
+
name: user.name ?? null,
|
|
48
|
+
createdAt: user.createdAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
46
51
|
{{/if}}
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
|
|
53
|
+
export async function listUsers(limit = 10) {
|
|
54
|
+
|
|
55
|
+
{{#if (eq provider "mongo")}}
|
|
56
|
+
const users: ReturnType<typeof toStarterUser>[] = [];
|
|
57
|
+
|
|
58
|
+
for await (const user of db.orm.users.select("_id", "email", "username", "name").take(limit).all()) {
|
|
59
|
+
users.push(toStarterUser(user));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return users;
|
|
63
|
+
{{else}}
|
|
64
|
+
const users = await db.orm.User.select("id", "email", "username", "name", "createdAt").take(limit).all();
|
|
65
|
+
|
|
66
|
+
return users.map(toStarterUser);
|
|
49
67
|
{{/if}}
|
|
50
68
|
|
|
51
|
-
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
|
|
52
72
|
|
|
53
|
-
export default
|
|
73
|
+
export default db;
|
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
import type { APIRoute } from "astro";
|
|
2
|
-
|
|
3
|
-
import
|
|
2
|
+
|
|
3
|
+
import { listUsers } from "../../lib/prisma";
|
|
4
4
|
|
|
5
5
|
export const GET: APIRoute = async () => {
|
|
6
|
-
const users = await
|
|
7
|
-
.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
createdAt: "desc",
|
|
11
|
-
},
|
|
12
|
-
})
|
|
13
|
-
.catch((error) => {
|
|
14
|
-
console.error("Failed to query users:", error);
|
|
15
|
-
return undefined;
|
|
16
|
-
});
|
|
6
|
+
const users = await listUsers(10).catch((error) => {
|
|
7
|
+
console.error("Failed to query users:", error);
|
|
8
|
+
return undefined;
|
|
9
|
+
});
|
|
17
10
|
|
|
18
11
|
if (!users) {
|
|
19
12
|
return new Response(JSON.stringify({ error: "Could not query users yet." }), {
|
|
@@ -30,13 +23,4 @@ export const GET: APIRoute = async () => {
|
|
|
30
23
|
},
|
|
31
24
|
});
|
|
32
25
|
};
|
|
33
|
-
{{else}}
|
|
34
26
|
|
|
35
|
-
export const GET: APIRoute = async () => {
|
|
36
|
-
return new Response(JSON.stringify([]), {
|
|
37
|
-
headers: {
|
|
38
|
-
"Content-Type": "application/json",
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
{{/if}}
|
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
import
|
|
2
|
+
|
|
3
|
+
import { listUsers } from "../lib/prisma";
|
|
4
4
|
|
|
5
5
|
const formatter = new Intl.DateTimeFormat("en", {
|
|
6
6
|
dateStyle: "medium",
|
|
7
7
|
timeStyle: "short",
|
|
8
8
|
});
|
|
9
9
|
|
|
10
|
-
const users = await
|
|
11
|
-
|
|
12
|
-
take: 10,
|
|
13
|
-
orderBy: {
|
|
14
|
-
createdAt: "desc",
|
|
15
|
-
},
|
|
16
|
-
})
|
|
17
|
-
.catch(() => undefined);
|
|
18
|
-
{{/if}}
|
|
10
|
+
const users = await listUsers(10).catch(() => undefined);
|
|
11
|
+
|
|
19
12
|
---
|
|
20
13
|
|
|
21
14
|
<html lang="en">
|
|
@@ -29,11 +22,11 @@ const users = await prisma.user
|
|
|
29
22
|
<body>
|
|
30
23
|
<main class="shell">
|
|
31
24
|
<div class="hero">
|
|
32
|
-
<p class="eyebrow">Astro + Prisma
|
|
33
|
-
|
|
25
|
+
<p class="eyebrow">Astro + Prisma Next</p>
|
|
26
|
+
|
|
34
27
|
<h1>Users from your database, loaded on the server.</h1>
|
|
35
28
|
<p class="lede">
|
|
36
|
-
This page reads from <code>src/pages/index.astro</code> using the Prisma
|
|
29
|
+
This page reads from <code>src/pages/index.astro</code> using the Prisma Next helper in
|
|
37
30
|
<code>src/lib/prisma.ts</code>. An Astro API route is also scaffolded in
|
|
38
31
|
<code>src/pages/api/users.ts</code>.
|
|
39
32
|
</p>
|
|
@@ -47,63 +40,32 @@ const users = await prisma.user
|
|
|
47
40
|
|
|
48
41
|
{!users ? (
|
|
49
42
|
<p class="empty">
|
|
50
|
-
Could not query users yet. Run <code>
|
|
43
|
+
Could not query users yet. Run <code>contract:emit</code> and apply your schema,
|
|
51
44
|
then refresh.
|
|
52
45
|
</p>
|
|
53
46
|
) : users.length === 0 ? (
|
|
54
|
-
<p class="empty">No users yet. Run
|
|
47
|
+
<p class="empty">No users yet. Run db:seed after applying your first migration.</p>
|
|
55
48
|
) : (
|
|
56
49
|
<ul class="users">
|
|
57
50
|
{users.map((user) => (
|
|
58
51
|
<li>
|
|
59
52
|
<div>
|
|
60
53
|
<strong>{user.name ?? "Unnamed user"}</strong>
|
|
61
|
-
<p>{user.email}</p>
|
|
54
|
+
<p>{user.username ? `@${user.username}` : user.email}</p>
|
|
62
55
|
</div>
|
|
63
|
-
|
|
64
|
-
{
|
|
65
|
-
|
|
56
|
+
{user.createdAt ? (
|
|
57
|
+
<time datetime={user.createdAt.toISOString()}>
|
|
58
|
+
{formatter.format(user.createdAt)}
|
|
59
|
+
</time>
|
|
60
|
+
) : (
|
|
61
|
+
<span class="muted">No timestamp</span>
|
|
62
|
+
)}
|
|
66
63
|
</li>
|
|
67
64
|
))}
|
|
68
65
|
</ul>
|
|
69
66
|
)}
|
|
70
67
|
</section>
|
|
71
|
-
{{else}}
|
|
72
|
-
<h1>Your Astro app is ready.</h1>
|
|
73
|
-
<p class="lede">
|
|
74
|
-
Edit <code>prisma/schema.prisma</code>, run <code>db:migrate</code>, then load your data
|
|
75
|
-
in Astro pages or API routes with the Prisma instance in <code>src/lib/prisma.ts</code>.
|
|
76
|
-
</p>
|
|
77
|
-
</div>
|
|
78
68
|
|
|
79
|
-
<section class="panel">
|
|
80
|
-
<div class="panel-header">
|
|
81
|
-
<h2>What's included</h2>
|
|
82
|
-
<span>Starter kit</span>
|
|
83
|
-
</div>
|
|
84
|
-
|
|
85
|
-
<ul class="users">
|
|
86
|
-
<li>
|
|
87
|
-
<div>
|
|
88
|
-
<strong>Prisma client</strong>
|
|
89
|
-
<p>Use the shared instance from <code>src/lib/prisma.ts</code>.</p>
|
|
90
|
-
</div>
|
|
91
|
-
</li>
|
|
92
|
-
<li>
|
|
93
|
-
<div>
|
|
94
|
-
<strong>API route example</strong>
|
|
95
|
-
<p>See <code>src/pages/api/users.ts</code> for an Astro server endpoint.</p>
|
|
96
|
-
</div>
|
|
97
|
-
</li>
|
|
98
|
-
<li>
|
|
99
|
-
<div>
|
|
100
|
-
<strong>Seed script</strong>
|
|
101
|
-
<p>Run <code>db:seed</code> after your first migration.</p>
|
|
102
|
-
</div>
|
|
103
|
-
</li>
|
|
104
|
-
</ul>
|
|
105
|
-
</section>
|
|
106
|
-
{{/if}}
|
|
107
69
|
</main>
|
|
108
70
|
</body>
|
|
109
71
|
</html>
|
|
@@ -171,6 +133,7 @@ const users = await prisma.user
|
|
|
171
133
|
|
|
172
134
|
.panel-header span,
|
|
173
135
|
.empty,
|
|
136
|
+
.muted,
|
|
174
137
|
time {
|
|
175
138
|
color: #888;
|
|
176
139
|
font-size: 0.8rem;
|