create-prisma 0.7.2 → 0.8.0-pr.56.216.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 (131) hide show
  1. package/README.md +35 -159
  2. package/dist/cli.mjs +9 -3
  3. package/dist/create-BeMLn0T7.mjs +1409 -0
  4. package/dist/index.d.mts +43 -62
  5. package/dist/index.mjs +35 -2
  6. package/package.json +24 -19
  7. package/templates/create/_shared/.gitattributes.hbs +11 -0
  8. package/templates/create/_shared/README.md.hbs +39 -0
  9. package/templates/create/_shared/module.ts.hbs +28 -0
  10. package/templates/create/_shared/pnpm-workspace.yaml.hbs +16 -0
  11. package/templates/create/_shared/prisma-composer.config.ts.hbs +11 -0
  12. package/templates/create/_shared/prisma.config.ts.hbs +17 -0
  13. package/templates/create/_shared/service.ts.hbs +42 -0
  14. package/templates/create/_shared/src/prisma/composer.ts.hbs +8 -0
  15. package/templates/create/_shared/src/prisma/db.ts.hbs +51 -0
  16. package/templates/create/_shared/src/prisma/seed.ts.hbs +36 -0
  17. package/templates/create/_shared/src/prisma/users.ts.hbs +35 -0
  18. package/templates/create/astro/{astro.config.mjs.hbs → astro.config.mjs} +1 -2
  19. package/templates/create/astro/package.json.hbs +5 -5
  20. package/templates/create/astro/src/pages/api/users.ts.hbs +6 -23
  21. package/templates/create/astro/src/pages/index.astro.hbs +19 -56
  22. package/templates/create/astro/tsconfig.json +3 -0
  23. package/templates/create/elysia/package.json.hbs +6 -7
  24. package/templates/create/elysia/src/index.ts.hbs +18 -27
  25. package/templates/create/elysia/tsconfig.json +3 -1
  26. package/templates/create/hono/package.json.hbs +6 -7
  27. package/templates/create/hono/src/index.ts.hbs +11 -15
  28. package/templates/create/hono/tsconfig.json +3 -1
  29. package/templates/create/minimal/.yarnrc.yml.hbs +3 -0
  30. package/templates/create/minimal/package.json.hbs +15 -0
  31. package/templates/create/minimal/src/index.ts.hbs +19 -0
  32. package/templates/create/{turborepo/apps/api → minimal}/tsconfig.json +2 -2
  33. package/templates/create/nest/package.json.hbs +7 -7
  34. package/templates/create/nest/src/app.module.ts.hbs +9 -10
  35. package/templates/create/nest/src/main.ts.hbs +3 -10
  36. package/templates/create/nest/src/prisma.service.ts.hbs +6 -5
  37. package/templates/create/nest/src/users.controller.ts.hbs +3 -5
  38. package/templates/create/nest/src/users.service.ts.hbs +4 -11
  39. package/templates/create/nest/tsconfig.json +3 -2
  40. package/templates/create/next/eslint.config.mjs +8 -1
  41. package/templates/create/next/package.json.hbs +10 -10
  42. package/templates/create/next/src/app/page.tsx.hbs +17 -56
  43. package/templates/create/next/tsconfig.json +1 -0
  44. package/templates/create/nuxt/app/pages/index.vue.hbs +12 -45
  45. package/templates/create/nuxt/package.json.hbs +8 -7
  46. package/templates/create/nuxt/server/api/users.get.ts.hbs +3 -15
  47. package/templates/create/nuxt/tsconfig.json +3 -0
  48. package/templates/create/svelte/package.json.hbs +9 -11
  49. package/templates/create/svelte/src/routes/+page.server.ts.hbs +4 -16
  50. package/templates/create/svelte/src/routes/+page.svelte.hbs +14 -164
  51. package/templates/create/svelte/svelte.config.js +1 -4
  52. package/templates/create/svelte/tsconfig.json +2 -1
  53. package/templates/create/svelte/vite.config.ts +3 -0
  54. package/templates/create/tanstack-start/package.json.hbs +14 -14
  55. package/templates/create/tanstack-start/src/routes/__root.tsx.hbs +2 -3
  56. package/templates/create/tanstack-start/src/routes/index.tsx.hbs +27 -78
  57. package/templates/create/tanstack-start/tsconfig.json +4 -2
  58. package/templates/create/tanstack-start/vite.config.ts +2 -4
  59. package/dist/src-B3hRLZ0U.mjs +0 -2527
  60. package/templates/create/astro/README.md.hbs +0 -47
  61. package/templates/create/astro/deno.json.hbs +0 -5
  62. package/templates/create/astro/prisma/schema.prisma.hbs +0 -21
  63. package/templates/create/astro/prisma/seed.ts.hbs +0 -38
  64. package/templates/create/astro/prisma.compute.ts.hbs +0 -10
  65. package/templates/create/astro/prisma.config.ts.hbs +0 -15
  66. package/templates/create/astro/src/lib/prisma.ts.hbs +0 -55
  67. package/templates/create/elysia/README.md.hbs +0 -43
  68. package/templates/create/elysia/deno.json.hbs +0 -5
  69. package/templates/create/elysia/prisma/schema.prisma.hbs +0 -25
  70. package/templates/create/elysia/prisma/seed.ts.hbs +0 -38
  71. package/templates/create/elysia/prisma.compute.ts.hbs +0 -11
  72. package/templates/create/elysia/prisma.config.ts.hbs +0 -15
  73. package/templates/create/elysia/src/lib/prisma.ts.hbs +0 -56
  74. package/templates/create/hono/README.md.hbs +0 -43
  75. package/templates/create/hono/deno.json.hbs +0 -5
  76. package/templates/create/hono/prisma/schema.prisma.hbs +0 -25
  77. package/templates/create/hono/prisma/seed.ts.hbs +0 -38
  78. package/templates/create/hono/prisma.compute.ts.hbs +0 -10
  79. package/templates/create/hono/prisma.config.ts.hbs +0 -15
  80. package/templates/create/hono/src/lib/prisma.ts.hbs +0 -56
  81. package/templates/create/nest/README.md.hbs +0 -43
  82. package/templates/create/nest/deno.json.hbs +0 -5
  83. package/templates/create/nest/prisma/schema.prisma.hbs +0 -25
  84. package/templates/create/nest/prisma/seed.ts.hbs +0 -40
  85. package/templates/create/nest/prisma.compute.ts.hbs +0 -10
  86. package/templates/create/nest/prisma.config.ts.hbs +0 -15
  87. package/templates/create/nest/src/lib/prisma.ts.hbs +0 -58
  88. package/templates/create/next/README.md.hbs +0 -42
  89. package/templates/create/next/deno.json.hbs +0 -12
  90. package/templates/create/next/prisma/schema.prisma.hbs +0 -21
  91. package/templates/create/next/prisma/seed.ts.hbs +0 -38
  92. package/templates/create/next/prisma.compute.ts.hbs +0 -9
  93. package/templates/create/next/prisma.config.ts.hbs +0 -15
  94. package/templates/create/next/src/lib/prisma.ts.hbs +0 -56
  95. package/templates/create/nuxt/README.md.hbs +0 -44
  96. package/templates/create/nuxt/deno.json.hbs +0 -5
  97. package/templates/create/nuxt/prisma/schema.prisma.hbs +0 -21
  98. package/templates/create/nuxt/prisma/seed.ts.hbs +0 -38
  99. package/templates/create/nuxt/prisma.compute.ts.hbs +0 -9
  100. package/templates/create/nuxt/prisma.config.ts.hbs +0 -15
  101. package/templates/create/nuxt/server/utils/prisma.ts.hbs +0 -56
  102. package/templates/create/svelte/README.md.hbs +0 -45
  103. package/templates/create/svelte/deno.json.hbs +0 -5
  104. package/templates/create/svelte/prisma/schema.prisma.hbs +0 -21
  105. package/templates/create/svelte/prisma/seed.ts.hbs +0 -38
  106. package/templates/create/svelte/prisma.config.ts.hbs +0 -15
  107. package/templates/create/svelte/src/lib/server/prisma.ts.hbs +0 -53
  108. package/templates/create/tanstack-start/README.md.hbs +0 -43
  109. package/templates/create/tanstack-start/deno.json.hbs +0 -13
  110. package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -21
  111. package/templates/create/tanstack-start/prisma/seed.ts.hbs +0 -38
  112. package/templates/create/tanstack-start/prisma.compute.ts.hbs +0 -9
  113. package/templates/create/tanstack-start/prisma.config.ts.hbs +0 -15
  114. package/templates/create/tanstack-start/src/lib/prisma.server.ts.hbs +0 -56
  115. package/templates/create/turborepo/README.md.hbs +0 -42
  116. package/templates/create/turborepo/apps/api/package.json.hbs +0 -26
  117. package/templates/create/turborepo/apps/api/src/index.ts.hbs +0 -55
  118. package/templates/create/turborepo/deno.json.hbs +0 -5
  119. package/templates/create/turborepo/package.json.hbs +0 -30
  120. package/templates/create/turborepo/packages/db/package.json.hbs +0 -22
  121. package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +0 -21
  122. package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +0 -38
  123. package/templates/create/turborepo/packages/db/prisma.config.ts.hbs +0 -15
  124. package/templates/create/turborepo/packages/db/src/client.ts.hbs +0 -63
  125. package/templates/create/turborepo/packages/db/src/index.ts +0 -2
  126. package/templates/create/turborepo/packages/db/tsconfig.json +0 -15
  127. package/templates/create/turborepo/pnpm-workspace.yaml +0 -3
  128. package/templates/create/turborepo/prisma.compute.ts.hbs +0 -14
  129. package/templates/create/turborepo/turbo.json +0 -28
  130. /package/templates/create/{turborepo → elysia}/.yarnrc.yml.hbs +0 -0
  131. /package/templates/create/next/{next.config.ts.hbs → next.config.ts} +0 -0
