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');
 | 
						|
}
 |