From 1e0b0319dbf4f2a1beee07a58548df4d8365b806 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Tue, 15 Sep 2026 14:21:48 +0530 Subject: [PATCH] fix: install the project-owned local Postgres runtime Signed-off-by: Aman Varshney --- README.md | 4 ++++ src/constants/dependencies.ts | 1 + src/tasks/install.ts | 4 +++- tests/install.test.ts | 17 ++++++++++++++--- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 27b7989..077d2d7 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index 0124ccd..75b8478 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -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", diff --git a/src/tasks/install.ts b/src/tasks/install.ts index 92085b0..5fdc870 100644 --- a/src/tasks/install.ts +++ b/src/tasks/install.ts @@ -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 = @@ -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, }); diff --git a/tests/install.test.ts b/tests/install.test.ts index c321fa6..db19794 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -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", @@ -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(); }); }); @@ -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`, @@ -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"); } @@ -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);