Skip to content

Commit c84899f

Browse files
authored
Merge branch 'master' into issue/137-snapshot-release
2 parents bc5fe67 + 9f9c61f commit c84899f

9 files changed

Lines changed: 300 additions & 22 deletions

File tree

‎.changeset/gorgeous-insects-cheer.md‎

Lines changed: 0 additions & 5 deletions
This file was deleted.

‎packages/apply-release-plan/CHANGELOG.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @changesets/apply-release-plan
22

3+
## 3.0.3
4+
5+
### Patch Changes
6+
7+
- [`90f3b65`](https://github.com/atlassian/changesets/commit/90f3b651f9c0403920b17801b84a2fbe6f190e2a) [#373](https://github.com/atlassian/changesets/pull/373) Thanks [@Blasz](https://github.com/Blasz)! - Fix patch bumped dependencies not being updated in dependents package.json when leaving semver range with `updateInternalDependencies` set to minor.
8+
39
## 3.0.2
410

511
### Patch Changes

‎packages/apply-release-plan/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@changesets/apply-release-plan",
3-
"version": "3.0.2",
3+
"version": "3.0.3",
44
"description": "Takes a release plan and applies it to packages",
55
"main": "dist/apply-release-plan.cjs.js",
66
"module": "dist/apply-release-plan.esm.js",

‎packages/apply-release-plan/src/get-changelog-entry.ts‎

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ChangelogFunctions, NewChangesetWithCommit } from "@changesets/types";
22

33
import { ModCompWithPackage } from "@changesets/types";
44
import startCase from "lodash.startcase";
5-
import { shouldUpdateInternalDependencies } from "./utils";
5+
import { shouldUpdateInternalDependency } from "./utils";
66

77
type ChangelogLines = {
88
major: Array<Promise<string>>;
@@ -52,15 +52,21 @@ export default async function generateMarkdown(
5252
});
5353

5454
let dependentReleases = releases.filter(rel => {
55-
const isDependency =
56-
release.packageJson.dependencies &&
57-
release.packageJson.dependencies[rel.name];
58-
const isPeerDependency =
59-
release.packageJson.peerDependencies &&
60-
release.packageJson.peerDependencies[rel.name];
55+
const dependencyVersionRange = release.packageJson.dependencies
56+
? release.packageJson.dependencies[rel.name]
57+
: null;
58+
const peerDependencyVersionRange = release.packageJson.peerDependencies
59+
? release.packageJson.peerDependencies[rel.name]
60+
: null;
61+
62+
const versionRange = dependencyVersionRange || peerDependencyVersionRange;
6163
return (
62-
(isDependency || isPeerDependency) &&
63-
shouldUpdateInternalDependencies(updateInternalDependencies, rel.type)
64+
versionRange &&
65+
shouldUpdateInternalDependency(
66+
updateInternalDependencies,
67+
{ type: rel.type, version: rel.newVersion },
68+
versionRange
69+
)
6470
);
6571
});
6672

