UNPKG

5.23 kBJavaScriptView Raw
1'use strict';
2
3const T = require('../lib/tools'),
4 // prompt = require('prompt'),
5 downloader = require('download-github-repo'),
6 fsrr = require('fs-readdir-recursive'),
7 inquirer = require('inquirer'),
8 userHome = require('user-home'),
9 LoadingORA = require('../lib/loadProgress').LoadingORA,
10 cliSpinners = require('../lib/loadProgress').cliSpinners,
11 downloadTemplateRepo = require('./download'),
12 _templetes = require('../templates.json');
13
14const isAutoInstall = T.hasArg('auto-install'),
15 isSkipCacheTemplate = T.hasArg('skip-cache'),
16 templateNamed = T.getArg('template'),
17 host = T.hasArg('host'),
18 port = T.hasArg('port'),
19 liveDelay = T.hasArg('liveDelay'),
20 projectName = T.getProjectName(),
21 to = T.Path.resolve(process.cwd(), projectName);
22let loadPrg;
23
24// 创建新项目
25function create() {
26 if (T.fs.existsSync(to)) {
27 inquirer
28 .prompt([{
29 type: 'confirm',
30 name: 'ok',
31 message: '当前项目已经存在,是否需要覆盖 [Y/n]: '
32 }])
33 .then(awn => {
34 if (awn.ok) {
35 let removePrg = new LoadingORA();
36 removePrg.start(T.msg.yellow('→ 正在删除已存在项目,请稍后......'));
37 T.fsa.remove(to, err => {
38 if (err) return T.log.red(${err} `);
39 removePrg.stop(T.msg.green('√ 删除成功!'));
40 _createProject(projectName);
41 });
42 } else {
43 T.log.end();
44 }
45 });
46 } else {
47 _createProject(projectName);
48 }
49
50 return false;
51}
52
53function _createProject() {
54 let templates = _templetes;
55
56 let tkeys = Object.keys(templates),
57 selectedTemplate,
58 tempPath;
59
60 // one: 如果 --template存在
61 if (templateNamed) {
62 let template = templates[templateNamed];
63 // 如果模板对象存在
64 if (template) {
65 // selectTemplatePrompt();
66 _next(template);
67 } else if (/^[^\/]+\/[^/]+$/.test(templateNamed)) {
68 _next({
69 url: templateNamed
70 });
71 }
72 // two: --template 不存在
73 } else {
74 // 命令行会列出已存在的模板供选择
75 selectTemplatePrompt();
76 }
77
78 function selectTemplatePrompt() {
79 inquirer
80 .prompt([{
81 type: 'list',
82 name: 'template',
83 message: '选择一款适合自己项目的模板: ',
84 choices: tkeys
85 }])
86 .then(awn => {
87 selectedTemplate = templates[awn.template];
88 _next(selectedTemplate);
89 });
90 }
91
92 function _next(template) {
93 tempPath = T.Path.resolve(userHome, '.gupack-templates', template.url);
94
95 // 如果之前已经下载过
96 if (isSkipCacheTemplate && T.fs.existsSync(tempPath)) {
97 T.fsa.removeSync(tempPath);
98 }
99
100 // 跳过缓存 或 缓存不存在则下载
101 if (!T.fs.existsSync(tempPath) || !T.fs.existsSync(T.Path.resolve(tempPath, 'template'))) {
102 downloadTemplateRepo(template)
103 .then(result => {
104 T.log.green(result.message);
105 _copyDir();
106 })
107 .catch(err => {
108 T.log.red(err.message);
109 });
110 } else {
111 _copyDir();
112 }
113 }
114
115 function _copyDir() {
116 let rawCopy = T.Path.resolve(tempPath, 'template');
117
118 T.fsa.mkdirSync(to);
119 T.fsa.copySync(rawCopy, to);
120 // 更新项目名称
121 _updateName(to);
122
123 let files = fsrr(rawCopy, f => f);
124 Array.isArray(files) &&
125 files.forEach(file => {
126 T.log.green(`√ '${T.Path.resolve(to, file)}' is Created`);
127 });
128 if (!isAutoInstall) return process.exit(1);
129 autoInstallPackages();
130 }
131
132 function _updateName(to) {
133 let packageJSONPath = to + '/package.json';
134 let packageObject = require(packageJSONPath);
135 packageObject.name = projectName;
136 T.fs.writeFileSync(packageJSONPath, JSON.stringify(packageObject, null, 2), 'utf8');
137 }
138}
139
140function autoInstallPackages() {
141 process.nextTick(e => {
142 let pachageFile = require(to + '/package.json');
143 let devDependencies = pachageFile.devDependencies || {};
144 let dependencies = pachageFile.dependencies || {};
145 let packages = Object.keys(devDependencies).length + Object.keys(dependencies).length;
146 // 安装对应插件
147 let endText = 'Finished OK =^_^= (^_^) =^_^= \n\r';
148 endText += T.msg.green(`${T.msg.green('√')} Installed ${packages} pachages \n\r`);
149 let startText = T.msg.yellow(`→ installing npm pachages [${packages}] ......`);
150
151 require('./install').runSwap(to, ['install'], startText, endText);
152 });
153}
154
155module.exports = create;
\No newline at end of file