super-project-cli
Version:
CLI for creating project based on Super Project.
140 lines (125 loc) • 4.36 kB
JavaScript
// Updating existing super-project project
const fs = require('fs-extra')
const path = require('path')
const inquirer = require('inquirer')
const downloadNpmPackage = require('download-npm-package')
const clc = require('cli-color')
const getPackageJson = require('get-package-json-from-registry')
const printf = require('printf')
const mergeJson = require('../lib/merge-json')
const getLocales = require('../lib/get-locales')
const spinner = require('../lib/spinner')
const {
corePackageName,
templatePackageName
} = require('../lib/vars')
const run = async () => {
let waiting
const l = await getLocales()
const tmp = path.resolve(process.cwd(), `.SPTMP${(new Date()).valueOf()}`)
const dir = process.cwd()
// const dir = path.resolve(process.cwd(), './1')
const pathPackageJson = path.resolve(dir, 'package.json')
// ========================================================================
// 询问是否执行
const confirm = await inquirer.prompt({
type: 'confirm',
name: 'value',
message: printf(l.about_to_update, clc.green(`system`)),
default: true
})
if (!confirm.value) {
console.log(l.aborted)
return
}
// ========================================================================
// 从package.json获取superProject.type
const infos = await fs.readJson(pathPackageJson)
if (typeof infos.superProject === 'undefined') {
console.log(l.update_aborted)
return
}
const spType = infos.superProject.type
// ========================================================================
// 获取最新super-project包版本
waiting = spinner(l.fetching_sp_package_info)
const spPackageJson = await getPackageJson(corePackageName)
const infosString = await new Promise((resolve, reject) =>
fs.readFile(
pathPackageJson,
'utf-8',
(err, data) => {
if (err) return reject(err)
resolve(data)
}
)
)
await new Promise((resolve, reject) =>
fs.writeFile(
pathPackageJson,
mergeJson(infosString, {
dependencies: {
'super-project': `^${spPackageJson.version}`
}
}),
'utf-8',
(err, data) => {
if (err) return reject(err)
resolve(data)
}
)
)
waiting.stop()
// ========================================================================
// 下载模板
switch (infos.superProject.type) {
case 'react': {
// 下载最新模板
waiting = spinner(l.downloading_template)
try {
await downloadNpmPackage({
arg: templatePackageName[spType],
dir: tmp
})
} catch (err) { }
waiting.finish()
// 复制system目录内容
waiting = spinner(l.copying_updated_files)
await fs.copy(
path.resolve(tmp, templatePackageName[spType], 'system'),
path.resolve(dir, 'system')
)
waiting.finish()
// 删除临时目录
await fs.remove(tmp)
break
}
}
// ========================================================================
// npm install
waiting = spinner(l.installing_dependencies)
try {
await new Promise((resolve, reject) => {
const child = npmRunScript(
`npm install --no-save`,
{
stdio: 'ignore' // quiet
}
);
child.once('error', (error) => {
process.exit(1);
reject(error);
});
child.once('exit', (/*exitCode*/) => {
// process.exit(exitCode);
resolve();
});
})
} catch (err) { }
waiting.finish()
// ========================================================================
console.log(l.update_complete)
console.log(``)
}
run()