prompt-version.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. const semver = require("semver");
  3. const { promptSelectOne, promptTextInput } = require("@lerna/prompt");
  4. module.exports.makePromptVersion = makePromptVersion;
  5. /**
  6. * @param {(existingPreid: string) => string} resolvePrereleaseId
  7. */
  8. function makePromptVersion(resolvePrereleaseId) {
  9. return (/** @type {import("@lerna/package-graph").PackageGraphNode} */ node) =>
  10. promptVersion(node.version, node.name, resolvePrereleaseId(node.prereleaseId));
  11. }
  12. /**
  13. * A predicate that prompts user to select/construct a version bump.
  14. * It can be run per-package (independent) or globally (fixed).
  15. *
  16. * @param {string} currentVersion
  17. * @param {string} name (Only used in independent mode)
  18. * @param {string} prereleaseId
  19. */
  20. function promptVersion(currentVersion, name, prereleaseId) {
  21. const patch = semver.inc(currentVersion, "patch");
  22. const minor = semver.inc(currentVersion, "minor");
  23. const major = semver.inc(currentVersion, "major");
  24. const prepatch = semver.inc(currentVersion, "prepatch", prereleaseId);
  25. const preminor = semver.inc(currentVersion, "preminor", prereleaseId);
  26. const premajor = semver.inc(currentVersion, "premajor", prereleaseId);
  27. const message = `Select a new version ${name ? `for ${name} ` : ""}(currently ${currentVersion})`;
  28. return promptSelectOne(message, {
  29. choices: [
  30. { value: patch, name: `Patch (${patch})` },
  31. { value: minor, name: `Minor (${minor})` },
  32. { value: major, name: `Major (${major})` },
  33. { value: prepatch, name: `Prepatch (${prepatch})` },
  34. { value: preminor, name: `Preminor (${preminor})` },
  35. { value: premajor, name: `Premajor (${premajor})` },
  36. { value: "PRERELEASE", name: "Custom Prerelease" },
  37. { value: "CUSTOM", name: "Custom Version" },
  38. ],
  39. }).then((choice) => {
  40. if (choice === "CUSTOM") {
  41. return promptTextInput("Enter a custom version", {
  42. filter: semver.valid,
  43. // semver.valid() always returns null with invalid input
  44. validate: (v) => v !== null || "Must be a valid semver version",
  45. });
  46. }
  47. if (choice === "PRERELEASE") {
  48. const defaultVersion = semver.inc(currentVersion, "prerelease", prereleaseId);
  49. const prompt = `(default: "${prereleaseId}", yielding ${defaultVersion})`;
  50. return promptTextInput(`Enter a prerelease identifier ${prompt}`, {
  51. filter: (v) => semver.inc(currentVersion, "prerelease", v || prereleaseId),
  52. });
  53. }
  54. return choice;
  55. });
  56. }