#!/usr/bin/env node 'use strict'; const prompt = require('prompt-promise'); const semver = require('semver'); const theme = require('../theme'); const {confirm} = require('../utils'); 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). versionsMap.forEach((version, packageName) => { if (!groupedVersionsMap.has(version)) { groupedVersionsMap.set(version, [packageName]); } else { groupedVersionsMap.get(version).push(packageName); } }); // Prompt user to confirm or override each version group. const entries = [...groupedVersionsMap.entries()]; for (let i = 0; i < entries.length; i++) { const [bestGuessVersion, packages] = entries[i]; const packageNames = packages.map(name => theme.package(name)).join(', '); let version = bestGuessVersion; if ( skipPackages.some(skipPackageName => packageNames.includes(skipPackageName) ) ) { await confirm( theme`{spinnerSuccess ✓} Version for ${packageNames} will remain {version ${bestGuessVersion}}` ); } else { const defaultVersion = bestGuessVersion ? theme.version(` (default ${bestGuessVersion})`) : ''; version = (await prompt( theme`{spinnerSuccess ✓} Version for ${packageNames}${defaultVersion}: ` )) || bestGuessVersion; prompt.done(); } // Verify a valid version has been supplied. try { semver(version); packages.forEach(packageName => { versionsMap.set(packageName, version); }); } catch (error) { console.log( theme`{spinnerError ✘} Version {version ${version}} is invalid.` ); // Prompt again i--; } } }; // Run this directly because it's fast, // and logPromise would interfere with console prompting. module.exports = run;