create-prisma 0.3.2 → 0.4.0-pr.32.60.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 (47) hide show
  1. package/README.md +86 -117
  2. package/dist/cli.mjs +1 -1
  3. package/dist/{create-DOr8R2_6.mjs → create-Dm_HiTCj.mjs} +221 -120
  4. package/dist/index.d.mts +6 -0
  5. package/dist/index.mjs +2 -2
  6. package/package.json +1 -1
  7. package/templates/create/astro/src/pages/index.astro.hbs +39 -49
  8. package/templates/create/elysia/README.md.hbs +32 -0
  9. package/templates/create/elysia/deno.json.hbs +5 -0
  10. package/templates/create/elysia/package.json.hbs +21 -0
  11. package/templates/create/elysia/prisma/schema.prisma.hbs +25 -0
  12. package/templates/create/elysia/prisma/seed.ts.hbs +42 -0
  13. package/templates/create/elysia/prisma.config.ts.hbs +15 -0
  14. package/templates/create/elysia/src/index.ts.hbs +43 -0
  15. package/templates/create/elysia/src/lib/prisma.ts.hbs +56 -0
  16. package/templates/create/elysia/tsconfig.json +14 -0
  17. package/templates/create/hono/README.md.hbs +3 -2
  18. package/templates/create/hono/package.json.hbs +3 -4
  19. package/templates/create/hono/prisma/schema.prisma.hbs +4 -0
  20. package/templates/create/hono/prisma/seed.ts.hbs +5 -1
  21. package/templates/create/hono/prisma.config.ts.hbs +15 -0
  22. package/templates/create/hono/src/index.ts.hbs +8 -2
  23. package/templates/create/hono/src/lib/prisma.ts.hbs +6 -3
  24. package/templates/create/nest/.yarnrc.yml.hbs +3 -0
  25. package/templates/create/nest/README.md.hbs +32 -0
  26. package/templates/create/nest/deno.json.hbs +5 -0
  27. package/templates/create/nest/package.json.hbs +24 -0
  28. package/templates/create/nest/prisma/schema.prisma.hbs +25 -0
  29. package/templates/create/nest/prisma/seed.ts.hbs +44 -0
  30. package/templates/create/nest/prisma.config.ts.hbs +15 -0
  31. package/templates/create/nest/src/app.controller.ts.hbs +11 -0
  32. package/templates/create/nest/src/app.module.ts.hbs +20 -0
  33. package/templates/create/nest/src/lib/prisma.ts.hbs +58 -0
  34. package/templates/create/nest/src/main.ts.hbs +27 -0
  35. package/templates/create/nest/src/prisma.service.ts.hbs +10 -0
  36. package/templates/create/nest/src/users.controller.ts.hbs +15 -0
  37. package/templates/create/nest/src/users.service.ts.hbs +19 -0
  38. package/templates/create/nest/tsconfig.json +16 -0
  39. package/templates/create/next/src/app/globals.css +38 -46
  40. package/templates/create/nuxt/app/pages/index.vue.hbs +45 -55
  41. package/templates/create/svelte/src/routes/+page.svelte.hbs +78 -99
  42. package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -1
  43. package/templates/create/tanstack-start/src/routes/index.tsx.hbs +28 -30
  44. package/templates/create/tanstack-start/src/styles.css +80 -121
  45. package/templates/create/turborepo/apps/api/package.json.hbs +0 -2
  46. package/templates/create/turborepo/apps/api/src/index.ts.hbs +7 -1
  47. package/templates/create/hono/prisma.config.ts +0 -13
