|
1 |
| -import {ChoiceType, prompt, Separator} from 'inquirer'; |
| 1 | +import {ChoiceType, prompt} from 'inquirer'; |
2 | 2 | import {createNewVersion, ReleaseType} from '../version-name/create-version';
|
3 | 3 | import {parseVersionName, Version} from '../version-name/parse-version';
|
| 4 | +import {determineAllowedPrereleaseLabels} from './prerelease-labels'; |
4 | 5 |
|
5 | 6 | /** Answers that will be prompted for. */
|
6 | 7 | type VersionPromptAnswers = {
|
7 |
| - versionName: string; |
8 |
| - manualCustomVersion: string; |
| 8 | + proposedVersion: string; |
| 9 | + isPrerelease: boolean; |
| 10 | + prereleaseLabel: string; |
9 | 11 | };
|
10 | 12 |
|
11 | 13 | /**
|
12 | 14 | * Prompts the current user-input interface for a new version name. The new version will be
|
13 | 15 | * validated to be a proper increment of the specified current version.
|
14 | 16 | */
|
15 | 17 | export async function promptForNewVersion(currentVersion: Version): Promise<Version> {
|
16 |
| - const versionChoices: ChoiceType[] = [ |
17 |
| - new Separator(), |
18 |
| - {value: 'custom-release', name: 'Release w/ custom version'} |
19 |
| - ]; |
| 18 | + const allowedPrereleaseChoices = determineAllowedPrereleaseLabels(currentVersion); |
| 19 | + const versionChoices: ChoiceType[] = []; |
20 | 20 |
|
21 | 21 | if (currentVersion.prereleaseLabel) {
|
22 |
| - versionChoices.unshift( |
23 |
| - createVersionChoice(currentVersion, 'pre-release', 'Pre-release'), |
24 |
| - createVersionChoice(currentVersion, 'stable-release', 'Stable release')); |
| 22 | + versionChoices.push( |
| 23 | + createVersionChoice(currentVersion, 'stable-release', 'Stable release'), |
| 24 | + createVersionChoice(currentVersion, 'bump-prerelease', 'Bump pre-release number')); |
| 25 | + |
| 26 | + // Only add the option to change the prerelease label if the current version can be |
| 27 | + // changed to a new label. e.g. a version that is already marked as release candidate |
| 28 | + // shouldn't be changed to a beta or alpha version. |
| 29 | + if (allowedPrereleaseChoices) { |
| 30 | + versionChoices.push({ |
| 31 | + value: 'new-prerelease-label', |
| 32 | + name: `New pre-release (${allowedPrereleaseChoices.map(c => c.value).join(', ')})` |
| 33 | + }); |
| 34 | + } |
25 | 35 | } else {
|
26 |
| - versionChoices.unshift( |
| 36 | + versionChoices.push( |
27 | 37 | createVersionChoice(currentVersion, 'major', 'Major release'),
|
28 | 38 | createVersionChoice(currentVersion, 'minor', 'Minor release'),
|
29 | 39 | createVersionChoice(currentVersion, 'patch', 'Patch release'));
|
30 | 40 | }
|
31 | 41 |
|
32 | 42 | const answers = await prompt<VersionPromptAnswers>([{
|
33 | 43 | type: 'list',
|
34 |
| - name: 'versionName', |
| 44 | + name: 'proposedVersion', |
35 | 45 | message: `What's the type of the new release?`,
|
36 | 46 | choices: versionChoices,
|
37 | 47 | }, {
|
38 |
| - type: 'input', |
39 |
| - name: 'manualCustomVersion', |
40 |
| - message: 'Please provide a custom release name:', |
41 |
| - validate: enteredVersion => |
42 |
| - !!parseVersionName(enteredVersion) || 'This is not a valid Semver version', |
43 |
| - when: ({versionName}) => versionName === 'custom-release' |
| 48 | + type: 'prompt', |
| 49 | + name: 'isPrerelease', |
| 50 | + message: 'Should this be a pre-release?', |
| 51 | + // Prompt whether this should a pre-release if the current release is not a pre-release |
| 52 | + when: !currentVersion.prereleaseLabel, |
| 53 | + }, { |
| 54 | + type: 'list', |
| 55 | + name: 'prereleaseLabel', |
| 56 | + message: 'Please select a pre-release label:', |
| 57 | + choices: allowedPrereleaseChoices, |
| 58 | + when: ({isPrerelease, proposedVersion}) => |
| 59 | + // Only prompt for selecting a pre-release label if the current release is a pre-release, |
| 60 | + // or the existing pre-release label should be changed. |
| 61 | + isPrerelease || proposedVersion === 'new-prerelease-label', |
44 | 62 | }]);
|
45 | 63 |
|
46 |
| - return parseVersionName(answers.manualCustomVersion || answers.versionName); |
| 64 | + // In case the new version just changes the pre-release label, we base the new version |
| 65 | + // on top of the current version. Otherwise, we use the proposed version from the |
| 66 | + // prompt answers. |
| 67 | + const newVersion = answers.proposedVersion === 'new-prerelease-label' ? |
| 68 | + currentVersion.clone() : |
| 69 | + parseVersionName(answers.proposedVersion); |
| 70 | + |
| 71 | + if (answers.prereleaseLabel) { |
| 72 | + newVersion.prereleaseLabel = answers.prereleaseLabel; |
| 73 | + newVersion.prereleaseNumber = 0; |
| 74 | + } |
| 75 | + |
| 76 | + return newVersion; |
47 | 77 | }
|
48 | 78 |
|
49 | 79 | /** Creates a new choice for selecting a version inside of an Inquirer list prompt. */
|
|
0 commit comments