version-bumper.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env node
  2. const semver = require('semver');
  3. const minimist = require('minimist');
  4. const { getElectronVersion } = require('../lib/get-version');
  5. const versionUtils = require('./version-utils');
  6. function parseCommandLine () {
  7. let help;
  8. const opts = minimist(process.argv.slice(2), {
  9. string: ['bump', 'version'],
  10. boolean: ['dryRun', 'help'],
  11. alias: { version: ['v'] },
  12. unknown: arg => { help = true; }
  13. });
  14. if (help || opts.help || !opts.bump) {
  15. console.log(`
  16. Bump release version number. Possible arguments:\n
  17. --bump=patch to increment patch version\n
  18. --version={version} to set version number directly\n
  19. --dryRun to print the next version without updating files
  20. Note that you can use both --bump and --stable simultaneously.
  21. `);
  22. process.exit(0);
  23. }
  24. return opts;
  25. }
  26. // run the script
  27. async function main () {
  28. const opts = parseCommandLine();
  29. const currentVersion = getElectronVersion();
  30. const version = await nextVersion(opts.bump, currentVersion);
  31. const parsed = semver.parse(version);
  32. const components = {
  33. major: parsed.major,
  34. minor: parsed.minor,
  35. patch: parsed.patch,
  36. pre: parsed.prerelease
  37. };
  38. // print would-be new version and exit early
  39. if (opts.dryRun) {
  40. console.log(`new version number would be: ${version}\n`);
  41. return 0;
  42. }
  43. console.log(`Bumped to version: ${version}`);
  44. }
  45. // get next version for release based on [nightly, alpha, beta, stable]
  46. async function nextVersion (bumpType, version) {
  47. if (
  48. versionUtils.isNightly(version) ||
  49. versionUtils.isAlpha(version) ||
  50. versionUtils.isBeta(version)
  51. ) {
  52. switch (bumpType) {
  53. case 'nightly':
  54. version = await versionUtils.nextNightly(version);
  55. break;
  56. case 'alpha':
  57. version = await versionUtils.nextAlpha(version);
  58. break;
  59. case 'beta':
  60. version = await versionUtils.nextBeta(version);
  61. break;
  62. case 'stable':
  63. version = semver.valid(semver.coerce(version));
  64. break;
  65. default:
  66. throw new Error('Invalid bump type.');
  67. }
  68. } else if (versionUtils.isStable(version)) {
  69. switch (bumpType) {
  70. case 'nightly':
  71. version = versionUtils.nextNightly(version);
  72. break;
  73. case 'alpha':
  74. throw new Error('Cannot bump to alpha from stable.');
  75. case 'beta':
  76. throw new Error('Cannot bump to beta from stable.');
  77. case 'minor':
  78. version = semver.inc(version, 'minor');
  79. break;
  80. case 'stable':
  81. version = semver.inc(version, 'patch');
  82. break;
  83. default:
  84. throw new Error('Invalid bump type.');
  85. }
  86. } else {
  87. throw new Error(`Invalid current version: ${version}`);
  88. }
  89. return version;
  90. }
  91. function isMajorStable (bump, currentVersion) {
  92. if (versionUtils.isBeta(currentVersion) && (bump === 'stable')) return true;
  93. return false;
  94. }
  95. function isMajorNightly (version, currentVersion) {
  96. const parsed = semver.parse(version);
  97. const current = semver.parse(currentVersion);
  98. if (versionUtils.isNightly(currentVersion) && (parsed.major > current.major)) return true;
  99. return false;
  100. }
  101. if (process.mainModule === module) {
  102. main().catch((error) => {
  103. console.error(error);
  104. process.exit(1);
  105. });
  106. }
  107. module.exports = { nextVersion };