Creates a wizard to walk through creating a commit message in the correct template for commit messages in Angular repositories. PR Close #38457
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google LLC All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| import {ListChoiceOptions} from 'inquirer';
 | |
| 
 | |
| import {info, promptAutocomplete, promptInput} from '../utils/console';
 | |
| 
 | |
| import {COMMIT_TYPES, CommitType, getCommitMessageConfig, ScopeRequirement} from './config';
 | |
| 
 | |
| /** Validate commit message at the provided file path. */
 | |
| export async function buildCommitMessage() {
 | |
|   // TODO(josephperrott): Add support for skipping wizard with local untracked config file
 | |
|   // TODO(josephperrott): Add default commit message information/commenting into generated messages
 | |
|   info('Just a few questions to start building the commit message!');
 | |
| 
 | |
|   /** The commit message type. */
 | |
|   const type = await promptForCommitMessageType();
 | |
|   /** The commit message scope. */
 | |
|   const scope = await promptForCommitMessageScopeForType(type);
 | |
|   /** The commit message summary. */
 | |
|   const summary = await promptForCommitMessageSummary();
 | |
| 
 | |
|   return `${type.name}${scope ? '(' + scope + ')' : ''}: ${summary}\n\n`;
 | |
| }
 | |
| 
 | |
| /** Prompts in the terminal for the commit message's type. */
 | |
| async function promptForCommitMessageType(): Promise<CommitType> {
 | |
|   info('The type of change in the commit. Allows a reader to know the effect of the change,');
 | |
|   info('whether it brings a new feature, adds additional testing, documents the `project, etc.');
 | |
| 
 | |
|   /** List of commit type options for the autocomplete prompt. */
 | |
|   const typeOptions: ListChoiceOptions[] =
 | |
|       Object.values(COMMIT_TYPES).map(({description, name}) => {
 | |
|         return {
 | |
|           name: `${name} - ${description}`,
 | |
|           value: name,
 | |
|           short: name,
 | |
|         };
 | |
|       });
 | |
|   /** The key of a commit message type, selected by the user via prompt. */
 | |
|   const typeName = await promptAutocomplete('Select a type for the commit:', typeOptions);
 | |
| 
 | |
|   return COMMIT_TYPES[typeName];
 | |
| }
 | |
| 
 | |
| /** Prompts in the terminal for the commit message's scope. */
 | |
| async function promptForCommitMessageScopeForType(type: CommitType): Promise<string|false> {
 | |
|   // If the commit type's scope requirement is forbidden, return early.
 | |
|   if (type.scope === ScopeRequirement.Forbidden) {
 | |
|     info(`Skipping scope selection as the '${type.name}' type does not allow scopes`);
 | |
|     return false;
 | |
|   }
 | |
|   /** Commit message configuration */
 | |
|   const config = getCommitMessageConfig();
 | |
| 
 | |
|   info('The area of the repository the changes in this commit most affects.');
 | |
|   return await promptAutocomplete(
 | |
|       'Select a scope for the commit:', config.commitMessage.scopes,
 | |
|       type.scope === ScopeRequirement.Optional ? '<no scope>' : '');
 | |
| }
 | |
| 
 | |
| /** Prompts in the terminal for the commit message's summary. */
 | |
| async function promptForCommitMessageSummary(): Promise<string> {
 | |
|   info('Provide a short summary of what the changes in the commit do');
 | |
|   return await promptInput('Provide a short summary of the commit');
 | |
| }
 |