123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- "use strict";
- const log = require("npmlog");
- const semver = require("semver");
- /**
- * @see https://github.com/yargs/yargs/blob/master/docs/advanced.md#providing-a-command-module
- */
- exports.command = "version [bump]";
- exports.describe = "Bump version of packages changed since the last release.";
- exports.builder = (yargs, composed) => {
- const opts = {
- "allow-branch": {
- describe: "Specify which branches to allow versioning from.",
- type: "array",
- },
- amend: {
- describe: "Amend the existing commit, instead of generating a new one.",
- type: "boolean",
- },
- "conventional-commits": {
- describe: "Use conventional-changelog to determine version bump and generate CHANGELOG.",
- type: "boolean",
- },
- "conventional-graduate": {
- describe: "Version currently prereleased packages to a non-prerelease version.",
- // type must remain ambiguous because it is overloaded (boolean _or_ string _or_ array)
- },
- "conventional-prerelease": {
- describe: "Version changed packages as prereleases when using --conventional-commits.",
- // type must remain ambiguous because it is overloaded (boolean _or_ string _or_ array)
- },
- "changelog-preset": {
- describe: "Custom conventional-changelog preset.",
- type: "string",
- requiresArg: true,
- defaultDescription: "angular",
- },
- exact: {
- describe: "Specify cross-dependency version numbers exactly rather than with a caret (^).",
- type: "boolean",
- },
- "force-publish": {
- describe: "Always include targeted packages in versioning operations, skipping default logic.",
- // type must remain ambiguous because it is overloaded (boolean _or_ string _or_ array)
- },
- "git-remote": {
- describe: "Push git changes to the specified remote.",
- type: "string",
- requiresArg: true,
- defaultDescription: "origin",
- },
- "create-release": {
- describe: "Create an official GitHub or GitLab release for every version.",
- type: "string",
- choices: ["gitlab", "github"],
- },
- "ignore-changes": {
- describe: [
- "Ignore changes in files matched by glob(s) when detecting changed packages.",
- "Pass --no-ignore-changes to completely disable.",
- ].join("\n"),
- type: "array",
- },
- "ignore-scripts": {
- describe: "Disable all lifecycle scripts",
- type: "boolean",
- },
- "include-merged-tags": {
- describe: "Include tags from merged branches when detecting changed packages.",
- type: "boolean",
- },
- m: {
- describe: "Use a custom commit message when creating the version commit.",
- alias: "message",
- type: "string",
- requiresArg: true,
- },
- "no-changelog": {
- describe: "Do not generate CHANGELOG.md files when using --conventional-commits.",
- type: "boolean",
- },
- changelog: {
- // proxy for --no-changelog
- hidden: true,
- type: "boolean",
- },
- "no-commit-hooks": {
- describe: "Do not run git commit hooks when committing version changes.",
- type: "boolean",
- },
- "commit-hooks": {
- // proxy for --no-commit-hooks
- hidden: true,
- type: "boolean",
- },
- "no-git-tag-version": {
- describe: "Do not commit or tag version changes.",
- type: "boolean",
- },
- "git-tag-version": {
- // proxy for --no-git-tag-version
- hidden: true,
- type: "boolean",
- },
- // TODO: (major) make --no-granular-pathspec the default
- "no-granular-pathspec": {
- describe: "Do not stage changes file-by-file, but globally.",
- type: "boolean",
- },
- "granular-pathspec": {
- // proxy for --no-granular-pathspec
- hidden: true,
- // describe: "Stage changes file-by-file, not globally.",
- type: "boolean",
- },
- // TODO: (major) make --no-private the default
- "no-private": {
- describe: "Do not version private packages.",
- type: "boolean",
- },
- private: {
- // proxy for --no-private
- hidden: true,
- type: "boolean",
- },
- "no-push": {
- describe: "Do not push tagged commit to git remote.",
- type: "boolean",
- },
- push: {
- // proxy for --no-push
- hidden: true,
- type: "boolean",
- },
- // preid is copied into ../publish/command because a whitelist for one option isn't worth it
- preid: {
- describe: "Specify the prerelease identifier when versioning a prerelease",
- type: "string",
- requiresArg: true,
- defaultDescription: "alpha",
- },
- "sign-git-commit": {
- describe: "Pass the `--gpg-sign` flag to `git commit`.",
- type: "boolean",
- },
- "sign-git-tag": {
- describe: "Pass the `--sign` flag to `git tag`.",
- type: "boolean",
- },
- "force-git-tag": {
- describe: "Pass the `--force` flag to `git tag`.",
- type: "boolean",
- },
- "tag-version-prefix": {
- describe: "Customize the tag prefix. To remove entirely, pass an empty string.",
- type: "string",
- requiresArg: true,
- defaultDescription: "v",
- },
- y: {
- describe: "Skip all confirmation prompts.",
- alias: "yes",
- type: "boolean",
- },
- };
- if (composed) {
- // hide options from composed command's help output
- Object.keys(opts).forEach((key) => {
- opts[key].hidden = true;
- });
- // set argv.composed for wrapped execution logic
- yargs.default("composed", composed).hide("composed");
- } else {
- exports.addBumpPositional(yargs);
- }
- yargs.options(opts);
- // workaround yargs bug that re-interprets unknown arguments in argv._
- yargs.parserConfiguration({
- "populate--": true,
- });
- if (!composed) {
- // hide options from composed command's help output
- yargs.group(Object.keys(opts), "Command Options:");
- }
- return yargs
- .option("ignore", {
- // TODO: remove in next major release
- // NOT the same as filter-options --ignore
- hidden: true,
- conflicts: "ignore-changes",
- type: "array",
- })
- .option("cd-version", {
- // TODO: remove in next major release
- hidden: true,
- conflicts: "bump",
- type: "string",
- requiresArg: true,
- })
- .option("repo-version", {
- // TODO: remove in next major release
- hidden: true,
- conflicts: "bump",
- type: "string",
- requiresArg: true,
- })
- .option("skip-git", {
- // TODO: remove in next major release
- hidden: true,
- type: "boolean",
- })
- .option("github-release", {
- // TODO: remove in next major release
- hidden: true,
- type: "boolean",
- })
- .check((argv) => {
- /* eslint-disable no-param-reassign */
- if (argv.ignore) {
- argv.ignoreChanges = argv.ignore;
- delete argv.ignore;
- log.warn("deprecated", "--ignore has been renamed --ignore-changes");
- }
- if (argv.cdVersion && !argv.bump) {
- argv.bump = argv.cdVersion;
- delete argv.cdVersion;
- delete argv["cd-version"];
- log.warn("deprecated", "--cd-version has been replaced by positional [bump]");
- }
- if (argv.repoVersion && !argv.bump) {
- argv.bump = argv.repoVersion;
- delete argv.repoVersion;
- delete argv["repo-version"];
- log.warn("deprecated", "--repo-version has been replaced by positional [bump]");
- }
- if (argv.skipGit) {
- argv.gitTagVersion = false;
- argv["git-tag-version"] = false;
- argv.push = false;
- delete argv.skipGit;
- delete argv["skip-git"];
- log.warn("deprecated", "--skip-git has been replaced by --no-git-tag-version --no-push");
- }
- if (argv.githubRelease) {
- argv.createRelease = "github";
- delete argv.githubRelease;
- log.warn("deprecated", "--github-release has been replaced by --create-release=github");
- }
- /* eslint-enable no-param-reassign */
- if (argv["--"]) {
- log.warn("EDOUBLEDASH", "Arguments after -- are no longer passed to subprocess executions.");
- log.warn("EDOUBLEDASH", "This will cause an error in a future major version.");
- }
- return argv;
- });
- };
- exports.handler = function handler(argv) {
- return require(".")(argv);
- };
- exports.addBumpPositional = function addBumpPositional(yargs, additionalKeywords = []) {
- const semverKeywords = ["major", "minor", "patch", "premajor", "preminor", "prepatch", "prerelease"].concat(
- additionalKeywords
- );
- const bumpOptionList = `'${semverKeywords.slice(0, -1).join("', '")}', or '${
- semverKeywords[semverKeywords.length - 1]
- }'.`;
- yargs.positional("bump", {
- describe: `Increment version(s) by explicit version _or_ semver keyword,\n${bumpOptionList}`,
- type: "string",
- coerce: (choice) => {
- if (!semver.valid(choice) && semverKeywords.indexOf(choice) === -1) {
- throw new Error(`bump must be an explicit version string _or_ one of: ${bumpOptionList}`);
- }
- return choice;
- },
- });
- };
|