Skip to content

Commit

Permalink
feat(version): bump prerelease versions from conventional commits (le…
Browse files Browse the repository at this point in the history
  • Loading branch information
amorscher committed Oct 10, 2022
1 parent c455b1c commit 87c923d
Show file tree
Hide file tree
Showing 13 changed files with 130 additions and 5 deletions.
23 changes: 23 additions & 0 deletions commands/version/__tests__/version-conventional-commits.test.js
Expand Up @@ -91,6 +91,29 @@ describe("--conventional-commits", () => {
});
});

it("should call recommended version with conventionalBumpprerelease set", async () => {
prereleaseVersionBumps.forEach((bump) => recommendVersion.mockResolvedValueOnce(bump));
const cwd = await initFixture("prerelease-independent");

await lernaVersion(cwd)("--conventional-commits", "--conventional-prerelease","--conventional-bumpprerelease");

prereleaseVersionBumps.forEach((version, name) => {
const prereleaseId = semver.prerelease(version)[0];
expect(recommendVersion).toHaveBeenCalledWith(expect.objectContaining({ name }), "independent", {
changelogPreset: undefined,
rootPath: cwd,
tagPrefix: "v",
prereleaseId,
conventionalBumpprerelease:true
});
expect(updateChangelog).toHaveBeenCalledWith(
expect.objectContaining({ name, version }),
"independent",
{ changelogPreset: undefined, rootPath: cwd, tagPrefix: "v" }
);
});
});

