diff --git a/packages/scripts/src/commands/git-commit.ts b/packages/scripts/src/commands/git-commit.ts index 35c0df561..9b3bdac43 100644 --- a/packages/scripts/src/commands/git-commit.ts +++ b/packages/scripts/src/commands/git-commit.ts @@ -17,7 +17,14 @@ interface PromptObject { * @param lang */ export async function gitCommit(lang: Lang = 'en-us') { - const { gitCommitMessages, gitCommitTypes, gitCommitScopes } = locales[lang]; + const { gitCommitMessages, gitCommitNoStaged, gitCommitTypes, gitCommitScopes } = locales[lang]; + + const stagedFiles = await execCommand('git', ['diff', '--cached', '--name-only']); + + if (!stagedFiles) { + console.error(gitCommitNoStaged); + process.exit(1); + } const typesChoices = gitCommitTypes.map(([value, msg]) => { const nameWithSuffix = `${value}:`; @@ -35,25 +42,41 @@ export async function gitCommit(lang: Lang = 'en-us') { message: `${value.padEnd(30)} (${msg})` })); - const result = await prompt([ - { - name: 'types', - type: 'select', - message: gitCommitMessages.types, - choices: typesChoices - }, - { - name: 'scopes', - type: 'select', - message: gitCommitMessages.scopes, - choices: scopesChoices - }, - { - name: 'description', - type: 'text', - message: gitCommitMessages.description + // Suppress ERR_USE_AFTER_CLOSE thrown by enquirer's readline cleanup on Ctrl+C (Node.js v24+) + const errorHandler = (error: NodeJS.ErrnoException) => { + if (error.code === 'ERR_USE_AFTER_CLOSE') { + process.exit(0); } - ]); + }; + process.on('uncaughtException', errorHandler); + + let result: PromptObject; + + try { + result = await prompt([ + { + name: 'types', + type: 'select', + message: gitCommitMessages.types, + choices: typesChoices + }, + { + name: 'scopes', + type: 'select', + message: gitCommitMessages.scopes, + choices: scopesChoices + }, + { + name: 'description', + type: 'text', + message: gitCommitMessages.description + } + ]); + } catch { + process.exit(0); + } finally { + process.off('uncaughtException', errorHandler); + } const breaking = result.description.startsWith('!') ? '!' : ''; diff --git a/packages/scripts/src/locales/index.ts b/packages/scripts/src/locales/index.ts index 74321d083..52328c4b8 100644 --- a/packages/scripts/src/locales/index.ts +++ b/packages/scripts/src/locales/index.ts @@ -37,6 +37,7 @@ export const locales = { ['release', '发布项目新版本'], ['other', '其他的变更'] ] as [string, string][], + gitCommitNoStaged: `${bgRed(' 错误 ')} ${red('暂存区没有文件,请先使用 git add 添加文件后再提交!')}`, gitCommitVerify: `${bgRed(' 错误 ')} ${red('git 提交信息必须符合 Conventional Commits 标准!')}\n\n${green( '推荐使用命令 `pnpm commit` 生成符合 Conventional Commits 标准的提交信息。\n获取有关 Conventional Commits 的更多信息,请访问此链接: https://conventionalcommits.org' )}` @@ -75,6 +76,7 @@ export const locales = { ['release', 'release project'], ['other', 'other changes'] ] as [string, string][], + gitCommitNoStaged: `${bgRed(' ERROR ')} ${red('No files in staging area, please use git add to stage files first!')}`, 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' )}`