create-prisma 0.4.1 → 0.4.2-next.37.80.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 (119) hide show
  1. package/README.md +43 -35
  2. package/dist/cli.mjs +1 -1
  3. package/dist/{create-H6Tk0JlE.mjs → create-CfH21J9-.mjs} +529 -914
  4. package/dist/index.d.mts +28 -25
  5. package/dist/index.mjs +3 -3
  6. package/package.json +2 -2
  7. package/templates/create/_shared/packages/db/prisma/seed.ts.hbs +43 -0
  8. package/templates/create/_shared/prisma/seed.ts.hbs +55 -0
  9. package/templates/create/astro/README.md.hbs +23 -12
  10. package/templates/create/astro/deno.json.hbs +1 -1
  11. package/templates/create/astro/prisma/contract.prisma.hbs +44 -0
  12. package/templates/create/astro/prisma/contract.ts.hbs +85 -0
  13. package/templates/create/astro/prisma-next.config.ts.hbs +13 -0
  14. package/templates/create/astro/src/lib/prisma.ts.hbs +49 -43
  15. package/templates/create/astro/src/pages/api/users.ts.hbs +5 -12
  16. package/templates/create/astro/src/pages/index.astro.hbs +19 -21
  17. package/templates/create/elysia/.yarnrc.yml.hbs +3 -0
  18. package/templates/create/elysia/README.md.hbs +27 -18
  19. package/templates/create/elysia/deno.json.hbs +1 -1
  20. package/templates/create/elysia/prisma/contract.prisma.hbs +44 -0
  21. package/templates/create/elysia/prisma/contract.ts.hbs +85 -0
  22. package/templates/create/elysia/prisma-next.config.ts.hbs +13 -0
  23. package/templates/create/elysia/src/index.ts.hbs +12 -7
  24. package/templates/create/elysia/src/lib/prisma.ts.hbs +49 -46
  25. package/templates/create/elysia/tsconfig.json +1 -0
  26. package/templates/create/hono/README.md.hbs +27 -18
  27. package/templates/create/hono/deno.json.hbs +1 -1
  28. package/templates/create/hono/prisma/contract.prisma.hbs +44 -0
  29. package/templates/create/hono/prisma/contract.ts.hbs +85 -0
  30. package/templates/create/hono/prisma-next.config.ts.hbs +13 -0
  31. package/templates/create/hono/src/index.ts.hbs +8 -6
  32. package/templates/create/hono/src/lib/prisma.ts.hbs +49 -46
  33. package/templates/create/hono/tsconfig.json +1 -0
  34. package/templates/create/nest/README.md.hbs +28 -18
  35. package/templates/create/nest/deno.json.hbs +1 -1
  36. package/templates/create/nest/prisma/contract.prisma.hbs +44 -0
  37. package/templates/create/nest/prisma/contract.ts.hbs +85 -0
  38. package/templates/create/nest/prisma-next.config.ts.hbs +13 -0
  39. package/templates/create/nest/src/lib/prisma.ts.hbs +49 -48
  40. package/templates/create/nest/src/prisma.service.ts.hbs +6 -5
  41. package/templates/create/nest/src/users.service.ts.hbs +1 -6
  42. package/templates/create/nest/tsconfig.json +1 -0
  43. package/templates/create/next/README.md.hbs +22 -11
  44. package/templates/create/next/deno.json.hbs +1 -1
  45. package/templates/create/next/prisma/contract.prisma.hbs +44 -0
  46. package/templates/create/next/prisma/contract.ts.hbs +85 -0
  47. package/templates/create/next/prisma-next.config.ts.hbs +13 -0
  48. package/templates/create/next/src/app/page.tsx.hbs +21 -26
  49. package/templates/create/next/src/lib/prisma.ts.hbs +49 -43
  50. package/templates/create/next/tsconfig.json +1 -0
  51. package/templates/create/nuxt/README.md.hbs +22 -11
  52. package/templates/create/nuxt/app/pages/index.vue.hbs +14 -12
  53. package/templates/create/nuxt/deno.json.hbs +1 -1
  54. package/templates/create/nuxt/nuxt.config.ts +16 -0
  55. package/templates/create/nuxt/prisma/contract.prisma.hbs +44 -0
  56. package/templates/create/nuxt/prisma/contract.ts.hbs +85 -0
  57. package/templates/create/nuxt/prisma-next.config.ts.hbs +13 -0
  58. package/templates/create/nuxt/server/api/users.get.ts.hbs +3 -9
  59. package/templates/create/nuxt/server/utils/prisma.ts.hbs +49 -43
  60. package/templates/create/svelte/README.md.hbs +23 -12
  61. package/templates/create/svelte/deno.json.hbs +1 -1
  62. package/templates/create/svelte/prisma/contract.prisma.hbs +44 -0
  63. package/templates/create/svelte/prisma/contract.ts.hbs +85 -0
  64. package/templates/create/svelte/prisma-next.config.ts.hbs +13 -0
  65. package/templates/create/svelte/src/lib/server/prisma.ts.hbs +50 -44
  66. package/templates/create/svelte/src/routes/+page.server.ts.hbs +3 -9
  67. package/templates/create/svelte/src/routes/+page.svelte.hbs +21 -16
  68. package/templates/create/tanstack-start/README.md.hbs +22 -11
  69. package/templates/create/tanstack-start/deno.json.hbs +1 -2
  70. package/templates/create/tanstack-start/prisma/contract.prisma.hbs +44 -0
  71. package/templates/create/tanstack-start/prisma/contract.ts.hbs +85 -0
  72. package/templates/create/tanstack-start/prisma-next.config.ts.hbs +13 -0
  73. package/templates/create/tanstack-start/src/lib/prisma.server.ts.hbs +49 -43
  74. package/templates/create/tanstack-start/src/routes/__root.tsx.hbs +2 -3
  75. package/templates/create/tanstack-start/src/routes/index.tsx.hbs +27 -38
  76. package/templates/create/tanstack-start/tsconfig.json +1 -0
  77. package/templates/create/turborepo/README.md.hbs +25 -14
  78. package/templates/create/turborepo/apps/api/deno.json.hbs +6 -0
  79. package/templates/create/turborepo/apps/api/package.json.hbs +7 -0
  80. package/templates/create/turborepo/apps/api/src/index.ts.hbs +6 -13
  81. package/templates/create/turborepo/deno.json.hbs +5 -1
  82. package/templates/create/turborepo/package.json.hbs +12 -4
  83. package/templates/create/turborepo/packages/db/deno.json.hbs +6 -0
  84. package/templates/create/turborepo/packages/db/package.json.hbs +5 -0
  85. package/templates/create/turborepo/packages/db/prisma/contract.prisma.hbs +44 -0
  86. package/templates/create/turborepo/packages/db/prisma/contract.ts.hbs +85 -0
  87. package/templates/create/turborepo/packages/db/prisma-next.config.ts.hbs +13 -0
  88. package/templates/create/turborepo/packages/db/src/client.ts.hbs +56 -44
  89. package/templates/create/turborepo/packages/db/src/index.ts +1 -1
  90. package/templates/create/turborepo/packages/db/tsconfig.json +2 -1
  91. package/templates/create/turborepo/pnpm-workspace.yaml.hbs +5 -0
  92. package/templates/create/turborepo/turbo.json +9 -3
  93. package/templates/create/astro/prisma/schema.prisma.hbs +0 -21
  94. package/templates/create/astro/prisma/seed.ts.hbs +0 -38
  95. package/templates/create/astro/prisma.config.ts +0 -13
  96. package/templates/create/elysia/prisma/schema.prisma.hbs +0 -25
  97. package/templates/create/elysia/prisma/seed.ts.hbs +0 -42
  98. package/templates/create/elysia/prisma.config.ts.hbs +0 -15
  99. package/templates/create/hono/prisma/schema.prisma.hbs +0 -25
  100. package/templates/create/hono/prisma/seed.ts.hbs +0 -42
  101. package/templates/create/hono/prisma.config.ts.hbs +0 -15
  102. package/templates/create/nest/prisma/schema.prisma.hbs +0 -25
  103. package/templates/create/nest/prisma/seed.ts.hbs +0 -44
  104. package/templates/create/nest/prisma.config.ts.hbs +0 -15
  105. package/templates/create/next/prisma/schema.prisma.hbs +0 -21
  106. package/templates/create/next/prisma/seed.ts.hbs +0 -38
  107. package/templates/create/next/prisma.config.ts +0 -13
  108. package/templates/create/nuxt/prisma/schema.prisma.hbs +0 -21
  109. package/templates/create/nuxt/prisma/seed.ts.hbs +0 -38
  110. package/templates/create/nuxt/prisma.config.ts +0 -13
  111. package/templates/create/svelte/prisma/schema.prisma.hbs +0 -21
  112. package/templates/create/svelte/prisma/seed.ts.hbs +0 -87
  113. package/templates/create/svelte/prisma.config.ts +0 -13
  114. package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -21
  115. package/templates/create/tanstack-start/prisma/seed.ts.hbs +0 -37
  116. package/templates/create/tanstack-start/prisma.config.ts +0 -13
  117. package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +0 -21
  118. package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +0 -38
  119. package/templates/create/turborepo/packages/db/prisma.config.ts +0 -13
