xmatters/upgreat

View on GitHub
src/lib/up/upgrade.js

Summary

Maintainability
B
4 hrs
Test Coverage
const chalk = require('../../util/chalk')
const { exec } = require('../../util/child_process')
const { writeFile } = require('../../util/fs')
const runTests = require('./runTests')
const runBuild = require('./runBuild')

const diffColor = {
  prepatch: chalk.green,
  patch: chalk.green,
  preminor: chalk.yellow,
  minor: chalk.yellow,
  premajor: chalk.red,
  major: chalk.red,
  prerelease: chalk.red,
}

const upgrade = (log, flags) => async dep => {
  log(
    `  - ${dep.name}: ${dep.version} -> ${dep.targetVersion} (${diffColor[
      dep.diff
    ](dep.diff)})`,
  )

  let upgradeCmd = flags.npm ? 'npm install' : 'yarn upgrade';
  if (dep.dev) {
    upgradeCmd += ' -D';
  }

  try {
    await exec(`${upgradeCmd} ${dep.name}@${dep.targetVersion}`)
  } catch (e) {
    log('    failed upgrade');
    if (e && e.cmd) {
      log(`    attempted: ${e.cmd}`);
    }
    return null
  }

  try {
    if (dep.dev) {
      log('      devDependency, running build')
      await runBuild(flags)
    } else {
      log('      dependency, running tests')
      await runTests(flags)
    }
    return dep
  } catch (testErr) {
    const errlogPath = `.upgreat/${dep.name}@${dep.version}->${dep.targetVersion}.txt`

    log(
      `      tests/build failed after upgrade, rolling back.. (failure details in ${chalk.magenta(
        errlogPath,
      )})`,
    )

    await writeFile(errlogPath, testErr.stderr)

    try {
      await exec(`${upgradeCmd} ${dep.name}@${dep.version}`)
      return { ...dep, err: testErr }
    } catch (rollbackErr) {
      log('      failed rolling back!')
      return { ...dep, err: rollbackErr }
    }
  }
}

module.exports = upgrade