appium 2.0.0-beta.25 → 2.0.0-beta.26
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/build/lib/appium-config.schema.json +278 -0
- package/build/lib/appium.js +45 -66
- package/build/lib/cli/args.js +19 -39
- package/build/lib/cli/driver-command.js +5 -9
- package/build/lib/cli/extension-command.js +73 -64
- package/build/lib/cli/extension.js +10 -23
- package/build/lib/cli/parser.js +9 -19
- package/build/lib/cli/plugin-command.js +5 -9
- package/build/lib/cli/utils.js +2 -4
- package/build/lib/config-file.js +2 -4
- package/build/lib/config.js +7 -6
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logsink.js +2 -4
- package/build/lib/main.js +40 -68
- package/build/lib/schema/appium-config-schema.js +2 -4
- package/build/lib/schema/arg-spec.js +11 -14
- package/build/lib/schema/cli-args.js +2 -4
- package/build/lib/schema/cli-transformers.js +2 -4
- package/build/lib/schema/index.js +2 -4
- package/build/lib/schema/keywords.js +2 -4
- package/build/lib/schema/schema.js +55 -37
- package/build/lib/utils.js +1 -32
- package/lib/appium.js +50 -68
- package/lib/cli/args.js +19 -23
- package/lib/cli/driver-command.js +10 -2
- package/lib/cli/extension-command.js +216 -135
- package/lib/cli/extension.js +7 -15
- package/lib/cli/parser.js +6 -14
- package/lib/cli/plugin-command.js +1 -2
- package/lib/config-file.js +3 -3
- package/lib/config.js +5 -4
- package/lib/constants.js +79 -0
- package/lib/extension/driver-config.js +230 -0
- package/lib/extension/extension-config.js +459 -0
- package/lib/extension/index.js +103 -0
- package/lib/extension/manifest.js +590 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +111 -0
- package/lib/grid-register.js +4 -4
- package/lib/main.js +51 -88
- package/lib/schema/arg-spec.js +2 -2
- package/lib/schema/cli-args.js +1 -0
- package/lib/schema/keywords.js +1 -1
- package/lib/schema/schema.js +60 -28
- package/lib/utils.js +2 -32
- package/package.json +29 -21
- package/{postinstall.js → scripts/postinstall.js} +1 -1
- package/types/types.d.ts +70 -31
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/check-npm-pack-files.js +0 -23
- package/build/commands-yml/parse.js +0 -319
- package/build/commands-yml/validator.js +0 -130
- package/build/index.js +0 -19
- package/build/lib/cli/npm.js +0 -220
- package/build/lib/driver-config.js +0 -100
- package/build/lib/drivers.js +0 -100
- package/build/lib/ext-config-io.js +0 -165
- package/build/lib/extension-config.js +0 -320
- package/build/lib/plugin-config.js +0 -69
- package/build/lib/plugins.js +0 -18
- package/build/postinstall.js +0 -90
- package/build/test/cli/cli-e2e-specs.js +0 -221
- package/build/test/cli/cli-helpers.js +0 -86
- package/build/test/cli/cli-specs.js +0 -71
- package/build/test/cli/fixtures/test-driver/package.json +0 -27
- package/build/test/cli/schema-args-specs.js +0 -48
- package/build/test/cli/schema-e2e-specs.js +0 -47
- package/build/test/config-e2e-specs.js +0 -112
- package/build/test/config-file-e2e-specs.js +0 -191
- package/build/test/config-file-specs.js +0 -281
- package/build/test/config-specs.js +0 -258
- package/build/test/driver-e2e-specs.js +0 -435
- package/build/test/driver-specs.js +0 -386
- package/build/test/ext-config-io-specs.js +0 -181
- package/build/test/extension-config-specs.js +0 -365
- package/build/test/fixtures/allow-feat.txt +0 -5
- package/build/test/fixtures/caps.json +0 -3
- package/build/test/fixtures/config/allow-insecure.txt +0 -3
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
- package/build/test/fixtures/config/appium.config.bad.json +0 -32
- package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
- package/build/test/fixtures/config/appium.config.good.js +0 -40
- package/build/test/fixtures/config/appium.config.good.json +0 -33
- package/build/test/fixtures/config/appium.config.good.yaml +0 -30
- package/build/test/fixtures/config/appium.config.invalid.json +0 -31
- package/build/test/fixtures/config/appium.config.security-array.json +0 -5
- package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
- package/build/test/fixtures/config/appium.config.security-path.json +0 -5
- package/build/test/fixtures/config/driver-fake.config.json +0 -8
- package/build/test/fixtures/config/nodeconfig.json +0 -3
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +0 -35
- package/build/test/fixtures/deny-feat.txt +0 -5
- package/build/test/fixtures/driver.schema.js +0 -20
- package/build/test/fixtures/extensions.yaml +0 -27
- package/build/test/fixtures/flattened-schema.js +0 -532
- package/build/test/fixtures/plugin.schema.js +0 -20
- package/build/test/fixtures/schema-with-extensions.js +0 -28
- package/build/test/grid-register-specs.js +0 -74
- package/build/test/helpers.js +0 -75
- package/build/test/logger-specs.js +0 -76
- package/build/test/npm-specs.js +0 -20
- package/build/test/parser-specs.js +0 -319
- package/build/test/plugin-e2e-specs.js +0 -316
- package/build/test/schema/arg-spec-specs.js +0 -70
- package/build/test/schema/cli-args-specs.js +0 -408
- package/build/test/schema/schema-specs.js +0 -407
- package/build/test/utils-specs.js +0 -288
- package/lib/cli/npm.js +0 -251
- package/lib/driver-config.js +0 -101
- package/lib/drivers.js +0 -84
- package/lib/ext-config-io.js +0 -287
- package/lib/extension-config.js +0 -366
- package/lib/plugin-config.js +0 -63
- package/lib/plugins.js +0 -13
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.getExtConfigIOInstance = exports.PLUGIN_TYPE = exports.DRIVER_TYPE = void 0;
|
|
9
|
-
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
|
|
12
|
-
require("source-map-support/register");
|
|
13
|
-
|
|
14
|
-
var _support = require("@appium/support");
|
|
15
|
-
|
|
16
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
-
|
|
18
|
-
var _path = _interopRequireDefault(require("path"));
|
|
19
|
-
|
|
20
|
-
var _yaml = _interopRequireDefault(require("yaml"));
|
|
21
|
-
|
|
22
|
-
const CONFIG_FILE_NAME = 'extensions.yaml';
|
|
23
|
-
const CONFIG_SCHEMA_REV = 2;
|
|
24
|
-
const DRIVER_TYPE = 'driver';
|
|
25
|
-
exports.DRIVER_TYPE = DRIVER_TYPE;
|
|
26
|
-
const PLUGIN_TYPE = 'plugin';
|
|
27
|
-
exports.PLUGIN_TYPE = PLUGIN_TYPE;
|
|
28
|
-
const VALID_EXT_TYPES = new Set([DRIVER_TYPE, PLUGIN_TYPE]);
|
|
29
|
-
const CONFIG_DATA_DRIVER_KEY = `${DRIVER_TYPE}s`;
|
|
30
|
-
const CONFIG_DATA_PLUGIN_KEY = `${PLUGIN_TYPE}s`;
|
|
31
|
-
|
|
32
|
-
class ExtConfigIO {
|
|
33
|
-
constructor(appiumHome) {
|
|
34
|
-
(0, _defineProperty2.default)(this, "_dirty", void 0);
|
|
35
|
-
(0, _defineProperty2.default)(this, "_data", void 0);
|
|
36
|
-
(0, _defineProperty2.default)(this, "_extDataByType", new Map());
|
|
37
|
-
(0, _defineProperty2.default)(this, "_filepath", void 0);
|
|
38
|
-
(0, _defineProperty2.default)(this, "_appiumHome", void 0);
|
|
39
|
-
(0, _defineProperty2.default)(this, "_writing", null);
|
|
40
|
-
(0, _defineProperty2.default)(this, "_reading", null);
|
|
41
|
-
this._filepath = _path.default.resolve(appiumHome, CONFIG_FILE_NAME);
|
|
42
|
-
this._appiumHome = appiumHome;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
_createProxy(extensionType, data) {
|
|
46
|
-
return new Proxy(data[`${extensionType}s`], {
|
|
47
|
-
set: (target, prop, value) => {
|
|
48
|
-
if (value !== target[prop]) {
|
|
49
|
-
this._dirty = true;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
target[prop] = value;
|
|
53
|
-
return Reflect.set(target, prop, value);
|
|
54
|
-
},
|
|
55
|
-
deleteProperty: (target, prop) => {
|
|
56
|
-
if (prop in target) {
|
|
57
|
-
this._dirty = true;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return Reflect.deleteProperty(target, prop);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
get filepath() {
|
|
66
|
-
return this._filepath;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async read(extensionType) {
|
|
70
|
-
if (this._reading) {
|
|
71
|
-
await this._reading;
|
|
72
|
-
return this._extDataByType.get(extensionType);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
this._reading = (async () => {
|
|
76
|
-
if (!VALID_EXT_TYPES.has(extensionType)) {
|
|
77
|
-
throw new TypeError(`Invalid extension type: ${extensionType}. Valid values are: ${[...VALID_EXT_TYPES].join(', ')}`);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (this._extDataByType.has(extensionType)) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
let data;
|
|
85
|
-
let isNewFile = false;
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
await (0, _support.mkdirp)(this._appiumHome);
|
|
89
|
-
const yaml = await _support.fs.readFile(this.filepath, 'utf8');
|
|
90
|
-
data = _yaml.default.parse(yaml);
|
|
91
|
-
} catch (err) {
|
|
92
|
-
if (err.code === 'ENOENT') {
|
|
93
|
-
data = {
|
|
94
|
-
[CONFIG_DATA_DRIVER_KEY]: {},
|
|
95
|
-
[CONFIG_DATA_PLUGIN_KEY]: {},
|
|
96
|
-
schemaRev: CONFIG_SCHEMA_REV
|
|
97
|
-
};
|
|
98
|
-
isNewFile = true;
|
|
99
|
-
} else {
|
|
100
|
-
throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this.filepath}). Ensure it exists and is ` + `readable. Specific error: ${err.message}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this._data = data;
|
|
105
|
-
|
|
106
|
-
this._extDataByType.set(DRIVER_TYPE, this._createProxy(DRIVER_TYPE, data));
|
|
107
|
-
|
|
108
|
-
this._extDataByType.set(PLUGIN_TYPE, this._createProxy(PLUGIN_TYPE, data));
|
|
109
|
-
|
|
110
|
-
if (isNewFile) {
|
|
111
|
-
await this.write(true);
|
|
112
|
-
}
|
|
113
|
-
})();
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
await this._reading;
|
|
117
|
-
return this._extDataByType.get(extensionType);
|
|
118
|
-
} finally {
|
|
119
|
-
this._reading = null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async write(force = false) {
|
|
124
|
-
if (this._writing) {
|
|
125
|
-
return this._writing;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
this._writing = (async () => {
|
|
129
|
-
try {
|
|
130
|
-
if (!this._dirty && !force) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (!this._data) {
|
|
135
|
-
throw new ReferenceError('No data to write. Call `read()` first');
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const dataToWrite = { ...this._data,
|
|
139
|
-
[CONFIG_DATA_DRIVER_KEY]: this._extDataByType.get(DRIVER_TYPE),
|
|
140
|
-
[CONFIG_DATA_PLUGIN_KEY]: this._extDataByType.get(PLUGIN_TYPE)
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
await _support.fs.writeFile(this.filepath, _yaml.default.stringify(dataToWrite), 'utf8');
|
|
145
|
-
this._dirty = false;
|
|
146
|
-
return true;
|
|
147
|
-
} catch {
|
|
148
|
-
throw new Error(`Appium could not parse or write from the Appium Home directory ` + `(${this._appiumHome}). Please ensure it is writable.`);
|
|
149
|
-
}
|
|
150
|
-
} finally {
|
|
151
|
-
this._writing = null;
|
|
152
|
-
}
|
|
153
|
-
})();
|
|
154
|
-
|
|
155
|
-
return await this._writing;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const getExtConfigIOInstance = _lodash.default.memoize(appiumHome => new ExtConfigIO(appiumHome));
|
|
161
|
-
|
|
162
|
-
exports.getExtConfigIOInstance = getExtConfigIOInstance;require('source-map-support').install();
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHQtY29uZmlnLWlvLmpzIl0sIm5hbWVzIjpbIkNPTkZJR19GSUxFX05BTUUiLCJDT05GSUdfU0NIRU1BX1JFViIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJWQUxJRF9FWFRfVFlQRVMiLCJTZXQiLCJDT05GSUdfREFUQV9EUklWRVJfS0VZIiwiQ09ORklHX0RBVEFfUExVR0lOX0tFWSIsIkV4dENvbmZpZ0lPIiwiY29uc3RydWN0b3IiLCJhcHBpdW1Ib21lIiwiTWFwIiwiX2ZpbGVwYXRoIiwicGF0aCIsInJlc29sdmUiLCJfYXBwaXVtSG9tZSIsIl9jcmVhdGVQcm94eSIsImV4dGVuc2lvblR5cGUiLCJkYXRhIiwiUHJveHkiLCJzZXQiLCJ0YXJnZXQiLCJwcm9wIiwidmFsdWUiLCJfZGlydHkiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJmaWxlcGF0aCIsInJlYWQiLCJfcmVhZGluZyIsIl9leHREYXRhQnlUeXBlIiwiZ2V0IiwiaGFzIiwiVHlwZUVycm9yIiwiam9pbiIsImlzTmV3RmlsZSIsInlhbWwiLCJmcyIsInJlYWRGaWxlIiwiWUFNTCIsInBhcnNlIiwiZXJyIiwiY29kZSIsInNjaGVtYVJldiIsIkVycm9yIiwibWVzc2FnZSIsIl9kYXRhIiwid3JpdGUiLCJmb3JjZSIsIl93cml0aW5nIiwiUmVmZXJlbmNlRXJyb3IiLCJkYXRhVG9Xcml0ZSIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImdldEV4dENvbmZpZ0lPSW5zdGFuY2UiLCJfIiwibWVtb2l6ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQU1BOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLGlCQUF6QjtBQUtBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCO0FBRU8sTUFBTUMsV0FBVyxHQUFHLFFBQXBCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxRQUFwQjs7QUFNUCxNQUFNQyxlQUFlLEdBQUcsSUFBSUMsR0FBSixDQUFR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Y0FBTUMsV0FBVyxHQUFHLEVBQ2xCLEdBQUcsS0FBS0wsS0FEVTtBQUVsQixXQUFDeEMsc0JBQUQsR0FBMEIsS0FBS3dCLGNBQUwsQ0FBb0JDLEdBQXBCLENBQXdCN0IsV0FBeEIsQ0FGUjtBQUdsQixXQUFDSyxzQkFBRCxHQUEwQixLQUFLdUIsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBd0I1QixXQUF4QjtBQUhSLFNBQXBCOztBQU1BLFlBQUk7QUFDRixnQkFBTWtDLFlBQUdlLFNBQUgsQ0FDSixLQUFLekIsUUFERCxFQUVKWSxjQUFLYyxTQUFMLENBQWVGLFdBQWYsQ0FGSSxFQUdKLE1BSEksQ0FBTjtBQUtBLGVBQUszQixNQUFMLEdBQWMsS0FBZDtBQUNBLGlCQUFPLElBQVA7QUFDRCxTQVJELENBUUUsTUFBTTtBQUNOLGdCQUFNLElBQUlvQixLQUFKLENBQ0gsaUVBQUQsR0FDRyxJQUFHLEtBQUs3QixXQUFZLGtDQUZuQixDQUFOO0FBSUQ7QUFDRixPQTdCRCxTQTZCVTtBQUNSLGFBQUtrQyxRQUFMLEdBQWdCLElBQWhCO0FBQ0Q7QUFDRixLQWpDZSxHQUFoQjs7QUFrQ0EsV0FBTyxNQUFNLEtBQUtBLFFBQWxCO0FBQ0Q7O0FBdk9lOztBQWlQWCxNQUFNSyxzQkFBc0IsR0FBR0MsZ0JBQUVDLE9BQUYsQ0FDbkM5QyxVQUFELElBQWdCLElBQUlGLFdBQUosQ0FBZ0JFLFVBQWhCLENBRG9CLENBQS9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogTW9kdWxlIGNvbnRhaW5pbmcge0BsaW5rIEV4dENvbmZpZ0lPfSB3aGljaCBoYW5kbGVzIHJlYWRpbmcgJiB3cml0aW5nIG9mIGV4dGVuc2lvbiBjb25maWcgZmlsZXMuXG4gKi9cblxuaW1wb3J0IHsgZnMsIG1rZGlycCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRSA9ICdleHRlbnNpb25zLnlhbWwnO1xuXG4vKipcbiAqIEN1cnJlbnQgY29uZmlndXJhdGlvbiBzY2hlbWEgcmV2aXNpb24hXG4gKi9cbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuZXhwb3J0IGNvbnN0IERSSVZFUl9UWVBFID0gJ2RyaXZlcic7XG5leHBvcnQgY29uc3QgUExVR0lOX1RZUEUgPSAncGx1Z2luJztcblxuLyoqXG4gKiBTZXQgb2YgdmFsaWQgZXh0ZW5zaW9uIHR5cGVzLlxuICogQHR5cGUge1JlYWRvbmx5PFNldDxFeHRlbnNpb25UeXBlPj59XG4gKi9cbmNvbnN0IFZBTElEX0VYVF9UWVBFUyA9IG5ldyBTZXQoW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pO1xuXG5jb25zdCBDT05GSUdfREFUQV9EUklWRVJfS0VZID0gYCR7RFJJVkVSX1RZUEV9c2A7XG5jb25zdCBDT05GSUdfREFUQV9QTFVHSU5fS0VZID0gYCR7UExVR0lOX1RZUEV9c2A7XG5cbi8qKlxuICogSGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICpcbiAqIE9ubHkgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICovXG5jbGFzcyBFeHRDb25maWdJTyB7XG4gIC8qKlxuICAgKiBcIkRpcnR5XCIgZmxhZy4gSWYgdHJ1ZSwgdGhlIGRhdGEgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3Qgd3JpdGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2RpcnR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgcGFyc2VkIFlBTUwgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlLlxuICAgKiBAdHlwZSB7b2JqZWN0P31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kYXRhO1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgZXh0ZW5zaW9uIHR5cGUgdG8gY29uZmlndXJhdGlvbiBkYXRhLiBDb25maWd1cmF0aW9uIGRhdGEgaXNcbiAgICoga2V5ZWQgb24gZXh0ZW5zaW9uIG5hbWUuXG4gICAqXG4gICAqIENvbnN1bWVycyBnZXQgdGhlIHZhbHVlcyBvZiB0aGlzIGBNYXBgIChjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAgKiBgZXh0ZW5zaW9uVHlwZWAgb2YgdGhlIGNvbnN1bWVyLCB3aGljaCB3aWxsIGJlIGEgc3ViY2xhc3Mgb2ZcbiAgICogYEV4dGVuc2lvbkNvbmZpZ2ApIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIG9iamVjdC5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge01hcDxFeHRlbnNpb25UeXBlLG9iamVjdD59XG4gICAqL1xuICBfZXh0RGF0YUJ5VHlwZSA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGF0aCB0byBjb25maWcgZmlsZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBfZmlsZXBhdGg7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIF9hcHBpdW1Ib21lO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCB3cml0aW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ud3JpdGV9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGB3cml0ZSgpYCBpcyBjb21wbGV0ZSwgdGhlIGBQcm9taXNlYFxuICAgKiB3aWxsIHJlc29sdmUgYW5kIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBgbnVsbGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8Ym9vbGVhbj4/fVxuICAgKi9cbiAgX3dyaXRpbmcgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCByZWFkaW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ucmVhZH0gd2lsbCBjYXVzZSBpdCB0byBiZVxuICAgKiBzZXQgdG8gYSBgUHJvbWlzZWAuIFdoZW4gdGhlIGNhbGwgdG8gYHJlYWQoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYG51bGxgLiAgQ29uY3VycmVudCBjYWxsc1xuICAgKiBtYWRlIHdoaWxlIHRoaXMgdmFsdWUgaXMgYSBgUHJvbWlzZWAgd2lsbCByZXR1cm4gdGhlIGBQcm9taXNlYCBpdHNlbGYuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+P31cbiAgICovXG4gIF9yZWFkaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lKSB7XG4gICAgdGhpcy5fZmlsZXBhdGggPSBwYXRoLnJlc29sdmUoYXBwaXVtSG9tZSwgQ09ORklHX0ZJTEVfTkFNRSk7XG4gICAgdGhpcy5fYXBwaXVtSG9tZSA9IGFwcGl1bUhvbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYWVzIGEgYFByb3h5YCB3aGljaCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBleHRlbnNpb24tdHlwZS1zcGVjaWZpY1xuICAgKiBjb25maWcgZGF0YS5cbiAgICpcbiAgICogV2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCwgaXQgc2V0cyBhIGBfZGlydHlgIGZsYWcuICBUaGUgbmV4dCBjYWxsIHRvXG4gICAqIHtAbGluayBFeHRDb25maWdJTy53cml0ZX0gd2lsbCBjaGVjayBpZiB0aGlzIGZsYWcgaXMgYHRydWVgIGJlZm9yZVxuICAgKiBwcm9jZWVkaW5nLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLG9iamVjdD59IGRhdGEgLSBFeHRlbnNpb24gY29uZmlnIGRhdGEsIGtleWVkIGJ5IG5hbWVcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsb2JqZWN0Pn1cbiAgICovXG4gIF9jcmVhdGVQcm94eSAoZXh0ZW5zaW9uVHlwZSwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZGF0YVtgJHtleHRlbnNpb25UeXBlfXNgXSwge1xuICAgICAgc2V0OiAodGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZS5cbiAgICovXG4gIGdldCBmaWxlcGF0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZGF0YSBmb3IgYW4gZXh0ZW5zaW9uIHR5cGUuICBSZWFkcyB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBGb3JjZS1yZWFkaW5nIGlzIF9ub3RfIHN1cHBvcnRlZCwgYXMgaXQncyBsaWtlbHkgdG8gYmUgYSBzb3VyY2Ugb2ZcbiAgICogYnVncy0taXQncyBlYXN5IHRvIG11dGF0ZSB0aGUgZGF0YSBhbmQgdGhlbiBvdmVyd3JpdGUgbWVtb3J5IHdpdGggdGhlIGZpbGVcbiAgICogY29udGVudHNcbiAgICpcbiAgICogSWRlYWxseSB0aGlzIHdpbGwgb25seSBldmVyIHJlYWQgdGhlIGZpbGUgX29uY2VfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBXaGljaCBiaXQgb2YgdGhlIGNvbmZpZyBkYXRhIHdlXG4gICAqIHdhbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIGRhdGFcbiAgICovXG4gIGFzeW5jIHJlYWQgKGV4dGVuc2lvblR5cGUpIHtcbiAgICBpZiAodGhpcy5fcmVhZGluZykge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZGluZztcbiAgICAgIHJldHVybiB0aGlzLl9leHREYXRhQnlUeXBlLmdldChleHRlbnNpb25UeXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWFkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghVkFMSURfRVhUX1RZUEVTLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGV4dGVuc2lvbiB0eXBlOiAke2V4dGVuc2lvblR5cGV9LiBWYWxpZCB2YWx1ZXMgYXJlOiAke1tcbiAgICAgICAgICAgIC4uLlZBTElEX0VYVF9UWVBFUyxcbiAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9leHREYXRhQnlUeXBlLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IGlzTmV3RmlsZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbWtkaXJwKHRoaXMuX2FwcGl1bUhvbWUpO1xuICAgICAgICBjb25zdCB5YW1sID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5maWxlcGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgZGF0YSA9IFlBTUwucGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHt9LFxuICAgICAgICAgICAgW0NPTkZJR19EQVRBX1BMVUdJTl9LRVldOiB7fSxcbiAgICAgICAgICAgIHNjaGVtYVJldjogQ09ORklHX1NDSEVNQV9SRVYsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpc05ld0ZpbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gaGFkIHRyb3VibGUgbG9hZGluZyB0aGUgZXh0ZW5zaW9uIGluc3RhbGxhdGlvbiBgICtcbiAgICAgICAgICAgICAgYGNhY2hlIGZpbGUgKCR7dGhpcy5maWxlcGF0aH0pLiBFbnN1cmUgaXQgZXhpc3RzIGFuZCBpcyBgICtcbiAgICAgICAgICAgICAgYHJlYWRhYmxlLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgRFJJVkVSX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KERSSVZFUl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KFBMVUdJTl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc05ld0ZpbGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkaW5nO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KGV4dGVuc2lvblR5cGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWFkaW5nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBkYXRhIGlmIGl0IG5lZWRzIHdyaXRpbmcuXG4gICAqXG4gICAqIElmIHRoZSBgc2NoZW1hUmV2YCBwcm9wIG5lZWRzIHVwZGF0aW5nLCB0aGUgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYSB3cml0ZSBldmVuIGlmIHRoZSBkYXRhIGlzIGNsZWFuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBkYXRhIHdhcyB3cml0dGVuXG4gICAqL1xuICBhc3luYyB3cml0ZSAoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGluZztcbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuX2RpcnR5ICYmICFmb3JjZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTm8gZGF0YSB0byB3cml0ZS4gQ2FsbCBgcmVhZCgpYCBmaXJzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVRvV3JpdGUgPSB7XG4gICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KERSSVZFUl9UWVBFKSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfUExVR0lOX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KFBMVUdJTl9UWVBFKSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICAgIHRoaXMuZmlsZXBhdGgsXG4gICAgICAgICAgICBZQU1MLnN0cmluZ2lmeShkYXRhVG9Xcml0ZSksXG4gICAgICAgICAgICAndXRmOCcsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCBwYXJzZSBvciB3cml0ZSBmcm9tIHRoZSBBcHBpdW0gSG9tZSBkaXJlY3RvcnkgYCArXG4gICAgICAgICAgICAgIGAoJHt0aGlzLl9hcHBpdW1Ib21lfSkuIFBsZWFzZSBlbnN1cmUgaXQgaXMgd3JpdGFibGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl93cml0aW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl93cml0aW5nO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEV4dENvbmZpZ0lPfS5cbiAqXG4gKiBNYWludGFpbnMgb25lIGluc3RhbmNlIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBgQVBQSVVNX0hPTUVgXG4gKiBAcmV0dXJucyB7RXh0Q29uZmlnSU99XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHRDb25maWdJT0luc3RhbmNlID0gXy5tZW1vaXplKFxuICAoYXBwaXVtSG9tZSkgPT4gbmV3IEV4dENvbmZpZ0lPKGFwcGl1bUhvbWUpLFxuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXh0Q29uZmlnSU99IEV4dGVuc2lvbkNvbmZpZ0lPXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7dHlwZW9mIERSSVZFUl9UWVBFIHwgdHlwZW9mIFBMVUdJTl9UWVBFfSBFeHRlbnNpb25UeXBlXG4gKi9cbiJdLCJmaWxlIjoibGliL2V4dC1jb25maWctaW8uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.DEFAULT_APPIUM_HOME = exports.APPIUM_HOME = void 0;
|
|
9
|
-
Object.defineProperty(exports, "DRIVER_TYPE", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function () {
|
|
12
|
-
return _extConfigIo.DRIVER_TYPE;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = void 0;
|
|
16
|
-
Object.defineProperty(exports, "PLUGIN_TYPE", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function () {
|
|
19
|
-
return _extConfigIo.PLUGIN_TYPE;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
exports.default = void 0;
|
|
23
|
-
|
|
24
|
-
require("source-map-support/register");
|
|
25
|
-
|
|
26
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
27
|
-
|
|
28
|
-
var _os = _interopRequireDefault(require("os"));
|
|
29
|
-
|
|
30
|
-
var _path = _interopRequireDefault(require("path"));
|
|
31
|
-
|
|
32
|
-
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
33
|
-
|
|
34
|
-
var _extConfigIo = require("./ext-config-io");
|
|
35
|
-
|
|
36
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
37
|
-
|
|
38
|
-
var _schema = require("./schema/schema");
|
|
39
|
-
|
|
40
|
-
const DEFAULT_APPIUM_HOME = _path.default.resolve(_os.default.homedir(), '.appium');
|
|
41
|
-
|
|
42
|
-
exports.DEFAULT_APPIUM_HOME = DEFAULT_APPIUM_HOME;
|
|
43
|
-
const APPIUM_HOME = process.env.APPIUM_HOME || DEFAULT_APPIUM_HOME;
|
|
44
|
-
exports.APPIUM_HOME = APPIUM_HOME;
|
|
45
|
-
const INSTALL_TYPE_NPM = 'npm';
|
|
46
|
-
exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
|
|
47
|
-
const INSTALL_TYPE_LOCAL = 'local';
|
|
48
|
-
exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
|
|
49
|
-
const INSTALL_TYPE_GITHUB = 'github';
|
|
50
|
-
exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
|
|
51
|
-
const INSTALL_TYPE_GIT = 'git';
|
|
52
|
-
exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
|
|
53
|
-
const INSTALL_TYPES = [INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM];
|
|
54
|
-
exports.INSTALL_TYPES = INSTALL_TYPES;
|
|
55
|
-
|
|
56
|
-
class ExtensionConfig {
|
|
57
|
-
constructor(appiumHome, extensionType, logFn) {
|
|
58
|
-
const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
|
|
59
|
-
this.appiumHome = appiumHome;
|
|
60
|
-
this.installedExtensions = {};
|
|
61
|
-
this.io = (0, _extConfigIo.getExtConfigIOInstance)(appiumHome);
|
|
62
|
-
this.extensionType = extensionType;
|
|
63
|
-
this.configKey = `${extensionType}s`;
|
|
64
|
-
this.log = logger;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
validate(exts) {
|
|
68
|
-
const foundProblems = {};
|
|
69
|
-
|
|
70
|
-
for (const [extName, extData] of _lodash.default.toPairs(exts)) {
|
|
71
|
-
foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData, extName), ...this.getSchemaProblems(extData, extName)];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const problemSummaries = [];
|
|
75
|
-
|
|
76
|
-
for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
|
|
77
|
-
if (_lodash.default.isEmpty(problems)) {
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
delete exts[extName];
|
|
82
|
-
problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
|
|
83
|
-
|
|
84
|
-
for (const problem of problems) {
|
|
85
|
-
problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (!_lodash.default.isEmpty(problemSummaries)) {
|
|
90
|
-
this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.io.filepath}):`);
|
|
91
|
-
|
|
92
|
-
for (const summary of problemSummaries) {
|
|
93
|
-
this.log(summary);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return exts;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
getSchemaProblems(extData, extName) {
|
|
101
|
-
const problems = [];
|
|
102
|
-
const {
|
|
103
|
-
schema: argSchemaPath
|
|
104
|
-
} = extData;
|
|
105
|
-
|
|
106
|
-
if (argSchemaPath) {
|
|
107
|
-
if (_lodash.default.isString(argSchemaPath)) {
|
|
108
|
-
if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
|
|
109
|
-
try {
|
|
110
|
-
this.readExtensionSchema(extName, extData);
|
|
111
|
-
} catch (err) {
|
|
112
|
-
problems.push({
|
|
113
|
-
err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
|
|
114
|
-
val: argSchemaPath
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
} else {
|
|
118
|
-
problems.push({
|
|
119
|
-
err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
|
|
120
|
-
val: argSchemaPath
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
} else if (_lodash.default.isPlainObject(argSchemaPath)) {
|
|
124
|
-
try {
|
|
125
|
-
this.readExtensionSchema(extName, extData);
|
|
126
|
-
} catch (err) {
|
|
127
|
-
problems.push({
|
|
128
|
-
err: `Unable to register embedded schema; ${err.message}`,
|
|
129
|
-
val: argSchemaPath
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
problems.push({
|
|
134
|
-
err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
|
|
135
|
-
val: argSchemaPath
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return problems;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
getGenericConfigProblems(extData, extName) {
|
|
144
|
-
const {
|
|
145
|
-
version,
|
|
146
|
-
pkgName,
|
|
147
|
-
installSpec,
|
|
148
|
-
installType,
|
|
149
|
-
installPath,
|
|
150
|
-
mainClass
|
|
151
|
-
} = extData;
|
|
152
|
-
const problems = [];
|
|
153
|
-
|
|
154
|
-
if (!_lodash.default.isString(version)) {
|
|
155
|
-
problems.push({
|
|
156
|
-
err: 'Missing or incorrect version',
|
|
157
|
-
val: version
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (!_lodash.default.isString(pkgName)) {
|
|
162
|
-
problems.push({
|
|
163
|
-
err: 'Missing or incorrect NPM package name',
|
|
164
|
-
val: pkgName
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (!_lodash.default.isString(installSpec)) {
|
|
169
|
-
problems.push({
|
|
170
|
-
err: 'Missing or incorrect installation spec',
|
|
171
|
-
val: installSpec
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (!_lodash.default.includes(INSTALL_TYPES, installType)) {
|
|
176
|
-
problems.push({
|
|
177
|
-
err: 'Missing or incorrect install type',
|
|
178
|
-
val: installType
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (!_lodash.default.isString(installPath)) {
|
|
183
|
-
problems.push({
|
|
184
|
-
err: 'Missing or incorrect installation path',
|
|
185
|
-
val: installPath
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (!_lodash.default.isString(mainClass)) {
|
|
190
|
-
problems.push({
|
|
191
|
-
err: 'Missing or incorrect driver class name',
|
|
192
|
-
val: mainClass
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return problems;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
getConfigProblems(extData, extName) {
|
|
200
|
-
return [];
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
async read() {
|
|
204
|
-
const extensions = await this.io.read(this.extensionType);
|
|
205
|
-
this.installedExtensions = this.validate(extensions);
|
|
206
|
-
return this.installedExtensions;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
async write() {
|
|
210
|
-
return await this.io.write();
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
async addExtension(extName, extData) {
|
|
214
|
-
this.installedExtensions[extName] = extData;
|
|
215
|
-
await this.write();
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
async updateExtension(extName, extData) {
|
|
219
|
-
this.installedExtensions[extName] = { ...this.installedExtensions[extName],
|
|
220
|
-
...extData
|
|
221
|
-
};
|
|
222
|
-
await this.write();
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
async removeExtension(extName) {
|
|
226
|
-
delete this.installedExtensions[extName];
|
|
227
|
-
await this.write();
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
print() {
|
|
231
|
-
const extNames = Object.keys(this.installedExtensions);
|
|
232
|
-
|
|
233
|
-
if (_lodash.default.isEmpty(extNames)) {
|
|
234
|
-
_logger.default.info(`No ${this.configKey} have been installed. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
|
|
235
|
-
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
_logger.default.info(`Available ${this.configKey}:`);
|
|
240
|
-
|
|
241
|
-
for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
|
|
242
|
-
_logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
extensionDesc(extName, extData) {
|
|
247
|
-
throw new Error('This must be implemented in a subclass');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
getExtensionRequirePath(extName) {
|
|
251
|
-
const {
|
|
252
|
-
pkgName,
|
|
253
|
-
installPath
|
|
254
|
-
} = this.installedExtensions[extName];
|
|
255
|
-
return _path.default.resolve(this.appiumHome, installPath, 'node_modules', pkgName);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
getInstallPath(extName) {
|
|
259
|
-
const {
|
|
260
|
-
installPath
|
|
261
|
-
} = this.installedExtensions[extName];
|
|
262
|
-
return _path.default.resolve(this.appiumHome, installPath);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
require(extName) {
|
|
266
|
-
const {
|
|
267
|
-
mainClass
|
|
268
|
-
} = this.installedExtensions[extName];
|
|
269
|
-
const reqPath = this.getExtensionRequirePath(extName);
|
|
270
|
-
|
|
271
|
-
const reqResolved = require.resolve(reqPath);
|
|
272
|
-
|
|
273
|
-
if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
|
|
274
|
-
_logger.default.debug(`Removing ${reqResolved} from require cache`);
|
|
275
|
-
|
|
276
|
-
delete require.cache[reqResolved];
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
return require(reqPath)[mainClass];
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
isInstalled(extName) {
|
|
283
|
-
return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
static _readExtensionSchema(appiumHome, extType, extName, extData) {
|
|
287
|
-
const {
|
|
288
|
-
installPath,
|
|
289
|
-
pkgName,
|
|
290
|
-
schema: argSchemaPath
|
|
291
|
-
} = extData;
|
|
292
|
-
|
|
293
|
-
if (!argSchemaPath) {
|
|
294
|
-
throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
let moduleObject;
|
|
298
|
-
|
|
299
|
-
if (_lodash.default.isString(argSchemaPath)) {
|
|
300
|
-
const schemaPath = (0, _resolveFrom.default)(_path.default.resolve(appiumHome, installPath), _path.default.normalize(`${pkgName}/${argSchemaPath}`));
|
|
301
|
-
moduleObject = require(schemaPath);
|
|
302
|
-
} else {
|
|
303
|
-
moduleObject = argSchemaPath;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
|
|
307
|
-
(0, _schema.registerSchema)(extType, extName, schema);
|
|
308
|
-
return schema;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
readExtensionSchema(extName, extData) {
|
|
312
|
-
return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
exports.default = ExtensionConfig;require('source-map-support').install();
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHRlbnNpb24tY29uZmlnLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwiaG9tZWRpciIsIkFQUElVTV9IT01FIiwicHJvY2VzcyIsImVudiIsIklOU1RBTExfVFlQRV9OUE0iLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRVMiLCJFeHRlbnNpb25Db25maWciLCJjb25zdHJ1Y3RvciIsImFwcGl1bUhvbWUiLCJleHRlbnNpb25UeXBlIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImxvZyIsImVycm9yIiwiYmluZCIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJpbyIsImNvbmZpZ0tleSIsInZhbGlkYXRlIiwiZXh0cyIsImZvdW5kUHJvYmxlbXMiLCJleHROYW1lIiwiZXh0RGF0YSIsInRvUGFpcnMiLCJnZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMiLCJnZXRDb25maWdQcm9ibGVtcyIsImdldFNjaGVtYVByb2JsZW1zIiwicHJvYmxlbVN1bW1hcmllcyIsInByb2JsZW1zIiwiaXNFbXB0eSIsInB1c2giLCJwcm9ibGVtIiwiZXJyIiwiSlNPTiIsInN0cmluZ2lmeSIsInZhbCIsImZpbGVwYXRoIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJpc1N0cmluZyIsInJlYWRFeHRlbnNpb25TY2hlbWEiLCJtZXNzYWdlIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsImpvaW4iLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsInBrZ05hbWUiLCJpbnN0YWxsU3BlYyIsImluc3RhbGxUeXBlIiwiaW5zdGFsbFBhdGgiLCJtYWluQ2xhc3MiLCJpbmNsdWRlcyIsInJlYWQiLCJleHRlbnNpb25zIiwid3JpdGUiLCJhZGRFeHRlbnNpb24iLCJ1cGRhdGVFeHRlbnNpb24iLCJyZW1vdmVFeHRlbnNpb24iLCJwcmludCIsImV4dE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCIsImdldEluc3RhbGxQYXRoIiwicmVxdWlyZSIsInJlcVBhdGgiLCJyZXFSZXNvbHZlZCIsIkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyIsImNhY2hlIiwiZGVidWciLCJpc0luc3RhbGxlZCIsIl9yZWFkRXh0ZW5zaW9uU2NoZW1hIiwiZXh0VHlwZSIsIlR5cGVFcnJvciIsIm1vZHVsZU9iamVjdCIsInNjaGVtYVBhdGgiLCJub3JtYWxpemUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLG1CQUFtQixHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFlBQUdDLE9BQUgsRUFBYixFQUEyQixTQUEzQixDQUE1Qjs7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsV0FBWixJQUEyQkwsbUJBQS9DOztBQUVBLE1BQU1RLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLE9BQTNCOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLFFBQTVCOztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQkQsZ0JBRG9CLEVBRXBCRCxtQkFGb0IsRUFHcEJELGtCQUhvQixFQUlwQkQsZ0JBSm9CLENBQXRCOzs7QUFPZSxNQUFNSyxlQUFOLENBQXNCO0FBT25DQyxFQUFBQSxXQUFXLENBQUVDLFVBQUYsRUFBY0MsYUFBZCxFQUE2QkMsS0FBN0IsRUFBb0M7QUFDN0MsVUFBTUMsTUFBTSxHQUFHQyxnQkFBRUMsVUFBRixDQUFhSCxLQUFiLElBQXNCQSxLQUF0QixHQUE4Qkks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RCxLQVBELE1BT087QUFDTEQsTUFBQUEsWUFBWSxHQUFHdkMsYUFBZjtBQUNEOztBQUVELFVBQU1ELE1BQU0sR0FBR3dDLFlBQVksQ0FBQ0csVUFBYixHQUNYSCxZQUFZLENBQUNJLE9BREYsR0FFWEosWUFGSjtBQUdBLGdDQUFlRixPQUFmLEVBQXdCdkQsT0FBeEIsRUFBaUNpQixNQUFqQztBQUNBLFdBQU9BLE1BQVA7QUFDRDs7QUFTREcsRUFBQUEsbUJBQW1CLENBQUVwQixPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDckMsV0FBT2xCLGVBQWUsQ0FBQ3VFLG9CQUFoQixDQUFxQyxLQUFLckUsVUFBMUMsRUFBc0QsS0FBS0MsYUFBM0QsRUFBMEVjLE9BQTFFLEVBQW1GQyxPQUFuRixDQUFQO0FBQ0Q7O0FBelRrQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlc29sdmVGcm9tIGZyb20gJ3Jlc29sdmUtZnJvbSc7XG5pbXBvcnQgeyBnZXRFeHRDb25maWdJT0luc3RhbmNlIH0gZnJvbSAnLi9leHQtY29uZmlnLWlvJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUywgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiwgcmVnaXN0ZXJTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBERUZBVUxUX0FQUElVTV9IT01FID0gcGF0aC5yZXNvbHZlKG9zLmhvbWVkaXIoKSwgJy5hcHBpdW0nKTtcbmNvbnN0IEFQUElVTV9IT01FID0gcHJvY2Vzcy5lbnYuQVBQSVVNX0hPTUUgfHwgREVGQVVMVF9BUFBJVU1fSE9NRTtcblxuY29uc3QgSU5TVEFMTF9UWVBFX05QTSA9ICducG0nO1xuY29uc3QgSU5TVEFMTF9UWVBFX0xPQ0FMID0gJ2xvY2FsJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVRIVUIgPSAnZ2l0aHViJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVQgPSAnZ2l0JztcbmNvbnN0IElOU1RBTExfVFlQRVMgPSBbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYFxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGV4dGVuc2lvblR5cGUsIGxvZ0ZuKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gXy5pc0Z1bmN0aW9uKGxvZ0ZuKSA/IGxvZ0ZuIDogbG9nLmVycm9yLmJpbmQobG9nKTtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLmFwcGl1bUhvbWUgPSBhcHBpdW1Ib21lO1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxvYmplY3Q+fSAqL1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHt9O1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25Db25maWdJT30gKi9cbiAgICB0aGlzLmlvID0gZ2V0RXh0Q29uZmlnSU9JbnN0YW5jZShhcHBpdW1Ib21lKTtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvblR5cGV9ICovXG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICAvKiogQHR5cGUgeydkcml2ZXJzJ3wncGx1Z2lucyd9ICovXG4gICAgdGhpcy5jb25maWdLZXkgPSBgJHtleHRlbnNpb25UeXBlfXNgOyAvLyB0b2RvIHVzZSB0ZW1wbGF0ZSB0eXBlXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSk9PnZvaWR9XG4gICAgICovXG4gICAgdGhpcy5sb2cgPSBsb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGV4dGVuc2lvbnMgZm9yIHByb2JsZW1zXG4gICAqIEB0ZW1wbGF0ZSBFeHREYXRhXG4gICAqIEBwYXJhbSB7RXh0RGF0YVtdfSBleHRzIC0gQXJyYXkgb2YgZXh0RGF0YSBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtFeHREYXRhW119XG4gICAqL1xuICB2YWxpZGF0ZSAoZXh0cykge1xuICAgIGNvbnN0IGZvdW5kUHJvYmxlbXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGZvdW5kUHJvYmxlbXNbZXh0TmFtZV0gPSBbXG4gICAgICAgIC4uLnRoaXMuZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldFNjaGVtYVByb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2JsZW1TdW1tYXJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBwcm9ibGVtc10gb2YgXy50b1BhaXJzKGZvdW5kUHJvYmxlbXMpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHByb2JsZW1zKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGlzIGV4dGVuc2lvbiBmcm9tIHRoZSBsaXN0IHNpbmNlIGl0J3Mgbm90IHZhbGlkXG4gICAgICBkZWxldGUgZXh0c1tleHROYW1lXTtcbiAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShwcm9ibGVtU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICAgICAgIGB0aGUgJHt0aGlzLmNvbmZpZ0tleX0gZXh0ZW5zaW9uIGZpbGUgKCR7dGhpcy5pby5maWxlcGF0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHByb2JsZW1TdW1tYXJpZXMpIHtcbiAgICAgICAgdGhpcy5sb2coc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge1Byb2JsZW1bXX1cbiAgICovXG4gIGdldFNjaGVtYVByb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKGFyZ1NjaGVtYVBhdGgpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe2VycjogYFVuYWJsZSB0byByZWdpc3RlciBzY2hlbWEgYXQgcGF0aCAke2FyZ1NjaGVtYVBhdGh9OyAke2Vyci5tZXNzYWdlfWAsIHZhbDogYXJnU2NoZW1hUGF0aH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGVycjogYFNjaGVtYSBmaWxlIGhhcyB1bnN1cHBvcnRlZCBleHRlbnNpb24uIEFsbG93ZWQ6ICR7Wy4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlNdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIGVtYmVkZGVkIHNjaGVtYTsgJHtlcnIubWVzc2FnZX1gLCB2YWw6IGFyZ1NjaGVtYVBhdGh9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHNjaGVtYSBmaWVsZDsgbXVzdCBiZSBhIHBhdGggdG8gYSBzY2hlbWEgZmlsZSBvciBhIHNjaGVtYSBvYmplY3QuJyxcbiAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldEdlbmVyaWNDb25maWdQcm9ibGVtcyAoZXh0RGF0YSwgZXh0TmFtZSkge1xuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lLCBpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIGluc3RhbGxQYXRoLCBtYWluQ2xhc3N9ID0gZXh0RGF0YTtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCB2ZXJzaW9uJywgdmFsOiB2ZXJzaW9ufSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJywgdmFsOiBwa2dOYW1lfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbGF0aW9uIHNwZWMnLCB2YWw6IGluc3RhbGxTcGVjfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmluY2x1ZGVzKElOU1RBTExfVFlQRVMsIGluc3RhbGxUeXBlKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJywgdmFsOiBpbnN0YWxsVHlwZX0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsUGF0aCkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBwYXRoJywgdmFsOiBpbnN0YWxsUGF0aH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBkcml2ZXIgY2xhc3MgbmFtZScsIHZhbDogbWFpbkNsYXNzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnM+fVxuICAgKi9cbiAgYXN5bmMgcmVhZCAoKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGF3YWl0IHRoaXMuaW8ucmVhZCh0aGlzLmV4dGVuc2lvblR5cGUpO1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHRoaXMudmFsaWRhdGUoZXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIHdyaXRlICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pby53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0gZXh0RGF0YTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSB7XG4gICAgICAuLi50aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0sXG4gICAgICAuLi5leHREYXRhLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRXh0ZW5zaW9uIChleHROYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICBwcmludCAoKSB7XG4gICAgY29uc3QgZXh0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkoZXh0TmFtZXMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJHt0aGlzLmNvbmZpZ0tleX0gaGF2ZSBiZWVuIGluc3RhbGxlZC4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSAke3RoaXMuY29uZmlnS2V5fTpgKTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHREYXRhKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBleHRlbnNpb25EZXNjIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHtwa2dOYW1lLCBpbnN0YWxsUGF0aH0gPSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmFwcGl1bUhvbWUsIGluc3RhbGxQYXRoLCAnbm9kZV9tb2R1bGVzJywgcGtnTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldEluc3RhbGxQYXRoIChleHROYW1lKSB7XG4gICAgY29uc3Qge2luc3RhbGxQYXRofSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGV4dGVuc2lvbiBhbmQgcmV0dXJucyBpdHMgbWFpbiBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5DbGFzczx1bmtub3duPn1cbiAgICovXG4gIHJlcXVpcmUgKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7bWFpbkNsYXNzfSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBjb25zdCByZXFQYXRoID0gdGhpcy5nZXRFeHRlbnNpb25SZXF1aXJlUGF0aChleHROYW1lKTtcbiAgICBjb25zdCByZXFSZXNvbHZlZCA9IHJlcXVpcmUucmVzb2x2ZShyZXFQYXRoKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWlyZShyZXFQYXRoKVttYWluQ2xhc3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNJbnN0YWxsZWQgKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gXy5pbmNsdWRlcyhPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpLCBleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBtZXRob2RzIG9mIHN1YmNsYXNzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZSAodW5pcXVlIHRvIGl0cyB0eXBlKVxuICAgKiBAcGFyYW0ge0V4dERhdGF9IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7aW5zdGFsbFBhdGgsIHBrZ05hbWUsIHNjaGVtYTogYXJnU2NoZW1hUGF0aH0gPSBleHREYXRhO1xuICAgIGlmICghYXJnU2NoZW1hUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYE5vIFxcYHNjaGVtYVxcYCBwcm9wZXJ0eSBmb3VuZCBpbiBjb25maWcgZm9yICR7ZXh0VHlwZX0gJHtwa2dOYW1lfSAtLSB3aHkgaXMgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQ/YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBtb2R1bGVPYmplY3Q7XG4gICAgaWYgKF8uaXNTdHJpbmcoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSByZXNvbHZlRnJvbShcbiAgICAgICAgcGF0aC5yZXNvbHZlKGFwcGl1bUhvbWUsIGluc3RhbGxQYXRoKSxcbiAgICAgICAgLy8gdGhpcyBwYXRoIHNlcCBpcyBmaW5lIGJlY2F1c2UgYHJlc29sdmVGcm9tYCB1c2VzIE5vZGUncyBtb2R1bGUgcmVzb2x1dGlvblxuICAgICAgICBwYXRoLm5vcm1hbGl6ZShgJHtwa2dOYW1lfS8ke2FyZ1NjaGVtYVBhdGh9YCksXG4gICAgICApO1xuICAgICAgbW9kdWxlT2JqZWN0ID0gcmVxdWlyZShzY2hlbWFQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kdWxlT2JqZWN0ID0gYXJnU2NoZW1hUGF0aDtcbiAgICB9XG4gICAgLy8gdGhpcyBzdWNrcy4gZGVmYXVsdCBleHBvcnRzIHNob3VsZCBiZSBkZXN0cm95ZWRcbiAgICBjb25zdCBzY2hlbWEgPSBtb2R1bGVPYmplY3QuX19lc01vZHVsZVxuICAgICAgPyBtb2R1bGVPYmplY3QuZGVmYXVsdFxuICAgICAgOiBtb2R1bGVPYmplY3Q7XG4gICAgcmVnaXN0ZXJTY2hlbWEoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGFuIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNjaGVtYSwgdGhpcyB3aWxsIGxvYWQgdGhlIHNjaGVtYSBhbmQgYXR0ZW1wdCB0b1xuICAgKiByZWdpc3RlciBpdCB3aXRoIHRoZSBzY2hlbWEgcmVnaXN0cmFyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0RGF0YX0gZXh0RGF0YSAtIEV4dGVuc2lvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICByZWFkRXh0ZW5zaW9uU2NoZW1hIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbkNvbmZpZy5fcmVhZEV4dGVuc2lvblNjaGVtYSh0aGlzLmFwcGl1bUhvbWUsIHRoaXMuZXh0ZW5zaW9uVHlwZSwgZXh0TmFtZSwgZXh0RGF0YSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi9leHQtY29uZmlnLWlvJztcbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUywgREVGQVVMVF9BUFBJVU1fSE9NRSwgQVBQSVVNX0hPTUVcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQWxpYXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEV4dGVuc2lvbiBkYXRhIChwdWxsZWQgZnJvbSBjb25maWcgWUFNTClcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dERhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfGltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fSBbc2NoZW1hXSAtIE9wdGlvbmFsIHNjaGVtYSBwYXRoIGlmIHRoZSBleHQgZGVmaW5lZCBpdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsUGF0aCAtIEFjdHVhbGx5IGxvb2tzIG1vcmUgbGlrZSBhIG1vZHVsZSBpZGVudGlmaWVyPyBSZXNvbHZlZCBmcm9tIGBBUFBJVU1fSE9NRWBcbiAqL1xuXG4iXSwiZmlsZSI6ImxpYi9leHRlbnNpb24tY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.default = void 0;
|
|
9
|
-
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
|
|
12
|
-
require("source-map-support/register");
|
|
13
|
-
|
|
14
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
-
|
|
16
|
-
var _extensionConfig = _interopRequireDefault(require("./extension-config"));
|
|
17
|
-
|
|
18
|
-
var _extConfigIo = require("./ext-config-io");
|
|
19
|
-
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
|
-
|
|
22
|
-
class PluginConfig extends _extensionConfig.default {
|
|
23
|
-
constructor(appiumHome, logFn) {
|
|
24
|
-
super(appiumHome, _extConfigIo.PLUGIN_TYPE, logFn);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
static getInstance(appiumHome, logFn) {
|
|
28
|
-
var _PluginConfig$_instan;
|
|
29
|
-
|
|
30
|
-
const instance = (_PluginConfig$_instan = PluginConfig._instances[appiumHome]) !== null && _PluginConfig$_instan !== void 0 ? _PluginConfig$_instan : new PluginConfig(appiumHome, logFn);
|
|
31
|
-
PluginConfig._instances[appiumHome] = instance;
|
|
32
|
-
return instance;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
extensionDesc(pluginName, {
|
|
36
|
-
version
|
|
37
|
-
}) {
|
|
38
|
-
return `${pluginName}@${version}`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
print(activeNames) {
|
|
42
|
-
const pluginNames = Object.keys(this.installedExtensions);
|
|
43
|
-
|
|
44
|
-
if (_lodash.default.isEmpty(pluginNames)) {
|
|
45
|
-
_logger.default.info(`No plugins have been installed. Use the "appium plugin" ` + 'command to install the one(s) you want to use.');
|
|
46
|
-
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
_logger.default.info(`Available plugins:`);
|
|
51
|
-
|
|
52
|
-
for (const [pluginName, pluginData] of _lodash.default.toPairs(this.installedExtensions)) {
|
|
53
|
-
const activeTxt = _lodash.default.includes(activeNames, pluginName) ? ' (ACTIVE)' : '';
|
|
54
|
-
|
|
55
|
-
_logger.default.info(` - ${this.extensionDesc(pluginName, pluginData)}${activeTxt}`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (_lodash.default.isEmpty(activeNames)) {
|
|
59
|
-
_logger.default.info('No plugins activated. Use the --use-plugins flag with names of plugins to activate');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
exports.default = PluginConfig;
|
|
66
|
-
(0, _defineProperty2.default)(PluginConfig, "_instances", {});require('source-map-support').install();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiX2luc3RhbmNlcyIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVlLE1BQU1BLFlBQU4sU0FBMkJDLHdCQUEzQixDQUEyQztBQWtCeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFkLEVBQXFCO0FBQzlCLFVBQU1ELFVBQU4sRUFBa0JFLHdCQUFsQixFQUErQkQsS0FBL0I7QUFDRDs7QUFRaUIsU0FBWEUsV0FBVyxDQUFFSCxVQUFGLEVBQWNDLEtBQWQsRUFBcUI7QUFBQTs7QUFDckMsVUFBTUcsUUFBUSw0QkFBR1AsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixDQUFILHlFQUEwQyxJQUFJSCxZQUFKLENBQWlCRyxVQUFqQixFQUE2QkMsS0FBN0IsQ0FBeEQ7QUFDQUosSUFBQUEsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixJQUFzQ0ksUUFBdEM7QUFDQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBRURFLEVBQUFBLGFBQWEsQ0FBRUMsVUFBRixFQUFjO0FBQUNDLElBQUFBO0FBQUQsR0FBZCxFQUF5QjtBQUNwQyxXQUFRLEdBQUVELFVBQVcsSUFBR0MsT0FBUSxFQUFoQztBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUVDLFdBQUYsRUFBZTtBQUNsQixVQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtDLG1CQUFqQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVTCxXQUFWLENBQUosRUFBNEI7QUFDMUJNLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDWCxVQUFELEVBQWFZLFVBQWIsQ0FBWCxJQUF1Q0osZ0JBQUVLLE9BQUYsQ0FBVSxLQUFLTixtQkFBZixDQUF2QyxFQUE0RTtBQUMxRSxZQUFNTyxTQUFTLEdBQUdOLGdCQUFFTyxRQUFGLENBQVdaLFdBQVgsRUFBd0JILFVBQXhCLElBQXNDLFdBQXRDLEdBQW9ELEVBQXRFOztBQUNBVSxzQkFBSUMsSUFBSixDQUFVLE9BQU0sS0FBS1osYUFBTCxDQUFtQkMsVUFBbkIsRUFBK0JZLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVTixXQUFWLENBQUosRUFBNEI7QUFDMUJPLHNCQUFJQyxJQUFKLENBQVMsb0ZBQVQ7QUFDRDtBQUNGOztBQXhEdUQ7Ozs4QkFBckNyQixZLGdCQVFDLEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZyBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dC1jb25maWctaW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkNvbmZpZyBleHRlbmRzIEV4dGVuc2lvbkNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiBgQVBQSVVNX0hPTUVgIHZhbHVlcyB0byB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqIEVhY2ggYEFQUElVTV9IT01FYCBzaG91bGQgb25seSBoYXZlIG9uZSBhc3NvY2lhdGVkIGBQbHVnaW5Db25maWdgIGluc3RhbmNlLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQbHVnaW5Db25maWc+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW5jZXMgPSB7fTtcblxuICAvKipcbiAgICogQ2FsbCB7QGxpbmsgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBKdXN0IGNhbGxzIHRoZSBzdXBlcmNsYXNzJyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYCBwYXRoXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKX0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lLCBsb2dGbikge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciBnZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5Db25maWd9IGJhc2VkIHZhbHVlIG9mIGBhcHBpdW1Ib21lYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIGBBUFBJVU1fSE9NRWAgcGF0aFxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1BsdWdpbkNvbmZpZ31cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSAoYXBwaXVtSG9tZSwgbG9nRm4pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID8/IG5ldyBQbHVnaW5Db25maWcoYXBwaXVtSG9tZSwgbG9nRm4pO1xuICAgIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgZXh0ZW5zaW9uRGVzYyAocGx1Z2luTmFtZSwge3ZlcnNpb259KSB7XG4gICAgcmV0dXJuIGAke3BsdWdpbk5hbWV9QCR7dmVyc2lvbn1gO1xuICB9XG5cbiAgcHJpbnQgKGFjdGl2ZU5hbWVzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZU5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oJ05vIHBsdWdpbnMgYWN0aXZhdGVkLiBVc2UgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZyB3aXRoIG5hbWVzIG9mIHBsdWdpbnMgdG8gYWN0aXZhdGUnKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJmaWxlIjoibGliL3BsdWdpbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/plugins.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.KNOWN_PLUGINS = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
const KNOWN_PLUGINS = {
|
|
11
|
-
images: '@appium/images-plugin',
|
|
12
|
-
'execute-driver': '@appium/execute-driver-plugin',
|
|
13
|
-
'relaxed-caps': '@appium/relaxed-caps-plugin'
|
|
14
|
-
};
|
|
15
|
-
exports.KNOWN_PLUGINS = KNOWN_PLUGINS;require('source-map-support').install();
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbIktOT1dOX1BMVUdJTlMiLCJpbWFnZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlBLE1BQU1BLGFBQWEsR0FBRztBQUNwQkMsRUFBQUEsTUFBTSxFQUFFLHVCQURZO0FBRXBCLG9CQUFrQiwrQkFGRTtBQUdwQixrQkFBZ0I7QUFISSxDQUF0QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgYSBtYXAgb2YgcGx1Z2luIG5hbWVzIHRvIG5wbSBwYWNrYWdlcyByZXByZXNlbnRpbmcgdGhvc2UgcGx1Z2lucy5cbi8vIFRoZSBwbHVnaW5zIGluIHRoaXMgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgQ0xJIHNvIHVzZXJzIGNhbiBqdXN0XG4vLyB0eXBlICdhcHBpdW0gcGx1Z2luIGluc3RhbGwgJ25hbWUnJywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGZ1bGxcbi8vIG5wbSBwYWNrYWdlLiBJLmUuLCB0aGVzZSBhcmUgdGhlIG9mZmljaWFsbHkgcmVjb2duaXplZCBwbHVnaW5zLlxuY29uc3QgS05PV05fUExVR0lOUyA9IHtcbiAgaW1hZ2VzOiAnQGFwcGl1bS9pbWFnZXMtcGx1Z2luJyxcbiAgJ2V4ZWN1dGUtZHJpdmVyJzogJ0BhcHBpdW0vZXhlY3V0ZS1kcml2ZXItcGx1Z2luJyxcbiAgJ3JlbGF4ZWQtY2Fwcyc6ICdAYXBwaXVtL3JlbGF4ZWQtY2Fwcy1wbHVnaW4nLFxufTtcblxuZXhwb3J0IHtcbiAgS05PV05fUExVR0lOUyxcbn07XG4iXSwiZmlsZSI6ImxpYi9wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|