Socket
Socket
Sign inDemoInstall

@changesets/assemble-release-plan

Package Overview
Dependencies
58
Maintainers
3
Versions
40
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 5.2.1 to 5.2.2

20

CHANGELOG.md
# @changesets/assemble-release-plan
## 5.2.2
### Patch Changes
- [#949](https://github.com/changesets/changesets/pull/949) [`64585ea`](https://github.com/changesets/changesets/commit/64585ea4323c4cf51a23b0635990b568d1f58b2b) Thanks [@Andarist](https://github.com/Andarist), [@BPScott](https://github.com/BPScott)! - 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
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.
- Updated dependencies [[`8c08469`](https://github.com/changesets/changesets/commit/8c0846977597ddaf51aaeb35f1f0f9428bf8ba14)]:
- @changesets/types@5.2.0
- @changesets/get-dependents-graph@1.3.4
## 5.2.1

@@ -51,3 +69,3 @@

* [#751](https://github.com/changesets/changesets/pull/751) [`59c7ebc`](https://github.com/changesets/changesets/commit/59c7ebc7a5e75f69f5487e95a85cd1b7062ac39d) Thanks [@Rugvip](https://github.com/Rugvip)! - Fixed an issue where dependent packages would sometimes not get bumped properly when exiting prerelease mode.
- [#751](https://github.com/changesets/changesets/pull/751) [`59c7ebc`](https://github.com/changesets/changesets/commit/59c7ebc7a5e75f69f5487e95a85cd1b7062ac39d) Thanks [@Rugvip](https://github.com/Rugvip)! - Fixed an issue where dependent packages would sometimes not get bumped properly when exiting prerelease mode.

@@ -54,0 +72,0 @@ - [#703](https://github.com/changesets/changesets/pull/703) [`15c461d`](https://github.com/changesets/changesets/commit/15c461d5de94a274ccc8b33755a133a513339b0a) Thanks [@Andarist](https://github.com/Andarist)! - Fixed an issue with dependant packages being always bumped when their `*` dependency was bumped.

42

dist/assemble-release-plan.cjs.dev.js

@@ -133,3 +133,5 @@ 'use strict';

} of dependencyVersionRanges) {
if (shouldBumpMajor({
if (nextRelease.type === "none") {
continue;
} else if (shouldBumpMajor({
dependent,

@@ -144,23 +146,20 @@ depType,

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__default['default'].satisfies(incrementVersion(nextRelease, preInfo), versionRange))) {
switch (depType) {
case "dependencies":
case "optionalDependencies":
case "peerDependencies":
if (type !== "major" && type !== "minor") {
type = "patch";
}
} else if ((!releases.has(dependent) || releases.get(dependent).type === "none") && (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.updateInternalDependents === "always" || !semver__default['default'].satisfies(incrementVersion(nextRelease, preInfo), versionRange))) {
switch (depType) {
case "dependencies":
case "optionalDependencies":
case "peerDependencies":
if (type !== "major" && type !== "minor") {
type = "patch";
}
break;
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";
}
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";
}
}
}
}

@@ -180,6 +179,3 @@ }

};
}).filter(({
type
}) => type).forEach( // @ts-ignore - I don't know how to make typescript understand that the filter above guarantees this and I got sick of trying
({
}).filter(dependentItem => !!dependentItem.type).forEach(({
name,

@@ -186,0 +182,0 @@ type,

@@ -73,3 +73,3 @@ "use strict";

const dependencyVersionRanges = getDependencyVersionRanges(dependentPackage.packageJson, nextRelease);
for (const {depType: depType, versionRange: versionRange} of dependencyVersionRanges) if (shouldBumpMajor({
for (const {depType: depType, versionRange: versionRange} of dependencyVersionRanges) if ("none" !== nextRelease.type) if (shouldBumpMajor({
dependent: dependent,

@@ -99,3 +99,3 @@ depType: depType,

};
})).filter((({type: type}) => type)).forEach((({name: name, type: type, pkgJSON: pkgJSON}) => {
})).filter((dependentItem => !!dependentItem.type)).forEach((({name: name, type: type, pkgJSON: pkgJSON}) => {
updated = !0;

@@ -102,0 +102,0 @@ const existing = releases.get(name);

@@ -125,3 +125,5 @@ import semver, { inc, parse } from 'semver';

} of dependencyVersionRanges) {
if (shouldBumpMajor({
if (nextRelease.type === "none") {
continue;
} else if (shouldBumpMajor({
dependent,

@@ -136,23 +138,20 @@ depType,

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";
}
} 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;
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";
}
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";
}
}
}
}

@@ -172,6 +171,3 @@ }

};
}).filter(({
type
}) => type).forEach( // @ts-ignore - I don't know how to make typescript understand that the filter above guarantees this and I got sick of trying
({
}).filter(dependentItem => !!dependentItem.type).forEach(({
name,

@@ -178,0 +174,0 @@ type,

import { Config } from "@changesets/types";
import { Package } from "@manypkg/get-packages";
import { InternalRelease, PreInfo } from "./types";
export default function determineDependents({ releases, packagesByName, dependencyGraph, preInfo, config }: {
export default function determineDependents({ releases, packagesByName, dependencyGraph, preInfo, config, }: {
releases: Map<string, InternalRelease>;

@@ -6,0 +6,0 @@ packagesByName: Map<string, Package>;

{
"name": "@changesets/assemble-release-plan",
"version": "5.2.1",
"version": "5.2.2",
"description": "Reads changesets and adds information on dependents that need bumping",

@@ -12,4 +12,4 @@ "main": "dist/assemble-release-plan.cjs.js",

"@changesets/errors": "^0.1.4",
"@changesets/get-dependents-graph": "^1.3.3",
"@changesets/types": "^5.1.0",
"@changesets/get-dependents-graph": "^1.3.4",
"@changesets/types": "^5.2.0",
"@manypkg/get-packages": "^1.1.3",

@@ -16,0 +16,0 @@ "semver": "^5.4.1"

@@ -29,3 +29,3 @@ import { Linked } from "@changesets/types";

let releasingLinkedPackages = [...releases.values()].filter(
release =>
(release) =>
linkedPackages.includes(release.name) && release.type !== "none"

@@ -32,0 +32,0 @@ );

import semver from "semver";
import {
Release,
DependencyType,
PackageJSON,
VersionType,
Config
Config,
} from "@changesets/types";

@@ -30,3 +29,3 @@ import { Package } from "@manypkg/get-packages";

preInfo,
config
config,
}: {

@@ -55,3 +54,3 @@ releases: Map<string, InternalRelease>;

pkgDependents
.map(dependent => {
.map((dependent) => {
let type: VersionType | undefined;

@@ -71,3 +70,5 @@

for (const { depType, versionRange } of dependencyVersionRanges) {
if (
if (nextRelease.type === "none") {
continue;
} else if (
shouldBumpMajor({

@@ -82,36 +83,33 @@ dependent,

config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH
.onlyUpdatePeerDependentsWhenOutOfRange
.onlyUpdatePeerDependentsWhenOutOfRange,
})
) {
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";
}
}

@@ -128,35 +126,37 @@ }

type,
pkgJSON: dependentPackage.packageJson
pkgJSON: dependentPackage.packageJson,
};
})
.filter(({ type }) => type)
.forEach(
// @ts-ignore - I don't know how to make typescript understand that the filter above guarantees this and I got sick of trying
({ name, type, pkgJSON }: Release & { pkgJSON: PackageJSON }) => {
// At this point, we know if we are making a change
updated = true;
.filter(
(
dependentItem
): dependentItem is typeof dependentItem & { type: VersionType } =>
!!dependentItem.type
)
.forEach(({ name, type, pkgJSON }) => {
// At this point, we know if we are making a change
updated = true;
const existing = releases.get(name);
// For things that are being given a major bump, we check if we have already
// added them here. If we have, we update the existing item instead of pushing it on to search.
// It is safe to not add it to pkgsToSearch because it should have already been searched at the
// largest possible bump type.
const existing = releases.get(name);
// For things that are being given a major bump, we check if we have already
// added them here. If we have, we update the existing item instead of pushing it on to search.
// It is safe to not add it to pkgsToSearch because it should have already been searched at the
// largest possible bump type.
if (existing && type === "major" && existing.type !== "major") {
existing.type = "major";
if (existing && type === "major" && existing.type !== "major") {
existing.type = "major";
pkgsToSearch.push(existing);
} else {
let newDependent: InternalRelease = {
name,
type,
oldVersion: pkgJSON.version,
changesets: []
};
pkgsToSearch.push(existing);
} else {
let newDependent: InternalRelease = {
name,
type,
oldVersion: pkgJSON.version,
changesets: [],
};
pkgsToSearch.push(newDependent);
releases.set(name, newDependent);
}
pkgsToSearch.push(newDependent);
releases.set(name, newDependent);
}
);
});
}

@@ -183,3 +183,3 @@

"peerDependencies",
"optionalDependencies"
"optionalDependencies",
] as const;

@@ -203,3 +203,3 @@ const dependencyVersionRanges: {

dependencyRelease.oldVersion
: versionRange.replace(/^workspace:/, "")
: versionRange.replace(/^workspace:/, ""),
});

@@ -209,3 +209,3 @@ } else {

depType: type,
versionRange
versionRange,
});

@@ -224,3 +224,3 @@ }

preInfo,
onlyUpdatePeerDependentsWhenOutOfRange
onlyUpdatePeerDependentsWhenOutOfRange,
}: {

@@ -227,0 +227,0 @@ dependent: string;

@@ -15,3 +15,3 @@ // This function takes in changesets and returns one release per

changesets.forEach(changeset => {
changesets.forEach((changeset) => {
changeset.releases

@@ -34,3 +34,3 @@ // Filter out ignored packages because they should not trigger a release

oldVersion: pkg.packageJson.version,
changesets: [changeset.id]
changesets: [changeset.id],
};

@@ -37,0 +37,0 @@ } else {

@@ -11,3 +11,3 @@ import { incrementVersion } from "./increment";

changesets: [],
oldVersion: "1.0.0"
oldVersion: "1.0.0",
};

@@ -21,4 +21,4 @@

initialVersions: {},
changesets: []
}
changesets: [],
},
};

@@ -25,0 +25,0 @@

@@ -30,3 +30,3 @@ import { defaultConfig } from "@changesets/config";

oldVersion: "1.0.0",
changesets: ["strange-words-combine"]
changesets: ["strange-words-combine"],
});

@@ -42,3 +42,3 @@ });

{
tag: undefined
tag: undefined,
}

@@ -58,3 +58,3 @@ );

{
tag: "foo"
tag: "foo",
}

@@ -73,4 +73,4 @@ );

{ name: "pkg-c", type: "patch" },
{ name: "pkg-d", type: "major" }
]
{ name: "pkg-d", type: "major" },
],
});

