UNPKG

9.07 kBJavaScriptView Raw
1const fs = require('fs');
2const fse = require("fs-extra");
3const path = require('path');
4const ora = require('ora');
5const chalk = require('chalk');
6const inquirer = require('inquirer');
7const lodash = require("lodash");
8const logger = require('./logger');
9const config = require("../../config");
10const backup = require("./backup");
11const utils = require("./index");
12const project = require("./project");
13const expand = require("./expand");
14const plugin = require("../plugin/index");
15
16const TemplateRelease = require("../../template-release");
17const templateRelease = new TemplateRelease(config.cacheDirName, config.templateReleaseUrl);
18
19function start() {
20 let projectPath = path.resolve(process.cwd());
21 let releaseFile = path.resolve(projectPath, ".eeui.release");
22 let releaseConfig = utils.jsonParse(!fs.existsSync(releaseFile) ? {} : fs.readFileSync(releaseFile, 'utf8'));
23 //
24 let projectVersion = utils.projectVersion();
25 let newRelease = '';
26 let spinFetch = ora('正在获取版本列表...');
27 spinFetch.start();
28 templateRelease.fetchReleaseVersions((err, result) => {
29 spinFetch.stop();
30 if (err) {
31 logger.fatal(err);
32 }
33 newRelease = result[0];
34 let isLatest = false;
35 if (!utils.versionFunegt(newRelease, projectVersion)) {
36 logger.success(`当前版本(${projectVersion})已是最新版本。`);
37 isLatest = true;
38 }
39 //
40 let questions = [{
41 type: 'confirm',
42 message: isLatest ? (`确定重新安装主框架吗?(${newRelease})`) : (`确定开始升级主框架吗?(${projectVersion} -> ${newRelease})`),
43 name: 'ok',
44 }];
45 if (!utils.isHave(releaseConfig.appName)) {
46 let applicationid = "";
47 questions.push({
48 type: 'input',
49 name: 'appName',
50 default: function () {
51 return 'eeui演示';
52 },
53 message: "请输入App名称",
54 validate: function (value) {
55 return value !== ''
56 }
57 }, {
58 type: 'input',
59 name: 'applicationID',
60 default: function () {
61 return releaseConfig.applicationID || 'app.eeui.simple';
62 },
63 message: "请输入Android应用ID",
64 validate: function (value) {
65 let pass = value.match(/^[a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]+$/);
66 if (pass) {
67 applicationid = value;
68 return true;
69 }
70 return '输入格式错误,请重新输入。';
71 }
72 }, {
73 type: 'input',
74 name: 'bundleIdentifier',
75 default: function () {
76 return releaseConfig.bundleIdentifier || applicationid;
77 },
78 message: "请输入iOS应用ID",
79 validate: function (value) {
80 let pass = value.match(/^[a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]+$/);
81 if (pass) {
82 return true;
83 }
84 return '输入格式错误,请重新输入。';
85 }
86 });
87 }
88 questions.push({
89 type: 'list',
90 name: 'location',
91 message: "请选择下载服务器",
92 choices: [{
93 name: "Github服务器",
94 value: "github"
95 }, {
96 name: "EEUI官网服务器",
97 value: "eeui"
98 }]
99 });
100 inquirer.prompt(questions).then(answers => {
101 if (answers.ok) {
102 logger.info(`开始升级至:${newRelease}`);
103 let originalData = {
104 android: {
105 versionCode: expand.androidGradle("versionCode"),
106 versionName: expand.androidGradle("versionName"),
107 },
108 ios: {
109 CFBundleVersion: expand.iosInfo("CFBundleVersion"),
110 CFBundleShortVersionString: expand.iosInfo("CFBundleShortVersionString"),
111 }
112 };
113 if (!utils.isHave(releaseConfig.release)) {
114 releaseConfig = lodash.merge(releaseConfig, answers);
115 }
116 templateRelease.fetchRelease(newRelease, answers.location, function (error, releasePath) {
117 if (error) {
118 logger.fatal(error);
119 }
120 let releasePackageFile = path.resolve(releasePath, "package.json");
121 if (fs.existsSync(releasePackageFile)) {
122 let releasePackageInfo = utils.jsonParse(fs.readFileSync(releasePackageFile, 'utf8'));
123 let current = require('../../package.json').version;
124 let eeuiclimin = releasePackageInfo.eeuiclimin;
125 if (utils.isHave(eeuiclimin) && utils.versionFunegt(eeuiclimin, current)) {
126 logger.fatal(`当前${chalk.underline(`eeui-cli@${current}`)}版本过低,无法进行升级,请升级至${chalk.underline(`eeui-cli@${eeuiclimin}`)}或以上!${chalk.underline(`https://www.npmjs.com/package/eeui-cli`)}`);
127 }
128 }
129 logger.info(`备份项目开发文件...`);
130 backup.backup((ret, backPath) => {
131 if (!ret) {
132 logger.fatal(`备份失败:${backPath}`);
133 }
134 logger.info(`备份成功`);
135 logger.info(`升级新版本文件...`);
136 backup.updateMainFrame(releasePath, projectPath, projectVersion);
137 logger.info(`升级成功`);
138 logger.info(`恢复项目开发文件...`);
139 backup.recoveryHandler(backPath, (rec, msg) => {
140 if (!rec) {
141 logger.fatal(`恢复失败:${msg}`);
142 }
143 logger.info(`恢复成功`);
144 fse.removeSync(backPath);
145 //
146 releaseConfig.release = newRelease;
147 project.initConfig(projectPath, releaseConfig);
148 expand.androidGradle("versionCode", originalData.android.versionCode);
149 expand.androidGradle("versionName", originalData.android.versionName);
150 expand.iosInfo("CFBundleVersion", originalData.ios.CFBundleVersion);
151 expand.iosInfo("CFBundleShortVersionString", originalData.ios.CFBundleShortVersionString);
152 //
153 plugin.repair(() => {
154 let packageFile = path.resolve(process.cwd(), "package.json");
155 if (fs.existsSync(packageFile)) {
156 let packageInfo = fs.readFileSync(packageFile, 'utf8');
157 let releasePackageFile = path.resolve(releasePath, "package.json");
158 if (fs.existsSync(releasePackageFile)) {
159 let releasePackageInfo = utils.jsonParse(fs.readFileSync(releasePackageFile, 'utf8'));
160 let projectPackageInfo = utils.jsonParse(packageInfo);
161 fs.writeFileSync(packageFile, JSON.stringify(lodash.merge(projectPackageInfo, releasePackageInfo), null, "\t"), 'utf8')
162 }else{
163 packageInfo = packageInfo.replace(/"version"\s*:\s*"(.*?)"/g, `"version": "${newRelease}"`);
164 fs.writeFileSync(packageFile, packageInfo, 'utf8')
165 }
166 }
167 //
168 logger.success(`主框架升级至最新版本(${newRelease})成功。`);
169 logger.sep();
170 logger.info("您可以运行一下命令开始。");
171 logger.info(chalk.white(`1. npm install`));
172 logger.info(chalk.white(`2. npm run dev`));
173 });
174 }, ['src']);
175 }, ['src']);
176 });
177 } else {
178 logger.fatal(isLatest ? `放弃操作!` : `放弃升级!`);
179 }
180 }).catch(console.error);
181 });
182}
183
184module.exports = {start};