UNPKG

@commitlint/prompt

Version:

commitizen prompt using commitlint.config.js

92 lines 3.69 kB
import chalk from 'chalk'; import format from './format.js'; import getForcedCaseFn from './get-forced-case-fn.js'; import getForcedLeadingFn from './get-forced-leading-fn.js'; import meta from './meta.js'; import { enumRuleIsActive, getHasName, getMaxLength, ruleIsActive, ruleIsApplicable, ruleIsNotApplicable, } from './utils.js'; const EOL = '\n'; /** * Get a cli prompt based on rule configuration * @param type type of the data to gather * @param rules * @param settings * @return prompt instance */ export default function getPrompt(type, rules = [], settings = {}) { const emptyRule = rules.filter(getHasName('empty')).find(ruleIsActive); const mustBeEmpty = emptyRule ? ruleIsApplicable(emptyRule) : false; if (mustBeEmpty) { return null; } const required = emptyRule ? ruleIsNotApplicable(emptyRule) : false; const forceCaseFn = getForcedCaseFn(rules.find(getHasName('case'))); const forceLeadingBlankFn = getForcedLeadingFn(rules.find(getHasName('leading-blank'))); const maxLengthRule = rules.find(getHasName('max-length')); const inputMaxLength = getMaxLength(maxLengthRule); const enumRule = rules.filter(getHasName('enum')).find(enumRuleIsActive); const tabCompletion = enumRule ? enumRule[1][2].map((enumerable) => { const enumSettings = (settings.enumerables || {})[enumerable] || {}; return { value: forceLeadingBlankFn(forceCaseFn(enumerable)), description: enumSettings.description || '', }; }) : []; const maxLength = (res) => { let remainingHeaderLength = Infinity; if (settings.header && settings.header.length) { const header = format({ type: res.type, scope: res.scope, subject: res.subject, }); remainingHeaderLength = settings.header.length - header.length; } return Math.min(inputMaxLength, remainingHeaderLength); }; return { type: 'input-custom', name: type, message: `${type}:`, validate(input, answers) { if (input.length > maxLength(answers || {})) { return 'Input contains too many characters!'; } if (required && input.trim().length === 0) { // Show help if enum is defined and input may not be empty return `⚠ ${chalk.bold(type)} may not be empty.`; } const tabValues = tabCompletion.map((item) => item.value); if (input.length > 0 && tabValues.length > 0 && !tabValues.includes(input)) { return `⚠ ${chalk.bold(type)} must be one of ${tabValues.join(', ')}.`; } return true; }, tabCompletion, log(answers) { let prefix = `${chalk.white('Please enter a')} ${chalk.bold(type)}: ${meta({ optional: !required, required: required, 'tab-completion': typeof enumRule !== 'undefined', header: typeof settings.header !== 'undefined', 'multi-line': settings.multiline, })}` + EOL; if (settings.description) { prefix += chalk.grey(`${settings.description}`) + EOL; } if (answers) { prefix += EOL + `${format(answers, true)}` + EOL; } return prefix + EOL; }, maxLength, transformer(value) { return forceCaseFn(value); }, forceLeadingBlankFn, }; } //# sourceMappingURL=get-prompt.js.map