create-prisma 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -16
- package/dist/cli.mjs +1 -1
- package/dist/{create-Dz9GFGFQ.mjs → create-DgN5mAMV.mjs} +1031 -444
- package/dist/index.d.mts +31 -57
- package/dist/index.mjs +10 -21
- package/package.json +2 -2
- package/templates/create/astro/.yarnrc.yml.hbs +3 -0
- package/templates/create/astro/README.md.hbs +35 -0
- package/templates/create/astro/astro.config.mjs +5 -0
- package/templates/create/astro/deno.json.hbs +5 -0
- package/templates/create/astro/package.json.hbs +22 -0
- package/templates/{init → create/astro}/prisma/schema.prisma.hbs +4 -1
- package/templates/create/astro/prisma/seed.ts.hbs +38 -0
- package/templates/{init/prisma.config.ts.hbs → create/astro/prisma.config.ts} +1 -0
- package/templates/create/astro/public/favicon.svg +14 -0
- package/templates/create/astro/src/env.d.ts +9 -0
- package/templates/create/astro/src/lib/prisma.ts.hbs +53 -0
- package/templates/create/astro/src/pages/api/users.ts.hbs +42 -0
- package/templates/create/astro/src/pages/index.astro.hbs +236 -0
- package/templates/create/astro/tsconfig.json +5 -0
- package/templates/create/hono/.yarnrc.yml.hbs +3 -0
- package/templates/create/hono/README.md.hbs +13 -48
- package/templates/create/hono/deno.json.hbs +5 -0
- package/templates/create/hono/package.json.hbs +3 -0
- package/templates/create/hono/prisma/schema.prisma.hbs +21 -0
- package/templates/create/hono/prisma/seed.ts.hbs +38 -0
- package/templates/create/hono/prisma.config.ts +13 -0
- package/templates/create/hono/src/index.ts.hbs +1 -1
- package/templates/{init/prisma/index.ts.hbs → create/hono/src/lib/prisma.ts.hbs} +14 -13
- package/templates/create/hono/tsconfig.json +1 -2
- package/templates/create/next/.yarnrc.yml.hbs +3 -0
- package/templates/create/next/README.md.hbs +8 -23
- package/templates/create/next/deno.json.hbs +12 -0
- package/templates/create/next/package.json.hbs +4 -0
- package/templates/create/next/prisma/schema.prisma.hbs +21 -0
- package/templates/create/next/prisma/seed.ts.hbs +38 -0
- package/templates/create/next/prisma.config.ts +13 -0
- package/templates/create/next/src/app/globals.css +136 -0
- package/templates/create/next/src/app/page.tsx.hbs +104 -0
- package/templates/create/next/src/lib/prisma.ts.hbs +53 -0
- package/templates/create/nuxt/.yarnrc.yml.hbs +3 -0
- package/templates/create/nuxt/README.md.hbs +32 -0
- package/templates/create/nuxt/app/app.vue +4 -0
- package/templates/create/nuxt/app/pages/index.vue.hbs +230 -0
- package/templates/create/nuxt/deno.json.hbs +5 -0
- package/templates/create/nuxt/nuxt.config.ts +5 -0
- package/templates/create/nuxt/package.json.hbs +27 -0
- package/templates/create/nuxt/prisma/schema.prisma.hbs +21 -0
- package/templates/create/nuxt/prisma/seed.ts.hbs +38 -0
- package/templates/create/nuxt/prisma.config.ts +13 -0
- package/templates/create/nuxt/public/robots.txt +2 -0
- package/templates/create/nuxt/server/api/users.get.ts.hbs +36 -0
- package/templates/create/nuxt/server/utils/prisma.ts.hbs +53 -0
- package/templates/create/nuxt/tsconfig.json +17 -0
- package/templates/create/svelte/.vscode/extensions.json +3 -0
- package/templates/create/svelte/.yarnrc.yml.hbs +3 -0
- package/templates/create/svelte/README.md.hbs +34 -0
- package/templates/create/svelte/deno.json.hbs +5 -0
- package/templates/create/svelte/package.json.hbs +28 -0
- package/templates/create/svelte/prisma/schema.prisma.hbs +21 -0
- package/templates/create/svelte/prisma/seed.ts.hbs +87 -0
- package/templates/create/svelte/prisma.config.ts +13 -0
- package/templates/create/svelte/src/app.d.ts +13 -0
- package/templates/create/svelte/src/app.html +11 -0
- package/templates/create/svelte/src/lib/assets/favicon.svg +1 -0
- package/templates/create/svelte/src/lib/index.ts +1 -0
- package/templates/create/svelte/src/lib/server/prisma.ts.hbs +53 -0
- package/templates/create/svelte/src/routes/+layout.svelte +11 -0
- package/templates/create/svelte/src/routes/+page.server.ts.hbs +28 -0
- package/templates/create/svelte/src/routes/+page.svelte.hbs +350 -0
- package/templates/create/svelte/static/robots.txt +3 -0
- package/templates/create/svelte/svelte.config.js +13 -0
- package/templates/create/svelte/tsconfig.json +20 -0
- package/templates/create/svelte/vite.config.ts +6 -0
- package/templates/create/turborepo/.yarnrc.yml.hbs +3 -0
- package/templates/create/turborepo/README.md.hbs +29 -0
- package/templates/create/turborepo/apps/api/package.json.hbs +21 -0
- package/templates/create/turborepo/apps/api/src/index.ts.hbs +45 -0
- package/templates/create/turborepo/apps/api/tsconfig.json +17 -0
- package/templates/create/turborepo/deno.json.hbs +5 -0
- package/templates/create/turborepo/package.json.hbs +24 -0
- package/templates/create/turborepo/packages/db/package.json.hbs +17 -0
- package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +21 -0
- package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +38 -0
- package/templates/create/turborepo/packages/db/prisma.config.ts +13 -0
- package/templates/create/turborepo/packages/db/src/client.ts.hbs +58 -0
- package/templates/create/turborepo/packages/db/src/index.ts +2 -0
- package/templates/create/turborepo/packages/db/tsconfig.json +19 -0
- package/templates/create/turborepo/turbo.json +34 -0
- package/templates/create/next/app/globals.css +0 -47
- package/templates/create/next/app/page.tsx.hbs +0 -46
- /package/templates/create/next/{app → src/app}/layout.tsx.hbs +0 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
{{#if (eq schemaPreset "basic")}}
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
import type { PageProps } from './$types';
|
|
4
|
+
|
|
5
|
+
let { data }: PageProps = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<svelte:head>
|
|
9
|
+
<title>create-prisma + sveltekit</title>
|
|
10
|
+
</svelte:head>
|
|
11
|
+
|
|
12
|
+
<script lang="ts" module>
|
|
13
|
+
const formatter = new Intl.DateTimeFormat('en', {
|
|
14
|
+
dateStyle: 'medium',
|
|
15
|
+
timeStyle: 'short'
|
|
16
|
+
});
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<section class="shell">
|
|
20
|
+
<div class="hero">
|
|
21
|
+
<p class="eyebrow">SvelteKit + Prisma 7</p>
|
|
22
|
+
<h1>Users from your database, loaded on the server.</h1>
|
|
23
|
+
<p class="lede">
|
|
24
|
+
This page reads from <code>+page.server.ts</code> using the Prisma instance in
|
|
25
|
+
<code>src/lib/server/prisma.ts</code>.
|
|
26
|
+
</p>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="panel">
|
|
30
|
+
<div class="panel-header">
|
|
31
|
+
<h2>Seeded users</h2>
|
|
32
|
+
<span>{data.users?.length ?? 0} total</span>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
{#if !data.users}
|
|
36
|
+
<p class="empty">
|
|
37
|
+
Could not query users yet. Run <code>db:migrate</code>, then <code>db:seed</code>, then
|
|
38
|
+
refresh.
|
|
39
|
+
</p>
|
|
40
|
+
{:else if data.users.length === 0}
|
|
41
|
+
<p class="empty">No users yet. Run <code>db:seed</code> after your first migration.</p>
|
|
42
|
+
{:else}
|
|
43
|
+
<ul class="users">
|
|
44
|
+
{#each data.users as user}
|
|
45
|
+
<li>
|
|
46
|
+
<div>
|
|
47
|
+
<strong>{user.name ?? 'Unnamed user'}</strong>
|
|
48
|
+
<p>{user.email}</p>
|
|
49
|
+
</div>
|
|
50
|
+
<time datetime={new Date(user.createdAt).toISOString()}>
|
|
51
|
+
{formatter.format(new Date(user.createdAt))}
|
|
52
|
+
</time>
|
|
53
|
+
</li>
|
|
54
|
+
{/each}
|
|
55
|
+
</ul>
|
|
56
|
+
{/if}
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
|
|
60
|
+
<style>
|
|
61
|
+
:global(body) {
|
|
62
|
+
margin: 0;
|
|
63
|
+
font-family:
|
|
64
|
+
'Instrument Sans',
|
|
65
|
+
'Segoe UI',
|
|
66
|
+
sans-serif;
|
|
67
|
+
background: #f7f8fb;
|
|
68
|
+
color: #0f172a;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.shell {
|
|
72
|
+
max-width: 64rem;
|
|
73
|
+
margin: 0 auto;
|
|
74
|
+
padding: 4rem 1.5rem 5rem;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.hero {
|
|
78
|
+
margin-bottom: 2rem;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.eyebrow {
|
|
82
|
+
margin: 0 0 0.75rem;
|
|
83
|
+
color: #10b981;
|
|
84
|
+
font-size: 0.875rem;
|
|
85
|
+
font-weight: 700;
|
|
86
|
+
letter-spacing: 0.14em;
|
|
87
|
+
text-transform: uppercase;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
h1 {
|
|
91
|
+
margin: 0;
|
|
92
|
+
max-width: 12ch;
|
|
93
|
+
font-size: clamp(2.75rem, 7vw, 5rem);
|
|
94
|
+
line-height: 0.95;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.lede {
|
|
98
|
+
max-width: 42rem;
|
|
99
|
+
font-size: 1.05rem;
|
|
100
|
+
line-height: 1.7;
|
|
101
|
+
color: #475569;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.panel {
|
|
105
|
+
padding: 1.5rem;
|
|
106
|
+
border: 1px solid #dbe2ea;
|
|
107
|
+
border-radius: 1.5rem;
|
|
108
|
+
background: #ffffff;
|
|
109
|
+
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.panel-header {
|
|
113
|
+
display: flex;
|
|
114
|
+
align-items: center;
|
|
115
|
+
justify-content: space-between;
|
|
116
|
+
gap: 1rem;
|
|
117
|
+
margin-bottom: 1rem;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
h2 {
|
|
121
|
+
margin: 0;
|
|
122
|
+
font-size: 1.125rem;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.panel-header span,
|
|
126
|
+
.empty,
|
|
127
|
+
time {
|
|
128
|
+
color: #64748b;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.panel p {
|
|
132
|
+
color: #64748b;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.users {
|
|
136
|
+
list-style: none;
|
|
137
|
+
margin: 0;
|
|
138
|
+
padding: 0;
|
|
139
|
+
display: grid;
|
|
140
|
+
gap: 0.75rem;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.users li {
|
|
144
|
+
display: flex;
|
|
145
|
+
align-items: center;
|
|
146
|
+
justify-content: space-between;
|
|
147
|
+
gap: 1rem;
|
|
148
|
+
padding: 1rem 1.125rem;
|
|
149
|
+
border-radius: 1rem;
|
|
150
|
+
background: #f8fafc;
|
|
151
|
+
border: 1px solid #dbe2ea;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.users p {
|
|
155
|
+
margin: 0.2rem 0 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
time {
|
|
159
|
+
font-size: 0.875rem;
|
|
160
|
+
white-space: nowrap;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
code {
|
|
164
|
+
padding: 0.15rem 0.4rem;
|
|
165
|
+
border-radius: 0.35rem;
|
|
166
|
+
background: #eef2f7;
|
|
167
|
+
font-family:
|
|
168
|
+
SFMono-Regular,
|
|
169
|
+
Consolas,
|
|
170
|
+
monospace;
|
|
171
|
+
font-size: 0.95em;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@media (max-width: 640px) {
|
|
175
|
+
.shell {
|
|
176
|
+
padding-top: 3rem;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.users li,
|
|
180
|
+
.panel-header {
|
|
181
|
+
flex-direction: column;
|
|
182
|
+
align-items: flex-start;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
</style>
|
|
186
|
+
{{else}}
|
|
187
|
+
<svelte:head>
|
|
188
|
+
<title>create-prisma + sveltekit</title>
|
|
189
|
+
</svelte:head>
|
|
190
|
+
|
|
191
|
+
<section class="shell">
|
|
192
|
+
<div class="hero">
|
|
193
|
+
<p class="eyebrow">SvelteKit + Prisma 7</p>
|
|
194
|
+
<h1>Your SvelteKit app is ready.</h1>
|
|
195
|
+
<p class="lede">
|
|
196
|
+
Edit <code>prisma/schema.prisma</code>, run <code>db:migrate</code>, then load your data from
|
|
197
|
+
<code>+page.server.ts</code> with the Prisma instance in <code>src/lib/server/prisma.ts</code>.
|
|
198
|
+
</p>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<div class="panel">
|
|
202
|
+
<div class="panel-header">
|
|
203
|
+
<h2>What's included</h2>
|
|
204
|
+
<span>Starter kit</span>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
<ul class="users">
|
|
208
|
+
<li>
|
|
209
|
+
<div>
|
|
210
|
+
<strong>Prisma client</strong>
|
|
211
|
+
<p>Use the server-only instance from <code>src/lib/server/prisma.ts</code>.</p>
|
|
212
|
+
</div>
|
|
213
|
+
</li>
|
|
214
|
+
<li>
|
|
215
|
+
<div>
|
|
216
|
+
<strong>Seed script</strong>
|
|
217
|
+
<p>Run <code>db:seed</code> after your first migration.</p>
|
|
218
|
+
</div>
|
|
219
|
+
</li>
|
|
220
|
+
<li>
|
|
221
|
+
<div>
|
|
222
|
+
<strong>Generated client output</strong>
|
|
223
|
+
<p>Prisma Client is generated into <code>src/generated/prisma</code>.</p>
|
|
224
|
+
</div>
|
|
225
|
+
</li>
|
|
226
|
+
</ul>
|
|
227
|
+
</div>
|
|
228
|
+
</section>
|
|
229
|
+
|
|
230
|
+
<style>
|
|
231
|
+
:global(body) {
|
|
232
|
+
margin: 0;
|
|
233
|
+
font-family:
|
|
234
|
+
'Instrument Sans',
|
|
235
|
+
'Segoe UI',
|
|
236
|
+
sans-serif;
|
|
237
|
+
background: #f7f8fb;
|
|
238
|
+
color: #0f172a;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.shell {
|
|
242
|
+
max-width: 64rem;
|
|
243
|
+
margin: 0 auto;
|
|
244
|
+
padding: 4rem 1.5rem 5rem;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.hero {
|
|
248
|
+
margin-bottom: 2rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.eyebrow {
|
|
252
|
+
margin: 0 0 0.75rem;
|
|
253
|
+
color: #10b981;
|
|
254
|
+
font-size: 0.875rem;
|
|
255
|
+
font-weight: 700;
|
|
256
|
+
letter-spacing: 0.14em;
|
|
257
|
+
text-transform: uppercase;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
h1 {
|
|
261
|
+
margin: 0;
|
|
262
|
+
max-width: 12ch;
|
|
263
|
+
font-size: clamp(2.75rem, 7vw, 5rem);
|
|
264
|
+
line-height: 0.95;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.lede {
|
|
268
|
+
max-width: 42rem;
|
|
269
|
+
font-size: 1.05rem;
|
|
270
|
+
line-height: 1.7;
|
|
271
|
+
color: #475569;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.panel {
|
|
275
|
+
padding: 1.5rem;
|
|
276
|
+
border: 1px solid #dbe2ea;
|
|
277
|
+
border-radius: 1.5rem;
|
|
278
|
+
background: #ffffff;
|
|
279
|
+
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.panel-header {
|
|
283
|
+
display: flex;
|
|
284
|
+
align-items: center;
|
|
285
|
+
justify-content: space-between;
|
|
286
|
+
gap: 1rem;
|
|
287
|
+
margin-bottom: 1rem;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
h2 {
|
|
291
|
+
margin: 0;
|
|
292
|
+
font-size: 1.125rem;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.panel-header span,
|
|
296
|
+
time {
|
|
297
|
+
color: #64748b;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.panel p {
|
|
301
|
+
color: #64748b;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.users {
|
|
305
|
+
list-style: none;
|
|
306
|
+
margin: 0;
|
|
307
|
+
padding: 0;
|
|
308
|
+
display: grid;
|
|
309
|
+
gap: 0.75rem;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.users li {
|
|
313
|
+
display: flex;
|
|
314
|
+
align-items: center;
|
|
315
|
+
justify-content: space-between;
|
|
316
|
+
gap: 1rem;
|
|
317
|
+
padding: 1rem 1.125rem;
|
|
318
|
+
border-radius: 1rem;
|
|
319
|
+
background: #f8fafc;
|
|
320
|
+
border: 1px solid #dbe2ea;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.users p {
|
|
324
|
+
margin: 0.2rem 0 0;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
code {
|
|
328
|
+
padding: 0.15rem 0.4rem;
|
|
329
|
+
border-radius: 0.35rem;
|
|
330
|
+
background: #eef2f7;
|
|
331
|
+
font-family:
|
|
332
|
+
SFMono-Regular,
|
|
333
|
+
Consolas,
|
|
334
|
+
monospace;
|
|
335
|
+
font-size: 0.95em;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
@media (max-width: 640px) {
|
|
339
|
+
.shell {
|
|
340
|
+
padding-top: 3rem;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.users li,
|
|
344
|
+
.panel-header {
|
|
345
|
+
flex-direction: column;
|
|
346
|
+
align-items: flex-start;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
</style>
|
|
350
|
+
{{/if}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import adapter from '@sveltejs/adapter-auto';
|
|
2
|
+
|
|
3
|
+
/** @type {import('@sveltejs/kit').Config} */
|
|
4
|
+
const config = {
|
|
5
|
+
kit: {
|
|
6
|
+
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
|
|
7
|
+
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
|
|
8
|
+
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
|
|
9
|
+
adapter: adapter()
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default config;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./.svelte-kit/tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rewriteRelativeImportExtensions": true,
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"checkJs": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"strict": true,
|
|
13
|
+
"moduleResolution": "bundler"
|
|
14
|
+
}
|
|
15
|
+
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
|
|
16
|
+
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
|
|
17
|
+
//
|
|
18
|
+
// To make changes to top-level options such as include and exclude, we recommend extending
|
|
19
|
+
// the generated config; see https://svelte.dev/docs/kit/configuration#typescript
|
|
20
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
Generated by `create-prisma` with the Turborepo template.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
- `apps/api` - Hono API app
|
|
8
|
+
- `packages/db` - shared Prisma package
|
|
9
|
+
|
|
10
|
+
## Scripts
|
|
11
|
+
|
|
12
|
+
- `{{runScriptCommand packageManager "dev"}}` - run API dev server through Turborepo
|
|
13
|
+
- `{{runScriptCommand packageManager "build"}}` - run package builds through Turborepo
|
|
14
|
+
- `{{runScriptCommand packageManager "typecheck"}}` - run TypeScript checks through Turborepo
|
|
15
|
+
- `{{runScriptCommand packageManager "db:generate"}}` - generate Prisma Client in `packages/db`
|
|
16
|
+
- `{{runScriptCommand packageManager "db:migrate"}}` - create/apply migrations in `packages/db`
|
|
17
|
+
- `{{runScriptCommand packageManager "db:seed"}}` - run seed script in `packages/db`
|
|
18
|
+
|
|
19
|
+
## Prisma
|
|
20
|
+
|
|
21
|
+
Prisma is scaffolded inside `packages/db`:
|
|
22
|
+
|
|
23
|
+
- `packages/db/prisma/schema.prisma`
|
|
24
|
+
- `packages/db/prisma/seed.ts`
|
|
25
|
+
- `packages/db/src/client.ts`
|
|
26
|
+
- `packages/db/prisma.config.ts`
|
|
27
|
+
- `packages/db/src/generated/prisma`
|
|
28
|
+
|
|
29
|
+
`apps/api/src/index.ts` imports the shared Prisma client from `@repo/db`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@repo/api",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "tsx watch src/index.ts",
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"start": "node dist/src/index.js",
|
|
9
|
+
"typecheck": "tsc --noEmit"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@hono/node-server": "^1.19.9",
|
|
13
|
+
"@repo/db": "{{#if (eq packageManager "npm")}}*{{else}}workspace:*{{/if}}",
|
|
14
|
+
"hono": "^4.12.2"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@types/node": "^24.3.0",
|
|
18
|
+
"tsx": "^4.7.1",
|
|
19
|
+
"typescript": "^5.9.3"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { serve } from "@hono/node-server";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
{{#if (eq schemaPreset "basic")}}
|
|
4
|
+
import { prisma } from "@repo/db";
|
|
5
|
+
{{/if}}
|
|
6
|
+
|
|
7
|
+
const app = new Hono();
|
|
8
|
+
|
|
9
|
+
app.get("/", (c) => {
|
|
10
|
+
return c.json({
|
|
11
|
+
ok: true,
|
|
12
|
+
message: "Turborepo API is running.",
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
{{#if (eq schemaPreset "basic")}}
|
|
16
|
+
|
|
17
|
+
app.get("/users", async (c) => {
|
|
18
|
+
const users = await prisma.user
|
|
19
|
+
.findMany({
|
|
20
|
+
take: 10,
|
|
21
|
+
orderBy: {
|
|
22
|
+
createdAt: "desc",
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
.catch((error) => {
|
|
26
|
+
console.error("Failed to query users:", error);
|
|
27
|
+
return undefined;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if (!users) {
|
|
31
|
+
return c.json(
|
|
32
|
+
{
|
|
33
|
+
error: "Could not query users yet. Run db:migrate and db:seed first.",
|
|
34
|
+
},
|
|
35
|
+
500
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return c.json(users);
|
|
40
|
+
});
|
|
41
|
+
{{/if}}
|
|
42
|
+
|
|
43
|
+
const port = Number(process.env.PORT ?? 3000);
|
|
44
|
+
console.log(`API listening at http://localhost:${port}`);
|
|
45
|
+
serve({ fetch: app.fetch, port });
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
"outDir": "dist",
|
|
12
|
+
"rootDir": "."
|
|
13
|
+
},
|
|
14
|
+
"include": [
|
|
15
|
+
"src/**/*.ts"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
{{#if (packageManagerManifestValue packageManager)}}
|
|
6
|
+
"packageManager": "{{packageManagerManifestValue packageManager}}",
|
|
7
|
+
{{/if}}
|
|
8
|
+
"workspaces": [
|
|
9
|
+
"apps/*",
|
|
10
|
+
"packages/*"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "turbo run build",
|
|
14
|
+
"dev": "turbo run dev --filter=@repo/api",
|
|
15
|
+
"typecheck": "turbo run typecheck",
|
|
16
|
+
"db:generate": "turbo run db:generate --filter=@repo/db",
|
|
17
|
+
"db:push": "turbo run db:push --filter=@repo/db",
|
|
18
|
+
"db:migrate": "turbo run db:migrate --filter=@repo/db",
|
|
19
|
+
"db:seed": "turbo run db:seed --filter=@repo/db"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"turbo": "^2.5.6"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@repo/db",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./src/index.ts"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"@types/node": "^24.3.0",
|
|
14
|
+
"tsx": "^4.7.1",
|
|
15
|
+
"typescript": "^5.9.3"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client"
|
|
3
|
+
output = "../src/generated/prisma"
|
|
4
|
+
{{#if (eq packageManager "deno")}}
|
|
5
|
+
runtime = "deno"
|
|
6
|
+
{{/if}}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
datasource db {
|
|
10
|
+
provider = "{{provider}}"
|
|
11
|
+
}
|
|
12
|
+
{{#if (eq schemaPreset "basic")}}
|
|
13
|
+
|
|
14
|
+
model User {
|
|
15
|
+
id String @id @default(cuid())
|
|
16
|
+
email String @unique
|
|
17
|
+
name String?
|
|
18
|
+
createdAt DateTime @default(now())
|
|
19
|
+
updatedAt DateTime @updatedAt
|
|
20
|
+
}
|
|
21
|
+
{{/if}}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import prisma from "../src/client";
|
|
2
|
+
|
|
3
|
+
async function main() {
|
|
4
|
+
{{#if (eq schemaPreset "basic")}}
|
|
5
|
+
const users = await Promise.all([
|
|
6
|
+
prisma.user.upsert({
|
|
7
|
+
where: { email: "alice@prisma.io" },
|
|
8
|
+
update: { name: "Alice" },
|
|
9
|
+
create: {
|
|
10
|
+
email: "alice@prisma.io",
|
|
11
|
+
name: "Alice",
|
|
12
|
+
},
|
|
13
|
+
}),
|
|
14
|
+
prisma.user.upsert({
|
|
15
|
+
where: { email: "bob@prisma.io" },
|
|
16
|
+
update: { name: "Bob" },
|
|
17
|
+
create: {
|
|
18
|
+
email: "bob@prisma.io",
|
|
19
|
+
name: "Bob",
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
console.log(`Seeded ${users.length} users.`);
|
|
25
|
+
{{else}}
|
|
26
|
+
console.log("No seed data defined for the empty schema preset.");
|
|
27
|
+
{{/if}}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
main()
|
|
31
|
+
.then(async () => {
|
|
32
|
+
await prisma.$disconnect();
|
|
33
|
+
})
|
|
34
|
+
.catch(async (error) => {
|
|
35
|
+
console.error(error);
|
|
36
|
+
await prisma.$disconnect();
|
|
37
|
+
process.exit(1);
|
|
38
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { defineConfig, env } from "prisma/config";
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
schema: "prisma/schema.prisma",
|
|
6
|
+
migrations: {
|
|
7
|
+
path: "prisma/migrations",
|
|
8
|
+
seed: "tsx prisma/seed.ts",
|
|
9
|
+
},
|
|
10
|
+
datasource: {
|
|
11
|
+
url: env("DATABASE_URL"),
|
|
12
|
+
},
|
|
13
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
import { PrismaClient } from "./generated/prisma/client";
|
|
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 moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
dotenv.config({ path: path.resolve(moduleDir, "../.env"), quiet: true });
|
|
23
|
+
|
|
24
|
+
{{#if (eq provider "sqlite")}}
|
|
25
|
+
const databaseUrl = process.env.DATABASE_URL ?? "file:./dev.db";
|
|
26
|
+
{{else}}
|
|
27
|
+
const databaseUrl = process.env.DATABASE_URL;
|
|
28
|
+
if (!databaseUrl) {
|
|
29
|
+
throw new Error("DATABASE_URL is required");
|
|
30
|
+
}
|
|
31
|
+
{{/if}}
|
|
32
|
+
|
|
33
|
+
{{#if (eq provider "postgresql")}}
|
|
34
|
+
const adapter = new PrismaPg({
|
|
35
|
+
connectionString: databaseUrl,
|
|
36
|
+
});
|
|
37
|
+
{{/if}}
|
|
38
|
+
{{#if (eq provider "cockroachdb")}}
|
|
39
|
+
const adapter = new PrismaPg({
|
|
40
|
+
connectionString: databaseUrl,
|
|
41
|
+
});
|
|
42
|
+
{{/if}}
|
|
43
|
+
{{#if (eq provider "mysql")}}
|
|
44
|
+
const adapter = new PrismaMariaDb(databaseUrl);
|
|
45
|
+
{{/if}}
|
|
46
|
+
{{#if (eq provider "sqlite")}}
|
|
47
|
+
const adapter = new PrismaBetterSqlite3({
|
|
48
|
+
url: databaseUrl,
|
|
49
|
+
});
|
|
50
|
+
{{/if}}
|
|
51
|
+
{{#if (eq provider "sqlserver")}}
|
|
52
|
+
const adapter = new PrismaMssql(databaseUrl);
|
|
53
|
+
{{/if}}
|
|
54
|
+
|
|
55
|
+
const prisma = new PrismaClient({ adapter });
|
|
56
|
+
|
|
57
|
+
export { prisma };
|
|
58
|
+
export default prisma;
|