UNPKG

super-project-cli

Version:

CLI for creating project based on Super Project.

140 lines (125 loc) 4.36 kB
#!/usr/bin/env node // 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()