UNPKG

@eighty4/changelog

Version:
79 lines (78 loc) 2.65 kB
const IS_LIST_MARKER = /^[\*\-\+]\s/; // const IS_DATE_DMY = /^(0?\d|2\d|3[1-2])-(0?\d|1[0-2])-(19|20)\d\d$/ // const IS_DATE_MDY = /^(0?\d|1[0-2])-(0?\d|2\d|3[1-2])-(19|20)\d\d$/ // const IS_DATE_YMD = /^(19|20)\d\d-(0?\d|1[0-2])-(0?\d|2\d|3[1-2])$/ const NEWLINE = /\r?\n/; const PARSE_RELEASE_HEADER = /^##\s(?<version>\[?(Unreleased|v?(?<semver>[\d\.]+))\]?)(?:\s-\s(?<date>[\d-]{10}))?$/; export function inspectChangelog(changelog) { const tallies = { listMarkers: { '*': 0, '-': 0, '+': 0, }, }; const errors = []; const versions = []; changelog.split(NEWLINE).forEach((line, i) => { line = line.trim(); if (line.startsWith('## ')) { const match = line.match(PARSE_RELEASE_HEADER); if (match === null) { errors.push({ excerpt: line, kind: 'release-header', line: i + 1, }); } else { const { version } = match.groups; if (!doesVersionHaveBrackets(version)) { errors.push({ excerpt: line, kind: 'version-brackets', line: i + 1, }); versions.push(version); } else { versions.push(version.substring(1, version.length - 1)); } if (match.groups.semver && !isValidSemver(match.groups.semver)) { errors.push({ excerpt: line, kind: 'version-semver', line: i + 1, }); } } } else if (IS_LIST_MARKER.test(line)) { const listMarker = line.charAt(0); tallies.listMarkers[listMarker] = tallies.listMarkers[listMarker] + 1; } }); return { errors, listMarker: getPredominantListMarker(tallies.listMarkers), }; } function doesVersionHaveBrackets(version) { return version.startsWith('[') && version.endsWith(']'); } function isValidSemver(semver) { return /^\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(semver); } function getPredominantListMarker(tallies) { let mostestMarker = '*'; let mostestTally = 0; for (const marker of Object.keys(tallies).sort()) { if (tallies[marker] > mostestTally) { mostestMarker = marker; mostestTally = tallies[marker]; } } return mostestMarker; }