create-prisma 0.1.3 → 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-DgN5mAMV.mjs +1677 -0
- 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 +5 -2
- 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 +14 -11
- package/templates/create/hono/deno.json.hbs +5 -0
- package/templates/create/hono/package.json.hbs +4 -1
- 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 +3 -3
- package/templates/create/hono/src/lib/prisma.ts.hbs +53 -0
- package/templates/create/hono/tsconfig.json +1 -2
- package/templates/create/next/.yarnrc.yml.hbs +3 -0
- package/templates/create/next/README.md.hbs +9 -6
- 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/dist/create-fJECj1B0.mjs +0 -1026
- package/templates/create/next/app/globals.css +0 -47
- package/templates/create/next/app/page.tsx.hbs +0 -40
- package/templates/init/prisma/index.ts.hbs +0 -44
- /package/templates/create/next/{app → src/app}/layout.tsx.hbs +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: light;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
* {
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
html {
|
|
10
|
+
font-size: 16px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
body {
|
|
14
|
+
margin: 0;
|
|
15
|
+
font-family:
|
|
16
|
+
"Instrument Sans",
|
|
17
|
+
"Segoe UI",
|
|
18
|
+
sans-serif;
|
|
19
|
+
background: #f7f8fb;
|
|
20
|
+
color: #0f172a;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.shell {
|
|
24
|
+
width: min(64rem, 100%);
|
|
25
|
+
margin: 0 auto;
|
|
26
|
+
padding: 4rem 1.5rem 5rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.hero {
|
|
30
|
+
margin-bottom: 2rem;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.eyebrow {
|
|
34
|
+
margin: 0 0 0.75rem;
|
|
35
|
+
color: #10b981;
|
|
36
|
+
font-size: 0.875rem;
|
|
37
|
+
font-weight: 700;
|
|
38
|
+
letter-spacing: 0.14em;
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
h1 {
|
|
43
|
+
margin: 0;
|
|
44
|
+
max-width: 12ch;
|
|
45
|
+
font-size: clamp(2.75rem, 7vw, 5rem);
|
|
46
|
+
line-height: 0.95;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.lede {
|
|
50
|
+
max-width: 42rem;
|
|
51
|
+
font-size: 1.05rem;
|
|
52
|
+
line-height: 1.7;
|
|
53
|
+
color: #475569;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.panel {
|
|
57
|
+
padding: 1.5rem;
|
|
58
|
+
border: 1px solid #dbe2ea;
|
|
59
|
+
border-radius: 1.5rem;
|
|
60
|
+
background: #ffffff;
|
|
61
|
+
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.panelHeader {
|
|
65
|
+
display: flex;
|
|
66
|
+
align-items: center;
|
|
67
|
+
justify-content: space-between;
|
|
68
|
+
gap: 1rem;
|
|
69
|
+
margin-bottom: 1rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
h2 {
|
|
73
|
+
margin: 0;
|
|
74
|
+
font-size: 1.125rem;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.panelHeader span,
|
|
78
|
+
.empty,
|
|
79
|
+
time {
|
|
80
|
+
color: #64748b;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.panel p {
|
|
84
|
+
color: #64748b;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.users {
|
|
88
|
+
list-style: none;
|
|
89
|
+
margin: 0;
|
|
90
|
+
padding: 0;
|
|
91
|
+
display: grid;
|
|
92
|
+
gap: 0.75rem;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.users li {
|
|
96
|
+
display: flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: space-between;
|
|
99
|
+
gap: 1rem;
|
|
100
|
+
padding: 1rem 1.125rem;
|
|
101
|
+
border-radius: 1rem;
|
|
102
|
+
background: #f8fafc;
|
|
103
|
+
border: 1px solid #dbe2ea;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.users p {
|
|
107
|
+
margin: 0.2rem 0 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
time {
|
|
111
|
+
font-size: 0.875rem;
|
|
112
|
+
white-space: nowrap;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
code {
|
|
116
|
+
padding: 0.15rem 0.4rem;
|
|
117
|
+
border-radius: 0.35rem;
|
|
118
|
+
background: #eef2f7;
|
|
119
|
+
font-family:
|
|
120
|
+
SFMono-Regular,
|
|
121
|
+
Consolas,
|
|
122
|
+
monospace;
|
|
123
|
+
font-size: 0.95em;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media (max-width: 640px) {
|
|
127
|
+
.shell {
|
|
128
|
+
padding-top: 3rem;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.users li,
|
|
132
|
+
.panelHeader {
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
align-items: flex-start;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{{#if (eq schemaPreset "basic")}}
|
|
2
|
+
import { prisma } from "../lib/prisma";
|
|
3
|
+
{{/if}}
|
|
4
|
+
{{#if (eq packageManager "deno")}}
|
|
5
|
+
|
|
6
|
+
export const dynamic = "force-dynamic";
|
|
7
|
+
{{/if}}
|
|
8
|
+
|
|
9
|
+
export default async function Home() {
|
|
10
|
+
{{#if (eq schemaPreset "basic")}}
|
|
11
|
+
const formatter = new Intl.DateTimeFormat("en", {
|
|
12
|
+
dateStyle: "medium",
|
|
13
|
+
timeStyle: "short",
|
|
14
|
+
});
|
|
15
|
+
const users = await prisma.user
|
|
16
|
+
.findMany({
|
|
17
|
+
take: 10,
|
|
18
|
+
orderBy: {
|
|
19
|
+
createdAt: "desc",
|
|
20
|
+
},
|
|
21
|
+
})
|
|
22
|
+
.catch(() => undefined);
|
|
23
|
+
{{/if}}
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<main className="shell">
|
|
27
|
+
<div className="hero">
|
|
28
|
+
<p className="eyebrow">Next.js + Prisma 7</p>
|
|
29
|
+
{{#if (eq schemaPreset "basic")}}
|
|
30
|
+
<h1>Users from your database, loaded on the server.</h1>
|
|
31
|
+
<p className="lede">
|
|
32
|
+
This page reads from <code>src/app/page.tsx</code> using the Prisma instance in{" "}
|
|
33
|
+
<code>src/lib/prisma.ts</code>.
|
|
34
|
+
</p>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<section className="panel">
|
|
38
|
+
<div className="panelHeader">
|
|
39
|
+
<h2>Seeded users</h2>
|
|
40
|
+
<span>{users?.length ?? 0} total</span>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
{!users ? (
|
|
44
|
+
<p className="empty">
|
|
45
|
+
Could not query users yet. Run <code>db:migrate</code>, then <code>db:seed</code>,
|
|
46
|
+
then refresh.
|
|
47
|
+
</p>
|
|
48
|
+
) : users.length === 0 ? (
|
|
49
|
+
<p className="empty">No users yet. Run <code>db:seed</code> after your first migration.</p>
|
|
50
|
+
) : (
|
|
51
|
+
<ul className="users">
|
|
52
|
+
{users.map((user) => (
|
|
53
|
+
<li key={user.id}>
|
|
54
|
+
<div>
|
|
55
|
+
<strong>{user.name ?? "Unnamed user"}</strong>
|
|
56
|
+
<p>{user.email}</p>
|
|
57
|
+
</div>
|
|
58
|
+
<time dateTime={user.createdAt.toISOString()}>
|
|
59
|
+
{formatter.format(user.createdAt)}
|
|
60
|
+
</time>
|
|
61
|
+
</li>
|
|
62
|
+
))}
|
|
63
|
+
</ul>
|
|
64
|
+
)}
|
|
65
|
+
</section>
|
|
66
|
+
{{else}}
|
|
67
|
+
<h1>Your Next.js app is ready.</h1>
|
|
68
|
+
<p className="lede">
|
|
69
|
+
Edit <code>prisma/schema.prisma</code>, run <code>db:migrate</code>, then load your data
|
|
70
|
+
in server components with the Prisma instance in <code>src/lib/prisma.ts</code>.
|
|
71
|
+
</p>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<section className="panel">
|
|
75
|
+
<div className="panelHeader">
|
|
76
|
+
<h2>What's included</h2>
|
|
77
|
+
<span>Starter kit</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<ul className="users">
|
|
81
|
+
<li>
|
|
82
|
+
<div>
|
|
83
|
+
<strong>Prisma client</strong>
|
|
84
|
+
<p>Use the shared instance from <code>src/lib/prisma.ts</code>.</p>
|
|
85
|
+
</div>
|
|
86
|
+
</li>
|
|
87
|
+
<li>
|
|
88
|
+
<div>
|
|
89
|
+
<strong>Seed script</strong>
|
|
90
|
+
<p>Run <code>db:seed</code> after your first migration.</p>
|
|
91
|
+
</div>
|
|
92
|
+
</li>
|
|
93
|
+
<li>
|
|
94
|
+
<div>
|
|
95
|
+
<strong>Generated client output</strong>
|
|
96
|
+
<p>Prisma Client is generated into <code>src/generated/prisma</code>.</p>
|
|
97
|
+
</div>
|
|
98
|
+
</li>
|
|
99
|
+
</ul>
|
|
100
|
+
</section>
|
|
101
|
+
{{/if}}
|
|
102
|
+
</main>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { PrismaClient } from "../generated/prisma/client";
|
|
3
|
+
{{#if (eq provider "postgresql")}}
|
|
4
|
+
import { PrismaPg } from "@prisma/adapter-pg";
|
|
5
|
+
{{/if}}
|
|
6
|
+
{{#if (eq provider "cockroachdb")}}
|
|
7
|
+
import { PrismaPg } from "@prisma/adapter-pg";
|
|
8
|
+
{{/if}}
|
|
9
|
+
{{#if (eq provider "mysql")}}
|
|
10
|
+
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
|
|
11
|
+
{{/if}}
|
|
12
|
+
{{#if (eq provider "sqlite")}}
|
|
13
|
+
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
|
14
|
+
{{/if}}
|
|
15
|
+
{{#if (eq provider "sqlserver")}}
|
|
16
|
+
import { PrismaMssql } from "@prisma/adapter-mssql";
|
|
17
|
+
{{/if}}
|
|
18
|
+
|
|
19
|
+
{{#if (eq provider "sqlite")}}
|
|
20
|
+
const databaseUrl = process.env.DATABASE_URL ?? "file:./dev.db";
|
|
21
|
+
{{else}}
|
|
22
|
+
const databaseUrl = process.env.DATABASE_URL;
|
|
23
|
+
if (!databaseUrl) {
|
|
24
|
+
throw new Error("DATABASE_URL is required");
|
|
25
|
+
}
|
|
26
|
+
{{/if}}
|
|
27
|
+
|
|
28
|
+
{{#if (eq provider "postgresql")}}
|
|
29
|
+
const adapter = new PrismaPg({
|
|
30
|
+
connectionString: databaseUrl,
|
|
31
|
+
});
|
|
32
|
+
{{/if}}
|
|
33
|
+
{{#if (eq provider "cockroachdb")}}
|
|
34
|
+
const adapter = new PrismaPg({
|
|
35
|
+
connectionString: databaseUrl,
|
|
36
|
+
});
|
|
37
|
+
{{/if}}
|
|
38
|
+
{{#if (eq provider "mysql")}}
|
|
39
|
+
const adapter = new PrismaMariaDb(databaseUrl);
|
|
40
|
+
{{/if}}
|
|
41
|
+
{{#if (eq provider "sqlite")}}
|
|
42
|
+
const adapter = new PrismaBetterSqlite3({
|
|
43
|
+
url: databaseUrl,
|
|
44
|
+
});
|
|
45
|
+
{{/if}}
|
|
46
|
+
{{#if (eq provider "sqlserver")}}
|
|
47
|
+
const adapter = new PrismaMssql(databaseUrl);
|
|
48
|
+
{{/if}}
|
|
49
|
+
|
|
50
|
+
const prisma = new PrismaClient({ adapter });
|
|
51
|
+
|
|
52
|
+
export { prisma };
|
|
53
|
+
export default prisma;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
Generated by `create-prisma` with the Nuxt template.
|
|
4
|
+
|
|
5
|
+
## Scripts
|
|
6
|
+
|
|
7
|
+
- `{{runScriptCommand packageManager "dev"}}` - start the Nuxt dev server
|
|
8
|
+
- `{{runScriptCommand packageManager "build"}}` - build for production
|
|
9
|
+
- `{{runScriptCommand packageManager "preview"}}` - preview the production build
|
|
10
|
+
- `{{runScriptCommand packageManager "typecheck"}}` - run Nuxt type checks
|
|
11
|
+
|
|
12
|
+
## Prisma
|
|
13
|
+
|
|
14
|
+
Prisma setup is scaffolded automatically in:
|
|
15
|
+
|
|
16
|
+
- `prisma/schema.prisma`
|
|
17
|
+
- `prisma/seed.ts`
|
|
18
|
+
- `server/utils/prisma.ts`
|
|
19
|
+
- `server/api/users.get.ts`
|
|
20
|
+
- `prisma.config.ts`
|
|
21
|
+
- `server/generated/prisma`
|
|
22
|
+
|
|
23
|
+
Database helper scripts are added to `package.json`:
|
|
24
|
+
|
|
25
|
+
- `db:generate`
|
|
26
|
+
- `db:push`
|
|
27
|
+
- `db:migrate`
|
|
28
|
+
- `db:seed`
|
|
29
|
+
{{#if (eq schemaPreset "basic")}}
|
|
30
|
+
|
|
31
|
+
The starter page in `app/pages/index.vue` fetches seeded users from `server/api/users.get.ts`, and `prisma/seed.ts` inserts starter users.
|
|
32
|
+
{{/if}}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
useHead({
|
|
3
|
+
title: "create-prisma + nuxt",
|
|
4
|
+
});
|
|
5
|
+
|
|
6
|
+
{{#if (eq schemaPreset "basic")}}
|
|
7
|
+
type User = {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
name: string | null;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
type UsersPayload = {
|
|
15
|
+
users: User[];
|
|
16
|
+
error?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const formatter = new Intl.DateTimeFormat("en", {
|
|
20
|
+
dateStyle: "medium",
|
|
21
|
+
timeStyle: "short",
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const { data } = await useFetch<UsersPayload>("/api/users");
|
|
25
|
+
|
|
26
|
+
function formatCreatedAt(value: string): string {
|
|
27
|
+
return formatter.format(new Date(value));
|
|
28
|
+
}
|
|
29
|
+
{{/if}}
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<main class="shell">
|
|
34
|
+
<div class="hero">
|
|
35
|
+
<p class="eyebrow">Nuxt + Prisma 7</p>
|
|
36
|
+
{{#if (eq schemaPreset "basic")}}
|
|
37
|
+
<h1>Users from your database, loaded through Nitro.</h1>
|
|
38
|
+
<p class="lede">
|
|
39
|
+
This page fetches <code>/api/users</code> from <code>server/api/users.get.ts</code> using
|
|
40
|
+
the Prisma instance in <code>server/utils/prisma.ts</code>.
|
|
41
|
+
</p>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<section class="panel">
|
|
45
|
+
<div class="panel-header">
|
|
46
|
+
<h2>Seeded users</h2>
|
|
47
|
+
<span>\{{ data?.users?.length ?? 0 }} total</span>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<p v-if="data?.error" class="empty">
|
|
51
|
+
\{{ data.error }} Run <code>db:migrate</code>, then <code>db:seed</code>, then refresh.
|
|
52
|
+
</p>
|
|
53
|
+
<p v-else-if="!data?.users?.length" class="empty">
|
|
54
|
+
No users yet. Run <code>db:seed</code> after your first migration.
|
|
55
|
+
</p>
|
|
56
|
+
<ul v-else class="users">
|
|
57
|
+
<li v-for="user in data.users" :key="user.id">
|
|
58
|
+
<div>
|
|
59
|
+
<strong>\{{ user.name ?? "Unnamed user" }}</strong>
|
|
60
|
+
<p>\{{ user.email }}</p>
|
|
61
|
+
</div>
|
|
62
|
+
<time :datetime="user.createdAt">\{{ formatCreatedAt(user.createdAt) }}</time>
|
|
63
|
+
</li>
|
|
64
|
+
</ul>
|
|
65
|
+
</section>
|
|
66
|
+
{{else}}
|
|
67
|
+
<h1>Your Nuxt app is ready.</h1>
|
|
68
|
+
<p class="lede">
|
|
69
|
+
Edit <code>prisma/schema.prisma</code>, run <code>db:migrate</code>, then query data in
|
|
70
|
+
Nitro routes or server utilities with the Prisma instance in <code>server/utils/prisma.ts</code>.
|
|
71
|
+
</p>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<section class="panel">
|
|
75
|
+
<div class="panel-header">
|
|
76
|
+
<h2>What's included</h2>
|
|
77
|
+
<span>Starter kit</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<ul class="users">
|
|
81
|
+
<li>
|
|
82
|
+
<div>
|
|
83
|
+
<strong>Prisma client</strong>
|
|
84
|
+
<p>Use the shared server instance from <code>server/utils/prisma.ts</code>.</p>
|
|
85
|
+
</div>
|
|
86
|
+
</li>
|
|
87
|
+
<li>
|
|
88
|
+
<div>
|
|
89
|
+
<strong>Nitro API route</strong>
|
|
90
|
+
<p>Start from <code>server/api/users.get.ts</code> for server-side data access.</p>
|
|
91
|
+
</div>
|
|
92
|
+
</li>
|
|
93
|
+
<li>
|
|
94
|
+
<div>
|
|
95
|
+
<strong>Generated client output</strong>
|
|
96
|
+
<p>Prisma Client is generated into <code>server/generated/prisma</code>.</p>
|
|
97
|
+
</div>
|
|
98
|
+
</li>
|
|
99
|
+
</ul>
|
|
100
|
+
</section>
|
|
101
|
+
{{/if}}
|
|
102
|
+
</main>
|
|
103
|
+
</template>
|
|
104
|
+
|
|
105
|
+
<style>
|
|
106
|
+
body {
|
|
107
|
+
margin: 0;
|
|
108
|
+
font-family:
|
|
109
|
+
"Instrument Sans",
|
|
110
|
+
"Segoe UI",
|
|
111
|
+
sans-serif;
|
|
112
|
+
background: #f7f8fb;
|
|
113
|
+
color: #0f172a;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.shell {
|
|
117
|
+
width: min(64rem, 100%);
|
|
118
|
+
margin: 0 auto;
|
|
119
|
+
padding: 4rem 1.5rem 5rem;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.hero {
|
|
123
|
+
margin-bottom: 2rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.eyebrow {
|
|
127
|
+
margin: 0 0 0.75rem;
|
|
128
|
+
color: #10b981;
|
|
129
|
+
font-size: 0.875rem;
|
|
130
|
+
font-weight: 700;
|
|
131
|
+
letter-spacing: 0.14em;
|
|
132
|
+
text-transform: uppercase;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
h1 {
|
|
136
|
+
margin: 0;
|
|
137
|
+
max-width: 12ch;
|
|
138
|
+
font-size: clamp(2.75rem, 7vw, 5rem);
|
|
139
|
+
line-height: 0.95;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.lede {
|
|
143
|
+
max-width: 42rem;
|
|
144
|
+
font-size: 1.05rem;
|
|
145
|
+
line-height: 1.7;
|
|
146
|
+
color: #475569;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.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);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.panel-header {
|
|
158
|
+
display: flex;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: space-between;
|
|
161
|
+
gap: 1rem;
|
|
162
|
+
margin-bottom: 1rem;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
h2 {
|
|
166
|
+
margin: 0;
|
|
167
|
+
font-size: 1.125rem;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.panel-header span,
|
|
171
|
+
.empty,
|
|
172
|
+
time {
|
|
173
|
+
color: #64748b;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.panel p {
|
|
177
|
+
color: #64748b;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.users {
|
|
181
|
+
list-style: none;
|
|
182
|
+
margin: 0;
|
|
183
|
+
padding: 0;
|
|
184
|
+
display: grid;
|
|
185
|
+
gap: 0.75rem;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.users li {
|
|
189
|
+
display: flex;
|
|
190
|
+
align-items: center;
|
|
191
|
+
justify-content: space-between;
|
|
192
|
+
gap: 1rem;
|
|
193
|
+
padding: 1rem 1.125rem;
|
|
194
|
+
border-radius: 1rem;
|
|
195
|
+
background: #f8fafc;
|
|
196
|
+
border: 1px solid #dbe2ea;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.users p {
|
|
200
|
+
margin: 0.2rem 0 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
time {
|
|
204
|
+
font-size: 0.875rem;
|
|
205
|
+
white-space: nowrap;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
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;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@media (max-width: 640px) {
|
|
220
|
+
.shell {
|
|
221
|
+
padding-top: 3rem;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.users li,
|
|
225
|
+
.panel-header {
|
|
226
|
+
flex-direction: column;
|
|
227
|
+
align-items: flex-start;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"private": true,
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
{{#if (packageManagerManifestValue packageManager)}}
|
|
7
|
+
"packageManager": "{{packageManagerManifestValue packageManager}}",
|
|
8
|
+
{{/if}}
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "nuxt build",
|
|
11
|
+
"dev": "nuxt dev",
|
|
12
|
+
"generate": "nuxt generate",
|
|
13
|
+
"preview": "nuxt preview",
|
|
14
|
+
"postinstall": "nuxt prepare",
|
|
15
|
+
"typecheck": "nuxt typecheck"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"nuxt": "^4.3.1",
|
|
19
|
+
"vue": "^3.5.29",
|
|
20
|
+
"vue-router": "^4.6.4"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^24.3.0",
|
|
24
|
+
"tsx": "^4.7.1",
|
|
25
|
+
"typescript": "^5.9.3"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client"
|
|
3
|
+
output = "../server/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 "../server/utils/prisma";
|
|
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
|
+
});
|