alexlemaire/git-assist

View on GitHub
src/functions/auto-pull/helpers/pm2-startup.js

Summary

Maintainability
A
0 mins
Test Coverage
const childProc = require('child_process')
const chalk = require('chalk')
const pm2Cli = require(appRoot + '/src/utils/pm2/pm2-cli.js')
const pm2Print = chalk.italic.cyan('pm2')

module.exports = async (config) => {
  const localVer = require(appRoot + '/package.json').dependencies.pm2.replace('^', '')
  checkGlobalVer(localVer)
  if (localVer !== config.get('pm2_version')) {
    clog.info(`Updating ${pm2Print} in-memory process...`)
    pm2Cli(['update'], false)
    config.set('pm2_version', localVer)
    clog.success(`${pm2Print} in-memory process successfully updated!`)
  }
  if (process.version === config.get('node_version') && config.get('startup_ran')) {
    clog.info('No need to create pm2 startup script for this machine.')
    return
  }
  const { confirm } = await promptConfirm()
  if (!confirm) {
    clog.info('Aborting process...')
    process.exit()
  }
  startup(config)
}

function promptConfirm () {
  const inquirer = require('inquirer')
  return inquirer.prompt([
    {
      type: 'confirm',
      name: 'confirm',
      message: 'About to unstartup/startup pm2 and potentially update the in-memory process. If you are already using pm2, you will need to restart all your processes and save them again. Are you sure you want to proceed?'
    }
  ])
}

function checkGlobalVer (localVer) {
  const globalVer = childProc.spawnSync('pm2', ['-v']).stdout.toString().trim()
  if (globalVer.match(/(\d+)\.(\d+)\.(\d+)/) && globalVer !== localVer) {
    clog.info(`${chalk.underline('WARNING')}: your globally installed ${pm2Print} version is ${globalVer}. The locally used version of ${pm2Print} is ${localVer}. You may want to update your globally installed ${pm2Print} version to avoid conflict of in-memory process versions...`)
  }
}

function startup (config) {
  clog.info(`Removing ${pm2Print} startup script for this machine...`)
  runPm2Callback('unstartup')
  clog.success(`${pm2Print} startup script successfully removed!`)
  clog.info(`Creating ${pm2Print} startup script for this machine...`)
  runPm2Callback('startup')
  clog.success(`${pm2Print} startup script successfully created!`)
  config.set('node_version', process.version)
  config.set('startup_ran', true)
}

function runPm2Callback (cmd) {
  console.log(`\n${chalk.cyan('---------------')}\n`)
  console.log(`${chalk.cyan('All information displayed below are related to PM2...')}\n`)
  console.log(`${chalk.italic.cyan(`Running pm2 ${cmd}...`)}\n`)
  const pm2Call = pm2Cli([cmd])
  childProc.execSync(pm2Call.stdout.toString().trim(), { stdio: 'inherit' })
  console.log(`\n${chalk.cyan('---------------')}\n`)
}