90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const chalk = require('chalk')
 | |
| const spawn = require('cross-spawn')
 | |
| const defaultConfig = require('cz-customizable');
 | |
| const { getChangedPackages } = require('./utils')
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * 针对不同类型的 commit prefix message
 | |
|  */
 | |
| const typesConfig = [
 | |
|   { value: 'feat', name: 'A new feature' },
 | |
|   { value: 'fix', name: 'A bug fix' },
 | |
|   { value: 'docs', name: 'Documentation only changes' },
 | |
|   {
 | |
|     value: 'style',
 | |
|     name: 'Changes that do not affect the meaning of the code\n            (white-space, formatting, missing semi-colons, etc)',
 | |
|   },
 | |
|   {
 | |
|     value: 'refactor',
 | |
|     name: 'A code change that neither fixes a bug nor adds a feature',
 | |
|   },
 | |
|   {
 | |
|     value: 'perf',
 | |
|     name: 'A code change that improves performance',
 | |
|   },
 | |
|   { value: 'test', name: 'Adding missing tests' },
 | |
|   {
 | |
|     value: 'chore',
 | |
|     name: 'Changes to the build process or auxiliary tools',
 | |
|   },
 | |
|   {
 | |
|     value: 'build',
 | |
|     name: 'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)',
 | |
|   },
 | |
|   {
 | |
|     value: 'ci',
 | |
|     name: 'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)',
 | |
|   },
 | |
|   {
 | |
|     value: 'revert',
 | |
|     name: 'Reverts a previous commit',
 | |
|   },
 | |
| ]
 | |
| 
 | |
| const { stdout = '' } = spawn.sync(`git diff --staged --name-only`, {
 | |
|   shell: true,
 | |
|   encoding: 'utf8',
 | |
|   stdio: 'pipe',
 | |
| })
 | |
| const changedFiles = stdout.split('\n').filter(Boolean)
 | |
| const changeSet = getChangedPackages(changedFiles)
 | |
| 
 | |
| if (changeSet.size > 1) {
 | |
|   process.stderr.write(
 | |
|     `${[
 | |
|       chalk.yellow(`检测到当前提交可能涉及到多个包的改动,请注意拆分提交粒度`),
 | |
|     ].join('\n')}\n`,
 | |
|   )
 | |
| 
 | |
|   changeSet.clear()
 | |
|   changeSet.add('multiple')
 | |
| }
 | |
| 
 | |
| const changedScopes = [...changeSet]
 | |
| 
 | |
| module.exports = {
 | |
|   ...defaultConfig,
 | |
|   types: typesConfig.map(({ value, name }) => {
 | |
|     return {
 | |
|       name: `${value}:${new Array(10 - value.length)
 | |
|         .fill(' ')
 | |
|         .join('')}${name}`,
 | |
|       value,
 | |
|     }
 | |
|   }),
 | |
|   messages: {
 | |
|     ...defaultConfig.messages,
 | |
|     type: "Select the type of change that you're committing",
 | |
|     scope: 'Ensure the scope of this change',
 | |
|     subject: 'Write a short, imperative tense description of the change',
 | |
|     body: 'Provide a longer description of the change. Use "|" to break new line:\n',
 | |
|     breaking: 'List any BREAKING CHANGES (optional):\n',
 | |
|     confirmCommit: 'Are you sure you want to proceed with the commit above?',
 | |
|   },
 | |
|   scopes: changedScopes.join(','),
 | |
|   allowCustomScopes: false,
 | |
|   skipQuestions: ['customScope', 'footer', 'body'],
 | |
|   allowBreakingChanges: ['feat', 'fix'],
 | |
| }
 |