Skip to content

Commit

Permalink
feat(conventional-commits): add conventional prerelease/graduation
Browse files Browse the repository at this point in the history
  • Loading branch information
erquhart committed Mar 21, 2019
1 parent a7ad9b6 commit 2ba19b5
Show file tree
Hide file tree
Showing 33 changed files with 2,400 additions and 1,272 deletions.
3 changes: 3 additions & 0 deletions __fixtures__/prerelease-independent/lerna.json
@@ -0,0 +1,3 @@
{
"version": "independent"
}
3 changes: 3 additions & 0 deletions __fixtures__/prerelease-independent/package.json
@@ -0,0 +1,3 @@
{
"name": "independent"
}
@@ -0,0 +1,4 @@
{
"name": "package-1",
"version": "1.0.0-alpha.0"
}
@@ -0,0 +1,7 @@
{
"name": "package-2",
"version": "2.0.0-alpha.0",
"dependencies": {
"package-1": "^1.0.0-alpha.0"
}
}
@@ -0,0 +1,7 @@
{
"name": "package-3",
"version": "3.0.0-beta.3",
"devDependencies": {
"package-2": "^2.0.0-alpha.0"
}
}
@@ -0,0 +1,7 @@
{
"name": "package-4",
"version": "4.0.0",
"dependencies": {
"package-1": "^0.0.0"
}
}
@@ -0,0 +1,8 @@
{
"name": "package-5",
"dependencies": {
"package-3": "^3.0.0-beta.3"
},
"private": true,
"version": "5.0.0-alpha.0"
}
3 changes: 3 additions & 0 deletions __fixtures__/prerelease/lerna.json
@@ -0,0 +1,3 @@
{
"version": "1.0.0-alpha.0"
}
3 changes: 3 additions & 0 deletions __fixtures__/prerelease/package.json
@@ -0,0 +1,3 @@
{
"name": "normal"
}
4 changes: 4 additions & 0 deletions __fixtures__/prerelease/packages/package-1/package.json
@@ -0,0 +1,4 @@
{
"name": "package-1",
"version": "1.0.0-alpha.0"
}
7 changes: 7 additions & 0 deletions __fixtures__/prerelease/packages/package-2/package.json
@@ -0,0 +1,7 @@
{
"name": "package-2",
"version": "1.0.0-alpha.0",
"dependencies": {
"package-1": "^1.0.0-alpha.0"
}
}
10 changes: 10 additions & 0 deletions __fixtures__/prerelease/packages/package-3/package.json
@@ -0,0 +1,10 @@
{
"name": "package-3",
"version": "1.0.0-alpha.0",
"peerDependencies": {
"package-2": "^1.0.0-alpha.0"
},
"devDependencies": {
"package-2": "^1.0.0-alpha.0"
}
}
7 changes: 7 additions & 0 deletions __fixtures__/prerelease/packages/package-4/package.json
@@ -0,0 +1,7 @@
{
"name": "package-4",
"version": "1.0.0-alpha.0",
"dependencies": {
"package-1": "^0.0.0"
}
}
11 changes: 11 additions & 0 deletions __fixtures__/prerelease/packages/package-5/package.json
@@ -0,0 +1,11 @@
{
"name": "package-5",
"dependencies": {
"package-1": "^1.0.0-alpha.0"
},
"optionalDependencies": {
"package-3": "^1.0.0-alpha.0"
},
"private": true,
"version": "1.0.0-alpha.0"
}
35 changes: 34 additions & 1 deletion commands/version/README.md
Expand Up @@ -30,15 +30,23 @@ lerna version [major | minor | patch | premajor | preminor | prepatch | prerelea
When this positional parameter is passed, `lerna version` will skip the version selection prompt and [increment](https://github.com/npm/node-semver#functions) the version by that keyword.
You must still use the `--yes` flag to avoid all prompts.

#### "Graduating" prereleases
## Prerelease

If you have any packages with a prerelease version number (e.g. `2.0.0-beta.3`) and you run `lerna version` with and a non-prerelease bump (`major`, `minor`, or `patch`), it will publish those previously pre-released packages _as well as_ the packages that have changed since the last release.

For projects using conventional commits, use the following flags for prerelease management:
**[`--conventional-prerelease`](#--conventional-prerelease):** release current changes as prerelease versions.
**[`--conventional-graduate`](#--conventional-graduate):** graduate prerelease versioned packages to stable versions.

Running `lerna version --conventional-commits` without the above flags will release current changes as prerelease only if the version is already in prerelease.

## Options

- [`--allow-branch`](#--allow-branch-glob)
- [`--amend`](#--amend)
- [`--conventional-commits`](#--conventional-commits)
- [`--conventional-graduate`](#--conventional-graduate)
- [`--conventional-prerelease`](#--conventional-prerelease)
- [`--changelog-preset`](#--changelog-preset)
- [`--exact`](#--exact)
- [`--force-publish`](#--force-publish)
Expand Down Expand Up @@ -116,6 +124,31 @@ When run with this flag, `lerna version` will use the [Conventional Commits Spec

Passing [`--no-changelog`](#--no-changelog) will disable the generation (or updating) of `CHANGELOG.md` files.

### `--conventional-graduate`

```sh
lerna version --conventional-commits --conventional-graduate=package-2,package-4

# force all prerelease packages to be graduated
lerna version --conventional-commits --conventional-graduate
```
When run with this flag, `lerna version` will graduate the specified packages (comma-separated) or all packages using `*`. This command works regardless of whether the current HEAD has been released, similar to `--force-publish`, except that any non-prerelease packages are ignored. If changes are present for packages that are not specified (if specifying packages), or for packages that are not in prerelease, those packages will be versioned as they normally would using `--conventional-commits`.

"Graduating" a package means bumping to the non-prerelease variant of a prerelease version, eg. `package-1@1.0.0-alpha.0 => package-1@1.0.0`.

> NOTE: when specifying packages, dependents of specified packages will be released, but will not be graduated.
### `--conventional-prerelease`

```sh
lerna version --conventional-commits --conventional-prerelease=package-2,package-4

# force all prerelease packages to be graduated
lerna version --conventional-commits --conventional-graduate
```

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`.

### `--changelog-preset`

```sh
Expand Down
@@ -1,5 +1,24 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`--conventional-commits fixed mode should guess prerelease version bumps and generate CHANGELOG 1`] = `
"v2.0.0-alpha.0
HEAD -> master, tag: v2.0.0-alpha.0
CHANGELOG.md
lerna.json
packages/package-1/CHANGELOG.md
packages/package-1/package.json
packages/package-2/CHANGELOG.md
packages/package-2/package.json
packages/package-3/CHANGELOG.md
packages/package-3/package.json
packages/package-4/CHANGELOG.md
packages/package-4/package.json
packages/package-5/CHANGELOG.md
packages/package-5/package.json"
`;

exports[`--conventional-commits fixed mode should use conventional-commits utility to guess version bump and generate CHANGELOG 1`] = `
"v2.0.0
Expand All @@ -19,6 +38,52 @@ packages/package-5/CHANGELOG.md
packages/package-5/package.json"
`;

exports[`--conventional-commits independent should graduate prerelease version bumps and generate CHANGELOG 1`] = `
"Publish
- package-1@1.0.1
- package-2@2.1.0
- package-3@4.0.0
- package-4@4.1.0
- package-5@5.0.1
HEAD -> master, tag: package-5@5.0.1, tag: package-4@4.1.0, tag: package-3@4.0.0, tag: package-2@2.1.0, tag: package-1@1.0.1
packages/package-1/CHANGELOG.md
packages/package-1/package.json
packages/package-2/CHANGELOG.md
packages/package-2/package.json
packages/package-3/CHANGELOG.md
packages/package-3/package.json
packages/package-4/CHANGELOG.md
packages/package-4/package.json
packages/package-5/CHANGELOG.md
packages/package-5/package.json"
`;

exports[`--conventional-commits independent should guess prerelease version bumps and generate CHANGELOG 1`] = `
"Publish
- package-1@1.0.1-alpha.0
- package-2@2.1.0-alpha.0
- package-3@4.0.0-beta.0
- package-4@4.1.0-alpha.0
- package-5@5.0.1-alpha.0
HEAD -> master, tag: package-5@5.0.1-alpha.0, tag: package-4@4.1.0-alpha.0, tag: package-3@4.0.0-beta.0, tag: package-2@2.1.0-alpha.0, tag: package-1@1.0.1-alpha.0
packages/package-1/CHANGELOG.md
packages/package-1/package.json
packages/package-2/CHANGELOG.md
packages/package-2/package.json
packages/package-3/CHANGELOG.md
packages/package-3/package.json
packages/package-4/CHANGELOG.md
packages/package-4/package.json
packages/package-5/CHANGELOG.md
packages/package-5/package.json"
`;

exports[`--conventional-commits independent should use conventional-commits utility to guess version bump and generate CHANGELOG 1`] = `
"Publish
Expand Down
28 changes: 28 additions & 0 deletions commands/version/__tests__/version-command.test.js
Expand Up @@ -48,6 +48,9 @@ expect.addSnapshotSerializer(require("@lerna-test/serialize-git-sha"));

describe("VersionCommand", () => {
describe("normal mode", () => {
beforeEach(() => {
checkWorkingTree.mockReset();
});
it("versions changed packages", async () => {
const testDir = await initFixture("normal");
// when --conventional-commits is absent,
Expand Down Expand Up @@ -86,6 +89,20 @@ describe("VersionCommand", () => {
}
});

it("throws an error if conventional prerelease and graduate flags are both passed", async () => {
const testDir = await initFixture("normal");

try {
await lernaVersion(testDir)("--conventional-prerelease", "--conventional-graduate");
} catch (err) {
expect(err.message).toMatchInlineSnapshot(
`"--conventional-prerelease cannot be combined with --conventional-graduate."`
);
}

expect.assertions(1);
});

it("throws an error when remote branch doesn't exist", async () => {
remoteBranchExists.mockReturnValueOnce(false);

Expand Down Expand Up @@ -134,6 +151,17 @@ describe("VersionCommand", () => {
expect.assertions(1);
});

it("does not throw if current ref is already tagged when using --force-publish", async () => {
checkWorkingTree.mockImplementationOnce(() => {
throw new Error("released");
});

const testDir = await initFixture("normal");
await lernaVersion(testDir)("--force-publish");

expect.assertions(0);
});

it("only bumps changed packages when non-major version selected", async () => {
const testDir = await initFixture("normal");

Expand Down

0 comments on commit 2ba19b5

Please sign in to comment.