‎packages/apply-release-plan/src/index.test.ts‎

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,84 @@ describe("apply release plan", () => {
422422
}
423423
});
424424
});
425+
it("should still update min version ranges of patch bumped internal dependencies that have left semver range", async () => {
426+
let { changedFiles } = await testSetup(
427+
"internal-dependencies",
428+
{
429+
changesets: [
430+
{
431+
id: "quick-lions-devour",
432+
summary: "Hey, let's have fun with testing!",
433+
releases: [
434+
{ name: "pkg-a", type: "patch" },
435+
{ name: "pkg-b", type: "patch" },
436+
{ name: "pkg-c", type: "patch" }
437+
]
438+
}
439+
],
440+
releases: [
441+
{
442+
name: "pkg-a",
443+
type: "patch",
444+
oldVersion: "1.0.3",
445+
newVersion: "1.0.4",
446+
changesets: ["quick-lions-devour"]
447+
},
448+
{
449+
name: "pkg-b",
450+
type: "none",
451+
oldVersion: "1.2.0",
452+
newVersion: "1.2.0",
453+
changesets: ["quick-lions-devour"]
454+
},
455+
{
456+
name: "pkg-c",
457+
type: "patch",
458+
oldVersion: "2.0.0",
459+
newVersion: "2.0.1",
460+
changesets: ["quick-lions-devour"]
461+
}
462+
],
463+
preState: undefined
464+
},
465+
{
466+
changelog: false,
467+
commit: false,
468+
linked: [],
469+
access: "restricted",
470+
baseBranch: "master",
471+
updateInternalDependencies
472+
}
473+
);
474+
let pkgPathA = changedFiles.find(a =>
475+
a.endsWith(`pkg-a${path.sep}package.json`)
476+
);
477+
let pkgPathB = changedFiles.find(b =>
478+
b.endsWith(`pkg-b${path.sep}package.json`)
479+
);
480+
481+
if (!pkgPathA || !pkgPathB) {
482+
throw new Error(`could not find an updated package json`);
483+
}
484+
let pkgJSONA = await fs.readJSON(pkgPathA);
485+
let pkgJSONB = await fs.readJSON(pkgPathB);
486+
487+
expect(pkgJSONA).toMatchObject({
488+
name: "pkg-a",
489+
version: "1.0.4",
490+
dependencies: {
491+
"pkg-b": "~1.2.0"
492+
}
493+
});
494+
expect(pkgJSONB).toMatchObject({
495+
name: "pkg-b",
496+
version: "1.2.0",
497+
dependencies: {
498+
"pkg-c": "2.0.1",
499+
"pkg-a": "^1.0.4"
500+
}
501+
});
502+
});
425503
it("should update min version ranges of minor bumped internal dependencies", async () => {
426504
let { changedFiles } = await testSetup(
427505
"internal-dependencies",
@@ -635,6 +713,84 @@ describe("apply release plan", () => {
635713
}
636714
});
637715
});
716+
it("should still update min version ranges of patch bumped internal dependencies that have left semver range", async () => {
717+
let { changedFiles } = await testSetup(
718+
"internal-dependencies",
719+
{
720+
changesets: [
721+
{
722+
id: "quick-lions-devour",
723+
summary: "Hey, let's have fun with testing!",
724+
releases: [
725+
{ name: "pkg-a", type: "patch" },
726+
{ name: "pkg-b", type: "patch" },
727+
{ name: "pkg-c", type: "patch" }
728+
]
729+
}
730+
],
731+
releases: [
732+
{
733+
name: "pkg-a",
734+
type: "patch",
735+
oldVersion: "1.0.3",
736+
newVersion: "1.0.4",
737+
changesets: ["quick-lions-devour"]
738+
},
739+
{
740+
name: "pkg-b",
741+
type: "patch",
742+
oldVersion: "1.2.0",
743+
newVersion: "1.2.1",
744+
changesets: ["quick-lions-devour"]
745+
},
746+
{
747+
name: "pkg-c",
748+
type: "patch",
749+
oldVersion: "2.0.0",
750+
newVersion: "2.0.1",
751+
changesets: ["quick-lions-devour"]
752+
}
753+
],
754+
preState: undefined
755+
},
756+
{
757+
changelog: false,
758+
commit: false,
759+
linked: [],
760+
access: "restricted",
761+
baseBranch: "master",
762+
updateInternalDependencies
763+
}
764+
);
765+
let pkgPathA = changedFiles.find(a =>
766+
a.endsWith(`pkg-a${path.sep}package.json`)
767+
);
768+
let pkgPathB = changedFiles.find(b =>
769+
b.endsWith(`pkg-b${path.sep}package.json`)
770+
);
771+
772+
if (!pkgPathA || !pkgPathB) {
773+
throw new Error(`could not find an updated package json`);
774+
}
775+
let pkgJSONA = await fs.readJSON(pkgPathA);
776+
let pkgJSONB = await fs.readJSON(pkgPathB);
777+
778+
expect(pkgJSONA).toMatchObject({
779+
name: "pkg-a",
780+
version: "1.0.4",
781+
dependencies: {
782+
"pkg-b": "~1.2.0"
783+
}
784+
});
785+
expect(pkgJSONB).toMatchObject({
786+
name: "pkg-b",
787+
version: "1.2.1",
788+
dependencies: {
789+
"pkg-c": "2.0.1",
790+
"pkg-a": "^1.0.3"
791+
}
792+
});
793+
});
638794
it("should update min version ranges of minor bumped internal dependencies", async () => {
639795
let { changedFiles } = await testSetup(
640796
"internal-dependencies",
@@ -1198,6 +1354,99 @@ describe("apply release plan", () => {
11981354
11991355
- Hey, let's have fun with testing!`);
12001356
});
1357+
1358+
it("should still add updated dependencies line for dependencies that have a bump type less than the minimum internal bump range but leave semver range", async () => {
1359+
let { changedFiles } = await testSetup(
1360+
"internal-dependencies",
1361+
{
1362+
changesets: [
1363+
{
1364+
id: "quick-lions-devour",
1365+
summary: "Hey, let's have fun with testing!",
1366+
releases: [
1367+
{ name: "pkg-a", type: "patch" },
1368+
{ name: "pkg-b", type: "patch" },
1369+
{ name: "pkg-c", type: "patch" }
1370+
]
1371+
}
1372+
],
1373+
releases: [
1374+
{
1375+
name: "pkg-a",
1376+
type: "patch",
1377+
oldVersion: "1.0.3",
1378+
newVersion: "1.0.4",
1379+
changesets: ["quick-lions-devour"]
1380+
},
1381+
{
1382+
name: "pkg-b",
1383+
type: "patch",
1384+
oldVersion: "1.2.0",
1385+
newVersion: "1.2.1",
1386+
changesets: ["quick-lions-devour"]
1387+
},
1388+
{
1389+
name: "pkg-c",
1390+
type: "patch",
1391+
oldVersion: "2.0.0",
1392+
newVersion: "2.0.1",
1393+
changesets: ["quick-lions-devour"]
1394+
}
1395+
],
1396+
preState: undefined
1397+
},
1398+
{
1399+
changelog: [
1400+
path.resolve(__dirname, "test-utils/simple-get-changelog-entry"),
1401+
null
1402+
],
1403+
commit: false,
1404+
linked: [],
1405+
access: "restricted",
1406+
baseBranch: "master",
1407+
updateInternalDependencies: "minor"
1408+
}
1409+
);
1410+
1411+
let readmePath = changedFiles.find(a =>
1412+
a.endsWith(`pkg-a${path.sep}CHANGELOG.md`)
1413+
);
1414+
let readmePathB = changedFiles.find(a =>
1415+
a.endsWith(`pkg-b${path.sep}CHANGELOG.md`)
1416+
);
1417+
let readmePathC = changedFiles.find(a =>
1418+
a.endsWith(`pkg-c${path.sep}CHANGELOG.md`)
1419+
);
1420+
1421+
if (!readmePath || !readmePathB || !readmePathC)
1422+
throw new Error(`could not find an updated changelog`);
1423+
let readme = await fs.readFile(readmePath, "utf-8");
1424+
let readmeB = await fs.readFile(readmePathB, "utf-8");
1425+
let readmeC = await fs.readFile(readmePathC, "utf-8");
1426+
1427+
expect(readme.trim()).toEqual(outdent`# pkg-a
1428+
1429+
## 1.0.4
1430+
### Patch Changes
1431+
1432+
- Hey, let's have fun with testing!`);
1433+
1434+
expect(readmeB.trim()).toEqual(outdent`# pkg-b
1435+
1436+
## 1.2.1
1437+
### Patch Changes
1438+
1439+
- Hey, let's have fun with testing!
1440+
- Updated dependencies [undefined]
1441+
1442+
1443+
expect(readmeC.trim()).toEqual(outdent`# pkg-c
1444+
1445+
## 2.0.1
1446+
### Patch Changes
1447+
1448+
- Hey, let's have fun with testing!`);
1449+
});
12011450
});
12021451
describe("should error and not write if", () => {
12031452
// This is skipped as *for now* we are assuming we have been passed

‎packages/apply-release-plan/src/utils.ts‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* Shared utility functions and business logic
33
*/
4+
import semver from "semver";
45
import { VersionType } from "@changesets/types";
56

67
const bumpTypes = ["none", "patch", "minor", "major"];
@@ -14,10 +15,16 @@ function getBumpLevel(type: VersionType) {
1415
return level;
1516
}
1617

17-
export function shouldUpdateInternalDependencies(
18+
export function shouldUpdateInternalDependency(
1819
minReleaseType: "patch" | "minor",
19-
releaseType: VersionType
20+
release: { version: string; type: VersionType },
21+
depVersionRange: string
2022
) {
23+
if (!semver.satisfies(release.version, depVersionRange)) {
24+
// Dependencies leaving semver range should always be updated regardless of bump type
25+
return true;
26+
}
27+
2128
const minLevel = getBumpLevel(minReleaseType);
22-
return getBumpLevel(releaseType) >= minLevel;
29+
return getBumpLevel(release.type) >= minLevel;
2330
}

‎packages/apply-release-plan/src/version-package.ts‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "@changesets/types";
66
import getVersionRangeType from "@changesets/get-version-range-type";
77
import { Range } from "semver";
8-
import { shouldUpdateInternalDependencies } from "./utils";
8+
import { shouldUpdateInternalDependency } from "./utils";
99

1010
const DEPENDENCY_TYPES = [
1111
"dependencies",
@@ -36,7 +36,11 @@ export default function versionPackage(
3636
!depCurrentVersion ||
3737
depCurrentVersion.startsWith("file:") ||
3838
depCurrentVersion.startsWith("link:") ||
39-
!shouldUpdateInternalDependencies(updateInternalDependencies, type)
39+
!shouldUpdateInternalDependency(
40+
updateInternalDependencies,
41+
{ version, type },
42+
depCurrentVersion
43+
)
4044
)
4145
continue;
4246
const usesWorkspaceRange = depCurrentVersion.startsWith("workspace:");

0 commit comments

Comments
 (0)