@@ -98,3 +98,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -120,4 +120,4 @@

{ name: "pkg-b", type: "none" },
{ name: "pkg-c", type: "none" }
]
{ name: "pkg-c", type: "none" },
],
});

@@ -129,4 +129,4 @@ setup.addChangeset({

{ name: "pkg-b", type: "minor" },
{ name: "pkg-c", type: "major" }
]
{ name: "pkg-c", type: "major" },
],
});

@@ -138,4 +138,4 @@ setup.addChangeset({

{ name: "pkg-b", type: "none" },
{ name: "pkg-c", type: "none" }
]
{ name: "pkg-c", type: "none" },
],
});

@@ -168,3 +168,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -228,3 +228,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -249,3 +249,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -258,3 +258,3 @@

...defaultConfig,
bumpVersionsWithWorkspaceProtocolOnly: true
bumpVersionsWithWorkspaceProtocolOnly: true,
},

@@ -276,3 +276,3 @@ undefined

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -285,3 +285,3 @@

...defaultConfig,
bumpVersionsWithWorkspaceProtocolOnly: true
bumpVersionsWithWorkspaceProtocolOnly: true,
},

@@ -308,3 +308,3 @@ undefined

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -332,4 +332,4 @@

{ name: "pkg-a", type: "major" },
{ name: "pkg-c", type: "major" }
]
{ name: "pkg-c", type: "major" },
],
});

