create-prisma 0.4.1 → 0.4.2-next.37.104.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.
Files changed (103) hide show
  1. package/README.md +66 -44
  2. package/dist/cli.mjs +1 -1
  3. package/dist/{create-H6Tk0JlE.mjs → create-BeFhatOc.mjs} +910 -993
  4. package/dist/index.d.mts +32 -39
  5. package/dist/index.mjs +3 -3
  6. package/package.json +7 -2
  7. package/templates/create/_shared/prisma/seed.ts.hbs +52 -0
  8. package/templates/create/astro/README.md.hbs +25 -15
  9. package/templates/create/astro/astro.config.mjs +6 -1
  10. package/templates/create/astro/deno.json.hbs +1 -1
  11. package/templates/create/astro/package.json.hbs +3 -2
  12. package/templates/create/astro/src/lib/prisma.ts.hbs +60 -40
  13. package/templates/create/astro/src/pages/api/users.ts.hbs +6 -22
  14. package/templates/create/astro/src/pages/index.astro.hbs +18 -55
  15. package/templates/create/elysia/README.md.hbs +27 -17
  16. package/templates/create/elysia/deno.json.hbs +1 -1
  17. package/templates/create/elysia/src/index.ts.hbs +15 -11
  18. package/templates/create/elysia/src/lib/prisma.ts.hbs +60 -43
  19. package/templates/create/elysia/tsconfig.json +1 -0
  20. package/templates/create/hono/README.md.hbs +27 -17
  21. package/templates/create/hono/deno.json.hbs +1 -1
  22. package/templates/create/hono/src/index.ts.hbs +9 -10
  23. package/templates/create/hono/src/lib/prisma.ts.hbs +60 -43
  24. package/templates/create/hono/tsconfig.json +1 -0
  25. package/templates/create/minimal/.yarnrc.yml.hbs +3 -0
  26. package/templates/create/minimal/README.md.hbs +39 -0
  27. package/templates/create/{turborepo → minimal}/deno.json.hbs +1 -1
  28. package/templates/create/minimal/package.json.hbs +13 -0
  29. package/templates/create/minimal/src/index.ts.hbs +43 -0
  30. package/templates/create/minimal/src/lib/prisma.ts.hbs +73 -0
  31. package/templates/create/{turborepo/apps/api → minimal}/tsconfig.json +3 -4
  32. package/templates/create/nest/README.md.hbs +28 -17
  33. package/templates/create/nest/deno.json.hbs +1 -1
  34. package/templates/create/nest/src/app.module.ts.hbs +5 -6
  35. package/templates/create/nest/src/lib/prisma.ts.hbs +60 -45
  36. package/templates/create/nest/src/prisma.service.ts.hbs +6 -5
  37. package/templates/create/nest/src/users.controller.ts.hbs +1 -2
  38. package/templates/create/nest/src/users.service.ts.hbs +2 -8
  39. package/templates/create/nest/tsconfig.json +1 -0
  40. package/templates/create/next/README.md.hbs +25 -13
  41. package/templates/create/next/deno.json.hbs +1 -1
  42. package/templates/create/next/src/app/page.tsx.hbs +16 -57
  43. package/templates/create/next/src/lib/prisma.ts.hbs +60 -40
  44. package/templates/create/next/tsconfig.json +1 -0
  45. package/templates/create/nuxt/README.md.hbs +26 -13
  46. package/templates/create/nuxt/app/pages/index.vue.hbs +12 -45
  47. package/templates/create/nuxt/deno.json.hbs +1 -1
  48. package/templates/create/nuxt/nuxt.config.ts +21 -0
  49. package/templates/create/nuxt/package.json.hbs +2 -1
  50. package/templates/create/nuxt/server/api/users.get.ts.hbs +4 -15
  51. package/templates/create/nuxt/server/utils/prisma.ts.hbs +60 -40
  52. package/templates/create/svelte/README.md.hbs +25 -15
  53. package/templates/create/svelte/deno.json.hbs +1 -1
  54. package/templates/create/svelte/package.json.hbs +1 -1
  55. package/templates/create/svelte/src/lib/server/prisma.ts.hbs +61 -41
  56. package/templates/create/svelte/src/routes/+page.server.ts.hbs +4 -15
  57. package/templates/create/svelte/src/routes/+page.svelte.hbs +13 -163
  58. package/templates/create/svelte/vite.config.ts +2 -1
  59. package/templates/create/tanstack-start/README.md.hbs +26 -13
  60. package/templates/create/tanstack-start/deno.json.hbs +1 -2
  61. package/templates/create/tanstack-start/package.json.hbs +1 -2
  62. package/templates/create/tanstack-start/src/lib/prisma.server.ts.hbs +60 -40
  63. package/templates/create/tanstack-start/src/routes/__root.tsx.hbs +2 -3
  64. package/templates/create/tanstack-start/src/routes/index.tsx.hbs +26 -77
  65. package/templates/create/tanstack-start/tsconfig.json +1 -0
  66. package/templates/create/tanstack-start/vite.config.ts +7 -1
  67. package/templates/create/astro/prisma/schema.prisma.hbs +0 -21
  68. package/templates/create/astro/prisma/seed.ts.hbs +0 -38
  69. package/templates/create/astro/prisma.config.ts +0 -13
  70. package/templates/create/elysia/prisma/schema.prisma.hbs +0 -25
  71. package/templates/create/elysia/prisma/seed.ts.hbs +0 -42
  72. package/templates/create/elysia/prisma.config.ts.hbs +0 -15
  73. package/templates/create/hono/prisma/schema.prisma.hbs +0 -25
  74. package/templates/create/hono/prisma/seed.ts.hbs +0 -42
  75. package/templates/create/hono/prisma.config.ts.hbs +0 -15
  76. package/templates/create/nest/prisma/schema.prisma.hbs +0 -25
  77. package/templates/create/nest/prisma/seed.ts.hbs +0 -44
  78. package/templates/create/nest/prisma.config.ts.hbs +0 -15
  79. package/templates/create/next/prisma/schema.prisma.hbs +0 -21
  80. package/templates/create/next/prisma/seed.ts.hbs +0 -38
  81. package/templates/create/next/prisma.config.ts +0 -13
  82. package/templates/create/nuxt/prisma/schema.prisma.hbs +0 -21
  83. package/templates/create/nuxt/prisma/seed.ts.hbs +0 -38
  84. package/templates/create/nuxt/prisma.config.ts +0 -13
  85. package/templates/create/svelte/prisma/schema.prisma.hbs +0 -21
  86. package/templates/create/svelte/prisma/seed.ts.hbs +0 -87
  87. package/templates/create/svelte/prisma.config.ts +0 -13
  88. package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -21
  89. package/templates/create/tanstack-start/prisma/seed.ts.hbs +0 -37
  90. package/templates/create/tanstack-start/prisma.config.ts +0 -13
  91. package/templates/create/turborepo/README.md.hbs +0 -29
  92. package/templates/create/turborepo/apps/api/package.json.hbs +0 -19
  93. package/templates/create/turborepo/apps/api/src/index.ts.hbs +0 -51
  94. package/templates/create/turborepo/package.json.hbs +0 -24
  95. package/templates/create/turborepo/packages/db/package.json.hbs +0 -17
  96. package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +0 -21
  97. package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +0 -38
  98. package/templates/create/turborepo/packages/db/prisma.config.ts +0 -13
  99. package/templates/create/turborepo/packages/db/src/client.ts.hbs +0 -58
  100. package/templates/create/turborepo/packages/db/src/index.ts +0 -2
  101. package/templates/create/turborepo/packages/db/tsconfig.json +0 -15
  102. package/templates/create/turborepo/turbo.json +0 -28
  103. /package/templates/create/{turborepo → elysia}/.yarnrc.yml.hbs +0 -0
