infra-cli
Version:
50 lines (38 loc) • 1.6 kB
JavaScript
const fetch = require('./util/fetch')
const spawn = require('cross-spawn')
const chalk = require('chalk')
const { shouldUseYarn } = require('./util/utils')
const wrapLoading = require('./wrapLoading')
const getRemoteVersion = async (packageName) => {
const registryConfig = spawn.sync('npm', ['config', 'get', 'registry'])
const registry = registryConfig.stdout.toString().trim()
const url = `${registry.replace(/\/$/g, '')}/${packageName}`
try {
const metadata = await fetch.get(url)
if (metadata.error) {
throw new Error(metadata.error)
}
return metadata
} catch (e) {
console.error(chalk.redBright(`Failed to get response from ${url}`))
}
}
module.exports = async function upgrade (packageName, version) {
const result = await wrapLoading(getRemoteVersion, chalk.greenBright('get latest version...'), packageName)
if (result) {
const distTags = result['dist-tags']
const latestVersion = distTags.latest
if (latestVersion === version) {
console.log(chalk.greenBright(`Already installed ${packageName}@${latestVersion}`))
return
}
console.log(`\npackage update from ${chalk.greenBright(version)} to ${chalk.greenBright(latestVersion)}\n`)
const useYarn = shouldUseYarn()
const command = useYarn ? 'yarn' : 'npm'
const args = useYarn ? ['global', 'add', '--latest', packageName] : ['install', '-g', packageName]
const upgradeProc = spawn.sync(command, args, { stdio: 'inherit' })
if (upgradeProc.status !== 0) {
console.error(`upgrade ${chalk.redBright(packageName)} failed`)
}
}
}