@@ -357,3 +357,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
releases: [{ name: "pkg-b", type: "none" }],
});

@@ -378,3 +378,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -397,3 +397,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -416,3 +416,3 @@

id: "nonsense-words-combine",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -436,7 +436,7 @@

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});
setup.addChangeset({
id: "small-dogs-sad",
releases: [{ name: "pkg-b", type: "minor" }]
releases: [{ name: "pkg-b", type: "minor" }],
});

@@ -448,3 +448,3 @@ const { releases } = assembleReleasePlan(

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -462,7 +462,7 @@ undefined

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});
setup.addChangeset({
id: "small-dogs-sad",
releases: [{ name: "pkg-b", type: "minor" }]
releases: [{ name: "pkg-b", type: "minor" }],
});

@@ -474,3 +474,3 @@ const { releases } = assembleReleasePlan(

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -491,7 +491,7 @@ undefined

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});
setup.addChangeset({
id: "small-dogs-sad",
releases: [{ name: "pkg-b", type: "minor" }]
releases: [{ name: "pkg-b", type: "minor" }],
});

@@ -503,3 +503,3 @@ const { releases } = assembleReleasePlan(

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -520,7 +520,7 @@ undefined

id: "big-cats-delight",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});
setup.addChangeset({
id: "small-dogs-sad",
releases: [{ name: "pkg-b", type: "minor" }]
releases: [{ name: "pkg-b", type: "minor" }],
});

