From 4832cb3e7a0e8e57ed5898db6ad8d250d144d5c9 Mon Sep 17 00:00:00 2001 From: "guo.xu" Date: Thu, 28 Jan 2021 23:09:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(commit-lint):=20=E6=B7=BB=E5=8A=A0commit-l?= =?UTF-8?q?int=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cli-plugin-command-commit-lint/README.md | 11 ++++ .../package.json | 36 +++++++++++++ .../src/constants.ts | 4 ++ .../src/index.ts | 52 +++++++++++++++++++ .../tsconfig.json | 7 +++ packages/cli/package.json | 1 + packages/cli/src/Cli.ts | 3 +- packages/cli/src/types/plugins.ts | 6 +-- packages/cli/src/utils/constants.ts | 5 ++ yarn.lock | 36 +++++++++++++ 10 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 packages/cli-plugin-command-commit-lint/README.md create mode 100644 packages/cli-plugin-command-commit-lint/package.json create mode 100644 packages/cli-plugin-command-commit-lint/src/constants.ts create mode 100644 packages/cli-plugin-command-commit-lint/src/index.ts create mode 100644 packages/cli-plugin-command-commit-lint/tsconfig.json diff --git a/packages/cli-plugin-command-commit-lint/README.md b/packages/cli-plugin-command-commit-lint/README.md new file mode 100644 index 0000000..5ed7bd3 --- /dev/null +++ b/packages/cli-plugin-command-commit-lint/README.md @@ -0,0 +1,11 @@ +# `cli` + +> TODO: description + +## Usage + +``` +const cli = require('cli'); + +// TODO: DEMONSTRATE API +``` diff --git a/packages/cli-plugin-command-commit-lint/package.json b/packages/cli-plugin-command-commit-lint/package.json new file mode 100644 index 0000000..5c1b6ae --- /dev/null +++ b/packages/cli-plugin-command-commit-lint/package.json @@ -0,0 +1,36 @@ +{ + "name": "@xus/cli-plugin-command-commit-lint", + "version": "0.0.1", + "description": "xus cli plugin command-commit-lint", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "keywords": [ + "cli", + "commit-lint" + ], + "author": "guo.xu ", + "homepage": "https://github.com/xus-code/bundle-tools/tree/master/packages/cli#readme", + "license": "MIT", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/xus-code/bundle-tools.git" + }, + "scripts": { + "dev:cl": "tsc --watch", + "build:cl": "tsc" + }, + "bugs": { + "url": "https://github.com/xus-code/bundle-tools/issues" + }, + "dependencies": { + "@xus/cli": "^0.0.1", + "chalk": "^4.1.0", + "fs-extra": "^9.1.0" + }, + "devDependencies": { + "@types/fs-extra": "^9.0.6" + } +} diff --git a/packages/cli-plugin-command-commit-lint/src/constants.ts b/packages/cli-plugin-command-commit-lint/src/constants.ts new file mode 100644 index 0000000..76fed42 --- /dev/null +++ b/packages/cli-plugin-command-commit-lint/src/constants.ts @@ -0,0 +1,4 @@ +export const HuskyGitParamsEnv = 'HUSKY_GIT_PARAMS' + +export const commitRE = /^(revert: )?(fix|feat|docs|perf|test|types|style|build|chore|refactor|ci|wip|breaking change)(\(.+\))?: .{1,50}/ +export const mergeRE = /Merge / diff --git a/packages/cli-plugin-command-commit-lint/src/index.ts b/packages/cli-plugin-command-commit-lint/src/index.ts new file mode 100644 index 0000000..31f9612 --- /dev/null +++ b/packages/cli-plugin-command-commit-lint/src/index.ts @@ -0,0 +1,52 @@ +import type { IPluginAPI } from '@xus/cli' +import { HuskyGitParamsEnv, commitRE, mergeRE } from './constants' +import { readFileSync } from 'fs-extra' +import chalk from 'chalk' + +export default function (api: IPluginAPI): void { + api.registerCommand( + 'commit-lint', + { + usage: 'xus commit-lint', + desc: 'help you to validate commit message' + }, + () => { + const gitParams = api.EnvManager.getEnv(HuskyGitParamsEnv) + if (gitParams) { + const commitMsg = readFileSync(gitParams, 'utf-8').trim() + if (!commitRE.test(commitMsg) && !mergeRE.test(commitMsg)) { + console.info(`invalid commit message: + "${chalk.red(commitMsg)}". + +Proper commit message format is required for automated changelog generation. + +Examples: + +- fix(Button): incorrect style +- feat(Button): incorrect style +- docs(Button): fix typo + +Allowed Types: + +- fix (修复bug) +- feat (新特性) +- docs (文档相关) +- perf (性能优化) +- test (测试相关) +- types (ts类型相关) +- build (打包构建相关) +- chore (其他类型) +- ci (CI/CD相关) +- wip (开发中间态) +- refactor (代码重构) +- breaking change (重大变更) +- Merge branch 'foo' into 'bar' (分支合并) + `) + process.exit(1) + } + } + console.log(chalk.red(`no HUSKY_GIT_PARAMS`)) + process.exit(1) + } + ) +} diff --git a/packages/cli-plugin-command-commit-lint/tsconfig.json b/packages/cli-plugin-command-commit-lint/tsconfig.json new file mode 100644 index 0000000..af74b8a --- /dev/null +++ b/packages/cli-plugin-command-commit-lint/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "outDir": "./dist" + }, + "extends": "../../tsconfig.json", + "include": ["./src/**/*"] +} diff --git a/packages/cli/package.json b/packages/cli/package.json index 85af57b..8b4ffc4 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -30,6 +30,7 @@ "url": "https://github.com/xus-code/bundle-tools/issues" }, "dependencies": { + "@xus/cli-plugin-command-commit-lint": "^0.0.1", "@xus/cli-plugin-command-help": "^0.0.1", "chalk": "^4.1.0", "joi": "^17.3.0", diff --git a/packages/cli/src/Cli.ts b/packages/cli/src/Cli.ts index 6163ac1..d7ef730 100644 --- a/packages/cli/src/Cli.ts +++ b/packages/cli/src/Cli.ts @@ -1,6 +1,6 @@ // types import { Commands, Args, RawArgs, Plugin, PluginApply } from './types' -import { error, loadModule } from './utils' +import { error, loadModule, builtInMap } from './utils' import ConfigManager, { IConfigManager } from './manager/ConfigManager' import PathManager, { IPathManager } from './manager/PathManager' import EnvManager, { IEnvManager } from './manager/EnvManager' @@ -52,7 +52,6 @@ class Cli { } } const builtInPlugins = [] - const builtInMap = ['@xus/cli-plugin-command-help'] for (const pkgName of builtInMap) { const plugin = await toPlugin(pkgName) if (plugin) { diff --git a/packages/cli/src/types/plugins.ts b/packages/cli/src/types/plugins.ts index a2cbdf7..5e14f70 100644 --- a/packages/cli/src/types/plugins.ts +++ b/packages/cli/src/types/plugins.ts @@ -10,9 +10,9 @@ export interface Plugin { export type CommandFn = (args: Args, rawArgs: RawArgs) => any | Promise export interface CommandOps { - desc: string - usage: string - options: { + desc?: string + usage?: string + options?: { [key: string]: string } } diff --git a/packages/cli/src/utils/constants.ts b/packages/cli/src/utils/constants.ts index c7032f5..60ad71f 100644 --- a/packages/cli/src/utils/constants.ts +++ b/packages/cli/src/utils/constants.ts @@ -2,3 +2,8 @@ export enum EnvEnum { context = 'XUS_CLI_CONTEXT', mode = 'XUS_CLI_MODE' } + +export const builtInMap = [ + '@xus/cli-plugin-command-help', + '@xus/cli-plugin-command-commit-lint' +] diff --git a/yarn.lock b/yarn.lock index e8957d4..7c314ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -976,6 +976,13 @@ resolved "https://npm.c2cloud.cn/@sideway/pinpoint/download/@sideway/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha1-z/j/rcNyrSn9P3gneusp5jLMcN8= +"@types/fs-extra@^9.0.6": + version "9.0.6" + resolved "https://npm.c2cloud.cn/@types/fs-extra/download/@types/fs-extra-9.0.6.tgz#488e56b77299899a608b8269719c1d133027a6ab" + integrity sha1-SI5Wt3KZiZpgi4JpcZwdEzAnpqs= + dependencies: + "@types/node" "*" + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -1316,6 +1323,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://npm.c2cloud.cn/at-least-node/download/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha1-YCzUtG6EStTv/JKoARo8RuAjjcI= + atob-lite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" @@ -2550,6 +2562,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://npm.c2cloud.cn/fs-extra/download/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0= + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -3382,6 +3404,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://npm.c2cloud.cn/jsonfile/download/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4= + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -5637,6 +5668,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://npm.c2cloud.cn/universalify/download/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"