Skip to content

Commit

Permalink
fix: don't bump dependent if the released package is a dev dep (#313)
Browse files Browse the repository at this point in the history
* fix: don't bump dependent if the released package is a dev dep

close #312

* style: fix linting issues

* fix: version bump on peer dep update

* test: dependent throught dev dep is not bumped

* docs: add changesets

* fix: update the specs of dev dep

* Update .changeset/moody-flies-give.md

* Update .changeset/tough-lies-hammer.md

* Create real-peaches-behave.md

* Create some-words-rhyme.md
  • Loading branch information
zkochan committed Apr 15, 2020
1 parent 44555b4 commit 011d57f
Show file tree
Hide file tree
Showing 17 changed files with 160 additions and 18 deletions.
5 changes: 5 additions & 0 deletions .changeset/moody-flies-give.md
@@ -0,0 +1,5 @@
---
"@changesets/assemble-release-plan": major
---

When the released package is only used as a dev dependency, the dependent package's version should not be bumped.
5 changes: 5 additions & 0 deletions .changeset/real-peaches-behave.md
@@ -0,0 +1,5 @@
---
"@changesets/types": major
---

Add in `none` as a potential option for bumpType in release plans. Note that this is experimental and is internal, not a possible user option
9 changes: 9 additions & 0 deletions .changeset/some-words-rhyme.md
@@ -0,0 +1,9 @@
---
"@changesets/apply-release-plan": major
---

Bumping `devDependencies` no longer bumps the packages that they depend on.

This is a pretty big "quality of life" update, which means we will do fewer releases of packages overall, as there is no change of installed packages.

This has been made a breaking chage as it changes the behaviour of what will be published. It should only be for the better, but we didn't want to surprise you with it.
5 changes: 5 additions & 0 deletions .changeset/tough-lies-hammer.md
@@ -0,0 +1,5 @@
---
"@changesets/apply-release-plan": major
---

Updates to devDependencies are not affecting the end users of a package. So we are not listing these changes in the changelog file.
3 changes: 3 additions & 0 deletions __fixtures__/simple-dev-dep/.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
1 change: 1 addition & 0 deletions __fixtures__/simple-dev-dep/.changeset/config.json
@@ -0,0 +1 @@
{}
11 changes: 11 additions & 0 deletions __fixtures__/simple-dev-dep/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/*"
]
}
}
7 changes: 7 additions & 0 deletions __fixtures__/simple-dev-dep/packages/pkg-a/package.json
@@ -0,0 +1,7 @@
{
"name": "pkg-a",
"version": "1.0.0",
"devDependencies": {
"pkg-b": "1.0.0"
}
}
4 changes: 4 additions & 0 deletions __fixtures__/simple-dev-dep/packages/pkg-b/package.json
@@ -0,0 +1,4 @@
{
"name": "pkg-b",
"version": "1.0.0"
}
12 changes: 3 additions & 9 deletions packages/apply-release-plan/src/get-changelog-entry.ts
@@ -1,8 +1,4 @@
import {
ChangelogFunctions,
NewChangesetWithCommit,
VersionType
} from "@changesets/types";
import { ChangelogFunctions, NewChangesetWithCommit } from "@changesets/types";

import { ModCompWithPackage } from "@changesets/types";
import startCase from "lodash.startcase";
Expand All @@ -15,7 +11,7 @@ type ChangelogLines = {

async function generateChangesForVersionTypeMarkdown(
obj: ChangelogLines,
type: VersionType
type: keyof ChangelogLines
) {
let releaseLines = await Promise.all(obj[type]);
releaseLines = releaseLines.filter(x => x);
Expand Down Expand Up @@ -44,7 +40,7 @@ export default async function generateMarkdown(
// We can filter here, but that just adds another iteration over this list
changesets.forEach(cs => {
const rls = cs.releases.find(r => r.name === release.name);
if (rls) {
if (rls && rls.type !== "none") {
releaseObj[rls.type].push(
changelogFuncs.getReleaseLine(cs, rls.type, changelogOpts)
);
Expand All @@ -55,8 +51,6 @@ export default async function generateMarkdown(
return (
(release.packageJson.dependencies &&
release.packageJson.dependencies[rel.name]) ||
(release.packageJson.devDependencies &&
release.packageJson.devDependencies[rel.name]) ||
(release.packageJson.peerDependencies &&
release.packageJson.peerDependencies[rel.name])
);
Expand Down
62 changes: 62 additions & 0 deletions packages/apply-release-plan/src/index.test.ts
Expand Up @@ -222,6 +222,68 @@ describe("apply release plan", () => {
version: "2.0.0"
});
});
it("should not update the version of the dependent package if the released dep is a dev dep", async () => {
let { changedFiles } = await testSetup(
"simple-dev-dep",
{
changesets: [
{
id: "quick-lions-devour",
summary: "Hey, let's have fun with testing!",
releases: [
{ name: "pkg-a", type: "none" },
{ name: "pkg-b", type: "minor" }
]
}
],
releases: [
{
name: "pkg-a",
type: "none",
oldVersion: "1.0.0",
newVersion: "1.0.0",
changesets: ["quick-lions-devour"]
},
{
name: "pkg-b",
type: "minor",
oldVersion: "1.0.0",
newVersion: "1.1.0",
changesets: ["quick-lions-devour"]
}
],
preState: undefined
},
{
changelog: false,
commit: false,
linked: [],
access: "restricted",
baseBranch: "master"
}
);
let pkgPathA = changedFiles.find(a => a.endsWith("pkg-a/package.json"));
let pkgPathB = changedFiles.find(b => b.endsWith("pkg-b/package.json"));

if (!pkgPathA || !pkgPathB) {
throw new Error(`could not find an updated package json`);
}
let pkgJSONA = await fs.readJSON(pkgPathA);
let pkgJSONB = await fs.readJSON(pkgPathB);

expect(pkgJSONA).toMatchObject({
name: "pkg-a",
version: "1.0.0",

devDependencies: {
"pkg-b": "1.1.0"
}
});
expect(pkgJSONB).toMatchObject({
name: "pkg-b",
version: "1.1.0"
});
});
});
describe("changelogs", () => {
it("should update a changelog for one package", async () => {
Expand Down
@@ -1,11 +1,7 @@
/* eslint-disable import/no-extraneous-dependencies */
import startCase from "lodash.startcase";
import { getCommitThatAddsFile } from "@changesets/git";
import {
ComprehensiveRelease,
NewChangeset,
VersionType
} from "@changesets/types";
import { ComprehensiveRelease, NewChangeset } from "@changesets/types";

