UNPKG

@commitlint/cz-commitlint

Version:

Commitizen adapter using the commitlint.config.js

132 lines 4.59 kB
import wrap from "word-wrap"; import Question from "./Question.js"; import getRuleQuestionConfig from "./services/getRuleQuestionConfig.js"; import { getPromptMessages, getPromptQuestions } from "./store/prompts.js"; import { getRule } from "./store/rules.js"; import getLeadingBlankFn from "./utils/leading-blank-fn.js"; import { getMaxLength } from "./utils/rules.js"; export class FooterQuestion extends Question { footerMaxLength; footerMinLength; constructor(name, questionConfig, footerMaxLength, footerMinLength) { super(name, questionConfig); this.footerMaxLength = footerMaxLength ?? Infinity; this.footerMinLength = footerMinLength ?? 0; } beforeQuestionStart(answers) { const footerRemainLength = this.footerMaxLength - combineCommitMessage(answers).length - "\n".length; this.maxLength = Math.min(this.maxLength, footerRemainLength); this.minLength = Math.min(this.minLength, this.footerMinLength); } } export function getQuestions() { const footerQuestionConfig = getRuleQuestionConfig("footer"); if (!footerQuestionConfig) return []; const footerMaxLength = footerQuestionConfig.maxLength; const footerMinLength = footerQuestionConfig.minLength; const fields = [ "isBreaking", "breakingBody", "breaking", "isIssueAffected", "issuesBody", "issues", "footer", ]; return fields .filter((name) => name in getPromptQuestions()) .map((name) => { const questions = getPromptQuestions(); const questionConfigs = { title: questions[name]?.description ?? "", messages: getPromptMessages(), footerMaxLength, footerMinLength, }; if (name === "isBreaking") { Object.assign(questionConfigs, { defaultValue: false, }); } if (name === "breakingBody") { Object.assign(questionConfigs, { when: (answers) => { return answers.isBreaking && !answers.body; }, }); } if (name === "breaking") { Object.assign(questionConfigs, { when: (answers) => { return answers.isBreaking; }, }); } if (name === "isIssueAffected") { Object.assign(questionConfigs, { defaultValue: false, }); } if (name === "issuesBody") { Object.assign(questionConfigs, { when: (answers) => { return (answers.isIssueAffected && !answers.body && !answers.breakingBody); }, }); } if (name === "issues") { Object.assign(questionConfigs, { when: (answers) => { return answers.isIssueAffected; }, }); } if (name === "footer") { Object.assign(questionConfigs, { ...footerQuestionConfig, }); } const instance = new FooterQuestion(name, questionConfigs, footerMaxLength, footerMinLength); return instance.question; }); } export function combineCommitMessage(answers) { // TODO references-empty // TODO signed-off-by const maxLineLength = getMaxLength(getRule("footer", "max-line-length")); const leadingBlankFn = getLeadingBlankFn(getRule("footer", "leading-blank")); const { footer, breaking, issues } = answers; const footerNotes = []; if (breaking) { const BREAKING_CHANGE = "BREAKING CHANGE: "; const message = BREAKING_CHANGE + breaking.replace(new RegExp(`^${BREAKING_CHANGE}`), ""); footerNotes.push(maxLineLength < Infinity ? wrap(message, { width: maxLineLength, trim: true, indent: "", }) : message.trim()); } if (issues) { footerNotes.push(maxLineLength < Infinity ? wrap(issues, { width: maxLineLength, trim: true, indent: "", }) : issues.trim()); } if (footer) { footerNotes.push(maxLineLength < Infinity ? wrap(footer, { width: maxLineLength, trim: true, indent: "", }) : footer); } return leadingBlankFn(footerNotes.join("\n")); } //# sourceMappingURL=SectionFooter.js.map