@@ -532,3 +532,3 @@ const { releases } = assembleReleasePlan(

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -551,4 +551,4 @@ undefined

{ name: "pkg-a", type: "major" },
{ name: "pkg-b", type: "minor" }
]
{ name: "pkg-b", type: "minor" },
],
});

@@ -562,3 +562,3 @@

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -575,2 +575,20 @@ undefined

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", () => {

@@ -580,3 +598,3 @@ it("should assemble release plan for fixed packages", () => {

id: "just-some-umbrellas",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -589,3 +607,3 @@

...defaultConfig,
fixed: [["pkg-a", "pkg-b"]]
fixed: [["pkg-a", "pkg-b"]],
},

@@ -604,4 +622,4 @@ undefined

{ name: "pkg-b", type: "minor" },
{ name: "pkg-a", type: "patch" }
]
{ name: "pkg-a", type: "patch" },
],
});

@@ -616,3 +634,3 @@

...defaultConfig,
fixed: [["pkg-a", "pkg-b", "pkg-c"]]
fixed: [["pkg-a", "pkg-b", "pkg-c"]],
},

@@ -636,7 +654,7 @@ undefined

id: "just-some-umbrellas",
releases: [{ name: "pkg-b", type: "major" }]
releases: [{ name: "pkg-b", type: "major" }],
});
setup.addChangeset({
id: "totally-average-verbiage",
releases: [{ name: "pkg-d", type: "minor" }]
releases: [{ name: "pkg-d", type: "minor" }],
});

@@ -653,4 +671,4 @@

["pkg-a", "pkg-b"],
["pkg-c", "pkg-d"]
]
["pkg-c", "pkg-d"],
],
},

@@ -673,7 +691,7 @@ undefined

id: "just-some-umbrellas",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});
setup.addChangeset({
id: "totally-average-verbiage",
releases: [{ name: "pkg-d", type: "minor" }]
releases: [{ name: "pkg-d", type: "minor" }],
});

@@ -690,4 +708,4 @@

["pkg-a", "pkg-b"],
["pkg-c", "pkg-d"]
]
["pkg-c", "pkg-d"],
],
},

@@ -715,4 +733,4 @@ undefined

["pkg-a", "pkg-b"],
["pkg-c", "pkg-d"]
]
["pkg-c", "pkg-d"],
],
},

@@ -730,3 +748,3 @@ undefined

id: "some-id",
releases: [{ type: "minor", name: "pkg-a" }]
releases: [{ type: "minor", name: "pkg-a" }],
});

@@ -739,3 +757,3 @@

...defaultConfig,
fixed: [["pkg-a", "pkg-c"]]
fixed: [["pkg-a", "pkg-c"]],
},

@@ -748,12 +766,12 @@ undefined

name: "pkg-a",
newVersion: "1.1.0"
newVersion: "1.1.0",
},
{
name: "pkg-c",
newVersion: "1.1.0"
newVersion: "1.1.0",
},
{
name: "pkg-b",
newVersion: "2.0.0"
}
newVersion: "2.0.0",
},
]);

