UNPKG

4.99 kBPlain TextView Raw
1#!/usr/bin/env node
2
3const program = require('commander');
4const chalk = require('chalk');
5const rm = require('rimraf');
6const log = require('../lib/log').log;
7const downloadFromGit = require('download-git-repo');
8// const ghdownload = require('github-download');
9const inquirer = require('inquirer');
10const ora = require('ora');
11const path = require('path');
12const fs = require('fs');
13const cp = require('child_process');
14const checkVersion = require('../lib/check-version');
15const writeIgnore = require('../lib/write-ignore.js');
16const writeLog = require('../lib/write-logo.js');
17
18let config; // 存放用户输入的配置
19
20program
21 // .option('-i, --intranet', '使用内网地址')
22 .option('-g, --git', '初始化git')
23 .parse(process.argv);
24
25/**
26 * 初始化git
27 */
28const initGit = () => {
29 cp.execSync('git init', {
30 cwd: config.pathName
31 })
32 cp.execSync(`git remote add origin ${config.gitPath}`, {
33 cwd: config.pathName
34 });
35}
36
37/**
38 * 下载之后做的事情
39 * @param {String} dist 项目目录
40 */
41const afterDownload = () => {
42 writeIgnore(config.pathName);
43 writeLog(config.pathName, config.name);
44 if (program.git) {
45 initGit();
46 }
47
48 let i = 1;
49 log();
50 log('已完成项目的初始化:', 'green');
51 log();
52 log(` ${i++}.在${config.pathName}新建了项目`, 'white');
53 if (program.git) {
54 log(` ${i++}.在${config.pathName}初始化了git`, 'white');
55 }
56 log();
57 log('接下来你需要:', 'white');
58 log();
59 log(` 1.cd ${config.name}`, 'white');
60 log(' 2.npm install(或者 yarn install, cnpm install)', 'white');
61 log();
62 log('然后你可以:', 'white');
63 log();
64 log(' - tofu server 运行开发服务', 'white');
65 log(' - tofu build 打包项目', 'white');
66 log(' - tofu update 更新框架以及命令行工具至最新版本', 'white');
67 log();
68}
69
70/**
71 * 下载项目至指定文件
72 * @param {String} source git源
73 * @param {String} dist 项目目录
74 * @param {Boolean} clone 是否采用git clone来下载
75 */
76const download = (source, dist, clone) => {
77 const spinner = ora('downloading template');
78 spinner.start();
79
80 // if (program.intranet) {
81 // ghdownload(source, dist)
82 // .on('error', (err) => {
83 // if (err) throw err;
84 // })
85 // .on('end', () => {
86 // spinner.stop();
87
88 // afterDownload();
89 // });
90 // } else {
91 downloadFromGit(source, dist, { clone }, err => {
92 spinner.stop();
93
94 if (err) throw err;
95
96 afterDownload();
97 });
98 // }
99}
100
101const initConfig = async () => {
102 let name = await inquirer.prompt({
103 name: 'name',
104 message: '请输入项目名',
105 validate (name) {
106 let regExp = /^[\u4E00-\u9FA5a-zA-Z0-9\-\_\$]+$/;
107 if (regExp.test(name)) {
108 return true;
109 } else {
110 return "请输入正确的项目名,只允许输入汉字,英文,数字,和符号('_', '-', '$')"
111 }
112 }
113 });
114
115 let template = await inquirer.prompt({
116 name: 'template',
117 message: '请选择新建的模板类型',
118 type: 'list',
119 default: 0,
120 choices: [
121 'PC'
122 ]
123 });
124
125 const dist = path.resolve(process.cwd(), name.name);
126 let pathName = await inquirer.prompt({
127 name: 'path',
128 message: `将会把项目新建在:${dist},确定吗?`,
129 type: 'confirm'
130 }).then(res => {
131 if (res.path) {
132 return dist;
133 } else {
134 return inquirer.prompt({
135 name: 'path',
136 message: '请输入项目创建的地址(相对当前路径):',
137 filter (input) {
138 return require('path').resolve(process.cwd(), input);
139 }
140 })
141 }
142 })
143
144 let gitPath;
145 if (program.git) {
146 gitPath = await inquirer.prompt({
147 name: 'gitPath',
148 message: `请输入项目的git地址`,
149 })
150 }
151
152 return Object.assign({ pathName }, template, gitPath, name);
153}
154
155const init = async () => {
156 config = await initConfig();
157
158 // 如果存在文件夹,将会删除当前文件夹
159 rm(config.pathName, err => {
160 if (err) throw err;
161
162 switch (config.template) {
163 case 'PC':
164 // if (program.intranet) {
165 // download('git@192.168.0.192:ishangzu_web/tofu-boilerplate.git', config.pathName);
166 // } else {
167 download('ishangzu-fe/tofu-boilerplate', config.pathName, false);
168 // }
169 break;
170 default:
171 break;
172 }
173 })
174}
175
176require('../lib/check-version')().then(res => {
177 init();
178});