it("should graduate prerelease version bumps and generate CHANGELOG", async () => {
versionBumps.forEach((bump) => recommendVersion.mockResolvedValueOnce(bump));
const cwd = await initFixture("prerelease-independent");
Expand Down
4 changes: 4 additions & 0 deletions commands/version/command.js
Expand Up @@ -32,6 +32,10 @@ exports.builder = (yargs, composed) => {
describe: "Version changed packages as prereleases when using --conventional-commits.",
// type must remain ambiguous because it is overloaded (boolean _or_ string _or_ array)
},
"conventional-bumpprerelease": {
describe: "Bumps a prerelease versions if convetional commits require it.",
type:"boolean"
},
"changelog-preset": {
describe: "Custom conventional-changelog preset.",
type: "string",
Expand Down
3 changes: 2 additions & 1 deletion commands/version/index.js
Expand Up @@ -367,7 +367,7 @@ class VersionCommand extends Command {

recommendVersions(resolvePrereleaseId) {
const independentVersions = this.project.isIndependent();
const { changelogPreset, conventionalGraduate } = this.options;
const { changelogPreset, conventionalGraduate,conventionalBumpprerelease } = this.options;
const rootPath = this.project.manifest.location;
const type = independentVersions ? "independent" : "fixed";
const prereleasePackageNames = this.getPrereleasePackageNames();
Expand All @@ -394,6 +394,7 @@ class VersionCommand extends Command {
rootPath,
tagPrefix: this.tagPrefix,
prereleaseId: getPrereleaseId(node),
conventionalBumpprerelease
})
)
);
Expand Down
@@ -0,0 +1,8 @@
{
"command": {
"publish": {
"conventionalCommits": true
}
},
"version": "independent"
}
@@ -0,0 +1,5 @@
{
"name": "conventional-commits-independent",
"repository": "lerna/conventional-commits-independent",
"version": "0.0.0-root"
}
Empty file.
@@ -0,0 +1,5 @@
{
"name": "package-1",
"repository": "lerna/conventional-commits-independent",
"version": "1.0.0-alpha.0"
}
Empty file.
@@ -0,0 +1,8 @@
{
"name": "package-2",
"repository": "lerna/conventional-commits-independent",
"version": "1.0.0-beta.0",
"dependencies": {
"package-1": "^1.0.0"
}
}
Empty file.
@@ -0,0 +1,8 @@
{
"name": "package-3",
"repository": "lerna/conventional-commits-independent",
"version": "1.0.0-beta.0",
"dependencies": {
"package-1": "^1.0.0"
}
}
63 changes: 63 additions & 0 deletions core/conventional-commits/__tests__/conventional-commits.test.js
Expand Up @@ -95,6 +95,69 @@ describe("conventional-commits", () => {
expect(bump2).toBe("1.1.0-beta.0");
});

it("returns package-specific version bumps from prereleases with prereleaseId", async () => {
const cwd = await initFixture("prerelease-independent");
const [pkg1, pkg2, pkg3] = await getPackages(cwd);
const opts = { changelogPreset: "angular" };

// make a change in package-1, package-2 and package-3
await pkg1.set("changed", 1).serialize();
await pkg2.set("changed", 2).serialize();
await pkg3.set("changed", 3).serialize();

await gitAdd(cwd, pkg1.manifestLocation);
await gitCommit(cwd, "fix: changed 1");

await gitAdd(cwd, pkg2.manifestLocation);
await gitCommit(cwd, "feat: changed 2");

await gitAdd(cwd, pkg3.manifestLocation);
await gitCommit(cwd, "feat!: changed\n\nBREAKING CHANGE: changed");

const [bump1, bump2, bump3] = await Promise.all([
recommendVersion(pkg1, "independent", Object.assign(opts, { prereleaseId: "alpha",conventionalBumpprerelease:true})),
recommendVersion(pkg2, "independent", Object.assign(opts, { prereleaseId: "beta",conventionalBumpprerelease:true })),
recommendVersion(pkg3, "independent", Object.assign(opts, { prereleaseId: "beta",conventionalBumpprerelease:true })),
]);

// all versions should be bumped
expect(bump1).toBe("1.0.1-alpha.0");
expect(bump2).toBe("1.1.0-beta.0");
expect(bump3).toBe("2.0.0-beta.0");

});

it("returns package-specific prerelease bumps from prereleases with prereleaseId", async () => {
const cwd = await initFixture("prerelease-independent");
const [pkg1, pkg2, pkg3] = await getPackages(cwd);
const opts = { changelogPreset: "angular" };

// make a change in package-1, package-2 and package-3
await pkg1.set("changed", 1).serialize();
await pkg2.set("changed", 2).serialize();
await pkg3.set("changed", 3).serialize();

await gitAdd(cwd, pkg1.manifestLocation);
await gitCommit(cwd, "fix: changed 1");

await gitAdd(cwd, pkg2.manifestLocation);
await gitCommit(cwd, "feat: changed 2");

await gitAdd(cwd, pkg3.manifestLocation);
await gitCommit(cwd, "feat!: changed\n\nBREAKING CHANGE: changed");

const [bump1, bump2, bump3] = await Promise.all([
recommendVersion(pkg1, "independent", Object.assign(opts, { prereleaseId: "alpha"})),
recommendVersion(pkg2, "independent", Object.assign(opts, { prereleaseId: "beta" })),
recommendVersion(pkg3, "independent", Object.assign(opts, { prereleaseId: "beta"})),
]);

// we just have a bump in the prerelease
expect(bump1).toBe("1.0.0-alpha.1");
expect(bump2).toBe("1.0.0-beta.1");
expect(bump3).toBe("1.0.0-beta.1");
});

it("falls back to patch bumps for non-bumping commit types", async () => {
const cwd = await initFixture("independent");
const [pkg1, pkg2] = await getPackages(cwd);
Expand Down
8 changes: 4 additions & 4 deletions core/conventional-commits/lib/recommend-version.js
Expand Up @@ -12,7 +12,7 @@ module.exports.recommendVersion = recommendVersion;
* @param {import("..").VersioningStrategy} type
* @param {import("..").BaseChangelogOptions & { prereleaseId?: string }} commandOptions
*/
function recommendVersion(pkg, type, { changelogPreset, rootPath, tagPrefix, prereleaseId }) {
function recommendVersion(pkg, type, { changelogPreset, rootPath, tagPrefix, prereleaseId,conventionalBumpprerelease }) {
log.silly(type, "for %s at %s", pkg.name, pkg.location);

const options = {
Expand All @@ -26,8 +26,8 @@ function recommendVersion(pkg, type, { changelogPreset, rootPath, tagPrefix, pre
options.tagPrefix = tagPrefix;
}

const shouldBumpPrerelease = (releaseType, version) => {
if (!semver.prerelease(version)) {
const shouldBumpPrerelease = (releaseType, version,bumpPrerelease) => {
if (!semver.prerelease(version) || bumpPrerelease) {
return true;
}
switch (releaseType) {
Expand Down Expand Up @@ -59,7 +59,7 @@ function recommendVersion(pkg, type, { changelogPreset, rootPath, tagPrefix, pre
let releaseType = data.releaseType || "patch";

if (prereleaseId) {
const shouldBump = shouldBumpPrerelease(releaseType, pkg.version);
const shouldBump = shouldBumpPrerelease(releaseType, pkg.version,conventionalBumpprerelease);
const prereleaseType = shouldBump ? `pre${releaseType}` : "prerelease";
log.verbose(type, "increment %s by %s", pkg.version, prereleaseType);
resolve(semver.inc(pkg.version, prereleaseType, prereleaseId));
Expand Down

0 comments on commit 87c923d

Please sign in to comment.