import { RelevantChangesets } from "../types";

Expand All @@ -26,7 +22,7 @@ async function getReleaseLine(changeset: NewChangeset, cwd: string) {

async function getReleaseLines(
obj: RelevantChangesets,
type: VersionType,
type: keyof RelevantChangesets,
cwd: string
) {
const releaseLines = obj[type].map(changeset =>
Expand Down
11 changes: 10 additions & 1 deletion packages/assemble-release-plan/src/determine-dependents.ts
Expand Up @@ -73,7 +73,16 @@ export default function getDependents(
versionRange
)
) {
type = "patch";
if (
depTypes.includes("dependencies") ||
depTypes.includes("optionalDependencies") ||
depTypes.includes("peerDependencies")
) {
type = "patch";
} else {
// We don't need a version bump if the package is only in the devDependencies of the dependent package
type = "none";
}
}
}
return { name: dependent, type, pkgJSON: dependentPackage.packageJson };
Expand Down
5 changes: 4 additions & 1 deletion packages/assemble-release-plan/src/increment.ts
Expand Up @@ -6,7 +6,10 @@ export function incrementVersion(
release: InternalRelease,
preInfo: PreInfo | undefined
) {
let version = semver.inc(release.oldVersion, release.type)!;
let version =
release.type === "none"
? release.oldVersion
: semver.inc(release.oldVersion, release.type)!;
if (preInfo !== undefined && preInfo.state.mode !== "exit") {
let preVersion = preInfo.preVersions.get(release.name);
if (preVersion === undefined) {
Expand Down
20 changes: 20 additions & 0 deletions packages/assemble-release-plan/src/index.test.ts
Expand Up @@ -95,6 +95,26 @@ describe("assemble-release-plan", () => {
expect(releases[1].newVersion).toEqual("1.0.1");
expect(releases[1].changesets).toEqual([]);
});
it("should assemble release plan without dependent through dev dependency", () => {
setup.updateDevDependency("pkg-b", "pkg-a", "^1.0.0");
setup.addChangeset({
id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
});

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

expect(releases.length).toEqual(2);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[0].newVersion).toEqual("2.0.0");
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].newVersion).toEqual("1.0.0");
});
it("should assemble release plan for linked packages", () => {
setup.addChangeset({
id: "just-some-umbrellas",
Expand Down
8 changes: 8 additions & 0 deletions packages/assemble-release-plan/src/test-utils.ts
Expand Up @@ -87,6 +87,14 @@ class FakeFullState {
}
pkg.packageJson.dependencies[pkgB] = version;
}
updateDevDependency(pkgA: string, pkgB: string, version: string) {
let pkg = this.packages.packages.find(a => a.packageJson.name === pkgA);
if (!pkg) throw new Error("no pkg");
if (!pkg.packageJson.devDependencies) {
pkg.packageJson.devDependencies = {};
}
pkg.packageJson.devDependencies[pkgB] = version;
}
updatePeerDep(pkgA: string, pkgB: string, version: string) {
let pkg = this.packages.packages.find(a => a.packageJson.name === pkgA);
if (!pkg) throw new Error("no pkg");
Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/index.ts
Expand Up @@ -7,7 +7,7 @@ const DEPENDENCY_TYPES = [
"optionalDependencies"
] as const;

export type VersionType = "major" | "minor" | "patch";
export type VersionType = "major" | "minor" | "patch" | "none";

export type DependencyType = typeof DEPENDENCY_TYPES[number];

Expand Down

0 comments on commit 011d57f

Please sign in to comment.