@@ -1,19 +1,12 @@
1
1
  import type { APIRoute } from "astro";
2
- {{#if (eq schemaPreset "basic")}}
3
- import prisma from "../../lib/prisma";
2
+
3
+ import { listUsers } from "../../prisma/users";
4
4
 
5
5
  export const GET: APIRoute = async () => {
6
- const users = await prisma.user
7
- .findMany({
8
- take: 10,
9
- orderBy: {
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,3 @@ export const GET: APIRoute = async () => {
30
23
  },
31
24
  });
32
25
  };
33
- {{else}}
34
-
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
- {{#if (eq schemaPreset "basic")}}
3
- import prisma from "../lib/prisma";
2
+
3
+ import { listUsers } from "../prisma/users";
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 prisma.user
11
- .findMany({
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,12 +22,12 @@ const users = await prisma.user
29
22
  <body>
30
23
  <main class="shell">
31
24
  <div class="hero">
32
- <p class="eyebrow">Astro + Prisma 7</p>
33
- {{#if (eq schemaPreset "basic")}}
25
+ <p class="eyebrow">Astro + Prisma 8</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 instance in
37
- <code>src/lib/prisma.ts</code>. An Astro API route is also scaffolded in
29
+ This page reads from <code>src/pages/index.astro</code> using the Prisma 8 helper in
30
+ <code>src/prisma/users.ts</code>. An Astro API route is also scaffolded in
38
31
  <code>src/pages/api/users.ts</code>.
39
32
  </p>
40
33
  </div>
@@ -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>db:migrate</code>, then <code>db:seed</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 <code>db:seed</code> after your first migration.</p>
47
+ <p class="empty">No users found.</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
- <time datetime={user.createdAt.toISOString()}>
64
- {formatter.format(user.createdAt)}
65
- </time>
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;
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "extends": "astro/tsconfigs/strict",
3
+ "compilerOptions": {
4
+ "types": ["astro/client", "node"]
5
+ },
3
6
  "include": [".astro/types.d.ts", "**/*"],
4
7
  "exclude": ["dist"]
5
8
  }
@@ -5,18 +5,17 @@
5
5
  "packageManager": "{{packageManagerManifestValue packageManager}}",
6
6
  {{/if}}
7
7
  "type": "module",
8
- "main": "src/index.ts",
9
8
  "scripts": {
10
- "dev": "{{runtimeScript packageManager "dev" "src/index.ts" "dist/src/index.js" denoFlags="--unstable-net"}}",
11
- "build": "{{runtimeScript packageManager "build" "src/index.ts" "dist/src/index.js"}}",
12
- "start": "{{runtimeScript packageManager "start" "src/index.ts" "dist/src/index.js" denoFlags="--unstable-net"}}"
9
+ "dev": "tsx watch src/index.ts",
10
+ "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/server.mjs",
11
+ "start": "node dist/server.mjs"
13
12
  },
14
13
  "dependencies": {
15
- "@sinclair/typebox": "^0.34.49",
16
- "elysia": "^1.4.29",
14
+ "@sinclair/typebox": "^0.34.48",
15
+ "elysia": "^1.4.28",
17
16
  "openapi-types": "^12.1.3"
18
17
  },
19
18
  "devDependencies": {
20
- "typescript": "^6.0.3"
19
+ "typescript": "^5.9.3"
21
20
  }
22
21
  }
@@ -1,43 +1,34 @@
1
- {{#if (requiresDotenvConfigImport packageManager)}}
2
- import "dotenv/config";
3
- {{/if}}
4
- {{#if (eq packageManager "deno")}}
5
- {{else}}
6
1
  import { node } from "@elysiajs/node";
7
- {{/if}}
8
2
  import { Elysia } from "elysia";
9
- {{#if (eq schemaPreset "basic")}}
10
- import { prisma } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
11
- {{/if}}
12
3
 
13
- const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
4
+ import { listUsers } from "./prisma/users";
5
+
6
+ const rawPort = (process.env.PORT ?? "").trim();
14
7
  const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
15
8
  const port =
16
- Number.isInteger(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 8080;
9
+ Number.isInteger(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 3000;
17
10
 
18
- const app = new Elysia({{#if (eq packageManager "deno")}}{{else}}{ adapter: node() }{{/if}})
11
+ const app = new Elysia({ adapter: "Bun" in globalThis ? undefined : node() })
19
12
  .get("/", () => {
20
13
  return {
21
14
  message: "hello from create-prisma + elysia",
22
15
  };
23
16
  })
24
- {{#if (eq schemaPreset "basic")}}
25
- .get("/users", async () => {
26
- return prisma.user.findMany({
27
- take: 10,
28
- orderBy: {
29
- createdAt: "desc",
30
- },
17
+
18
+ .get("/users", async ({ set }) => {
19
+ const users = await listUsers(10).catch((error) => {
20
+ console.error("Failed to query users:", error);
21
+ return undefined;
31
22
  });
23
+
24
+ if (!users) {
25
+ set.status = 500;
26
+ return { error: "Could not query users yet. Run contract:emit and apply your schema first." };
27
+ }
28
+
29
+ return users;
32
30
  })
33
- {{/if}}
34
- {{#if (eq packageManager "deno")}}
35
- ;
36
31
 
37
- Deno.serve({ port }, app.fetch);
38
- console.log(`Server running at http://localhost:${port}`);
39
- {{else}}
40
- .listen(port);
32
+ .listen({ port, hostname: "0.0.0.0" });
41
33
 
42
34
  console.log(`Server running at http://localhost:${app.server?.port ?? port}`);
43
- {{/if}}
@@ -3,12 +3,14 @@
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,
9
10
  "skipLibCheck": true,
10
11
  "forceConsistentCasingInFileNames": true,
11
12
  "outDir": "dist",
12
- "rootDir": "."
13
+ "rootDir": ".",
14
+ "types": ["node"]
13
15
  }
14
16
  }
@@ -5,18 +5,17 @@
5
5
  "packageManager": "{{packageManagerManifestValue packageManager}}",
6
6
  {{/if}}
7
7
  "type": "module",
8
- "main": "src/index.ts",
9
8
  "scripts": {
10
9
  "dev": "{{runtimeScript packageManager "dev" "src/index.ts" "dist/src/index.js"}}",
11
- "build": "{{runtimeScript packageManager "build" "src/index.ts" "dist/src/index.js"}}",
12
- "start": "{{runtimeScript packageManager "start" "src/index.ts" "dist/src/index.js"}}"
10
+ "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/server.mjs",
11
+ "start": "node dist/server.mjs"
13
12
  },
14
13
  "dependencies": {
15
- "@hono/node-server": "^2.0.6",
16
- "hono": "^4.12.27"
14
+ "@hono/node-server": "^1.19.9",
15
+ "hono": "^4.12.2"
17
16
  },
18
17
  "devDependencies": {
19
- "@types/node": "^26.0.0",
20
- "typescript": "^6.0.3"
18
+ "@types/node": "^20.11.17",
19
+ "typescript": "^5.9.3"
21
20
  }
22
21
  }
@@ -1,11 +1,7 @@
1
- {{#if (requiresDotenvConfigImport packageManager)}}
2
- import "dotenv/config";
3
- {{/if}}
4
1
  import { serve } from "@hono/node-server";
5
2
  import { Hono } from "hono";
6
- {{#if (eq schemaPreset "basic")}}
7
- import { prisma } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
8
- {{/if}}
3
+
4
+ import { listUsers } from "./prisma/users";
9
5
 
10
6
  const app = new Hono();
11
7
 
@@ -14,24 +10,24 @@ app.get("/", (c) => {
14
10
  message: "hello from create-prisma + hono",
15
11
  });
16
12
  });
17
- {{#if (eq schemaPreset "basic")}}
18
13
 
19
14
  app.get("/users", async (c) => {
20
- const users = await prisma.user.findMany({
21
- take: 10,
22
- orderBy: {
23
- createdAt: "desc",
24
- },
15
+ const users = await listUsers(10).catch((error) => {
16
+ console.error("Failed to query users:", error);
17
+ return undefined;
25
18
  });
26
19
 
20
+ if (!users) {
21
+ return c.json({ error: "Could not query users yet. Run contract:emit and apply your schema first." }, 500);
22
+ }
23
+
27
24
  return c.json(users);
28
25
  });
29
- {{/if}}
30
26
 
31
- const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
27
+ const rawPort = (process.env.PORT ?? "").trim();
32
28
  const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
33
29
  const port =
34
- Number.isInteger(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 8080;
30
+ Number.isInteger(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 3000;
35
31
  serve({
36
32
  fetch: app.fetch,
37
33
  port,
@@ -3,12 +3,14 @@
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,
9
10
  "skipLibCheck": true,
10
11
  "forceConsistentCasingInFileNames": true,
11
12
  "outDir": "dist",
12
- "rootDir": "."
13
+ "rootDir": ".",
14
+ "types": ["node"]
13
15
  }
14
16
  }
@@ -0,0 +1,3 @@
1
+ {{#if (eq packageManager "yarn")}}
2
+ nodeLinker: node-modules
3
+ {{/if}}
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "private": true,
4
+ {{#if (packageManagerManifestValue packageManager)}}
5
+ "packageManager": "{{packageManagerManifestValue packageManager}}",
6
+ {{/if}}
7
+ "type": "module",
8
+ "scripts": {
9
+ "dev": "tsx watch src/index.ts",
10
+ "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/server.mjs",
11
+ "start": "node dist/server.mjs"
12
+ },
13
+ "dependencies": {},
14
+ "devDependencies": {}
15
+ }
@@ -0,0 +1,19 @@
1
+ import { createServer } from "node:http";
2
+
3
+ import { listUsers } from "./prisma/users";
4
+
5
+ const port = Number(process.env.PORT ?? 3000);
6
+
7
+ createServer(async (_request, response) => {
8
+ try {
9
+ const users = await listUsers();
10
+ response.writeHead(200, { "content-type": "application/json" });
11
+ response.end(JSON.stringify({ users }));
12
+ } catch (error) {
13
+ console.error("Failed to query users:", error);
14
+ response.writeHead(500, { "content-type": "application/json" });
15
+ response.end(JSON.stringify({ error: "Could not query users yet." }));
16
+ }
17
+ }).listen(port, "0.0.0.0", () => {
18
+ console.log(`Server running at http://localhost:${port}`);
19
+ });
@@ -3,13 +3,13 @@
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,
9
10
  "skipLibCheck": true,
10
11
  "forceConsistentCasingInFileNames": true,
11
- "outDir": "dist",
12
- "rootDir": "."
12
+ "types": ["node"]
13
13
  },
14
14
  "include": ["src/**/*.ts"]
15
15
  }
@@ -7,18 +7,18 @@
7
7
  "type": "module",
8
8
  "scripts": {
9
9
  "dev": "{{runtimeScript packageManager "dev" "src/main.ts" "dist/main.js"}}",
10
- "build": "{{runtimeScript packageManager "build" "src/main.ts" "dist/main.js" emit=true}}",
11
- "start": "{{runtimeScript packageManager "start" "src/main.ts" "dist/main.js"}}"
10
+ "build": "esbuild src/main.ts --bundle --platform=node --format=esm --outfile=dist/server.mjs --banner:js=\"import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);\" --external:'@nestjs/websockets/*' --external:@nestjs/microservices --external:'@nestjs/microservices/*' --external:@nestjs/platform-socket.io --external:class-transformer --external:class-validator",
11
+ "start": "node dist/server.mjs"
12
12
  },
13
13
  "dependencies": {
14
- "@nestjs/common": "^11.1.27",
15
- "@nestjs/core": "^11.1.27",
16
- "@nestjs/platform-express": "^11.1.27",
14
+ "@nestjs/common": "^11.1.17",
15
+ "@nestjs/core": "^11.1.17",
16
+ "@nestjs/platform-express": "^11.1.17",
17
17
  "reflect-metadata": "^0.2.2",
18
18
  "rxjs": "^7.8.2"
19
19
  },
20
20
  "devDependencies": {
21
- "@types/node": "^26.0.0",
22
- "typescript": "^6.0.3"
21
+ "@types/node": "^25.5.0",
22
+ "typescript": "^5.9.3"
23
23
  }
24
24
  }
@@ -1,20 +1,19 @@
1
1
  import { Module } from "@nestjs/common";
2
- import { AppController } from "./app.controller{{#if (eq packageManager "deno")}}.ts{{/if}}";
3
- import { PrismaService } from "./prisma.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
4
- {{#if (eq schemaPreset "basic")}}
5
- import { UsersController } from "./users.controller{{#if (eq packageManager "deno")}}.ts{{/if}}";
6
- import { UsersService } from "./users.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
7
- {{/if}}
2
+ import { AppController } from "./app.controller";
3
+ import { PrismaService } from "./prisma.service";
4
+
5
+ import { UsersController } from "./users.controller";
6
+ import { UsersService } from "./users.service";
8
7
 
9
8
  @Module({
10
9
  imports: [],
11
10
  controllers: [
12
- AppController{{#if (eq schemaPreset "basic")}},
13
- UsersController{{/if}}
11
+ AppController,
12
+ UsersController
14
13
  ],
15
14
  providers: [
16
- PrismaService{{#if (eq schemaPreset "basic")}},
17
- UsersService{{/if}}
15
+ PrismaService,
16
+ UsersService
18
17
  ],
19
18
  })
20
19
  export class AppModule {}
@@ -1,27 +1,20 @@
1
1
  import "reflect-metadata";
2
- {{#if (requiresDotenvConfigImport packageManager)}}
3
- import "dotenv/config";
4
- {{/if}}
5
2
 
6
3
  import { NestFactory } from "@nestjs/core";
7
4
 
8
- import { AppModule } from "./app.module{{#if (eq packageManager "deno")}}.ts{{/if}}";
5
+ import { AppModule } from "./app.module";
9
6
 
10
7
  async function bootstrap() {
11
8
  const app = await NestFactory.create(AppModule);
12
- const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
9
+ const rawPort = (process.env.PORT ?? "").trim();
13
10
  const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
14
11
  const port =
15
12
  Number.isFinite(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 3000;
16
- await app.listen(port, "0.0.0.0");
13
+ await app.listen(port);
17
14
  console.log(`Server running at http://localhost:${port}`);
18
15
  }
19
16
 
20
17
  bootstrap().catch((error) => {
21
18
  console.error("Failed to start server", error);
22
- {{#if (eq packageManager "deno")}}
23
- Deno.exit(1);
24
- {{else}}
25
19
  process.exit(1);
26
- {{/if}}
27
20
  });
@@ -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 "./prisma/users";
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
  }
@@ -1,15 +1,13 @@
1
- {{#if (eq schemaPreset "basic")}}
2
- import { Controller, Get } from "@nestjs/common";
1
+ import { Controller, Get, Inject } from "@nestjs/common";
3
2
 
4
- import { UsersService } from "./users.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
3
+ import { UsersService } from "./users.service";
5
4
 
6
5
  @Controller("users")
7
6
  export class UsersController {
8
- constructor(private readonly usersService: UsersService) {}
7
+ constructor(@Inject(UsersService) private readonly usersService: UsersService) {}
9
8
 
10
9
  @Get()
11
10
  findAll() {
12
11
  return this.usersService.findAll();
13
12
  }
14
13
  }
15
- {{/if}}
@@ -1,19 +1,12 @@
1
- {{#if (eq schemaPreset "basic")}}
2
- import { Injectable } from "@nestjs/common";
1
+ import { Inject, Injectable } from "@nestjs/common";
3
2
 
4
- import { PrismaService } from "./prisma.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
3
+ import { PrismaService } from "./prisma.service";
5
4
 
6
5
  @Injectable()
7
6
  export class UsersService {
8
- constructor(private readonly prisma: PrismaService) {}
7
+ constructor(@Inject(PrismaService) private readonly prisma: PrismaService) {}
9
8
 
10
9
  async findAll() {
11
- return this.prisma.user.findMany({
12
- take: 10,
13
- orderBy: {
14
- createdAt: "desc",
15
- },
16
- });
10
+ return this.prisma.listUsers(10);
17
11
  }
18
12
  }
19
- {{/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,
@@ -10,8 +11,8 @@
10
11
  "forceConsistentCasingInFileNames": true,
11
12
  "emitDecoratorMetadata": true,
12
13
  "experimentalDecorators": true,
13
- "rootDir": "src",
14
- "outDir": "dist"
14
+ "outDir": "dist",
15
+ "types": ["node"]
15
16
  },
16
17
  "include": ["src/**/*.ts"]
17
18
  }
@@ -5,7 +5,14 @@ import nextTs from "eslint-config-next/typescript";
5
5
  const eslintConfig = defineConfig([
6
6
  ...nextVitals,
7
7
  ...nextTs,
8
- globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]),
8
+ globalIgnores([
9
+ ".next/**",
10
+ "out/**",
11
+ "build/**",
12
+ "migrations/**",
13
+ "src/prisma/**/*.d.ts",
14
+ "next-env.d.ts",
15
+ ]),
9
16
  ]);
10
17
 
11
18
  export default eslintConfig;
@@ -13,17 +13,17 @@
13
13
  "lint": "eslint"
14
14
  },
15
15
  "dependencies": {
16
- "next": "16.2.9",
17
- "react": "19.2.7",
18
- "react-dom": "19.2.7"
16
+ "next": "16.1.6",
17
+ "react": "19.2.3",
18
+ "react-dom": "19.2.3"
19
19
  },
20
20
  "devDependencies": {
21
- "@types/node": "^26.0.0",
22
- "@types/react": "^19.2.17",
23
- "@types/react-dom": "^19.2.3",
24
- "eslint": "^10.5.0",
25
- "eslint-config-next": "16.2.9",
26
- "tsx": "^4.22.4",
27
- "typescript": "^6.0.3"
21
+ "@types/node": "^20",
22
+ "@types/react": "^19",
23
+ "@types/react-dom": "^19",
24
+ "eslint": "^9",
25
+ "eslint-config-next": "16.1.6",
26
+ "tsx": "^4.7.1",
27
+ "typescript": "^5.9.3"
28
28
  }
29
29
  }