create-prisma 0.4.1 → 0.4.2-next.37.102.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.
- package/README.md +50 -44
- package/dist/cli.mjs +1 -1
- package/dist/{create-H6Tk0JlE.mjs → create-DsDWZbPE.mjs} +875 -1010
- package/dist/index.d.mts +30 -39
- package/dist/index.mjs +3 -3
- package/package.json +7 -2
- package/templates/create/_shared/prisma/seed.ts.hbs +52 -0
- package/templates/create/astro/README.md.hbs +25 -15
- package/templates/create/astro/astro.config.mjs +6 -1
- package/templates/create/astro/deno.json.hbs +1 -1
- package/templates/create/astro/package.json.hbs +3 -2
- package/templates/create/astro/src/lib/prisma.ts.hbs +60 -40
- package/templates/create/astro/src/pages/api/users.ts.hbs +6 -22
- package/templates/create/astro/src/pages/index.astro.hbs +18 -55
- package/templates/create/elysia/README.md.hbs +27 -17
- package/templates/create/elysia/deno.json.hbs +1 -1
- package/templates/create/elysia/src/index.ts.hbs +15 -11
- package/templates/create/elysia/src/lib/prisma.ts.hbs +60 -43
- package/templates/create/elysia/tsconfig.json +1 -0
- package/templates/create/hono/README.md.hbs +27 -17
- package/templates/create/hono/deno.json.hbs +1 -1
- package/templates/create/hono/src/index.ts.hbs +9 -10
- package/templates/create/hono/src/lib/prisma.ts.hbs +60 -43
- package/templates/create/hono/tsconfig.json +1 -0
- package/templates/create/minimal/.yarnrc.yml.hbs +3 -0
- package/templates/create/minimal/README.md.hbs +39 -0
- package/templates/create/{turborepo → minimal}/deno.json.hbs +1 -1
- package/templates/create/minimal/package.json.hbs +13 -0
- package/templates/create/minimal/src/index.ts.hbs +43 -0
- package/templates/create/minimal/src/lib/prisma.ts.hbs +73 -0
- package/templates/create/{turborepo/apps/api → minimal}/tsconfig.json +3 -4
- package/templates/create/nest/README.md.hbs +28 -17
- package/templates/create/nest/deno.json.hbs +1 -1
- package/templates/create/nest/src/app.module.ts.hbs +5 -6
- package/templates/create/nest/src/lib/prisma.ts.hbs +60 -45
- package/templates/create/nest/src/prisma.service.ts.hbs +6 -5
- package/templates/create/nest/src/users.controller.ts.hbs +1 -2
- package/templates/create/nest/src/users.service.ts.hbs +2 -8
- package/templates/create/nest/tsconfig.json +1 -0
- package/templates/create/next/README.md.hbs +25 -13
- package/templates/create/next/deno.json.hbs +1 -1
- package/templates/create/next/src/app/page.tsx.hbs +16 -57
- package/templates/create/next/src/lib/prisma.ts.hbs +60 -40
- package/templates/create/next/tsconfig.json +1 -0
- package/templates/create/nuxt/README.md.hbs +26 -13
- package/templates/create/nuxt/app/pages/index.vue.hbs +12 -45
- package/templates/create/nuxt/deno.json.hbs +1 -1
- package/templates/create/nuxt/nuxt.config.ts +21 -0
- package/templates/create/nuxt/package.json.hbs +2 -1
- package/templates/create/nuxt/server/api/users.get.ts.hbs +4 -15
- package/templates/create/nuxt/server/utils/prisma.ts.hbs +60 -40
- package/templates/create/svelte/README.md.hbs +25 -15
- package/templates/create/svelte/deno.json.hbs +1 -1
- package/templates/create/svelte/package.json.hbs +1 -1
- package/templates/create/svelte/src/lib/server/prisma.ts.hbs +61 -41
- package/templates/create/svelte/src/routes/+page.server.ts.hbs +4 -15
- package/templates/create/svelte/src/routes/+page.svelte.hbs +13 -163
- package/templates/create/svelte/vite.config.ts +2 -1
- package/templates/create/tanstack-start/README.md.hbs +26 -13
- package/templates/create/tanstack-start/deno.json.hbs +1 -2
- package/templates/create/tanstack-start/package.json.hbs +1 -2
- package/templates/create/tanstack-start/src/lib/prisma.server.ts.hbs +60 -40
- package/templates/create/tanstack-start/src/routes/__root.tsx.hbs +2 -3
- package/templates/create/tanstack-start/src/routes/index.tsx.hbs +26 -77
- package/templates/create/tanstack-start/tsconfig.json +1 -0
- package/templates/create/tanstack-start/vite.config.ts +7 -1
- package/templates/create/astro/prisma/schema.prisma.hbs +0 -21
- package/templates/create/astro/prisma/seed.ts.hbs +0 -38
- package/templates/create/astro/prisma.config.ts +0 -13
- package/templates/create/elysia/prisma/schema.prisma.hbs +0 -25
- package/templates/create/elysia/prisma/seed.ts.hbs +0 -42
- package/templates/create/elysia/prisma.config.ts.hbs +0 -15
- package/templates/create/hono/prisma/schema.prisma.hbs +0 -25
- package/templates/create/hono/prisma/seed.ts.hbs +0 -42
- package/templates/create/hono/prisma.config.ts.hbs +0 -15
- package/templates/create/nest/prisma/schema.prisma.hbs +0 -25
- package/templates/create/nest/prisma/seed.ts.hbs +0 -44
- package/templates/create/nest/prisma.config.ts.hbs +0 -15
- package/templates/create/next/prisma/schema.prisma.hbs +0 -21
- package/templates/create/next/prisma/seed.ts.hbs +0 -38
- package/templates/create/next/prisma.config.ts +0 -13
- package/templates/create/nuxt/prisma/schema.prisma.hbs +0 -21
- package/templates/create/nuxt/prisma/seed.ts.hbs +0 -38
- package/templates/create/nuxt/prisma.config.ts +0 -13
- package/templates/create/svelte/prisma/schema.prisma.hbs +0 -21
- package/templates/create/svelte/prisma/seed.ts.hbs +0 -87
- package/templates/create/svelte/prisma.config.ts +0 -13
- package/templates/create/tanstack-start/prisma/schema.prisma.hbs +0 -21
- package/templates/create/tanstack-start/prisma/seed.ts.hbs +0 -37
- package/templates/create/tanstack-start/prisma.config.ts +0 -13
- package/templates/create/turborepo/README.md.hbs +0 -29
- package/templates/create/turborepo/apps/api/package.json.hbs +0 -19
- package/templates/create/turborepo/apps/api/src/index.ts.hbs +0 -51
- package/templates/create/turborepo/package.json.hbs +0 -24
- package/templates/create/turborepo/packages/db/package.json.hbs +0 -17
- package/templates/create/turborepo/packages/db/prisma/schema.prisma.hbs +0 -21
- package/templates/create/turborepo/packages/db/prisma/seed.ts.hbs +0 -38
- package/templates/create/turborepo/packages/db/prisma.config.ts +0 -13
- package/templates/create/turborepo/packages/db/src/client.ts.hbs +0 -58
- package/templates/create/turborepo/packages/db/src/index.ts +0 -2
- package/templates/create/turborepo/packages/db/tsconfig.json +0 -15
- package/templates/create/turborepo/turbo.json +0 -28
- /package/templates/create/{turborepo → elysia}/.yarnrc.yml.hbs +0 -0
|
@@ -8,25 +8,35 @@ Generated by `create-prisma` with the Elysia template.
|
|
|
8
8
|
- `{{runScriptCommand packageManager "build"}}` - {{#if (eq packageManager "deno")}}type-check the app with Deno{{else}}{{#if (eq packageManager "bun")}}type-check the app for Bun{{else}}typecheck and compile{{/if}}{{/if}}
|
|
9
9
|
- `{{runScriptCommand packageManager "start"}}` - {{#if (eq packageManager "deno")}}run the server directly from `src/index.ts` with Deno{{else}}{{#if (eq packageManager "bun")}}run the server directly from `src/index.ts` with Bun{{else}}run compiled server from `dist/`{{/if}}{{/if}}
|
|
10
10
|
|
|
11
|
-
## Prisma
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
## Prisma Next
|
|
12
|
+
|
|
13
|
+
Prisma Next setup is scaffolded in:
|
|
14
|
+
|
|
15
|
+
- `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
|
|
16
|
+
- `prisma-next.config.ts`
|
|
17
|
+
- `src/lib/prisma.ts`
|
|
18
|
+
|
|
19
|
+
Database helper scripts are added to `package.json`:
|
|
20
|
+
|
|
21
|
+
- `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
|
|
22
|
+
{{#if (eq provider "mongo")}}
|
|
23
|
+
- `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
|
|
24
|
+
- `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
|
|
25
|
+
- `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
|
|
26
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
|
|
27
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
|
|
28
|
+
{{else}}
|
|
29
|
+
- `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
|
|
30
|
+
- `{{runScriptCommand packageManager "db:update"}}` - update database state manually
|
|
31
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
|
|
32
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
|
|
33
|
+
{{/if}}
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
- `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
|
|
23
36
|
|
|
24
|
-
`
|
|
37
|
+
For provider-specific Prisma Next reference docs, see `prisma-next.md`. Prisma Next skills live in the upstream `skills/` directory: https://github.com/prisma/prisma-next/tree/main/skills.
|
|
25
38
|
|
|
26
|
-
|
|
39
|
+
Node-based Prisma Next projects expect Node.js 24 LTS or newer.
|
|
27
40
|
|
|
28
|
-
|
|
29
|
-
{{#if (eq schemaPreset "basic")}}
|
|
41
|
+
The template includes a basic `User` model and a sample `GET /users` endpoint.
|
|
30
42
|
|
|
31
|
-
The template includes a basic `User` model, a sample `GET /users` endpoint, and seed data in `prisma/seed.ts`.
|
|
32
|
-
{{/if}}
|
|
@@ -6,9 +6,8 @@ import "dotenv/config";
|
|
|
6
6
|
import { node } from "@elysiajs/node";
|
|
7
7
|
{{/if}}
|
|
8
8
|
import { Elysia } from "elysia";
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
{{/if}}
|
|
9
|
+
|
|
10
|
+
import { listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
12
11
|
|
|
13
12
|
const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
|
|
14
13
|
const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
|
|
@@ -21,16 +20,21 @@ const app = new Elysia({{#if (eq packageManager "deno")}}{{else}}{ adapter: node
|
|
|
21
20
|
message: "hello from create-prisma + elysia",
|
|
22
21
|
};
|
|
23
22
|
})
|
|
24
|
-
|
|
25
|
-
.get("/users", async () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
createdAt: "desc",
|
|
30
|
-
},
|
|
23
|
+
|
|
24
|
+
.get("/users", async ({ set }) => {
|
|
25
|
+
const users = await listUsers(10).catch((error) => {
|
|
26
|
+
console.error("Failed to query users:", error);
|
|
27
|
+
return undefined;
|
|
31
28
|
});
|
|
29
|
+
|
|
30
|
+
if (!users) {
|
|
31
|
+
set.status = 500;
|
|
32
|
+
return { error: "Could not query users yet. Run contract:emit and apply your schema first." };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return users;
|
|
32
36
|
})
|
|
33
|
-
|
|
37
|
+
|
|
34
38
|
{{#if (eq packageManager "deno")}}
|
|
35
39
|
;
|
|
36
40
|
|
|
@@ -1,56 +1,73 @@
|
|
|
1
|
-
{{#if (requiresDotenvConfigImport packageManager)}}
|
|
2
1
|
import "dotenv/config";
|
|
3
|
-
{{
|
|
4
|
-
import
|
|
5
|
-
{{
|
|
6
|
-
import
|
|
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";
|
|
2
|
+
{{#if (eq provider "mongo")}}
|
|
3
|
+
import mongo from "@prisma-next/mongo/runtime";
|
|
4
|
+
{{else}}
|
|
5
|
+
import postgres from "@prisma-next/postgres/runtime";
|
|
19
6
|
{{/if}}
|
|
20
7
|
|
|
21
|
-
|
|
22
|
-
{
|
|
23
|
-
const databaseUrl = (rawDatabaseUrl ?? "").trim() || "file:./dev.db";
|
|
8
|
+
{{#if (eq provider "mongo")}}
|
|
9
|
+
import type { DefaultModelRow } from "@prisma-next/mongo-orm";
|
|
24
10
|
{{else}}
|
|
25
|
-
|
|
26
|
-
if (!databaseUrl) {
|
|
27
|
-
throw new Error("DATABASE_URL is required");
|
|
28
|
-
}
|
|
11
|
+
import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
|
|
29
12
|
{{/if}}
|
|
30
13
|
|
|
31
|
-
{
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
import type { Contract } from "../../prisma/contract.d";
|
|
15
|
+
import contractJson from "../../prisma/contract.json" with { type: "json" };
|
|
16
|
+
|
|
17
|
+
{{#if (eq provider "mongo")}}
|
|
18
|
+
export const db = mongo<Contract>({
|
|
19
|
+
contractJson,
|
|
20
|
+
url: process.env["DATABASE_URL"]!,
|
|
34
21
|
});
|
|
35
|
-
{{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
{{else}}
|
|
23
|
+
export const db = postgres<Contract>({
|
|
24
|
+
contractJson,
|
|
25
|
+
url: process.env["DATABASE_URL"]!,
|
|
39
26
|
});
|
|
40
27
|
{{/if}}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
{{#if (eq provider "
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
28
|
+
|
|
29
|
+
type UserRow = DefaultModelRow<Contract, "User">;
|
|
30
|
+
|
|
31
|
+
{{#if (eq provider "mongo")}}
|
|
32
|
+
function toStarterUser(user: Pick<UserRow, "_id" | "email" | "username" | "name">) {
|
|
33
|
+
return {
|
|
34
|
+
id: String(user._id),
|
|
35
|
+
email: user.email,
|
|
36
|
+
username: user.username ?? null,
|
|
37
|
+
name: user.name ?? null,
|
|
38
|
+
createdAt: null as Date | null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
{{else}}
|
|
42
|
+
function toStarterUser(user: Pick<UserRow, "id" | "email" | "username" | "name" | "createdAt">) {
|
|
43
|
+
return {
|
|
44
|
+
id: String(user.id),
|
|
45
|
+
email: user.email,
|
|
46
|
+
username: user.username ?? null,
|
|
47
|
+
name: user.name ?? null,
|
|
48
|
+
createdAt: user.createdAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
48
51
|
{{/if}}
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
|
|
53
|
+
export async function listUsers(limit = 10) {
|
|
54
|
+
|
|
55
|
+
{{#if (eq provider "mongo")}}
|
|
56
|
+
const users: ReturnType<typeof toStarterUser>[] = [];
|
|
57
|
+
|
|
58
|
+
for await (const user of db.orm.users.select("_id", "email", "username", "name").take(limit).all()) {
|
|
59
|
+
users.push(toStarterUser(user));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return users;
|
|
63
|
+
{{else}}
|
|
64
|
+
const users = await db.orm.User.select("id", "email", "username", "name", "createdAt").take(limit).all();
|
|
65
|
+
|
|
66
|
+
return users.map(toStarterUser);
|
|
51
67
|
{{/if}}
|
|
52
68
|
|
|
53
|
-
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
|
|
54
72
|
|
|
55
|
-
export
|
|
56
|
-
export default prisma;
|
|
73
|
+
export default db;
|
|
@@ -8,25 +8,35 @@ Generated by `create-prisma` with the Hono template.
|
|
|
8
8
|
- `{{runScriptCommand packageManager "build"}}` - {{#if (eq packageManager "deno")}}type-check the app with Deno{{else}}{{#if (eq packageManager "bun")}}type-check the app for Bun{{else}}typecheck and compile{{/if}}{{/if}}
|
|
9
9
|
- `{{runScriptCommand packageManager "start"}}` - {{#if (eq packageManager "deno")}}run the server directly from `src/index.ts` with Deno{{else}}{{#if (eq packageManager "bun")}}run the server directly from `src/index.ts` with Bun{{else}}run compiled server from `dist/`{{/if}}{{/if}}
|
|
10
10
|
|
|
11
|
-
## Prisma
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
## Prisma Next
|
|
12
|
+
|
|
13
|
+
Prisma Next setup is scaffolded in:
|
|
14
|
+
|
|
15
|
+
- `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
|
|
16
|
+
- `prisma-next.config.ts`
|
|
17
|
+
- `src/lib/prisma.ts`
|
|
18
|
+
|
|
19
|
+
Database helper scripts are added to `package.json`:
|
|
20
|
+
|
|
21
|
+
- `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
|
|
22
|
+
{{#if (eq provider "mongo")}}
|
|
23
|
+
- `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
|
|
24
|
+
- `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
|
|
25
|
+
- `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
|
|
26
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
|
|
27
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
|
|
28
|
+
{{else}}
|
|
29
|
+
- `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
|
|
30
|
+
- `{{runScriptCommand packageManager "db:update"}}` - update database state manually
|
|
31
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
|
|
32
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
|
|
33
|
+
{{/if}}
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
- `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
|
|
23
36
|
|
|
24
|
-
`
|
|
37
|
+
For provider-specific Prisma Next reference docs, see `prisma-next.md`. Prisma Next skills live in the upstream `skills/` directory: https://github.com/prisma/prisma-next/tree/main/skills.
|
|
25
38
|
|
|
26
|
-
|
|
39
|
+
Node-based Prisma Next projects expect Node.js 24 LTS or newer.
|
|
27
40
|
|
|
28
|
-
|
|
29
|
-
{{#if (eq schemaPreset "basic")}}
|
|
41
|
+
The template includes a basic `User` model and a sample `GET /users` endpoint.
|
|
30
42
|
|
|
31
|
-
The template includes a basic `User` model, a sample `GET /users` endpoint, and seed data in `prisma/seed.ts`.
|
|
32
|
-
{{/if}}
|
|
@@ -3,9 +3,8 @@ import "dotenv/config";
|
|
|
3
3
|
{{/if}}
|
|
4
4
|
import { serve } from "@hono/node-server";
|
|
5
5
|
import { Hono } from "hono";
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
{{/if}}
|
|
6
|
+
|
|
7
|
+
import { listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
9
8
|
|
|
10
9
|
const app = new Hono();
|
|
11
10
|
|
|
@@ -14,19 +13,19 @@ app.get("/", (c) => {
|
|
|
14
13
|
message: "hello from create-prisma + hono",
|
|
15
14
|
});
|
|
16
15
|
});
|
|
17
|
-
{{#if (eq schemaPreset "basic")}}
|
|
18
16
|
|
|
19
17
|
app.get("/users", async (c) => {
|
|
20
|
-
const users = await
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
createdAt: "desc",
|
|
24
|
-
},
|
|
18
|
+
const users = await listUsers(10).catch((error) => {
|
|
19
|
+
console.error("Failed to query users:", error);
|
|
20
|
+
return undefined;
|
|
25
21
|
});
|
|
26
22
|
|
|
23
|
+
if (!users) {
|
|
24
|
+
return c.json({ error: "Could not query users yet. Run contract:emit and apply your schema first." }, 500);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
27
|
return c.json(users);
|
|
28
28
|
});
|
|
29
|
-
{{/if}}
|
|
30
29
|
|
|
31
30
|
const rawPort = ({{#if (eq packageManager "deno")}}Deno.env.get("PORT"){{else}}process.env.PORT{{/if}} ?? "").trim();
|
|
32
31
|
const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN;
|
|
@@ -1,56 +1,73 @@
|
|
|
1
|
-
{{#if (requiresDotenvConfigImport packageManager)}}
|
|
2
1
|
import "dotenv/config";
|
|
3
|
-
{{
|
|
4
|
-
import
|
|
5
|
-
{{
|
|
6
|
-
import
|
|
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";
|
|
2
|
+
{{#if (eq provider "mongo")}}
|
|
3
|
+
import mongo from "@prisma-next/mongo/runtime";
|
|
4
|
+
{{else}}
|
|
5
|
+
import postgres from "@prisma-next/postgres/runtime";
|
|
19
6
|
{{/if}}
|
|
20
7
|
|
|
21
|
-
|
|
22
|
-
{
|
|
23
|
-
const databaseUrl = (rawDatabaseUrl ?? "").trim() || "file:./dev.db";
|
|
8
|
+
{{#if (eq provider "mongo")}}
|
|
9
|
+
import type { DefaultModelRow } from "@prisma-next/mongo-orm";
|
|
24
10
|
{{else}}
|
|
25
|
-
|
|
26
|
-
if (!databaseUrl) {
|
|
27
|
-
throw new Error("DATABASE_URL is required");
|
|
28
|
-
}
|
|
11
|
+
import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
|
|
29
12
|
{{/if}}
|
|
30
13
|
|
|
31
|
-
{
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
import type { Contract } from "../../prisma/contract.d";
|
|
15
|
+
import contractJson from "../../prisma/contract.json" with { type: "json" };
|
|
16
|
+
|
|
17
|
+
{{#if (eq provider "mongo")}}
|
|
18
|
+
export const db = mongo<Contract>({
|
|
19
|
+
contractJson,
|
|
20
|
+
url: process.env["DATABASE_URL"]!,
|
|
34
21
|
});
|
|
35
|
-
{{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
{{else}}
|
|
23
|
+
export const db = postgres<Contract>({
|
|
24
|
+
contractJson,
|
|
25
|
+
url: process.env["DATABASE_URL"]!,
|
|
39
26
|
});
|
|
40
27
|
{{/if}}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
{{#if (eq provider "
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
28
|
+
|
|
29
|
+
type UserRow = DefaultModelRow<Contract, "User">;
|
|
30
|
+
|
|
31
|
+
{{#if (eq provider "mongo")}}
|
|
32
|
+
function toStarterUser(user: Pick<UserRow, "_id" | "email" | "username" | "name">) {
|
|
33
|
+
return {
|
|
34
|
+
id: String(user._id),
|
|
35
|
+
email: user.email,
|
|
36
|
+
username: user.username ?? null,
|
|
37
|
+
name: user.name ?? null,
|
|
38
|
+
createdAt: null as Date | null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
{{else}}
|
|
42
|
+
function toStarterUser(user: Pick<UserRow, "id" | "email" | "username" | "name" | "createdAt">) {
|
|
43
|
+
return {
|
|
44
|
+
id: String(user.id),
|
|
45
|
+
email: user.email,
|
|
46
|
+
username: user.username ?? null,
|
|
47
|
+
name: user.name ?? null,
|
|
48
|
+
createdAt: user.createdAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
48
51
|
{{/if}}
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
|
|
53
|
+
export async function listUsers(limit = 10) {
|
|
54
|
+
|
|
55
|
+
{{#if (eq provider "mongo")}}
|
|
56
|
+
const users: ReturnType<typeof toStarterUser>[] = [];
|
|
57
|
+
|
|
58
|
+
for await (const user of db.orm.users.select("_id", "email", "username", "name").take(limit).all()) {
|
|
59
|
+
users.push(toStarterUser(user));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return users;
|
|
63
|
+
{{else}}
|
|
64
|
+
const users = await db.orm.User.select("id", "email", "username", "name", "createdAt").take(limit).all();
|
|
65
|
+
|
|
66
|
+
return users.map(toStarterUser);
|
|
51
67
|
{{/if}}
|
|
52
68
|
|
|
53
|
-
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
|
|
54
72
|
|
|
55
|
-
export
|
|
56
|
-
export default prisma;
|
|
73
|
+
export default db;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
Generated by `create-prisma` with the Minimal template.
|
|
4
|
+
|
|
5
|
+
## Scripts
|
|
6
|
+
|
|
7
|
+
- `{{runScriptCommand packageManager "dev"}}` - run the Prisma Next sample script
|
|
8
|
+
|
|
9
|
+
## Prisma Next
|
|
10
|
+
|
|
11
|
+
Prisma Next setup is scaffolded in:
|
|
12
|
+
|
|
13
|
+
- `prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
|
|
14
|
+
- `prisma-next.config.ts`
|
|
15
|
+
- `prisma/db.ts`
|
|
16
|
+
- `src/lib/prisma.ts`
|
|
17
|
+
|
|
18
|
+
Database helper scripts are added to `package.json`:
|
|
19
|
+
|
|
20
|
+
- `{{runScriptCommand packageManager "contract:emit"}}` - emit contract artifacts after contract changes
|
|
21
|
+
{{#if (eq provider "mongo")}}
|
|
22
|
+
- `{{runScriptCommand packageManager "db:up"}}` - start the local MongoDB replica set with `mongodb-memory-server`. Data persists in `.mongo-data/` across restarts.
|
|
23
|
+
- `{{runScriptCommand packageManager "db:down"}}` - stop the local MongoDB process (data preserved)
|
|
24
|
+
- `{{runScriptCommand packageManager "db:reset"}}` - stop and wipe `.mongo-data/` for a clean slate
|
|
25
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a MongoDB migration plan
|
|
26
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply the planned MongoDB migration
|
|
27
|
+
{{else}}
|
|
28
|
+
- `{{runScriptCommand packageManager "db:init"}}` - initialize database state manually
|
|
29
|
+
- `{{runScriptCommand packageManager "db:update"}}` - update database state manually
|
|
30
|
+
- `{{runScriptCommand packageManager "migration:plan"}}` - create a migration plan
|
|
31
|
+
- `{{runScriptCommand packageManager "migrate"}}` - apply a planned migration
|
|
32
|
+
{{/if}}
|
|
33
|
+
- `{{runScriptCommand packageManager "db:seed"}}` - insert sample users manually
|
|
34
|
+
|
|
35
|
+
For provider-specific Prisma Next reference docs, see `prisma-next.md`. Prisma Next skills live in the upstream `skills/` directory: https://github.com/prisma/prisma-next/tree/main/skills.
|
|
36
|
+
|
|
37
|
+
Node-based Prisma Next projects expect Node.js 24 LTS or newer.
|
|
38
|
+
|
|
39
|
+
Run the migration and seed scripts first, then `{{runScriptCommand packageManager "dev"}}` runs a small write/read round trip from `src/index.ts`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}",
|
|
3
|
+
"private": true,
|
|
4
|
+
{{#if (packageManagerManifestValue packageManager)}}
|
|
5
|
+
"packageManager": "{{packageManagerManifestValue packageManager}}",
|
|
6
|
+
{{/if}}
|
|
7
|
+
"type": "module",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"dev": "{{runtimeScript packageManager "start" "src/index.ts" ""}}"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {},
|
|
12
|
+
"devDependencies": {}
|
|
13
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { db, listUsers } from "./lib/prisma{{#if (eq packageManager "deno")}}.ts{{/if}}";
|
|
2
|
+
|
|
3
|
+
const sampleUser = {
|
|
4
|
+
email: "first.user@prisma.io",
|
|
5
|
+
username: "first-user",
|
|
6
|
+
name: "First User",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
{{#if (eq provider "mongo")}}
|
|
11
|
+
const existingUser = await db.orm.users.where({ email: sampleUser.email }).first();
|
|
12
|
+
if (!existingUser) {
|
|
13
|
+
await db.orm.users.createCount([sampleUser]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const user = await db.orm.users.where({ email: sampleUser.email }).first();
|
|
17
|
+
{{else}}
|
|
18
|
+
const existingUser = await db.orm.User.where({ email: sampleUser.email }).first();
|
|
19
|
+
if (!existingUser) {
|
|
20
|
+
await db.orm.User.createCount([sampleUser]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const user = await db.orm.User.where({ email: sampleUser.email }).first();
|
|
24
|
+
{{/if}}
|
|
25
|
+
const users = await listUsers();
|
|
26
|
+
|
|
27
|
+
console.log(`Prisma Next is ready. Found ${users.length} user${users.length === 1 ? "" : "s"}.`);
|
|
28
|
+
console.log(user);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
await main();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error("Prisma Next query failed.");
|
|
35
|
+
console.error("Emit the contract, set DATABASE_URL, then apply migrations before running this script.");
|
|
36
|
+
throw error;
|
|
37
|
+
} finally {
|
|
38
|
+
{{#if (eq provider "mongo")}}
|
|
39
|
+
await db.close();
|
|
40
|
+
{{else}}
|
|
41
|
+
await db.runtime().close();
|
|
42
|
+
{{/if}}
|
|
43
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
{{#if (eq provider "mongo")}}
|
|
3
|
+
import mongo from "@prisma-next/mongo/runtime";
|
|
4
|
+
{{else}}
|
|
5
|
+
import postgres from "@prisma-next/postgres/runtime";
|
|
6
|
+
{{/if}}
|
|
7
|
+
|
|
8
|
+
{{#if (eq provider "mongo")}}
|
|
9
|
+
import type { DefaultModelRow } from "@prisma-next/mongo-orm";
|
|
10
|
+
{{else}}
|
|
11
|
+
import type { DefaultModelRow } from "@prisma-next/sql-orm-client";
|
|
12
|
+
{{/if}}
|
|
13
|
+
|
|
14
|
+
import type { Contract } from "../../prisma/contract.d";
|
|
15
|
+
import contractJson from "../../prisma/contract.json" with { type: "json" };
|
|
16
|
+
|
|
17
|
+
{{#if (eq provider "mongo")}}
|
|
18
|
+
export const db = mongo<Contract>({
|
|
19
|
+
contractJson,
|
|
20
|
+
url: process.env["DATABASE_URL"]!,
|
|
21
|
+
});
|
|
22
|
+
{{else}}
|
|
23
|
+
export const db = postgres<Contract>({
|
|
24
|
+
contractJson,
|
|
25
|
+
url: process.env["DATABASE_URL"]!,
|
|
26
|
+
});
|
|
27
|
+
{{/if}}
|
|
28
|
+
|
|
29
|
+
type UserRow = DefaultModelRow<Contract, "User">;
|
|
30
|
+
|
|
31
|
+
{{#if (eq provider "mongo")}}
|
|
32
|
+
function toStarterUser(user: Pick<UserRow, "_id" | "email" | "username" | "name">) {
|
|
33
|
+
return {
|
|
34
|
+
id: String(user._id),
|
|
35
|
+
email: user.email,
|
|
36
|
+
username: user.username ?? null,
|
|
37
|
+
name: user.name ?? null,
|
|
38
|
+
createdAt: null as Date | null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
{{else}}
|
|
42
|
+
function toStarterUser(user: Pick<UserRow, "id" | "email" | "username" | "name" | "createdAt">) {
|
|
43
|
+
return {
|
|
44
|
+
id: String(user.id),
|
|
45
|
+
email: user.email,
|
|
46
|
+
username: user.username ?? null,
|
|
47
|
+
name: user.name ?? null,
|
|
48
|
+
createdAt: user.createdAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
{{/if}}
|
|
52
|
+
|
|
53
|
+
export async function listUsers(limit = 10) {
|
|
54
|
+
|
|
55
|
+
{{#if (eq provider "mongo")}}
|
|
56
|
+
const users: ReturnType<typeof toStarterUser>[] = [];
|
|
57
|
+
|
|
58
|
+
for await (const user of db.orm.users.select("_id", "email", "username", "name").take(limit).all()) {
|
|
59
|
+
users.push(toStarterUser(user));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return users;
|
|
63
|
+
{{else}}
|
|
64
|
+
const users = await db.orm.User.select("id", "email", "username", "name", "createdAt").take(limit).all();
|
|
65
|
+
|
|
66
|
+
return users.map(toStarterUser);
|
|
67
|
+
{{/if}}
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type StarterUser = Awaited<ReturnType<typeof listUsers>>[number];
|
|
72
|
+
|
|
73
|
+
export default db;
|