@@ -767,3 +785,3 @@ });

id: "just-some-umbrellas",
releases: [{ name: "pkg-b", type: "major" }]
releases: [{ name: "pkg-b", type: "major" }],
});

@@ -776,3 +794,3 @@

...defaultConfig,
linked: [["pkg-a", "pkg-b"]]
linked: [["pkg-a", "pkg-b"]],
},

@@ -791,4 +809,4 @@ undefined

{ name: "pkg-b", type: "minor" },
{ name: "pkg-a", type: "patch" }
]
{ name: "pkg-a", type: "patch" },
],
});

@@ -803,3 +821,3 @@

...defaultConfig,
linked: [["pkg-a", "pkg-b", "pkg-c"]]
linked: [["pkg-a", "pkg-b", "pkg-c"]],
},

@@ -823,7 +841,7 @@ undefined

id: "just-some-umbrellas",
releases: [{ name: "pkg-b", type: "major" }]
releases: [{ name: "pkg-b", type: "major" }],
});
setup.addChangeset({
id: "totally-average-verbiage",
releases: [{ name: "pkg-d", type: "minor" }]
releases: [{ name: "pkg-d", type: "minor" }],
});

@@ -840,4 +858,4 @@

["pkg-a", "pkg-b"],
["pkg-c", "pkg-d"]
]
["pkg-c", "pkg-d"],
],
},

@@ -861,4 +879,4 @@ undefined

["pkg-a", "pkg-b"],
["pkg-c", "pkg-d"]
]
["pkg-c", "pkg-d"],
],
},

@@ -875,3 +893,3 @@ undefined

id: "some-id",
releases: [{ type: "minor", name: "pkg-c" }]
releases: [{ type: "minor", name: "pkg-c" }],
});

@@ -884,3 +902,3 @@

...defaultConfig,
linked: [["pkg-a", "pkg-c"]]
linked: [["pkg-a", "pkg-c"]],
},

@@ -893,12 +911,12 @@ undefined

name: "pkg-a",
newVersion: "1.1.0"
newVersion: "1.1.0",
},
{
name: "pkg-c",
newVersion: "1.1.0"
newVersion: "1.1.0",
},
{
name: "pkg-b",
newVersion: "2.0.0"
}
newVersion: "2.0.0",
},
]);

@@ -914,3 +932,3 @@ });

{
...defaultConfig
...defaultConfig,
},

@@ -921,3 +939,3 @@ {

initialVersions: {},
mode: "exit"
mode: "exit",
}

@@ -940,3 +958,3 @@ );

{
...defaultConfig
...defaultConfig,
},

@@ -948,5 +966,5 @@ {

"pkg-a": "1.0.0",
"pkg-b": "1.0.0"
"pkg-b": "1.0.0",
},
mode: "exit"
mode: "exit",
}

@@ -972,3 +990,3 @@ );

...defaultConfig,
ignore: ["pkg-b"]
ignore: ["pkg-b"],
},

@@ -980,5 +998,5 @@ {

"pkg-a": "1.0.0",
"pkg-b": "1.0.0"
"pkg-b": "1.0.0",
},
mode: "exit"
mode: "exit",
}

@@ -1001,5 +1019,5 @@ );

name: "pkg-a",
type: "major"
}
]
type: "major",
},
],
});

@@ -1014,5 +1032,5 @@ setup.updatePackage("pkg-a", "2.0.0-next.0");

name: "pkg-a",
type: "minor"
}
]
type: "minor",
},
],
});

@@ -1023,3 +1041,3 @@ const { releases } = assembleReleasePlan(

{
...defaultConfig
...defaultConfig,
},

@@ -1032,5 +1050,5 @@ {

"pkg-b": "1.0.0",
"pkg-c": "1.0.0"
"pkg-c": "1.0.0",
},
mode: "pre"
mode: "pre",
}

@@ -1051,3 +1069,3 @@ );

id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
releases: [{ name: "pkg-b", type: "none" }],
});

@@ -1072,3 +1090,3 @@

id: "big-cats-delight",
releases: [{ name: "pkg-b", type: "none" }]
releases: [{ name: "pkg-b", type: "none" }],
});

