UNPKG

@commitlint/cz-commitlint

Version:

Commitizen adapter using the commitlint.config.js

157 lines 5.55 kB
import chalk from 'chalk'; import inquirer from 'inquirer'; export default class Question { _question; messages; skip; _maxLength; _minLength; title; caseFn; fullStopFn; multipleValueDelimiters; multipleSelectDefaultDelimiter; constructor(name, { title, enumList, messages, defaultValue, when, skip, fullStopFn, caseFn, maxLength, minLength, multipleValueDelimiters, multipleSelectDefaultDelimiter, }) { if (!name || typeof name !== 'string') throw new Error('Question: name is required'); this._maxLength = maxLength ?? Infinity; this._minLength = minLength ?? 0; this.messages = messages; this.title = title ?? ''; this.skip = skip ?? false; this.fullStopFn = fullStopFn ?? ((_) => _); this.caseFn = caseFn ?? ((input, delimiter) => Array.isArray(input) ? input.join(delimiter) : input); this.multipleValueDelimiters = multipleValueDelimiters; this.multipleSelectDefaultDelimiter = multipleSelectDefaultDelimiter; if (enumList && Array.isArray(enumList)) { this._question = { type: multipleSelectDefaultDelimiter ? 'checkbox' : 'list', choices: skip ? [ ...enumList, new inquirer.Separator(), { name: 'empty', value: '', }, ] : [...enumList], }; } else if (/^is[A-Z]/.test(name)) { this._question = { type: 'confirm', }; } else { this._question = { type: 'input', transformer: this.transformer.bind(this), }; } Object.assign(this._question, { name, default: defaultValue, when, validate: this.validate.bind(this), filter: this.filter.bind(this), message: this.decorateMessage.bind(this), }); } getMessage(key) { return this.messages[key] ?? ''; } get question() { return this._question; } get maxLength() { return this._maxLength; } set maxLength(maxLength) { this._maxLength = maxLength; } get minLength() { return this._minLength; } set minLength(minLength) { this._minLength = minLength; } beforeQuestionStart(_answers) { return; } validate(input) { const output = this.filter(input); const questionName = this.question.name ?? ''; if (!this.skip && output.length === 0) { return this.getMessage('emptyWarning').replace(/%s/g, questionName); } if (output.length > this.maxLength) { return this.getMessage('upperLimitWarning') .replace(/%s/g, questionName) .replace(/%d/g, `${output.length - this.maxLength}`); } if (output.length < this.minLength) { return this.getMessage('lowerLimitWarning') .replace(/%s/g, questionName) .replace(/%d/g, `${this.minLength - output.length}`); } return true; } filter(input) { let toCased; if (Array.isArray(input)) { toCased = this.caseFn(input, this.multipleSelectDefaultDelimiter); } else if (this.multipleValueDelimiters) { const segments = input.split(this.multipleValueDelimiters); const casedString = this.caseFn(segments, ','); const casedSegments = casedString.split(','); toCased = input.replace(new RegExp(`[^${this.multipleValueDelimiters.source}]+`, 'g'), (segment) => { return casedSegments[segments.indexOf(segment)]; }); } else { toCased = this.caseFn(input); } return this.fullStopFn(toCased); } transformer(input, _answers) { const output = this.filter(input); if (this.maxLength === Infinity && this.minLength === 0) { return output; } const color = output.length <= this.maxLength && output.length >= this.minLength ? chalk.green : chalk.red; return color('(' + output.length + ') ' + output); } decorateMessage(_answers) { if (this.beforeQuestionStart) { this.beforeQuestionStart(_answers); } if (this.question.type === 'input') { const countLimitMessage = (() => { const messages = []; if (this.minLength > 0 && this.getMessage('min')) { messages.push(this.getMessage('min').replace(/%d/g, this.minLength + '')); } if (this.maxLength < Infinity && this.getMessage('max')) { messages.push(this.getMessage('max').replace(/%d/g, this.maxLength + '')); } return messages.join(', '); })(); const skipMessage = this.skip && this.getMessage('skip'); return (this.title + (skipMessage ? ` ${skipMessage}` : '') + ':' + (countLimitMessage ? ` ${countLimitMessage}` : '') + '\n'); } else { return `${this.title}:`; } } } //# sourceMappingURL=Question.js.map