npm package: @pafa/release
Description: release all packages and generate changelogs
Latest version: 0.9.51

<h1 align="center">Paf Release</h1>

<p align="center">
  <span>中文</span> | 
</p>

## 介绍

`Paf Release` 是一个用于发布所有包、生成变更日志和检测 `commit message` 的工具，依赖于 `pnpm`。

## 安装

```shell
pnpm add @pafa/release -D
```

## 使用

### 使用命令

```shell
# 发布所有包并生成变更日志
npx vr release

# 指定远程仓库名称
npx vr release -r TODO paf-release
# or
npx vr release --remote TODO paf-release

# 仅生成变更日志
npx vr changelog

# 指定变更日志文件名
npx vr changelog -f changelog.md
# or
npx vr changelog --file changelog.md

# 检测 commit message
npx vr lint-commit -p .git/COMMIT_EDITMSG

# 发布到 npm，可以在 ci 中执行
npx vr publish
```

### 配置

#### release

| 参数                      | 说明                                                                    |
| ------------------------- | ----------------------------------------------------------------------- |
| -r --remote \<remote\>    | 指定远程仓库名称                                                        |
| -s --skip-npm-publish     | 跳过 npm 发布                                                           |
| -c --check-remote-version | 检测 npm 包的远程版本是否与要在本地发布的包版本相同，如果是，则停止执行 |
| -sc --skip-changelog      | 跳过生成变更日志                                                        |
| -sgt --skip-git-tag       | 跳过 git tag                                                            |
| -nt --npm-tag \<npmTag\>  | npm tag                                                                 |

#### changelog

| 参数                                | 说明               |
| ----------------------------------- | ------------------ |
| -f --file \<filename\>              | 指定变更日志文件名 |
| --releaseCount \<releaseCount\> | 发布数量           |

#### lint-commit

| 参数                            | 说明                                                                        |
| ------------------------------- | --------------------------------------------------------------------------- |
| -p --commitMessagePath \<path\> | 提交 `git message` 的临时文件路径。`git` 钩子 `commit-msg` 会传递这个参数。 |
| -r --commitMessageRe \<reg\>    | 验证 `commit message` 是否通过的正则                                        |
| -e --errorMessage \<message\>   | 验证失败展示的错误信息                                                      |
| -w --warningMessage \<message\> | 验证失败展示的提示信息                                                      |

#### publish

| 参数                      | 说明                                                                  |
| ------------------------- | --------------------------------------------------------------------- |
| -c --check-remote-version | 检测npm包的远程版本是否与要在本地发布的包版本相同，如果是，则跳过发布 |
| -nt --npm-tag \<npmTag\>  | npm tag                                                               |

### 自定义处理

#### 示例

```js
import { release, changelog } from '@pafa/release'

// Do what you want to do...
release()
```

你可以传入一个 `task`，在包版本更改后，在发布之前会调用 `task`。

```js
import { release, changelog } from '@pafa/release'

async function task() {
  await doSomething1()
  await doSomething2()
}

release({ task })
```

#### 类型

```ts
interface PublishCommandOptions {
  preRelease?: boolean
  checkRemoteVersion?: boolean
  npmTag?: string
}
function publish({ preRelease, checkRemoteVersion, npmTag }: PublishCommandOptions): Promise<void>
function updateVersion(version: string): void
interface ReleaseCommandOptions {
  remote?: string
  skipNpmPublish?: boolean
  skipChangelog?: boolean
  skipGitTag?: boolean
  npmTag?: string
  task?(newVersion: string, oldVersion: string): Promise<void>
}
function release(options: ReleaseCommandOptions): Promise<void>

interface ChangelogCommandOptions {
  file?: string
  releaseCount?: number
}
function changelog({ releaseCount, file }?: ChangelogCommandOptions): Promise<void>

const COMMIT_MESSAGE_RE: RegExp
function isVersionCommitMessage(message: string): string | false | null
function getCommitMessage(commitMessagePath: string): string
interface CommitLintCommandOptions {
  commitMessagePath: string
  commitMessageRe?: string | RegExp
  errorMessage?: string
  warningMessage?: string
}
function commitLint(options: CommitLintCommandOptions): void
```

## License

[MIT](TODO release/blob/main/LICENSE)