@@ -1106,2 +1124,104 @@

});
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("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");
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");
});
});
});

@@ -1138,3 +1258,3 @@

id: "stuff-and-nonsense",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -1160,3 +1280,3 @@

id: "stuff-and-nonsense",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -1211,3 +1331,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "none" }]
releases: [{ name: "pkg-a", type: "none" }],
});

@@ -1244,3 +1364,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -1265,3 +1385,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -1287,3 +1407,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "none" }]
releases: [{ name: "pkg-a", type: "none" }],
});

@@ -1320,3 +1440,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -1341,3 +1461,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "major" }]
releases: [{ name: "pkg-a", type: "major" }],
});

@@ -1364,3 +1484,3 @@

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -1378,11 +1498,11 @@

name: "pkg-a",
newVersion: "1.1.0"
newVersion: "1.1.0",
});
expect(releases[1]).toMatchObject({
name: "pkg-b",
newVersion: "2.0.0"
newVersion: "2.0.0",
});
expect(releases[2]).toMatchObject({
name: "pkg-c",
newVersion: "1.0.1"
newVersion: "1.0.1",
});

@@ -1396,3 +1516,3 @@ });

id: "anyway-the-windblows",
releases: [{ name: "pkg-a", type: "minor" }]
releases: [{ name: "pkg-a", type: "minor" }],
});

@@ -1406,4 +1526,4 @@ let { releases } = assembleReleasePlan(

...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH,
onlyUpdatePeerDependentsWhenOutOfRange: true
}
onlyUpdatePeerDependentsWhenOutOfRange: true,
},
},

@@ -1416,7 +1536,9 @@ undefined

});
});
describe("updateInternalDependents: always", () => {
it("should bump a direct dependent when a dependency package gets bumped", () => {
setup.updateDependency("pkg-b", "pkg-a", "^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" }],
});

@@ -1430,4 +1552,4 @@ let { releases } = assembleReleasePlan(

...defaultConfig.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH,
updateInternalDependents: "always"
}
onlyUpdatePeerDependentsWhenOutOfRange: true,
},
},

@@ -1439,61 +1561,7 @@ undefined

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.1");
expect(releases[1].newVersion).toEqual("2.0.0");
});
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 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,
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");
});
});

@@ -1500,0 +1568,0 @@

@@ -6,3 +6,3 @@ import {

PreState,
PackageGroup
PackageGroup,
} from "@changesets/types";

@@ -49,3 +49,3 @@ import determineDependents from "./determine-dependents";

.replace(/\.\d{3}Z$/, "")
.replace(/[^\d]/g, "")
.replace(/[^\d]/g, ""),
};

@@ -143,5 +143,6 @@

prereleaseTemplate: null,
useCalculatedVersion: (config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH as any)
.useCalculatedVersionForSnapshots
}
useCalculatedVersion: (
config.___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH as any
).useCalculatedVersionForSnapshots,
},
};

@@ -156,3 +157,3 @@ const refinedSnapshot: SnapshotReleaseParameters | undefined =

let packagesByName = new Map(
packages.packages.map(x => [x.packageJson.name, x])
packages.packages.map((x) => [x.packageJson.name, x])
);

@@ -184,3 +185,3 @@

bumpVersionsWithWorkspaceProtocolOnly:
refinedConfig.bumpVersionsWithWorkspaceProtocolOnly
refinedConfig.bumpVersionsWithWorkspaceProtocolOnly,
});

@@ -196,3 +197,3 @@

preInfo,
config: refinedConfig
config: refinedConfig,
});

@@ -228,3 +229,3 @@

oldVersion: pkg.packageJson.version,
changesets: []
changesets: [],
});

@@ -251,3 +252,3 @@ } else if (

changesets: relevantChangesets,
releases: [...releases.values()].map(incompleteRelease => {
releases: [...releases.values()].map((incompleteRelease) => {
return {

@@ -262,6 +263,6 @@ ...incompleteRelease,

)
: getNewVersion(incompleteRelease, preInfo)
: getNewVersion(incompleteRelease, preInfo),
};
}),
preState: preInfo?.state
preState: preInfo?.state,
};

@@ -282,3 +283,5 @@ }

