UNPKG

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