UNPKG

8.82 kBJavaScriptView Raw
1const fs = require('fs');
2const fse = require("fs-extra");
3const path = require('path');
4const ora = require('ora');
5const inquirer = require('inquirer');
6const unzipper = require("unzipper");
7const utils = require('../utils');
8const config = require('../../config');
9const logger = require('../utils/logger');
10
11const backupMethod = {
12 backDirs() {
13 return [
14 "src",
15
16 "platforms/android/eeuiApp/app/src/main/assets/eeui",
17 "platforms/ios/eeuiApp/bundlejs/eeui",
18
19 "platforms/android/eeuiApp/app/src/main/res/mipmap-hdpi",
20 "platforms/android/eeuiApp/app/src/main/res/mipmap-ldpi",
21 "platforms/android/eeuiApp/app/src/main/res/mipmap-mdpi",
22 "platforms/android/eeuiApp/app/src/main/res/mipmap-xhdpi",
23 "platforms/android/eeuiApp/app/src/main/res/mipmap-xxhdpi",
24 "platforms/android/eeuiApp/app/src/main/res/mipmap-xxxhdpi",
25
26 "platforms/android/eeuiApp/app/src/main/res/drawable",
27 "platforms/android/eeuiApp/app/src/main/res/drawable-land-hdpi",
28 "platforms/android/eeuiApp/app/src/main/res/drawable-land-ldpi",
29 "platforms/android/eeuiApp/app/src/main/res/drawable-land-mdpi",
30 "platforms/android/eeuiApp/app/src/main/res/drawable-land-xhdpi",
31 "platforms/android/eeuiApp/app/src/main/res/drawable-land-xxhdpi",
32 "platforms/android/eeuiApp/app/src/main/res/drawable-land-xxxhdpi",
33 "platforms/android/eeuiApp/app/src/main/res/drawable-port-hdpi",
34 "platforms/android/eeuiApp/app/src/main/res/drawable-port-ldpi",
35 "platforms/android/eeuiApp/app/src/main/res/drawable-port-mdpi",
36 "platforms/android/eeuiApp/app/src/main/res/drawable-port-xhdpi",
37 "platforms/android/eeuiApp/app/src/main/res/drawable-port-xxhdpi",
38 "platforms/android/eeuiApp/app/src/main/res/drawable-port-xxxhdpi",
39
40 "platforms/android/eeuiApp/android.jks",
41 "platforms/android/eeuiApp/gradle.properties",
42 "platforms/ios/eeuiApp/eeuiApp/Info.plist",
43
44 "platforms/ios/eeuiApp/eeuiApp/Assets.xcassets/AppIcon.appiconset",
45 "platforms/ios/eeuiApp/eeuiApp/Assets.xcassets/LaunchImage.launchimage",
46 ];
47 },
48
49 backup(callback, ignore) {
50 let startBack = () => {
51 let backupPath = path.resolve(config.backupDir);
52 utils.mkdirsSync(backupPath);
53 //
54 let dirLists = this.backDirs();
55 if (ignore instanceof Array) {
56 ignore.forEach((item) => {
57 dirLists.some((dir, index) => {
58 if (item === dir) {
59 dirLists.splice(index, 1);
60 return true;
61 }
62 });
63 })
64 }
65 let entry = [];
66 dirLists.forEach((item) => {
67 entry.push({
68 type: "dir",
69 root: process.cwd(),
70 path: path.join(process.cwd(), item)
71 });
72 });
73 entry.push({
74 type: "file",
75 root: process.cwd(),
76 path: path.join(process.cwd(), "eeui.config.js"),
77 });
78 //
79 let loading = ora('正在备份...').start();
80 utils.zipCompress({
81 output: path.join(backupPath, utils.formatDate("YmdHis") + ".zip"),
82 entry: entry
83 }, (output, err) => {
84 loading.stop();
85 if (err) {
86 if (typeof callback === "function") {
87 callback(false, err);
88 } else {
89 logger.fatal(`备份失败:${err}`);
90 }
91 } else {
92 if (typeof callback === "function") {
93 callback(true, output);
94 } else {
95 logger.success(`备份成功:${output}`);
96 }
97 }
98 });
99 };
100 if (typeof callback === "function") {
101 startBack();
102 } else {
103 inquirer.prompt([{
104 type: 'confirm',
105 message: `确定备份项目开发文件吗?(含:页面、图标、启动页、eeui.config.js)`,
106 name: 'ok',
107 }]).then(answers => {
108 if (answers.ok) {
109 startBack();
110 } else {
111 logger.fatal(`放弃备份!`);
112 }
113 }).catch(console.error);
114 }
115 },
116
117 recovery() {
118 let backupPath = path.resolve(config.backupDir);
119 utils.mkdirsSync(backupPath);
120 let count = utils.count(backupPath);
121 let lists = utils.fileDirDisplay(backupPath, true);
122 let choices = [];
123 for (let index in lists.file) {
124 if (!lists.file.hasOwnProperty(index)) continue;
125 let tmp = lists.file[index];
126 choices.push(tmp.substr(count + 1));
127 }
128 if (choices.length === 0) {
129 logger.fatal(`未找到备份文件!`);
130 }
131 let array = [{
132 type: 'list',
133 name: 'bakname',
134 message: `请选择要恢复的备份文件:`,
135 choices: choices.reverse()
136 }];
137 inquirer.prompt(array).then(function(answers) {
138 inquirer.prompt([{
139 type: 'confirm',
140 message: `您确定恢复备份文件 ${answers.bakname} 吗?(注意:此操作不可撤销)`,
141 name: 'ok',
142 }]).then(confirm => {
143 if (confirm.ok) {
144 let zipFile = path.join(backupPath, answers.bakname);
145 if (!fs.existsSync(zipFile)) {
146 logger.fatal(`恢复失败:备份文件 ${answers.bakname} 不存在!`);
147 }
148 backupMethod.recoveryHandler(zipFile, (res, msg) => {
149 if (res) {
150 logger.success(`恢复成功:${answers.bakname}`);
151 }else{
152 logger.fatal(`恢复失败:${answers.bakname}!`);
153 }
154 });
155 }
156 }).catch(console.error);
157 });
158 },
159
160 recoveryHandler(zipFile, callback, ignore) {
161 let dirLists = this.backDirs();
162 if (ignore instanceof Array) {
163 ignore.forEach((item) => {
164 dirLists.some((dir, index) => {
165 if (item === dir) {
166 dirLists.splice(index, 1);
167 return true;
168 }
169 });
170 })
171 }
172 dirLists.forEach((dir) => {
173 fse.removeSync(path.join(process.cwd(), dir));
174 });
175 //
176 fs.createReadStream(zipFile).pipe(unzipper.Extract({path: process.cwd()})).on('error', (err) => {
177 callback(false, err)
178 }).on('finish', () => {
179 callback(true, null);
180 });
181 },
182
183 updateMainFrame(releasePath, projectPath, projectVersion) {
184 let updatePathLists = [
185 'platforms/android',
186 'platforms/ios',
187 'plugins/eeui/framework',
188 'plugins/eeui/WeexSDK',
189 ];
190 if (!utils.versionFunegt(projectVersion, "2.3.0")) {
191 updatePathLists.push('babel.config.js');
192 updatePathLists.push('gulpfile.js');
193 updatePathLists.push('webpack.config.js');
194 }
195 let filterFileLists = [
196 "platforms/android/eeuiApp/local.properties",
197 ];
198 let filterFileContent = [];
199 //
200 try {
201 filterFileLists.forEach((file) => {
202 let projectFile = path.join(projectPath, file);
203 if (fs.existsSync(projectFile)) {
204 filterFileContent.push({
205 "file": projectFile,
206 "content": fs.readFileSync(projectFile, 'utf8')
207 })
208 }
209 });
210 updatePathLists.forEach((dir) => {
211 let releaseDir = path.join(releasePath, dir);
212 let projectDir = path.join(projectPath, dir);
213 fse.removeSync(projectDir);
214 fse.copySync(releaseDir, projectDir);
215 });
216 filterFileContent.forEach((item) => {
217 utils.mkdirsSync(path.dirname(item.file));
218 fs.writeFileSync(item.file, item.content, 'utf8');
219 });
220 } catch (err) {
221 logger.fatal(`升级新版本文件失败:${err}`);
222 }
223 },
224};
225
226module.exports = backupMethod;