From 7febb599167234ae071b5d223b80cbc8a9375709 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Mon, 4 Jul 2022 15:40:27 +0300 Subject: [PATCH] Ignore ranges when snapshot versioning is performed (use exact versions) (#857) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bugfix: ignore ranges when snapshot versioning is performed (use exact version) * cleanup * fixes * Apply suggestions from code review Co-authored-by: Mateusz BurzyƄski --- .changeset/stupid-jars-rest.md | 6 +++ packages/apply-release-plan/src/index.test.ts | 50 ++++++++++++++++++- packages/apply-release-plan/src/index.ts | 3 +- .../apply-release-plan/src/version-package.ts | 9 ++-- 4 files changed, 63 insertions(+), 5 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..c68d32fa7 --- /dev/null +++ b/.changeset/stupid-jars-rest.md @@ -0,0 +1,6 @@ +--- +"@changesets/cli": patch +"@changesets/apply-release-plan": patch +--- + +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. diff --git a/packages/apply-release-plan/src/index.test.ts b/packages/apply-release-plan/src/index.test.ts index 27572fd82..af36aa2d1 100644 --- a/packages/apply-release-plan/src/index.test.ts +++ b/packages/apply-release-plan/src/index.test.ts @@ -74,6 +74,7 @@ async function testSetup( fixtureName: string, releasePlan: ReleasePlan, config?: Config, + snapshot?: string | undefined, setupFunc?: (tempDir: string) => Promise ) { if (!config) { @@ -108,7 +109,8 @@ async function testSetup( changedFiles: await applyReleasePlan( releasePlan, await getPackages(tempDir), - config + config, + snapshot ), tempDir }; @@ -653,6 +655,47 @@ 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, + "canary" + ); + + 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", () => { @@ -2088,6 +2131,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), releasePlan.config, + undefined, setupFunc ); @@ -2114,6 +2158,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), { ...releasePlan.config, ignore: ["pkg-a"] }, + undefined, setupFunc ); @@ -2156,6 +2201,7 @@ describe("apply release plan", () => { "simple-project", releasePlan.getReleasePlan(), releasePlan.config, + undefined, setupFunc ); @@ -2212,6 +2258,7 @@ describe("apply release plan", () => { null ] }, + undefined, setupFunc ); @@ -2294,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 dedd6e7e2..5e5709629 100644 --- a/packages/apply-release-plan/src/index.ts +++ b/packages/apply-release-plan/src/index.ts @@ -117,7 +117,8 @@ export default async function applyReleasePlan( config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH .onlyUpdatePeerDependentsWhenOutOfRange, bumpVersionsWithWorkspaceProtocolOnly: - config.bumpVersionsWithWorkspaceProtocolOnly + config.bumpVersionsWithWorkspaceProtocolOnly, + snapshot }); }); diff --git a/packages/apply-release-plan/src/version-package.ts b/packages/apply-release-plan/src/version-package.ts index 6909ebb5e..14cff8101 100644 --- a/packages/apply-release-plan/src/version-package.ts +++ b/packages/apply-release-plan/src/version-package.ts @@ -24,11 +24,13 @@ export default function versionPackage( { updateInternalDependencies, onlyUpdatePeerDependentsWhenOutOfRange, - bumpVersionsWithWorkspaceProtocolOnly + bumpVersionsWithWorkspaceProtocolOnly, + snapshot }: { updateInternalDependencies: "patch" | "minor"; onlyUpdatePeerDependentsWhenOutOfRange: boolean; bumpVersionsWithWorkspaceProtocolOnly?: boolean; + snapshot?: string | boolean | undefined; } ) { let { newVersion, packageJson } = release; @@ -91,8 +93,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 = `${rangeType}${version}`; + let newNewRange = snapshot + ? version + : `${getVersionRangeType(depCurrentVersion)}${version}`; if (usesWorkspaceRange) newNewRange = `workspace:${newNewRange}`; deps[name] = newNewRange; }