@conecli/cone-cli
Version:
松果编辑器命令行工具
90 lines (82 loc) • 2.48 kB
JavaScript
const { execSync } = require('child_process')
const semver = require('semver')
const shell = require('shelljs')
const chalk = require('chalk')
const validateProjectName = require('validate-npm-package-name')
let _hasYarn
let _hasGit
// env detection
exports.hasYarn = () => {
if (_hasYarn != null) {
return _hasYarn
}
try {
execSync('yarn --version', { stdio: 'ignore' })
return (_hasYarn = true)
} catch (e) {
return (_hasYarn = false)
}
}
exports.hasGit = () => {
if (_hasGit != null) {
return _hasGit
}
try {
execSync('git --version', { stdio: 'ignore' })
return (_hasGit = true)
} catch (e) {
return (_hasGit = false)
}
}
// OS
exports.isWindows = process.platform === 'win32'
exports.isMacintosh = process.platform === 'darwin'
exports.isLinux = process.platform === 'linux'
/**
* 检查nodejs版本是否满足要求
*/
exports.checkNodeVersion = (wanted, id) => {
if (!semver.satisfies(process.version, wanted, { includePrerelease: true })) {
console.log(chalk.red(
'You are using Node ' + process.version + ', but this version of ' + id +
' requires Node ' + wanted + '.\nPlease upgrade your Node version.'
))
process.exit(1)
}
}
/**
* 检查自身是否有更新
* @param {*} localVersion
* @param {*} id
*/
exports.checkVersion = (localVersion, id) => {
const result = shell.exec(`npm view ${id} version`, {silent: true});
if (result && result.code === 0) {
const latestVersionStr = result.stdout || '';
const latestVersion = latestVersionStr.split('\n')[0]
if (semver.lt(localVersion, latestVersion)) {
console.log()
console.log(chalk.yellow(' A newer version of ' + id + ' is available.'))
console.log(' latest: ' + chalk.green(latestVersion))
console.log(' installed: ' + chalk.red(localVersion))
console.log(` use command line: ${chalk.yellow('npm install -g @conecli/cone-cli@latest')} to upgrade.`)
console.log()
}
}
}
/**
* 检查项目名称是否合理
*/
exports.checkProjectName = (name) => {
const result = validateProjectName(name)
if (!result.validForNewPackages) {
console.error(chalk.red(`Invalid project name: "${name}"`))
result.errors && result.errors.forEach(err => {
console.error(chalk.red.dim('Error: ' + err))
})
result.warnings && result.warnings.forEach(warn => {
console.error(chalk.red.dim('Warning: ' + warn))
})
process.exit(1)
}
}