aiot-toolkit 2.0.3-beta.1 → 2.0.3-beta.11
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 +2 -0
- package/lib/bin.js +158 -184
- package/lib/builder/AndroidUxBuilder.js +14 -15
- package/lib/builder/IBuilder.d.ts +6 -0
- package/lib/builder/IBuilder.js +1 -2
- package/lib/builder/UxBuilderBase.d.ts +8 -7
- package/lib/builder/UxBuilderBase.js +130 -111
- package/lib/builder/VelaUxBuilder.d.ts +12 -11
- package/lib/builder/VelaUxBuilder.js +65 -61
- package/lib/builder/XtsBuilder.d.ts +2 -0
- package/lib/builder/XtsBuilder.js +85 -78
- package/lib/index.js +48 -13
- package/lib/interface/CommandInterface.js +4 -1
- package/lib/interface/VelaEmulatorInterface.js +4 -1
- package/lib/starter/AndroidUxStart.js +158 -158
- package/lib/starter/IStarter.js +39 -37
- package/lib/starter/VelaUxStarter.d.ts +8 -3
- package/lib/starter/VelaUxStarter.js +158 -189
- package/lib/starter/XtsStarter.js +16 -17
- package/lib/starter/androidRouter/LinkMode.js +12 -8
- package/lib/starter/androidRouter/PackageRouter.js +144 -140
- package/lib/utils/AdbUtils.js +48 -76
- package/lib/utils/DeviceUtil.js +277 -293
- package/lib/utils/RequestUtils.js +54 -68
- package/lib/utils/VelaAvdUtils.d.ts +9 -54
- package/lib/utils/VelaAvdUtils.js +128 -436
- package/lib/waiter.js +35 -35
- package/package.json +9 -15
package/lib/index.js
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exports
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "AndroidUxBuilder", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _AndroidUxBuilder.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "CompileMode", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _aiotpack.CompileMode;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "FileLaneTriggerType", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _FileLaneTriggerType.default;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "IFileLaneEvents", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _IFileLaneEvents.default;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "IFileLaneSuccessData", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _IFileLaneEvents.IFileLaneSuccessData;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "VelaUxBuilder", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _VelaUxBuilder.default;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
var _VelaUxBuilder = _interopRequireDefault(require("./builder/VelaUxBuilder"));
|
|
43
|
+
var _AndroidUxBuilder = _interopRequireDefault(require("./builder/AndroidUxBuilder"));
|
|
44
|
+
var _FileLaneTriggerType = _interopRequireDefault(require("file-lane/lib/enum/FileLaneTriggerType"));
|
|
45
|
+
var _aiotpack = require("@aiot-toolkit/aiotpack");
|
|
46
|
+
var _IFileLaneEvents = _interopRequireWildcard(require("file-lane/lib/interface/IFileLaneEvents"));
|
|
47
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
48
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
49
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -1,171 +1,171 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const shared_utils_1 = require("@aiot-toolkit/shared-utils");
|
|
18
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
19
|
-
const http_1 = __importDefault(require("http"));
|
|
20
|
-
const path_1 = __importDefault(require("path"));
|
|
21
|
-
const AndroidUxBuilder_1 = __importDefault(require("../builder/AndroidUxBuilder"));
|
|
22
|
-
const IStarter_1 = __importDefault(require("./IStarter"));
|
|
23
|
-
const PackageRouter_1 = __importDefault(require("./androidRouter/PackageRouter"));
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _aiotpack = require("@aiot-toolkit/aiotpack");
|
|
8
|
+
var _commander = require("@aiot-toolkit/commander");
|
|
9
|
+
var _sharedUtils = require("@aiot-toolkit/shared-utils");
|
|
10
|
+
var _fsExtra = _interopRequireDefault(require("fs-extra"));
|
|
11
|
+
var _http = _interopRequireDefault(require("http"));
|
|
12
|
+
var _path = _interopRequireDefault(require("path"));
|
|
13
|
+
var _AndroidUxBuilder = _interopRequireDefault(require("../builder/AndroidUxBuilder"));
|
|
14
|
+
var _IStarter = _interopRequireDefault(require("./IStarter"));
|
|
15
|
+
var _PackageRouter = _interopRequireDefault(require("./androidRouter/PackageRouter"));
|
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
17
|
/**
|
|
25
18
|
* AndroidUxStart
|
|
26
19
|
*
|
|
27
20
|
* 1. 启动本机开发者http服务器,并提供二维码,以下载 rpk
|
|
28
21
|
* 2. 打包 rpk,并监听文件变化,重新打包
|
|
29
22
|
*/
|
|
30
|
-
class AndroidUxStart extends
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
key: 'q',
|
|
43
|
-
description: 'show qrcode',
|
|
44
|
-
action: () => {
|
|
45
|
-
this.showAddress();
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
key: '?',
|
|
50
|
-
description: 'show waiter desc',
|
|
51
|
-
action: () => {
|
|
52
|
-
this.waiter.clearLog();
|
|
53
|
-
this.waiter.describe();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
]
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 启动
|
|
61
|
-
* 1. build 项目
|
|
62
|
-
* 2. build 成功,则创建http服务器
|
|
63
|
-
*/
|
|
64
|
-
start(projectPath, options) {
|
|
65
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
this.projectPath = projectPath;
|
|
67
|
-
const buildOption = Object.assign(Object.assign({}, aiotpack_1.JavascriptDefaultCompileOption), options);
|
|
68
|
-
yield this.build(projectPath, buildOption);
|
|
69
|
-
yield this.createServer(buildOption);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 创建服务器
|
|
74
|
-
*
|
|
75
|
-
* 1. 使用 koa 创建服务器
|
|
76
|
-
* 2. 显示服务器地址和二维码
|
|
77
|
-
* @returns
|
|
78
|
-
*/
|
|
79
|
-
createServer(options) {
|
|
80
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
82
|
-
const routeConfigList = [
|
|
83
|
-
new PackageRouter_1.default({
|
|
84
|
-
projectPath: this.projectPath,
|
|
85
|
-
options
|
|
86
|
-
})
|
|
87
|
-
];
|
|
88
|
-
const data = yield shared_utils_1.NetworkUtil.createHttpServer({
|
|
89
|
-
wantPort: options.server.port,
|
|
90
|
-
routeConfigList,
|
|
91
|
-
staticFolder: path_1.default.join(__dirname, './androidRouter/h5'),
|
|
92
|
-
events: {
|
|
93
|
-
onSuccess: () => {
|
|
94
|
-
this.server = data.server;
|
|
95
|
-
this.port = data.port;
|
|
96
|
-
this.showAddress();
|
|
97
|
-
resolve(data);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}));
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
showAddress() {
|
|
105
|
-
const ip = shared_utils_1.NetworkUtil.getIPv4IPAddress();
|
|
106
|
-
const { port } = this;
|
|
107
|
-
if (!ip) {
|
|
108
|
-
const localUrl = `http://localhost:${port}`;
|
|
109
|
-
shared_utils_1.ColorConsole.warn(`devServer`, localUrl);
|
|
23
|
+
class AndroidUxStart extends _IStarter.default {
|
|
24
|
+
builder = (() => new _AndroidUxBuilder.default())();
|
|
25
|
+
projectPath = '';
|
|
26
|
+
params = (() => [...this.builder.params])();
|
|
27
|
+
get waiter() {
|
|
28
|
+
return new _commander.PersistentCommand({
|
|
29
|
+
description: 'you can press follow keys to do something',
|
|
30
|
+
options: [{
|
|
31
|
+
key: 'q',
|
|
32
|
+
description: 'show qrcode',
|
|
33
|
+
action: () => {
|
|
34
|
+
this.showAddress();
|
|
110
35
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
36
|
+
}, {
|
|
37
|
+
key: '?',
|
|
38
|
+
description: 'show waiter desc',
|
|
39
|
+
action: () => {
|
|
40
|
+
this.waiter.clearLog();
|
|
41
|
+
this.waiter.describe();
|
|
116
42
|
}
|
|
43
|
+
}]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 启动
|
|
49
|
+
* 1. build 项目
|
|
50
|
+
* 2. build 成功,则创建http服务器
|
|
51
|
+
*/
|
|
52
|
+
async start(projectPath, options) {
|
|
53
|
+
this.projectPath = projectPath;
|
|
54
|
+
const buildOption = {
|
|
55
|
+
..._aiotpack.JavascriptDefaultCompileOption,
|
|
56
|
+
...options
|
|
57
|
+
};
|
|
58
|
+
await this.build(projectPath, buildOption);
|
|
59
|
+
await this.createServer(buildOption);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 创建服务器
|
|
64
|
+
*
|
|
65
|
+
* 1. 使用 koa 创建服务器
|
|
66
|
+
* 2. 显示服务器地址和二维码
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
async createServer(options) {
|
|
70
|
+
return new Promise(async resolve => {
|
|
71
|
+
const routeConfigList = [new _PackageRouter.default({
|
|
72
|
+
projectPath: this.projectPath,
|
|
73
|
+
options
|
|
74
|
+
})];
|
|
75
|
+
const data = await _sharedUtils.NetworkUtil.createHttpServer({
|
|
76
|
+
wantPort: options.server.port,
|
|
77
|
+
routeConfigList,
|
|
78
|
+
staticFolder: _path.default.join(__dirname, './androidRouter/h5'),
|
|
79
|
+
events: {
|
|
80
|
+
onSuccess: () => {
|
|
81
|
+
this.server = data.server;
|
|
82
|
+
this.port = data.port;
|
|
83
|
+
this.showAddress();
|
|
84
|
+
resolve(data);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
showAddress() {
|
|
91
|
+
const ip = _sharedUtils.NetworkUtil.getIPv4IPAddress();
|
|
92
|
+
const {
|
|
93
|
+
port
|
|
94
|
+
} = this;
|
|
95
|
+
if (!ip) {
|
|
96
|
+
const localUrl = `http://localhost:${port}`;
|
|
97
|
+
_sharedUtils.ColorConsole.warn(`devServer`, localUrl);
|
|
98
|
+
} else {
|
|
99
|
+
const lanUrl = `http://${ip}:${port}`;
|
|
100
|
+
// 显示二维码
|
|
101
|
+
_sharedUtils.ColorConsole.info(`devServer`, lanUrl);
|
|
102
|
+
_sharedUtils.CommonUtil.outputQRCodeOnTerminal(lanUrl);
|
|
117
103
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
})
|
|
157
|
-
.on('error', (error) => {
|
|
158
|
-
shared_utils_1.ColorConsole.warn(`Notify the phone to update the rpk file`, { word: 'error: ' }, {
|
|
159
|
-
word: error.message
|
|
160
|
-
});
|
|
161
|
-
})
|
|
162
|
-
.on('timeout', () => {
|
|
163
|
-
shared_utils_1.ColorConsole.warn(`Notify the phone to update the rpk file`, { word: 'timeout: ' }, {
|
|
164
|
-
word: url
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
});
|
|
104
|
+
}
|
|
105
|
+
async build(projectPath, options) {
|
|
106
|
+
this.builder.events = {
|
|
107
|
+
onBuildSuccess: data => {
|
|
108
|
+
_sharedUtils.ColorConsole.info(`build time: ${data.costTime}ms`);
|
|
109
|
+
this.noticeDeviceListUpdate(projectPath, options);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
await this.builder.build(projectPath, {
|
|
113
|
+
...options,
|
|
114
|
+
watch: true
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
dispose() {
|
|
118
|
+
this.server?.close();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 通知已知的设备,应用有更新
|
|
123
|
+
* @param projectPath
|
|
124
|
+
* @param options
|
|
125
|
+
*/
|
|
126
|
+
noticeDeviceListUpdate(projectPath, options) {
|
|
127
|
+
const {
|
|
128
|
+
clientRecordPath
|
|
129
|
+
} = options;
|
|
130
|
+
const json = _fsExtra.default.readJSONSync(clientRecordPath, {
|
|
131
|
+
throws: false
|
|
132
|
+
});
|
|
133
|
+
const deviceList = json?.records?.[projectPath];
|
|
134
|
+
if (deviceList) {
|
|
135
|
+
deviceList.forEach(item => {
|
|
136
|
+
const {
|
|
137
|
+
ip,
|
|
138
|
+
port
|
|
139
|
+
} = item;
|
|
140
|
+
if (!ip) {
|
|
141
|
+
return;
|
|
168
142
|
}
|
|
143
|
+
const url = `http://${ip}:${port}/update`;
|
|
144
|
+
const requestOption = {
|
|
145
|
+
host: ip,
|
|
146
|
+
port,
|
|
147
|
+
path: '/update',
|
|
148
|
+
timeout: 3000
|
|
149
|
+
};
|
|
150
|
+
_http.default.request(requestOption, () => {
|
|
151
|
+
_sharedUtils.ColorConsole.success(`Notify the phone to update the rpk file success`, {
|
|
152
|
+
word: url
|
|
153
|
+
});
|
|
154
|
+
}).on('error', error => {
|
|
155
|
+
_sharedUtils.ColorConsole.warn(`Notify the phone to update the rpk file`, {
|
|
156
|
+
word: 'error: '
|
|
157
|
+
}, {
|
|
158
|
+
word: error.message
|
|
159
|
+
});
|
|
160
|
+
}).on('timeout', () => {
|
|
161
|
+
_sharedUtils.ColorConsole.warn(`Notify the phone to update the rpk file`, {
|
|
162
|
+
word: 'timeout: '
|
|
163
|
+
}, {
|
|
164
|
+
word: url
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
169
168
|
}
|
|
169
|
+
}
|
|
170
170
|
}
|
|
171
|
-
exports.default = AndroidUxStart;
|
|
171
|
+
var _default = exports.default = AndroidUxStart;
|
package/lib/starter/IStarter.js
CHANGED
|
@@ -1,43 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
12
7
|
/**
|
|
13
8
|
* IStarter
|
|
14
9
|
*/
|
|
15
10
|
class IStarter {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
11
|
+
/**
|
|
12
|
+
* start 的参数列表
|
|
13
|
+
*/
|
|
14
|
+
params = [];
|
|
15
|
+
constructor(name, description) {
|
|
16
|
+
this.name = name;
|
|
17
|
+
this.description = description;
|
|
18
|
+
}
|
|
19
|
+
get waiter() {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* start 的命令
|
|
25
|
+
*/
|
|
26
|
+
getCommond() {
|
|
27
|
+
return {
|
|
28
|
+
name: this.name,
|
|
29
|
+
description: this.description,
|
|
30
|
+
paramList: this.params,
|
|
31
|
+
waiter: this.waiter,
|
|
32
|
+
action: async option => {
|
|
33
|
+
const projectPath = process.cwd();
|
|
34
|
+
return this.start(projectPath, option);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 运行项目
|
|
41
|
+
* @param projectPath 项目路径
|
|
42
|
+
* @param options 命令参数
|
|
43
|
+
*/
|
|
42
44
|
}
|
|
43
|
-
exports.default = IStarter;
|
|
45
|
+
exports.default = IStarter;
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { IParam } from '@aiot-toolkit/commander';
|
|
2
|
-
import { IStartOptions,
|
|
2
|
+
import { IStartOptions, CommonInstance } from '@aiot-toolkit/emulator';
|
|
3
3
|
import VelaUxBuilder from '../builder/VelaUxBuilder';
|
|
4
4
|
import IStarter from './IStarter';
|
|
5
|
+
import Event from 'events';
|
|
5
6
|
/**
|
|
6
7
|
* VelaUxStarter
|
|
7
8
|
* ux快应用启动器
|
|
8
9
|
*/
|
|
9
10
|
declare class VelaUxStarter extends IStarter<IStartOptions> {
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
protected name: string;
|
|
12
|
+
protected description: string;
|
|
13
|
+
emulatorInstance?: CommonInstance;
|
|
12
14
|
builder: VelaUxBuilder;
|
|
15
|
+
event: Event;
|
|
16
|
+
lastRpk?: string;
|
|
17
|
+
constructor(name: string, description: string);
|
|
13
18
|
params: IParam[];
|
|
14
19
|
start(projectPath: string, options: any): Promise<void>;
|
|
15
20
|
/**
|