From 06971f3935454ab7da124e2089931b19a6014e19 Mon Sep 17 00:00:00 2001 From: "142vip.cn" Date: Mon, 15 Jul 2024 14:43:37 +0800 Subject: [PATCH] feat(packages): `@sa/scripts`: command `gitCommit` support chinese (#548) --- packages/scripts/src/commands/git-commit.ts | 30 ++++---- packages/scripts/src/config/index.ts | 26 ------- packages/scripts/src/index.ts | 14 +++- packages/scripts/src/locales/index.ts | 78 +++++++++++++++++++++ packages/scripts/src/types/index.ts | 4 -- 5 files changed, 102 insertions(+), 50 deletions(-) create mode 100644 packages/scripts/src/locales/index.ts diff --git a/packages/scripts/src/commands/git-commit.ts b/packages/scripts/src/commands/git-commit.ts index 875ea969b..95735b259 100644 --- a/packages/scripts/src/commands/git-commit.ts +++ b/packages/scripts/src/commands/git-commit.ts @@ -1,9 +1,9 @@ import path from 'node:path'; import { readFileSync } from 'node:fs'; import { prompt } from 'enquirer'; -import { bgRed, green, red, yellow } from 'kolorist'; import { execCommand } from '../shared'; -import type { CliOption } from '../types'; +import { locales } from '../locales'; +import type { Lang } from '../locales'; interface PromptObject { types: string; @@ -14,13 +14,11 @@ interface PromptObject { /** * Git commit with Conventional Commits standard * - * @param gitCommitTypes - * @param gitCommitScopes + * @param lang */ -export async function gitCommit( - gitCommitTypes: CliOption['gitCommitTypes'], - gitCommitScopes: CliOption['gitCommitScopes'] -) { +export async function gitCommit(lang: Lang = 'en-us') { + const { gitCommitMessages, gitCommitTypes, gitCommitScopes } = locales[lang]; + const typesChoices = gitCommitTypes.map(([value, msg]) => { const nameWithSuffix = `${value}:`; @@ -41,19 +39,19 @@ export async function gitCommit( { name: 'types', type: 'select', - message: 'Please select a type', + message: gitCommitMessages.types, choices: typesChoices }, { name: 'scopes', type: 'select', - message: 'Please select a scope', + message: gitCommitMessages.scopes, choices: scopesChoices }, { name: 'description', type: 'text', - message: `Please enter a description (add prefix ${yellow('!')} to indicate breaking change)` + message: gitCommitMessages.description } ]); @@ -67,7 +65,7 @@ export async function gitCommit( } /** Git commit message verify */ -export async function gitCommitVerify() { +export async function gitCommitVerify(lang: Lang = 'en-us') { const gitPath = await execCommand('git', ['rev-parse', '--show-toplevel']); const gitMsgPath = path.join(gitPath, '.git', 'COMMIT_EDITMSG'); @@ -77,10 +75,8 @@ export async function gitCommitVerify() { const REG_EXP = /(?[a-z]+)(?:\((?.+)\))?(?!)?: (?.+)/i; if (!REG_EXP.test(commitMsg)) { - throw new Error( - `${bgRed(' ERROR ')} ${red('git commit message must match the Conventional Commits standard!')}\n\n${green( - 'Recommended to use the command `pnpm commit` to generate Conventional Commits compliant commit information.\nGet more info about Conventional Commits, follow this link: https://conventionalcommits.org' - )}` - ); + const errorMsg = locales[lang].gitCommitVerify; + + throw new Error(errorMsg); } } diff --git a/packages/scripts/src/config/index.ts b/packages/scripts/src/config/index.ts index 4f84e3d26..511cba777 100644 --- a/packages/scripts/src/config/index.ts +++ b/packages/scripts/src/config/index.ts @@ -12,32 +12,6 @@ const defaultOptions: CliOption = { '**/node_modules', '!node_modules/**' ], - gitCommitTypes: [ - ['feat', 'A new feature'], - ['fix', 'A bug fix'], - ['docs', 'Documentation only changes'], - ['style', 'Changes that do not affect the meaning of the code'], - ['refactor', 'A code change that neither fixes a bug nor adds a feature'], - ['perf', 'A code change that improves performance'], - ['optimize', 'A code change that optimizes code quality'], - ['test', 'Adding missing tests or correcting existing tests'], - ['build', 'Changes that affect the build system or external dependencies'], - ['ci', 'Changes to our CI configuration files and scripts'], - ['chore', "Other changes that don't modify src or test files"], - ['revert', 'Reverts a previous commit'] - ], - gitCommitScopes: [ - ['projects', 'project'], - ['packages', 'packages'], - ['components', 'components'], - ['hooks', 'hook functions'], - ['utils', 'utils functions'], - ['types', 'TS declaration'], - ['styles', 'style'], - ['deps', 'project dependencies'], - ['release', 'release project'], - ['other', 'other changes'] - ], ncuCommandArgs: ['--deep', '-u'], changelogOptions: {} }; diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts index 909dda3d3..1d5b1a13c 100755 --- a/packages/scripts/src/index.ts +++ b/packages/scripts/src/index.ts @@ -3,6 +3,7 @@ import { blue, lightGreen } from 'kolorist'; import { version } from '../package.json'; import { cleanup, genChangelog, generateRoute, gitCommit, gitCommitVerify, release, updatePkg } from './commands'; import { loadCliOptions } from './config'; +import type { Lang } from './locales'; type Command = 'cleanup' | 'update-pkg' | 'git-commit' | 'git-commit-verify' | 'changelog' | 'release' | 'gen-route'; @@ -18,13 +19,19 @@ interface CommandArg { /** Generate changelog by total tags */ total?: boolean; /** - * The glob pattern of dirs to cleanup + * The glob pattern of dirs to clean up * * If not set, it will use the default value * * Multiple values use "," to separate them */ cleanupDir?: string; + /** + * display lang of cli + * + * @default 'en-us' + */ + lang?: Lang; } export async function setupCli() { @@ -44,6 +51,7 @@ export async function setupCli() { '-c, --cleanupDir ', 'The glob pattern of dirs to cleanup, If not set, it will use the default value, Multiple values use "," to separate them' ) + .option('-l, --lang ', 'display lang of cli', { default: 'en-us', type: [String] }) .help(); const commands: CommandWithAction = { @@ -61,8 +69,8 @@ export async function setupCli() { }, 'git-commit': { desc: 'git commit, generate commit message which match Conventional Commits standard', - action: async () => { - await gitCommit(cliOptions.gitCommitTypes, cliOptions.gitCommitScopes); + action: async args => { + await gitCommit(args?.lang); } }, 'git-commit-verify': { diff --git a/packages/scripts/src/locales/index.ts b/packages/scripts/src/locales/index.ts new file mode 100644 index 000000000..8d28dd548 --- /dev/null +++ b/packages/scripts/src/locales/index.ts @@ -0,0 +1,78 @@ +import { bgRed, green, red, yellow } from 'kolorist'; + +export type Lang = 'zh-cn' | 'en-us'; + +export const locales = { + 'zh-cn': { + gitCommitMessages: { + types: '请选择提交类型', + scopes: '请选择提交范围', + description: `请输入描述信息(${yellow('!')}开头表示破坏性改动` + }, + gitCommitTypes: [ + ['feat', '新功能'], + ['fix', '修复Bug'], + ['docs', '只更新文档'], + ['style', '修改代码风格,不影响代码含义的变更'], + ['refactor', '代码重构,既不修复 bug 也不添加功能的代码变更'], + ['perf', '可提高性能的代码更改'], + ['optimize', '优化代码质量的代码更改'], + ['test', '添加缺失的测试或更正现有测'], + ['build', '影响构建系统或外部依赖项的更改'], + ['ci', '对 CI 配置文件和脚本的更改'], + ['chore', '没有修改src或测试文件的其他变更'], + ['revert', '还原先前的提交'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', '项目'], + ['packages', '包'], + ['components', '组件'], + ['hooks', '钩子函数'], + ['utils', '工具函数'], + ['types', 'TS类型声明'], + ['styles', '代码风格'], + ['deps', '项目依赖'], + ['release', '发布项目新版本'], + ['other', '其他的变更'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' 错误 ')} ${red('git 提交信息必须符合 Conventional Commits 标准!')}\n\n${green( + '推荐使用命令 `pnpm commit` 生成符合 Conventional Commits 标准的提交信息。\n获取有关 Conventional Commits 的更多信息,请访问此链接: https://conventionalcommits.org' + )}` + }, + 'en-us': { + gitCommitMessages: { + types: 'Please select a type', + scopes: 'Please select a scope', + description: `Please enter a description (add prefix ${yellow('!')} to indicate breaking change)` + }, + gitCommitTypes: [ + ['feat', 'A new feature'], + ['fix', 'A bug fix'], + ['docs', 'Documentation only changes'], + ['style', 'Changes that do not affect the meaning of the code'], + ['refactor', 'A code change that neither fixes a bug nor adds a feature'], + ['perf', 'A code change that improves performance'], + ['optimize', 'A code change that optimizes code quality'], + ['test', 'Adding missing tests or correcting existing tests'], + ['build', 'Changes that affect the build system or external dependencies'], + ['ci', 'Changes to our CI configuration files and scripts'], + ['chore', "Other changes that don't modify src or test files"], + ['revert', 'Reverts a previous commit'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', 'project'], + ['packages', 'packages'], + ['components', 'components'], + ['hooks', 'hook functions'], + ['utils', 'utils functions'], + ['types', 'TS declaration'], + ['styles', 'style'], + ['deps', 'project dependencies'], + ['release', 'release project'], + ['other', 'other changes'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' ERROR ')} ${red('git commit message must match the Conventional Commits standard!')}\n\n${green( + 'Recommended to use the command `pnpm commit` to generate Conventional Commits compliant commit information.\nGet more info about Conventional Commits, follow this link: https://conventionalcommits.org' + )}` + } +} satisfies Record>; diff --git a/packages/scripts/src/types/index.ts b/packages/scripts/src/types/index.ts index 598760ef7..cbe7fbcdf 100644 --- a/packages/scripts/src/types/index.ts +++ b/packages/scripts/src/types/index.ts @@ -14,10 +14,6 @@ export interface CliOption { * ``` */ cleanupDirs: string[]; - /** Git commit types */ - gitCommitTypes: [string, string][]; - /** Git commit scopes */ - gitCommitScopes: [string, string][]; /** * Npm-check-updates command args *