UNPKG

jmcreater

Version:

udc前端开发构建工具

173 lines (152 loc) 5.67 kB
'use strict'; var fs = require('fs-extra'); var path = require('path'); var request = require('request'); var _ = require('lodash'); var chalk = require('chalk'); var inquirer = require('inquirer'); var unzip = require('unzip'); var Base = require('./base'); var Util = require('../util'); class App extends Base { constructor(options) { super(options); this.conf = _.assign({ appName: null, description: '' }, options); this.init(); } init() { this.userName = process.env.USERNAME || 'UDC-Developer'; } //创建新项目 create(cb) { var self = this; this.getTemplatesInfo(function (templatesinfo) { self.talk(cb, templatesinfo || {}) }) } //选择希望使用的模板 talk(cb, templatesinfo) { var prompts = []; var conf = this.conf; var checkAppName = function (hasName) { if (hasName) { console.log('项目名称已经存在了,换个名字吧'); } /*prompts.push({ type: 'input', name: "appName", message: "请输入项目名称~", validate: function (input) { if (!input) { return '' } if (fs.existsSync(input)) { return '项目已经存在了,换个名字吧' } return true; } })*/ } if (typeof conf.appName !== 'string') { checkAppName(); } else if (fs.existsSync(conf.appName)) { checkAppName(true); } var tmpchoices = []; if (!templatesinfo.templates) { console.log('模板列表读取失败'); return; } templatesinfo.templates.forEach(function (o, i) { tmpchoices.push(o.name); }) prompts.push({ type: 'list', name: 'tmpName', message: '请选择项目模板:', choices: tmpchoices }); inquirer.prompt(prompts).then(function (answers) { answers.appName = answers.appName || conf.appName; answers.appDescription = answers.appDescription || conf.description; answers.tmpName = answers.tmpName || conf.tmpName; answers.author = this.userName; answers.data = ((new Date()).getFullYear()) + '-' + ((new Date()).getMonth() + 1) + '-' + ((new Date()).getDate()); this.write(answers, templatesinfo.templates, cb); }.bind(this)) } //获得模板信息,模板内容,拷贝到本地 write(options, templatesinfo, cb) { var conf = this.conf = options; var tmpName = conf.tmpName; var _cache = this.readCache(path.join(Util.getTmpPath(), '_cache.json')); var templateCache = _cache.templates; var cacheId = ""; //对应模板本地的id var originId = ""; //服务器远程id if (templateCache) { templateCache.forEach(function (item) { if (tmpName === item.name) { cacheId = item.id; } }); } templatesinfo.forEach(function (item) { if (tmpName === item.name) { originId = item.id; } }); if (cacheId === originId) { this.copyTpl(tmpName, conf.appName, cb) } else { this.downloadTpl(tmpName, function () { var currentItem = ""; templateCache.forEach(function (item) { if (tmpName === item.name) { item.id = originId; currentItem = item; } }); if (!currentItem) { _cache.templates.push({'name': tmpName, 'id': originId}); } this.writeCache(_cache, path.join(Util.getTmpPath(), '_cache.json')); this.copyTpl(tmpName, conf.appName, cb) }.bind(this)); } } //下载远程模板到缓存路径 downloadTpl(tmpName, cb) { console.log(chalk.green(' 正在下载最新的模板,请稍等...')); var self = this; var _tmpPath = path.join(Util.getTmpPath(), tmpName + '.zip'); //下载后存放目录 var setting = Util.getDefaultConfig(); request(setting["tpl-server"] + "/" + tmpName + '.zip') .pipe(fs.createWriteStream(_tmpPath)) .on('finish', function () { var templatesPath = path.join(Util.getTmpPath(), 'templates'); var zip = unzip.Extract({path: templatesPath}); zip .on('close', function () { fs.unlinkSync(_tmpPath); cb(); }) .on('error', function (err) { console.log(err); }); fs.createReadStream(_tmpPath) .pipe(zip); }); } //复制模板到指定目录 copyTpl(tmpName, appName, cb) { var templatesPath = path.join(Util.getTmpPath(), 'templates', tmpName); var targetPath = appName ? (path.join(process.cwd(), appName)) : process.cwd(); fs.copy(templatesPath, targetPath, function () { cb(); }) } } module.exports = App;