UNPKG

@eighty4/changelog

Version:
141 lines (140 loc) 4.4 kB
#!/usr/bin/env node import { BadChangelogError, CliError, } from "./errors.js"; import { checkUnreleasedFromCliArgs } from "./task.check.js"; import { getVersionContentFromCliArgs } from "./task.get.js"; import { makeNewChangelogFromCliArgs } from "./task.new.js"; import { nextVersionRolloverFromCliArgs } from "./task.rollover.js"; if (process.argv.find(a => a === '--debug-args')) { console.log(JSON.stringify(process.argv, null, 4)); process.exit(0); } let args = [...process.argv]; let shiftingEntrypoint; while ((shiftingEntrypoint = args.shift())) { if (typeof shiftingEntrypoint === 'undefined' || ['changelog', 'bin.ts', 'bin.js'].find(p => shiftingEntrypoint?.endsWith(p))) { break; } } let task = undefined; if (args.some(arg => arg === '-h' || arg === '--help')) { printHelp(); } let shifted; switch ((shifted = args.shift())) { case 'init': case 'new': task = 'new'; break; case 'check': task = 'check'; break; case 'get': task = 'get'; break; case 'rollover': task = 'rollover'; break; default: if (typeof shifted === 'undefined') { printHelp('missing command'); } else { printHelp(shifted + " isn't a command"); } } try { switch (task) { case 'check': process.exit((await checkUnreleasedFromCliArgs(args)) ? 0 : 1); case 'get': console.log(await getVersionContentFromCliArgs(args)); process.exit(0); case 'new': console.log(makeNewChangelogFromCliArgs(args)); process.exit(0); case 'rollover': await nextVersionRolloverFromCliArgs(args); process.exit(0); } } catch (e) { errorExit(e); } function printHelp(error) { if (error) printError(error); const bold = (s) => `\u001b[1m${s}\u001b[0m`; if (!task || task === 'check') { console.log(`changelog check [--changelog-file CHANGELOG_FILE]`); } if (!task || task === 'get') { console.log(`changelog get ${bold('VERSION')} [--changelog-file CHANGELOG_FILE]`); } if (!task || task === 'new') { console.log(`changelog new ${bold('--repo OWNER/NAME')}`); } if (!task || task === 'rollover') { console.log(`changelog rollover ${bold('NEXT_VERSION')} [--git-tag GIT_TAG] [--changelog-file CHANGELOG_FILE]`); } process.exit(1); } function printError(e) { if (e !== null) { if (typeof e === 'string') { console.error(red('error:'), e); } else if (e instanceof Error) { console.error(red('error:'), e.message); if (e instanceof BadChangelogError) { for (const error of e.errors) { const { excerpt, kind, line } = error; console.error(` at line ${line}, ${changelogErrorDescription(kind)}`); console.error(` ${changelogErrorCorrection(kind, excerpt)}`); } } else if (e instanceof CliError) { console.log('changelog -h for more details'); } } } } function changelogErrorDescription(kind) { switch (kind) { case 'release-header': return 'release header is not valid'; case 'version-brackets': return 'release version must be in Markdown link brackets'; case 'version-semver': return 'release version is not a valid semver'; } } function changelogErrorCorrection(kind, excerpt) { switch (kind) { case 'version-brackets': return `${excerpt} -> ${excerpt .split(/\s+/) .map((s, i) => (i === 1 ? `${green('[')}${s}${green(']')}` : s)) .join(' ')}`; case 'version-semver': return `${excerpt .split(/\s+/) .map((s, i) => (i === 1 ? red(s) : s)) .join(' ')} -> ${excerpt .split(/\s+/) .map((s, i) => (i === 1 ? green('[vX.X.X]') : s)) .join(' ')}`; default: return excerpt; } } function green(s) { return `\u001b[32m${s}\u001b[0m`; } function red(s) { return `\u001b[31m${s}\u001b[0m`; } function errorExit(e) { printError(e); process.exit(1); }