From ad8193828cc8be32106790c692eda12c02a6c089 Mon Sep 17 00:00:00 2001 From: amorscher Date: Sun, 9 Oct 2022 23:15:41 +0200 Subject: [PATCH 1/3] feat(version): bump prerelease versions from conventional commits (#2536) --- commands/version/README.md | 16 ++++ .../version-conventional-commits.test.js | 27 +++++++ commands/version/command.js | 4 + commands/version/index.js | 3 +- .../prerelease-independent/lerna.json | 8 ++ .../prerelease-independent/package.json | 5 ++ .../packages/package-1/CHANGELOG.md | 0 .../packages/package-1/package.json | 5 ++ .../packages/package-2/CHANGELOG.md | 0 .../packages/package-2/package.json | 8 ++ .../packages/package-3/CHANGELOG.md | 0 .../packages/package-3/package.json | 8 ++ .../__tests__/conventional-commits.test.js | 74 +++++++++++++++++++ .../lib/recommend-version.js | 12 ++- 14 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/lerna.json create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/package.json create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/CHANGELOG.md create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/package.json create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/CHANGELOG.md create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/package.json create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/CHANGELOG.md create mode 100644 core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/package.json diff --git a/commands/version/README.md b/commands/version/README.md index ce303e30e4..44712c1f39 100644 --- a/commands/version/README.md +++ b/commands/version/README.md @@ -55,6 +55,7 @@ Running `lerna version --conventional-commits` without the above flags will rele - [`--conventional-commits`](#--conventional-commits) - [`--conventional-graduate`](#--conventional-graduate) - [`--conventional-prerelease`](#--conventional-prerelease) + - [`--conventional-bumpprerelease`](#--conventional-bumpprerelease) - [`--create-release `](#--create-release-type) - [`--exact`](#--exact) - [`--force-publish`](#--force-publish) @@ -201,6 +202,21 @@ lerna version --conventional-commits --conventional-prerelease When run with this flag, `lerna version` will release with prerelease versions the specified packages (comma-separated) or all packages using `*`. Releases all unreleased changes as pre(patch/minor/major/release) by prefixing the version recommendation from `conventional-commits` with `pre`, eg. if present changes include a feature commit, the recommended bump will be `minor`, so this flag will result in a `preminor` release. If changes are present for packages that are not specified (if specifying packages), or for packages that are already in prerelease, those packages will be versioned as they normally would using `--conventional-commits`. +### `--conventional-bumpprerelease` + +```sh +lerna version --conventional-commits --conventional-prerelease --conventional-bumpprerelease +``` + +When run with this flag, `lerna version` will release with bumped prerelease versions even if already released packages are prereleases. Releases all unreleased changes as pre(patch/minor/major/release) by prefixing the version recommendation from `conventional-commits` with `pre`, eg. if present changes include a feature commit, the recommended bump will be `minor`, so this flag will result in a `preminor` release. If not used just a prerelease bump will be applied to prereleased packages. + +```sh +Changes: + - major: 1.0.0-alpha.0 => 2.0.0-alpha.0 + - minor: 1.0.0-alpha.0 => 1.1.0-alpha.0 + - patch: 1.0.0-alpha.0 => 1.0.1-alpha.0 +``` + ### `--create-release ` ```sh diff --git a/commands/version/__tests__/version-conventional-commits.test.js b/commands/version/__tests__/version-conventional-commits.test.js index 93a886df6f..71dbdb37d3 100644 --- a/commands/version/__tests__/version-conventional-commits.test.js +++ b/commands/version/__tests__/version-conventional-commits.test.js @@ -91,6 +91,33 @@ 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"); diff --git a/commands/version/command.js b/commands/version/command.js index d82bd24c85..ca757c9876 100644 --- a/commands/version/command.js +++ b/commands/version/command.js @@ -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", diff --git a/commands/version/index.js b/commands/version/index.js index e4fbf24c87..ebe9c3f363 100644 --- a/commands/version/index.js +++ b/commands/version/index.js @@ -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(); @@ -394,6 +394,7 @@ class VersionCommand extends Command { rootPath, tagPrefix: this.tagPrefix, prereleaseId: getPrereleaseId(node), + conventionalBumpprerelease, }) ) ); diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/lerna.json b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/lerna.json new file mode 100644 index 0000000000..84e537a34e --- /dev/null +++ b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/lerna.json @@ -0,0 +1,8 @@ +{ + "command": { + "publish": { + "conventionalCommits": true + } + }, + "version": "independent" +} diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/package.json b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/package.json new file mode 100644 index 0000000000..20bd4b1f45 --- /dev/null +++ b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/package.json @@ -0,0 +1,5 @@ +{ + "name": "conventional-commits-independent", + "repository": "lerna/conventional-commits-independent", + "version": "0.0.0-root" +} diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/CHANGELOG.md b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/package.json b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/package.json new file mode 100644 index 0000000000..319b58baf7 --- /dev/null +++ b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-1/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-1", + "repository": "lerna/conventional-commits-independent", + "version": "1.0.0-alpha.0" +} diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/CHANGELOG.md b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/package.json b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/package.json new file mode 100644 index 0000000000..ff6ac81d8f --- /dev/null +++ b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-2/package.json @@ -0,0 +1,8 @@ +{ + "name": "package-2", + "repository": "lerna/conventional-commits-independent", + "version": "1.0.0-beta.0", + "dependencies": { + "package-1": "^1.0.0" + } +} diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/CHANGELOG.md b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/package.json b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/package.json new file mode 100644 index 0000000000..0abe2ab7f8 --- /dev/null +++ b/core/conventional-commits/__tests__/__fixtures__/prerelease-independent/packages/package-3/package.json @@ -0,0 +1,8 @@ +{ + "name": "package-3", + "repository": "lerna/conventional-commits-independent", + "version": "1.0.0-beta.0", + "dependencies": { + "package-1": "^1.0.0" + } +} diff --git a/core/conventional-commits/__tests__/conventional-commits.test.js b/core/conventional-commits/__tests__/conventional-commits.test.js index 51a96c381e..71043cca28 100644 --- a/core/conventional-commits/__tests__/conventional-commits.test.js +++ b/core/conventional-commits/__tests__/conventional-commits.test.js @@ -95,6 +95,80 @@ 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); diff --git a/core/conventional-commits/lib/recommend-version.js b/core/conventional-commits/lib/recommend-version.js index a982adfc92..9fb7bed000 100644 --- a/core/conventional-commits/lib/recommend-version.js +++ b/core/conventional-commits/lib/recommend-version.js @@ -12,7 +12,11 @@ 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 = { @@ -26,8 +30,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) { @@ -59,7 +63,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)); From 1051b07e2c30620ffedb208f25a39c31372a4443 Mon Sep 17 00:00:00 2001 From: Ambros Morscher Date: Mon, 7 Nov 2022 17:36:41 +0100 Subject: [PATCH 2/3] chore: integrate requested review changes --- commands/version/README.md | 6 +++--- .../__tests__/version-conventional-commits.test.js | 6 +++--- commands/version/command.js | 4 ++-- commands/version/index.js | 4 ++-- .../__tests__/conventional-commits.test.js | 6 +++--- core/conventional-commits/lib/recommend-version.js | 8 ++++---- core/lerna/schemas/lerna-schema.json | 10 ++++++++++ 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/commands/version/README.md b/commands/version/README.md index 44712c1f39..e78ce3b571 100644 --- a/commands/version/README.md +++ b/commands/version/README.md @@ -55,7 +55,7 @@ Running `lerna version --conventional-commits` without the above flags will rele - [`--conventional-commits`](#--conventional-commits) - [`--conventional-graduate`](#--conventional-graduate) - [`--conventional-prerelease`](#--conventional-prerelease) - - [`--conventional-bumpprerelease`](#--conventional-bumpprerelease) + - [`--conventional-bump-prerelease`](#--conventional-bump-prerelease) - [`--create-release `](#--create-release-type) - [`--exact`](#--exact) - [`--force-publish`](#--force-publish) @@ -202,10 +202,10 @@ lerna version --conventional-commits --conventional-prerelease When run with this flag, `lerna version` will release with prerelease versions the specified packages (comma-separated) or all packages using `*`. Releases all unreleased changes as pre(patch/minor/major/release) by prefixing the version recommendation from `conventional-commits` with `pre`, eg. if present changes include a feature commit, the recommended bump will be `minor`, so this flag will result in a `preminor` release. If changes are present for packages that are not specified (if specifying packages), or for packages that are already in prerelease, those packages will be versioned as they normally would using `--conventional-commits`. -### `--conventional-bumpprerelease` +### `--conventional-bump-prerelease` ```sh -lerna version --conventional-commits --conventional-prerelease --conventional-bumpprerelease +lerna version --conventional-commits --conventional-prerelease --conventional-bump-prerelease ``` When run with this flag, `lerna version` will release with bumped prerelease versions even if already released packages are prereleases. Releases all unreleased changes as pre(patch/minor/major/release) by prefixing the version recommendation from `conventional-commits` with `pre`, eg. if present changes include a feature commit, the recommended bump will be `minor`, so this flag will result in a `preminor` release. If not used just a prerelease bump will be applied to prereleased packages. diff --git a/commands/version/__tests__/version-conventional-commits.test.js b/commands/version/__tests__/version-conventional-commits.test.js index 71dbdb37d3..f5784ad6b1 100644 --- a/commands/version/__tests__/version-conventional-commits.test.js +++ b/commands/version/__tests__/version-conventional-commits.test.js @@ -91,14 +91,14 @@ describe("--conventional-commits", () => { }); }); - it("should call recommended version with conventionalBumpprerelease set", async () => { + 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" + "--conventional-bump-prerelease" ); prereleaseVersionBumps.forEach((version, name) => { @@ -108,7 +108,7 @@ describe("--conventional-commits", () => { rootPath: cwd, tagPrefix: "v", prereleaseId, - conventionalBumpprerelease: true, + conventionalBumpPrerelease: true, }); expect(updateChangelog).toHaveBeenCalledWith( expect.objectContaining({ name, version }), diff --git a/commands/version/command.js b/commands/version/command.js index ca757c9876..80b9c6e727 100644 --- a/commands/version/command.js +++ b/commands/version/command.js @@ -32,8 +32,8 @@ 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.", + "conventional-bump-prerelease": { + describe: "Bumps prerelease versions if conventional commits requires it.", type: "boolean", }, "changelog-preset": { diff --git a/commands/version/index.js b/commands/version/index.js index ebe9c3f363..a6bfa7d5d6 100644 --- a/commands/version/index.js +++ b/commands/version/index.js @@ -367,7 +367,7 @@ class VersionCommand extends Command { recommendVersions(resolvePrereleaseId) { const independentVersions = this.project.isIndependent(); - const { changelogPreset, conventionalGraduate, conventionalBumpprerelease } = this.options; + const { changelogPreset, conventionalGraduate, conventionalBumpPrerelease } = this.options; const rootPath = this.project.manifest.location; const type = independentVersions ? "independent" : "fixed"; const prereleasePackageNames = this.getPrereleasePackageNames(); @@ -394,7 +394,7 @@ class VersionCommand extends Command { rootPath, tagPrefix: this.tagPrefix, prereleaseId: getPrereleaseId(node), - conventionalBumpprerelease, + conventionalBumpPrerelease, }) ) ); diff --git a/core/conventional-commits/__tests__/conventional-commits.test.js b/core/conventional-commits/__tests__/conventional-commits.test.js index 71043cca28..1cd8d88c39 100644 --- a/core/conventional-commits/__tests__/conventional-commits.test.js +++ b/core/conventional-commits/__tests__/conventional-commits.test.js @@ -118,17 +118,17 @@ describe("conventional-commits", () => { recommendVersion( pkg1, "independent", - Object.assign(opts, { prereleaseId: "alpha", conventionalBumpprerelease: true }) + Object.assign(opts, { prereleaseId: "alpha", conventionalBumpPrerelease: true }) ), recommendVersion( pkg2, "independent", - Object.assign(opts, { prereleaseId: "beta", conventionalBumpprerelease: true }) + Object.assign(opts, { prereleaseId: "beta", conventionalBumpPrerelease: true }) ), recommendVersion( pkg3, "independent", - Object.assign(opts, { prereleaseId: "beta", conventionalBumpprerelease: true }) + Object.assign(opts, { prereleaseId: "beta", conventionalBumpPrerelease: true }) ), ]); diff --git a/core/conventional-commits/lib/recommend-version.js b/core/conventional-commits/lib/recommend-version.js index 9fb7bed000..81bd79df66 100644 --- a/core/conventional-commits/lib/recommend-version.js +++ b/core/conventional-commits/lib/recommend-version.js @@ -15,7 +15,7 @@ module.exports.recommendVersion = recommendVersion; function recommendVersion( pkg, type, - { changelogPreset, rootPath, tagPrefix, prereleaseId, conventionalBumpprerelease } + { changelogPreset, rootPath, tagPrefix, prereleaseId, conventionalBumpPrerelease } ) { log.silly(type, "for %s at %s", pkg.name, pkg.location); @@ -30,8 +30,8 @@ function recommendVersion( options.tagPrefix = tagPrefix; } - const shouldBumpPrerelease = (releaseType, version, bumpPrerelease) => { - if (!semver.prerelease(version) || bumpPrerelease) { + const shouldBumpPrerelease = (releaseType, version) => { + if (!semver.prerelease(version)) { return true; } switch (releaseType) { @@ -63,7 +63,7 @@ function recommendVersion( let releaseType = data.releaseType || "patch"; if (prereleaseId) { - const shouldBump = shouldBumpPrerelease(releaseType, pkg.version, conventionalBumpprerelease); + const shouldBump = conventionalBumpPrerelease || shouldBumpPrerelease(releaseType, pkg.version); const prereleaseType = shouldBump ? `pre${releaseType}` : "prerelease"; log.verbose(type, "increment %s by %s", pkg.version, prereleaseType); resolve(semver.inc(pkg.version, prereleaseType, prereleaseId)); diff --git a/core/lerna/schemas/lerna-schema.json b/core/lerna/schemas/lerna-schema.json index 797011ee62..3d8fefcfca 100644 --- a/core/lerna/schemas/lerna-schema.json +++ b/core/lerna/schemas/lerna-schema.json @@ -985,6 +985,9 @@ "conventionalPrerelease": { "$ref": "#/$defs/commandOptions/version/conventionalPrerelease" }, + "conventionalBumpPrerelease": { + "$ref": "#/$defs/commandOptions/version/conventionalBumpPrerelease" + }, "changelogPreset": { "$ref": "#/$defs/commandOptions/version/changelogPreset" }, @@ -1287,6 +1290,9 @@ "conventionalPrerelease": { "$ref": "#/$defs/commandOptions/version/conventionalPrerelease" }, + "conventionalBumpPrerelease": { + "$ref": "#/$defs/commandOptions/version/conventionalBumpPrerelease" + }, "changelogPreset": { "$ref": "#/$defs/commandOptions/version/changelogPreset" }, @@ -1673,6 +1679,10 @@ ], "description": "During `lerna version`, version changed packages as prereleases when using --conventional-commits." }, + "conventionalBumpPrerelease": { + "type": "boolean", + "description": "During `lerna version`, bumps version of changed prereleased packages when using --conventional-commits." + }, "changelogPreset": { "type": "string", "description": "For `lerna version`, the custom conventional-changelog preset." From a2010a8f45bc22258e6871e352ddd08422befb7a Mon Sep 17 00:00:00 2001 From: Ambros Morscher Date: Mon, 7 Nov 2022 23:29:37 +0100 Subject: [PATCH 3/3] test: add e2e test for --conventional-bump-prerelease flag --- .../conventional-commits.spec.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/e2e/tests/lerna-version/conventional-commits.spec.ts b/e2e/tests/lerna-version/conventional-commits.spec.ts index b4a818f657..bd98a70f84 100644 --- a/e2e/tests/lerna-version/conventional-commits.spec.ts +++ b/e2e/tests/lerna-version/conventional-commits.spec.ts @@ -288,6 +288,51 @@ describe("lerna-version-conventional-commits", () => { `); }); + it("should correctly generate and bump prerelease versions when using --conventional-prerelease and --conventional-bump-prerelease", async () => { + await fixture.createInitialGitCommit(); + + await fixture.lerna("create package-a -y"); + await fixture.exec("git add --all"); + await fixture.exec("git commit -m 'feat: add package-a'"); + + await fixture.lerna("create package-b -y"); + await fixture.exec("git add --all"); + await fixture.exec("git commit -m 'feat: add package-b'"); + + await fixture.exec("git push origin test-main"); + + // Initial versioning with two packages created + await fixture.lerna("version --conventional-commits --conventional-prerelease -y", { + silenceError: true, + }); + + // Update and version just package-a + await fixture.exec("echo update_package_a > packages/package-a/new_file.txt"); + await fixture.exec("git add --all"); + await fixture.exec("git commit -m 'fix: update package-a'"); + + // Bump a prerelease version + const output = await fixture.lerna("version --conventional-commits --conventional-bump-prerelease -y", { + silenceError: true, + }); + + expect(output.combinedOutput).toMatchInlineSnapshot(` + lerna notice cli v999.9.9-e2e.0 + lerna info current version 0.1.0-alpha.0 + lerna info Looking for changed packages since v0.1.0-alpha.0 + lerna info getChangelogConfig Successfully resolved preset "conventional-changelog-angular" + + Changes: + - package-a: 0.1.0-alpha.0 => 0.1.1-alpha.0 + + lerna info auto-confirmed + lerna info execute Skipping releases + lerna info git Pushing tags... + lerna success version finished + + `); + }); + describe("independent packages", () => { it("should correctly generate changelog and version information when releasing packages independently", async () => { await fixture.createInitialGitCommit();