From b09419b79016cd62c0a887fa88b22662d0036939 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 19:29:55 +0530 Subject: [PATCH 1/7] fix: align starter templates with coordinated Prisma 8 release Signed-off-by: Aman Varshney --- README.md | 2 +- src/constants/dependencies.ts | 10 +++++----- .../create/_shared/prisma-composer.config.ts.hbs | 13 ------------- templates/create/_shared/prisma.config.ts.hbs | 13 ++++++++++--- templates/create/turborepo/tsconfig.json | 8 +------- tests/dependencies.test.ts | 10 +++++----- tests/e2e/create-prisma.e2e.test.ts | 5 +++-- tests/install.test.ts | 12 ++++++++---- 8 files changed, 33 insertions(+), 40 deletions(-) delete mode 100644 templates/create/_shared/prisma-composer.config.ts.hbs diff --git a/README.md b/README.md index 7d8bca8..7c4504e 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Deploy to Prisma now? Choose no to deploy later with the generated `deploy` script. -New apps explicitly use `us-east-1` in `prisma-composer.config.ts`. Change the +New apps explicitly use `us-east-1` in the Composer section of `prisma.config.ts`. Change the `prismaCloud({ region })` option before deploying if you need another region. Composer requires a region when creating a new project; leaving it unspecified only works when deploying into an existing project whose region can be inherited. diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index c3c6c42..03b13ba 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -3,14 +3,14 @@ import type { CreateTemplate, PackageManager } from "../types"; export const dependencyVersionMap = { "@astrojs/node": "^10.0.2", "@elysiajs/node": "^1.4.5", - "@prisma/composer": "0.25.0", - "@prisma/composer-prisma-cloud": "0.25.0", + "@prisma/composer": "0.28.0", + "@prisma/composer-prisma-cloud": "0.28.0", "@prisma/dev": "0.25.2", - "@prisma/orm-mongo": "8.0.0-rc.13", + "@prisma/orm-mongo": "8.0.0-rc.16", // Must match @prisma/composer-prisma-cloud's exact peerDependency, even when // prisma bundles a newer @prisma/orm-toolchain, or npm install fails with // ERESOLVE. - "@prisma/orm-postgres": "8.0.0-rc.13", + "@prisma/orm-postgres": "8.0.0-rc.16", "@sveltejs/adapter-node": "^5.3.2", "@types/node": "^25.6.2", alchemy: "2.0.0-beta.78", @@ -22,7 +22,7 @@ export const dependencyVersionMap = { nitro: "^3.0.260610-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.19", + prisma: "8.0.0-rc.21", // The ORM runtime's timestamp columns need a global Temporal, which no // stable Node or Bun ships yet. "temporal-polyfill": "^1.0.4", diff --git a/templates/create/_shared/prisma-composer.config.ts.hbs b/templates/create/_shared/prisma-composer.config.ts.hbs deleted file mode 100644 index 3fa0719..0000000 --- a/templates/create/_shared/prisma-composer.config.ts.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#unless (eq packageManager "deno")}} -import { defineConfig } from "@prisma/composer/config"; -import { nodeBuild } from "@prisma/composer/node/control"; -{{#if (eq template "next")}} -import { nextjsBuild } from "@prisma/composer/nextjs/control"; -{{/if}} -import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control"; - -export default defineConfig({ - extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild(){{#if (eq template "next")}}, nextjsBuild(){{/if}}], - state: prismaState(), -}); -{{/unless}} diff --git a/templates/create/_shared/prisma.config.ts.hbs b/templates/create/_shared/prisma.config.ts.hbs index a46fefd..91e6f6e 100644 --- a/templates/create/_shared/prisma.config.ts.hbs +++ b/templates/create/_shared/prisma.config.ts.hbs @@ -17,6 +17,12 @@ export default definePrismaConfig({ {{else}} import { definePrismaConfig } from "prisma/config"; import { defineConfig as ormConfig } from "@prisma/orm-{{#if (eq provider "postgres")}}postgres{{else}}mongo{{/if}}/config"; +import { defineConfig as composer } from "@prisma/composer/config"; +import { nodeBuild } from "@prisma/composer/node/control"; +{{#if (eq template "next")}} +import { nextjsBuild } from "@prisma/composer/nextjs/control"; +{{/if}} +import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control"; export default definePrismaConfig({ skills: { @@ -31,8 +37,9 @@ export default definePrismaConfig({ connection: process.env.{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}!, }, }), - composer: { - configPath: "./prisma-composer.config.ts", - }, + composer: composer({ + extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild(){{#if (eq template "next")}}, nextjsBuild(){{/if}}], + state: prismaState(), + }), }); {{/if}} diff --git a/templates/create/turborepo/tsconfig.json b/templates/create/turborepo/tsconfig.json index 5b74628..d6b9386 100644 --- a/templates/create/turborepo/tsconfig.json +++ b/templates/create/turborepo/tsconfig.json @@ -11,12 +11,6 @@ "strict": true, "types": ["node"] }, - "include": [ - "module.ts", - "service.ts", - "prisma.config.ts", - "prisma-composer.config.ts", - "packages/**/*.ts" - ], + "include": ["module.ts", "service.ts", "prisma.config.ts", "packages/**/*.ts"], "exclude": ["node_modules"] } diff --git a/tests/dependencies.test.ts b/tests/dependencies.test.ts index 661e08a..3dbaf80 100644 --- a/tests/dependencies.test.ts +++ b/tests/dependencies.test.ts @@ -4,11 +4,11 @@ import { dependencyVersionMap, getDependencyVersion } from "../src/constants/dep describe("Prisma 8 dependency versions", () => { test("uses the selected Prisma 8 and Composer releases", () => { - expect(getDependencyVersion("@prisma/orm-postgres")).toBe("8.0.0-rc.13"); - expect(getDependencyVersion("@prisma/orm-mongo")).toBe("8.0.0-rc.13"); - expect(getDependencyVersion("@prisma/composer")).toBe("0.25.0"); - expect(getDependencyVersion("@prisma/composer-prisma-cloud")).toBe("0.25.0"); - expect(getDependencyVersion("prisma")).toBe("8.0.0-rc.19"); + expect(getDependencyVersion("@prisma/orm-postgres")).toBe("8.0.0-rc.16"); + expect(getDependencyVersion("@prisma/orm-mongo")).toBe("8.0.0-rc.16"); + expect(getDependencyVersion("@prisma/composer")).toBe("0.28.0"); + expect(getDependencyVersion("@prisma/composer-prisma-cloud")).toBe("0.28.0"); + expect(getDependencyVersion("prisma")).toBe("8.0.0-rc.21"); expect(getDependencyVersion("alchemy")).toBe("2.0.0-beta.78"); expect(getDependencyVersion("effect")).toBe("4.0.0-rc.115"); expect(getDependencyVersion("turbo")).toBe("2.10.12"); diff --git a/tests/e2e/create-prisma.e2e.test.ts b/tests/e2e/create-prisma.e2e.test.ts index 586fa63..56d330e 100644 --- a/tests/e2e/create-prisma.e2e.test.ts +++ b/tests/e2e/create-prisma.e2e.test.ts @@ -589,11 +589,12 @@ describe("create-prisma e2e", () => { async (_label, template) => { const rootDir = await mkdtemp(path.join(tmpdir(), "create-prisma-next-typescript-e2e-")); tempRoots.push(rootDir); + const appName = `typescript-app-${path.basename(rootDir).slice(-6).toLowerCase()}`; const previousCwd = process.cwd(); process.chdir(rootDir); try { await runCreateCommand({ - name: "next-typescript-app", + name: appName, template, provider: "postgres", authoring: "typescript", @@ -605,7 +606,7 @@ describe("create-prisma e2e", () => { process.chdir(previousCwd); } - const projectDir = path.join(rootDir, "next-typescript-app"); + const projectDir = path.join(rootDir, appName); const prismaSourceDir = template === "turborepo" ? "packages/database/src" : "src/prisma"; const composerSource = await readFile( path.join(projectDir, prismaSourceDir, "composer.ts"), diff --git a/tests/install.test.ts b/tests/install.test.ts index 84014d9..9b61366 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -406,10 +406,14 @@ describe("generated templates", () => { expect(prismaConfig).toContain("orm: ormConfig({"); expect(prismaConfig).toContain('import { definePrismaConfig } from "prisma/config"'); expect(prismaConfig).toContain('agents: ["claude", "cursor", "agents", "devin"]'); - expect(prismaConfig).toContain('configPath: "./prisma-composer.config.ts"'); - expect( - await readFile(path.join(projectDir, "prisma-composer.config.ts"), "utf8"), - ).toContain('prismaCloud({ region: "us-east-1" })'); + expect(prismaConfig).toContain("composer: composer({"); + expect(prismaConfig).toContain('prismaCloud({ region: "us-east-1" })'); + expect(prismaConfig).toContain("state: prismaState()"); + expect(prismaConfig).not.toContain("configPath:"); + expect(await pathExists(path.join(projectDir, "prisma-composer.config.ts"))).toBe( + false, + ); + expect(prismaConfig.includes("nextjsBuild()")).toBe(template === "next"); expect(tsconfig).toContain('"node"'); expect(serviceSource).toContain("compute({"); expect(dbSource).toContain("export function connectDatabase()"); From 92014569ff10b7a45e135074764eb98c747172f1 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 19:37:25 +0530 Subject: [PATCH 2/7] fix: allow fresh Prisma releases in shared Yarn configuration Signed-off-by: Aman Varshney --- src/utils/package-manager.ts | 4 ++-- .../create/{astro => _package-manager}/.yarnrc.yml.hbs | 3 +++ templates/create/elysia/.yarnrc.yml.hbs | 3 --- templates/create/hono/.yarnrc.yml.hbs | 3 --- templates/create/minimal/.yarnrc.yml.hbs | 3 --- templates/create/nest/.yarnrc.yml.hbs | 3 --- templates/create/next/.yarnrc.yml.hbs | 3 --- templates/create/nuxt/.yarnrc.yml.hbs | 3 --- templates/create/svelte/.yarnrc.yml.hbs | 3 --- templates/create/tanstack-start/.yarnrc.yml.hbs | 4 ---- templates/create/turborepo/.yarnrc.yml.hbs | 3 --- tests/install.test.ts | 7 ++++++- 12 files changed, 11 insertions(+), 31 deletions(-) rename templates/create/{astro => _package-manager}/.yarnrc.yml.hbs (56%) delete mode 100644 templates/create/elysia/.yarnrc.yml.hbs delete mode 100644 templates/create/hono/.yarnrc.yml.hbs delete mode 100644 templates/create/minimal/.yarnrc.yml.hbs delete mode 100644 templates/create/nest/.yarnrc.yml.hbs delete mode 100644 templates/create/next/.yarnrc.yml.hbs delete mode 100644 templates/create/nuxt/.yarnrc.yml.hbs delete mode 100644 templates/create/svelte/.yarnrc.yml.hbs delete mode 100644 templates/create/tanstack-start/.yarnrc.yml.hbs delete mode 100644 templates/create/turborepo/.yarnrc.yml.hbs diff --git a/src/utils/package-manager.ts b/src/utils/package-manager.ts index d27dd86..b76ad18 100644 --- a/src/utils/package-manager.ts +++ b/src/utils/package-manager.ts @@ -62,8 +62,8 @@ const packageManagerChecks: Record< versionArgs: ["--version"], install: "Install it with Corepack (https://yarnpkg.com/corepack)", minimum: { - version: [2, 0, 0], - guidance: `Generated projects use ${packageManagerManifestValues.yarn}, which Yarn 1 refuses to install. Enable Corepack (https://yarnpkg.com/corepack) or install Yarn 4, then retry create-prisma, or choose another package manager with --package-manager.`, + version: [4, 10, 0], + guidance: `Generated projects use ${packageManagerManifestValues.yarn} and its release-age allowlist for Prisma packages. Enable Corepack (https://yarnpkg.com/corepack) or update Yarn, then retry create-prisma, or choose another package manager with --package-manager.`, }, }, bun: { diff --git a/templates/create/astro/.yarnrc.yml.hbs b/templates/create/_package-manager/.yarnrc.yml.hbs similarity index 56% rename from templates/create/astro/.yarnrc.yml.hbs rename to templates/create/_package-manager/.yarnrc.yml.hbs index faa4013..766920c 100644 --- a/templates/create/astro/.yarnrc.yml.hbs +++ b/templates/create/_package-manager/.yarnrc.yml.hbs @@ -1,3 +1,6 @@ {{#if (eq packageManager "yarn")}} nodeLinker: node-modules +npmPreapprovedPackages: + - "prisma" + - "@prisma/*" {{/if}} diff --git a/templates/create/elysia/.yarnrc.yml.hbs b/templates/create/elysia/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/elysia/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/hono/.yarnrc.yml.hbs b/templates/create/hono/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/hono/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/minimal/.yarnrc.yml.hbs b/templates/create/minimal/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/minimal/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/nest/.yarnrc.yml.hbs b/templates/create/nest/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/nest/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/next/.yarnrc.yml.hbs b/templates/create/next/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/next/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/nuxt/.yarnrc.yml.hbs b/templates/create/nuxt/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/nuxt/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/svelte/.yarnrc.yml.hbs b/templates/create/svelte/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/svelte/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/templates/create/tanstack-start/.yarnrc.yml.hbs b/templates/create/tanstack-start/.yarnrc.yml.hbs deleted file mode 100644 index 6ff11b2..0000000 --- a/templates/create/tanstack-start/.yarnrc.yml.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} - diff --git a/templates/create/turborepo/.yarnrc.yml.hbs b/templates/create/turborepo/.yarnrc.yml.hbs deleted file mode 100644 index faa4013..0000000 --- a/templates/create/turborepo/.yarnrc.yml.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if (eq packageManager "yarn")}} -nodeLinker: node-modules -{{/if}} diff --git a/tests/install.test.ts b/tests/install.test.ts index 9b61366..9c89c65 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -228,11 +228,13 @@ describe("Composer package-manager commands", () => { } }); - test("rejects a missing package manager, Yarn 1, and a probe it cannot prepare", async () => { + test("rejects a missing package manager, unsupported Yarn, and a probe it cannot prepare", async () => { const unwritable = { makeTempDirectoryScoped: () => Effect.succeed("unwritable") }; for (const [stdout, fileSystem, reason] of [ [undefined, undefined, "package_manager_not_found"], ["1.22.22\n", undefined, "unsupported_package_manager_version"], + ["2.4.3\n", undefined, "unsupported_package_manager_version"], + ["4.9.4\n", undefined, "unsupported_package_manager_version"], ["4.13.0\n", unwritable, "package_manager_check_failed"], ] as const) { await expect(verifyPackageManager("yarn", stdout, fileSystem).result).rejects.toMatchObject({ @@ -601,6 +603,9 @@ describe("generated templates", () => { ); } else if (packageManager === "yarn") { expect(packageJson.resolutions).toEqual(effectPins); + expect(await readFile(path.join(projectDir, ".yarnrc.yml"), "utf8")).toBe( + 'nodeLinker: node-modules\nnpmPreapprovedPackages:\n - "prisma"\n - "@prisma/*"\n', + ); } else { expect(packageJson.overrides).toEqual({ ...effectPins, From b43e1d542ec8d8350de0b04b3ff066b291209456 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 19:54:01 +0530 Subject: [PATCH 3/7] fix: keep standalone Mongo configuration on DATABASE_URL Signed-off-by: Aman Varshney --- templates/create/_shared/README.md.hbs | 2 +- templates/create/_shared/prisma.config.ts.hbs | 4 ++-- tests/install.test.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/create/_shared/README.md.hbs b/templates/create/_shared/README.md.hbs index 6563790..b7a833a 100644 --- a/templates/create/_shared/README.md.hbs +++ b/templates/create/_shared/README.md.hbs @@ -74,7 +74,7 @@ After changing the contract, run: {{runScriptCommand packageManager "contract:emit"}} ``` -To run the workspace's development tasks directly, use `{{runScriptCommand packageManager "dev"}}`. This direct mode requires `{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}`. +To run the workspace's development tasks directly, use `{{runScriptCommand packageManager "dev"}}`. This direct mode requires `DATABASE_URL`. {{else}} A minimal {{template}} app with Prisma 8 and Prisma Composer. diff --git a/templates/create/_shared/prisma.config.ts.hbs b/templates/create/_shared/prisma.config.ts.hbs index 91e6f6e..42a5246 100644 --- a/templates/create/_shared/prisma.config.ts.hbs +++ b/templates/create/_shared/prisma.config.ts.hbs @@ -10,7 +10,7 @@ export default definePrismaConfig({ output: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated", {{/if}} db: { - connection: process.env.{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}!, + connection: process.env.DATABASE_URL!, }, }), }); @@ -34,7 +34,7 @@ export default definePrismaConfig({ output: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated", {{/if}} db: { - connection: process.env.{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}!, + connection: process.env.DATABASE_URL!, }, }), composer: composer({ diff --git a/tests/install.test.ts b/tests/install.test.ts index 9c89c65..758f579 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -553,7 +553,7 @@ describe("generated templates", () => { } } else { expect(moduleSource).toContain('envSecret("MONGODB_URL")'); - expect(prismaConfig).toContain("connection: process.env.MONGODB_URL!"); + expect(prismaConfig).toContain("connection: process.env.DATABASE_URL!"); expect(seedSource).not.toContain(".prisma-composer"); } if (authoring === "typescript") { From c78ccc67da2cfc4c09adbaca3f4bc2a23486d4cc Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 20:11:02 +0530 Subject: [PATCH 4/7] fix: keep hydrated starter timestamps consistent across time zones Signed-off-by: Aman Varshney --- templates/create/nuxt/app/pages/index.vue.hbs | 1 + templates/create/svelte/src/routes/+page.svelte.hbs | 3 ++- tests/install.test.ts | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/templates/create/nuxt/app/pages/index.vue.hbs b/templates/create/nuxt/app/pages/index.vue.hbs index 0d719a9..eee9aa1 100644 --- a/templates/create/nuxt/app/pages/index.vue.hbs +++ b/templates/create/nuxt/app/pages/index.vue.hbs @@ -19,6 +19,7 @@ type UsersPayload = { const formatter = new Intl.DateTimeFormat("en", { dateStyle: "medium", timeStyle: "short", + timeZone: "UTC", }); const { data } = await useFetch("/api/users"); diff --git a/templates/create/svelte/src/routes/+page.svelte.hbs b/templates/create/svelte/src/routes/+page.svelte.hbs index 4406dbb..a15171b 100644 --- a/templates/create/svelte/src/routes/+page.svelte.hbs +++ b/templates/create/svelte/src/routes/+page.svelte.hbs @@ -11,7 +11,8 @@ diff --git a/tests/install.test.ts b/tests/install.test.ts index 758f579..15759d4 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -569,6 +569,16 @@ describe("generated templates", () => { } expect(await pathExists(path.join(projectDir, "prisma-next.config.ts"))).toBe(false); expect(await pathExists(path.join(projectDir, "deno.json"))).toBe(false); + if (template === "nuxt" || template === "svelte" || template === "tanstack-start") { + const pagePath = + template === "nuxt" + ? "app/pages/index.vue" + : template === "svelte" + ? "src/routes/+page.svelte" + : "src/routes/index.tsx"; + const pageSource = await readFile(path.join(projectDir, pagePath), "utf8"); + expect(pageSource).toMatch(/timeZone: ["']UTC["']/); + } if (packageManager === "pnpm") { expect(packageJson.pnpm).toBeUndefined(); const frameworkBuildAllowances = From 3f01df3f08caff6e26212a80efdbde0cf7850012 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 21:00:38 +0530 Subject: [PATCH 5/7] feat: refresh starters against current framework docs with TypeScript 6 Signed-off-by: Aman Varshney --- src/constants/dependencies.ts | 30 +++++++++---------- src/utils/package-manager.ts | 8 ++--- templates/create/_shared/README.md.hbs | 2 +- templates/create/astro/package.json.hbs | 10 +++---- templates/create/elysia/package.json.hbs | 8 ++--- templates/create/elysia/src/index.ts.hbs | 2 +- templates/create/hono/package.json.hbs | 10 +++---- templates/create/minimal/package.json.hbs | 2 +- templates/create/nest/package.json.hbs | 12 ++++---- templates/create/next/eslint.config.mjs | 1 + templates/create/next/package.json.hbs | 20 ++++++------- templates/create/nuxt/package.json.hbs | 19 +++++++----- templates/create/svelte/package.json.hbs | 20 ++++++++----- templates/create/svelte/src/lib/index.ts | 2 +- .../create/svelte/src/routes/+layout.svelte | 2 +- templates/create/svelte/svelte.config.js | 10 ------- templates/create/svelte/tsconfig.json | 9 ++---- templates/create/svelte/vite.config.ts | 3 +- .../create/tanstack-start/package.json.hbs | 24 +++++++-------- templates/create/tanstack-start/tsconfig.json | 1 - .../create/tanstack-start/vite.config.ts | 9 ++---- .../create/turborepo/apps/server/package.json | 2 +- tests/dependencies.test.ts | 2 +- tests/install.test.ts | 12 ++++---- 24 files changed, 104 insertions(+), 116 deletions(-) delete mode 100644 templates/create/svelte/svelte.config.js diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index 03b13ba..66bb504 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -1,8 +1,8 @@ import type { CreateTemplate, PackageManager } from "../types"; export const dependencyVersionMap = { - "@astrojs/node": "^10.0.2", - "@elysiajs/node": "^1.4.5", + "@astrojs/node": "^11.1.7", + "@elysia/node": "^1.4.6", "@prisma/composer": "0.28.0", "@prisma/composer-prisma-cloud": "0.28.0", "@prisma/dev": "0.25.2", @@ -11,25 +11,25 @@ export const dependencyVersionMap = { // prisma bundles a newer @prisma/orm-toolchain, or npm install fails with // ERESOLVE. "@prisma/orm-postgres": "8.0.0-rc.16", - "@sveltejs/adapter-node": "^5.3.2", - "@types/node": "^25.6.2", + "@sveltejs/adapter-node": "^6.0.0", + "@types/node": "^26.6.4", alchemy: "2.0.0-beta.78", - arktype: "^2.2.3", - dotenv: "^17.4.2", + arktype: "^2.2.7", + dotenv: "^18.0.6", effect: "4.0.0-rc.115", - mongodb: "^7.1.0", - "mongodb-memory-server": "^11.1.0", - nitro: "^3.0.260610-beta", + mongodb: "^7.7.0", + "mongodb-memory-server": "^11.3.0", + 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.21", // The ORM runtime's timestamp columns need a global Temporal, which no // stable Node or Bun ships yet. - "temporal-polyfill": "^1.0.4", - tsdown: "^0.22.14", - turbo: "2.10.12", - tsx: "^4.21.0", - typescript: "^5.9.3", + "temporal-polyfill": "^1.0.5", + tsdown: "^0.23.0", + turbo: "2.11.7", + tsx: "^4.23.15", + typescript: "^6.0.3", } as const; // Pinned to the effect version as a set: @effect/* siblings depend on each other with @@ -84,7 +84,7 @@ export function getCreateTemplateDependencies( devDependencies.push("typescript"); } if (template === "elysia") { - dependencies.push("@elysiajs/node"); + dependencies.push("@elysia/node"); devDependencies.push("@types/node"); } if (template === "svelte") { diff --git a/src/utils/package-manager.ts b/src/utils/package-manager.ts index b76ad18..784b7ce 100644 --- a/src/utils/package-manager.ts +++ b/src/utils/package-manager.ts @@ -24,10 +24,10 @@ type RuntimeScriptOptions = { const DENO_ALLOW_FRESH_DEPENDENCIES = "--minimum-dependency-age=0"; const packageManagerManifestValues = { - npm: "npm@11.6.0", - pnpm: "pnpm@11.21.0", - yarn: "yarn@4.13.0", - bun: "bun@1.4.1", + npm: "npm@12.2.0", + pnpm: "pnpm@11.28.5", + yarn: "yarn@4.18.1", + bun: "bun@1.4.2", } as const; type PackageManagerVersion = readonly [major: number, minor: number, patch: number]; diff --git a/templates/create/_shared/README.md.hbs b/templates/create/_shared/README.md.hbs index b7a833a..4fe5d76 100644 --- a/templates/create/_shared/README.md.hbs +++ b/templates/create/_shared/README.md.hbs @@ -84,7 +84,7 @@ A minimal {{template}} app with Prisma 8 and Prisma Composer. {{runScriptCommand packageManager "dev:composer"}} ``` -This builds the app and starts it with Composer. PostgreSQL projects get a local Prisma Postgres database and apply the contract automatically. +This builds the app and starts it with Composer. PostgreSQL projects get a local Prisma Postgres database and apply the committed migrations automatically. ## Deploy diff --git a/templates/create/astro/package.json.hbs b/templates/create/astro/package.json.hbs index 355ac7c..9e4a1b2 100644 --- a/templates/create/astro/package.json.hbs +++ b/templates/create/astro/package.json.hbs @@ -12,12 +12,12 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.3.3" + "astro": "^7.3.6" }, "devDependencies": { - "@types/node": "^24.3.0", - "tsx": "^4.7.1", - "typescript": "^5.9.3", - "vite": "^8.1.2" + "@types/node": "^26.6.4", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vite": "^8.3.3" } } diff --git a/templates/create/elysia/package.json.hbs b/templates/create/elysia/package.json.hbs index 05d3994..ba63043 100644 --- a/templates/create/elysia/package.json.hbs +++ b/templates/create/elysia/package.json.hbs @@ -6,7 +6,7 @@ {{/if}} "type": "module", "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "tsx watch src/index.ts", @@ -14,11 +14,11 @@ "start": "node dist/server.mjs" }, "dependencies": { - "@sinclair/typebox": "^0.34.48", - "elysia": "^1.4.28", + "@sinclair/typebox": "^0.34.52", + "elysia": "^1.4.30", "openapi-types": "^12.1.3" }, "devDependencies": { - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/templates/create/elysia/src/index.ts.hbs b/templates/create/elysia/src/index.ts.hbs index 2e22f31..aec919c 100644 --- a/templates/create/elysia/src/index.ts.hbs +++ b/templates/create/elysia/src/index.ts.hbs @@ -1,4 +1,4 @@ -import { node } from "@elysiajs/node"; +import { node } from "@elysia/node"; import { Elysia } from "elysia"; import { listUsers } from "./prisma/users"; diff --git a/templates/create/hono/package.json.hbs b/templates/create/hono/package.json.hbs index 27e349a..35ee500 100644 --- a/templates/create/hono/package.json.hbs +++ b/templates/create/hono/package.json.hbs @@ -6,7 +6,7 @@ {{/if}} "type": "module", "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "{{runtimeScript packageManager "dev" "src/index.ts" "dist/src/index.js"}}", @@ -14,11 +14,11 @@ "start": "node dist/server.mjs" }, "dependencies": { - "@hono/node-server": "^1.19.9", - "hono": "^4.12.2" + "@hono/node-server": "^2.1.3", + "hono": "^4.13.13" }, "devDependencies": { - "@types/node": "^20.11.17", - "typescript": "^5.9.3" + "@types/node": "^26.6.4", + "typescript": "^6.0.3" } } diff --git a/templates/create/minimal/package.json.hbs b/templates/create/minimal/package.json.hbs index f99a789..a98f0f4 100644 --- a/templates/create/minimal/package.json.hbs +++ b/templates/create/minimal/package.json.hbs @@ -7,7 +7,7 @@ "type": "module", {{#unless (eq packageManager "deno")}} "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, {{/unless}} "scripts": { diff --git a/templates/create/nest/package.json.hbs b/templates/create/nest/package.json.hbs index 14b90c3..6d23f34 100644 --- a/templates/create/nest/package.json.hbs +++ b/templates/create/nest/package.json.hbs @@ -6,7 +6,7 @@ {{/if}} "type": "module", "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "{{runtimeScript packageManager "dev" "src/main.ts" "dist/main.js"}}", @@ -14,14 +14,14 @@ "start": "node dist/server.mjs" }, "dependencies": { - "@nestjs/common": "^11.1.17", - "@nestjs/core": "^11.1.17", - "@nestjs/platform-express": "^11.1.17", + "@nestjs/common": "^12.1.2", + "@nestjs/core": "^12.1.2", + "@nestjs/platform-express": "^12.1.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2" }, "devDependencies": { - "@types/node": "^25.5.0", - "typescript": "^5.9.3" + "@types/node": "^26.6.4", + "typescript": "^6.0.3" } } diff --git a/templates/create/next/eslint.config.mjs b/templates/create/next/eslint.config.mjs index d838aa6..f149fb4 100644 --- a/templates/create/next/eslint.config.mjs +++ b/templates/create/next/eslint.config.mjs @@ -7,6 +7,7 @@ const eslintConfig = defineConfig([ ...nextTs, globalIgnores([ ".next/**", + ".prisma-composer/**", "out/**", "build/**", "migrations/**", diff --git a/templates/create/next/package.json.hbs b/templates/create/next/package.json.hbs index 2a5336e..93955e9 100644 --- a/templates/create/next/package.json.hbs +++ b/templates/create/next/package.json.hbs @@ -13,17 +13,17 @@ "lint": "eslint" }, "dependencies": { - "next": "16.1.6", - "react": "19.2.3", - "react-dom": "19.2.3" + "next": "16.4.0", + "react": "19.3.0", + "react-dom": "19.3.0" }, "devDependencies": { - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "16.1.6", - "tsx": "^4.7.1", - "typescript": "^5.9.3" + "@types/node": "^26.6.4", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "eslint": "^10.12.0", + "eslint-config-next": "16.4.0", + "tsx": "^4.23.15", + "typescript": "^6.0.3" } } diff --git a/templates/create/nuxt/package.json.hbs b/templates/create/nuxt/package.json.hbs index 9e6080d..e5722b3 100644 --- a/templates/create/nuxt/package.json.hbs +++ b/templates/create/nuxt/package.json.hbs @@ -1,6 +1,9 @@ { "name": "{{projectName}}", "type": "module", + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, "private": true, "version": "0.0.1", {{#if (packageManagerManifestValue packageManager)}} @@ -15,15 +18,15 @@ "typecheck": "nuxt typecheck" }, "dependencies": { - "nuxt": "^4.3.1", - "vue": "^3.5.29", - "vue-router": "^4.6.4" + "nuxt": "^4.6.0", + "vue": "^3.5.43", + "vue-router": "^5.3.1" }, "devDependencies": { - "@types/node": "^24.3.0", - "tsx": "^4.7.1", - "typescript": "^5.9.3", - "vite": "^8.1.2", - "vue-tsc": "^3.3.9" + "@types/node": "^26.6.4", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vite": "^8.3.3", + "vue-tsc": "^3.3.12" } } diff --git a/templates/create/svelte/package.json.hbs b/templates/create/svelte/package.json.hbs index a153eb2..d7b6568 100644 --- a/templates/create/svelte/package.json.hbs +++ b/templates/create/svelte/package.json.hbs @@ -6,6 +6,10 @@ "packageManager": "{{packageManagerManifestValue packageManager}}", {{/if}} "type": "module", + "imports": { + "#lib": "./src/lib/index.ts", + "#lib/*": "./src/lib/*" + }, "scripts": { "dev": "vite dev", "build": "vite build", @@ -15,13 +19,13 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" }, "devDependencies": { - "@sveltejs/kit": "^2.50.2", - "@sveltejs/vite-plugin-svelte": "^7.3.0", - "@types/node": "^24.3.0", - "svelte": "^5.51.0", - "svelte-check": "^4.4.2", - "tsx": "^4.7.1", - "typescript": "^5.9.3", - "vite": "^8.1.2" + "@sveltejs/kit": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^7.3.1", + "@types/node": "^26.6.4", + "svelte": "^5.57.2", + "svelte-check": "^4.7.6", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vite": "^8.3.3" } } diff --git a/templates/create/svelte/src/lib/index.ts b/templates/create/svelte/src/lib/index.ts index 856f2b6..fb54be2 100644 --- a/templates/create/svelte/src/lib/index.ts +++ b/templates/create/svelte/src/lib/index.ts @@ -1 +1 @@ -// place files you want to import through the `$lib` alias in this folder. +// Place files you want to import through the `#lib` alias in this folder. diff --git a/templates/create/svelte/src/routes/+layout.svelte b/templates/create/svelte/src/routes/+layout.svelte index 9cebde5..d7b4b46 100644 --- a/templates/create/svelte/src/routes/+layout.svelte +++ b/templates/create/svelte/src/routes/+layout.svelte @@ -1,5 +1,5 @@ diff --git a/templates/create/svelte/svelte.config.js b/templates/create/svelte/svelte.config.js deleted file mode 100644 index d341d7e..0000000 --- a/templates/create/svelte/svelte.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import adapter from "@sveltejs/adapter-node"; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - adapter: adapter(), - }, -}; - -export default config; diff --git a/templates/create/svelte/tsconfig.json b/templates/create/svelte/tsconfig.json index eca22f6..27e329c 100644 --- a/templates/create/svelte/tsconfig.json +++ b/templates/create/svelte/tsconfig.json @@ -1,5 +1,7 @@ { - "extends": "./.svelte-kit/tsconfig.json", + "extends": "$app/tsconfig", + "include": ["src", "*"], + "exclude": ["src/service-worker"], "compilerOptions": { "rewriteRelativeImportExtensions": true, "allowJs": true, @@ -13,9 +15,4 @@ "moduleResolution": "bundler", "types": ["node"] } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // To make changes to top-level options such as include and exclude, we recommend extending - // the generated config; see https://svelte.dev/docs/kit/configuration#typescript } diff --git a/templates/create/svelte/vite.config.ts b/templates/create/svelte/vite.config.ts index cd00276..0ccdfa1 100644 --- a/templates/create/svelte/vite.config.ts +++ b/templates/create/svelte/vite.config.ts @@ -1,8 +1,9 @@ +import adapter from "@sveltejs/adapter-node"; import { sveltekit } from "@sveltejs/kit/vite"; import { defineConfig } from "vite"; export default defineConfig({ - plugins: [sveltekit()], + plugins: [sveltekit({ adapter: adapter() })], ssr: { noExternal: true, }, diff --git a/templates/create/tanstack-start/package.json.hbs b/templates/create/tanstack-start/package.json.hbs index ac89f40..928ced8 100644 --- a/templates/create/tanstack-start/package.json.hbs +++ b/templates/create/tanstack-start/package.json.hbs @@ -13,20 +13,18 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@tanstack/react-router": "^1.132.0", - "@tanstack/react-start": "^1.132.0", - "react": "^19.2.0", - "react-dom": "^19.2.0" + "@tanstack/react-router": "^1.170.41", + "@tanstack/react-start": "^1.168.60", + "react": "^19.3.0", + "react-dom": "^19.3.0" }, "devDependencies": { - "@tanstack/router-plugin": "^1.132.0", - "@types/node": "^24.3.0", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.2.0", - "tsx": "^4.7.1", - "typescript": "^5.9.3", - "vite": "^8.1.2", - "vite-tsconfig-paths": "^6.1.1" + "@types/node": "^26.6.4", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vite": "^8.3.3" } } diff --git a/templates/create/tanstack-start/tsconfig.json b/templates/create/tanstack-start/tsconfig.json index 0448467..8208f92 100644 --- a/templates/create/tanstack-start/tsconfig.json +++ b/templates/create/tanstack-start/tsconfig.json @@ -12,7 +12,6 @@ "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "baseUrl": ".", "paths": { "@/*": ["./src/*"] }, diff --git a/templates/create/tanstack-start/vite.config.ts b/templates/create/tanstack-start/vite.config.ts index 64f91d4..fe56475 100644 --- a/templates/create/tanstack-start/vite.config.ts +++ b/templates/create/tanstack-start/vite.config.ts @@ -2,13 +2,8 @@ import { defineConfig } from "vite"; import viteReact from "@vitejs/plugin-react"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; import { nitro } from "nitro/vite"; -import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ - plugins: [ - tsconfigPaths({ projects: ["./tsconfig.json"] }), - tanstackStart(), - nitro(), - viteReact(), - ], + resolve: { tsconfigPaths: true }, + plugins: [tanstackStart(), nitro(), viteReact()], }); diff --git a/templates/create/turborepo/apps/server/package.json b/templates/create/turborepo/apps/server/package.json index f603390..4bcfd32 100644 --- a/templates/create/turborepo/apps/server/package.json +++ b/templates/create/turborepo/apps/server/package.json @@ -10,6 +10,6 @@ "typecheck": "tsc --noEmit" }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" } } diff --git a/tests/dependencies.test.ts b/tests/dependencies.test.ts index 3dbaf80..5a6a494 100644 --- a/tests/dependencies.test.ts +++ b/tests/dependencies.test.ts @@ -11,7 +11,7 @@ describe("Prisma 8 dependency versions", () => { expect(getDependencyVersion("prisma")).toBe("8.0.0-rc.21"); expect(getDependencyVersion("alchemy")).toBe("2.0.0-beta.78"); expect(getDependencyVersion("effect")).toBe("4.0.0-rc.115"); - expect(getDependencyVersion("turbo")).toBe("2.10.12"); + expect(getDependencyVersion("turbo")).toBe("2.11.7"); }); test("pins the Prisma CLI to an exact version, not a tag or a range", () => { diff --git a/tests/install.test.ts b/tests/install.test.ts index 15759d4..fcac10a 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -212,10 +212,10 @@ describe("Composer package-manager commands", () => { test("probes the selected package manager once in a generated project manifest", async () => { for (const [manager, args, stdout, packageManager] of [ - ["npm", ["--version"], "11.6.0\n", "npm@11.6.0"], - ["pnpm", ["--version"], "11.0.0-rc.1\n", "pnpm@11.21.0"], - ["yarn", ["--version"], "4.13.0\n", "yarn@4.13.0"], - ["bun", ["--version"], "1.4.1\n", "bun@1.4.1"], + ["npm", ["--version"], "12.2.0\n", "npm@12.2.0"], + ["pnpm", ["--version"], "11.28.5\n", "pnpm@11.28.5"], + ["yarn", ["--version"], "4.18.1\n", "yarn@4.18.1"], + ["bun", ["--version"], "1.4.2\n", "bun@1.4.2"], ["deno", ["-V"], "deno 2.9.4\n", undefined], ] as const) { const { result, probes } = verifyPackageManager(manager, stdout); @@ -355,7 +355,7 @@ describe("generated templates", () => { ); expect(packageJson.dependencies?.["@prisma/dev"]).toBeUndefined(); if (packageManager === "bun") { - expect(packageJson.packageManager).toBe("bun@1.4.1"); + expect(packageJson.packageManager).toBe("bun@1.4.2"); } const prismaSourceRelative = template === "turborepo" ? "packages/database/src" : "src/prisma"; @@ -480,7 +480,7 @@ describe("generated templates", () => { expect(await pathExists(path.join(projectDir, "src/prisma"))).toBe(false); } if (tsdownTemplates.has(template)) { - expect(packageJson.engines?.node).toBe("^22.18.0 || >=24.11.0"); + expect(packageJson.engines?.node).toBe("^22.18.0 || ^24.11.0 || >=26.0.0"); expect(packageJson.scripts?.build).toBe("tsdown"); expect(packageJson.devDependencies).toHaveProperty("tsdown"); expect(packageJson.devDependencies).not.toHaveProperty("esbuild"); From a6a49f7aa6de4a4cbd15d56da3883d1c558c035f Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 21:17:12 +0530 Subject: [PATCH 6/7] test: keep starter TypeScript on version 6 Signed-off-by: Aman Varshney --- src/constants/dependencies.ts | 3 +-- tests/dependencies.test.ts | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index 66bb504..351e09f 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -23,8 +23,7 @@ export const dependencyVersionMap = { // 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.21", - // The ORM runtime's timestamp columns need a global Temporal, which no - // stable Node or Bun ships yet. + // Node 22 needs a global Temporal for the ORM runtime's timestamp columns. "temporal-polyfill": "^1.0.5", tsdown: "^0.23.0", turbo: "2.11.7", diff --git a/tests/dependencies.test.ts b/tests/dependencies.test.ts index 5a6a494..4ed5bd0 100644 --- a/tests/dependencies.test.ts +++ b/tests/dependencies.test.ts @@ -12,6 +12,7 @@ describe("Prisma 8 dependency versions", () => { expect(getDependencyVersion("alchemy")).toBe("2.0.0-beta.78"); expect(getDependencyVersion("effect")).toBe("4.0.0-rc.115"); expect(getDependencyVersion("turbo")).toBe("2.11.7"); + expect(getDependencyVersion("typescript")).toBe("^6.0.3"); }); test("pins the Prisma CLI to an exact version, not a tag or a range", () => { From 547b058abee432cbe8e0b1f141e77686d3a022ed Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Wed, 7 Oct 2026 22:43:36 +0530 Subject: [PATCH 7/7] ci: verify packed CLI on Node 22.22 with strict dependency engines Signed-off-by: Aman Varshney --- .github/workflows/publish.yml | 17 ++++++--- scripts/smoke-node.mjs | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 scripts/smoke-node.mjs diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f0c92d0..93ae736 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -41,7 +41,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: - node-version: "22.18.0" + node-version: "22.22.0" - name: Setup Bun uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 @@ -82,7 +82,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "22.18.0" + node-version: "22.22.0" registry-url: "https://registry.npmjs.org" - name: Compute preview metadata @@ -106,7 +106,7 @@ jobs: - name: Ensure npm version for trusted publishing run: | - npm install -g npm@11.5.1 + npm install -g npm@11.6.0 echo "Node: $(node --version)" echo "npm: $(npm --version)" @@ -148,6 +148,9 @@ jobs: CREATE_PRISMA_TELEMETRY_API_KEY: ${{ steps.preview.outputs.publish_next == 'true' && secrets.CREATE_PRISMA_TELEMETRY_API_KEY || '' }} CREATE_PRISMA_TELEMETRY_HOST: ${{ steps.preview.outputs.publish_next == 'true' && vars.CREATE_PRISMA_TELEMETRY_HOST || '' }} + - name: Test packed CLI on the minimum Node version + run: node scripts/smoke-node.mjs + - name: Publish to npm run: npm publish --access public --tag "${{ steps.preview.outputs.dist_tag }}" @@ -248,7 +251,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "22.18.0" + node-version: "22.22.0" registry-url: "https://registry.npmjs.org" - name: Extract version from commit message @@ -288,7 +291,7 @@ jobs: - name: Ensure npm version for trusted publishing if: steps.check-version.outputs.exists == 'false' run: | - npm install -g npm@11.5.1 + npm install -g npm@11.6.0 echo "Node: $(node --version)" echo "npm: $(npm --version)" @@ -322,6 +325,10 @@ jobs: if: steps.check-version.outputs.exists == 'false' run: bun run build + - name: Test packed CLI on the minimum Node version + if: steps.check-version.outputs.exists == 'false' + run: node scripts/smoke-node.mjs + - name: Publish to npm if: steps.check-version.outputs.exists == 'false' run: npm publish --access public diff --git a/scripts/smoke-node.mjs b/scripts/smoke-node.mjs new file mode 100644 index 0000000..ccecbad --- /dev/null +++ b/scripts/smoke-node.mjs @@ -0,0 +1,66 @@ +import { execa } from "execa"; +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import path from "node:path"; + +const directory = await mkdtemp(path.join(tmpdir(), "create-prisma-node-smoke-")); +const env = { + DO_NOT_TRACK: "1", + CREATE_PRISMA_DISABLE_TELEMETRY: "1", + PRISMA_NEXT_DISABLE_TELEMETRY: "1", + NO_UPDATE_NOTIFIER: "1", + npm_config_engine_strict: "true", +}; + +try { + const packed = await execa("npm", [ + "pack", + "--ignore-scripts", + "--pack-destination", + directory, + "--json", + ]); + const [{ filename }] = JSON.parse(packed.stdout); + await execa( + "npm", + [ + "install", + "--prefix", + directory, + path.join(directory, filename), + "--ignore-scripts", + "--no-audit", + "--no-fund", + ], + { env, stdout: "inherit", stderr: "inherit" }, + ); + const created = await execa( + process.execPath, + [ + path.join(directory, "node_modules/create-prisma/dist/cli.mjs"), + "app", + "--template", + "minimal", + "--provider", + "postgres", + "--authoring", + "psl", + "--package-manager", + "npm", + "--skills", + "none", + "--no-deploy", + "--json", + ], + { cwd: directory, env }, + ); + if (!JSON.parse(created.stdout).ok) throw new Error("Packed CLI did not scaffold successfully"); + const options = { cwd: path.join(directory, "app"), env, stdout: "inherit", stderr: "inherit" }; + await execa("npm", ["run", "build"], options); + await execa("npm", ["exec", "--", "tsc", "--noEmit"], options); + console.log( + `Packed CLI, dependency engines, scaffold, build and typecheck passed on Node ${process.versions.node}.`, + ); +} finally { + await rm(directory, { recursive: true, force: true }); +}