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