@@ -4,7 +4,7 @@ import "dotenv/config";
4
4
  import { serve } from "@hono/node-server";
5
5
  import { Hono } from "hono";
6
6
  {{#if (eq schemaPreset "basic")}}
7
- import { prisma } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
7
+ import { listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
8
8
  {{/if}}
9
9
 
10
10
  const app = new Hono();
@@ -17,13 +17,15 @@ app.get("/", (c) => {
17
17
  {{#if (eq schemaPreset "basic")}}
18
18
 
19
19
  app.get("/users", async (c) => {
20
- const users = await prisma.user.findMany({
21
- take: 10,
22
- orderBy: {
23
- createdAt: "desc",
24
- },
20
+ const users = await listUsers(10).catch((error) => {
21
+ console.error("Failed to query users:", error);
22
+ return undefined;
25
23
  });
26
24
 
25
+ if (!users) {
26
+ return c.json({ error: "Could not query users yet. Run contract:emit and apply your schema first." }, 500);
27
+ }
28
+
27
29
  return c.json(users);
28
30
  });
29
31
  {{/if}}
@@ -1,56 +1,59 @@
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";
19
- {{/if}}
20
-
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";
2
+ {{#if (eq provider "mongo")}}
3
+ import mongo from "@prisma-next/mongo/runtime";
24
4
  {{else}}
25
- const databaseUrl = (rawDatabaseUrl ?? "").trim();
26
- if (!databaseUrl) {
27
- throw new Error("DATABASE_URL is required");
28
- }
5
+ import postgres from "@prisma-next/postgres/runtime";
29
6
  {{/if}}
7
+ import type { Contract } from "../../prisma/contract.d";
8
+ import contractJson from "../../prisma/contract.json" with { type: "json" };
30
9
 
31
- {{#if (eq provider "postgresql")}}
32
- const adapter = new PrismaPg({
33
- connectionString: databaseUrl,
10
+ {{#if (eq provider "mongo")}}
11
+ export const db = mongo<Contract>({
12
+ contractJson,
13
+ url: process.env["DATABASE_URL"],
34
14
  });
35
- {{/if}}
36
- {{#if (eq provider "cockroachdb")}}
37
- const adapter = new PrismaPg({
38
- connectionString: databaseUrl,
15
+ {{else}}
16
+ export const db = postgres<Contract>({
17
+ contractJson,
18
+ url: process.env["DATABASE_URL"],
39
19
  });
40
20
  {{/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
- });
21
+
22
+ export type StarterUser = {
23
+ id: string;
24
+ email: string;
25
+ name: string | null;
26
+ createdAt: Date | null;
27
+ };
28
+
29
+ export async function listUsers(limit = 10): Promise<StarterUser[]> {
30
+ {{#if (eq schemaPreset "basic")}}
31
+ {{#if (eq provider "mongo")}}
32
+ const users: StarterUser[] = [];
33
+
34
+ for await (const user of db.orm.users.select("_id", "email", "name").take(limit).all()) {
35
+ users.push({
36
+ id: String(user._id),
37
+ email: user.email,
38
+ name: user.name ?? null,
39
+ createdAt: null,
40
+ });
41
+ }
42
+
43
+ return users;
44
+ {{else}}
45
+ const users = await db.orm.User.select("id", "email", "name", "createdAt").take(limit).all();
46
+
47
+ return users.map((user) => ({
48
+ id: String(user.id),
49
+ email: user.email,
50
+ name: user.name ?? null,
51
+ createdAt: user.createdAt,
52
+ }));
48
53
  {{/if}}
49
- {{#if (eq provider "sqlserver")}}
50
- const adapter = new PrismaMssql(databaseUrl);
54
+ {{else}}
55
+ return [];
51
56
  {{/if}}
57
+ }
52
58
 
53
- const prisma = new PrismaClient({ adapter });
54
-
55
- export { prisma };
56
- export default prisma;
59
+ 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 NestJS 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}}compile the app into `dist/`{{/if}}{{/if}}
9
9
  - `{{runScriptCommand packageManager "start"}}` - {{#if (eq packageManager "deno")}}run the server directly from `src/main.ts` with Deno{{else}}{{#if (eq packageManager "bun")}}run the server directly from `src/main.ts` with Bun{{else}}run the compiled server from `dist/main.js`{{/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"}}`
21
-
22
- 4. Seed the database:
23
-
24
- `{{runScriptCommand packageManager "db:seed"}}`
25
-
26
- 5. Use the shared Prisma setup from `src/lib/prisma.ts` and inject `PrismaService` from `src/prisma.service.ts` inside Nest providers.
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
+ - `src/prisma.service.ts`
19
+
20
+ Database helper scripts are added to `package.json`:
21
+
22
+ - `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
23
+ {{#if (eq provider "mongo")}}
24
+ - `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set
25
+ - `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB replica set
26
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
27
+ - `{{runScriptCommand packageManager "migration:apply"}}` - 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 "migration:apply"}}` - apply a planned migration
33
+ {{/if}}
34
+ {{#if (eq schemaPreset "basic")}}
35
+ - `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
36
+ {{/if}}
27
37
 
28
- Generated Prisma files are written to `src/generated/prisma`.
38
+ Node-based Prisma Next projects expect Node.js 24 LTS or newer.
29
39
  {{#if (eq schemaPreset "basic")}}
30
40
 
31
- The template includes a basic `User` model, a sample `GET /users` endpoint, and seed data in `prisma/seed.ts`.
41
+ The template includes a basic `User` model and a sample `GET /users` endpoint.
32
42
  {{/if}}
@@ -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,44 @@
1
+ {{#if (eq authoring "psl")}}
2
+ // use prisma-next
3
+ {{#if (eq schemaPreset "basic")}}
4
+ {{#if (eq provider "mongo")}}
5
+
6
+ model User {
7
+ id ObjectId @id @map("_id")
8
+ email String @unique
9
+ name String?
10
+ posts Post[]
11
+
12
+ @@map("users")
13
+ }
14
+
15
+ model Post {
16
+ id ObjectId @id @map("_id")
17
+ title String
18
+ content String?
19
+ author User @relation(fields: [authorId], references: [id])
20
+ authorId ObjectId
21
+
22
+ @@map("posts")
23
+ }
24
+ {{else}}
25
+
26
+ model User {
27
+ id Int @id @default(autoincrement())
28
+ email String @unique
29
+ name String?
30
+ posts Post[]
31
+ createdAt DateTime @default(now())
32
+ }
33
+
34
+ model Post {
35
+ id Int @id @default(autoincrement())
36
+ title String
37
+ content String?
38
+ author User @relation(fields: [authorId], references: [id])
39
+ authorId Int
40
+ createdAt DateTime @default(now())
41
+ }
42
+ {{/if}}
43
+ {{/if}}
44
+ {{/if}}
@@ -0,0 +1,85 @@
1
+ {{#if (eq authoring "typescript")}}
2
+ {{#if (eq provider "mongo")}}
3
+ import mongoFamily from "@prisma-next/family-mongo/pack";
4
+ import { defineContract } from "@prisma-next/mongo-contract-ts/contract-builder";
5
+ import mongoTarget from "@prisma-next/target-mongo/pack";
6
+
7
+ export const contract = defineContract(
8
+ { family: mongoFamily, target: mongoTarget },
9
+ ({ field, index, model, rel }) => ({
10
+ models: {
11
+ {{#if (eq schemaPreset "basic")}}
12
+ User: model("User", {
13
+ collection: "users",
14
+ fields: {
15
+ _id: field.objectId(),
16
+ email: field.string(),
17
+ name: field.string().optional(),
18
+ },
19
+ indexes: [
20
+ index({ email: 1 }, { unique: true }),
21
+ ],
22
+ relations: {
23
+ posts: rel.hasMany("Post", { from: "_id", to: "authorId" }),
24
+ },
25
+ }),
26
+
27
+ Post: model("Post", {
28
+ collection: "posts",
29
+ fields: {
30
+ _id: field.objectId(),
31
+ title: field.string(),
32
+ content: field.string().optional(),
33
+ authorId: field.objectId(),
34
+ },
35
+ indexes: [
36
+ index({ authorId: 1 }),
37
+ ],
38
+ relations: {
39
+ author: rel.belongsTo("User", { from: "authorId", to: "_id" }),
40
+ },
41
+ }),
42
+ {{/if}}
43
+ },
44
+ }),
45
+ );
46
+ {{else}}
47
+ import sqlFamily from "@prisma-next/family-sql/pack";
48
+ import { defineContract } from "@prisma-next/sql-contract-ts/contract-builder";
49
+ import postgresPack from "@prisma-next/target-postgres/pack";
50
+
51
+ export const contract = defineContract(
52
+ { family: sqlFamily, target: postgresPack },
53
+ ({ field, model, rel }) => ({
54
+ models: {
55
+ {{#if (eq schemaPreset "basic")}}
56
+ User: model("User", {
57
+ fields: {
58
+ id: field.id.uuidv7(),
59
+ email: field.text().unique(),
60
+ name: field.text().optional(),
61
+ createdAt: field.createdAt(),
62
+ },
63
+ relations: {
64
+ posts: rel.hasMany("Post", { by: "authorId" }),
65
+ },
66
+ }),
67
+
68
+ Post: model("Post", {
69
+ fields: {
70
+ id: field.id.uuidv7(),
71
+ title: field.text(),
72
+ content: field.text().optional(),
73
+ authorId: field.uuid(),
74
+ createdAt: field.createdAt(),
75
+ },
76
+ relations: {
77
+ author: rel.belongsTo("User", { from: "authorId", to: "id" }),
78
+ },
79
+ }),
80
+ {{/if}}
81
+ },
82
+ }),
83
+ );
84
+ {{/if}}
85
+ {{/if}}
@@ -0,0 +1,13 @@
1
+ import "dotenv/config";
2
+ {{#if (eq provider "mongo")}}
3
+ import { defineConfig } from "@prisma-next/mongo/config";
4
+ {{else}}
5
+ import { defineConfig } from "@prisma-next/postgres/config";
6
+ {{/if}}
7
+
8
+ export default defineConfig({
9
+ contract: "./prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}",
10
+ db: {
11
+ connection: process.env["DATABASE_URL"],
12
+ },
13
+ });
@@ -1,58 +1,59 @@
1
- {{#if (requiresDotenvConfigImport packageManager)}}
2
1
  import "dotenv/config";
3
- {{/if}}
4
-
5
- import { PrismaClient } from "../generated/prisma/client{{#if (eq packageManager "deno")}}.ts{{/if}}";
6
- {{#if (eq provider "postgresql")}}
7
- import { PrismaPg } from "@prisma/adapter-pg";
8
- {{/if}}
9
- {{#if (eq provider "cockroachdb")}}
10
- import { PrismaPg } from "@prisma/adapter-pg";
11
- {{/if}}
12
- {{#if (eq provider "mysql")}}
13
- import { PrismaMariaDb } from "@prisma/adapter-mariadb";
14
- {{/if}}
15
- {{#if (eq provider "sqlite")}}
16
- import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
17
- {{/if}}
18
- {{#if (eq provider "sqlserver")}}
19
- import { PrismaMssql } from "@prisma/adapter-mssql";
20
- {{/if}}
21
-
22
- const rawDatabaseUrl = {{#if (eq packageManager "deno")}}Deno.env.get("DATABASE_URL"){{else}}process.env.DATABASE_URL{{/if}};
23
- {{#if (eq provider "sqlite")}}
24
- const databaseUrl = (rawDatabaseUrl ?? "").trim() || "file:./dev.db";
2
+ {{#if (eq provider "mongo")}}
3
+ import mongo from "@prisma-next/mongo/runtime";
25
4
  {{else}}
26
- const databaseUrl = (rawDatabaseUrl ?? "").trim();
27
- if (!databaseUrl) {
28
- throw new Error("DATABASE_URL is required");
29
- }
5
+ import postgres from "@prisma-next/postgres/runtime";
30
6
  {{/if}}
7
+ import type { Contract } from "../../prisma/contract.d";
8
+ import contractJson from "../../prisma/contract.json" with { type: "json" };
31
9
 
32
- {{#if (eq provider "postgresql")}}
33
- const adapter = new PrismaPg({
34
- connectionString: databaseUrl,
10
+ {{#if (eq provider "mongo")}}
11
+ export const db = mongo<Contract>({
12
+ contractJson,
13
+ url: process.env["DATABASE_URL"],
35
14
  });
36
- {{/if}}
37
- {{#if (eq provider "cockroachdb")}}
38
- const adapter = new PrismaPg({
39
- connectionString: databaseUrl,
40
- });
41
- {{/if}}
42
- {{#if (eq provider "mysql")}}
43
- const adapter = new PrismaMariaDb(databaseUrl);
44
- {{/if}}
45
- {{#if (eq provider "sqlite")}}
46
- const adapter = new PrismaBetterSqlite3({
47
- url: databaseUrl,
15
+ {{else}}
16
+ export const db = postgres<Contract>({
17
+ contractJson,
18
+ url: process.env["DATABASE_URL"],
48
19
  });
49
20
  {{/if}}
50
- {{#if (eq provider "sqlserver")}}
51
- const adapter = new PrismaMssql(databaseUrl);
52
- {{/if}}
53
21
 
54
- export const prismaClientOptions = { adapter };
22
+ export type StarterUser = {
23
+ id: string;
24
+ email: string;
25
+ name: string | null;
26
+ createdAt: Date | null;
27
+ };
55
28
 
56
- export function createPrismaClient() {
57
- return new PrismaClient(prismaClientOptions);
29
+ export async function listUsers(limit = 10): Promise<StarterUser[]> {
30
+ {{#if (eq schemaPreset "basic")}}
31
+ {{#if (eq provider "mongo")}}
32
+ const users: StarterUser[] = [];
33
+
34
+ for await (const user of db.orm.users.select("_id", "email", "name").take(limit).all()) {
35
+ users.push({
36
+ id: String(user._id),
37
+ email: user.email,
38
+ name: user.name ?? null,
39
+ createdAt: null,
40
+ });
41
+ }
42
+
43
+ return users;
44
+ {{else}}
45
+ const users = await db.orm.User.select("id", "email", "name", "createdAt").take(limit).all();
46
+
47
+ return users.map((user) => ({
48
+ id: String(user.id),
49
+ email: user.email,
50
+ name: user.name ?? null,
51
+ createdAt: user.createdAt,
52
+ }));
53
+ {{/if}}
54
+ {{else}}
55
+ return [];
56
+ {{/if}}
58
57
  }
58
+
59
+ export default db;
@@ -1,10 +1,11 @@
1
1
  import { Injectable } from "@nestjs/common";
2
- import { PrismaClient } from "./generated/prisma/client{{#if (eq packageManager "deno")}}.ts{{/if}}";
3
- import { prismaClientOptions } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
2
+ import { db, listUsers, type StarterUser } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
4
3
 
5
4
  @Injectable()
6
- export class PrismaService extends PrismaClient {
7
- constructor() {
8
- super(prismaClientOptions);
5
+ export class PrismaService {
6
+ readonly db = db;
7
+
8
+ listUsers(limit = 10): Promise<StarterUser[]> {
9
+ return listUsers(limit);
9
10
  }
10
11
  }
@@ -8,12 +8,7 @@ export class UsersService {
8
8
  constructor(private readonly prisma: PrismaService) {}
9
9
 
10
10
  async findAll() {
11
- return this.prisma.user.findMany({
12
- take: 10,
13
- orderBy: {
14
- createdAt: "desc",
15
- },
16
- });
11
+ return this.prisma.listUsers(10);
17
12
  }
18
13
  }
19
14
  {{/if}}
@@ -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,23 +8,34 @@ Generated by `create-prisma` with the Next.js template.
8
8
  - `{{runScriptCommand packageManager "build"}}` - production build
9
9
  - `{{runScriptCommand packageManager "start"}}` - run production server
10
10
 
11
- ## Prisma
11
+ ## Prisma Next
12
12
 
13
- Prisma setup is scaffolded automatically in:
13
+ Prisma Next setup is scaffolded in:
14
14
 
15
- - `prisma/schema.prisma`
16
- - `prisma/seed.ts`
15
+ - `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
16
+ - `prisma-next.config.ts`
17
17
  - `src/lib/prisma.ts`
18
- - `prisma.config.ts`
19
- - `src/generated/prisma`
20
18
 
21
19
  Database helper scripts are added to `package.json`:
22
20
 
23
- - `db:generate`
24
- - `db:push`
25
- - `db:migrate`
26
- - `db:seed`
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
24
+ - `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB replica set
25
+ - `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
26
+ - `{{runScriptCommand packageManager "migration:apply"}}` - 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 "migration:apply"}}` - apply a planned migration
32
+ {{/if}}
33
+ {{#if (eq schemaPreset "basic")}}
34
+ - `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
35
+ {{/if}}
36
+
37
+ Node-based Prisma Next projects expect Node.js 24 LTS or newer.
27
38
  {{#if (eq schemaPreset "basic")}}
28
39
 
29
- The starter page in `src/app/page.tsx` reads from a basic `User` model so you can verify queries quickly, and `prisma/seed.ts` inserts starter users.
40
+ The starter page in `src/app/page.tsx` reads from a basic `User` model so you can verify queries quickly after you initialize and apply your schema.
30
41
  {{/if}}
@@ -1,6 +1,6 @@
1
1
  {{#if (eq packageManager "deno")}}
2
2
  {
3
- "nodeModulesDir": "auto",
3
+ "nodeModulesDir": "manual",
4
4
  "unstable": [
5
5
  "bare-node-builtins",
6
6
  "detect-cjs",
@@ -0,0 +1,44 @@
1
+ {{#if (eq authoring "psl")}}
2
+ // use prisma-next
3
+ {{#if (eq schemaPreset "basic")}}
4
+ {{#if (eq provider "mongo")}}
5
+
6
+ model User {
7
+ id ObjectId @id @map("_id")
8
+ email String @unique
9
+ name String?
10
+ posts Post[]
11
+
12
+ @@map("users")
13
+ }
14
+
15
+ model Post {
16
+ id ObjectId @id @map("_id")
17
+ title String
18
+ content String?
19
+ author User @relation(fields: [authorId], references: [id])
20
+ authorId ObjectId
21
+
22
+ @@map("posts")
23
+ }
24
+ {{else}}
25
+
26
+ model User {
27
+ id Int @id @default(autoincrement())
28
+ email String @unique
29
+ name String?
30
+ posts Post[]
31
+ createdAt DateTime @default(now())
32
+ }
33
+
34
+ model Post {
35
+ id Int @id @default(autoincrement())
36
+ title String
37
+ content String?
38
+ author User @relation(fields: [authorId], references: [id])
39
+ authorId Int
40
+ createdAt DateTime @default(now())
41
+ }
42
+ {{/if}}
43
+ {{/if}}
44
+ {{/if}}