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