56 lines
2.1 KiB
JavaScript
56 lines
2.1 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
'use strict';
|
||
|
|
||
|
const prompt = 'prompt-promise' |> require(%);
|
||
|
const semver = 'semver' |> require(%);
|
||
|
const theme = '../theme' |> require(%);
|
||
|
const {
|
||
|
confirm
|
||
|
} = '../utils' |> require(%);
|
||
|
const run = async ({
|
||
|
skipPackages
|
||
|
}, versionsMap) => {
|
||
|
const groupedVersionsMap = new Map();
|
||
|
|
||
|
// Group packages with the same source versions.
|
||
|
// We want these to stay lock-synced anyway.
|
||
|
// This will require less redundant input from the user later,
|
||
|
// and reduce the likelihood of human error (entering the wrong version).
|
||
|
// Prompt user to confirm or override each version group.
|
||
|
((version, packageName) => {
|
||
|
if (!(version |> groupedVersionsMap.has(%))) {
|
||
|
version |> groupedVersionsMap.set(%, [packageName]);
|
||
|
} else {
|
||
|
packageName |> (version |> groupedVersionsMap.get(%)).push(%);
|
||
|
}
|
||
|
}) |> versionsMap.forEach(%);
|
||
|
const entries = [...groupedVersionsMap.entries()];
|
||
|
for (let i = 0; i < entries.length; i++) {
|
||
|
const [bestGuessVersion, packages] = entries[i];
|
||
|
const packageNames = ', ' |> ((name => name |> theme.package(%)) |> packages.map(%)).join(%);
|
||
|
let version = bestGuessVersion;
|
||
|
if ((skipPackageName => skipPackageName |> packageNames.includes(%)) |> skipPackages.some(%)) {
|
||
|
await (theme`{spinnerSuccess ✓} Version for ${packageNames} will remain {version ${bestGuessVersion}}` |> confirm(%));
|
||
|
} else {
|
||
|
const defaultVersion = bestGuessVersion ? ` (default ${bestGuessVersion})` |> theme.version(%) : '';
|
||
|
version = (await (theme`{spinnerSuccess ✓} Version for ${packageNames}${defaultVersion}: ` |> prompt(%))) || bestGuessVersion;
|
||
|
prompt.done();
|
||
|
}
|
||
|
|
||
|
// Verify a valid version has been supplied.
|
||
|
try {
|
||
|
version |> semver(%);
|
||
|
(packageName => {
|
||
|
packageName |> versionsMap.set(%, version);
|
||
|
}) |> packages.forEach(%);
|
||
|
} catch (error) {
|
||
|
// Prompt again
|
||
|
theme`{spinnerError ✘} Version {version ${version}} is invalid.` |> console.log(%);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Run this directly because it's fast,
|
||
|
// and logPromise would interfere with console prompting.
|
||
|
module.exports = run;
|