appium 2.0.0-beta.4 → 2.0.0-beta.42
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 +204 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +256 -131
- package/build/lib/cli/args.d.ts +17 -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 +37 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +27 -18
- package/build/lib/cli/extension-command.d.ts +376 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +287 -156
- package/build/lib/cli/extension.d.ts +22 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +31 -17
- package/build/lib/cli/parser.d.ts +84 -0
- package/build/lib/cli/parser.d.ts.map +1 -0
- package/build/lib/cli/parser.js +164 -94
- package/build/lib/cli/plugin-command.d.ts +34 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +26 -19
- 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 +49 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +119 -96
- 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 +81 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +177 -0
- package/build/lib/extension/extension-config.d.ts +242 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +436 -0
- package/build/lib/extension/index.d.ts +48 -0
- package/build/lib/extension/index.d.ts.map +1 -0
- package/build/lib/extension/index.js +75 -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 +256 -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 +66 -0
- package/build/lib/extension/plugin-config.d.ts +57 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +78 -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 +14 -17
- package/build/lib/main.d.ts +55 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +183 -91
- 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 +178 -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 +450 -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/build/types/appium-manifest.d.ts +59 -0
- package/build/types/appium-manifest.d.ts.map +1 -0
- package/build/types/cli.d.ts +123 -0
- package/build/types/cli.d.ts.map +1 -0
- package/build/types/extension-manifest.d.ts +55 -0
- package/build/types/extension-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +16 -0
- package/build/types/index.d.ts.map +1 -0
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/index.js +11 -0
- package/lib/appium.js +520 -186
- package/lib/cli/args.js +267 -422
- package/lib/cli/driver-command.js +58 -23
- package/lib/cli/extension-command.js +613 -260
- package/lib/cli/extension.js +47 -17
- package/lib/cli/parser.js +263 -83
- package/lib/cli/plugin-command.js +48 -20
- package/lib/cli/utils.js +24 -10
- package/lib/config-file.js +219 -0
- package/lib/config.js +243 -110
- package/lib/constants.js +69 -0
- package/lib/extension/driver-config.js +249 -0
- package/lib/extension/extension-config.js +677 -0
- package/lib/extension/index.js +116 -0
- package/lib/extension/manifest.js +475 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +113 -0
- package/lib/grid-register.js +49 -35
- package/lib/logger.js +1 -2
- package/lib/logsink.js +38 -33
- package/lib/main.js +308 -100
- package/lib/schema/arg-spec.js +229 -0
- package/lib/schema/cli-args.js +238 -0
- package/lib/schema/cli-transformers.js +115 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +136 -0
- package/lib/schema/schema.js +717 -0
- package/lib/utils.js +121 -140
- package/package.json +85 -85
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +185 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/test.d.ts +7 -0
- package/test.js +13 -0
- package/types/appium-manifest.ts +73 -0
- package/types/cli.ts +150 -0
- package/types/extension-manifest.ts +64 -0
- package/types/index.ts +21 -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 -253
- 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 -209
- package/lib/plugin-config.js +0 -34
- package/lib/plugins.js +0 -10
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.DriverConfig = void 0;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
11
|
+
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
|
|
16
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
17
|
+
|
|
18
|
+
var _extensionConfig = require("./extension-config");
|
|
19
|
+
|
|
20
|
+
class DriverConfig extends _extensionConfig.ExtensionConfig {
|
|
21
|
+
knownAutomationNames;
|
|
22
|
+
static _instances = new WeakMap();
|
|
23
|
+
|
|
24
|
+
constructor(manifest) {
|
|
25
|
+
super(_constants.DRIVER_TYPE, manifest);
|
|
26
|
+
this.knownAutomationNames = new Set();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static create(manifest) {
|
|
30
|
+
const instance = new DriverConfig(manifest);
|
|
31
|
+
|
|
32
|
+
if (DriverConfig.getInstance(manifest)) {
|
|
33
|
+
throw new Error(`Manifest with APPIUM_HOME ${manifest.appiumHome} already has a DriverConfig; use DriverConfig.getInstance() to retrieve it.`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
DriverConfig._instances.set(manifest, instance);
|
|
37
|
+
|
|
38
|
+
return instance;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static getInstance(manifest) {
|
|
42
|
+
return DriverConfig._instances.get(manifest);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async validate() {
|
|
46
|
+
this.knownAutomationNames.clear();
|
|
47
|
+
return await super._validate(this.manifest.getExtensionData(_constants.DRIVER_TYPE));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
getConfigProblems(extData) {
|
|
51
|
+
const problems = [];
|
|
52
|
+
const {
|
|
53
|
+
platformNames,
|
|
54
|
+
automationName
|
|
55
|
+
} = extData;
|
|
56
|
+
|
|
57
|
+
if (!_lodash.default.isArray(platformNames)) {
|
|
58
|
+
problems.push({
|
|
59
|
+
err: 'Missing or incorrect supported platformNames list.',
|
|
60
|
+
val: platformNames
|
|
61
|
+
});
|
|
62
|
+
} else {
|
|
63
|
+
if (_lodash.default.isEmpty(platformNames)) {
|
|
64
|
+
problems.push({
|
|
65
|
+
err: 'Empty platformNames list.',
|
|
66
|
+
val: platformNames
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
for (const pName of platformNames) {
|
|
70
|
+
if (!_lodash.default.isString(pName)) {
|
|
71
|
+
problems.push({
|
|
72
|
+
err: 'Incorrectly formatted platformName.',
|
|
73
|
+
val: pName
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!_lodash.default.isString(automationName)) {
|
|
81
|
+
problems.push({
|
|
82
|
+
err: 'Missing or incorrect automationName',
|
|
83
|
+
val: automationName
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (this.knownAutomationNames.has(automationName)) {
|
|
88
|
+
problems.push({
|
|
89
|
+
err: 'Multiple drivers claim support for the same automationName',
|
|
90
|
+
val: automationName
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
this.knownAutomationNames.add(automationName);
|
|
95
|
+
return problems;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
extensionDesc(driverName, {
|
|
99
|
+
version,
|
|
100
|
+
automationName
|
|
101
|
+
}) {
|
|
102
|
+
return `${driverName}@${version} (automationName '${automationName}')`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
findMatchingDriver({
|
|
106
|
+
automationName,
|
|
107
|
+
platformName
|
|
108
|
+
}) {
|
|
109
|
+
if (!_lodash.default.isString(platformName)) {
|
|
110
|
+
throw new Error('You must include a platformName capability');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!_lodash.default.isString(automationName)) {
|
|
114
|
+
throw new Error('You must include an automationName capability');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
_logger.default.info(`Attempting to find matching driver for automationName ` + `'${automationName}' and platformName '${platformName}'`);
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
const {
|
|
121
|
+
driverName,
|
|
122
|
+
mainClass,
|
|
123
|
+
version
|
|
124
|
+
} = this._getDriverBySupport(automationName, platformName);
|
|
125
|
+
|
|
126
|
+
_logger.default.info(`The '${driverName}' driver was installed and matched caps.`);
|
|
127
|
+
|
|
128
|
+
_logger.default.info(`Will require it at ${this.getInstallPath(driverName)}`);
|
|
129
|
+
|
|
130
|
+
const driver = this.require(driverName);
|
|
131
|
+
|
|
132
|
+
if (!driver) {
|
|
133
|
+
throw new Error(`Driver '${driverName}' did not export a class with name '${mainClass}'. Contact the author of the driver!`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
driver,
|
|
138
|
+
version,
|
|
139
|
+
driverName
|
|
140
|
+
};
|
|
141
|
+
} catch (err) {
|
|
142
|
+
const msg = `Could not find a driver for automationName ` + `'${automationName}' and platformName ${platformName}'. ` + `Have you installed a driver that supports those ` + `capabilities? Run 'appium driver list --installed' to see. ` + `(Lower-level error: ${err.message})`;
|
|
143
|
+
throw new Error(msg);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
_getDriverBySupport(matchAutomationName, matchPlatformName) {
|
|
148
|
+
const drivers = this.installedExtensions;
|
|
149
|
+
|
|
150
|
+
for (const [driverName, driverData] of _lodash.default.toPairs(drivers)) {
|
|
151
|
+
const {
|
|
152
|
+
automationName,
|
|
153
|
+
platformNames
|
|
154
|
+
} = driverData;
|
|
155
|
+
const aNameMatches = automationName.toLowerCase() === matchAutomationName.toLowerCase();
|
|
156
|
+
|
|
157
|
+
const pNameMatches = _lodash.default.includes(platformNames.map(_lodash.default.toLower), matchPlatformName.toLowerCase());
|
|
158
|
+
|
|
159
|
+
if (aNameMatches && pNameMatches) {
|
|
160
|
+
return {
|
|
161
|
+
driverName,
|
|
162
|
+
...driverData
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (aNameMatches) {
|
|
167
|
+
throw new Error(`Driver '${driverName}' supports automationName ` + `'${automationName}', but Appium could not find ` + `support for platformName '${matchPlatformName}'. Supported ` + `platformNames are: ` + JSON.stringify(platformNames));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
throw new Error(`Could not find installed driver to support given caps`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
exports.DriverConfig = DriverConfig;
|
|
177
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEcml2ZXJDb25maWciLCJFeHRlbnNpb25Db25maWciLCJrbm93bkF1dG9tYXRpb25OYW1lcyIsIl9pbnN0YW5jZXMiLCJXZWFrTWFwIiwiY29uc3RydWN0b3IiLCJtYW5pZmVzdCIsIkRSSVZFUl9UWVBFIiwiU2V0IiwiY3JlYXRlIiwiaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsIkVycm9yIiwiYXBwaXVtSG9tZSIsInNldCIsImdldCIsInZhbGlkYXRlIiwiY2xlYXIiLCJfdmFsaWRhdGUiLCJnZXRFeHRlbnNpb25EYXRhIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJleHREYXRhIiwicHJvYmxlbXMiLCJwbGF0Zm9ybU5hbWVzIiwiYXV0b21hdGlvbk5hbWUiLCJfIiwiaXNBcnJheSIsInB1c2giLCJlcnIiLCJ2YWwiLCJpc0VtcHR5IiwicE5hbWUiLCJpc1N0cmluZyIsImhhcyIsImFkZCIsImV4dGVuc2lvbkRlc2MiLCJkcml2ZXJOYW1lIiwidmVyc2lvbiIsImZpbmRNYXRjaGluZ0RyaXZlciIsInBsYXRmb3JtTmFtZSIsImxvZyIsImluZm8iLCJtYWluQ2xhc3MiLCJfZ2V0RHJpdmVyQnlTdXBwb3J0IiwiZ2V0SW5zdGFsbFBhdGgiLCJkcml2ZXIiLCJyZXF1aXJlIiwibXNnIiwibWVzc2FnZSIsIm1hdGNoQXV0b21hdGlvbk5hbWUiLCJtYXRjaFBsYXRmb3JtTmFtZSIsImRyaXZlcnMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiZHJpdmVyRGF0YSIsInRvUGFpcnMiLCJhTmFtZU1hdGNoZXMiLCJ0b0xvd2VyQ2FzZSIsInBOYW1lTWF0Y2hlcyIsImluY2x1ZGVzIiwibWFwIiwidG9Mb3dlciIsIkpTT04iLCJzdHJpbmdpZnkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXh0ZW5zaW9uL2RyaXZlci1jb25maWcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RFJJVkVSX1RZUEV9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQge0V4dGVuc2lvbkNvbmZpZ30gZnJvbSAnLi9leHRlbnNpb24tY29uZmlnJztcblxuLyoqXG4gKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uQ29uZmlnPERyaXZlclR5cGU+fVxuICovXG5leHBvcnQgY2xhc3MgRHJpdmVyQ29uZmlnIGV4dGVuZHMgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHVuaXF1ZSBhdXRvbWF0aW9uIG5hbWVzIHVzZWQgYnkgZHJpdmVycy5cbiAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgKi9cbiAga25vd25BdXRvbWF0aW9uTmFtZXM7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB7QGxpbmsgTWFuaWZlc3R9IGluc3RhbmNlcyB0byB7QGxpbmsgRHJpdmVyQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIGBNYW5pZmVzdGAgYW5kIGBFeHRlbnNpb25Db25maWdgIGhhdmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXA7IGVhY2ggYE1hbmlmZXN0YCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgYERyaXZlckNvbmZpZ2AgYW5kIGEgYFBsdWdpbkNvbmZpZ2A7IG5vIG1vcmUsIG5vIGxlc3MuXG4gICAqXG4gICAqIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBgTWFuaWZlc3RgLXRvLWBEcml2ZXJDb25maWdgIHBvcnRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtXZWFrTWFwPE1hbmlmZXN0LERyaXZlckNvbmZpZz59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX2luc3RhbmNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gICAqIENhbGwge0BsaW5rIERyaXZlckNvbmZpZy5jcmVhdGV9IGluc3RlYWQuXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IG1hbmlmZXN0IC0gTWFuaWZlc3QgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1hbmlmZXN0KSB7XG4gICAgc3VwZXIoRFJJVkVSX1RZUEUsIG1hbmlmZXN0KTtcblxuICAgIHRoaXMua25vd25BdXRvbWF0aW9uTmFtZXMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRHJpdmVyQ29uZmlnfSBpbnN0YW5jZSBmb3IgYSB7QGxpbmsgTWFuaWZlc3R9IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdFxuICAgKiBAdGhyb3dzIElmIGBtYW5pZmVzdGAgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBgRHJpdmVyQ29uZmlnYFxuICAgKiBAcmV0dXJucyB7RHJpdmVyQ29uZmlnfVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShtYW5pZmVzdCkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyaXZlckNvbmZpZyhtYW5pZmVzdCk7XG4gICAgaWYgKERyaXZlckNvbmZpZy5nZXRJbnN0YW5jZShtYW5pZmVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1hbmlmZXN0IHdpdGggQVBQSVVNX0hPTUUgJHttYW5pZmVzdC5hcHBpdW1Ib21lfSBhbHJlYWR5IGhhcyBhIERyaXZlckNvbmZpZzsgdXNlIERyaXZlckNvbmZpZy5nZXRJbnN0YW5jZSgpIHRvIHJldHJpZXZlIGl0LmBcbiAgICAgICk7XG4gICAgfVxuICAgIERyaXZlckNvbmZpZy5faW5zdGFuY2VzLnNldChtYW5pZmVzdCwgaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgRHJpdmVyQ29uZmlnIGFzc29jaWF0ZWQgd2l0aCBhIE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7TWFuaWZlc3R9IG1hbmlmZXN0XG4gICAqIEByZXR1cm5zIHtEcml2ZXJDb25maWd8dW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKG1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIERyaXZlckNvbmZpZy5faW5zdGFuY2VzLmdldChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGV4dGVuc2lvbnMgZm9yIHByb2JsZW1zXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICB0aGlzLmtub3duQXV0b21hdGlvbk5hbWVzLmNsZWFyKCk7XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLl92YWxpZGF0ZSh0aGlzLm1hbmlmZXN0LmdldEV4dGVuc2lvbkRhdGEoRFJJVkVSX1RZUEUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PERyaXZlclR5cGU+fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJy4vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dE1hbmlmZXN0UHJvYmxlbVtdfVxuICAgKi9cbiAgZ2V0Q29uZmlnUHJvYmxlbXMoZXh0RGF0YSkge1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG4gICAgY29uc3Qge3BsYXRmb3JtTmFtZXMsIGF1dG9tYXRpb25OYW1lfSA9IGV4dERhdGE7XG5cbiAgICBpZiAoIV8uaXNBcnJheShwbGF0Zm9ybU5hbWVzKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IHN1cHBvcnRlZCBwbGF0Zm9ybU5hbWVzIGxpc3QuJyxcbiAgICAgICAgdmFsOiBwbGF0Zm9ybU5hbWVzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocGxhdGZvcm1OYW1lcykpIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnRW1wdHkgcGxhdGZvcm1OYW1lcyBsaXN0LicsXG4gICAgICAgICAgdmFsOiBwbGF0Zm9ybU5hbWVzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcE5hbWUgb2YgcGxhdGZvcm1OYW1lcykge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhwTmFtZSkpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgICBlcnI6ICdJbmNvcnJlY3RseSBmb3JtYXR0ZWQgcGxhdGZvcm1OYW1lLicsXG4gICAgICAgICAgICAgIHZhbDogcE5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYXV0b21hdGlvbk5hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgYXV0b21hdGlvbk5hbWUnLFxuICAgICAgICB2YWw6IGF1dG9tYXRpb25OYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMua25vd25BdXRvbWF0aW9uTmFtZXMuaGFzKGF1dG9tYXRpb25OYW1lKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ011bHRpcGxlIGRyaXZlcnMgY2xhaW0gc3VwcG9ydCBmb3IgdGhlIHNhbWUgYXV0b21hdGlvbk5hbWUnLFxuICAgICAgICB2YWw6IGF1dG9tYXRpb25OYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2hvdWxkIHdlIHJldGFpbiB0aGUgbmFtZSBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24sIG9uY2Ugd2UndmUgY2hlY2tlZCB0aGVyZSBhcmUgbm8gcHJvYmxlbXM/XG4gICAgdGhpcy5rbm93bkF1dG9tYXRpb25OYW1lcy5hZGQoYXV0b21hdGlvbk5hbWUpO1xuXG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxEcml2ZXJUeXBlPn0gZHJpdmVyTmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PERyaXZlclR5cGU+fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBleHRlbnNpb25EZXNjKGRyaXZlck5hbWUsIHt2ZXJzaW9uLCBhdXRvbWF0aW9uTmFtZX0pIHtcbiAgICByZXR1cm4gYCR7ZHJpdmVyTmFtZX1AJHt2ZXJzaW9ufSAoYXV0b21hdGlvbk5hbWUgJyR7YXV0b21hdGlvbk5hbWV9JylgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGNhcGFiaWxpdGllcywgZmluZCBhIG1hdGNoaW5nIGRyaXZlciB3aXRoaW4gdGhlIGNvbmZpZy4gTG9hZCBpdHMgY2xhc3MgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIHZlcnNpb24gYW5kIGRyaXZlciBuYW1lLlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKiBAcmV0dXJucyB7TWF0Y2hlZERyaXZlcn1cbiAgICovXG4gIGZpbmRNYXRjaGluZ0RyaXZlcih7YXV0b21hdGlvbk5hbWUsIHBsYXRmb3JtTmFtZX0pIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGxhdGZvcm1OYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbmNsdWRlIGEgcGxhdGZvcm1OYW1lIGNhcGFiaWxpdHknKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYXV0b21hdGlvbk5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluY2x1ZGUgYW4gYXV0b21hdGlvbk5hbWUgY2FwYWJpbGl0eScpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZmluZCBtYXRjaGluZyBkcml2ZXIgZm9yIGF1dG9tYXRpb25OYW1lIGAgK1xuICAgICAgICBgJyR7YXV0b21hdGlvbk5hbWV9JyBhbmQgcGxhdGZvcm1OYW1lICcke3BsYXRmb3JtTmFtZX0nYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge2RyaXZlck5hbWUsIG1haW5DbGFzcywgdmVyc2lvbn0gPSB0aGlzLl9nZXREcml2ZXJCeVN1cHBvcnQoXG4gICAgICAgIGF1dG9tYXRpb25OYW1lLFxuICAgICAgICBwbGF0Zm9ybU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgVGhlICcke2RyaXZlck5hbWV9JyBkcml2ZXIgd2FzIGluc3RhbGxlZCBhbmQgbWF0Y2hlZCBjYXBzLmApO1xuICAgICAgbG9nLmluZm8oYFdpbGwgcmVxdWlyZSBpdCBhdCAke3RoaXMuZ2V0SW5zdGFsbFBhdGgoZHJpdmVyTmFtZSl9YCk7XG4gICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLnJlcXVpcmUoZHJpdmVyTmFtZSk7XG4gICAgICBpZiAoIWRyaXZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYERyaXZlciAnJHtkcml2ZXJOYW1lfScgZGlkIG5vdCBleHBvcnQgYSBjbGFzcyB3aXRoIG5hbWUgJyR7bWFpbkNsYXNzfScuIENvbnRhY3QgdGhlIGF1dGhvciBvZiB0aGUgZHJpdmVyIWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7ZHJpdmVyLCB2ZXJzaW9uLCBkcml2ZXJOYW1lfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBhIGRyaXZlciBmb3IgYXV0b21hdGlvbk5hbWUgYCArXG4gICAgICAgIGAnJHthdXRvbWF0aW9uTmFtZX0nIGFuZCBwbGF0Zm9ybU5hbWUgJHtwbGF0Zm9ybU5hbWV9Jy4gYCArXG4gICAgICAgIGBIYXZlIHlvdSBpbnN0YWxsZWQgYSBkcml2ZXIgdGhhdCBzdXBwb3J0cyB0aG9zZSBgICtcbiAgICAgICAgYGNhcGFiaWxpdGllcz8gUnVuICdhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQnIHRvIHNlZS4gYCArXG4gICAgICAgIGAoTG93ZXItbGV2ZWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9KWA7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gYXV0b21hdGlvbiBuYW1lIGFuZCBwbGF0Zm9ybSBuYW1lLCBmaW5kIGEgc3VpdGFibGUgZHJpdmVyIGFuZCByZXR1cm4gaXRzIGV4dGVuc2lvbiBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hBdXRvbWF0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hQbGF0Zm9ybU5hbWVcbiAgICogQHJldHVybnMge0V4dE1ldGFkYXRhPERyaXZlclR5cGU+ICYgaW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5JbnRlcm5hbE1ldGFkYXRhICYgaW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5Db21tb25FeHRNZXRhZGF0YX1cbiAgICovXG4gIF9nZXREcml2ZXJCeVN1cHBvcnQobWF0Y2hBdXRvbWF0aW9uTmFtZSwgbWF0Y2hQbGF0Zm9ybU5hbWUpIHtcbiAgICBjb25zdCBkcml2ZXJzID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICAgIGZvciAoY29uc3QgW2RyaXZlck5hbWUsIGRyaXZlckRhdGFdIG9mIF8udG9QYWlycyhkcml2ZXJzKSkge1xuICAgICAgY29uc3Qge2F1dG9tYXRpb25OYW1lLCBwbGF0Zm9ybU5hbWVzfSA9IGRyaXZlckRhdGE7XG4gICAgICBjb25zdCBhTmFtZU1hdGNoZXMgPSBhdXRvbWF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtYXRjaEF1dG9tYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBwTmFtZU1hdGNoZXMgPSBfLmluY2x1ZGVzKFxuICAgICAgICBwbGF0Zm9ybU5hbWVzLm1hcChfLnRvTG93ZXIpLFxuICAgICAgICBtYXRjaFBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuXG4gICAgICBpZiAoYU5hbWVNYXRjaGVzICYmIHBOYW1lTWF0Y2hlcykge1xuICAgICAgICByZXR1cm4ge2RyaXZlck5hbWUsIC4uLmRyaXZlckRhdGF9O1xuICAgICAgfVxuXG4gICAgICBpZiAoYU5hbWVNYXRjaGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRHJpdmVyICcke2RyaXZlck5hbWV9JyBzdXBwb3J0cyBhdXRvbWF0aW9uTmFtZSBgICtcbiAgICAgICAgICAgIGAnJHthdXRvbWF0aW9uTmFtZX0nLCBidXQgQXBwaXVtIGNvdWxkIG5vdCBmaW5kIGAgK1xuICAgICAgICAgICAgYHN1cHBvcnQgZm9yIHBsYXRmb3JtTmFtZSAnJHttYXRjaFBsYXRmb3JtTmFtZX0nLiBTdXBwb3J0ZWQgYCArXG4gICAgICAgICAgICBgcGxhdGZvcm1OYW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGxhdGZvcm1OYW1lcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGluc3RhbGxlZCBkcml2ZXIgdG8gc3VwcG9ydCBnaXZlbiBjYXBzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWV0YWRhdGE8VD59IEV4dE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5NYW5pZmVzdERhdGF9IE1hbmlmZXN0RGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdH0gTWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRSZWNvcmQ8VD59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE5hbWU8VD59IEV4dE5hbWVcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIERyaXZlckNvbmZpZy5maW5kTWF0Y2hpbmdEcml2ZXJ9XG4gKiBAdHlwZWRlZiBNYXRjaGVkRHJpdmVyXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzfSBkcml2ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZHJpdmVyTmFtZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllc30gQ2FwYWJpbGl0aWVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLTyxNQUFNQSxZQUFOLFNBQTJCQyxnQ0FBM0IsQ0FBMkM7RUFLaERDLG9CQUFvQjtFQVlILE9BQVZDLFVBQVUsR0FBRyxJQUFJQyxPQUFKLEVBQUg7O0VBT2pCQyxXQUFXLENBQUNDLFFBQUQsRUFBVztJQUNwQixNQUFNQyxzQkFBTixFQUFtQkQsUUFBbkI7SUFFQSxLQUFLSixvQkFBTCxHQUE0QixJQUFJTSxHQUFKLEVBQTVCO0VBQ0Q7O0VBU1ksT0FBTkMsTUFBTSxDQUFDSCxRQUFELEVBQVc7SUFDdEIsTUFBTUksUUFBUSxHQUFHLElBQUlWLFlBQUosQ0FBaUJNLFFBQWpCLENBQWpCOztJQUNBLElBQUlOLFlBQVksQ0FBQ1csV0FBYixDQUF5QkwsUUFBekIsQ0FBSixFQUF3QztNQUN0QyxNQUFNLElBQUlNLEtBQUosQ0FDSCw2QkFBNEJOLFFBQVEsQ0FBQ08sVUFBVyw2RUFEN0MsQ0FBTjtJQUdEOztJQUNEYixZQUFZLENBQUNHLFVBQWIsQ0FBd0JXLEdBQXhC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
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This class is abstract. It should not be instantiated directly.
|
|
3
|
+
*
|
|
4
|
+
* Subclasses should provide the generic parameter to implement.
|
|
5
|
+
* @template {ExtensionType} ExtType
|
|
6
|
+
*/
|
|
7
|
+
export class ExtensionConfig<ExtType extends import("@appium/types").ExtensionType> {
|
|
8
|
+
/**
|
|
9
|
+
* Intended to be called by corresponding instance methods of subclass.
|
|
10
|
+
* @private
|
|
11
|
+
* @template {ExtensionType} ExtType
|
|
12
|
+
* @param {string} appiumHome
|
|
13
|
+
* @param {ExtType} extType
|
|
14
|
+
* @param {ExtName<ExtType>} extName - Extension name (unique to its type)
|
|
15
|
+
* @param {ExtManifestWithSchema<ExtType>} extManifest - Extension config
|
|
16
|
+
* @returns {import('ajv').SchemaObject|undefined}
|
|
17
|
+
*/
|
|
18
|
+
private static _readExtensionSchema;
|
|
19
|
+
/**
|
|
20
|
+
* Returns `true` if a specific {@link ExtManifest} object has a `schema` prop.
|
|
21
|
+
* The {@link ExtManifest} object becomes a {@link ExtManifestWithSchema} object.
|
|
22
|
+
* @template {ExtensionType} ExtType
|
|
23
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
24
|
+
* @returns {extManifest is ExtManifestWithSchema<ExtType>}
|
|
25
|
+
*/
|
|
26
|
+
static extDataHasSchema<ExtType_1 extends import("@appium/types").ExtensionType>(extManifest: ExtManifest<ExtType_1>): extManifest is ExtManifestWithSchema<ExtType_1>;
|
|
27
|
+
/**
|
|
28
|
+
* @protected
|
|
29
|
+
* @param {ExtType} extensionType - Type of extension
|
|
30
|
+
* @param {Manifest} manifest - `Manifest` instance
|
|
31
|
+
*/
|
|
32
|
+
protected constructor();
|
|
33
|
+
/** @type {ExtType} */
|
|
34
|
+
extensionType: ExtType;
|
|
35
|
+
/** @type {`${ExtType}s`} */
|
|
36
|
+
configKey: `${ExtType}s`;
|
|
37
|
+
/** @type {ExtRecord<ExtType>} */
|
|
38
|
+
installedExtensions: ExtRecord<ExtType>;
|
|
39
|
+
/** @type {import('@appium/types').AppiumLogger} */
|
|
40
|
+
log: import('@appium/types').AppiumLogger;
|
|
41
|
+
/** @type {Manifest} */
|
|
42
|
+
manifest: Manifest;
|
|
43
|
+
/**
|
|
44
|
+
* @type {ExtensionListData}
|
|
45
|
+
*/
|
|
46
|
+
_listDataCache: ExtensionListData;
|
|
47
|
+
get manifestPath(): string;
|
|
48
|
+
get appiumHome(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Returns a list of errors for a given extension.
|
|
51
|
+
*
|
|
52
|
+
* @param {ExtName<ExtType>} extName
|
|
53
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
54
|
+
* @returns {ExtManifestProblem[]}
|
|
55
|
+
*/
|
|
56
|
+
getProblems(extName: ExtName<ExtType>, extManifest: ExtManifest<ExtType>): ExtManifestProblem[];
|
|
57
|
+
/**
|
|
58
|
+
* Returns a list of warnings for a given extension.
|
|
59
|
+
*
|
|
60
|
+
* @param {ExtName<ExtType>} extName
|
|
61
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
62
|
+
* @returns {Promise<string[]>}
|
|
63
|
+
*/
|
|
64
|
+
getWarnings(extName: ExtName<ExtType>, extManifest: ExtManifest<ExtType>): Promise<string[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Returns a list of extension-type-specific issues. To be implemented by subclasses.
|
|
67
|
+
* @abstract
|
|
68
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
69
|
+
* @param {ExtName<ExtType>} extName
|
|
70
|
+
* @returns {Promise<string[]>}
|
|
71
|
+
*/
|
|
72
|
+
getConfigWarnings(extManifest: ExtManifest<ExtType>, extName: ExtName<ExtType>): Promise<string[]>;
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* @param {Map<ExtName<ExtType>,ExtManifestProblem[]>} [errorMap]
|
|
76
|
+
* @param {Map<ExtName<ExtType>,string[]>} [warningMap]
|
|
77
|
+
*/
|
|
78
|
+
getValidationResultSummaries(errorMap?: Map<string, ExtManifestProblem[]> | undefined, warningMap?: Map<string, string[]> | undefined): {
|
|
79
|
+
errorSummaries: string[];
|
|
80
|
+
warningSummaries: string[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Checks extensions for problems. To be called by subclasses' `validate` method.
|
|
84
|
+
*
|
|
85
|
+
* Errors and warnings will be displayed to the user.
|
|
86
|
+
*
|
|
87
|
+
* This method mutates `exts`.
|
|
88
|
+
*
|
|
89
|
+
* @protected
|
|
90
|
+
* @param {ExtRecord<ExtType>} exts - Lookup of extension names to {@linkcode ExtManifest} objects
|
|
91
|
+
* @returns {Promise<ExtRecord<ExtType>>} The same lookup, but picking only error-free extensions
|
|
92
|
+
*/
|
|
93
|
+
protected _validate(exts: ExtRecord<ExtType>): Promise<ExtRecord<ExtType>>;
|
|
94
|
+
/**
|
|
95
|
+
* Retrieves listing data for extensions via command class.
|
|
96
|
+
* Caches the result in {@linkcode ExtensionConfig._listDataCache}
|
|
97
|
+
* @protected
|
|
98
|
+
* @returns {Promise<ExtensionListData>}
|
|
99
|
+
*/
|
|
100
|
+
protected getListData(): Promise<ExtensionListData>;
|
|
101
|
+
/**
|
|
102
|
+
* Returns a list of warnings for a particular extension.
|
|
103
|
+
*
|
|
104
|
+
* By definition, a non-empty list of warnings does _not_ imply the extension cannot be loaded,
|
|
105
|
+
* but it may not work as expected or otherwise throw an exception at runtime.
|
|
106
|
+
*
|
|
107
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
108
|
+
* @param {ExtName<ExtType>} extName
|
|
109
|
+
* @returns {Promise<string[]>}
|
|
110
|
+
*/
|
|
111
|
+
getGenericConfigWarnings(extManifest: ExtManifest<ExtType>, extName: ExtName<ExtType>): Promise<string[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Returns list of unrecoverable errors (if any) for the given extension _if_ it has a `schema` property.
|
|
114
|
+
*
|
|
115
|
+
* @param {ExtManifest<ExtType>} extManifest - Extension data (from manifest)
|
|
116
|
+
* @param {ExtName<ExtType>} extName - Extension name (from manifest)
|
|
117
|
+
* @returns {ExtManifestProblem[]}
|
|
118
|
+
*/
|
|
119
|
+
getSchemaProblems(extManifest: ExtManifest<ExtType>, extName: ExtName<ExtType>): ExtManifestProblem[];
|
|
120
|
+
/**
|
|
121
|
+
* Return a list of generic unrecoverable errors for the given extension
|
|
122
|
+
* @param {ExtManifest<ExtType>} extManifest - Extension data (from manifest)
|
|
123
|
+
* @param {ExtName<ExtType>} extName - Extension name (from manifest)
|
|
124
|
+
* @returns {ExtManifestProblem[]}
|
|
125
|
+
*/
|
|
126
|
+
getGenericConfigProblems(extManifest: ExtManifest<ExtType>, extName: ExtName<ExtType>): ExtManifestProblem[];
|
|
127
|
+
/**
|
|
128
|
+
* @abstract
|
|
129
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
130
|
+
* @param {ExtName<ExtType>} extName
|
|
131
|
+
* @returns {ExtManifestProblem[]}
|
|
132
|
+
*/
|
|
133
|
+
getConfigProblems(extManifest: ExtManifest<ExtType>, extName: ExtName<ExtType>): ExtManifestProblem[];
|
|
134
|
+
/**
|
|
135
|
+
* @param {string} extName
|
|
136
|
+
* @param {ExtManifest<ExtType>} extManifest
|
|
137
|
+
* @param {ExtensionConfigMutationOpts} [opts]
|
|
138
|
+
* @returns {Promise<void>}
|
|
139
|
+
*/
|
|
140
|
+
addExtension(extName: string, extManifest: ExtManifest<ExtType>, { write }?: ExtensionConfigMutationOpts | undefined): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* @param {ExtName<ExtType>} extName
|
|
143
|
+
* @param {ExtManifest<ExtType>|import('../cli/extension-command').ExtensionFields<ExtType>} extManifest
|
|
144
|
+
* @param {ExtensionConfigMutationOpts} [opts]
|
|
145
|
+
* @returns {Promise<void>}
|
|
146
|
+
*/
|
|
147
|
+
updateExtension(extName: ExtName<ExtType>, extManifest: ExtManifest<ExtType> | import('../cli/extension-command').ExtensionFields<ExtType>, { write }?: ExtensionConfigMutationOpts | undefined): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Remove an extension from the list of installed extensions, and optionally avoid a write to the manifest file.
|
|
150
|
+
*
|
|
151
|
+
* @param {ExtName<ExtType>} extName
|
|
152
|
+
* @param {ExtensionConfigMutationOpts} [opts]
|
|
153
|
+
* @returns {Promise<void>}
|
|
154
|
+
*/
|
|
155
|
+
removeExtension(extName: ExtName<ExtType>, { write }?: ExtensionConfigMutationOpts | undefined): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* @param {ExtName<ExtType>[]} [activeNames]
|
|
158
|
+
* @returns {void}
|
|
159
|
+
*/
|
|
160
|
+
print(activeNames?: string[] | undefined): void;
|
|
161
|
+
/**
|
|
162
|
+
* Returns a string describing the extension. Subclasses must implement.
|
|
163
|
+
* @param {ExtName<ExtType>} extName - Extension name
|
|
164
|
+
* @param {ExtManifest<ExtType>} extManifest - Extension data
|
|
165
|
+
* @returns {string}
|
|
166
|
+
* @abstract
|
|
167
|
+
*/
|
|
168
|
+
extensionDesc(extName: ExtName<ExtType>, extManifest: ExtManifest<ExtType>): string;
|
|
169
|
+
/**
|
|
170
|
+
* @param {string} extName
|
|
171
|
+
* @returns {string}
|
|
172
|
+
*/
|
|
173
|
+
getInstallPath(extName: string): string;
|
|
174
|
+
/**
|
|
175
|
+
* Loads extension and returns its main class (constructor)
|
|
176
|
+
* @param {ExtName<ExtType>} extName
|
|
177
|
+
* @returns {ExtClass<ExtType>}
|
|
178
|
+
*/
|
|
179
|
+
require(extName: ExtName<ExtType>): ExtClass<ExtType>;
|
|
180
|
+
/**
|
|
181
|
+
* @param {string} extName
|
|
182
|
+
* @returns {boolean}
|
|
183
|
+
*/
|
|
184
|
+
isInstalled(extName: string): boolean;
|
|
185
|
+
/**
|
|
186
|
+
* If an extension provides a schema, this will load the schema and attempt to
|
|
187
|
+
* register it with the schema registrar.
|
|
188
|
+
* @param {ExtName<ExtType>} extName - Name of extension
|
|
189
|
+
* @param {ExtManifestWithSchema<ExtType>} extManifest - Extension data
|
|
190
|
+
* @returns {import('ajv').SchemaObject|undefined}
|
|
191
|
+
*/
|
|
192
|
+
readExtensionSchema(extName: ExtName<ExtType>, extManifest: ExtManifestWithSchema<ExtType>): import('ajv').SchemaObject | undefined;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* An issue with the {@linkcode ExtManifest } for a particular extension.
|
|
196
|
+
*
|
|
197
|
+
* The existance of such an object implies that the extension cannot be loaded.
|
|
198
|
+
*/
|
|
199
|
+
export type ExtManifestProblem = {
|
|
200
|
+
/**
|
|
201
|
+
* - Error message
|
|
202
|
+
*/
|
|
203
|
+
err: string;
|
|
204
|
+
/**
|
|
205
|
+
* - Associated value
|
|
206
|
+
*/
|
|
207
|
+
val: any;
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* An optional logging function provided to an {@link ExtensionConfig } subclass.
|
|
211
|
+
*/
|
|
212
|
+
export type ExtensionLogFn = (...args: any[]) => void;
|
|
213
|
+
export type ExtensionType = import('@appium/types').ExtensionType;
|
|
214
|
+
export type Manifest = import('./manifest').Manifest;
|
|
215
|
+
export type ExtManifest<T> = import('appium/types').ExtManifest<T>;
|
|
216
|
+
export type ExtManifestWithSchema<T> = import('appium/types').ExtManifestWithSchema<T>;
|
|
217
|
+
export type ExtName<T> = import('appium/types').ExtName<T>;
|
|
218
|
+
export type ExtClass<T> = import('appium/types').ExtClass<T>;
|
|
219
|
+
export type ExtRecord<T> = import('appium/types').ExtRecord<T>;
|
|
220
|
+
export type ExtCommand<T> = import('../cli/extension').ExtCommand<T>;
|
|
221
|
+
/**
|
|
222
|
+
* Options for various methods in {@link ExtensionConfig }
|
|
223
|
+
*/
|
|
224
|
+
export type ExtensionConfigMutationOpts = {
|
|
225
|
+
/**
|
|
226
|
+
* Whether or not to write the manifest to disk after a mutation operation
|
|
227
|
+
*/
|
|
228
|
+
write?: boolean | undefined;
|
|
229
|
+
};
|
|
230
|
+
/**
|
|
231
|
+
* A valid install type
|
|
232
|
+
*/
|
|
233
|
+
export type InstallType = typeof INSTALL_TYPE_NPM | typeof INSTALL_TYPE_GIT | typeof INSTALL_TYPE_LOCAL | typeof INSTALL_TYPE_GITHUB;
|
|
234
|
+
export type ExtensionListData = import('../cli/extension-command').ExtensionListData;
|
|
235
|
+
export type InstalledExtensionListData = import('../cli/extension-command').InstalledExtensionListData;
|
|
236
|
+
export const INSTALL_TYPE_NPM: "npm";
|
|
237
|
+
export const INSTALL_TYPE_GIT: "git";
|
|
238
|
+
export const INSTALL_TYPE_LOCAL: "local";
|
|
239
|
+
export const INSTALL_TYPE_GITHUB: "github";
|
|
240
|
+
/** @type {Set<InstallType>} */
|
|
241
|
+
export const INSTALL_TYPES: Set<InstallType>;
|
|
242
|
+
//# sourceMappingURL=extension-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-config.d.ts","sourceRoot":"","sources":["../../../lib/extension/extension-config.js"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH;IAqgBE;;;;;;;;;OASG;IACH,oCAkBC;IAED;;;;;;OAMG;IACH,uKAEC;IAvhBD;;;;OAIG;IACH,wBAKC;IA9BD,sBAAsB;IACtB,eADW,OAAO,CACJ;IAEd,4BAA4B;IAC5B,WADW,GAAG,OAAO,GAAG,CACd;IAEV,iCAAiC;IACjC,qBADW,UAAU,OAAO,CAAC,CACT;IAEpB,mDAAmD;IACnD,KADW,OAAO,eAAe,EAAE,YAAY,CAC3C;IAEJ,uBAAuB;IACvB,UADW,QAAQ,CACV;IAET;;OAEG;IACH,gBAFU,iBAAiB,CAEZ;IAcf,2BAEC;IAED,yBAEC;IAED;;;;;;OAMG;IACH,qBAJW,QAAQ,OAAO,CAAC,eAChB,YAAY,OAAO,CAAC,GAClB,kBAAkB,EAAE,CAQhC;IAED;;;;;;OAMG;IACH,qBAJW,QAAQ,OAAO,CAAC,eAChB,YAAY,OAAO,CAAC,GAClB,QAAQ,MAAM,EAAE,CAAC,CAS7B;IAED;;;;;;OAMG;IAEH,+BALW,YAAY,OAAO,CAAC,WACpB,QAAQ,OAAO,CAAC,GACd,QAAQ,MAAM,EAAE,CAAC,CAK7B;IAED;;;;OAIG;IACH;;;MAsCC;IAED;;;;;;;;;;OAUG;IACH,0BAHW,UAAU,OAAO,CAAC,GAChB,QAAQ,UAAU,OAAO,CAAC,CAAC,CAyDvC;IAED;;;;;OAKG;IACH,yBAFa,QAAQ,iBAAiB,CAAC,CAWtC;IAED;;;;;;;;;OASG;IACH,sCAJW,YAAY,OAAO,CAAC,WACpB,QAAQ,OAAO,CAAC,GACd,QAAQ,MAAM,EAAE,CAAC,CA2E7B;IACD;;;;;;OAMG;IACH,+BAJW,YAAY,OAAO,CAAC,WACpB,QAAQ,OAAO,CAAC,GACd,kBAAkB,EAAE,CA0ChC;IAED;;;;;OAKG;IAEH,sCALW,YAAY,OAAO,CAAC,WACpB,QAAQ,OAAO,CAAC,GACd,kBAAkB,EAAE,CA6BhC;IAED;;;;;OAKG;IAEH,+BALW,YAAY,OAAO,CAAC,WACpB,QAAQ,OAAO,CAAC,GACd,kBAAkB,EAAE,CAMhC;IAED;;;;;OAKG;IACH,sBALW,MAAM,eACN,YAAY,OAAO,CAAC,wDAElB,QAAQ,IAAI,CAAC,CAOzB;IAED;;;;;OAKG;IACH,yBALW,QAAQ,OAAO,CAAC,eAChB,YAAY,OAAO,CAAC,GAAC,OAAO,0BAA0B,EAAE,eAAe,CAAC,OAAO,CAAC,wDAE9E,QAAQ,IAAI,CAAC,CAUzB;IAED;;;;;;OAMG;IACH,yBAJW,QAAQ,OAAO,CAAC,wDAEd,QAAQ,IAAI,CAAC,CAOzB;IAED;;;OAGG;IAEH,2CAHa,IAAI,CAkBhB;IAED;;;;;;OAMG;IAEH,uBANW,QAAQ,OAAO,CAAC,eAChB,YAAY,OAAO,CAAC,GAClB,MAAM,CAMlB;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;OAIG;IACH,iBAHW,QAAQ,OAAO,CAAC,GACd,SAAS,OAAO,CAAC,CAyB7B;IAED;;;OAGG;IACH,qBAHW,MAAM,GACJ,OAAO,CAInB;IA2CD;;;;;;OAMG;IACH,6BAJW,QAAQ,OAAO,CAAC,eAChB,sBAAsB,OAAO,CAAC,GAC5B,OAAO,KAAK,EAAE,YAAY,GAAC,SAAS,CAShD;CACF;;;;;;;;;;SASa,MAAM;;;;SACN,GAAG;;;;;uCAMH,GAAG,OACJ,IAAI;4BAIJ,OAAO,eAAe,EAAE,aAAa;uBACrC,OAAO,YAAY,EAAE,QAAQ;6BAK7B,OAAO,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;uCAKrC,OAAO,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;yBAK/C,OAAO,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;0BAKjC,OAAO,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;2BAKlC,OAAO,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;4BAKnC,OAAO,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC;;;;;;;;;;;;;0BAWxC,uBAAuB,GAAG,uBAAuB,GAAG,yBAAyB,GAAG,0BAA0B;gCAI1G,OAAO,0BAA0B,EAAE,iBAAiB;yCACpD,OAAO,0BAA0B,EAAE,0BAA0B;AAppB1E,qCAA+B;AAG/B,qCAA+B;AAF/B,yCAAmC;AACnC,2CAAqC;AAGrC,+BAA+B;AAC/B,4BADW,IAAI,WAAW,CAAC,CAMxB"}
|