@@ -0,0 +1,44 @@
1
+ import { createPrismaClient } from "../src/lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
2
+
3
+ const prisma = createPrismaClient();
4
+
5
+ async function main() {
6
+ {{#if (eq schemaPreset "basic")}}
7
+ const users = await Promise.all([
8
+ prisma.user.upsert({
9
+ where: { email: "alice@prisma.io" },
10
+ update: { name: "Alice" },
11
+ create: {
12
+ email: "alice@prisma.io",
13
+ name: "Alice",
14
+ },
15
+ }),
16
+ prisma.user.upsert({
17
+ where: { email: "bob@prisma.io" },
18
+ update: { name: "Bob" },
19
+ create: {
20
+ email: "bob@prisma.io",
21
+ name: "Bob",
22
+ },
23
+ }),
24
+ ]);
25
+
26
+ console.log(`Seeded ${users.length} users.`);
27
+ {{else}}
28
+ console.log("No seed data defined for the empty schema preset.");
29
+ {{/if}}
30
+ }
31
+
32
+ main()
33
+ .then(async () => {
34
+ await prisma.$disconnect();
35
+ })
36
+ .catch(async (error) => {
37
+ console.error(error);
38
+ await prisma.$disconnect();
39
+ {{#if (eq packageManager "deno")}}
40
+ Deno.exit(1);
41
+ {{else}}
42
+ process.exit(1);
43
+ {{/if}}
44
+ });
@@ -0,0 +1,15 @@
1
+ {{#if (requiresDotenvConfigImport packageManager)}}
2
+ import "dotenv/config";
3
+ {{/if}}
4
+ import { defineConfig, env } from "prisma/config";
5
+
6
+ export default defineConfig({
7
+ schema: "prisma/schema.prisma",
8
+ migrations: {
9
+ path: "prisma/migrations",
10
+ seed: "{{#if (eq packageManager "deno")}}deno run -A --env-file=.env ./prisma/seed.ts{{else}}{{#if (eq packageManager "bun")}}bun ./prisma/seed.ts{{else}}tsx prisma/seed.ts{{/if}}{{/if}}",
11
+ },
12
+ datasource: {
13
+ url: env("DATABASE_URL"),
14
+ },
15
+ });
@@ -0,0 +1,11 @@
1
+ import { Controller, Get } from "@nestjs/common";
2
+
3
+ @Controller()
4
+ export class AppController {
5
+ @Get()
6
+ getRoot() {
7
+ return {
8
+ message: "hello from create-prisma + nest",
9
+ };
10
+ }
11
+ }
@@ -0,0 +1,20 @@
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}}
8
+
9
+ @Module({
10
+ imports: [],
11
+ controllers: [
12
+ AppController{{#if (eq schemaPreset "basic")}},
13
+ UsersController{{/if}}
14
+ ],
15
+ providers: [
16
+ PrismaService{{#if (eq schemaPreset "basic")}},
17
+ UsersService{{/if}}
18
+ ],
19
+ })
20
+ export class AppModule {}
@@ -0,0 +1,58 @@
1
+ {{#if (requiresDotenvConfigImport packageManager)}}
2
+ 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";
25
+ {{else}}
26
+ const databaseUrl = (rawDatabaseUrl ?? "").trim();
27
+ if (!databaseUrl) {
28
+ throw new Error("DATABASE_URL is required");
29
+ }
30
+ {{/if}}
31
+
32
+ {{#if (eq provider "postgresql")}}
33
+ const adapter = new PrismaPg({
34
+ connectionString: databaseUrl,
35
+ });
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,
48
+ });
49
+ {{/if}}
50
+ {{#if (eq provider "sqlserver")}}
51
+ const adapter = new PrismaMssql(databaseUrl);
52
+ {{/if}}
53
+
54
+ export const prismaClientOptions = { adapter };
55
+
56
+ export function createPrismaClient() {
57
+ return new PrismaClient(prismaClientOptions);
58
+ }
@@ -0,0 +1,27 @@
1
+ import "reflect-metadata";
2
+ {{#if (requiresDotenvConfigImport packageManager)}}
3
+ import "dotenv/config";
4
+ {{/if}}
5
+
6
+ import { NestFactory } from "@nestjs/core";
7
+
8
+ import { AppModule } from "./app.module{{#if (eq packageManager "deno")}}.ts{{/if}}";
9
+
10
+ async function bootstrap() {
11
+ const app = await NestFactory.create(AppModule);
12
+ const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
13
+ const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
14
+ const port =
15
+ Number.isFinite(parsedPort) && parsedPort >= 0 && parsedPort <= 65535 ? parsedPort : 3000;
16
+ await app.listen(port);
17
+ console.log(`Server running at http://localhost:${port}`);
18
+ }
19
+
20
+ bootstrap().catch((error) => {
21
+ console.error("Failed to start server", error);
22
+ {{#if (eq packageManager "deno")}}
23
+ Deno.exit(1);
24
+ {{else}}
25
+ process.exit(1);
26
+ {{/if}}
27
+ });
@@ -0,0 +1,10 @@
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}}";
4
+
5
+ @Injectable()
6
+ export class PrismaService extends PrismaClient {
7
+ constructor() {
8
+ super(prismaClientOptions);
9
+ }
10
+ }
@@ -0,0 +1,15 @@
1
+ {{#if (eq schemaPreset "basic")}}
2
+ import { Controller, Get } from "@nestjs/common";
3
+
4
+ import { UsersService } from "./users.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
5
+
6
+ @Controller("users")
7
+ export class UsersController {
8
+ constructor(private readonly usersService: UsersService) {}
9
+
10
+ @Get()
11
+ findAll() {
12
+ return this.usersService.findAll();
13
+ }
14
+ }
15
+ {{/if}}
@@ -0,0 +1,19 @@
1
+ {{#if (eq schemaPreset "basic")}}
2
+ import { Injectable } from "@nestjs/common";
3
+
4
+ import { PrismaService } from "./prisma.service{{#if (eq packageManager "deno")}}.ts{{/if}}";
5
+
6
+ @Injectable()
7
+ export class UsersService {
8
+ constructor(private readonly prisma: PrismaService) {}
9
+
10
+ async findAll() {
11
+ return this.prisma.user.findMany({
12
+ take: 10,
13
+ orderBy: {
14
+ createdAt: "desc",
15
+ },
16
+ });
17
+ }
18
+ }
19
+ {{/if}}
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "verbatimModuleSyntax": true,
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "emitDecoratorMetadata": true,
12
+ "experimentalDecorators": true,
13
+ "outDir": "dist"
14
+ },
15
+ "include": ["src/**/*.ts"]
16
+ }
@@ -6,56 +6,50 @@
6
6
  box-sizing: border-box;
7
7
  }
8
8
 
9
- html {
10
- font-size: 16px;
11
- }
12
-
13
9
  body {
14
10
  margin: 0;
15
- font-family: "Instrument Sans", "Segoe UI", sans-serif;
16
- background: #f7f8fb;
17
- color: #0f172a;
11
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
12
+ background: #fff;
13
+ color: #111;
18
14
  }
19
15
 
20
16
  .shell {
21
- width: min(64rem, 100%);
17
+ max-width: 40rem;
22
18
  margin: 0 auto;
23
- padding: 4rem 1.5rem 5rem;
19
+ padding: 3rem 1.5rem;
24
20
  }
25
21
 
26
22
  .hero {
27
- margin-bottom: 2rem;
23
+ margin-bottom: 1.5rem;
28
24
  }
29
25
 
30
26
  .eyebrow {
31
- margin: 0 0 0.75rem;
32
- color: #10b981;
33
- font-size: 0.875rem;
34
- font-weight: 700;
35
- letter-spacing: 0.14em;
27
+ margin: 0 0 0.5rem;
28
+ color: #666;
29
+ font-size: 0.75rem;
30
+ font-weight: 600;
31
+ letter-spacing: 0.06em;
36
32
  text-transform: uppercase;
37
33
  }
38
34
 
39
35
  h1 {
40
36
  margin: 0;
41
- max-width: 12ch;
42
- font-size: clamp(2.75rem, 7vw, 5rem);
43
- line-height: 0.95;
37
+ font-size: 1.25rem;
38
+ font-weight: 600;
39
+ line-height: 1.4;
44
40
  }
45
41
 
46
42
  .lede {
47
- max-width: 42rem;
48
- font-size: 1.05rem;
49
- line-height: 1.7;
50
- color: #475569;
43
+ margin: 0.5rem 0 0;
44
+ color: #666;
45
+ font-size: 0.875rem;
46
+ line-height: 1.6;
51
47
  }
52
48
 
53
49
  .panel {
54
- padding: 1.5rem;
55
- border: 1px solid #dbe2ea;
56
- border-radius: 1.5rem;
57
- background: #ffffff;
58
- box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
50
+ border: 1px solid #e5e5e5;
51
+ border-radius: 0.5rem;
52
+ padding: 1rem;
59
53
  }
60
54
 
61
55
  .panelHeader {
@@ -63,22 +57,25 @@ h1 {
63
57
  align-items: center;
64
58
  justify-content: space-between;
65
59
  gap: 1rem;
66
- margin-bottom: 1rem;
60
+ margin-bottom: 0.75rem;
67
61
  }
68
62
 
69
63
  h2 {
70
64
  margin: 0;
71
- font-size: 1.125rem;
65
+ font-size: 0.875rem;
66
+ font-weight: 600;
72
67
  }
73
68
 
74
69
  .panelHeader span,
75
70
  .empty,
76
71
  time {
77
- color: #64748b;
72
+ color: #888;
73
+ font-size: 0.8rem;
78
74
  }
79
75
 
80
76
  .panel p {
81
- color: #64748b;
77
+ color: #666;
78
+ font-size: 0.8rem;
82
79
  }
83
80
 
84
81
  .users {
@@ -86,7 +83,7 @@ time {
86
83
  margin: 0;
87
84
  padding: 0;
88
85
  display: grid;
89
- gap: 0.75rem;
86
+ gap: 0.5rem;
90
87
  }
91
88
 
92
89
  .users li {
@@ -94,34 +91,29 @@ time {
94
91
  align-items: center;
95
92
  justify-content: space-between;
96
93
  gap: 1rem;
97
- padding: 1rem 1.125rem;
98
- border-radius: 1rem;
99
- background: #f8fafc;
100
- border: 1px solid #dbe2ea;
94
+ padding: 0.625rem 0.75rem;
95
+ border: 1px solid #eee;
96
+ border-radius: 0.375rem;
101
97
  }
102
98
 
103
99
  .users p {
104
- margin: 0.2rem 0 0;
100
+ margin: 0.125rem 0 0;
105
101
  }
106
102
 
107
103
  time {
108
- font-size: 0.875rem;
104
+ font-size: 0.75rem;
109
105
  white-space: nowrap;
110
106
  }
111
107
 
112
108
  code {
113
- padding: 0.15rem 0.4rem;
114
- border-radius: 0.35rem;
115
- background: #eef2f7;
109
+ padding: 0.125rem 0.25rem;
110
+ border-radius: 0.25rem;
111
+ background: #f5f5f5;
116
112
  font-family: SFMono-Regular, Consolas, monospace;
117
- font-size: 0.95em;
113
+ font-size: 0.875em;
118
114
  }
119
115
 
120
116
  @media (max-width: 640px) {
121
- .shell {
122
- padding-top: 3rem;
123
- }
124
-
125
117
  .users li,
126
118
  .panelHeader {
127
119
  flex-direction: column;
@@ -90,13 +90,13 @@ function formatCreatedAt(value: string): string {
90
90
  <p>Start from <code>server/api/users.get.ts</code> for server-side data access.</p>
91
91
  </div>
92
92
  </li>
93
- <li>
94
- <div>
95
- <strong>Generated client output</strong>
93
+ <li>
94
+ <div>
95
+ <strong>Generated client output</strong>
96
96
  <p>Prisma Client is generated into <code>server/generated/prisma</code>.</p>
97
- </div>
98
- </li>
99
- </ul>
97
+ </div>
98
+ </li>
99
+ </ul>
100
100
  </section>
101
101
  {{/if}}
102
102
  </main>
@@ -105,53 +105,48 @@ function formatCreatedAt(value: string): string {
105
105
  <style>
106
106
  body {
107
107
  margin: 0;
108
- font-family:
109
- "Instrument Sans",
110
- "Segoe UI",
111
- sans-serif;
112
- background: #f7f8fb;
113
- color: #0f172a;
108
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
109
+ background: #fff;
110
+ color: #111;
114
111
  }
115
112
 
116
113
  .shell {
117
- width: min(64rem, 100%);
114
+ max-width: 40rem;
118
115
  margin: 0 auto;
119
- padding: 4rem 1.5rem 5rem;
116
+ padding: 3rem 1.5rem;
120
117
  }
121
118
 
122
119
  .hero {
123
- margin-bottom: 2rem;
120
+ margin-bottom: 1.5rem;
124
121
  }
125
122
 
126
123
  .eyebrow {
127
- margin: 0 0 0.75rem;
128
- color: #10b981;
129
- font-size: 0.875rem;
130
- font-weight: 700;
131
- letter-spacing: 0.14em;
124
+ margin: 0 0 0.5rem;
125
+ color: #666;
126
+ font-size: 0.75rem;
127
+ font-weight: 600;
128
+ letter-spacing: 0.06em;
132
129
  text-transform: uppercase;
133
130
  }
134
131
 
135
132
  h1 {
136
133
  margin: 0;
137
- max-width: 12ch;
138
- font-size: clamp(2.75rem, 7vw, 5rem);
139
- line-height: 0.95;
134
+ font-size: 1.25rem;
135
+ font-weight: 600;
136
+ line-height: 1.4;
140
137
  }
141
138
 
142
139
  .lede {
143
- max-width: 42rem;
144
- font-size: 1.05rem;
145
- line-height: 1.7;
146
- color: #475569;
140
+ margin: 0.5rem 0 0;
141
+ color: #666;
142
+ font-size: 0.875rem;
143
+ line-height: 1.6;
147
144
  }
148
145
 
149
146
  .panel {
150
- padding: 1.5rem;
151
- border: 1px solid #dbe2ea;
152
- border-radius: 1.5rem;
153
- background: #ffffff;
154
- box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
147
+ border: 1px solid #e5e5e5;
148
+ border-radius: 0.5rem;
149
+ padding: 1rem;
155
150
  }
156
151
 
157
152
  .panel-header {
@@ -159,22 +154,25 @@ h1 {
159
154
  align-items: center;
160
155
  justify-content: space-between;
161
156
  gap: 1rem;
162
- margin-bottom: 1rem;
157
+ margin-bottom: 0.75rem;
163
158
  }
164
159
 
165
160
  h2 {
166
161
  margin: 0;
167
- font-size: 1.125rem;
162
+ font-size: 0.875rem;
163
+ font-weight: 600;
168
164
  }
169
165
 
170
166
  .panel-header span,
171
167
  .empty,
172
168
  time {
173
- color: #64748b;
169
+ color: #888;
170
+ font-size: 0.8rem;
174
171
  }
175
172
 
176
173
  .panel p {
177
- color: #64748b;
174
+ color: #666;
175
+ font-size: 0.8rem;
178
176
  }
179
177
 
180
178
  .users {
@@ -182,7 +180,7 @@ time {
182
180
  margin: 0;
183
181
  padding: 0;
184
182
  display: grid;
185
- gap: 0.75rem;
183
+ gap: 0.5rem;
186
184
  }
187
185
 
188
186
  .users li {
@@ -190,37 +188,29 @@ time {
190
188
  align-items: center;
191
189
  justify-content: space-between;
192
190
  gap: 1rem;
193
- padding: 1rem 1.125rem;
194
- border-radius: 1rem;
195
- background: #f8fafc;
196
- border: 1px solid #dbe2ea;
191
+ padding: 0.625rem 0.75rem;
192
+ border: 1px solid #eee;
193
+ border-radius: 0.375rem;
197
194
  }
198
195
 
199
196
  .users p {
200
- margin: 0.2rem 0 0;
197
+ margin: 0.125rem 0 0;
201
198
  }
202
199
 
203
200
  time {
204
- font-size: 0.875rem;
201
+ font-size: 0.75rem;
205
202
  white-space: nowrap;
206
203
  }
207
204
 
208
205
  code {
209
- padding: 0.15rem 0.4rem;
210
- border-radius: 0.35rem;
211
- background: #eef2f7;
212
- font-family:
213
- SFMono-Regular,
214
- Consolas,
215
- monospace;
216
- font-size: 0.95em;
206
+ padding: 0.125rem 0.25rem;
207
+ border-radius: 0.25rem;
208
+ background: #f5f5f5;
209
+ font-family: SFMono-Regular, Consolas, monospace;
210
+ font-size: 0.875em;
217
211
  }
218
212
 
219
213
  @media (max-width: 640px) {
220
- .shell {
221
- padding-top: 3rem;
222
- }
223
-
224
214
  .users li,
225
215
  .panel-header {
226
216
  flex-direction: column;