@@ -8,25 +8,35 @@ Generated by `create-prisma` with the Elysia template.
8
8
  - `{{runScriptCommand packageManager "build"}}` - {{#if (eq packageManager "deno")}}type-check the app with Deno{{else}}{{#if (eq packageManager "bun")}}type-check the app for Bun{{else}}typecheck and compile{{/if}}{{/if}}
9
9
  - `{{runScriptCommand packageManager "start"}}` - {{#if (eq packageManager "deno")}}run the server directly from `src/index.ts` with Deno{{else}}{{#if (eq packageManager "bun")}}run the server directly from `src/index.ts` with Bun{{else}}run compiled server from `dist/`{{/if}}{{/if}}
10
10
 
11
- ## Prisma
12
-
13
- 1. Make sure dependencies are installed.
14
- 2. Generate Prisma Client:
15
-
16
- `{{runScriptCommand packageManager "db:generate"}}`
17
-
18
- 3. Run your first migration:
19
-
20
- `{{runScriptCommand packageManager "db:migrate"}}`
11
+ ## Prisma Next
12
+
13
+ Prisma Next setup is scaffolded in:
14
+
15
+ - `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
16
+ - `prisma-next.config.ts`
17
+ - `src/lib/prisma.ts`
18
+
19
+ Database helper scripts are added to `package.json`:
20
+
21
+ - `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
22
+ {{#if (eq provider "mongo")}}
23
+ - `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
24
+ - `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
25
+ - `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
26
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
27
+ - `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
28
+ {{else}}
29
+ - `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
30
+ - `{{runScriptCommand packageManager "db:update"}}` - update database state manually
31
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
32
+ - `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
33
+ {{/if}}
21
34
 
22
- 4. Seed the database:
35
+ - `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
23
36
 
24
- `{{runScriptCommand packageManager "db:seed"}}`
37
+ 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.
25
38
 
26
- 5. Use the Prisma client from `src/lib/prisma.ts`.
39
+ Node-based Prisma Next projects expect Node.js 24 LTS or newer.
27
40
 
28
- Generated Prisma files are written to `src/generated/prisma`.
29
- {{#if (eq schemaPreset "basic")}}
41
+ The template includes a basic `User` model and a sample `GET /users` endpoint.
30
42
 
31
- The template includes a basic `User` model, a sample `GET /users` endpoint, and seed data in `prisma/seed.ts`.
32
- {{/if}}
@@ -1,5 +1,5 @@
1
1
  {{#if (eq packageManager "deno")}}
2
2
  {
3
- "nodeModulesDir": "auto"
3
+ "nodeModulesDir": "manual"
4
4
  }
5
5
  {{/if}}
@@ -6,9 +6,8 @@ import "dotenv/config";
6
6
  import { node } from "@elysiajs/node";
7
7
  {{/if}}
8
8
  import { Elysia } from "elysia";
9
- {{#if (eq schemaPreset "basic")}}
10
- import { prisma } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
11
- {{/if}}
9
+
10
+ import { listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
12
11
 
13
12
  const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
14
13
  const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
@@ -21,16 +20,21 @@ const app = new Elysia({{#if (eq packageManager "deno")}}{{else}}{ adapter: node
21
20
  message: "hello from create-prisma + elysia",
22
21
  };
23
22
  })
24
- {{#if (eq schemaPreset "basic")}}
25
- .get("/users", async () => {
26
- return prisma.user.findMany({
27
- take: 10,
28
- orderBy: {
29
- createdAt: "desc",
30
- },
23
+
24
+ .get("/users", async ({ set }) => {
25
+ const users = await listUsers(10).catch((error) => {
26
+ console.error("Failed to query users:", error);
27
+ return undefined;
31
28
  });
29
+
30
+ if (!users) {
31
+ set.status = 500;
32
+ return { error: "Could not query users yet. Run contract:emit and apply your schema first." };
33
+ }
34
+
35
+ return users;
32
36
  })
33
- {{/if}}
37
+
34
38
  {{#if (eq packageManager "deno")}}
35
39
  ;
36
40
 
@@ -1,56 +1,73 @@
1
- {{#if (requiresDotenvConfigImport packageManager)}}
2
1
  import "dotenv/config";
3
- {{/if}}
4
- import { PrismaClient } from "../generated/prisma/client{{#if (eq packageManager "deno")}}.ts{{/if}}";
5
- {{#if (eq provider "postgresql")}}
6
- import { PrismaPg } from "@prisma/adapter-pg";
7
- {{/if}}
8
- {{#if (eq provider "cockroachdb")}}
9
- import { PrismaPg } from "@prisma/adapter-pg";
10
- {{/if}}
11
- {{#if (eq provider "mysql")}}
12
- import { PrismaMariaDb } from "@prisma/adapter-mariadb";
13
- {{/if}}
14
- {{#if (eq provider "sqlite")}}
15
- import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
16
- {{/if}}
17
- {{#if (eq provider "sqlserver")}}
18
- 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";
19
6
  {{/if}}
20
7
 
21
- const rawDatabaseUrl = {{#if (eq packageManager "deno")}}Deno.env.get("DATABASE_URL"){{else}}process.env.DATABASE_URL{{/if}};
22
- {{#if (eq provider "sqlite")}}
23
- const databaseUrl = (rawDatabaseUrl ?? "").trim() || "file:./dev.db";
8
+ {{#if (eq provider "mongo")}}
9
+ import type { DefaultModelRow } from "@prisma-next/mongo-orm";
24
10
  {{else}}
25
- const databaseUrl = (rawDatabaseUrl ?? "").trim();
26
- if (!databaseUrl) {
27
- throw new Error("DATABASE_URL is required");
28
- }
11
+ import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
29
12
  {{/if}}
30
13
 
31
- {{#if (eq provider "postgresql")}}
32
- const adapter = new PrismaPg({
33
- connectionString: databaseUrl,
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"]!,
34
21
  });
35
- {{/if}}
36
- {{#if (eq provider "cockroachdb")}}
37
- const adapter = new PrismaPg({
38
- connectionString: databaseUrl,
22
+ {{else}}
23
+ export const db = postgres<Contract>({
24
+ contractJson,
25
+ url: process.env["DATABASE_URL"]!,
39
26
  });
40
27
  {{/if}}
41
- {{#if (eq provider "mysql")}}
42
- const adapter = new PrismaMariaDb(databaseUrl);
43
- {{/if}}
44
- {{#if (eq provider "sqlite")}}
45
- const adapter = new PrismaBetterSqlite3({
46
- url: databaseUrl,
47
- });
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
+ }
48
51
  {{/if}}
49
- {{#if (eq provider "sqlserver")}}
50
- const adapter = new PrismaMssql(databaseUrl);
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);
51
67
  {{/if}}
52
68
 
53
- const prisma = new PrismaClient({ adapter });
69
+ }
70
+
71
+ export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
54
72
 
55
- export { prisma };
56
- export default prisma;
73
+ export default db;
@@ -3,6 +3,7 @@
3
3
  "target": "ES2022",
4
4
  "module": "ESNext",
5
5
  "moduleResolution": "Bundler",
6
+ "resolveJsonModule": true,
6
7
  "verbatimModuleSyntax": true,
7
8
  "strict": true,
8
9
  "esModuleInterop": true,
@@ -8,25 +8,35 @@ Generated by `create-prisma` with the Hono template.
8
8
  - `{{runScriptCommand packageManager "build"}}` - {{#if (eq packageManager "deno")}}type-check the app with Deno{{else}}{{#if (eq packageManager "bun")}}type-check the app for Bun{{else}}typecheck and compile{{/if}}{{/if}}
9
9
  - `{{runScriptCommand packageManager "start"}}` - {{#if (eq packageManager "deno")}}run the server directly from `src/index.ts` with Deno{{else}}{{#if (eq packageManager "bun")}}run the server directly from `src/index.ts` with Bun{{else}}run compiled server from `dist/`{{/if}}{{/if}}
10
10
 
11
- ## Prisma
12
-
13
- 1. Make sure dependencies are installed.
14
- 2. Generate Prisma Client:
15
-
16
- `{{runScriptCommand packageManager "db:generate"}}`
17
-
18
- 3. Run your first migration:
19
-
20
- `{{runScriptCommand packageManager "db:migrate"}}`
11
+ ## Prisma Next
12
+
13
+ Prisma Next setup is scaffolded in:
14
+
15
+ - `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
16
+ - `prisma-next.config.ts`
17
+ - `src/lib/prisma.ts`
18
+
19
+ Database helper scripts are added to `package.json`:
20
+
21
+ - `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
22
+ {{#if (eq provider "mongo")}}
23
+ - `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
24
+ - `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
25
+ - `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
26
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
27
+ - `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
28
+ {{else}}
29
+ - `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
30
+ - `{{runScriptCommand packageManager "db:update"}}` - update database state manually
31
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
32
+ - `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
33
+ {{/if}}
21
34
 
22
- 4. Seed the database:
35
+ - `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
23
36
 
24
- `{{runScriptCommand packageManager "db:seed"}}`
37
+ 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.
25
38
 
26
- 5. Use the Prisma client from `src/lib/prisma.ts`.
39
+ Node-based Prisma Next projects expect Node.js 24 LTS or newer.
27
40
 
28
- Generated Prisma files are written to `src/generated/prisma`.
29
- {{#if (eq schemaPreset "basic")}}
41
+ The template includes a basic `User` model and a sample `GET /users` endpoint.
30
42
 
31
- The template includes a basic `User` model, a sample `GET /users` endpoint, and seed data in `prisma/seed.ts`.
32
- {{/if}}
@@ -1,5 +1,5 @@
1
1
  {{#if (eq packageManager "deno")}}
2
2
  {
3
- "nodeModulesDir": "auto"
3
+ "nodeModulesDir": "manual"
4
4
  }
5
5
  {{/if}}
@@ -3,9 +3,8 @@ import "dotenv/config";
3
3
  {{/if}}
4
4
  import { serve } from "@hono/node-server";
5
5
  import { Hono } from "hono";
6
- {{#if (eq schemaPreset "basic")}}
7
- import { prisma } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
8
- {{/if}}
6
+
7
+ import { listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
9
8
 
10
9
  const app = new Hono();
11
10
 
@@ -14,19 +13,19 @@ app.get("/", (c) => {
14
13
  message: "hello from create-prisma + hono",
15
14
  });
16
15
  });
17
- {{#if (eq schemaPreset "basic")}}
18
16
 
19
17
  app.get("/users", async (c) => {
20
- const users = await prisma.user.findMany({
21
- take: 10,
22
- orderBy: {
23
- createdAt: "desc",
24
- },
18
+ const users = await listUsers(10).catch((error) => {
19
+ console.error("Failed to query users:", error);
20
+ return undefined;
25
21
  });
26
22
 
23
+ if (!users) {
24
+ return c.json({ error: "Could not query users yet. Run contract:emit and apply your schema first." }, 500);
25
+ }
26
+
27
27
  return c.json(users);
28
28
  });
29
- {{/if}}
30
29
 
31
30
  const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
32
31
  const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
@@ -1,56 +1,73 @@
1
- {{#if (requiresDotenvConfigImport packageManager)}}
2
1
  import "dotenv/config";
3
- {{/if}}
4
- import { PrismaClient } from "../generated/prisma/client{{#if (eq packageManager "deno")}}.ts{{/if}}";
5
- {{#if (eq provider "postgresql")}}
6
- import { PrismaPg } from "@prisma/adapter-pg";
7
- {{/if}}
8
- {{#if (eq provider "cockroachdb")}}
9
- import { PrismaPg } from "@prisma/adapter-pg";
10
- {{/if}}
11
- {{#if (eq provider "mysql")}}
12
- import { PrismaMariaDb } from "@prisma/adapter-mariadb";
13
- {{/if}}
14
- {{#if (eq provider "sqlite")}}
15
- import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
16
- {{/if}}
17
- {{#if (eq provider "sqlserver")}}
18
- 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";
19
6
  {{/if}}
20
7
 
21
- const rawDatabaseUrl = {{#if (eq packageManager "deno")}}Deno.env.get("DATABASE_URL"){{else}}process.env.DATABASE_URL{{/if}};
22
- {{#if (eq provider "sqlite")}}
23
- const databaseUrl = (rawDatabaseUrl ?? "").trim() || "file:./dev.db";
8
+ {{#if (eq provider "mongo")}}
9
+ import type { DefaultModelRow } from "@prisma-next/mongo-orm";
24
10
  {{else}}
25
- const databaseUrl = (rawDatabaseUrl ?? "").trim();
26
- if (!databaseUrl) {
27
- throw new Error("DATABASE_URL is required");
28
- }
11
+ import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
29
12
  {{/if}}
30
13
 
31
- {{#if (eq provider "postgresql")}}
32
- const adapter = new PrismaPg({
33
- connectionString: databaseUrl,
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"]!,
34
21
  });
35
- {{/if}}
36
- {{#if (eq provider "cockroachdb")}}
37
- const adapter = new PrismaPg({
38
- connectionString: databaseUrl,
22
+ {{else}}
23
+ export const db = postgres<Contract>({
24
+ contractJson,
25
+ url: process.env["DATABASE_URL"]!,
39
26
  });
40
27
  {{/if}}
41
- {{#if (eq provider "mysql")}}
42
- const adapter = new PrismaMariaDb(databaseUrl);
43
- {{/if}}
44
- {{#if (eq provider "sqlite")}}
45
- const adapter = new PrismaBetterSqlite3({
46
- url: databaseUrl,
47
- });
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
+ }
48
51
  {{/if}}
49
- {{#if (eq provider "sqlserver")}}
50
- const adapter = new PrismaMssql(databaseUrl);
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);
51
67
  {{/if}}
52
68
 
53
- const prisma = new PrismaClient({ adapter });
69
+ }
70
+
71
+ export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
54
72
 
55
- export { prisma };
56
- export default prisma;
73
+ export default db;
@@ -3,6 +3,7 @@
3
3
  "target": "ES2022",
4
4
  "module": "ESNext",
5
5
  "moduleResolution": "Bundler",
6
+ "resolveJsonModule": true,
6
7
  "verbatimModuleSyntax": true,
7
8
  "strict": true,
8
9
  "esModuleInterop": true,
@@ -0,0 +1,3 @@
1
+ {{#if (eq packageManager "yarn")}}
2
+ nodeLinker: node-modules
3
+ {{/if}}
@@ -0,0 +1,39 @@
1
+ # {{projectName}}
2
+
3
+ Generated by `create-prisma` with the Minimal template.
4
+
5
+ ## Scripts
6
+
7
+ - `{{runScriptCommand packageManager "dev"}}` - run the Prisma Next sample script
8
+
9
+ ## Prisma Next
10
+
11
+ Prisma Next setup is scaffolded in:
12
+
13
+ - `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
14
+ - `prisma-next.config.ts`
15
+ - `prisma/db.ts`
16
+ - `src/lib/prisma.ts`
17
+
18
+ Database helper scripts are added to `package.json`:
19
+
20
+ - `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
21
+ {{#if (eq provider "mongo")}}
22
+ - `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
23
+ - `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
24
+ - `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
25
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
26
+ - `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
27
+ {{else}}
28
+ - `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
29
+ - `{{runScriptCommand packageManager "db:update"}}` - update database state manually
30
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
31
+ - `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
32
+ {{/if}}
33
+ - `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
34
+
35
+ 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.
36
+
37
+ Node-based Prisma Next projects expect Node.js 24 LTS or newer.
38
+
39
+ Run the migration and seed scripts first, then `{{runScriptCommand packageManager "dev"}}` runs a small write/read round trip from `src/index.ts`.
@@ -1,5 +1,5 @@
1
1
  {{#if (eq packageManager "deno")}}
2
2
  {
3
- "nodeModulesDir": "auto"
3
+ "nodeModulesDir": "manual"
4
4
  }
5
5
  {{/if}}
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "private": true,
4
+ {{#if (packageManagerManifestValue packageManager)}}
5
+ "packageManager": "{{packageManagerManifestValue packageManager}}",
6
+ {{/if}}
7
+ "type": "module",
8
+ "scripts": {
9
+ "dev": "{{runtimeScript packageManager "start" "src/index.ts" ""}}"
10
+ },
11
+ "dependencies": {},
12
+ "devDependencies": {}
13
+ }
@@ -0,0 +1,43 @@
1
+ import { db, listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
2
+
3
+ const sampleUser = {
4
+ email: "first.user@prisma.io",
5
+ username: "first-user",
6
+ name: "First User",
7
+ };
8
+
9
+ async function main() {
10
+ {{#if (eq provider "mongo")}}
11
+ const existingUser = await db.orm.users.where({ email: sampleUser.email }).first();
12
+ if (!existingUser) {
13
+ await db.orm.users.createCount([sampleUser]);
14
+ }
15
+
16
+ const user = await db.orm.users.where({ email: sampleUser.email }).first();
17
+ {{else}}
18
+ const existingUser = await db.orm.User.where({ email: sampleUser.email }).first();
19
+ if (!existingUser) {
20
+ await db.orm.User.createCount([sampleUser]);
21
+ }
22
+
23
+ const user = await db.orm.User.where({ email: sampleUser.email }).first();
24
+ {{/if}}
25
+ const users = await listUsers();
26
+
27
+ console.log(`Prisma Next is ready. Found ${users.length} user${users.length === 1 ? "" : "s"}.`);
28
+ console.log(user);
29
+ }
30
+
31
+ try {
32
+ await main();
33
+ } catch (error) {
34
+ console.error("Prisma Next query failed.");
35
+ console.error("Emit the contract, set DATABASE_URL, then apply migrations before running this script.");
36
+ throw error;
37
+ } finally {
38
+ {{#if (eq provider "mongo")}}
39
+ await db.close();
40
+ {{else}}
41
+ await db.runtime().close();
42
+ {{/if}}
43
+ }
@@ -0,0 +1,73 @@
1
+ import "dotenv/config";
2
+ {{#if (eq provider "mongo")}}
3
+ import mongo from "@prisma-next/mongo/runtime";
4
+ {{else}}
5
+ import postgres from "@prisma-next/postgres/runtime";
6
+ {{/if}}
7
+
8
+ {{#if (eq provider "mongo")}}
9
+ import type { DefaultModelRow } from "@prisma-next/mongo-orm";
10
+ {{else}}
11
+ import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
12
+ {{/if}}
13
+
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"]!,
21
+ });
22
+ {{else}}
23
+ export const db = postgres<Contract>({
24
+ contractJson,
25
+ url: process.env["DATABASE_URL"]!,
26
+ });
27
+ {{/if}}
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
+ }
51
+ {{/if}}
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);
67
+ {{/if}}
68
+
69
+ }
70
+
71
+ export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
72
+
73
+ export default db;