if (
ignored.find(ignoredPackageName => ignoredPackageName === release.name)
ignored.find(
(ignoredPackageName) => ignoredPackageName === release.name
)
) {

@@ -303,3 +306,5 @@ ignoredPackages.push(release.name);

let usedChangesetIds = new Set(preState.changesets);
return changesets.filter(changeset => !usedChangesetIds.has(changeset.id));
return changesets.filter(
(changeset) => !usedChangesetIds.has(changeset.id)
);
}

@@ -336,6 +341,6 @@

...preState,
changesets: changesets.map(changeset => changeset.id),
changesets: changesets.map((changeset) => changeset.id),
initialVersions: {
...preState.initialVersions
}
...preState.initialVersions,
},
};

@@ -373,3 +378,3 @@

state: updatedPreState,
preVersions
preVersions,
};

@@ -376,0 +381,0 @@ }

@@ -15,3 +15,4 @@ import { Config } from "@changesets/types";

let releasingFixedPackages = [...releases.values()].filter(
release => fixedPackages.includes(release.name) && release.type !== "none"
(release) =>
fixedPackages.includes(release.name) && release.type !== "none"
);

@@ -40,3 +41,3 @@

oldVersion: highestVersion,
changesets: []
changesets: [],
});

@@ -43,0 +44,0 @@ continue;

@@ -6,3 +6,3 @@ import { NewChangeset, Release, VersionType } from "@changesets/types";

name,
version
version,
}: {

@@ -15,5 +15,5 @@ name: string;

name,
version
version,
},
dir: "this-shouldn't-matter"
dir: "this-shouldn't-matter",
};

@@ -35,3 +35,3 @@ }

summary,
releases
releases,
};

@@ -42,3 +42,3 @@ }

name,
type
type,
}: {

@@ -56,12 +56,12 @@ name: string;

name: "root",
version: "0.0.0"
version: "0.0.0",
},
dir: "/"
dir: "/",
},
packages: [getPackage({ name: "pkg-a", version: "1.0.0" })],
tool: "yarn" as const
tool: "yarn" as const,
},
changesets: [
getChangeset({ releases: [getRelease({ name: "pkg-a", type: "patch" })] })
]
getChangeset({ releases: [getRelease({ name: "pkg-a", type: "patch" })] }),
],
});

@@ -87,3 +87,3 @@

let changeset = getChangeset(data);
if (this.changesets.find(c => c.id === changeset.id)) {
if (this.changesets.find((c) => c.id === changeset.id)) {
throw new Error(

@@ -97,3 +97,3 @@ `tried to add a second changeset with same id: ${changeset.id}`

updateDependency(pkgA: string, pkgB: string, versionRange: string) {
let pkg = this.packages.packages.find(a => a.packageJson.name === pkgA);
let pkg = this.packages.packages.find((a) => a.packageJson.name === pkgA);
if (!pkg) throw new Error(`No "${pkgA}" package`);

@@ -106,3 +106,3 @@ if (!pkg.packageJson.dependencies) {

updateDevDependency(pkgA: string, pkgB: string, versionRange: string) {
let pkg = this.packages.packages.find(a => a.packageJson.name === pkgA);
let pkg = this.packages.packages.find((a) => a.packageJson.name === pkgA);
if (!pkg) throw new Error(`No "${pkgA}" package`);

@@ -115,3 +115,3 @@ if (!pkg.packageJson.devDependencies) {

updatePeerDependency(pkgA: string, pkgB: string, versionRange: string) {
let pkg = this.packages.packages.find(a => a.packageJson.name === pkgA);
let pkg = this.packages.packages.find((a) => a.packageJson.name === pkgA);
if (!pkg) throw new Error(`No "${pkgA}" package`);

@@ -128,3 +128,3 @@ if (!pkg.packageJson.peerDependencies) {

this.packages.packages.find(
c => c.packageJson.name === pkg.packageJson.name
(c) => c.packageJson.name === pkg.packageJson.name
)

@@ -139,3 +139,3 @@ ) {

updatePackage(name: string, version: string) {
let pkg = this.packages.packages.find(c => c.packageJson.name === name);
let pkg = this.packages.packages.find((c) => c.packageJson.name === name);
if (!pkg) {

@@ -142,0 +142,0 @@ throw new Error(

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc