From d5f4e5cc72f99ac6dc5d9b8ceccd07dc1b2cdf03 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 4 Apr 2026 00:03:53 +0100 Subject: [PATCH] fix: patch changesets to fix pre-release peer dep major escalation Patches @changesets/assemble-release-plan to pass includePrerelease to semver.satisfies() when in pre-release mode. Without this, pre-release versions like 1.6.0-beta.0 are incorrectly considered out of range for ^1.5.6, causing all peer dependents to escalate to major versions. This is a known upstream bug (changesets/changesets#960, open since 2022). The patch is applied automatically by pnpm install. --- .../@changesets__assemble-release-plan.patch | 44 +++++++++++++++++++ pnpm-lock.yaml | 11 +++-- pnpm-workspace.yaml | 3 ++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 patches/@changesets__assemble-release-plan.patch diff --git a/patches/@changesets__assemble-release-plan.patch b/patches/@changesets__assemble-release-plan.patch new file mode 100644 index 0000000000..7b8f2a56da --- /dev/null +++ b/patches/@changesets__assemble-release-plan.patch @@ -0,0 +1,44 @@ +diff --git a/dist/changesets-assemble-release-plan.cjs.js b/dist/changesets-assemble-release-plan.cjs.js +index e07ba6e793021b6cfdec898afca517e293386ddb..c3c7c78be51bbc4bf25da83d634f8899afc68bf9 100644 +--- a/dist/changesets-assemble-release-plan.cjs.js ++++ b/dist/changesets-assemble-release-plan.cjs.js +@@ -216,7 +216,7 @@ function determineDependents({ + onlyUpdatePeerDependentsWhenOutOfRange: config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.onlyUpdatePeerDependentsWhenOutOfRange + })) { + type = "major"; +- } else if ((!releases.has(dependent) || releases.get(dependent).type === "none") && (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents === "always" || !semverSatisfies__default["default"](incrementVersion(nextRelease, preInfo), versionRange))) { ++ } else if ((!releases.has(dependent) || releases.get(dependent).type === "none") && (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents === "always" || !semverSatisfies__default["default"](incrementVersion(nextRelease, preInfo), versionRange, preInfo ? { includePrerelease: true } : undefined))) { + switch (depType) { + case "dependencies": + case "optionalDependencies": +@@ -321,7 +321,7 @@ function shouldBumpMajor({ + return depType === "peerDependencies" && nextRelease.type !== "none" && nextRelease.type !== "patch" && ( + // 1. If onlyUpdatePeerDependentsWhenOutOfRange set to true, bump major if the version is leaving the range. + // 2. If onlyUpdatePeerDependentsWhenOutOfRange set to false, bump major regardless whether or not the version is leaving the range. +- !onlyUpdatePeerDependentsWhenOutOfRange || !semverSatisfies__default["default"](incrementVersion(nextRelease, preInfo), versionRange)) && ( ++ !onlyUpdatePeerDependentsWhenOutOfRange || !semverSatisfies__default["default"](incrementVersion(nextRelease, preInfo), versionRange, preInfo ? { includePrerelease: true } : undefined)) && ( + // bump major only if the dependent doesn't already has a major release. + !releases.has(dependent) || releases.has(dependent) && releases.get(dependent).type !== "major"); + } +diff --git a/dist/changesets-assemble-release-plan.esm.js b/dist/changesets-assemble-release-plan.esm.js +index ea2be567403c4ef94a65f3218ccb683cf5cb4bc1..0994493ff553b1ed856cb54a0db1648f56d550bc 100644 +--- a/dist/changesets-assemble-release-plan.esm.js ++++ b/dist/changesets-assemble-release-plan.esm.js +@@ -205,7 +205,7 @@ function determineDependents({ + onlyUpdatePeerDependentsWhenOutOfRange: config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.onlyUpdatePeerDependentsWhenOutOfRange + })) { + type = "major"; +- } else if ((!releases.has(dependent) || releases.get(dependent).type === "none") && (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents === "always" || !semverSatisfies(incrementVersion(nextRelease, preInfo), versionRange))) { ++ } else if ((!releases.has(dependent) || releases.get(dependent).type === "none") && (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents === "always" || !semverSatisfies(incrementVersion(nextRelease, preInfo), versionRange, preInfo ? { includePrerelease: true } : undefined))) { + switch (depType) { + case "dependencies": + case "optionalDependencies": +@@ -310,7 +310,7 @@ function shouldBumpMajor({ + return depType === "peerDependencies" && nextRelease.type !== "none" && nextRelease.type !== "patch" && ( + // 1. If onlyUpdatePeerDependentsWhenOutOfRange set to true, bump major if the version is leaving the range. + // 2. If onlyUpdatePeerDependentsWhenOutOfRange set to false, bump major regardless whether or not the version is leaving the range. +- !onlyUpdatePeerDependentsWhenOutOfRange || !semverSatisfies(incrementVersion(nextRelease, preInfo), versionRange)) && ( ++ !onlyUpdatePeerDependentsWhenOutOfRange || !semverSatisfies(incrementVersion(nextRelease, preInfo), versionRange, preInfo ? { includePrerelease: true } : undefined)) && ( + // bump major only if the dependent doesn't already has a major release. + !releases.has(dependent) || releases.has(dependent) && releases.get(dependent).type !== "major"); + } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36e0530ae5..8c2c6eaa77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,11 @@ catalogs: overrides: axios: <1.14.0 +patchedDependencies: + '@changesets/assemble-release-plan': + hash: 0599486e3d3f68b6f30d0f55a524ccac93e7fe24b273f0f5691b59685498605f + path: patches/@changesets__assemble-release-plan.patch + importers: .: @@ -16045,7 +16050,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.4 - '@changesets/assemble-release-plan@6.0.9': + '@changesets/assemble-release-plan@6.0.9(patch_hash=0599486e3d3f68b6f30d0f55a524ccac93e7fe24b273f0f5691b59685498605f)': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -16069,7 +16074,7 @@ snapshots: '@changesets/cli@2.30.0(@types/node@25.3.2)': dependencies: '@changesets/apply-release-plan': 7.1.0 - '@changesets/assemble-release-plan': 6.0.9 + '@changesets/assemble-release-plan': 6.0.9(patch_hash=0599486e3d3f68b6f30d0f55a524ccac93e7fe24b273f0f5691b59685498605f) '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.3 '@changesets/errors': 0.2.0 @@ -16128,7 +16133,7 @@ snapshots: '@changesets/get-release-plan@4.0.15': dependencies: - '@changesets/assemble-release-plan': 6.0.9 + '@changesets/assemble-release-plan': 6.0.9(patch_hash=0599486e3d3f68b6f30d0f55a524ccac93e7fe24b273f0f5691b59685498605f) '@changesets/config': 3.1.3 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8bdc53c809..11826d3254 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -54,6 +54,9 @@ onlyBuiltDependencies: overrides: axios: <1.14.0 +patchedDependencies: + '@changesets/assemble-release-plan': patches/@changesets__assemble-release-plan.patch + trustPolicy: no-downgrade trustPolicyIgnoreAfter: 43200