From 320558f8a21c992fb66e30b9e93f1a495c5075e3 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Wed, 29 Jun 2022 12:17:31 +0300 Subject: [PATCH 1/4] bugfix: ignore ranges when snapshot versioning is performed (use exact version) --- .changeset/stupid-jars-rest.md | 5 ++ packages/apply-release-plan/src/index.test.ts | 57 ++++++++++++++++++- packages/apply-release-plan/src/index.ts | 21 ++++--- .../apply-release-plan/src/version-package.ts | 5 +- 4 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 .changeset/stupid-jars-rest.md diff --git a/.changeset/stupid-jars-rest.md b/.changeset/stupid-jars-rest.md new file mode 100644 index 000000000..7ed4fc675 --- /dev/null +++ b/.changeset/stupid-jars-rest.md @@ -0,0 +1,5 @@ +--- +"@changesets/apply-release-plan": patch +--- + +bugfix: ignore ranges when snapshot versioning is performed (use exact version) diff --git a/packages/apply-release-plan/src/index.test.ts b/packages/apply-release-plan/src/index.test.ts index 27572fd82..cdc0a2b85 100644 --- a/packages/apply-release-plan/src/index.test.ts +++ b/packages/apply-release-plan/src/index.test.ts @@ -74,7 +74,11 @@ async function testSetup( fixtureName: string, releasePlan: ReleasePlan, config?: Config, - setupFunc?: (tempDir: string) => Promise + setupFunc?: (tempDir: string) => Promise, + snapshotConfig?: { + snapshot: string | undefined; + useCalculatedVersionForSnapshots: boolean; + } ) { if (!config) { config = { @@ -89,7 +93,8 @@ async function testSetup( ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { onlyUpdatePeerDependentsWhenOutOfRange: false, updateInternalDependents: "out-of-range", - useCalculatedVersionForSnapshots: false + useCalculatedVersionForSnapshots: + snapshotConfig?.useCalculatedVersionForSnapshots ?? false } }; } @@ -108,7 +113,8 @@ async function testSetup( changedFiles: await applyReleasePlan( releasePlan, await getPackages(tempDir), - config + config, + snapshotConfig?.snapshot ), tempDir }; @@ -653,6 +659,51 @@ describe("apply release plan", () => { version: "1.0.0" }); }); + it("should use exact versioning when snapshot release is applied, and ignore any range modifiers", async () => { + const releasePlan = new FakeReleasePlan( + [ + { + id: "some-id", + releases: [{ name: "pkg-b", type: "minor" }], + summary: "a very useful summary" + } + ], + [ + { + changesets: ["some-id"], + name: "pkg-b", + newVersion: "1.1.0", + oldVersion: "1.0.0", + type: "minor" + } + ] + ); + let { changedFiles } = await testSetup( + "simple-project-caret-dep", + releasePlan.getReleasePlan(), + releasePlan.config, + undefined, + { + snapshot: "canary", + useCalculatedVersionForSnapshots: false + } + ); + + let pkgPath = changedFiles.find(a => + a.endsWith(`pkg-a${path.sep}package.json`) + ); + + if (!pkgPath) throw new Error(`could not find an updated package json`); + let pkgJSON = await fs.readJSON(pkgPath); + + expect(pkgJSON).toMatchObject({ + name: "pkg-a", + version: "1.1.0", + dependencies: { + "pkg-b": "1.1.0" + } + }); + }); describe("internal dependency bumping", () => { describe("updateInternalDependencies set to patch", () => { diff --git a/packages/apply-release-plan/src/index.ts b/packages/apply-release-plan/src/index.ts index dedd6e7e2..faac70e34 100644 --- a/packages/apply-release-plan/src/index.ts +++ b/packages/apply-release-plan/src/index.ts @@ -111,14 +111,19 @@ export default async function applyReleasePlan( // iterate over releases updating packages let finalisedRelease = releaseWithChangelogs.map(release => { - return versionPackage(release, versionsToUpdate, { - updateInternalDependencies: config.updateInternalDependencies, - onlyUpdatePeerDependentsWhenOutOfRange: - config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH - .onlyUpdatePeerDependentsWhenOutOfRange, - bumpVersionsWithWorkspaceProtocolOnly: - config.bumpVersionsWithWorkspaceProtocolOnly - }); + return versionPackage( + release, + versionsToUpdate, + { + updateInternalDependencies: config.updateInternalDependencies, + onlyUpdatePeerDependentsWhenOutOfRange: + config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH + .onlyUpdatePeerDependentsWhenOutOfRange, + bumpVersionsWithWorkspaceProtocolOnly: + config.bumpVersionsWithWorkspaceProtocolOnly + }, + snapshot + ); }); let prettierConfig = await prettier.resolveConfig(cwd); diff --git a/packages/apply-release-plan/src/version-package.ts b/packages/apply-release-plan/src/version-package.ts index 6909ebb5e..94a199095 100644 --- a/packages/apply-release-plan/src/version-package.ts +++ b/packages/apply-release-plan/src/version-package.ts @@ -29,7 +29,8 @@ export default function versionPackage( updateInternalDependencies: "patch" | "minor"; onlyUpdatePeerDependentsWhenOutOfRange: boolean; bumpVersionsWithWorkspaceProtocolOnly?: boolean; - } + }, + snapshot?: string | boolean | undefined ) { let { newVersion, packageJson } = release; @@ -92,7 +93,7 @@ export default function versionPackage( semver.prerelease(version) !== null ) { let rangeType = getVersionRangeType(depCurrentVersion); - let newNewRange = `${rangeType}${version}`; + let newNewRange = snapshot ? version : `${rangeType}${version}`; if (usesWorkspaceRange) newNewRange = `workspace:${newNewRange}`; deps[name] = newNewRange; } From cc7807227a357c13c27830eeaccd4522a64b78ac Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Wed, 29 Jun 2022 12:30:43 +0300 Subject: [PATCH 2/4] cleanup --- packages/apply-release-plan/src/version-package.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/apply-release-plan/src/version-package.ts b/packages/apply-release-plan/src/version-package.ts index 94a199095..8eece9dc8 100644 --- a/packages/apply-release-plan/src/version-package.ts +++ b/packages/apply-release-plan/src/version-package.ts @@ -92,8 +92,9 @@ export default function versionPackage( // leaving those as is would leave the package in a non-installable state (wrong dep versions would get installed) semver.prerelease(version) !== null ) { - let rangeType = getVersionRangeType(depCurrentVersion); - let newNewRange = snapshot ? version : `${rangeType}${version}`; + let newNewRange = snapshot + ? version + : `${getVersionRangeType(depCurrentVersion)}${version}`; if (usesWorkspaceRange) newNewRange = `workspace:${newNewRange}`; deps[name] = newNewRange; } From 08574886a542cdffd7818f8ba23bde31c3490af7 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Thu, 30 Jun 2022 17:31:50 +0300 Subject: [PATCH 3/4] fixes --- packages/apply-release-plan/src/index.test.ts | 23 ++++++++----------- packages/apply-release-plan/src/index.ts | 20 +++++++--------- .../apply-release-plan/src/version-package.ts | 7 +++--- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/packages/apply-release-plan/src/index.test.ts b/packages/apply-release-plan/src/index.test.ts index cdc0a2b85..af36aa2d1 100644 --- a/packages/apply-release-plan/src/index.test.ts +++ b/packages/apply-release-plan/src/index.test.ts @@ -74,11 +74,8 @@ async function testSetup( fixtureName: string, releasePlan: ReleasePlan, config?: Config, - setupFunc?: (tempDir: string) => Promise, - snapshotConfig?: { - snapshot: string | undefined; - useCalculatedVersionForSnapshots: boolean; - } + snapshot?: string | undefined, + setupFunc?: (tempDir: string) => Promise ) { if (!config) { config = { @@ -93,8 +90,7 @@ async function testSetup( ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { onlyUpdatePeerDependentsWhenOutOfRange: false, updateInternalDependents: "out-of-range", - useCalculatedVersionForSnapshots: - snapshotConfig?.useCalculatedVersionForSnapshots ?? false + useCalculatedVersionForSnapshots: false } }; } @@ -114,7 +110,7 @@ async function testSetup( releasePlan, await getPackages(tempDir), config, - snapshotConfig?.snapshot + snapshot ), tempDir }; @@ -682,11 +678,7 @@ describe("apply release plan", () => { "simple-project-caret-dep", releasePlan.getReleasePlan(), releasePlan.config, - undefined, - { - snapshot: "canary", - useCalculatedVersionForSnapshots: false - } + "canary" ); let pkgPath = changedFiles.find(a => @@ -2139,6 +2131,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), releasePlan.config, + undefined, setupFunc ); @@ -2165,6 +2158,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), { ...releasePlan.config, ignore: ["pkg-a"] }, + undefined, setupFunc ); @@ -2207,6 +2201,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), releasePlan.config, + undefined, setupFunc ); @@ -2263,6 +2258,7 @@ describe("apply release plan", () => { null ] }, + undefined, setupFunc ); @@ -2345,6 +2341,7 @@ describe("apply release plan", () => { null ] }, + undefined, setupFunc ); diff --git a/packages/apply-release-plan/src/index.ts b/packages/apply-release-plan/src/index.ts index faac70e34..5e5709629 100644 --- a/packages/apply-release-plan/src/index.ts +++ b/packages/apply-release-plan/src/index.ts @@ -111,19 +111,15 @@ export default async function applyReleasePlan( // iterate over releases updating packages let finalisedRelease = releaseWithChangelogs.map(release => { - return versionPackage( - release, - versionsToUpdate, - { - updateInternalDependencies: config.updateInternalDependencies, - onlyUpdatePeerDependentsWhenOutOfRange: - config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH - .onlyUpdatePeerDependentsWhenOutOfRange, - bumpVersionsWithWorkspaceProtocolOnly: - config.bumpVersionsWithWorkspaceProtocolOnly - }, + return versionPackage(release, versionsToUpdate, { + updateInternalDependencies: config.updateInternalDependencies, + onlyUpdatePeerDependentsWhenOutOfRange: + config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH + .onlyUpdatePeerDependentsWhenOutOfRange, + bumpVersionsWithWorkspaceProtocolOnly: + config.bumpVersionsWithWorkspaceProtocolOnly, snapshot - ); + }); }); let prettierConfig = await prettier.resolveConfig(cwd); diff --git a/packages/apply-release-plan/src/version-package.ts b/packages/apply-release-plan/src/version-package.ts index 8eece9dc8..14cff8101 100644 --- a/packages/apply-release-plan/src/version-package.ts +++ b/packages/apply-release-plan/src/version-package.ts @@ -24,13 +24,14 @@ export default function versionPackage( { updateInternalDependencies, onlyUpdatePeerDependentsWhenOutOfRange, - bumpVersionsWithWorkspaceProtocolOnly + bumpVersionsWithWorkspaceProtocolOnly, + snapshot }: { updateInternalDependencies: "patch" | "minor"; onlyUpdatePeerDependentsWhenOutOfRange: boolean; bumpVersionsWithWorkspaceProtocolOnly?: boolean; - }, - snapshot?: string | boolean | undefined + snapshot?: string | boolean | undefined; + } ) { let { newVersion, packageJson } = release; From 0b15dd4e4f26206c3ffa2f1d43ee72eb20f442b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 4 Jul 2022 14:40:01 +0200 Subject: [PATCH 4/4] Apply suggestions from code review --- .changeset/stupid-jars-rest.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/stupid-jars-rest.md b/.changeset/stupid-jars-rest.md index 7ed4fc675..c68d32fa7 100644 --- a/.changeset/stupid-jars-rest.md +++ b/.changeset/stupid-jars-rest.md @@ -1,5 +1,6 @@ --- +"@changesets/cli": patch "@changesets/apply-release-plan": patch --- -bugfix: ignore ranges when snapshot versioning is performed (use exact version) +Fixed an issue with dependency ranges still using pre-existing range modifiers instead of fixed package versions when performing a snapshot release. This ensures that installs of snapshot versions are always reproducible.