1. #!/usr/bin/env node
    
  2. 
    
  3. 'use strict';
    
  4. 
    
  5. const prompt = require('prompt-promise');
    
  6. const semver = require('semver');
    
  7. const theme = require('../theme');
    
  8. const {confirm} = require('../utils');
    
  9. 
    
  10. const run = async ({skipPackages}, versionsMap) => {
    
  11.   const groupedVersionsMap = new Map();
    
  12. 
    
  13.   // Group packages with the same source versions.
    
  14.   // We want these to stay lock-synced anyway.
    
  15.   // This will require less redundant input from the user later,
    
  16.   // and reduce the likelihood of human error (entering the wrong version).
    
  17.   versionsMap.forEach((version, packageName) => {
    
  18.     if (!groupedVersionsMap.has(version)) {
    
  19.       groupedVersionsMap.set(version, [packageName]);
    
  20.     } else {
    
  21.       groupedVersionsMap.get(version).push(packageName);
    
  22.     }
    
  23.   });
    
  24. 
    
  25.   // Prompt user to confirm or override each version group.
    
  26.   const entries = [...groupedVersionsMap.entries()];
    
  27.   for (let i = 0; i < entries.length; i++) {
    
  28.     const [bestGuessVersion, packages] = entries[i];
    
  29.     const packageNames = packages.map(name => theme.package(name)).join(', ');
    
  30. 
    
  31.     let version = bestGuessVersion;
    
  32.     if (
    
  33.       skipPackages.some(skipPackageName =>
    
  34.         packageNames.includes(skipPackageName)
    
  35.       )
    
  36.     ) {
    
  37.       await confirm(
    
  38.         theme`{spinnerSuccess ✓} Version for ${packageNames} will remain {version ${bestGuessVersion}}`
    
  39.       );
    
  40.     } else {
    
  41.       const defaultVersion = bestGuessVersion
    
  42.         ? theme.version(` (default ${bestGuessVersion})`)
    
  43.         : '';
    
  44.       version =
    
  45.         (await prompt(
    
  46.           theme`{spinnerSuccess ✓} Version for ${packageNames}${defaultVersion}: `
    
  47.         )) || bestGuessVersion;
    
  48.       prompt.done();
    
  49.     }
    
  50. 
    
  51.     // Verify a valid version has been supplied.
    
  52.     try {
    
  53.       semver(version);
    
  54. 
    
  55.       packages.forEach(packageName => {
    
  56.         versionsMap.set(packageName, version);
    
  57.       });
    
  58.     } catch (error) {
    
  59.       console.log(
    
  60.         theme`{spinnerError ✘} Version {version ${version}} is invalid.`
    
  61.       );
    
  62. 
    
  63.       // Prompt again
    
  64.       i--;
    
  65.     }
    
  66.   }
    
  67. };
    
  68. 
    
  69. // Run this directly because it's fast,
    
  70. // and logPromise would interfere with console prompting.
    
  71. module.exports = run;