Skip to content

Commit

Permalink
Fixed an issue with including dependents in the release plan for depe…
Browse files Browse the repository at this point in the history
…ndencies using `workspace:` protocol that had a `none` changeset for them (#441)

* fix: remove workspace: prefix from dependent version ranges

so they can be semver evaluated

* Update .changeset/chatty-eagles-look.md

Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>

* fix: remove workspace: prefix from dependent version ranges

* deal with workspace:* dependencies incorrectly bumping

* Update .changeset/chatty-eagles-look.md

Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
  • Loading branch information
joshlartz and Andarist committed Apr 3, 2021
1 parent bb7106d commit 8b9ac07
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .changeset/chatty-eagles-look.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@changesets/apply-release-plan": none
"@changesets/assemble-release-plan": patch
---

Fixed an issue with including dependents in the release plan for dependencies using `workspace:` protocol that had a `none` changeset for them.
83 changes: 83 additions & 0 deletions packages/apply-release-plan/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import fs from "fs-extra";
import path from "path";
import outdent from "outdent";
import spawn from "spawndamnit";
import { defaultConfig } from "@changesets/config";

import applyReleasePlan from "./";
import { getPackages } from "@manypkg/get-packages";
Expand Down Expand Up @@ -496,6 +497,88 @@ describe("apply release plan", () => {
}
});
});
it("should not update dependent versions when a package has a changeset type of none", async () => {
let { changedFiles } = await testSetup(
"simple-project-caret-dep",
{
changesets: [
{
id: "quick-lions-devour",
summary: "Hey, let's have fun with testing!",
releases: [{ name: "pkg-b", type: "none" }]
}
],
releases: [
{
name: "pkg-b",
type: "none",
oldVersion: "1.0.0",
newVersion: "1.0.0",
changesets: ["quick-lions-devour"]
}
],
preState: undefined
},
{ ...defaultConfig, changelog: false }
);
let pkgPathA = changedFiles.find(a =>
a.endsWith(`pkg-a${path.sep}package.json`)
);
let pkgPathB = changedFiles.find(b =>
b.endsWith(`pkg-b${path.sep}package.json`)
);

expect(pkgPathA).toBeUndefined();
if (!pkgPathB) throw new Error(`could not find an updated package json`);

let pkgJSONB = await fs.readJSON(pkgPathB);

expect(pkgJSONB).toMatchObject({
name: "pkg-b",
version: "1.0.0"
});
});
it("should not update workspace dependent versions when a package has a changeset type of none", async () => {
let { changedFiles } = await testSetup(
"simple-workspace-range-dep",
{
changesets: [
{
id: "quick-lions-devour",
summary: "Hey, let's have fun with testing!",
releases: [{ name: "pkg-b", type: "none" }]
}
],
releases: [
{
name: "pkg-b",
type: "none",
oldVersion: "1.0.0",
newVersion: "1.0.0",
changesets: ["quick-lions-devour"]
}
],
preState: undefined
},
{ ...defaultConfig, changelog: false }
);
let pkgPathA = changedFiles.find(a =>
a.endsWith(`pkg-a${path.sep}package.json`)
);
let pkgPathB = changedFiles.find(b =>
b.endsWith(`pkg-b${path.sep}package.json`)
);

expect(pkgPathA).toBeUndefined();
if (!pkgPathB) throw new Error(`could not find an updated package json`);

let pkgJSONB = await fs.readJSON(pkgPathB);

expect(pkgJSONB).toMatchObject({
name: "pkg-b",
version: "1.0.0"
});
});

describe("internal dependency bumping", () => {
describe("updateInternalDependencies set to patch", () => {
Expand Down
5 changes: 3 additions & 2 deletions packages/assemble-release-plan/src/determine-dependents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ export default function getDependents({
releases.get(dependent)!.type === "none") &&
!semver.satisfies(
incrementVersion(nextRelease, preInfo),
versionRange
// to deal with a * versionRange that comes from workspace:* dependencies as the wildcard will match anything
versionRange === "*" ? nextRelease.oldVersion : versionRange
)
) {
switch (depType) {
Expand Down Expand Up @@ -183,7 +184,7 @@ function getDependencyVersionRanges(
if (deps[dependencyName]) {
dependencyVersionRanges.push({
depType: type,
versionRange: deps[dependencyName]
versionRange: deps[dependencyName].replace("workspace:", "")
});
}
}
Expand Down
79 changes: 79 additions & 0 deletions packages/assemble-release-plan/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,26 @@ describe("assemble-release-plan", () => {
expect(releases[2].oldVersion).toEqual("1.0.0");
expect(releases[2].newVersion).toEqual("1.0.1");
});
it("should assemble release plan without dependencies when the dependent has a changeset type of none", () => {
setup.updateDependency("pkg-c", "pkg-b", "^1.0.0");
setup.addChangeset({
id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
});

let { releases } = assembleReleasePlan(
setup.changesets,
setup.packages,
defaultConfig,
undefined
);

expect(releases.length).toEqual(2);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].oldVersion).toEqual("1.0.0");
expect(releases[1].newVersion).toEqual("1.0.0");
});
it("should assemble release plan without dependent through the link protocol", () => {
setup.updateDevDependency("pkg-b", "pkg-a", "link:../pkg-a");
setup.addChangeset({
Expand Down Expand Up @@ -597,6 +617,65 @@ Mixed changesets that contain both ignored and not ignored packages are not allo
expect(releases[0].type).toEqual("minor");
});
});

describe("workspace protocol", () => {
it("should assemble release plan without workspace dependencies when the dependent has a changeset type of none", () => {
setup.updateDependency("pkg-c", "pkg-b", "workspace:^1.0.0");
setup.addChangeset({
id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
});

let { releases } = assembleReleasePlan(
setup.changesets,
setup.packages,
defaultConfig,
undefined
);

expect(releases.length).toEqual(2);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].oldVersion).toEqual("1.0.0");
expect(releases[1].newVersion).toEqual("1.0.0");
});
it("should assemble release plan without workspace:* dependencies when the dependent has a changeset type of none", () => {
setup.updateDependency("pkg-c", "pkg-b", "workspace:*");
setup.addChangeset({
id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
});

let { releases } = assembleReleasePlan(
setup.changesets,
setup.packages,
defaultConfig,
undefined
);

expect(releases.length).toEqual(2);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].oldVersion).toEqual("1.0.0");
expect(releases[1].newVersion).toEqual("1.0.0");
});
it("should assemble release plan with workspace:* dependencies", () => {
setup.updateDependency("pkg-b", "pkg-a", "workspace:*");

let { releases } = assembleReleasePlan(
setup.changesets,
setup.packages,
defaultConfig,
undefined
);

expect(releases.length).toEqual(2);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].oldVersion).toEqual("1.0.0");
expect(releases[1].newVersion).toEqual("1.0.1");
});
});
});

describe("version update thoroughness", () => {
Expand Down

0 comments on commit 8b9ac07

Please sign in to comment.