appium 2.0.0-beta.3 → 2.0.0-beta.30
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 +10 -11
- package/build/lib/appium.d.ts +215 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +238 -132
- package/build/lib/cli/args.d.ts +20 -0
- package/build/lib/cli/args.d.ts.map +1 -0
- package/build/lib/cli/args.js +96 -282
- package/build/lib/cli/driver-command.d.ts +36 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +19 -12
- package/build/lib/cli/extension-command.d.ts +345 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +171 -96
- package/build/lib/cli/extension.d.ts +14 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +31 -16
- package/build/lib/cli/parser.d.ts +79 -0
- package/build/lib/cli/parser.d.ts.map +1 -0
- package/build/lib/cli/parser.js +152 -95
- package/build/lib/cli/plugin-command.d.ts +39 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +18 -13
- package/build/lib/cli/utils.d.ts +29 -0
- package/build/lib/cli/utils.d.ts.map +1 -0
- package/build/lib/cli/utils.js +27 -3
- package/build/lib/config-file.d.ts +100 -0
- package/build/lib/config-file.d.ts.map +1 -0
- package/build/lib/config-file.js +136 -0
- package/build/lib/config.d.ts +40 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +92 -67
- package/build/lib/constants.d.ts +48 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.d.ts +84 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.d.ts +170 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.d.ts +39 -0
- package/build/lib/extension/index.d.ts.map +1 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.d.ts +174 -0
- package/build/lib/extension/manifest.d.ts.map +1 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.d.ts +11 -0
- package/build/lib/extension/package-changed.d.ts.map +1 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.d.ts +62 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.d.ts +10 -0
- package/build/lib/grid-register.d.ts.map +1 -0
- package/build/lib/grid-register.js +21 -25
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +4 -6
- package/build/lib/logsink.d.ts +4 -0
- package/build/lib/logsink.d.ts.map +1 -0
- package/build/lib/logsink.js +12 -16
- package/build/lib/main.d.ts +51 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +174 -82
- package/build/lib/schema/arg-spec.d.ts +143 -0
- package/build/lib/schema/arg-spec.d.ts.map +1 -0
- package/build/lib/schema/arg-spec.js +119 -0
- package/build/lib/schema/cli-args.d.ts +19 -0
- package/build/lib/schema/cli-args.d.ts.map +1 -0
- package/build/lib/schema/cli-args.js +180 -0
- package/build/lib/schema/cli-transformers.d.ts +5 -0
- package/build/lib/schema/cli-transformers.d.ts.map +1 -0
- package/build/lib/schema/cli-transformers.js +74 -0
- package/build/lib/schema/index.d.ts +3 -0
- package/build/lib/schema/index.d.ts.map +1 -0
- package/build/lib/schema/index.js +34 -0
- package/build/lib/schema/keywords.d.ts +24 -0
- package/build/lib/schema/keywords.d.ts.map +1 -0
- package/build/lib/schema/keywords.js +70 -0
- package/build/lib/schema/schema.d.ts +259 -0
- package/build/lib/schema/schema.d.ts.map +1 -0
- package/build/lib/schema/schema.js +452 -0
- package/build/lib/utils.d.ts +66 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +35 -139
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.js +11 -0
- package/lib/appium-config.schema.json +278 -0
- package/lib/appium.js +398 -155
- package/lib/cli/args.js +174 -377
- package/lib/cli/driver-command.js +22 -7
- package/lib/cli/extension-command.js +372 -177
- package/lib/cli/extension.js +32 -10
- package/lib/cli/parser.js +252 -83
- package/lib/cli/plugin-command.js +19 -6
- package/lib/cli/utils.js +22 -2
- package/lib/config-file.js +223 -0
- package/lib/config.js +169 -69
- package/lib/constants.js +78 -0
- package/lib/extension/driver-config.js +249 -0
- package/lib/extension/extension-config.js +458 -0
- package/lib/extension/index.js +102 -0
- package/lib/extension/manifest.js +486 -0
- package/lib/extension/package-changed.js +63 -0
- package/lib/extension/plugin-config.js +113 -0
- package/lib/grid-register.js +25 -22
- package/lib/logger.js +1 -1
- package/lib/logsink.js +14 -7
- package/lib/main.js +233 -83
- package/lib/schema/arg-spec.js +232 -0
- package/lib/schema/cli-args.js +261 -0
- package/lib/schema/cli-transformers.js +122 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +134 -0
- package/lib/schema/schema.js +734 -0
- package/lib/utils.js +85 -129
- package/package.json +62 -85
- package/scripts/postinstall.js +71 -0
- package/types/appium-manifest.d.ts +61 -0
- package/types/cli.d.ts +134 -0
- package/types/extension.d.ts +56 -0
- package/types/external-manifest.d.ts +58 -0
- package/types/index.d.ts +7 -0
- package/CHANGELOG.md +0 -3515
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/lib/cli/npm.js +0 -206
- package/build/lib/cli/parser-helpers.js +0 -82
- package/build/lib/driver-config.js +0 -77
- package/build/lib/drivers.js +0 -96
- package/build/lib/extension-config.js +0 -251
- package/build/lib/plugin-config.js +0 -59
- package/build/lib/plugins.js +0 -14
- package/lib/cli/npm.js +0 -183
- package/lib/cli/parser-helpers.js +0 -79
- package/lib/driver-config.js +0 -46
- package/lib/drivers.js +0 -81
- package/lib/extension-config.js +0 -208
- package/lib/plugin-config.js +0 -34
- package/lib/plugins.js +0 -10
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = exports.ExtensionConfig = void 0;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
11
|
+
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
|
|
14
|
+
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
|
|
16
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
17
|
+
|
|
18
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
19
|
+
|
|
20
|
+
var _schema = require("../schema/schema");
|
|
21
|
+
|
|
22
|
+
const INSTALL_TYPE_NPM = 'npm';
|
|
23
|
+
exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
|
|
24
|
+
const INSTALL_TYPE_LOCAL = 'local';
|
|
25
|
+
exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
|
|
26
|
+
const INSTALL_TYPE_GITHUB = 'github';
|
|
27
|
+
exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
|
|
28
|
+
const INSTALL_TYPE_GIT = 'git';
|
|
29
|
+
exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
|
|
30
|
+
const INSTALL_TYPES = new Set([INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM]);
|
|
31
|
+
exports.INSTALL_TYPES = INSTALL_TYPES;
|
|
32
|
+
|
|
33
|
+
class ExtensionConfig {
|
|
34
|
+
extensionType;
|
|
35
|
+
configKey;
|
|
36
|
+
installedExtensions;
|
|
37
|
+
log;
|
|
38
|
+
manifest;
|
|
39
|
+
|
|
40
|
+
constructor(extensionType, manifest, logFn) {
|
|
41
|
+
const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
|
|
42
|
+
this.extensionType = extensionType;
|
|
43
|
+
this.configKey = `${extensionType}s`;
|
|
44
|
+
this.installedExtensions = manifest.getExtensionData(extensionType);
|
|
45
|
+
this.log = logger;
|
|
46
|
+
this.manifest = manifest;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
get manifestPath() {
|
|
50
|
+
return this.manifest.manifestPath;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get appiumHome() {
|
|
54
|
+
return this.manifest.appiumHome;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
validate(exts) {
|
|
58
|
+
const foundProblems = {};
|
|
59
|
+
|
|
60
|
+
for (const [extName, extData] of _lodash.default.toPairs(exts)) {
|
|
61
|
+
foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData), ...this.getSchemaProblems(extData, extName)];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const problemSummaries = [];
|
|
65
|
+
|
|
66
|
+
for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
|
|
67
|
+
if (_lodash.default.isEmpty(problems)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
delete exts[extName];
|
|
72
|
+
problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
|
|
73
|
+
|
|
74
|
+
for (const problem of problems) {
|
|
75
|
+
problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!_lodash.default.isEmpty(problemSummaries)) {
|
|
80
|
+
this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.manifestPath}):`);
|
|
81
|
+
|
|
82
|
+
for (const summary of problemSummaries) {
|
|
83
|
+
this.log(summary);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return exts;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
getSchemaProblems(extData, extName) {
|
|
91
|
+
const problems = [];
|
|
92
|
+
const {
|
|
93
|
+
schema: argSchemaPath
|
|
94
|
+
} = extData;
|
|
95
|
+
|
|
96
|
+
if (ExtensionConfig.extDataHasSchema(extData)) {
|
|
97
|
+
if (_lodash.default.isString(argSchemaPath)) {
|
|
98
|
+
if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
|
|
99
|
+
try {
|
|
100
|
+
this.readExtensionSchema(extName, extData);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
problems.push({
|
|
103
|
+
err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
|
|
104
|
+
val: argSchemaPath
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
problems.push({
|
|
109
|
+
err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
|
|
110
|
+
val: argSchemaPath
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
} else if (_lodash.default.isPlainObject(argSchemaPath)) {
|
|
114
|
+
try {
|
|
115
|
+
this.readExtensionSchema(extName, extData);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
problems.push({
|
|
118
|
+
err: `Unable to register embedded schema; ${err.message}`,
|
|
119
|
+
val: argSchemaPath
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
problems.push({
|
|
124
|
+
err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
|
|
125
|
+
val: argSchemaPath
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return problems;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
getGenericConfigProblems(extData, extName) {
|
|
134
|
+
const {
|
|
135
|
+
version,
|
|
136
|
+
pkgName,
|
|
137
|
+
installSpec,
|
|
138
|
+
installType,
|
|
139
|
+
mainClass
|
|
140
|
+
} = extData;
|
|
141
|
+
const problems = [];
|
|
142
|
+
|
|
143
|
+
if (!_lodash.default.isString(version)) {
|
|
144
|
+
problems.push({
|
|
145
|
+
err: 'Missing or incorrect version',
|
|
146
|
+
val: version
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!_lodash.default.isString(pkgName)) {
|
|
151
|
+
problems.push({
|
|
152
|
+
err: 'Missing or incorrect NPM package name',
|
|
153
|
+
val: pkgName
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (!_lodash.default.isString(installSpec)) {
|
|
158
|
+
problems.push({
|
|
159
|
+
err: 'Missing or incorrect installation spec',
|
|
160
|
+
val: installSpec
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!INSTALL_TYPES.has(installType)) {
|
|
165
|
+
problems.push({
|
|
166
|
+
err: 'Missing or incorrect install type',
|
|
167
|
+
val: installType
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (!_lodash.default.isString(mainClass)) {
|
|
172
|
+
problems.push({
|
|
173
|
+
err: 'Missing or incorrect driver class name',
|
|
174
|
+
val: mainClass
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return problems;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
getConfigProblems(extData) {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async addExtension(extName, extData, {
|
|
186
|
+
write = true
|
|
187
|
+
} = {}) {
|
|
188
|
+
this.manifest.addExtension(this.extensionType, extName, extData);
|
|
189
|
+
|
|
190
|
+
if (write) {
|
|
191
|
+
await this.manifest.write();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async updateExtension(extName, extData, {
|
|
196
|
+
write = true
|
|
197
|
+
} = {}) {
|
|
198
|
+
this.installedExtensions[extName] = { ...this.installedExtensions[extName],
|
|
199
|
+
...extData
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
if (write) {
|
|
203
|
+
await this.manifest.write();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async removeExtension(extName, {
|
|
208
|
+
write = true
|
|
209
|
+
} = {}) {
|
|
210
|
+
delete this.installedExtensions[extName];
|
|
211
|
+
|
|
212
|
+
if (write) {
|
|
213
|
+
await this.manifest.write();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
print(activeNames) {
|
|
218
|
+
if (_lodash.default.isEmpty(this.installedExtensions)) {
|
|
219
|
+
_logger.default.info(`No ${this.configKey} have been installed in ${this.appiumHome}. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
|
|
220
|
+
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
_logger.default.info(`Available ${this.configKey}:`);
|
|
225
|
+
|
|
226
|
+
for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
|
|
227
|
+
_logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
extensionDesc(extName, extData) {
|
|
232
|
+
throw new Error('This must be implemented in a subclass');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
getInstallPath(extName) {
|
|
236
|
+
return _path.default.join(this.appiumHome, 'node_modules', this.installedExtensions[extName].pkgName);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
require(extName) {
|
|
240
|
+
const {
|
|
241
|
+
mainClass
|
|
242
|
+
} = this.installedExtensions[extName];
|
|
243
|
+
const reqPath = this.getInstallPath(extName);
|
|
244
|
+
|
|
245
|
+
const reqResolved = require.resolve(reqPath);
|
|
246
|
+
|
|
247
|
+
if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
|
|
248
|
+
_logger.default.debug(`Removing ${reqResolved} from require cache`);
|
|
249
|
+
|
|
250
|
+
delete require.cache[reqResolved];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
_logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
|
|
254
|
+
|
|
255
|
+
return require(reqPath)[mainClass];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
isInstalled(extName) {
|
|
259
|
+
return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static _readExtensionSchema(appiumHome, extType, extName, extData) {
|
|
263
|
+
const {
|
|
264
|
+
pkgName,
|
|
265
|
+
schema: argSchemaPath
|
|
266
|
+
} = extData;
|
|
267
|
+
|
|
268
|
+
if (!argSchemaPath) {
|
|
269
|
+
throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
let moduleObject;
|
|
273
|
+
|
|
274
|
+
if (_lodash.default.isString(argSchemaPath)) {
|
|
275
|
+
const schemaPath = (0, _resolveFrom.default)(appiumHome, _path.default.join(pkgName, argSchemaPath));
|
|
276
|
+
moduleObject = require(schemaPath);
|
|
277
|
+
} else {
|
|
278
|
+
moduleObject = argSchemaPath;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
|
|
282
|
+
(0, _schema.registerSchema)(extType, extName, schema);
|
|
283
|
+
return schema;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
static extDataHasSchema(extData) {
|
|
287
|
+
return _lodash.default.isString(extData === null || extData === void 0 ? void 0 : extData.schema) || _lodash.default.isObject(extData === null || extData === void 0 ? void 0 : extData.schema);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
readExtensionSchema(extName, extData) {
|
|
291
|
+
return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
exports.ExtensionConfig = ExtensionConfig;
|
|
297
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsImNvbnN0cnVjdG9yIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImVycm9yIiwiYmluZCIsImdldEV4dGVuc2lvbkRhdGEiLCJtYW5pZmVzdFBhdGgiLCJhcHBpdW1Ib21lIiwidmFsaWRhdGUiLCJleHRzIiwiZm91bmRQcm9ibGVtcyIsImV4dE5hbWUiLCJleHREYXRhIiwidG9QYWlycyIsImdldEdlbmVyaWNDb25maWdQcm9ibGVtcyIsImdldENvbmZpZ1Byb2JsZW1zIiwiZ2V0U2NoZW1hUHJvYmxlbXMiLCJwcm9ibGVtU3VtbWFyaWVzIiwicHJvYmxlbXMiLCJpc0VtcHR5IiwicHVzaCIsInByb2JsZW0iLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJleHREYXRhSGFzU2NoZW1hIiwiaXNTdHJpbmciLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJqb2luIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJwa2dOYW1lIiwiaW5zdGFsbFNwZWMiLCJpbnN0YWxsVHlwZSIsIm1haW5DbGFzcyIsImhhcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMiLCJjYWNoZSIsImRlYnVnIiwiaXNJbnN0YWxsZWQiLCJpbmNsdWRlcyIsIk9iamVjdCIsImtleXMiLCJfcmVhZEV4dGVuc2lvblNjaGVtYSIsImV4dFR5cGUiLCJUeXBlRXJyb3IiLCJtb2R1bGVPYmplY3QiLCJzY2hlbWFQYXRoIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJpc09iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQSxNQUFNQSxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxPQUEzQjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxRQUE1Qjs7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFHQSxNQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBSixDQUFRLENBQzVCRixnQkFENEIsRUFFNUJELG1CQUY0QixFQUc1QkQsa0JBSDRCLEVBSTVCRCxnQkFKNEIsQ0FBUixDQUF0Qjs7O0FBYU8sTUFBTU0sZUFBTixDQUFzQjtBQUUzQkMsRUFBQUEsYUFBYTtBQUdiQyxFQUFBQSxTQUFTO0FBR1RDLEVBQUFBLG1CQUFtQjtBQUduQkMsRUFBQUEsR0FBRztBQUdIQyxFQUFBQSxRQUFROztBQVFSQyxFQUFBQSxXQUFXLENBQUVMLGFBQUYsRUFBaUJJLFFBQWpCLEVBQTJCRSxLQUEzQixFQUFrQztBQUMzQyxVQUFNQyxNQUFNLEdBQUdDLGdCQUFFQyxVQUFGLENBQWFILEtBQWIsSUFBc0JBLEtBQXRCLEdBQThCSCxnQkFBSU8sS0FBSixDQUFVQyxJQUFWLENBQWVSLGVBQWYsQ0FBN0M7QUFDQSxTQUFLSCxhQUFMLEdBQXFCQSxhQUFyQjtBQUNBLFNBQUtDLFNBQUws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RXBCLE9BQUYsRUFBV0MsT0FBWCxFQUFvQjtBQUNyQyxXQUFPcEIsZUFBZSxDQUFDMEUsb0JBQWhCLENBQ0wsS0FBSzNELFVBREEsRUFFTCxLQUFLZCxhQUZBLEVBR0xrQixPQUhLLEVBSUxDLE9BSkssQ0FBUDtBQU1EOztBQTNXMEIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXNvbHZlRnJvbSBmcm9tICdyZXNvbHZlLWZyb20nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbixcbiAgcmVnaXN0ZXJTY2hlbWEsXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuXG4vKiogQHR5cGUge1NldDxJbnN0YWxsVHlwZT59ICovXG5jb25zdCBJTlNUQUxMX1RZUEVTID0gbmV3IFNldChbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTSxcbl0pO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuIEl0IHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHRvIGltcGxlbWVudC5cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqIEB0eXBlIHtFeHRUeXBlfSAqL1xuICBleHRlbnNpb25UeXBlO1xuXG4gIC8qKiBAdHlwZSB7YCR7RXh0VHlwZX1zYH0gKi9cbiAgY29uZmlnS2V5O1xuXG4gIC8qKiBAdHlwZSB7RXh0UmVjb3JkPEV4dFR5cGU+fSAqL1xuICBpbnN0YWxsZWRFeHRlbnNpb25zO1xuXG4gIC8qKiBAdHlwZSB7RXh0ZW5zaW9uTG9nRm59ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdCAtIGBNYW5pZmVzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Mb2dGbn0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dGVuc2lvblR5cGUsIG1hbmlmZXN0LCBsb2dGbikge1xuICAgIGNvbnN0IGxvZ2dlciA9IF8uaXNGdW5jdGlvbihsb2dGbikgPyBsb2dGbiA6IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICB0aGlzLmNvbmZpZ0tleSA9IGAke2V4dGVuc2lvblR5cGV9c2A7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0gbWFuaWZlc3QuZ2V0RXh0ZW5zaW9uRGF0YShleHRlbnNpb25UeXBlKTtcbiAgICB0aGlzLmxvZyA9IGxvZ2dlcjtcbiAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gIH1cblxuICBnZXQgbWFuaWZlc3RQYXRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QuYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXNcbiAgICogQHBhcmFtIHtFeHRSZWNvcmQ8RXh0VHlwZT59IGV4dHMgLSBFeHRlbnNpb24gZGF0YVxuICAgKi9cbiAgdmFsaWRhdGUgKGV4dHMpIHtcbiAgICBjb25zdCBmb3VuZFByb2JsZW1zID1cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPEV4dE5hbWU8RXh0VHlwZT4sUHJvYmxlbVtdPn0gKi8gKHt9KTtcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGV4dE5hbWUsXG4gICAgICBleHREYXRhLFxuICAgIF0gb2YgLyoqIEB0eXBlIHtbRXh0TmFtZTxFeHRUeXBlPiwgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKGV4dHMpXG4gICAgICApKSB7XG4gICAgICBmb3VuZFByb2JsZW1zW2V4dE5hbWVdID0gW1xuICAgICAgICAuLi50aGlzLmdldEdlbmVyaWNDb25maWdQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgICAgLi4udGhpcy5nZXRDb25maWdQcm9ibGVtcyhleHREYXRhKSxcbiAgICAgICAgLi4udGhpcy5nZXRTY2hlbWFQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3QgcHJvYmxlbVN1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHByb2JsZW1zXSBvZiBfLnRvUGFpcnMoZm91bmRQcm9ibGVtcykpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocHJvYmxlbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoaXMgZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgc2luY2UgaXQncyBub3QgdmFsaWRcbiAgICAgIGRlbGV0ZSBleHRzW2V4dE5hbWVdO1xuICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKFxuICAgICAgICBgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmAsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChcbiAgICAgICAgICBgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KHByb2JsZW1TdW1tYXJpZXMpKSB7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICBgdGhlICR7dGhpcy5jb25maWdLZXl9IGV4dGVuc2lvbiBmaWxlICgke3RoaXMubWFuaWZlc3RQYXRofSk6YCxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgcHJvYmxlbVN1bW1hcmllcykge1xuICAgICAgICB0aGlzLmxvZyhzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgZ2V0U2NoZW1hUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICAgIGNvbnN0IHtzY2hlbWE6IGFyZ1NjaGVtYVBhdGh9ID0gZXh0RGF0YTtcbiAgICBpZiAoRXh0ZW5zaW9uQ29uZmlnLmV4dERhdGFIYXNTY2hlbWEoZXh0RGF0YSkpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgc2NoZW1hIGF0IHBhdGggJHthcmdTY2hlbWFQYXRofTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBTY2hlbWEgZmlsZSBoYXMgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke1tcbiAgICAgICAgICAgICAgLi4uQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgZW1iZWRkZWQgc2NoZW1hOyAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGVycjogJ0luY29ycmVjdGx5IGZvcm1hdHRlZCBzY2hlbWEgZmllbGQ7IG11c3QgYmUgYSBwYXRoIHRvIGEgc2NoZW1hIGZpbGUgb3IgYSBzY2hlbWEgb2JqZWN0LicsXG4gICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgbWFpbkNsYXNzfSA9XG4gICAgICBleHREYXRhO1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IHZlcnNpb24nLCB2YWw6IHZlcnNpb259KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGtnTmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJyxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBzcGVjJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsU3BlYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghSU5TVEFMTF9UWVBFUy5oYXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgZHJpdmVyIGNsYXNzIG5hbWUnLFxuICAgICAgICB2YWw6IG1haW5DbGFzcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldENvbmZpZ1Byb2JsZW1zIChleHREYXRhKSB7XG4gICAgLy8gc2hvdWQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgc3BlY2lhbCB2YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhpcyBleHRlbnNpb24gdHlwZVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLm1hbmlmZXN0LmFkZEV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblR5cGUsIGV4dE5hbWUsIGV4dERhdGEpO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPnxpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkV4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhLCB7d3JpdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0ge1xuICAgICAgLi4udGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLFxuICAgICAgLi4uZXh0RGF0YSxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZUV4dGVuc2lvbiAoZXh0TmFtZSwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPltdfSBbYWN0aXZlTmFtZXNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaW50IChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgJHt0aGlzLmNvbmZpZ0tleX06YCk7XG4gICAgZm9yIChjb25zdCBbXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICBdIG9mIC8qKiBAdHlwZSB7W3N0cmluZywgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgICkpIHtcbiAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MoZXh0TmFtZSwgZXh0RGF0YSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXh0ZW5zaW9uLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhIC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZXh0ZW5zaW9uRGVzYyAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0SW5zdGFsbFBhdGggKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYXBwaXVtSG9tZSwgJ25vZGVfbW9kdWxlcycsIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXS5wa2dOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBleHRlbnNpb24gYW5kIHJldHVybnMgaXRzIG1haW4gY2xhc3MgKGNvbnN0cnVjdG9yKVxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHJldHVybnMge0V4dENsYXNzPEV4dFR5cGU+fVxuICAgKi9cbiAgcmVxdWlyZSAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGNvbnN0IHJlcVBhdGggPSB0aGlzLmdldEluc3RhbGxQYXRoKGV4dE5hbWUpO1xuICAgIGNvbnN0IHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIC8vIG5vdGU6IHRoaXMgd2lsbCBvbmx5IHJlbG9hZCB0aGUgZW50cnkgcG9pbnRcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFJlcXVpcmluZyAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gYXQgJHtyZXFQYXRofWApO1xuICAgIHJldHVybiByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0luc3RhbGxlZCAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKHVuaXF1ZSB0byBpdHMgdHlwZSlcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKCFhcmdTY2hlbWFQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTm8gXFxgc2NoZW1hXFxgIHByb3BlcnR5IGZvdW5kIGluIGNvbmZpZyBmb3IgJHtleHRUeXBlfSAke3BrZ05hbWV9IC0tIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD9gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKGFwcGl1bUhvbWUsIHBhdGguam9pbihwa2dOYW1lLCBhcmdTY2hlbWFQYXRoKSk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlXG4gICAgICA/IG1vZHVsZU9iamVjdC5kZWZhdWx0XG4gICAgICA6IG1vZHVsZU9iamVjdDtcbiAgICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzcGVjaWZpYyB7QGxpbmsgRXh0TWFuaWZlc3R9IG9iamVjdCBoYXMgYSBgc2NoZW1hYCBwcm9wLlxuICAgKiBUaGUge0BsaW5rIEV4dE1hbmlmZXN0fSBvYmplY3QgYmVjb21lcyBhIHtAbGluayBFeHRNYW5pZmVzdFdpdGhTY2hlbWF9IG9iamVjdC5cbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHJldHVybnMge2V4dERhdGEgaXMgRXh0TWFuaWZlc3RXaXRoU2NoZW1hPEV4dFR5cGU+fVxuICAgKi9cbiAgc3RhdGljIGV4dERhdGFIYXNTY2hlbWEgKGV4dERhdGEpIHtcbiAgICByZXR1cm4gXy5pc1N0cmluZyhleHREYXRhPy5zY2hlbWEpIHx8IF8uaXNPYmplY3QoZXh0RGF0YT8uc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gcHJvdmlkZXMgYSBzY2hlbWEsIHRoaXMgd2lsbCBsb2FkIHRoZSBzY2hlbWEgYW5kIGF0dGVtcHQgdG9cbiAgICogcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2NoZW1hIHJlZ2lzdHJhci5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEV4dGVuc2lvblNjaGVtYSAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHJldHVybiBFeHRlbnNpb25Db25maWcuX3JlYWRFeHRlbnNpb25TY2hlbWEoXG4gICAgICB0aGlzLmFwcGl1bUhvbWUsXG4gICAgICB0aGlzLmV4dGVuc2lvblR5cGUsXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUyxcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQW4gb3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCB0byBhbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfSBzdWJjbGFzcy5cbiAqIEBjYWxsYmFjayBFeHRlbnNpb25Mb2dGblxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3RXaXRoU2NoZW1hPFQ+fSBFeHRNYW5pZmVzdFdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHROYW1lPFQ+fSBFeHROYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZW5zaW9uJykuRXh0Q2xhc3M8VD59IEV4dENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHZhcmlvdXMgbWV0aG9kcyBpbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt3cml0ZT10cnVlXSBXaGV0aGVyIG9yIG5vdCB0byB3cml0ZSB0aGUgbWFuaWZlc3QgdG8gZGlzayBhZnRlciBhIG11dGF0aW9uIG9wZXJhdGlvblxuICovXG5cbi8qKlxuICogQSB2YWxpZCBpbnN0YWxsIHR5cGVcbiAqIEB0eXBlZGVmIHt0eXBlb2YgSU5TVEFMTF9UWVBFX05QTSB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUIHwgdHlwZW9mIElOU1RBTExfVFlQRV9MT0NBTCB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUSFVCfSBJbnN0YWxsVHlwZVxuICovXG4iXX0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads extensions and creates `ExtensionConfig` instances.
|
|
3
|
+
*
|
|
4
|
+
* - Reads the manifest file, creating if necessary
|
|
5
|
+
* - Using the parsed extension data, creates/gets the `ExtensionConfig` subclass instances
|
|
6
|
+
* - Returns these instances
|
|
7
|
+
*
|
|
8
|
+
* If `appiumHome` is needed, use `resolveAppiumHome` from the `env` module in `@appium/support`.
|
|
9
|
+
* @param {string} appiumHome
|
|
10
|
+
* @returns {Promise<ExtensionConfigs>}
|
|
11
|
+
*/
|
|
12
|
+
export function loadExtensions(appiumHome: string): Promise<ExtensionConfigs>;
|
|
13
|
+
/**
|
|
14
|
+
* Find any plugin name which has been installed, and which has been requested for activation by
|
|
15
|
+
* using the --use-plugins flag, and turn each one into its class, so we can send them as objects
|
|
16
|
+
* to the server init. We also want to send/assign them to the umbrella driver so it can use them
|
|
17
|
+
* to wrap command execution
|
|
18
|
+
*
|
|
19
|
+
* @param {import('./plugin-config').PluginConfig} pluginConfig - a plugin extension config
|
|
20
|
+
* @param {string[]} usePlugins
|
|
21
|
+
* @returns {import('../../types').PluginClass[]}
|
|
22
|
+
*/
|
|
23
|
+
export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]): import('../../types').PluginClass[];
|
|
24
|
+
/**
|
|
25
|
+
* Find any driver name which has been installed, and turn each one into its class, so we can send
|
|
26
|
+
* them as objects to the server init in case they need to add methods/routes or update the server.
|
|
27
|
+
* If the --drivers flag was given, this method only loads the given drivers.
|
|
28
|
+
*
|
|
29
|
+
* @param {import('./driver-config').DriverConfig} driverConfig - a driver extension config
|
|
30
|
+
* @param {string[]} [useDrivers] - optional list of drivers to load
|
|
31
|
+
*/
|
|
32
|
+
export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined): any[];
|
|
33
|
+
export type ExtensionConfigs = {
|
|
34
|
+
driverConfig: DriverConfig;
|
|
35
|
+
pluginConfig: PluginConfig;
|
|
36
|
+
};
|
|
37
|
+
import { DriverConfig } from "./driver-config";
|
|
38
|
+
import { PluginConfig } from "./plugin-config";
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/extension/index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,2CAHW,MAAM,GACJ,QAAQ,gBAAgB,CAAC,CAYrC;AAED;;;;;;;;;GASG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,eACtC,MAAM,EAAE,GACN,OAAO,aAAa,EAAE,WAAW,EAAE,CA0B/C;AAED;;;;;;;GAOG;AACH,+CAHW,OAAO,iBAAiB,EAAE,YAAY,4CAuBhD;;kBAIa,YAAY;kBACZ,YAAY"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getActiveDrivers = getActiveDrivers;
|
|
9
|
+
exports.getActivePlugins = getActivePlugins;
|
|
10
|
+
exports.loadExtensions = loadExtensions;
|
|
11
|
+
|
|
12
|
+
require("source-map-support/register");
|
|
13
|
+
|
|
14
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
+
|
|
16
|
+
var _constants = require("../constants");
|
|
17
|
+
|
|
18
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
19
|
+
|
|
20
|
+
var _driverConfig = require("./driver-config");
|
|
21
|
+
|
|
22
|
+
var _manifest = require("./manifest");
|
|
23
|
+
|
|
24
|
+
var _pluginConfig = require("./plugin-config");
|
|
25
|
+
|
|
26
|
+
async function loadExtensions(appiumHome) {
|
|
27
|
+
var _DriverConfig$getInst, _PluginConfig$getInst;
|
|
28
|
+
|
|
29
|
+
const manifest = _manifest.Manifest.getInstance(appiumHome);
|
|
30
|
+
|
|
31
|
+
const {
|
|
32
|
+
drivers,
|
|
33
|
+
plugins
|
|
34
|
+
} = await manifest.read();
|
|
35
|
+
const driverConfig = (_DriverConfig$getInst = _driverConfig.DriverConfig.getInstance(manifest)) !== null && _DriverConfig$getInst !== void 0 ? _DriverConfig$getInst : _driverConfig.DriverConfig.create(manifest, {
|
|
36
|
+
extData: drivers
|
|
37
|
+
});
|
|
38
|
+
const pluginConfig = (_PluginConfig$getInst = _pluginConfig.PluginConfig.getInstance(manifest)) !== null && _PluginConfig$getInst !== void 0 ? _PluginConfig$getInst : _pluginConfig.PluginConfig.create(manifest, {
|
|
39
|
+
extData: plugins
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
driverConfig,
|
|
43
|
+
pluginConfig
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function getActivePlugins(pluginConfig, usePlugins = []) {
|
|
48
|
+
return _lodash.default.compact(Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(usePlugins, pluginName) || usePlugins.length === 1 && usePlugins[0] === _constants.USE_ALL_PLUGINS).map(pluginName => {
|
|
49
|
+
try {
|
|
50
|
+
_logger.default.info(`Attempting to load plugin ${pluginName}...`);
|
|
51
|
+
|
|
52
|
+
const PluginClass = pluginConfig.require(pluginName);
|
|
53
|
+
|
|
54
|
+
PluginClass.pluginName = pluginName;
|
|
55
|
+
return PluginClass;
|
|
56
|
+
} catch (err) {
|
|
57
|
+
_logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err.message}`);
|
|
58
|
+
|
|
59
|
+
_logger.default.debug(err.stack);
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getActiveDrivers(driverConfig, useDrivers = []) {
|
|
65
|
+
return _lodash.default.compact(Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(useDrivers, driverName) || useDrivers.length === 0).map(driverName => {
|
|
66
|
+
try {
|
|
67
|
+
_logger.default.info(`Attempting to load driver ${driverName}...`);
|
|
68
|
+
|
|
69
|
+
return driverConfig.require(driverName);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
_logger.default.error(`Could not load driver '${driverName}', so it will not be available. Error ` + `in loading the driver was: ${err.message}`);
|
|
72
|
+
|
|
73
|
+
_logger.default.debug(err.stack);
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vaW5kZXguanMiXSwibmFtZXMiOlsibG9hZEV4dGVuc2lvbnMiLCJhcHBpdW1Ib21lIiwibWFuaWZlc3QiLCJNYW5pZmVzdCIsImdldEluc3RhbmNlIiwiZHJpdmVycyIsInBsdWdpbnMiLCJyZWFkIiwiZHJpdmVyQ29uZmlnIiwiRHJpdmVyQ29uZmlnIiwiY3JlYXRlIiwiZXh0RGF0YSIsInBsdWdpbkNvbmZpZyIsIlBsdWdpbkNvbmZpZyIsImdldEFjdGl2ZVBsdWdpbnMiLCJ1c2VQbHVnaW5zIiwiXyIsImNvbXBhY3QiLCJPYmplY3QiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImZpbHRlciIsInBsdWdpbk5hbWUiLCJpbmNsdWRlcyIsImxlbmd0aCIsIlVTRV9BTExfUExVR0lOUyIsIm1hcCIsImxvZyIsImluZm8iLCJQbHVnaW5DbGFzcyIsInJlcXVpcmUiLCJlcnIiLCJlcnJvciIsIm1lc3NhZ2UiLCJkZWJ1ZyIsInN0YWNrIiwiZ2V0QWN0aXZlRHJpdmVycyIsInVzZURyaXZlcnMiLCJkcml2ZXJOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBYU8sZUFBZUEsY0FBZixDQUErQkMsVUFBL0IsRUFBMkM7QUFBQTs7QUFDaEQsUUFBTUMsUUFBUSxHQUFHQyxtQkFBU0MsV0FBVCxDQUFxQkgsVUFBckIsQ0FBakI7O0FBQ0EsUUFBTTtBQUFDSSxJQUFBQSxPQUFEO0FBQVVDLElBQUFBO0FBQVYsTUFBcUIsTUFBTUosUUFBUSxDQUFDSyxJQUFULEVBQWpDO0FBQ0EsUUFBTUMsWUFBWSw0QkFDaEJDLDJCQUFhTCxXQUFiLENBQXlCRixRQUF6QixDQURnQix5RUFFaEJPLDJCQUFhQyxNQUFiLENBQW9CUixRQUFwQixFQUE4QjtBQUFDUyxJQUFBQSxPQUFPLEVBQUVOO0FBQVYsR0FBOUIsQ0FGRjtBQUdBLFFBQU1PLFlBQVksNEJBQ2hCQywyQkFBYVQsV0FBYixDQUF5QkYsUUFBekIsQ0FEZ0IseUVBRWhCVywyQkFBYUgsTUFBYixDQUFvQlIsUUFBcEIsRUFBOEI7QUFBQ1MsSUFBQUEsT0FBTyxFQUFFTDtBQUFWLEdBQTlCLENBRkY7QUFHQSxTQUFPO0FBQUNFLElBQUFBLFlBQUQ7QUFBZUksSUFBQUE7QUFBZixHQUFQO0FBQ0Q7O0FBWU0sU0FBU0UsZ0JBQVQsQ0FBMkJGLFlBQTNCLEVBQXlDRyxVQUFVLEdBQUcsRUFBdEQsRUFBMEQ7QUFDL0QsU0FBT0MsZ0JBQUVDLE9BQUYsQ0FDTEMsTUFBTSxDQUFDQyxJQUFQLENBQVlQLFlBQVksQ0FBQ1EsbUJBQXpCLEVBQ0dDLE1BREgsQ0FFS0MsVUFBRCxJQUNFTixnQkFBRU8sUUFBRixDQUFXUixVQUFYLEVBQXVCTyxVQUF2QixLQUNDUCxVQUFVLENBQUNTLE1BQVgsS0FBc0IsQ0FBdEIsSUFBMkJULFVBQVUsQ0FBQyxDQUFELENBQVYsS0FBa0JVLDBCQUpwRCxFQU1HQyxHQU5ILENBTVFKLFVBQUQsSUFBZ0I7QUFDbkIsUUFBSTtBQUNGSyxzQkFBSUMsSUFBSixDQUFVLDZCQUE0Qk4sVUFBVyxLQUFqRDs7QUFDQSxZQUFNTyxXQUFXLEdBQUdqQixZQUFZLENBQUNrQixPQUFiLENBQXFCUixVQUFyQixDQUFwQjs7QUFFQU8sTUFBQUEsV0FBVyxDQUFDUCxVQUFaLEdBQXlCQSxVQUF6QjtBQUNBLGFBQU9PLFdBQVA7QUFDRCxLQU5ELENBTUUsT0FBT0UsR0FBUCxFQUFZO0FBQ1pKLHNCQUFJSyxLQUFKLENBQ0csMEJBQXlCVixVQUFXLHdDQUFyQyxHQUNHLDhCQUE2QlMsR0FBRyxDQUFDRSxPQUFRLEVBRjlDOztBQUlBTixzQkFBSU8sS0FBSixDQUFVSCxHQUFHLENBQUNJLEtBQWQ7QUFDRDtBQUNGLEdBcEJILENBREssQ0FBUDtBQXVCRDs7QUFVTSxTQUFTQyxnQkFBVCxDQUEyQjVCLFlBQTNCLEVBQXlDNkIsVUFBVSxHQUFHLEVBQXRELEVBQTBEO0FBQy9ELFNBQU9yQixnQkFBRUMsT0FBRixDQUNMQyxNQUFNLENBQUNDLElBQVAsQ0FBWVgsWUFBWSxDQUFDWSxtQkFBekIsRUFDR0MsTUFESCxDQUVLaUIsVUFBRCxJQUNFdEIsZ0JBQUVPLFFBQUYsQ0FBV2MsVUFBWCxFQUF1QkMsVUFBdkIsS0FBc0NELFVBQVUsQ0FBQ2IsTUFBWCxLQUFzQixDQUhsRSxFQUtHRSxHQUxILENBS1FZLFVBQUQsSUFBZ0I7QUFDbkIsUUFBSTtBQUNGWCxzQkFBSUMsSUFBSixDQUFVLDZCQUE0QlUsVUFBVyxLQUFqRDs7QUFDQSxhQUFPOUIsWUFBWSxDQUFDc0IsT0FBYixDQUFxQlEsVUFBckIsQ0FBUDtBQUNELEtBSEQsQ0FHRSxPQUFPUCxHQUFQLEVBQVk7QUFDWkosc0JBQUlLLEtBQUosQ0FDRywwQkFBeUJNLFVBQVcsd0NBQXJDLEdBQ0csOEJBQTZCUCxHQUFHLENBQUNFLE9BQVEsRUFGOUM7O0FBSUFOLHNCQUFJTyxLQUFKLENBQVVILEdBQUcsQ0FBQ0ksS0FBZDtBQUNEO0FBQ0YsR0FoQkgsQ0FESyxDQUFQO0FBbUJEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVVNFX0FMTF9QTFVHSU5TIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IERyaXZlckNvbmZpZyB9IGZyb20gJy4vZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnO1xuaW1wb3J0IHsgUGx1Z2luQ29uZmlnIH0gZnJvbSAnLi9wbHVnaW4tY29uZmlnJztcblxuLyoqXG4gKiBMb2FkcyBleHRlbnNpb25zIGFuZCBjcmVhdGVzIGBFeHRlbnNpb25Db25maWdgIGluc3RhbmNlcy5cbiAqXG4gKiAtIFJlYWRzIHRoZSBtYW5pZmVzdCBmaWxlLCBjcmVhdGluZyBpZiBuZWNlc3NhcnlcbiAqIC0gVXNpbmcgdGhlIHBhcnNlZCBleHRlbnNpb24gZGF0YSwgY3JlYXRlcy9nZXRzIHRoZSBgRXh0ZW5zaW9uQ29uZmlnYCBzdWJjbGFzcyBpbnN0YW5jZXNcbiAqIC0gUmV0dXJucyB0aGVzZSBpbnN0YW5jZXNcbiAqXG4gKiBJZiBgYXBwaXVtSG9tZWAgaXMgbmVlZGVkLCB1c2UgYHJlc29sdmVBcHBpdW1Ib21lYCBmcm9tIHRoZSBgZW52YCBtb2R1bGUgaW4gYEBhcHBpdW0vc3VwcG9ydGAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICogQHJldHVybnMge1Byb21pc2U8RXh0ZW5zaW9uQ29uZmlncz59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRXh0ZW5zaW9ucyAoYXBwaXVtSG9tZSkge1xuICBjb25zdCBtYW5pZmVzdCA9IE1hbmlmZXN0LmdldEluc3RhbmNlKGFwcGl1bUhvbWUpO1xuICBjb25zdCB7ZHJpdmVycywgcGx1Z2luc30gPSBhd2FpdCBtYW5pZmVzdC5yZWFkKCk7XG4gIGNvbnN0IGRyaXZlckNvbmZpZyA9XG4gICAgRHJpdmVyQ29uZmlnLmdldEluc3RhbmNlKG1hbmlmZXN0KSA/P1xuICAgIERyaXZlckNvbmZpZy5jcmVhdGUobWFuaWZlc3QsIHtleHREYXRhOiBkcml2ZXJzfSk7XG4gIGNvbnN0IHBsdWdpbkNvbmZpZyA9XG4gICAgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlKG1hbmlmZXN0KSA/P1xuICAgIFBsdWdpbkNvbmZpZy5jcmVhdGUobWFuaWZlc3QsIHtleHREYXRhOiBwbHVnaW5zfSk7XG4gIHJldHVybiB7ZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWd9O1xufVxuXG4vKipcbiAqIEZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICogdXNpbmcgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZywgYW5kIHR1cm4gZWFjaCBvbmUgaW50byBpdHMgY2xhc3MsIHNvIHdlIGNhbiBzZW5kIHRoZW0gYXMgb2JqZWN0c1xuICogdG8gdGhlIHNlcnZlciBpbml0LiBXZSBhbHNvIHdhbnQgdG8gc2VuZC9hc3NpZ24gdGhlbSB0byB0aGUgdW1icmVsbGEgZHJpdmVyIHNvIGl0IGNhbiB1c2UgdGhlbVxuICogdG8gd3JhcCBjb21tYW5kIGV4ZWN1dGlvblxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3BsdWdpbi1jb25maWcnKS5QbHVnaW5Db25maWd9IHBsdWdpbkNvbmZpZyAtIGEgcGx1Z2luIGV4dGVuc2lvbiBjb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nW119IHVzZVBsdWdpbnNcbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuUGx1Z2luQ2xhc3NbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVBsdWdpbnMgKHBsdWdpbkNvbmZpZywgdXNlUGx1Z2lucyA9IFtdKSB7XG4gIHJldHVybiBfLmNvbXBhY3QoXG4gICAgT2JqZWN0LmtleXMocGx1Z2luQ29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocGx1Z2luTmFtZSkgPT5cbiAgICAgICAgICBfLmluY2x1ZGVzKHVzZVBsdWdpbnMsIHBsdWdpbk5hbWUpIHx8XG4gICAgICAgICAgKHVzZVBsdWdpbnMubGVuZ3RoID09PSAxICYmIHVzZVBsdWdpbnNbMF0gPT09IFVTRV9BTExfUExVR0lOUyksXG4gICAgICApXG4gICAgICAubWFwKChwbHVnaW5OYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgdG8gbG9hZCBwbHVnaW4gJHtwbHVnaW5OYW1lfS4uLmApO1xuICAgICAgICAgIGNvbnN0IFBsdWdpbkNsYXNzID0gcGx1Z2luQ29uZmlnLnJlcXVpcmUocGx1Z2luTmFtZSk7XG5cbiAgICAgICAgICBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsgLy8gc3RvcmUgdGhlIHBsdWdpbiBuYW1lIG9uIHRoZSBjbGFzcyBzbyBpdCBjYW4gYmUgdXNlZCBsYXRlclxuICAgICAgICAgIHJldHVybiBQbHVnaW5DbGFzcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIHBsdWdpbiAnJHtwbHVnaW5OYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogRmluZCBhbnkgZHJpdmVyIG5hbWUgd2hpY2ggaGFzIGJlZW4gaW5zdGFsbGVkLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGl0cyBjbGFzcywgc28gd2UgY2FuIHNlbmRcbiAqIHRoZW0gYXMgb2JqZWN0cyB0byB0aGUgc2VydmVyIGluaXQgaW4gY2FzZSB0aGV5IG5lZWQgdG8gYWRkIG1ldGhvZHMvcm91dGVzIG9yIHVwZGF0ZSB0aGUgc2VydmVyLlxuICogSWYgdGhlIC0tZHJpdmVycyBmbGFnIHdhcyBnaXZlbiwgdGhpcyBtZXRob2Qgb25seSBsb2FkcyB0aGUgZ2l2ZW4gZHJpdmVycy5cbiAqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9kcml2ZXItY29uZmlnJykuRHJpdmVyQ29uZmlnfSBkcml2ZXJDb25maWcgLSBhIGRyaXZlciBleHRlbnNpb24gY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbdXNlRHJpdmVyc10gLSBvcHRpb25hbCBsaXN0IG9mIGRyaXZlcnMgdG8gbG9hZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRHJpdmVycyAoZHJpdmVyQ29uZmlnLCB1c2VEcml2ZXJzID0gW10pIHtcbiAgcmV0dXJuIF8uY29tcGFjdChcbiAgICBPYmplY3Qua2V5cyhkcml2ZXJDb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkcml2ZXJOYW1lKSA9PlxuICAgICAgICAgIF8uaW5jbHVkZXModXNlRHJpdmVycywgZHJpdmVyTmFtZSkgfHwgdXNlRHJpdmVycy5sZW5ndGggPT09IDAsXG4gICAgICApXG4gICAgICAubWFwKChkcml2ZXJOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgdG8gbG9hZCBkcml2ZXIgJHtkcml2ZXJOYW1lfS4uLmApO1xuICAgICAgICAgIHJldHVybiBkcml2ZXJDb25maWcucmVxdWlyZShkcml2ZXJOYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIGRyaXZlciAnJHtkcml2ZXJOYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBkcml2ZXIgd2FzOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnc1xuICogQHByb3BlcnR5IHtEcml2ZXJDb25maWd9IGRyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtQbHVnaW5Db25maWd9IHBsdWdpbkNvbmZpZ1xuICovXG4iXX0=
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles reading & writing of extension config files.
|
|
3
|
+
*
|
|
4
|
+
* Only one instance of this class exists per value of `APPIUM_HOME`.
|
|
5
|
+
*/
|
|
6
|
+
export class Manifest {
|
|
7
|
+
/**
|
|
8
|
+
* Returns a new or existing {@link Manifest} instance, based on the value of `appiumHome`.
|
|
9
|
+
*
|
|
10
|
+
* Maintains one instance per value of `appiumHome`.
|
|
11
|
+
* @param {string} appiumHome - Path to `APPIUM_HOME`
|
|
12
|
+
* @returns {Manifest}
|
|
13
|
+
*/
|
|
14
|
+
static getInstance: ((appiumHome: any) => Manifest) & _.MemoizedFunction;
|
|
15
|
+
/**
|
|
16
|
+
* Sets internal data to a fresh clone of {@link INITIAL_MANIFEST_DATA}
|
|
17
|
+
*
|
|
18
|
+
* Use {@link Manifest.getInstance} instead.
|
|
19
|
+
* @param {string} appiumHome
|
|
20
|
+
* @private
|
|
21
|
+
*/
|
|
22
|
+
private constructor();
|
|
23
|
+
/**
|
|
24
|
+
* The entire contents of a parsed YAML extension config file.
|
|
25
|
+
*
|
|
26
|
+
* Contains proxies for automatic persistence on disk
|
|
27
|
+
* @type {ManifestData}
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
private _data;
|
|
31
|
+
/**
|
|
32
|
+
* Path to `APPIUM_HOME`.
|
|
33
|
+
* @private
|
|
34
|
+
* @type {Readonly<string>}
|
|
35
|
+
*/
|
|
36
|
+
private _appiumHome;
|
|
37
|
+
/**
|
|
38
|
+
* Path to `extensions.yaml`
|
|
39
|
+
* @type {string}
|
|
40
|
+
* Not set until {@link Manifest.read} is called.
|
|
41
|
+
*/
|
|
42
|
+
_manifestPath: string;
|
|
43
|
+
/**
|
|
44
|
+
* Helps avoid writing multiple times.
|
|
45
|
+
*
|
|
46
|
+
* If this is `undefined`, calling {@link Manifest.write} will cause it to be
|
|
47
|
+
* set to a `Promise`. When the call to `write()` is complete, the `Promise`
|
|
48
|
+
* will resolve and then this value will be set to `undefined`. Concurrent calls
|
|
49
|
+
* made while this value is a `Promise` will return the `Promise` itself.
|
|
50
|
+
* @private
|
|
51
|
+
* @type {Promise<boolean>|undefined}
|
|
52
|
+
*/
|
|
53
|
+
private _writing;
|
|
54
|
+
/**
|
|
55
|
+
* Helps avoid reading multiple times.
|
|
56
|
+
*
|
|
57
|
+
* If this is `undefined`, calling {@link Manifest.read} will cause it to be
|
|
58
|
+
* set to a `Promise`. When the call to `read()` is complete, the `Promise`
|
|
59
|
+
* will resolve and then this value will be set to `undefined`. Concurrent calls
|
|
60
|
+
* made while this value is a `Promise` will return the `Promise` itself.
|
|
61
|
+
* @private
|
|
62
|
+
* @type {Promise<void>|undefined}
|
|
63
|
+
*/
|
|
64
|
+
private _reading;
|
|
65
|
+
/**
|
|
66
|
+
* Searches `APPIUM_HOME` for installed extensions and adds them to the manifest.
|
|
67
|
+
* @param {SyncWithInstalledExtensionsOpts} opts
|
|
68
|
+
* @returns {Promise<boolean>} `true` if any extensions were added, `false` otherwise.
|
|
69
|
+
*/
|
|
70
|
+
syncWithInstalledExtensions({ depthLimit }?: SyncWithInstalledExtensionsOpts): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Returns `true` if driver with name `name` is registered.
|
|
73
|
+
* @param {string} name - Driver name
|
|
74
|
+
* @returns {boolean}
|
|
75
|
+
*/
|
|
76
|
+
hasDriver(name: string): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Returns `true` if plugin with name `name` is registered.
|
|
79
|
+
* @param {string} name - Plugin name
|
|
80
|
+
* @returns {boolean}
|
|
81
|
+
*/
|
|
82
|
+
hasPlugin(name: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Given a path to a `package.json`, add it as either a driver or plugin to the manifest.
|
|
85
|
+
*
|
|
86
|
+
* Will _not_ overwrite existing entries.
|
|
87
|
+
* @template {ExtensionType} ExtType
|
|
88
|
+
* @param {ExtPackageJson<ExtType>} pkgJson
|
|
89
|
+
* @param {string} pkgPath
|
|
90
|
+
* @returns {boolean} - `true` upon success, `false` if the extension is already registered.
|
|
91
|
+
*/
|
|
92
|
+
addExtensionFromPackage<ExtType extends import("../../types").ExtensionType>(pkgJson: ExtPackageJson<ExtType>, pkgPath: string): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Adds an extension to the manifest as was installed by the `appium` CLI. The
|
|
95
|
+
* `extData`, `extType`, and `extName` have already been determined.
|
|
96
|
+
*
|
|
97
|
+
* See {@link Manifest.addExtensionFromPackage} for adding an extension from an on-disk package.
|
|
98
|
+
* @template {ExtensionType} ExtType
|
|
99
|
+
* @param {ExtType} extType - `driver` or `plugin`
|
|
100
|
+
* @param {string} extName - Name of extension
|
|
101
|
+
* @param {ExtManifest<ExtType>} extData - Extension metadata
|
|
102
|
+
* @returns {void}
|
|
103
|
+
*/
|
|
104
|
+
addExtension<ExtType_1 extends import("../../types").ExtensionType>(extType: ExtType_1, extName: string, extData: ExtManifest<ExtType_1>): void;
|
|
105
|
+
/**
|
|
106
|
+
* Returns the APPIUM_HOME path
|
|
107
|
+
*/
|
|
108
|
+
get appiumHome(): string;
|
|
109
|
+
/**
|
|
110
|
+
* Returns the path to the manifest file
|
|
111
|
+
*/
|
|
112
|
+
get manifestPath(): string;
|
|
113
|
+
/**
|
|
114
|
+
* Returns extension data for a particular type.
|
|
115
|
+
*
|
|
116
|
+
* @template {ExtensionType} ExtType
|
|
117
|
+
* @param {ExtType} extType
|
|
118
|
+
* @returns {ExtRecord<ExtType>}
|
|
119
|
+
*/
|
|
120
|
+
getExtensionData<ExtType_2 extends import("../../types").ExtensionType>(extType: ExtType_2): ExtRecord<ExtType_2>;
|
|
121
|
+
/**
|
|
122
|
+
* Reads manifest from disk and _overwrites_ the internal data.
|
|
123
|
+
*
|
|
124
|
+
* If the manifest does not exist on disk, an {@link INITIAL_MANIFEST_DATA "empty"} manifest file will be created.
|
|
125
|
+
*
|
|
126
|
+
* If `APPIUM_HOME` contains a `package.json` with an `appium` dependency, then a hash of the `package.json` will be taken. If this hash differs from the last hash, the contents of `APPIUM_HOME/node_modules` will be scanned for extensions that may have been installed outside of the `appium` CLI. Any found extensions will be added to the manifest file, and if so, the manifest file will be written to disk.
|
|
127
|
+
*
|
|
128
|
+
* Only one read operation should happen at a time. This is controlled via the {@link Manifest._reading} property.
|
|
129
|
+
* @returns {Promise<ManifestData>} The data
|
|
130
|
+
*/
|
|
131
|
+
read(): Promise<ManifestData>;
|
|
132
|
+
/**
|
|
133
|
+
* Ensures {@link Manifest._manifestPath} is set.
|
|
134
|
+
*
|
|
135
|
+
* Creates the directory if necessary.
|
|
136
|
+
* @private
|
|
137
|
+
* @returns {Promise<string>}
|
|
138
|
+
*/
|
|
139
|
+
private _setManifestPath;
|
|
140
|
+
/**
|
|
141
|
+
* Writes the data if it need s writing.
|
|
142
|
+
*
|
|
143
|
+
* If the `schemaRev` prop needs updating, the file will be written.
|
|
144
|
+
*
|
|
145
|
+
* @todo If this becomes too much of a bottleneck, throttle it.
|
|
146
|
+
* @returns {Promise<boolean>} Whether the data was written
|
|
147
|
+
*/
|
|
148
|
+
write(): Promise<boolean>;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Type of the string referring to a driver (typically as a key or type string)
|
|
152
|
+
*/
|
|
153
|
+
export type DriverType = import('../../types').DriverType;
|
|
154
|
+
/**
|
|
155
|
+
* Type of the string referring to a plugin (typically as a key or type string)
|
|
156
|
+
*/
|
|
157
|
+
export type PluginType = import('../../types').PluginType;
|
|
158
|
+
export type SyncWithInstalledExtensionsOpts = {
|
|
159
|
+
/**
|
|
160
|
+
* - Maximum depth to recurse into subdirectories
|
|
161
|
+
*/
|
|
162
|
+
depthLimit?: number | undefined;
|
|
163
|
+
};
|
|
164
|
+
export type ManifestData = import('../../types/appium-manifest').ManifestData;
|
|
165
|
+
export type InternalMetadata = import('../../types/appium-manifest').InternalMetadata;
|
|
166
|
+
export type ExtPackageJson<T> = import('../../types/external-manifest').ExtPackageJson<T>;
|
|
167
|
+
export type ExtManifest<T> = import('../../types/appium-manifest').ExtManifest<T>;
|
|
168
|
+
export type ExtRecord<T> = import('../../types/appium-manifest').ExtRecord<T>;
|
|
169
|
+
/**
|
|
170
|
+
* Either `driver` or `plugin` rn
|
|
171
|
+
*/
|
|
172
|
+
export type ExtensionType = import('../../types').ExtensionType;
|
|
173
|
+
import _ from "lodash";
|
|
174
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../lib/extension/manifest.js"],"names":[],"mappings":"AAqGA;;;;GAIG;AACH;IA4DE;;;;;;OAMG;IACH,yEAIG;IAvBH;;;;;;OAMG;IACH,sBAGC;IAzDD;;;;;;OAMG;IACH,cAAM;IAEN;;;;OAIG;IACH,oBAAY;IAEZ;;;;OAIG;IACH,eAHU,MAAM,CAGF;IAEd;;;;;;;;;OASG;IACH,iBAAS;IAET;;;;;;;;;OASG;IACH,iBAAS;IA2BT;;;;OAIG;IACH,6CAHW,+BAA+B,GAC7B,QAAQ,OAAO,CAAC,CA0B5B;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;OAQG;IACH,wHAHW,MAAM,GACJ,OAAO,CAsCnB;IAED;;;;;;;;;;OAUG;IACH,iGAJW,MAAM,oCAEJ,IAAI,CAIhB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;;;OAMG;IACH,kHAEC;IAED;;;;;;;;;OASG;IACH,QAFa,QAAQ,YAAY,CAAC,CAsDjC;IAED;;;;;;OAMG;IACH,yBAaC;IAED;;;;;;;OAOG;IACH,SAFa,QAAQ,OAAO,CAAC,CAoC5B;CACF;;;;yBAIY,OAAO,aAAa,EAAE,UAAU;;;;yBAKhC,OAAO,aAAa,EAAE,UAAU;;;;;;;2BAShC,OAAO,6BAA6B,EAAE,YAAY;+BAClD,OAAO,6BAA6B,EAAE,gBAAgB;gCAKtD,OAAO,+BAA+B,EAAE,cAAc,CAAC,CAAC,CAAC;6BAKzD,OAAO,6BAA6B,EAAE,WAAW,CAAC,CAAC,CAAC;2BAKpD,OAAO,6BAA6B,EAAE,SAAS,CAAC,CAAC,CAAC;;;;4BAKlD,OAAO,aAAa,EAAE,aAAa"}
|