aiot-toolkit 1.0.20-importfile-dev.2 → 2.0.1-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -192
- package/lib/bin.d.ts +2 -0
- package/lib/bin.js +148 -0
- package/lib/bin.js.map +1 -0
- package/lib/builder/IBuilder.d.ts +22 -0
- package/lib/builder/IBuilder.js +4 -0
- package/lib/builder/IBuilder.js.map +1 -0
- package/lib/builder/UxBuilder.d.ts +26 -0
- package/lib/builder/UxBuilder.js +102 -0
- package/lib/builder/UxBuilder.js.map +1 -0
- package/lib/builder/XtsBuilder.d.ts +16 -0
- package/lib/builder/XtsBuilder.js +100 -0
- package/lib/builder/XtsBuilder.js.map +1 -0
- package/lib/interface/CommandInterface.d.ts +15 -0
- package/lib/interface/CommandInterface.js +4 -0
- package/lib/interface/CommandInterface.js.map +1 -0
- package/lib/interface/VelaEmulatorInterface.d.ts +8 -0
- package/lib/interface/VelaEmulatorInterface.js +4 -0
- package/lib/interface/VelaEmulatorInterface.js.map +1 -0
- package/lib/starter/GoldfishStarter.d.ts +9 -0
- package/lib/starter/GoldfishStarter.js +108 -0
- package/lib/starter/GoldfishStarter.js.map +1 -0
- package/lib/utils/AdbUtils.d.ts +14 -0
- package/lib/utils/AdbUtils.js +103 -0
- package/lib/utils/AdbUtils.js.map +1 -0
- package/lib/utils/DeviceUtil.d.ts +62 -0
- package/lib/utils/DeviceUtil.js +366 -0
- package/lib/utils/DeviceUtil.js.map +1 -0
- package/lib/utils/RequestUtils.d.ts +11 -0
- package/lib/utils/RequestUtils.js +90 -0
- package/lib/utils/RequestUtils.js.map +1 -0
- package/lib/utils/VelaAvdUtils.d.ts +39 -0
- package/lib/utils/VelaAvdUtils.js +308 -0
- package/lib/utils/VelaAvdUtils.js.map +1 -0
- package/lib/waiter.d.ts +3 -0
- package/lib/waiter.js +39 -0
- package/lib/waiter.js.map +1 -0
- package/package.json +33 -47
- package/CHANGELOG.md +0 -353
- package/bin/index.js +0 -495
- package/gen-webpack-conf/get-devtool.js +0 -51
- package/gen-webpack-conf/helpers.js +0 -143
- package/gen-webpack-conf/index.js +0 -436
- package/gen-webpack-conf/manifest-schema.js +0 -284
- package/gen-webpack-conf/validate.js +0 -284
- package/lib/commands/compile.js +0 -2
- package/lib/commands/debug.js +0 -2
- package/lib/commands/init.js +0 -2
- package/lib/commands/packages.js +0 -2
- package/lib/commands/preview.js +0 -2
- package/lib/commands/report.js +0 -2
- package/lib/commands/resign.js +0 -2
- package/lib/commands/update.js +0 -2
- package/lib/commands/utils.js +0 -2
- package/lib/index.js +0 -2
- package/lib/plugins/manifest-watch-plugin.js +0 -2
- package/lib/utils.js +0 -2
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const emulator_1 = require("@aiot-toolkit/emulator");
|
|
16
|
+
const shared_utils_1 = require("@aiot-toolkit/shared-utils");
|
|
17
|
+
const ColorConsole_1 = __importDefault(require("@aiot-toolkit/shared-utils/lib/ColorConsole"));
|
|
18
|
+
const prompts_1 = require("@inquirer/prompts");
|
|
19
|
+
const adm_zip_1 = __importDefault(require("adm-zip"));
|
|
20
|
+
const axios_1 = __importDefault(require("axios"));
|
|
21
|
+
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
22
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
23
|
+
const os_1 = __importDefault(require("os"));
|
|
24
|
+
const path_1 = __importDefault(require("path"));
|
|
25
|
+
class VelaAvdUtils {
|
|
26
|
+
static validateAvdName(avdName) {
|
|
27
|
+
if (!avdName) {
|
|
28
|
+
return `Please enter avd name`;
|
|
29
|
+
}
|
|
30
|
+
if (!avdName.startsWith('Vela')) {
|
|
31
|
+
return 'The avd name must starts with Vela';
|
|
32
|
+
}
|
|
33
|
+
const avdDir = path_1.default.resolve(VelaAvdUtils.avdHome, `${avdName}.avd`);
|
|
34
|
+
if (fs_extra_1.default.existsSync(avdDir)) {
|
|
35
|
+
return `The avd already exists. Please change avd name`;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从CDN上下载资源文件
|
|
41
|
+
* @param downloadUrl 下载地址
|
|
42
|
+
* @param targetDir 下载后的文件存放的目录
|
|
43
|
+
* @param filename 下载文件的名称
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
static downloadFromCdn(downloadUrl, targetDir, filename) {
|
|
47
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
fs_extra_1.default.mkdirSync(targetDir, { recursive: true });
|
|
49
|
+
const targetFile = path_1.default.resolve(targetDir, filename);
|
|
50
|
+
const progress = new cli_progress_1.default.Bar({
|
|
51
|
+
format: `downloading ${filename}| [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}`,
|
|
52
|
+
clearOnComplete: true,
|
|
53
|
+
stopOnComplete: true
|
|
54
|
+
});
|
|
55
|
+
progress.start(100, 0);
|
|
56
|
+
try {
|
|
57
|
+
const fwrite = fs_extra_1.default.createWriteStream(targetFile);
|
|
58
|
+
const response = yield (0, axios_1.default)({
|
|
59
|
+
method: 'get',
|
|
60
|
+
url: downloadUrl,
|
|
61
|
+
responseType: 'stream',
|
|
62
|
+
onDownloadProgress(evt) {
|
|
63
|
+
evt.total && progress.update((evt.loaded / evt.total) * 100);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
response.data.pipe(fwrite).on('close', () => {
|
|
67
|
+
resolve();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
ColorConsole_1.default.log({
|
|
72
|
+
level: shared_utils_1.LOG_LEVEL.Error,
|
|
73
|
+
message: `download ${filename} failed`
|
|
74
|
+
});
|
|
75
|
+
progress.stop();
|
|
76
|
+
reject();
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 下载zip文件并解压。会将zip里的所有文件解压至targetDir
|
|
82
|
+
* @param downloadUrl 下载地址
|
|
83
|
+
* @param targetDir 解压目录
|
|
84
|
+
* @returns
|
|
85
|
+
*/
|
|
86
|
+
static downloadAndUnzip(downloadUrl, targetDir) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const filename = path_1.default.basename(downloadUrl);
|
|
89
|
+
const targetFile = path_1.default.resolve(targetDir, filename);
|
|
90
|
+
try {
|
|
91
|
+
fs_extra_1.default.mkdirSync(targetDir, { recursive: true });
|
|
92
|
+
yield VelaAvdUtils.downloadFromCdn(downloadUrl, targetDir, filename);
|
|
93
|
+
fs_extra_1.default.chmodSync(targetFile, 0o777);
|
|
94
|
+
const zip = new adm_zip_1.default(targetFile);
|
|
95
|
+
zip.extractAllTo(targetDir, true, true);
|
|
96
|
+
fs_extra_1.default.rmSync(targetFile);
|
|
97
|
+
return Promise.resolve();
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
if (fs_extra_1.default.existsSync(targetFile)) {
|
|
101
|
+
fs_extra_1.default.rmSync(targetFile);
|
|
102
|
+
}
|
|
103
|
+
return Promise.reject();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** 根据host获取模拟器下载地址 */
|
|
108
|
+
static getEmulatorUrl(version = '0.0.1') {
|
|
109
|
+
const systemOs = os_1.default.platform();
|
|
110
|
+
const arch = os_1.default.arch();
|
|
111
|
+
let hostOs = '';
|
|
112
|
+
let hostArch = '';
|
|
113
|
+
switch (systemOs) {
|
|
114
|
+
case 'linux':
|
|
115
|
+
hostOs = 'linux';
|
|
116
|
+
hostArch = arch === 'x64' ? 'x86_64' : 'aarch64';
|
|
117
|
+
break;
|
|
118
|
+
case 'win32':
|
|
119
|
+
hostOs = 'windows';
|
|
120
|
+
hostArch = arch === 'x64' ? 'x86_64' : 'aarch64';
|
|
121
|
+
break;
|
|
122
|
+
case 'darwin':
|
|
123
|
+
hostOs = 'darwin';
|
|
124
|
+
hostArch = arch === 'x64' ? 'x86_64' : 'aarch64';
|
|
125
|
+
default:
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
return `${VelaAvdUtils.emulatorBaseUrl}/v${version}/${hostOs}-${hostArch}.zip`;
|
|
129
|
+
}
|
|
130
|
+
/** 根据host获取vela镜像下载地址 */
|
|
131
|
+
static getSystemImageUrl(version = '0.0.1', device = 'arm') {
|
|
132
|
+
return `${VelaAvdUtils.systemImageBaseUrl}/v${version}/${device}/nuttx`;
|
|
133
|
+
}
|
|
134
|
+
/** 根据host获取ya-vm-file-server下载地址 */
|
|
135
|
+
static getv9fsToolUrl(version = '0.0.1') {
|
|
136
|
+
const systemOs = os_1.default.platform();
|
|
137
|
+
const arch = os_1.default.arch();
|
|
138
|
+
let v9fsTool = '';
|
|
139
|
+
switch (systemOs) {
|
|
140
|
+
case 'linux':
|
|
141
|
+
v9fsTool = 'ya-vm-file-server-linux-x86_64';
|
|
142
|
+
break;
|
|
143
|
+
case 'win32':
|
|
144
|
+
v9fsTool = 'ya-vm-file-server-windows.exe';
|
|
145
|
+
break;
|
|
146
|
+
case 'darwin':
|
|
147
|
+
v9fsTool = (arch === 'x64') ? 'ya-vm-file-server-darwin-x84_64' : 'ya-vm-file-server-darwin-aarch64';
|
|
148
|
+
default:
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
return `${VelaAvdUtils.baseUrl}/tools/v${version}/${v9fsTool}`;
|
|
152
|
+
}
|
|
153
|
+
/** 获取资源文件下载地址 */
|
|
154
|
+
static getDownloadUrl(file, version = '0.0.1') {
|
|
155
|
+
return `${VelaAvdUtils.baseUrl}/${file}/v${version}/${file}.zip`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 命令行访问方式创建模拟器
|
|
159
|
+
*/
|
|
160
|
+
static createVelaAvdByInquire() {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
try {
|
|
163
|
+
const versionFile = path_1.default.resolve(VelaAvdUtils.sdkHome, 'versions.json');
|
|
164
|
+
const versionFileExist = fs_extra_1.default.existsSync(versionFile);
|
|
165
|
+
let versionInfo = undefined;
|
|
166
|
+
if (versionFileExist) {
|
|
167
|
+
versionInfo = fs_extra_1.default.readJSONSync(versionFile);
|
|
168
|
+
}
|
|
169
|
+
// 下载version.json,保证每次下载的文件都是最新的版本
|
|
170
|
+
yield VelaAvdUtils.downloadFromCdn(VelaAvdUtils.versionUrl, VelaAvdUtils.sdkHome, 'online-version.json');
|
|
171
|
+
const onlineVersionFile = path_1.default.resolve(VelaAvdUtils.sdkHome, 'online-version.json');
|
|
172
|
+
const onlineVersionInfo = fs_extra_1.default.readJSONSync(onlineVersionFile);
|
|
173
|
+
// avdName
|
|
174
|
+
const avdName = yield (0, prompts_1.input)({
|
|
175
|
+
message: 'avd name starting with Vela. (eg. Vela_Virtual_Device)',
|
|
176
|
+
default: 'Vela_Virtual_Device',
|
|
177
|
+
validate(value) {
|
|
178
|
+
return VelaAvdUtils.validateAvdName(value);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// skin或者size
|
|
182
|
+
const needSkin = yield (0, prompts_1.confirm)({
|
|
183
|
+
message: 'need avd skin?',
|
|
184
|
+
default: true
|
|
185
|
+
});
|
|
186
|
+
const skinDir = path_1.default.resolve(VelaAvdUtils.sdkHome, 'skins');
|
|
187
|
+
const skinExists = fs_extra_1.default.existsSync(skinDir);
|
|
188
|
+
let avdSkin = '';
|
|
189
|
+
let avdWidth = '';
|
|
190
|
+
let avdHeight = '';
|
|
191
|
+
if (needSkin) {
|
|
192
|
+
if (!skinExists || (versionInfo && versionInfo.skins < onlineVersionInfo.skins)) {
|
|
193
|
+
const skinsUrl = VelaAvdUtils.getDownloadUrl('skins', onlineVersionInfo.skins);
|
|
194
|
+
yield VelaAvdUtils.downloadAndUnzip(skinsUrl, path_1.default.resolve(VelaAvdUtils.sdkHome, 'skins'));
|
|
195
|
+
ColorConsole_1.default.log({
|
|
196
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
197
|
+
message: `download skins succeed.`
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const skinList = VelaAvdUtils.velaAvdCls.getVelaSkinList();
|
|
201
|
+
avdSkin = yield (0, prompts_1.select)({
|
|
202
|
+
message: 'avd skin.',
|
|
203
|
+
choices: skinList.map((item) => {
|
|
204
|
+
return {
|
|
205
|
+
name: item,
|
|
206
|
+
value: item,
|
|
207
|
+
description: item
|
|
208
|
+
};
|
|
209
|
+
})
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
avdWidth = yield (0, prompts_1.input)({
|
|
214
|
+
message: 'avd width.',
|
|
215
|
+
default: '480'
|
|
216
|
+
});
|
|
217
|
+
avdHeight = yield (0, prompts_1.input)({
|
|
218
|
+
message: 'avd height.',
|
|
219
|
+
default: '480'
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// 镜像,TODO:后续需要考虑多种设备的镜像
|
|
223
|
+
const avdArch = (yield (0, prompts_1.select)({
|
|
224
|
+
message: 'vela image.',
|
|
225
|
+
choices: [{ value: 'arm' }, { value: 'arm64' }]
|
|
226
|
+
}));
|
|
227
|
+
// 下载模拟器
|
|
228
|
+
const emulatorDir = path_1.default.resolve(VelaAvdUtils.sdkHome, 'emulator');
|
|
229
|
+
const emulatorExists = fs_extra_1.default.existsSync(emulatorDir);
|
|
230
|
+
if (!emulatorExists || (versionInfo && versionInfo.emulator < onlineVersionInfo.emulator)) {
|
|
231
|
+
const emulatorDownloadUrl = VelaAvdUtils.getEmulatorUrl(onlineVersionInfo.emulator);
|
|
232
|
+
yield VelaAvdUtils.downloadAndUnzip(emulatorDownloadUrl, emulatorDir);
|
|
233
|
+
ColorConsole_1.default.log({
|
|
234
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
235
|
+
message: `download emulator succeed.`
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
// 下载镜像
|
|
239
|
+
const velaImageDownloadUrl = this.getSystemImageUrl(onlineVersionInfo['system-images'], avdArch);
|
|
240
|
+
const imageDir = path_1.default.resolve(VelaAvdUtils.sdkHome, 'system-images', avdArch);
|
|
241
|
+
const imageExists = fs_extra_1.default.existsSync(path_1.default.resolve(imageDir, 'nuttx'));
|
|
242
|
+
if (!imageExists ||
|
|
243
|
+
(versionInfo && versionInfo['system-images'] < onlineVersionInfo['system-images'])) {
|
|
244
|
+
yield VelaAvdUtils.downloadFromCdn(velaImageDownloadUrl, imageDir, 'nuttx');
|
|
245
|
+
ColorConsole_1.default.log({
|
|
246
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
247
|
+
message: `download vela image succeed.`
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
// 下载快应用qa文件
|
|
251
|
+
const qaDir = path_1.default.resolve(VelaAvdUtils.sdkHome, 'qa');
|
|
252
|
+
const qaExists = fs_extra_1.default.existsSync(qaDir);
|
|
253
|
+
if (!qaExists || (versionInfo && versionInfo.qa < onlineVersionInfo.qa)) {
|
|
254
|
+
const qaUrl = VelaAvdUtils.getDownloadUrl('qa', onlineVersionInfo.qa);
|
|
255
|
+
yield VelaAvdUtils.downloadAndUnzip(qaUrl, qaDir);
|
|
256
|
+
ColorConsole_1.default.log({
|
|
257
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
258
|
+
message: `download quickapp font succeed.`
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// 下载tools
|
|
262
|
+
const toolsDir = path_1.default.resolve(VelaAvdUtils.sdkHome, 'tools');
|
|
263
|
+
const toolsExists = fs_extra_1.default.existsSync(toolsDir);
|
|
264
|
+
if (!toolsExists || (versionInfo && versionInfo.tools < onlineVersionInfo.tools)) {
|
|
265
|
+
const v9fsToolUrl = VelaAvdUtils.getv9fsToolUrl();
|
|
266
|
+
const filename = (os_1.default.platform() === 'win32') ? 'ya-vm-file-server.exe' : 'ya-vm-file-server';
|
|
267
|
+
yield VelaAvdUtils.downloadFromCdn(v9fsToolUrl, toolsDir, filename);
|
|
268
|
+
ColorConsole_1.default.log({
|
|
269
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
270
|
+
message: `download tools succeed.`
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// 替换version.json
|
|
274
|
+
if (versionFileExist) {
|
|
275
|
+
fs_extra_1.default.rmSync(versionFile);
|
|
276
|
+
}
|
|
277
|
+
fs_extra_1.default.renameSync(onlineVersionFile, versionFile);
|
|
278
|
+
// 创建avd文本文件
|
|
279
|
+
const avdImagePath = imageDir;
|
|
280
|
+
const avdParams = { avdName, avdSkin, avdWidth, avdHeight, avdArch, avdImagePath };
|
|
281
|
+
VelaAvdUtils.velaAvdCls.createVelaAvd(avdParams);
|
|
282
|
+
ColorConsole_1.default.log({
|
|
283
|
+
level: shared_utils_1.LOG_LEVEL.Success,
|
|
284
|
+
message: `create avd succeed.`
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
ColorConsole_1.default.log({
|
|
289
|
+
level: shared_utils_1.LOG_LEVEL.Error,
|
|
290
|
+
message: `create avd failed. Error: ${e.message}`
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
VelaAvdUtils.sdkHome = path_1.default.resolve(os_1.default.homedir(), '.export');
|
|
297
|
+
VelaAvdUtils.avdHome = path_1.default.resolve(os_1.default.homedir(), '.android', 'avd');
|
|
298
|
+
VelaAvdUtils.baseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide';
|
|
299
|
+
VelaAvdUtils.versionUrl = 'https://cdn.cnbj3-fusion.fds.api.mi-img.com/vela-ide/versions.json';
|
|
300
|
+
VelaAvdUtils.emulatorBaseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide/emulator';
|
|
301
|
+
VelaAvdUtils.systemImageBaseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide/system-images';
|
|
302
|
+
VelaAvdUtils.velaAvdCls = new emulator_1.VelaAvdCls({
|
|
303
|
+
sdkHome: VelaAvdUtils.sdkHome,
|
|
304
|
+
avdHome: VelaAvdUtils.avdHome
|
|
305
|
+
});
|
|
306
|
+
exports.default = VelaAvdUtils;
|
|
307
|
+
|
|
308
|
+
//# sourceMappingURL=VelaAvdUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["utils/VelaAvdUtils.ts"],"names":[],"mappings":"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","file":"VelaAvdUtils.js","sourcesContent":["import { IAvdArchType, VelaAvdCls } from '@aiot-toolkit/emulator'\nimport { LOG_LEVEL } from '@aiot-toolkit/shared-utils'\nimport ColorConsole from '@aiot-toolkit/shared-utils/lib/ColorConsole'\nimport { confirm, input, select } from '@inquirer/prompts'\nimport AdmZip from 'adm-zip'\nimport axios from 'axios'\nimport cliProgress from 'cli-progress'\nimport fs from 'fs-extra'\nimport os from 'os'\nimport path from 'path'\nimport { IGoldfishVersionInfo } from '../interface/VelaEmulatorInterface'\n\nclass VelaAvdUtils {\n static sdkHome = path.resolve(os.homedir(), '.export')\n static avdHome = path.resolve(os.homedir(), '.android', 'avd')\n static baseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide'\n static versionUrl = 'https://cdn.cnbj3-fusion.fds.api.mi-img.com/vela-ide/versions.json'\n static emulatorBaseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide/emulator'\n static systemImageBaseUrl = 'https://vela-ide.cnbj3-fusion.mi-fds.com/vela-ide/system-images'\n static velaAvdCls: VelaAvdCls = new VelaAvdCls({\n sdkHome: VelaAvdUtils.sdkHome,\n avdHome: VelaAvdUtils.avdHome\n })\n\n static validateAvdName(avdName: string) {\n if (!avdName) {\n return `Please enter avd name`\n }\n if (!avdName.startsWith('Vela')) {\n return 'The avd name must starts with Vela'\n }\n const avdDir = path.resolve(VelaAvdUtils.avdHome, `${avdName}.avd`)\n if (fs.existsSync(avdDir)) {\n return `The avd already exists. Please change avd name`\n }\n return true\n }\n\n /**\n * 从CDN上下载资源文件\n * @param downloadUrl 下载地址\n * @param targetDir 下载后的文件存放的目录\n * @param filename 下载文件的名称\n * @returns\n */\n static downloadFromCdn(downloadUrl: string, targetDir: string, filename: string) {\n return new Promise<void>(async (resolve, reject) => {\n fs.mkdirSync(targetDir, { recursive: true })\n const targetFile = path.resolve(targetDir, filename)\n const progress = new cliProgress.Bar({\n format: `downloading ${filename}| [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}`,\n clearOnComplete: true,\n stopOnComplete: true\n })\n progress.start(100, 0)\n try {\n const fwrite = fs.createWriteStream(targetFile)\n const response = await axios({\n method: 'get',\n url: downloadUrl,\n responseType: 'stream',\n onDownloadProgress(evt) {\n evt.total && progress.update((evt.loaded / evt.total) * 100)\n }\n })\n response.data.pipe(fwrite).on('close', () => {\n resolve()\n })\n } catch (e) {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `download ${filename} failed`\n })\n progress.stop()\n reject()\n }\n })\n }\n /**\n * 下载zip文件并解压。会将zip里的所有文件解压至targetDir\n * @param downloadUrl 下载地址\n * @param targetDir 解压目录\n * @returns\n */\n static async downloadAndUnzip(downloadUrl: string, targetDir: string) {\n const filename = path.basename(downloadUrl)\n const targetFile = path.resolve(targetDir, filename)\n try {\n fs.mkdirSync(targetDir, { recursive: true })\n await VelaAvdUtils.downloadFromCdn(downloadUrl, targetDir, filename)\n fs.chmodSync(targetFile, 0o777)\n const zip = new AdmZip(targetFile)\n zip.extractAllTo(targetDir, true, true)\n fs.rmSync(targetFile)\n return Promise.resolve()\n } catch (e) {\n if (fs.existsSync(targetFile)) {\n fs.rmSync(targetFile)\n }\n return Promise.reject()\n }\n }\n\n /** 根据host获取模拟器下载地址 */\n static getEmulatorUrl(version: string = '0.0.1'): string {\n const systemOs = os.platform()\n const arch = os.arch()\n let hostOs = ''\n let hostArch = ''\n switch (systemOs) {\n case 'linux':\n hostOs = 'linux'\n hostArch = arch === 'x64' ? 'x86_64' : 'aarch64'\n break\n case 'win32':\n hostOs = 'windows'\n hostArch = arch === 'x64' ? 'x86_64' : 'aarch64'\n break\n case 'darwin':\n hostOs = 'darwin'\n hostArch = arch === 'x64' ? 'x86_64' : 'aarch64'\n default:\n break\n }\n return `${VelaAvdUtils.emulatorBaseUrl}/v${version}/${hostOs}-${hostArch}.zip`\n }\n\n /** 根据host获取vela镜像下载地址 */\n static getSystemImageUrl(version: string = '0.0.1', device: string = 'arm') {\n return `${VelaAvdUtils.systemImageBaseUrl}/v${version}/${device}/nuttx`\n }\n\n /** 根据host获取ya-vm-file-server下载地址 */\n static getv9fsToolUrl(version: string = '0.0.1') {\n const systemOs = os.platform()\n const arch = os.arch()\n let v9fsTool = ''\n switch(systemOs) {\n case 'linux':\n v9fsTool = 'ya-vm-file-server-linux-x86_64'\n break\n case 'win32':\n v9fsTool = 'ya-vm-file-server-windows.exe'\n break\n case 'darwin':\n v9fsTool = (arch === 'x64') ? 'ya-vm-file-server-darwin-x84_64' : 'ya-vm-file-server-darwin-aarch64'\n default: \n break\n }\n return `${VelaAvdUtils.baseUrl}/tools/v${version}/${v9fsTool}`\n }\n\n /** 获取资源文件下载地址 */\n static getDownloadUrl(file: string, version: string = '0.0.1') {\n return `${VelaAvdUtils.baseUrl}/${file}/v${version}/${file}.zip`;\n }\n\n /**\n * 命令行访问方式创建模拟器\n */\n static async createVelaAvdByInquire() {\n try {\n const versionFile = path.resolve(VelaAvdUtils.sdkHome, 'versions.json')\n const versionFileExist = fs.existsSync(versionFile)\n let versionInfo: IGoldfishVersionInfo | undefined = undefined\n if (versionFileExist) {\n versionInfo = fs.readJSONSync(versionFile)\n }\n // 下载version.json,保证每次下载的文件都是最新的版本\n await VelaAvdUtils.downloadFromCdn(VelaAvdUtils.versionUrl, VelaAvdUtils.sdkHome, 'online-version.json')\n const onlineVersionFile = path.resolve(VelaAvdUtils.sdkHome, 'online-version.json')\n const onlineVersionInfo: IGoldfishVersionInfo = fs.readJSONSync(onlineVersionFile)\n // avdName\n const avdName = await input({\n message: 'avd name starting with Vela. (eg. Vela_Virtual_Device)',\n default: 'Vela_Virtual_Device',\n validate(value: string) {\n return VelaAvdUtils.validateAvdName(value)\n }\n })\n // skin或者size\n const needSkin = await confirm({\n message: 'need avd skin?',\n default: true\n })\n const skinDir = path.resolve(VelaAvdUtils.sdkHome, 'skins')\n const skinExists = fs.existsSync(skinDir)\n let avdSkin = ''\n let avdWidth = ''\n let avdHeight = ''\n if (needSkin) {\n if (!skinExists || (versionInfo && versionInfo.skins < onlineVersionInfo.skins)) {\n const skinsUrl = VelaAvdUtils.getDownloadUrl('skins', onlineVersionInfo.skins)\n await VelaAvdUtils.downloadAndUnzip(skinsUrl, path.resolve(VelaAvdUtils.sdkHome, 'skins'))\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `download skins succeed.`\n })\n }\n const skinList = VelaAvdUtils.velaAvdCls.getVelaSkinList()\n avdSkin = await select({\n message: 'avd skin.',\n choices: skinList.map((item: string) => {\n return {\n name: item,\n value: item,\n description: item\n }\n })\n })\n } else {\n avdWidth = await input({\n message: 'avd width.',\n default: '480'\n })\n avdHeight = await input({\n message: 'avd height.',\n default: '480'\n })\n }\n // 镜像,TODO:后续需要考虑多种设备的镜像\n const avdArch = (await select({\n message: 'vela image.',\n choices: [{ value: 'arm' }, { value: 'arm64' }]\n })) as IAvdArchType\n // 下载模拟器\n const emulatorDir = path.resolve(VelaAvdUtils.sdkHome, 'emulator')\n const emulatorExists = fs.existsSync(emulatorDir)\n if (!emulatorExists || (versionInfo && versionInfo.emulator < onlineVersionInfo.emulator)) {\n const emulatorDownloadUrl = VelaAvdUtils.getEmulatorUrl(onlineVersionInfo.emulator)\n await VelaAvdUtils.downloadAndUnzip(emulatorDownloadUrl, emulatorDir)\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `download emulator succeed.`\n })\n }\n // 下载镜像\n const velaImageDownloadUrl = this.getSystemImageUrl(onlineVersionInfo['system-images'], avdArch)\n const imageDir = path.resolve(VelaAvdUtils.sdkHome, 'system-images', avdArch)\n const imageExists = fs.existsSync(path.resolve(imageDir, 'nuttx'))\n if (\n !imageExists ||\n (versionInfo && versionInfo['system-images'] < onlineVersionInfo['system-images'])\n ) {\n await VelaAvdUtils.downloadFromCdn(velaImageDownloadUrl, imageDir, 'nuttx')\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `download vela image succeed.`\n })\n }\n // 下载快应用qa文件\n const qaDir = path.resolve(VelaAvdUtils.sdkHome, 'qa')\n const qaExists = fs.existsSync(qaDir)\n if (!qaExists || (versionInfo && versionInfo.qa < onlineVersionInfo.qa)) {\n const qaUrl = VelaAvdUtils.getDownloadUrl('qa', onlineVersionInfo.qa)\n await VelaAvdUtils.downloadAndUnzip(qaUrl, qaDir)\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `download quickapp font succeed.`\n })\n }\n // 下载tools\n const toolsDir = path.resolve(VelaAvdUtils.sdkHome, 'tools')\n const toolsExists = fs.existsSync(toolsDir)\n if (!toolsExists || (versionInfo && versionInfo.tools < onlineVersionInfo.tools)) { \n const v9fsToolUrl = VelaAvdUtils.getv9fsToolUrl()\n const filename = (os.platform() === 'win32') ? 'ya-vm-file-server.exe' : 'ya-vm-file-server'\n await VelaAvdUtils.downloadFromCdn(v9fsToolUrl, toolsDir, filename)\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `download tools succeed.`\n })\n }\n // 替换version.json\n if (versionFileExist) {\n fs.rmSync(versionFile)\n }\n fs.renameSync(onlineVersionFile, versionFile)\n // 创建avd文本文件\n const avdImagePath = imageDir\n const avdParams = { avdName, avdSkin, avdWidth, avdHeight, avdArch, avdImagePath }\n VelaAvdUtils.velaAvdCls.createVelaAvd(avdParams)\n ColorConsole.log({\n level: LOG_LEVEL.Success,\n message: `create avd succeed.`\n })\n } catch (e) {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `create avd failed. Error: ${(e as Error).message}`\n })\n }\n }\n}\n\nexport default VelaAvdUtils\n"],"sourceRoot":"../../src"}
|
package/lib/waiter.d.ts
ADDED
package/lib/waiter.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commander_1 = require("@aiot-toolkit/commander");
|
|
4
|
+
const waiter = new commander_1.PersistentCommand({
|
|
5
|
+
description: 'aiot-toolkit 常驻命令',
|
|
6
|
+
options: [
|
|
7
|
+
{
|
|
8
|
+
key: 'a',
|
|
9
|
+
description: '获取设备列表',
|
|
10
|
+
action() {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
console.log('获取中...');
|
|
13
|
+
setTimeout(() => {
|
|
14
|
+
console.log('设备列表:123');
|
|
15
|
+
resolve();
|
|
16
|
+
}, 3000);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
key: 'i',
|
|
22
|
+
description: '自我介绍',
|
|
23
|
+
action() {
|
|
24
|
+
console.log('我就是一个没用的快捷命令');
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
key: '?',
|
|
29
|
+
description: '显示所有命令',
|
|
30
|
+
action() {
|
|
31
|
+
waiter.clearLog();
|
|
32
|
+
waiter.describe();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
});
|
|
37
|
+
exports.default = waiter;
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=waiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["waiter.ts"],"names":[],"mappings":";;AAAA,uDAA2D;AAE3D,MAAM,MAAM,GAAsB,IAAI,6BAAiB,CAAC;IACtD,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE;QACP;YACE,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,QAAQ;YACrB,MAAM;gBACJ,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBACnC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;oBACrB,UAAU,CAAC,GAAG,EAAE;wBACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;wBACvB,OAAO,EAAE,CAAA;oBACX,CAAC,EAAE,IAAI,CAAC,CAAA;gBACV,CAAC,CAAC,CAAA;YACJ,CAAC;SACF;QACD;YACE,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,MAAM;YACnB,MAAM;gBACJ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC7B,CAAC;SACF;QACD;YACE,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,QAAQ;YACrB,MAAM;gBACJ,MAAM,CAAC,QAAQ,EAAE,CAAA;gBACjB,MAAM,CAAC,QAAQ,EAAE,CAAA;YACnB,CAAC;SACF;KACF;CACF,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA","file":"waiter.js","sourcesContent":["import { PersistentCommand } from '@aiot-toolkit/commander'\n\nconst waiter: PersistentCommand = new PersistentCommand({\n description: 'aiot-toolkit 常驻命令',\n options: [\n {\n key: 'a',\n description: '获取设备列表',\n action() {\n return new Promise<void>((resolve) => {\n console.log('获取中...')\n setTimeout(() => {\n console.log('设备列表:123')\n resolve()\n }, 3000)\n })\n }\n },\n {\n key: 'i',\n description: '自我介绍',\n action() {\n console.log('我就是一个没用的快捷命令')\n }\n },\n {\n key: '?',\n description: '显示所有命令',\n action() {\n waiter.clearLog()\n waiter.describe()\n }\n }\n ]\n})\n\nexport default waiter\n"],"sourceRoot":"../src"}
|
package/package.json
CHANGED
|
@@ -1,56 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiot-toolkit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
"@aiot-toolkit/debugger": "1.0.20-importfile-dev.2",
|
|
11
|
-
"@aiot-toolkit/dsl-vue": "1.0.20-importfile-dev.2",
|
|
12
|
-
"@aiot-toolkit/dsl-xvm": "1.0.20-importfile-dev.2",
|
|
13
|
-
"@aiot-toolkit/packager": "1.0.20-importfile-dev.2",
|
|
14
|
-
"@aiot-toolkit/server": "1.0.20-importfile-dev.2",
|
|
15
|
-
"@aiot-toolkit/shared-utils": "1.0.20-importfile-dev.2",
|
|
16
|
-
"@babel/core": "^7.9.6",
|
|
17
|
-
"@babel/plugin-syntax-jsx": "^7.8.3",
|
|
18
|
-
"@babel/preset-env": "^7.9.6",
|
|
19
|
-
"@babel/register": "^7.9.0",
|
|
20
|
-
"@babel/runtime": "^7.9.6",
|
|
21
|
-
"adb-commander": "^0.1.9",
|
|
22
|
-
"ajv": "^6.12.6",
|
|
23
|
-
"ajv-errors": "^1.0.1",
|
|
24
|
-
"babel-loader": "^8.3.0",
|
|
25
|
-
"chalk": "^2.3.0",
|
|
26
|
-
"commander": "~2.14.1",
|
|
27
|
-
"fs-extra": "^7.0.1",
|
|
28
|
-
"inquirer": "^6.5.2",
|
|
29
|
-
"jszip": "^3.4.0",
|
|
30
|
-
"lodash": "^4.17.21",
|
|
31
|
-
"request": "^2.88.2",
|
|
32
|
-
"semver": "^5.7.1",
|
|
33
|
-
"socket.io": "^2.3.0",
|
|
34
|
-
"webpack": "5.88.1"
|
|
35
|
-
},
|
|
3
|
+
"version": "2.0.1-alpha.10",
|
|
4
|
+
"description": "Tools for creating, developing, and packaging aiot applications.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"aiot"
|
|
7
|
+
],
|
|
8
|
+
"homepage": "",
|
|
9
|
+
"license": "ISC",
|
|
36
10
|
"bin": {
|
|
37
|
-
"aiot": "bin
|
|
11
|
+
"aiot": "lib/bin.js"
|
|
12
|
+
},
|
|
13
|
+
"directories": {
|
|
14
|
+
"lib": "lib",
|
|
15
|
+
"test": "__tests__"
|
|
38
16
|
},
|
|
39
17
|
"files": [
|
|
40
|
-
"
|
|
41
|
-
"lib/**/*.js",
|
|
42
|
-
"gen-webpack-conf/*"
|
|
18
|
+
"lib"
|
|
43
19
|
],
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "ssh://xujunjie1@git.mioffice.cn:29418/vela/aiot-toolkit"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"test": "node ./__tests__/aiot-toolkit.test.js"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@aiot-toolkit/emulator": "2.0.1-alpha.10",
|
|
29
|
+
"@aiot-toolkit/shared-utils": "2.0.1-alpha.10",
|
|
30
|
+
"@miwt/adb": "^0.7.1",
|
|
31
|
+
"adb-commander": "^0.1.9",
|
|
32
|
+
"adm-zip": "^0.5.10",
|
|
33
|
+
"axios": "^1.5.0",
|
|
34
|
+
"cli-progress": "^3.12.0",
|
|
35
|
+
"fast-glob": "^3.3.2",
|
|
36
|
+
"file-lane": "2.0.1-alpha.10"
|
|
37
|
+
},
|
|
44
38
|
"devDependencies": {
|
|
45
|
-
"@
|
|
46
|
-
"chai": "^4.2.0",
|
|
47
|
-
"del": "^3.0.0",
|
|
48
|
-
"glob": "^7.1.6",
|
|
49
|
-
"sinon": "^7.5.0",
|
|
50
|
-
"sinon-chai": "^3.5.0",
|
|
51
|
-
"strip-ansi": "^6.0.0",
|
|
52
|
-
"supertest": "^3.3.0",
|
|
53
|
-
"webpack-cli": "^4.3.0"
|
|
39
|
+
"@types/adm-zip": "^0.5.4"
|
|
54
40
|
},
|
|
55
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "28da610ac477037586ef355c9382e8a20e81477c"
|
|
56
42
|
}
|