Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ bunx create-prisma@latest my-app

The CLI initializes Prisma 8 with `prisma@latest`, installs dependencies, emits the contract, and generates a deployable Composer app. PostgreSQL projects use Composer's native Prisma Postgres provider, including migrations and a typed runtime client.

PostgreSQL apps with Composer include `@prisma/dev` as a project devDependency for
local Postgres. In a monorepo it belongs at the root, where Composer runs. Prisma 8
does not include this runtime itself. MongoDB and Deno-only apps do not need it.

For npm, use 11.6.0 or newer, which includes the [upstream resolver fix](https://github.com/npm/cli/pull/8448).
Older npm releases can crash resolving the dependency tree (`Cannot read properties of null (reading 'edgesOut')`). Run
`npm install --global npm@11` to update. create-prisma checks the selected npm
Expand Down
1 change: 1 addition & 0 deletions src/constants/dependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export const dependencyVersionMap = {
"@elysiajs/node": "^1.4.5",
"@prisma/composer": "0.19.0",
"@prisma/composer-prisma-cloud": "0.19.0",
"@prisma/dev": "0.25.2",
"@prisma/orm-mongo": "8.0.0-rc.10",
// Must match @prisma/composer-prisma-cloud's exact peerDependency.
"@prisma/orm-postgres": "8.0.0-rc.10",
Expand Down
4 changes: 3 additions & 1 deletion src/tasks/install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,10 @@ export const writePrismaDependenciesEffect = Effect.fn("Dependencies.writePrisma
options: { skillsSync?: boolean; template?: CreateTemplate } = {},
) {
const databaseDependencies = [getDbPackages(provider)];
const devDependencies = ["@types/node", "prisma"];
if (provider === "postgres" && packageManager !== "deno") {
databaseDependencies.push("temporal-polyfill");
devDependencies.push("@prisma/dev");
}
if (provider === "mongo") databaseDependencies.push("arktype", "mongodb");
const dependencies =
Expand All @@ -175,7 +177,7 @@ export const writePrismaDependenciesEffect = Effect.fn("Dependencies.writePrisma
if (packageManager === "deno") dependencies.push("dotenv");
yield* addPackageDependencyEffect({
dependencies,
devDependencies: ["@types/node", "prisma"],
devDependencies,
scripts: getPrismaScriptMap(packageManager, options.skillsSync ?? true),
projectDir,
});
Expand Down
17 changes: 14 additions & 3 deletions tests/install.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ describe("writePrismaDependencies", () => {
expect(packageJson.dependencies?.dotenv).toBeUndefined();
expect(packageJson.devDependencies).toMatchObject({
prisma: dependencyVersionMap.prisma,
"@prisma/dev": dependencyVersionMap["@prisma/dev"],
});
expect(packageJson.scripts).toMatchObject({
"contract:emit": "prisma contract emit",
Expand Down Expand Up @@ -99,6 +100,7 @@ describe("writePrismaDependencies", () => {
mongodb: dependencyVersionMap.mongodb,
});
expect(packageJson.dependencies?.["@prisma/orm-postgres"]).toBeUndefined();
expect(packageJson.devDependencies?.["@prisma/dev"]).toBeUndefined();
expect(packageJson.scripts?.["db:seed"]).toBeUndefined();
});
});
Expand All @@ -117,6 +119,7 @@ describe("writePrismaDependencies", () => {
prisma: dependencyVersionMap.prisma,
});
expect(packageJson.devDependencies?.["@prisma/cli-engine"]).toBeUndefined();
expect(packageJson.devDependencies?.["@prisma/dev"]).toBeUndefined();
expect(packageJson.scripts).toMatchObject({
"contract:emit": `deno run -A npm:${PRISMA_DENO_CLI_PACKAGE} contract emit`,
"db:init": `deno run -A --env-file=.env npm:${PRISMA_DENO_CLI_PACKAGE} db init`,
Expand Down Expand Up @@ -271,8 +274,17 @@ describe("generated templates", () => {
packageManager,
});
await writeCreateTemplateDependencies({ template, packageManager, projectDir });
await writePrismaDependencies(provider, packageManager, authoring, projectDir, {
template,
});

const packageJson = await readPackageJson(projectDir);
expect(packageJson.devDependencies?.["@prisma/dev"]).toBe(
provider === "postgres" && packageManager !== "deno"
? dependencyVersionMap["@prisma/dev"]
: undefined,
);
expect(packageJson.dependencies?.["@prisma/dev"]).toBeUndefined();
if (packageManager === "bun") {
expect(packageJson.packageManager).toBe("bun@1.4.1");
}
Expand Down Expand Up @@ -341,11 +353,10 @@ describe("generated templates", () => {
await pathExists(path.join(projectDir, prismaSourceRelative, "starter-data.ts")),
).toBe(false);
if (template === "turborepo") {
await writePrismaDependencies(provider, packageManager, authoring, projectDir, {
template,
});
const server = await readPackageJson(path.join(projectDir, "apps/server"));
const database = await readPackageJson(path.join(projectDir, "packages/database"));
expect(server.devDependencies?.["@prisma/dev"]).toBeUndefined();
expect(database.devDependencies?.["@prisma/dev"]).toBeUndefined();
const root = await readPackageJson(projectDir);
expect(packageJson.workspaces).toEqual(["apps/*", "packages/*"]);
expect(packageJson.devDependencies?.turbo).toBe(dependencyVersionMap.turbo);
Expand Down
Loading