UNPKG

commit-and-tag-version

Version:

replacement for `npm version` with automatic CHANGELOG generation

96 lines (89 loc) 3.02 kB
const bump = require('./lib/lifecycles/bump'); const changelog = require('./lib/lifecycles/changelog'); const commit = require('./lib/lifecycles/commit'); const fs = require('fs'); const latestSemverTag = require('./lib/latest-semver-tag'); const path = require('path'); const printError = require('./lib/print-error'); const tag = require('./lib/lifecycles/tag'); const { resolveUpdaterObjectFromArgument } = require('./lib/updaters'); module.exports = async function standardVersion(argv) { const defaults = require('./defaults'); /** * `--message` (`-m`) support will be removed in the next major version. */ const message = argv.m || argv.message; if (message) { /** * The `--message` flag uses `%s` for version substitutions, we swap this * for the substitution defined in the config-spec for future-proofing upstream * handling. */ argv.releaseCommitMessageFormat = message.replace(/%s/g, '{{currentTag}}'); if (!argv.silent) { console.warn( '[commit-and-tag-version]: --message (-m) will be removed in the next major release. Use --releaseCommitMessageFormat.', ); } } if (argv.changelogHeader) { argv.header = argv.changelogHeader; if (!argv.silent) { console.warn( '[commit-and-tag-version]: --changelogHeader will be removed in the next major release. Use --header.', ); } } if ( argv.header && argv.header.search(changelog.START_OF_LAST_RELEASE_PATTERN) !== -1 ) { throw Error( `custom changelog header must not match ${changelog.START_OF_LAST_RELEASE_PATTERN}`, ); } /** * If an argument for `packageFiles` provided, we include it as a "default" `bumpFile`. */ if (argv.packageFiles) { defaults.bumpFiles = defaults.bumpFiles.concat(argv.packageFiles); } const args = Object.assign({}, defaults, argv); let pkg; for (const packageFile of args.packageFiles) { const updater = resolveUpdaterObjectFromArgument(packageFile); if (!updater) return; const pkgPath = path.resolve(process.cwd(), updater.filename); try { const contents = fs.readFileSync(pkgPath, 'utf8'); pkg = { version: updater.updater.readVersion(contents), private: typeof updater.updater.isPrivate === 'function' ? updater.updater.isPrivate(contents) : false, }; break; // eslint-disable-next-line no-unused-vars } catch (err) { /* This probably shouldn't be empty? */ } } try { let version; if (pkg && pkg.version) { version = pkg.version; } else if (args.gitTagFallback) { version = await latestSemverTag(args); } else { throw new Error('no package file found'); } const newVersion = await bump(args, version); await changelog(args, newVersion); await commit(args, newVersion); await tag(newVersion, pkg ? pkg.private : false, args); } catch (err) { printError(args, err.message); throw err; } };