From f25f866fed6fc862378ec36f634b55b051157912 Mon Sep 17 00:00:00 2001 From: Michael Blaszczyk Date: Wed, 9 Feb 2022 09:36:41 +1000 Subject: [PATCH 1/3] Add failing test --- packages/apply-release-plan/src/index.test.ts | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/packages/apply-release-plan/src/index.test.ts b/packages/apply-release-plan/src/index.test.ts index e14175754..e9a4f2353 100644 --- a/packages/apply-release-plan/src/index.test.ts +++ b/packages/apply-release-plan/src/index.test.ts @@ -1900,6 +1900,82 @@ describe("apply release plan", () => { - Hey, let's have fun with testing!`); }); + + it("should add peer dependency changelog line under major", async () => { + let { changedFiles } = await testSetup( + "simple-caret-peer-dep", + { + changesets: [ + { + id: "quick-lions-devour", + summary: "Hey, let's have fun with testing!", + releases: [{ name: "depended-upon", type: "minor" }] + } + ], + releases: [ + { + name: "depended-upon", + type: "patch", + oldVersion: "1.0.0", + newVersion: "1.1.0", + changesets: ["quick-lions-devour"] + }, + { + name: "has-peer-dep", + type: "patch", + oldVersion: "1.0.0", + newVersion: "2.0.0", + changesets: [] + } + ], + preState: undefined + }, + { + changelog: [ + path.resolve(__dirname, "test-utils/simple-get-changelog-entry"), + null + ], + commit: false, + linked: [], + access: "restricted", + baseBranch: "main", + updateInternalDependencies: "patch", + ignore: [], + ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: { + onlyUpdatePeerDependentsWhenOutOfRange: false, + updateInternalDependents: "out-of-range", + useCalculatedVersionForSnapshots: false + } + } + ); + + let readmePath = changedFiles.find(a => + a.endsWith(`depended-upon${path.sep}CHANGELOG.md`) + ); + let readmePathB = changedFiles.find(a => + a.endsWith(`has-peer-dep${path.sep}CHANGELOG.md`) + ); + + if (!readmePath || !readmePathB) + throw new Error(`could not find an updated changelog`); + let readme = await fs.readFile(readmePath, "utf-8"); + let readmeB = await fs.readFile(readmePathB, "utf-8"); + + expect(readme.trim()).toEqual(outdent`# depended-upon + + ## 1.1.0 + ### Minor Changes + + - Hey, let's have fun with testing!`); + + expect(readmeB.trim()).toEqual(outdent`# has-peer-dep + + ## 2.0.0 + ### Major Changes + + - Updated dependencies + - depended-upon@1.1.0`); + }); }); describe("should error and not write if", () => { // This is skipped as *for now* we are assuming we have been passed From a9d5ee42904c026d1f9a32cfb2ac4d4221461987 Mon Sep 17 00:00:00 2001 From: Michael Blaszczyk Date: Wed, 9 Feb 2022 09:36:56 +1000 Subject: [PATCH 2/3] Fix peer dependency release lines not appearing as a major in changelog --- .../src/get-changelog-entry.ts | 63 +++++++++++++------ packages/types/src/index.ts | 3 +- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/packages/apply-release-plan/src/get-changelog-entry.ts b/packages/apply-release-plan/src/get-changelog-entry.ts index 3d859ee53..4867f9e42 100644 --- a/packages/apply-release-plan/src/get-changelog-entry.ts +++ b/packages/apply-release-plan/src/get-changelog-entry.ts @@ -1,6 +1,6 @@ import { ChangelogFunctions, NewChangesetWithCommit } from "@changesets/types"; -import { ModCompWithPackage } from "@changesets/types"; +import { ModCompWithPackage, DependencyType } from "@changesets/types"; import startCase from "lodash.startcase"; import { shouldUpdateDependencyBasedOnConfig } from "./utils"; @@ -21,6 +21,20 @@ async function generateChangesForVersionTypeMarkdown( } } +function getRelevantChangesets( + releases: ModCompWithPackage[], + changesets: NewChangesetWithCommit[] +) { + let relevantChangesetIds: Set = new Set(); + releases.forEach(rel => { + rel.changesets.forEach(cs => { + relevantChangesetIds.add(cs); + }); + }); + + return changesets.filter(cs => relevantChangesetIds.has(cs.id)); +} + // release is the package and version we are releasing export default async function getChangelogEntry( release: ModCompWithPackage, @@ -56,45 +70,56 @@ export default async function getChangelogEntry( ); } }); - let dependentReleases = releases.filter(rel => { + + let dependentReleases: ModCompWithPackage[] = []; + let peerDependentReleases: ModCompWithPackage[] = []; + releases.forEach(rel => { const dependencyVersionRange = release.packageJson.dependencies?.[rel.name]; const peerDependencyVersionRange = release.packageJson.peerDependencies?.[rel.name]; + const depType: DependencyType = peerDependencyVersionRange + ? "peerDependencies" + : "dependencies"; + const versionRange = peerDependencyVersionRange || dependencyVersionRange; - const versionRange = dependencyVersionRange || peerDependencyVersionRange; - return ( + const shouldUpdate = versionRange && shouldUpdateDependencyBasedOnConfig( { type: rel.type, version: rel.newVersion }, { depVersionRange: versionRange, - depType: dependencyVersionRange ? "dependencies" : "peerDependencies" + depType }, { minReleaseType: updateInternalDependencies, onlyUpdatePeerDependentsWhenOutOfRange } - ) - ); - }); - - let relevantChangesetIds: Set = new Set(); + ); - dependentReleases.forEach(rel => { - rel.changesets.forEach(cs => { - relevantChangesetIds.add(cs); - }); + if (!shouldUpdate) { + return; + } + if (depType === "peerDependencies") { + peerDependentReleases.push(rel); + } else { + dependentReleases.push(rel); + } }); - let relevantChangesets = changesets.filter(cs => - relevantChangesetIds.has(cs.id) + changelogLines.major.push( + changelogFuncs.getDependencyReleaseLine( + getRelevantChangesets(peerDependentReleases, changesets), + peerDependentReleases, + changelogOpts, + "peerDependencies" + ) ); - changelogLines.patch.push( changelogFuncs.getDependencyReleaseLine( - relevantChangesets, + getRelevantChangesets(dependentReleases, changesets), dependentReleases, - changelogOpts + changelogOpts, + "dependencies" ) ); diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index b983bd0a8..70e5791cc 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -109,7 +109,8 @@ export type GetReleaseLine = ( export type GetDependencyReleaseLine = ( changesets: NewChangesetWithCommit[], dependenciesUpdated: ModCompWithPackage[], - changelogOpts: any + changelogOpts: any, + dependencyType: DependencyType ) => Promise; export type ChangelogFunctions = { From db6a2a275643a16119b6aec9afdaf9eaf6ff6a84 Mon Sep 17 00:00:00 2001 From: Michael Blaszczyk Date: Wed, 9 Feb 2022 10:02:33 +1000 Subject: [PATCH 3/3] Add changesets --- .changeset/funny-cheetahs-appear.md | 6 ++++++ .changeset/polite-peaches-grin.md | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 .changeset/funny-cheetahs-appear.md create mode 100644 .changeset/polite-peaches-grin.md diff --git a/.changeset/funny-cheetahs-appear.md b/.changeset/funny-cheetahs-appear.md new file mode 100644 index 000000000..2e03387bd --- /dev/null +++ b/.changeset/funny-cheetahs-appear.md @@ -0,0 +1,6 @@ +--- +"@changesets/cli": minor +"@changesets/types": minor +--- + +Adds an additional `dependencyType` argument to the `getDependencyReleaseLine` changelog function to distinguish peer dependency upgrades from normal dependency upgrades diff --git a/.changeset/polite-peaches-grin.md b/.changeset/polite-peaches-grin.md new file mode 100644 index 000000000..2c762c291 --- /dev/null +++ b/.changeset/polite-peaches-grin.md @@ -0,0 +1,6 @@ +--- +"@changesets/apply-release-plan": patch +"@changesets/cli": patch +--- + +Fix peer dependency changelog lines being added under 'patch' instead of 'major'