From 3804c23d653982d0256bd92a8a36a5079f4cf7f2 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Tue, 29 Sep 2026 13:48:42 +0200 Subject: [PATCH] fix: pin the whole @effect family, not just effect @effect/platform-node depends on @effect/platform-node-shared with a caret prerelease range, so fresh installs since Effect's 4.0.0-rc.118 (2026-09-28) get platform-node-shared rc.118, which imports effect/process/ChildProcess that the pinned effect rc.115 lacks. Alchemy reports it as "could not load the required peer dependency @effect/platform-node" and every deploy fails. Pin effect and its @effect/* siblings together for pnpm, npm/bun/deno and yarn. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Kristof Siket --- src/constants/dependencies.ts | 13 ++++++++++++ src/tasks/install.ts | 6 ++++-- .../_package-manager/pnpm-workspace.yaml.hbs | 6 ++++++ tests/install.test.ts | 20 +++++++++++++++---- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts index 2be05af..b383f5c 100644 --- a/src/constants/dependencies.ts +++ b/src/constants/dependencies.ts @@ -32,6 +32,19 @@ export const dependencyVersionMap = { typescript: "^5.9.3", } as const; +// Pinned to the effect version as a set: @effect/* siblings depend on each other with +// caret prerelease ranges, so a newer rc (e.g. platform-node-shared rc.118) floats in and +// imports effect modules the pinned effect lacks. +export const effectPackages = [ + "effect", + "@effect/platform-bun", + "@effect/platform-node", + "@effect/platform-node-shared", + "@effect/sql-d1", + "@effect/sql-sqlite-do", + "@effect/vitest", +] as const; + export const PRISMA_PLATFORM_CLI_PACKAGE = `prisma@${dependencyVersionMap.prisma}`; // Deno runs the same consolidated CLI. The former `prisma-next` fallback is // frozen and cannot emit against the current ORM releases. diff --git a/src/tasks/install.ts b/src/tasks/install.ts index 0165f72..233010a 100644 --- a/src/tasks/install.ts +++ b/src/tasks/install.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { dependencyVersionMap, + effectPackages, getCreateTemplateDependencies, getDependencyVersion, PRISMA_DENO_CLI_PACKAGE, @@ -235,10 +236,11 @@ export const writeCreateTemplateDependenciesEffect = Effect.fn("Dependencies.wri const effectVersion = getDependencyVersion("effect"); if (!effectVersion) return yield* Effect.fail(new Error("Dependency effect is missing from the version map.")); + const effectPins = Object.fromEntries(effectPackages.map((name) => [name, effectVersion])); if (opts.packageManager === "yarn") { - packageJson.resolutions = { ...packageJson.resolutions, effect: effectVersion }; + packageJson.resolutions = { ...packageJson.resolutions, ...effectPins }; } else if (opts.packageManager !== "pnpm") { - packageJson.overrides = { ...packageJson.overrides, effect: effectVersion }; + packageJson.overrides = { ...packageJson.overrides, ...effectPins }; } yield* writePackageJson(packageJsonPath, packageJson); }, diff --git a/templates/create/_package-manager/pnpm-workspace.yaml.hbs b/templates/create/_package-manager/pnpm-workspace.yaml.hbs index 9f3ab37..39443e5 100644 --- a/templates/create/_package-manager/pnpm-workspace.yaml.hbs +++ b/templates/create/_package-manager/pnpm-workspace.yaml.hbs @@ -18,6 +18,12 @@ minimumReleaseAgeExclude: - "@prisma/*" overrides: effect: "4.0.0-rc.115" + "@effect/platform-bun": "4.0.0-rc.115" + "@effect/platform-node": "4.0.0-rc.115" + "@effect/platform-node-shared": "4.0.0-rc.115" + "@effect/sql-d1": "4.0.0-rc.115" + "@effect/sql-sqlite-do": "4.0.0-rc.115" + "@effect/vitest": "4.0.0-rc.115" {{#if (eq provider "mongo")}} peerDependencyRules: allowedVersions: diff --git a/tests/install.test.ts b/tests/install.test.ts index 9729cbb..84014d9 100644 --- a/tests/install.test.ts +++ b/tests/install.test.ts @@ -5,7 +5,11 @@ import { access, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import path from "node:path"; -import { dependencyVersionMap, PRISMA_DENO_CLI_PACKAGE } from "../src/constants/dependencies"; +import { + dependencyVersionMap, + effectPackages, + PRISMA_DENO_CLI_PACKAGE, +} from "../src/constants/dependencies"; import { applicationRuntime } from "../src/runtime"; import { CommandExecutionError, @@ -33,6 +37,10 @@ import { verifyPackageManagerEffect, } from "../src/utils/package-manager"; +const effectPins = Object.fromEntries( + effectPackages.map((name) => [name, dependencyVersionMap.effect]), +); + type PackageJson = { name?: string; workspaces?: string[]; @@ -576,7 +584,11 @@ describe("generated templates", () => { "minimumReleaseAgeExclude:", ' - "@prisma/*"', "overrides:", - ` effect: "${dependencyVersionMap.effect}"`, + ...effectPackages.map((name) => + name === "effect" + ? ` effect: "${dependencyVersionMap.effect}"` + : ` "${name}": "${dependencyVersionMap.effect}"`, + ), ...(provider === "mongo" ? ["peerDependencyRules:", " allowedVersions:", ' "alchemy>mongodb": "7"'] : []), @@ -584,10 +596,10 @@ describe("generated templates", () => { ].join("\n"), ); } else if (packageManager === "yarn") { - expect(packageJson.resolutions?.effect).toBe(dependencyVersionMap.effect); + expect(packageJson.resolutions).toEqual(effectPins); } else { expect(packageJson.overrides).toEqual({ - effect: dependencyVersionMap.effect, + ...effectPins, ...(provider === "mongo" && packageManager === "npm" ? { alchemy: { mongodb: dependencyVersionMap.mongodb } } : {}),