From 7c8584d69e27a277c6249d7f46874fda03453e44 Mon Sep 17 00:00:00 2001 From: willbot Date: Wed, 28 Oct 2026 16:18:53 +0100 Subject: [PATCH 1/2] feat: scaffold for Composer 0.35, with the entry in prisma.config.ts Composer 0.35.0, which prisma 8.0.0-rc.28 ships, removed the entry argument from prisma dev and prisma deploy. The scaffold's composer section now sets entry: "./module.ts", and its scripts and the post-scaffold deploy run the commands without it. Signed-off-by: willbot Signed-off-by: Will Madden --- src/constants/dependencies.ts | 6 +++--- src/tasks/composer/deploy-report.ts | 2 +- src/tasks/deploy-with-composer.ts | 1 - src/tasks/install.ts | 3 +-- templates/create/_shared/prisma.config.ts.hbs | 1 + tests/dependencies.test.ts | 6 +++--- tests/install.test.ts | 7 +++---- 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index 4b7d5a8..d8f1e50 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -3,8 +3,8 @@ import type { CreateTemplate, PackageManager } from "../types"; export const dependencyVersionMap = { "@astrojs/node": "^11.1.9", "@elysia/node": "^1.4.6", - "@prisma/composer": "0.34.0", - "@prisma/composer-prisma-cloud": "0.34.0", + "@prisma/composer": "0.35.0", + "@prisma/composer-prisma-cloud": "0.35.0", "@prisma/dev": "0.25.2", "@prisma/orm-mongo": "8.0.0-rc.20", // Must match @prisma/composer-prisma-cloud's exact peerDependency, even when @@ -23,7 +23,7 @@ export const dependencyVersionMap = { nitro: "^3.0.260903-beta", // Must match the @prisma/composer-cli version this prisma release depends on. // `bun run check:pins` verifies that against the Composer pins above. - prisma: "8.0.0-rc.27", + prisma: "8.0.0-rc.28", // Node 22 needs a global Temporal for the ORM runtime's timestamp columns. "temporal-polyfill": "^1.0.6", tsdown: "^0.23.1", diff --git a/src/tasks/composer/deploy-report.ts b/src/tasks/composer/deploy-report.ts index 73a9de1..e541973 100644 --- a/src/tasks/composer/deploy-report.ts +++ b/src/tasks/composer/deploy-report.ts @@ -56,7 +56,7 @@ export const runComposerDeployEffect = Effect.fn("Deployment.runComposerDeploy") return yield* runPrismaJsonCommandEffect({ packageManager: options.packageManager, projectDir: options.projectDir, - args: ["deploy", "module.ts", ...(reportPath ? ["--report", reportPath] : [])], + args: ["deploy", ...(reportPath ? ["--report", reportPath] : [])], ...(options.onStderrLine ? { onStderrLine: options.onStderrLine } : {}), }).pipe( Effect.catchTag("PrismaCliCommandError", (error) => diff --git a/src/tasks/deploy-with-composer.ts b/src/tasks/deploy-with-composer.ts index 7202286..4054127 100644 --- a/src/tasks/deploy-with-composer.ts +++ b/src/tasks/deploy-with-composer.ts @@ -140,7 +140,6 @@ export const deployNewProjectWithComposerEffect = Effect.fn("Deployment.deploy") const deployCommand = getLocalPackageBinaryCommand(options.packageManager, "prisma", [ "deploy", - "module.ts", ]); yield* Effect.sync(() => { clearProgress(); diff --git a/src/tasks/install.ts b/src/tasks/install.ts index 7626139..b283885 100644 --- a/src/tasks/install.ts +++ b/src/tasks/install.ts @@ -64,8 +64,7 @@ function getPrismaScriptMap( export function getComposerScriptMap(packageManager: PackageManager): Record { if (packageManager === "deno") return {}; - const composerCommand = (subcommand: "dev" | "deploy") => - ["prisma", subcommand, "module.ts"].join(" "); + const composerCommand = (subcommand: "dev" | "deploy") => ["prisma", subcommand].join(" "); return { "composer:dev": composerCommand("dev"), "composer:deploy": composerCommand("deploy"), diff --git a/templates/create/_shared/prisma.config.ts.hbs b/templates/create/_shared/prisma.config.ts.hbs index 42a5246..3d9b335 100644 --- a/templates/create/_shared/prisma.config.ts.hbs +++ b/templates/create/_shared/prisma.config.ts.hbs @@ -38,6 +38,7 @@ export default definePrismaConfig({ }, }), composer: composer({ + entry: "./module.ts", extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild(){{#if (eq template "next")}}, nextjsBuild(){{/if}}], state: prismaState(), }), diff --git a/tests/dependencies.test.ts b/tests/dependencies.test.ts index fb117a6..bc56e1c 100644 --- a/tests/dependencies.test.ts +++ b/tests/dependencies.test.ts @@ -6,9 +6,9 @@ describe("Prisma 8 dependency versions", () => { test("uses the selected Prisma 8 and Composer releases", () => { expect(getDependencyVersion("@prisma/orm-postgres")).toBe("8.0.0-rc.20"); expect(getDependencyVersion("@prisma/orm-mongo")).toBe("8.0.0-rc.20"); - expect(getDependencyVersion("@prisma/composer")).toBe("0.34.0"); - expect(getDependencyVersion("@prisma/composer-prisma-cloud")).toBe("0.34.0"); - expect(getDependencyVersion("prisma")).toBe("8.0.0-rc.27"); + expect(getDependencyVersion("@prisma/composer")).toBe("0.35.0"); + expect(getDependencyVersion("@prisma/composer-prisma-cloud")).toBe("0.35.0"); + expect(getDependencyVersion("prisma")).toBe("8.0.0-rc.28"); expect(getDependencyVersion("alchemy")).toBe("2.0.0-beta.83"); expect(getDependencyVersion("effect")).toBe("4.0.3"); expect(getDependencyVersion("turbo")).toBe("2.11.10"); diff --git a/tests/install.test.ts b/tests/install.test.ts index ed6258f..401d967 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -240,10 +240,8 @@ describe("Composer package-manager commands", () => { test("uses each selected package manager for Prisma CLI execution", () => { for (const packageManager of ["npm", "pnpm", "yarn", "bun"] as const) { - expect(getComposerScriptMap(packageManager)["composer:deploy"]).toBe( - "prisma deploy module.ts", - ); - expect(getComposerScriptMap(packageManager)["composer:dev"]).toBe("prisma dev module.ts"); + expect(getComposerScriptMap(packageManager)["composer:deploy"]).toBe("prisma deploy"); + expect(getComposerScriptMap(packageManager)["composer:dev"]).toBe("prisma dev"); } expect(getComposerScriptMap("bun")["composer:destroy"]).toBeUndefined(); expect(getComposerScriptMap("deno")).toEqual({}); @@ -434,6 +432,7 @@ describe("generated templates", () => { expect(prismaConfig).toContain('import { definePrismaConfig } from "prisma/config"'); expect(prismaConfig).toContain('agents: ["claude", "cursor", "agents", "devin"]'); expect(prismaConfig).toContain("composer: composer({"); + expect(prismaConfig).toContain('entry: "./module.ts"'); expect(prismaConfig).toContain('prismaCloud({ region: "us-east-1" })'); expect(prismaConfig).toContain("state: prismaState()"); expect(prismaConfig).not.toContain("configPath:"); From e77082df3aa785bd2a196a6757d27477269498dc Mon Sep 17 00:00:00 2001 From: willbot Date: Wed, 28 Oct 2026 16:41:25 +0100 Subject: [PATCH 2/2] test(e2e): find the app's endpoint by its full address Composer 0.35.0 names a node by its path from the app name, so dev's endpoint frame for the app service is .app. Signed-off-by: willbot Signed-off-by: Will Madden --- tests/e2e/create-prisma.e2e.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/e2e/create-prisma.e2e.test.ts b/tests/e2e/create-prisma.e2e.test.ts index b1c6e73..5836a61 100644 --- a/tests/e2e/create-prisma.e2e.test.ts +++ b/tests/e2e/create-prisma.e2e.test.ts @@ -98,7 +98,12 @@ function findAppEndpoint(output: string): string | undefined { for (const line of output.split(/\r?\n/)) { try { const frame = JSON.parse(line) as { kind?: unknown; name?: unknown; url?: unknown }; - if (frame.kind === "endpoint" && frame.name === "app" && typeof frame.url === "string") { + if ( + frame.kind === "endpoint" && + typeof frame.name === "string" && + frame.name.endsWith(".app") && + typeof frame.url === "string" + ) { return frame.url; } } catch {