From 2fad25dd3be94b032959b4a1009d54416a6e7083 Mon Sep 17 00:00:00 2001 From: Ben Scott Date: Sat, 17 Sep 2022 13:58:26 -0700 Subject: [PATCH 1/9] Add tests to showcase buggy behaviour Test that when `updateInternalDependents:'always'` is set then transitive dependencies of devDependencies should not be part of the release plan. --- .../.changeset/README.md | 3 ++ .../package.json | 11 ++++ .../packages/pkg-a/package.json | 4 ++ .../packages/pkg-b/package.json | 5 ++ .../packages/pkg-c/package.json | 5 ++ .../assemble-release-plan/src/index.test.ts | 25 +++++++++ .../cli/src/commands/version/version.test.ts | 53 +++++++++++++++++++ 7 files changed, 106 insertions(+) create mode 100644 __fixtures__/simplest-transitive-devdependent/.changeset/README.md create mode 100644 __fixtures__/simplest-transitive-devdependent/package.json create mode 100644 __fixtures__/simplest-transitive-devdependent/packages/pkg-a/package.json create mode 100644 __fixtures__/simplest-transitive-devdependent/packages/pkg-b/package.json create mode 100644 __fixtures__/simplest-transitive-devdependent/packages/pkg-c/package.json diff --git a/__fixtures__/simplest-transitive-devdependent/.changeset/README.md b/__fixtures__/simplest-transitive-devdependent/.changeset/README.md new file mode 100644 index 000000000..fd188f505 --- /dev/null +++ b/__fixtures__/simplest-transitive-devdependent/.changeset/README.md @@ -0,0 +1,3 @@ +# We just want a file in here so git collects it + +For this we have deliberately not included a config file, as we want to test the defaults \ No newline at end of file diff --git a/__fixtures__/simplest-transitive-devdependent/package.json b/__fixtures__/simplest-transitive-devdependent/package.json new file mode 100644 index 000000000..2e742d825 --- /dev/null +++ b/__fixtures__/simplest-transitive-devdependent/package.json @@ -0,0 +1,11 @@ +{ + "private": true, + "name": "simple-project", + "description": "three projects, each depending on one other", + "version": "1.0.0", + "bolt": { + "workspaces": [ + "packages/*" + ] + } +} diff --git a/__fixtures__/simplest-transitive-devdependent/packages/pkg-a/package.json b/__fixtures__/simplest-transitive-devdependent/packages/pkg-a/package.json new file mode 100644 index 000000000..ee09b194d --- /dev/null +++ b/__fixtures__/simplest-transitive-devdependent/packages/pkg-a/package.json @@ -0,0 +1,4 @@ +{ + "name": "pkg-a", + "version": "1.0.0" +} diff --git a/__fixtures__/simplest-transitive-devdependent/packages/pkg-b/package.json b/__fixtures__/simplest-transitive-devdependent/packages/pkg-b/package.json new file mode 100644 index 000000000..35ff69741 --- /dev/null +++ b/__fixtures__/simplest-transitive-devdependent/packages/pkg-b/package.json @@ -0,0 +1,5 @@ +{ + "name": "pkg-b", + "version": "1.0.0", + "devDependencies": { "pkg-a": "1.0.0" } +} diff --git a/__fixtures__/simplest-transitive-devdependent/packages/pkg-c/package.json b/__fixtures__/simplest-transitive-devdependent/packages/pkg-c/package.json new file mode 100644 index 000000000..09756a7d5 --- /dev/null +++ b/__fixtures__/simplest-transitive-devdependent/packages/pkg-c/package.json @@ -0,0 +1,5 @@ +{ + "name": "pkg-c", + "version": "1.0.0", + "dependencies": { "pkg-b": "1.0.0" } +} diff --git a/packages/assemble-release-plan/src/index.test.ts b/packages/assemble-release-plan/src/index.test.ts index 7fbc6c7b3..7a80cf338 100644 --- a/packages/assemble-release-plan/src/index.test.ts +++ b/packages/assemble-release-plan/src/index.test.ts @@ -1387,6 +1387,31 @@ describe("bumping peerDeps", () => { expect(releases[2].name).toEqual("pkg-c"); expect(releases[2].newVersion).toEqual("1.0.1"); }); + + it("should not bump a transitive dependent when a devDependency package gets bumped", () => { + setup.addPackage("pkg-c", "1.0.0"); + setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0"); + setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + { + ...defaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }, + undefined + ); + + expect(releases.length).toBe(2); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-b"); + expect(releases[1].newVersion).toEqual("1.0.0"); + }); }); it("should major bump dependent when leaving range", () => { diff --git a/packages/cli/src/commands/version/version.test.ts b/packages/cli/src/commands/version/version.test.ts index 21ab085cd..f9659b018 100644 --- a/packages/cli/src/commands/version/version.test.ts +++ b/packages/cli/src/commands/version/version.test.ts @@ -1066,6 +1066,59 @@ describe("updateInternalDependents: always", () => { " `); }); + + it("should not bump a devDependency or any of its dependants when a dependency package gets bumped", async () => { + const cwd = await f.copy("simplest-transitive-devdependent"); + const spy = jest.spyOn(fs, "writeFile"); + await writeChangeset(simpleChangeset, cwd); + await version(cwd, defaultOptions, { + ...modifiedDefaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }); + + expect(getPkgJSON("pkg-a", spy.mock.calls)).toEqual( + expect.objectContaining({ + name: "pkg-a", + version: "1.1.0", + }) + ); + expect(getPkgJSON("pkg-b", spy.mock.calls)).toEqual( + expect.objectContaining({ + name: "pkg-b", + version: "1.0.0", + devDependencies: { + "pkg-a": "1.1.0", + }, + }) + ); + expect(getPkgJSON("pkg-c", spy.mock.calls)).toEqual( + expect.objectContaining({ + name: "pkg-c", + version: "1.0.0", + dependencies: { + "pkg-b": "1.0.0", + }, + }) + ); + expect(getChangelog("pkg-a", spy.mock.calls)).toMatchInlineSnapshot(` + "# pkg-a + + ## 1.1.0 + + ### Minor Changes + + - g1th4sh: This is a summary + " + `); + + // pkg-b and - pkg-c are not being released so changelogs should not be + // generated for them + expect(() => getChangelog("pkg-b", spy.mock.calls)).toThrowError(); + expect(() => getChangelog("pkg-c", spy.mock.calls)).toThrowError(); + }); }); describe("pre", () => { From da2552fec28e021f47ab9083a3635585c03c323d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 14:21:01 +0200 Subject: [PATCH 2/9] Fixed the issue --- .../src/determine-dependents.ts | 5 +++-- packages/cli/src/commands/version/version.test.ts | 12 +++--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/assemble-release-plan/src/determine-dependents.ts b/packages/assemble-release-plan/src/determine-dependents.ts index da355cff8..d12a450c3 100644 --- a/packages/assemble-release-plan/src/determine-dependents.ts +++ b/packages/assemble-release-plan/src/determine-dependents.ts @@ -85,8 +85,9 @@ export default function determineDependents({ // TODO validate this - I don't think it's right anymore (!releases.has(dependent) || releases.get(dependent)!.type === "none") && - (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH - .updateInternalDependents === "always" || + ((config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH + .updateInternalDependents === "always" && + nextRelease.type !== "none") || !semver.satisfies( incrementVersion(nextRelease, preInfo), versionRange diff --git a/packages/cli/src/commands/version/version.test.ts b/packages/cli/src/commands/version/version.test.ts index f9659b018..f08bc81a1 100644 --- a/packages/cli/src/commands/version/version.test.ts +++ b/packages/cli/src/commands/version/version.test.ts @@ -1094,15 +1094,9 @@ describe("updateInternalDependents: always", () => { }, }) ); - expect(getPkgJSON("pkg-c", spy.mock.calls)).toEqual( - expect.objectContaining({ - name: "pkg-c", - version: "1.0.0", - dependencies: { - "pkg-b": "1.0.0", - }, - }) - ); + // `pkg-c` should not be touched + expect(() => getPkgJSON("pkg-c", spy.mock.calls)).toThrowError(); + expect(getChangelog("pkg-a", spy.mock.calls)).toMatchInlineSnapshot(` "# pkg-a From 8fcdebe140b820b7ecd13e94c285d40081fa904a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 14:27:12 +0200 Subject: [PATCH 3/9] Tweak test title --- packages/assemble-release-plan/src/index.test.ts | 2 +- packages/cli/src/commands/version/version.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/assemble-release-plan/src/index.test.ts b/packages/assemble-release-plan/src/index.test.ts index 7a80cf338..82647bc5b 100644 --- a/packages/assemble-release-plan/src/index.test.ts +++ b/packages/assemble-release-plan/src/index.test.ts @@ -1388,7 +1388,7 @@ describe("bumping peerDeps", () => { expect(releases[2].newVersion).toEqual("1.0.1"); }); - it("should not bump a transitive dependent when a devDependency package gets bumped", () => { + it("should not bump a dev dependent nor its dependent when a package gets bumped", () => { setup.addPackage("pkg-c", "1.0.0"); setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0"); setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); diff --git a/packages/cli/src/commands/version/version.test.ts b/packages/cli/src/commands/version/version.test.ts index f08bc81a1..773b1b2a5 100644 --- a/packages/cli/src/commands/version/version.test.ts +++ b/packages/cli/src/commands/version/version.test.ts @@ -1067,7 +1067,7 @@ describe("updateInternalDependents: always", () => { `); }); - it("should not bump a devDependency or any of its dependants when a dependency package gets bumped", async () => { + it("should not bump a dev dependent nor its dependent when a package gets bumped", async () => { const cwd = await f.copy("simplest-transitive-devdependent"); const spy = jest.spyOn(fs, "writeFile"); await writeChangeset(simpleChangeset, cwd); From ff27d257cb23b6b58d0babbf57ad1094944a07d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 15:10:13 +0200 Subject: [PATCH 4/9] Check first if the `nextRelease` is `none` --- .../assemble-release-plan/src/determine-dependents.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/assemble-release-plan/src/determine-dependents.ts b/packages/assemble-release-plan/src/determine-dependents.ts index d12a450c3..69e0698f1 100644 --- a/packages/assemble-release-plan/src/determine-dependents.ts +++ b/packages/assemble-release-plan/src/determine-dependents.ts @@ -66,7 +66,9 @@ export default function determineDependents({ ); for (const { depType, versionRange } of dependencyVersionRanges) { - if ( + if (nextRelease.type === "none") { + continue; + } else if ( shouldBumpMajor({ dependent, depType, @@ -85,9 +87,8 @@ export default function determineDependents({ // TODO validate this - I don't think it's right anymore (!releases.has(dependent) || releases.get(dependent)!.type === "none") && - ((config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH - .updateInternalDependents === "always" && - nextRelease.type !== "none") || + (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH + .updateInternalDependents === "always" || !semver.satisfies( incrementVersion(nextRelease, preInfo), versionRange From 1e39563831f2a64cc1feff5dc4d6ab7f7df84cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 15:12:44 +0200 Subject: [PATCH 5/9] Remove the redundant indentation --- .../src/determine-dependents.ts | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/packages/assemble-release-plan/src/determine-dependents.ts b/packages/assemble-release-plan/src/determine-dependents.ts index 69e0698f1..08b3135e4 100644 --- a/packages/assemble-release-plan/src/determine-dependents.ts +++ b/packages/assemble-release-plan/src/determine-dependents.ts @@ -82,35 +82,32 @@ export default function determineDependents({ }) ) { type = "major"; - } else { - if ( - // TODO validate this - I don't think it's right anymore - (!releases.has(dependent) || - releases.get(dependent)!.type === "none") && - (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH - .updateInternalDependents === "always" || - !semver.satisfies( - incrementVersion(nextRelease, preInfo), - versionRange - )) - ) { - switch (depType) { - case "dependencies": - case "optionalDependencies": - case "peerDependencies": - if (type !== "major" && type !== "minor") { - type = "patch"; - } - break; - case "devDependencies": { - // We don't need a version bump if the package is only in the devDependencies of the dependent package - if ( - type !== "major" && - type !== "minor" && - type !== "patch" - ) { - type = "none"; - } + } else if ( + (!releases.has(dependent) || + releases.get(dependent)!.type === "none") && + (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH + .updateInternalDependents === "always" || + !semver.satisfies( + incrementVersion(nextRelease, preInfo), + versionRange + )) + ) { + switch (depType) { + case "dependencies": + case "optionalDependencies": + case "peerDependencies": + if (type !== "major" && type !== "minor") { + type = "patch"; + } + break; + case "devDependencies": { + // We don't need a version bump if the package is only in the devDependencies of the dependent package + if ( + type !== "major" && + type !== "minor" && + type !== "patch" + ) { + type = "none"; } } } From 8be8b05a9efa2efdd253701f62ba4049cf49ad72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 15:13:12 +0200 Subject: [PATCH 6/9] Tweak `launch.json` --- .vscode/launch.json | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5a8ad7023..7695f05dc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,30 +1,12 @@ { "version": "0.2.0", "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Jest All", - "program": "${workspaceFolder}/node_modules/.bin/jest", - "args": ["--runInBand"], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - } - }, { "type": "node", "request": "launch", "name": "Jest Current File", "program": "${workspaceFolder}/node_modules/.bin/jest", - "args": [ - "${fileBasenameNoExtension}", - "--config", - "jest.config.js", - "--no-cache" - ], + "args": ["${relativeFile}", "--config", "jest.config.js", "--no-cache"], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", "disableOptimisticBPs": true, From d93782884ea3a09f968c117eb8010d8cb4707015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 15:25:43 +0200 Subject: [PATCH 7/9] Add changeset --- .changeset/silent-ants-smell.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .changeset/silent-ants-smell.md diff --git a/.changeset/silent-ants-smell.md b/.changeset/silent-ants-smell.md new file mode 100644 index 000000000..9720362a0 --- /dev/null +++ b/.changeset/silent-ants-smell.md @@ -0,0 +1,17 @@ +--- +"@changesets/assemble-release-plan": patch +"@changesets/cli": patch +--- + +author: @Andarist +author: @BPScott + +Fixed the issue that caused transitive dependents of dev dependents to be bumped when a package got bumped. To illustrate this with an example: + +``` +pkg-a - version: 1.0.0 +pkg-b - devDependencies['pkg-a']: 1.0.0 +pkg-c - dependencies['pkg-b']: 1.0.0 +``` + +With a changeset for `pkg-a` the `pkg-c` could have been sometimes incorrectly released. From 82d5ff14d2a9223fe823fe6ee7ff47556a604446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 18:42:53 +0200 Subject: [PATCH 8/9] Add test case and juggle some tests into their appropriate blocks --- .changeset/silent-ants-smell.md | 2 +- .../assemble-release-plan/src/index.test.ts | 188 ++++++++++-------- 2 files changed, 103 insertions(+), 87 deletions(-) diff --git a/.changeset/silent-ants-smell.md b/.changeset/silent-ants-smell.md index 9720362a0..f790e76ed 100644 --- a/.changeset/silent-ants-smell.md +++ b/.changeset/silent-ants-smell.md @@ -6,7 +6,7 @@ author: @Andarist author: @BPScott -Fixed the issue that caused transitive dependents of dev dependents to be bumped when a package got bumped. To illustrate this with an example: +Fixed the issue that caused transitive dependents of dev dependents to be bumped when a package got bumped and when using `___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents: "always"`. To illustrate this with an example: ``` pkg-a - version: 1.0.0 diff --git a/packages/assemble-release-plan/src/index.test.ts b/packages/assemble-release-plan/src/index.test.ts index 82647bc5b..a41717392 100644 --- a/packages/assemble-release-plan/src/index.test.ts +++ b/packages/assemble-release-plan/src/index.test.ts @@ -542,6 +542,24 @@ Mixed changesets that contain both ignored and not ignored packages are not allo `); }); + it("should not bump a dev dependent nor its dependent when a package gets bumped", () => { + setup.updateDevDependency("pkg-b", "pkg-a", "1.0.0"); + setup.updateDependency("pkg-c", "pkg-b", "1.0.0"); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + defaultConfig, + undefined + ); + + expect(releases.length).toBe(2); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-b"); + expect(releases[1].newVersion).toEqual("1.0.0"); + }); + describe("fixed packages", () => { it("should assemble release plan for fixed packages", () => { setup.addChangeset({ @@ -1038,6 +1056,81 @@ Mixed changesets that contain both ignored and not ignored packages are not allo expect(releases[1].newVersion).toEqual("1.0.1"); }); }); + + describe("updateInternalDependents: always", () => { + it("should bump a direct dependent when a dependency package gets bumped", () => { + setup.updateDependency("pkg-b", "pkg-a", "^1.0.0"); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + { + ...defaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }, + undefined + ); + + expect(releases.length).toBe(2); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-b"); + expect(releases[1].newVersion).toEqual("1.0.1"); + }); + + it("should bump a transitive dependent when a dependency package gets bumped", () => { + setup.updateDependency("pkg-b", "pkg-a", "^1.0.0"); + setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + { + ...defaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }, + undefined + ); + + expect(releases.length).toBe(3); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-b"); + expect(releases[1].newVersion).toEqual("1.0.1"); + expect(releases[2].name).toEqual("pkg-c"); + expect(releases[2].newVersion).toEqual("1.0.1"); + }); + + it("should not bump a dev dependent nor its dependent when a package gets bumped", () => { + setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0"); + setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + { + ...defaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }, + undefined + ); + + expect(releases.length).toBe(2); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-b"); + expect(releases[1].newVersion).toEqual("1.0.0"); + }); + }); }); describe("version update thoroughness", () => { @@ -1335,63 +1428,13 @@ describe("bumping peerDeps", () => { expect(releases[0].name).toEqual("pkg-a"); expect(releases[0].newVersion).toEqual("1.1.0"); }); - }); - - describe("updateInternalDependents: always", () => { - it("should bump a direct dependent when a dependency package gets bumped", () => { - setup.updateDependency("pkg-b", "pkg-a", "^1.0.0"); - let { releases } = assembleReleasePlan( - setup.changesets, - setup.packages, - { - ...defaultConfig, - ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { - ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, - updateInternalDependents: "always", - }, - }, - undefined - ); - - expect(releases.length).toBe(2); - expect(releases[0].name).toEqual("pkg-a"); - expect(releases[0].newVersion).toEqual("1.0.1"); - expect(releases[1].name).toEqual("pkg-b"); - expect(releases[1].newVersion).toEqual("1.0.1"); - }); - - it("should bump a transitive dependent when a dependency package gets bumped", () => { - setup.addPackage("pkg-c", "1.0.0"); - setup.updateDependency("pkg-b", "pkg-a", "^1.0.0"); - setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); - - let { releases } = assembleReleasePlan( - setup.changesets, - setup.packages, - { - ...defaultConfig, - ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { - ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, - updateInternalDependents: "always", - }, - }, - undefined - ); - - expect(releases.length).toBe(3); - expect(releases[0].name).toEqual("pkg-a"); - expect(releases[0].newVersion).toEqual("1.0.1"); - expect(releases[1].name).toEqual("pkg-b"); - expect(releases[1].newVersion).toEqual("1.0.1"); - expect(releases[2].name).toEqual("pkg-c"); - expect(releases[2].newVersion).toEqual("1.0.1"); - }); - - it("should not bump a dev dependent nor its dependent when a package gets bumped", () => { - setup.addPackage("pkg-c", "1.0.0"); - setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0"); - setup.updateDependency("pkg-c", "pkg-b", "^1.0.0"); + it("should major bump dependent when leaving range", () => { + setup.updatePeerDependency("pkg-b", "pkg-a", "~1.0.0"); + setup.addChangeset({ + id: "anyway-the-windblows", + releases: [{ name: "pkg-a", type: "minor" }], + }); let { releases } = assembleReleasePlan( setup.changesets, @@ -1400,7 +1443,7 @@ describe("bumping peerDeps", () => { ...defaultConfig, ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, - updateInternalDependents: "always", + onlyUpdatePeerDependentsWhenOutOfRange: true, }, }, undefined @@ -1408,37 +1451,10 @@ describe("bumping peerDeps", () => { expect(releases.length).toBe(2); expect(releases[0].name).toEqual("pkg-a"); - expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[0].newVersion).toEqual("1.1.0"); expect(releases[1].name).toEqual("pkg-b"); - expect(releases[1].newVersion).toEqual("1.0.0"); - }); - }); - - it("should major bump dependent when leaving range", () => { - setup.updatePeerDependency("pkg-b", "pkg-a", "~1.0.0"); - setup.addChangeset({ - id: "anyway-the-windblows", - releases: [{ name: "pkg-a", type: "minor" }], + expect(releases[1].newVersion).toEqual("2.0.0"); }); - - let { releases } = assembleReleasePlan( - setup.changesets, - setup.packages, - { - ...defaultConfig, - ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { - ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, - onlyUpdatePeerDependentsWhenOutOfRange: true, - }, - }, - undefined - ); - - expect(releases.length).toBe(2); - expect(releases[0].name).toEqual("pkg-a"); - expect(releases[0].newVersion).toEqual("1.1.0"); - expect(releases[1].name).toEqual("pkg-b"); - expect(releases[1].newVersion).toEqual("2.0.0"); }); }); From f344afbd3467cba8bf1b5813818937055dbb0baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 18 Sep 2022 18:52:29 +0200 Subject: [PATCH 9/9] Add a simpler test case too --- .../assemble-release-plan/src/index.test.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/assemble-release-plan/src/index.test.ts b/packages/assemble-release-plan/src/index.test.ts index a41717392..24d958379 100644 --- a/packages/assemble-release-plan/src/index.test.ts +++ b/packages/assemble-release-plan/src/index.test.ts @@ -1107,6 +1107,33 @@ Mixed changesets that contain both ignored and not ignored packages are not allo expect(releases[2].newVersion).toEqual("1.0.1"); }); + it("not bump a dependent package when a dependency has `none` changeset", () => { + setup.updateDependency("pkg-b", "pkg-c", "^1.0.0"); + setup.addChangeset({ + id: "stuff-and-nonsense", + releases: [{ name: "pkg-c", type: "none" }], + }); + + let { releases } = assembleReleasePlan( + setup.changesets, + setup.packages, + { + ...defaultConfig, + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + ...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH, + updateInternalDependents: "always", + }, + }, + undefined + ); + + expect(releases.length).toBe(2); + expect(releases[0].name).toEqual("pkg-a"); + expect(releases[0].newVersion).toEqual("1.0.1"); + expect(releases[1].name).toEqual("pkg-c"); + expect(releases[1].newVersion).toEqual("1.0.0"); + }); + it("should not bump a dev dependent nor its dependent when a package gets bumped", () => { setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0"); setup.updateDependency("pkg-c", "pkg-b", "^1.0.0");