check-versions.js 1.33 KB
Newer Older
Pan's avatar
Pan committed
1 2 3 4 5 6
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')

7 8 9 10 11
function exec(cmd) {
  return require('child_process')
    .execSync(cmd)
    .toString()
    .trim()
Pan's avatar
Pan committed
12 13
}

Pan's avatar
Pan committed
14
const versionRequirements = [
Pan's avatar
Pan committed
15 16 17 18
  {
    name: 'node',
    currentVersion: semver.clean(process.version),
    versionRequirement: packageConfig.engines.node
Pan's avatar
Pan committed
19
  }
Pan's avatar
Pan committed
20 21 22 23 24 25 26 27 28 29
]

if (shell.which('npm')) {
  versionRequirements.push({
    name: 'npm',
    currentVersion: exec('npm --version'),
    versionRequirement: packageConfig.engines.npm
  })
}

30
module.exports = function() {
Pan's avatar
Pan committed
31 32 33 34 35
  const warnings = []

  for (let i = 0; i < versionRequirements.length; i++) {
    const mod = versionRequirements[i]

Pan's avatar
Pan committed
36
    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
37 38 39 40 41 42
      warnings.push(
        mod.name +
          ': ' +
          chalk.red(mod.currentVersion) +
          ' should be ' +
          chalk.green(mod.versionRequirement)
Pan's avatar
Pan committed
43 44 45 46 47 48
      )
    }
  }

  if (warnings.length) {
    console.log('')
49 50 51 52 53
    console.log(
      chalk.yellow(
        'To use this template, you must update following to modules:'
      )
    )
Pan's avatar
Pan committed
54
    console.log()
Pan's avatar
Pan committed
55 56 57

    for (let i = 0; i < warnings.length; i++) {
      const warning = warnings[i]
Pan's avatar
Pan committed
58 59
      console.log('  ' + warning)
    }
Pan's avatar
Pan committed
60

Pan's avatar
Pan committed
61 62 63 64
    console.log()
    process.exit(1)
  }
}