appium 2.0.0-beta.5 → 2.0.0-beta.53
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 +156 -63
- package/build/lib/appium.d.ts +226 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +694 -439
- package/build/lib/appium.js.map +1 -0
- 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 +253 -319
- package/build/lib/cli/args.js.map +1 -0
- package/build/lib/cli/driver-command.d.ts +102 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +126 -81
- package/build/lib/cli/driver-command.js.map +1 -0
- package/build/lib/cli/extension-command.d.ts +385 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +731 -383
- package/build/lib/cli/extension-command.js.map +1 -0
- package/build/lib/cli/extension.d.ts +23 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +71 -54
- package/build/lib/cli/extension.js.map +1 -0
- 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 +240 -128
- package/build/lib/cli/parser.js.map +1 -0
- package/build/lib/cli/plugin-command.d.ts +99 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +120 -81
- package/build/lib/cli/plugin-command.js.map +1 -0
- 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 +72 -51
- package/build/lib/cli/utils.js.map +1 -0
- 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 +207 -0
- package/build/lib/config-file.js.map +1 -0
- package/build/lib/config.d.ts +49 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +265 -201
- package/build/lib/config.js.map +1 -0
- package/build/lib/constants.d.ts +49 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +66 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/extension/driver-config.d.ts +82 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +212 -0
- package/build/lib/extension/driver-config.js.map +1 -0
- package/build/lib/extension/extension-config.d.ts +249 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +581 -0
- package/build/lib/extension/extension-config.js.map +1 -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 +105 -0
- package/build/lib/extension/index.js.map +1 -0
- package/build/lib/extension/manifest-migrations.d.ts +27 -0
- package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
- package/build/lib/extension/manifest-migrations.js +118 -0
- package/build/lib/extension/manifest-migrations.js.map +1 -0
- package/build/lib/extension/manifest.d.ts +145 -0
- package/build/lib/extension/manifest.d.ts.map +1 -0
- package/build/lib/extension/manifest.js +521 -0
- package/build/lib/extension/manifest.js.map +1 -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 +62 -0
- package/build/lib/extension/package-changed.js.map +1 -0
- package/build/lib/extension/plugin-config.d.ts +56 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +102 -0
- package/build/lib/extension/plugin-config.js.map +1 -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 +122 -144
- package/build/lib/grid-register.js.map +1 -0
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -17
- package/build/lib/logger.js.map +1 -0
- package/build/lib/logsink.d.ts +4 -0
- package/build/lib/logsink.d.ts.map +1 -0
- package/build/lib/logsink.js +190 -187
- package/build/lib/logsink.js.map +1 -0
- package/build/lib/main.d.ts +62 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +348 -228
- package/build/lib/main.js.map +1 -0
- 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 +164 -0
- package/build/lib/schema/arg-spec.js.map +1 -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 +217 -0
- package/build/lib/schema/cli-args.js.map +1 -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 +124 -0
- package/build/lib/schema/cli-transformers.js.map +1 -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 +19 -0
- package/build/lib/schema/index.js.map +1 -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 +128 -0
- package/build/lib/schema/keywords.js.map +1 -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 +615 -0
- package/build/lib/schema/schema.js.map +1 -0
- package/build/lib/utils.d.ts +121 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +351 -273
- package/build/lib/utils.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types/cli.d.ts +134 -0
- package/build/types/cli.d.ts.map +1 -0
- package/build/types/cli.js +3 -0
- package/build/types/cli.js.map +1 -0
- package/build/types/index.d.ts +15 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +19 -0
- package/build/types/index.js.map +1 -0
- package/build/types/manifest/base.d.ts +135 -0
- package/build/types/manifest/base.d.ts.map +1 -0
- package/build/types/manifest/base.js +3 -0
- package/build/types/manifest/base.js.map +1 -0
- package/build/types/manifest/index.d.ts +19 -0
- package/build/types/manifest/index.d.ts.map +1 -0
- package/build/types/manifest/index.js +40 -0
- package/build/types/manifest/index.js.map +1 -0
- package/build/types/manifest/v3.d.ts +139 -0
- package/build/types/manifest/v3.d.ts.map +1 -0
- package/build/types/manifest/v3.js +3 -0
- package/build/types/manifest/v3.js.map +1 -0
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/index.js +11 -0
- package/lib/appium.js +535 -186
- package/lib/cli/args.js +267 -422
- package/lib/cli/driver-command.js +126 -23
- package/lib/cli/extension-command.js +679 -271
- package/lib/cli/extension.js +48 -17
- package/lib/cli/parser.js +263 -83
- package/lib/cli/plugin-command.js +115 -20
- package/lib/cli/utils.js +24 -10
- package/lib/config-file.js +220 -0
- package/lib/config.js +244 -110
- package/lib/constants.js +71 -0
- package/lib/extension/driver-config.js +250 -0
- package/lib/extension/extension-config.js +682 -0
- package/lib/extension/index.js +116 -0
- package/lib/extension/manifest-migrations.js +120 -0
- package/lib/extension/manifest.js +573 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +112 -0
- package/lib/grid-register.js +49 -35
- package/lib/logger.js +1 -2
- package/lib/logsink.js +64 -38
- package/lib/main.js +321 -101
- package/lib/schema/arg-spec.js +229 -0
- package/lib/schema/cli-args.js +238 -0
- package/lib/schema/cli-transformers.js +119 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +136 -0
- package/lib/schema/schema.js +722 -0
- package/lib/utils.js +291 -167
- package/package.json +83 -84
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +237 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/tsconfig.json +25 -0
- package/types/cli.ts +193 -0
- package/types/index.ts +20 -0
- package/types/manifest/README.md +30 -0
- package/types/manifest/base.ts +158 -0
- package/types/manifest/index.ts +27 -0
- package/types/manifest/v3.ts +161 -0
- package/CHANGELOG.md +0 -3515
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/lib/cli/npm.js +0 -208
- 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 -184
- 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
package/build/lib/utils.js
CHANGED
|
@@ -1,295 +1,373 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
exports.rootDir = void 0;
|
|
15
|
-
|
|
16
|
-
require("source-map-support/register");
|
|
17
|
-
|
|
18
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
|
-
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
|
-
|
|
22
|
-
var _appiumBaseDriver = require("appium-base-driver");
|
|
23
|
-
|
|
24
|
-
var _findRoot = _interopRequireDefault(require("find-root"));
|
|
25
|
-
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.adjustNodePath = exports.removeAppiumPrefixes = exports.pullSettings = exports.getPackageVersion = exports.insertAppiumPrefixes = exports.parseCapsForInnerDriver = exports.inspect = exports.isPluginCommandArgs = exports.isDriverCommandArgs = exports.isExtensionCommandArgs = exports.isServerCommandArgs = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
9
|
+
const base_driver_1 = require("@appium/base-driver");
|
|
10
|
+
const util_1 = require("util");
|
|
11
|
+
const support_1 = require("@appium/support");
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const constants_1 = require("./constants");
|
|
26
14
|
const W3C_APPIUM_PREFIX = 'appium';
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
15
|
+
const STANDARD_CAPS_LOWERCASE = new Set([...base_driver_1.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* If `stdout` is a TTY, this is `true`.
|
|
19
|
+
*
|
|
20
|
+
* Used for tighter control over log output.
|
|
21
|
+
* @type {boolean}
|
|
22
|
+
*/
|
|
23
|
+
const isStdoutTTY = process.stdout.isTTY;
|
|
24
|
+
/**
|
|
25
|
+
* Dumps to value to the console using `info` logger.
|
|
26
|
+
*
|
|
27
|
+
* @todo May want to force color to be `false` if {@link isStdoutTTY} is `false`.
|
|
28
|
+
*/
|
|
29
|
+
const inspect = lodash_1.default.flow(lodash_1.default.partialRight(
|
|
30
|
+
/** @type {(object: any, options: import('util').InspectOptions) => string} */ (util_1.inspect), { colors: true, depth: null, compact: !isStdoutTTY }), (...args) => {
|
|
31
|
+
logger_1.default.info(...args);
|
|
32
|
+
});
|
|
33
|
+
exports.inspect = inspect;
|
|
34
|
+
/**
|
|
35
|
+
* Takes the caps that were provided in the request and translates them
|
|
36
|
+
* into caps that can be used by the inner drivers.
|
|
37
|
+
*
|
|
38
|
+
* @template {Constraints} C
|
|
39
|
+
* @template [J=any]
|
|
40
|
+
* @param {J} jsonwpCapabilities
|
|
41
|
+
* @param {W3CCapabilities<C>} w3cCapabilities
|
|
42
|
+
* @param {C} constraints
|
|
43
|
+
* @param {NSCapabilities<C>} [defaultCapabilities]
|
|
44
|
+
* @returns {ParsedDriverCaps<C,J>|InvalidCaps<C,J>}
|
|
45
|
+
*/
|
|
46
|
+
function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = /** @type {C} */ ({}), defaultCapabilities = {}) {
|
|
47
|
+
// Check if the caller sent JSONWP caps, W3C caps, or both
|
|
48
|
+
const hasW3CCaps = lodash_1.default.isPlainObject(w3cCapabilities) &&
|
|
49
|
+
(lodash_1.default.has(w3cCapabilities, 'alwaysMatch') || lodash_1.default.has(w3cCapabilities, 'firstMatch'));
|
|
50
|
+
const hasJSONWPCaps = lodash_1.default.isPlainObject(jsonwpCapabilities);
|
|
51
|
+
let desiredCaps = /** @type {ParsedDriverCaps<C>['desiredCaps']} */ ({});
|
|
52
|
+
/** @type {ParsedDriverCaps<C>['processedW3CCapabilities']} */
|
|
53
|
+
let processedW3CCapabilities;
|
|
54
|
+
/** @type {ParsedDriverCaps<C>['processedJsonwpCapabilities']} */
|
|
55
|
+
let processedJsonwpCapabilities;
|
|
56
|
+
if (!hasW3CCaps) {
|
|
57
|
+
return /** @type {InvalidCaps<C>} */ ({
|
|
58
|
+
protocol: base_driver_1.PROTOCOLS.W3C,
|
|
59
|
+
error: new Error('W3C capabilities should be provided'),
|
|
60
|
+
});
|
|
57
61
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
62
|
+
const { W3C } = base_driver_1.PROTOCOLS;
|
|
63
|
+
const protocol = W3C;
|
|
64
|
+
// Make sure we don't mutate the original arguments
|
|
65
|
+
jsonwpCapabilities = lodash_1.default.cloneDeep(jsonwpCapabilities);
|
|
66
|
+
w3cCapabilities = lodash_1.default.cloneDeep(w3cCapabilities);
|
|
67
|
+
defaultCapabilities = lodash_1.default.cloneDeep(defaultCapabilities);
|
|
68
|
+
if (!lodash_1.default.isEmpty(defaultCapabilities)) {
|
|
69
|
+
if (hasW3CCaps) {
|
|
70
|
+
for (const [defaultCapKey, defaultCapValue] of lodash_1.default.toPairs(defaultCapabilities)) {
|
|
71
|
+
let isCapAlreadySet = false;
|
|
72
|
+
// Check if the key is already present in firstMatch entries
|
|
73
|
+
for (const firstMatchEntry of w3cCapabilities.firstMatch ?? []) {
|
|
74
|
+
if (lodash_1.default.isPlainObject(firstMatchEntry) &&
|
|
75
|
+
lodash_1.default.has(removeAppiumPrefixes(firstMatchEntry), removeAppiumPrefix(defaultCapKey))) {
|
|
76
|
+
isCapAlreadySet = true;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Check if the key is already present in alwaysMatch entries
|
|
81
|
+
isCapAlreadySet =
|
|
82
|
+
isCapAlreadySet ||
|
|
83
|
+
(lodash_1.default.isPlainObject(w3cCapabilities.alwaysMatch) &&
|
|
84
|
+
lodash_1.default.has(removeAppiumPrefixes(w3cCapabilities.alwaysMatch), removeAppiumPrefix(defaultCapKey)));
|
|
85
|
+
if (isCapAlreadySet) {
|
|
86
|
+
// Skip if the key is already present in the provided caps
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Only add the default capability if it is not overridden
|
|
90
|
+
if (lodash_1.default.isEmpty(w3cCapabilities.firstMatch)) {
|
|
91
|
+
w3cCapabilities.firstMatch = /** @type {W3CCapabilities<C>['firstMatch']} */ ([
|
|
92
|
+
{ [defaultCapKey]: defaultCapValue },
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
96
99
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
if (hasJSONWPCaps) {
|
|
101
|
+
jsonwpCapabilities = {
|
|
102
|
+
...removeAppiumPrefixes(defaultCapabilities),
|
|
103
|
+
...jsonwpCapabilities,
|
|
104
|
+
};
|
|
102
105
|
}
|
|
103
|
-
|
|
104
|
-
if (_lodash.default.isEmpty(w3cCapabilities.firstMatch)) {
|
|
105
|
-
w3cCapabilities.firstMatch = [{
|
|
106
|
-
[defaultCapKey]: defaultCapValue
|
|
107
|
-
}];
|
|
108
|
-
} else {
|
|
109
|
-
w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
106
|
}
|
|
113
|
-
|
|
107
|
+
// Get MJSONWP caps
|
|
114
108
|
if (hasJSONWPCaps) {
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (hasJSONWPCaps) {
|
|
120
|
-
protocol = MJSONWP;
|
|
121
|
-
desiredCaps = jsonwpCapabilities;
|
|
122
|
-
processedJsonwpCapabilities = { ...jsonwpCapabilities
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (hasW3CCaps) {
|
|
127
|
-
protocol = W3C;
|
|
128
|
-
let isFixingNeededForW3cCaps = false;
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
|
|
132
|
-
} catch (error) {
|
|
133
|
-
if (!hasJSONWPCaps) {
|
|
134
|
-
return {
|
|
135
|
-
desiredCaps,
|
|
136
|
-
processedJsonwpCapabilities,
|
|
137
|
-
processedW3CCapabilities,
|
|
138
|
-
protocol,
|
|
139
|
-
error
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
_logger.default.info(`Could not parse W3C capabilities: ${error.message}`);
|
|
144
|
-
|
|
145
|
-
isFixingNeededForW3cCaps = true;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (hasJSONWPCaps && !isFixingNeededForW3cCaps) {
|
|
149
|
-
const differingKeys = _lodash.default.difference(_lodash.default.keys(removeAppiumPrefixes(processedJsonwpCapabilities)), _lodash.default.keys(removeAppiumPrefixes(desiredCaps)));
|
|
150
|
-
|
|
151
|
-
if (!_lodash.default.isEmpty(differingKeys)) {
|
|
152
|
-
_logger.default.info(`The following capabilities were provided in the JSONWP desired capabilities that are missing ` + `in W3C capabilities: ${JSON.stringify(differingKeys)}`);
|
|
153
|
-
|
|
154
|
-
isFixingNeededForW3cCaps = true;
|
|
155
|
-
}
|
|
109
|
+
processedJsonwpCapabilities = { ...jsonwpCapabilities };
|
|
156
110
|
}
|
|
157
|
-
|
|
158
|
-
if (
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
111
|
+
// Get W3C caps
|
|
112
|
+
if (hasW3CCaps) {
|
|
113
|
+
// Call the process capabilities algorithm to find matching caps on the W3C
|
|
114
|
+
// (see: https://github.com/jlipps/simple-wd-spec#processing-capabilities)
|
|
115
|
+
try {
|
|
116
|
+
desiredCaps = (0, base_driver_1.processCapabilities)(w3cCapabilities, constraints, true);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger_1.default.info(`Could not parse W3C capabilities: ${error.message}`);
|
|
120
|
+
return /** @type {InvalidCaps<C,J>} */ ({
|
|
121
|
+
desiredCaps,
|
|
122
|
+
processedJsonwpCapabilities,
|
|
123
|
+
processedW3CCapabilities,
|
|
124
|
+
protocol,
|
|
125
|
+
error,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Create a new w3c capabilities payload that contains only the matching caps in `alwaysMatch`
|
|
129
|
+
processedW3CCapabilities = {
|
|
130
|
+
alwaysMatch: { ...insertAppiumPrefixes(desiredCaps) },
|
|
131
|
+
firstMatch: [{}],
|
|
173
132
|
};
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
processedW3CCapabilities = {
|
|
178
|
-
alwaysMatch: { ...insertAppiumPrefixes(desiredCaps)
|
|
179
|
-
},
|
|
180
|
-
firstMatch: [{}]
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return {
|
|
185
|
-
desiredCaps,
|
|
186
|
-
processedJsonwpCapabilities,
|
|
187
|
-
processedW3CCapabilities,
|
|
188
|
-
protocol
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function fixW3cCapabilities(w3cCaps, jsonwpCaps) {
|
|
193
|
-
const result = {
|
|
194
|
-
firstMatch: w3cCaps.firstMatch || [],
|
|
195
|
-
alwaysMatch: w3cCaps.alwaysMatch || {}
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const keysToInsert = _lodash.default.keys(jsonwpCaps);
|
|
199
|
-
|
|
200
|
-
const removeMatchingKeys = match => {
|
|
201
|
-
_lodash.default.pull(keysToInsert, match);
|
|
202
|
-
|
|
203
|
-
const colonIndex = match.indexOf(':');
|
|
204
|
-
|
|
205
|
-
if (colonIndex >= 0 && match.length > colonIndex) {
|
|
206
|
-
_lodash.default.pull(keysToInsert, match.substring(colonIndex + 1));
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (keysToInsert.includes(`${W3C_APPIUM_PREFIX}:${match}`)) {
|
|
210
|
-
_lodash.default.pull(keysToInsert, `${W3C_APPIUM_PREFIX}:${match}`);
|
|
211
133
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
for (const pair of _lodash.default.toPairs(result.alwaysMatch)) {
|
|
221
|
-
removeMatchingKeys(pair[0]);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
for (const key of keysToInsert) {
|
|
225
|
-
result.alwaysMatch[key] = jsonwpCaps[key];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return result;
|
|
134
|
+
return /** @type {ParsedDriverCaps<C,J>} */ ({
|
|
135
|
+
desiredCaps,
|
|
136
|
+
processedJsonwpCapabilities,
|
|
137
|
+
processedW3CCapabilities,
|
|
138
|
+
protocol,
|
|
139
|
+
});
|
|
229
140
|
}
|
|
230
|
-
|
|
141
|
+
exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
|
|
142
|
+
/**
|
|
143
|
+
* Takes a capabilities objects and prefixes capabilities with `appium:`
|
|
144
|
+
* @template {Constraints} [C={}]
|
|
145
|
+
* @param {Capabilities<C>} caps - Desired capabilities object
|
|
146
|
+
* @returns {NSCapabilities<C>}
|
|
147
|
+
*/
|
|
231
148
|
function insertAppiumPrefixes(caps) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
for (let [name, value] of _lodash.default.toPairs(caps)) {
|
|
236
|
-
if (STANDARD_CAPS.includes(name) || name.includes(':')) {
|
|
237
|
-
prefixedCaps[name] = value;
|
|
238
|
-
} else {
|
|
239
|
-
prefixedCaps[`${W3C_APPIUM_PREFIX}:${name}`] = value;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return prefixedCaps;
|
|
149
|
+
return /** @type {NSCapabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => STANDARD_CAPS_LOWERCASE.has(key.toLowerCase()) || key.includes(':')
|
|
150
|
+
? key
|
|
151
|
+
: `${W3C_APPIUM_PREFIX}:${key}`));
|
|
244
152
|
}
|
|
245
|
-
|
|
153
|
+
exports.insertAppiumPrefixes = insertAppiumPrefixes;
|
|
154
|
+
/**
|
|
155
|
+
* @template {Constraints} [C={}]
|
|
156
|
+
* @param {NSCapabilities<C>} caps
|
|
157
|
+
* @returns {Capabilities<C>}
|
|
158
|
+
*/
|
|
246
159
|
function removeAppiumPrefixes(caps) {
|
|
247
|
-
|
|
248
|
-
return caps;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const fixedCaps = {};
|
|
252
|
-
|
|
253
|
-
for (let [name, value] of _lodash.default.toPairs(caps)) {
|
|
254
|
-
fixedCaps[removeAppiumPrefix(name)] = value;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
return fixedCaps;
|
|
160
|
+
return /** @type {Capabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => removeAppiumPrefix(key)));
|
|
258
161
|
}
|
|
259
|
-
|
|
162
|
+
exports.removeAppiumPrefixes = removeAppiumPrefixes;
|
|
163
|
+
/**
|
|
164
|
+
* @param {string} key
|
|
165
|
+
* @returns {string}
|
|
166
|
+
*/
|
|
260
167
|
function removeAppiumPrefix(key) {
|
|
261
|
-
|
|
262
|
-
|
|
168
|
+
const prefix = `${W3C_APPIUM_PREFIX}:`;
|
|
169
|
+
return lodash_1.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
|
|
263
170
|
}
|
|
264
|
-
|
|
171
|
+
/**
|
|
172
|
+
*
|
|
173
|
+
* @param {string} pkgName
|
|
174
|
+
* @returns {string|undefined}
|
|
175
|
+
*/
|
|
265
176
|
function getPackageVersion(pkgName) {
|
|
266
|
-
|
|
267
|
-
|
|
177
|
+
const pkgInfo = require(`${pkgName}/package.json`) || {};
|
|
178
|
+
return pkgInfo.version;
|
|
179
|
+
}
|
|
180
|
+
exports.getPackageVersion = getPackageVersion;
|
|
181
|
+
/**
|
|
182
|
+
* Adjusts NODE_PATH environment variable,
|
|
183
|
+
* so drivers and plugins could load their peer dependencies.
|
|
184
|
+
* Read https://nodejs.org/api/modules.html#loading-from-the-global-folders
|
|
185
|
+
* for more details.
|
|
186
|
+
* @returns {void}
|
|
187
|
+
*/
|
|
188
|
+
function adjustNodePath() {
|
|
189
|
+
const selfRoot = support_1.node.getModuleRootSync('appium', __filename);
|
|
190
|
+
if (!selfRoot || path_1.default.dirname(selfRoot).length >= selfRoot.length) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const nodeModulesRoot = path_1.default.dirname(selfRoot);
|
|
194
|
+
const refreshRequirePaths = () => {
|
|
195
|
+
try {
|
|
196
|
+
// ! This hack allows us to avoid modification of import
|
|
197
|
+
// ! statements in client modules. It uses a private API though,
|
|
198
|
+
// ! so it could break (maybe, eventually).
|
|
199
|
+
// See https://gist.github.com/branneman/8048520#7-the-hack
|
|
200
|
+
// @ts-ignore
|
|
201
|
+
require('module').Module._initPaths();
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
if (!process.env.NODE_PATH) {
|
|
209
|
+
process.env.NODE_PATH = nodeModulesRoot;
|
|
210
|
+
if (refreshRequirePaths()) {
|
|
211
|
+
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
delete process.env.NODE_PATH;
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const nodePathParts = process.env.NODE_PATH.split(path_1.default.delimiter);
|
|
219
|
+
if (nodePathParts.includes(nodeModulesRoot)) {
|
|
220
|
+
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
nodePathParts.push(nodeModulesRoot);
|
|
224
|
+
process.env.NODE_PATH = nodePathParts.join(path_1.default.delimiter);
|
|
225
|
+
if (refreshRequirePaths()) {
|
|
226
|
+
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
process.env.NODE_PATH = lodash_1.default.without(nodePathParts, nodeModulesRoot).join(path_1.default.delimiter);
|
|
230
|
+
}
|
|
268
231
|
}
|
|
269
|
-
|
|
232
|
+
exports.adjustNodePath = adjustNodePath;
|
|
233
|
+
/**
|
|
234
|
+
* Pulls the initial values of Appium settings from the given capabilities argument.
|
|
235
|
+
* Each setting item must satisfy the following format:
|
|
236
|
+
* `setting[setting_name]: setting_value`
|
|
237
|
+
* The capabilities argument itself gets mutated, so it does not contain parsed
|
|
238
|
+
* settings anymore to avoid further parsing issues.
|
|
239
|
+
* Check
|
|
240
|
+
* https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md
|
|
241
|
+
* for more details on the available settings.
|
|
242
|
+
*
|
|
243
|
+
* @param {?Object} caps - Capabilities dictionary. It is mutated if
|
|
244
|
+
* one or more settings have been pulled from it
|
|
245
|
+
* @return {Object} - An empty dictionary if the given caps contains no
|
|
246
|
+
* setting items or a dictionary containing parsed Appium setting names along with
|
|
247
|
+
* their values.
|
|
248
|
+
*/
|
|
270
249
|
function pullSettings(caps) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
250
|
+
if (!lodash_1.default.isPlainObject(caps) || lodash_1.default.isEmpty(caps)) {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
253
|
+
const result = {};
|
|
254
|
+
for (const [key, value] of lodash_1.default.toPairs(caps)) {
|
|
255
|
+
const match = /\bsettings\[(\S+)\]$/.exec(key);
|
|
256
|
+
if (!match) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
result[match[1]] = value;
|
|
260
|
+
delete caps[key];
|
|
282
261
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
exports.pullSettings = pullSettings;
|
|
265
|
+
/**
|
|
266
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
267
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
268
|
+
* @param {Args<Cmd, SubCmd>} args
|
|
269
|
+
* @returns {args is Args<ServerCommand>}
|
|
270
|
+
*/
|
|
271
|
+
function isServerCommandArgs(args) {
|
|
272
|
+
return args.subcommand === constants_1.SERVER_SUBCOMMAND;
|
|
273
|
+
}
|
|
274
|
+
exports.isServerCommandArgs = isServerCommandArgs;
|
|
275
|
+
/**
|
|
276
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
277
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
278
|
+
* @param {Args<Cmd, SubCmd>} args
|
|
279
|
+
* @returns {args is Args<CliExtensionCommand, SubCmd>}
|
|
280
|
+
*/
|
|
281
|
+
function isExtensionCommandArgs(args) {
|
|
282
|
+
return args.subcommand === constants_1.DRIVER_TYPE || args.subcommand === constants_1.PLUGIN_TYPE;
|
|
283
|
+
}
|
|
284
|
+
exports.isExtensionCommandArgs = isExtensionCommandArgs;
|
|
285
|
+
/**
|
|
286
|
+
* @template {CliCommand} Cmd
|
|
287
|
+
* @template {CliExtensionSubcommand} SubCmd
|
|
288
|
+
* @param {Args<Cmd, SubCmd>} args
|
|
289
|
+
* @returns {args is Args<DriverCommand, SubCmd>}
|
|
290
|
+
*/
|
|
291
|
+
function isDriverCommandArgs(args) {
|
|
292
|
+
return args.subcommand === constants_1.DRIVER_TYPE;
|
|
293
|
+
}
|
|
294
|
+
exports.isDriverCommandArgs = isDriverCommandArgs;
|
|
295
|
+
/**
|
|
296
|
+
* @template {CliCommand} Cmd
|
|
297
|
+
* @template {CliExtensionSubcommand} SubCmd
|
|
298
|
+
* @param {Args<Cmd, SubCmd>} args
|
|
299
|
+
* @returns {args is Args<PluginCommand, SubCmd>}
|
|
300
|
+
*/
|
|
301
|
+
function isPluginCommandArgs(args) {
|
|
302
|
+
return args.subcommand === constants_1.PLUGIN_TYPE;
|
|
289
303
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsInByb3RvY29sIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiTUpTT05XUCIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZUFwcGl1bVByZWZpeGVzIiwicmVtb3ZlQXBwaXVtUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJPYmplY3QiLCJhc3NpZ24iLCJpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMiLCJtZXNzYWdlIiwiZGlmZmVyaW5nS2V5cyIsImRpZmZlcmVuY2UiLCJrZXlzIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpeFczY0NhcGFiaWxpdGllcyIsIndhcm4iLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsInczY0NhcHMiLCJqc29ud3BDYXBzIiwicmVzdWx0Iiwia2V5c1RvSW5zZXJ0IiwicmVtb3ZlTWF0Y2hpbmdLZXlzIiwibWF0Y2giLCJwdWxsIiwiY29sb25JbmRleCIsImluZGV4T2YiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsInBhaXIiLCJrZXkiLCJjYXBzIiwiU1RBTkRBUkRfQ0FQUyIsInByZWZpeGVkQ2FwcyIsIm5hbWUiLCJmaXhlZENhcHMiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiZ2V0UGFja2FnZVZlcnNpb24iLCJwa2dOYW1lIiwicGtnSW5mbyIsInJlcXVpcmUiLCJ2ZXJzaW9uIiwicHVsbFNldHRpbmdzIiwiZXhlYyIsInJvb3REaXIiLCJfX2Rpcm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxD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akUsZ0JBQUU4QixPQUFGLENBQVVtQyxJQUFWLENBQTlCLEVBQStDO0FBQzdDLFdBQU8sRUFBUDtBQUNEOztBQUVELFFBQU1aLE1BQU0sR0FBRyxFQUFmOztBQUNBLE9BQUssTUFBTSxDQUFDVyxHQUFELEVBQU01RCxLQUFOLENBQVgsSUFBMkJKLGdCQUFFSyxPQUFGLENBQVU0RCxJQUFWLENBQTNCLEVBQTRDO0FBQzFDLFVBQU1ULEtBQUssR0FBRyx1QkFBdUJzQixJQUF2QixDQUE0QmQsR0FBNUIsQ0FBZDs7QUFDQSxRQUFJLENBQUNSLEtBQUwsRUFBWTtBQUNWO0FBQ0Q7O0FBRURILElBQUFBLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUQsQ0FBTixDQUFOLEdBQW1CcEQsS0FBbkI7QUFDQSxXQUFPNkQsSUFBSSxDQUFDRCxHQUFELENBQVg7QUFDRDs7QUFDRCxTQUFPWCxNQUFQO0FBQ0Q7O0FBRUQsTUFBTTBCLE9BQU8sR0FBRyx1QkFBU0MsU0FBVCxDQUFoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHByb2Nlc3NDYXBhYmlsaXRpZXMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgZmluZFJvb3QgZnJvbSAnZmluZC1yb290JztcblxuY29uc3QgVzNDX0FQUElVTV9QUkVGSVggPSAnYXBwaXVtJztcblxuZnVuY3Rpb24gaW5zcGVjdE9iamVjdCAoYXJncykge1xuICBmdW5jdGlvbiBnZXRWYWx1ZUFycmF5IChvYmosIGluZGVudCA9ICcgICcpIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIFtvYmpdO1xuICAgIH1cblxuICAgIGxldCBzdHJBcnIgPSBbJ3snXTtcbiAgICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKG9iaikpIHtcbiAgICAgIGlmICghXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlLCBgJHtpbmRlbnR9ICBgKTtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlLnNoaWZ0KCl9YCk7XG4gICAgICAgIHN0ckFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fX1gKTtcbiAgICByZXR1cm4gc3RyQXJyO1xuICB9XG4gIGZvciAobGV0IFthcmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoYXJncykpIHtcbiAgICB2YWx1ZSA9IGdldFZhbHVlQXJyYXkodmFsdWUpO1xuICAgIGxvZ2dlci5pbmZvKGAgICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgbG9nZ2VyLmluZm8odmFsKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc0pTT05XUENhcHMgJiYgIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdFaXRoZXIgSlNPTldQIG9yIFczQyBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIHByb3ZpZGVkJyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHtXM0MsIE1KU09OV1B9ID0gUFJPVE9DT0xTO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVBcHBpdW1QcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBNSlNPTldQO1xuICAgIGRlc2lyZWRDYXBzID0ganNvbndwQ2FwYWJpbGl0aWVzO1xuICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IHsuLi5qc29ud3BDYXBhYmlsaXRpZXN9O1xuICB9XG5cbiAgLy8gR2V0IFczQyBjYXBzXG4gIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBXM0M7XG4gICAgLy8gQ2FsbCB0aGUgcHJvY2VzcyBjYXBhYmlsaXRpZXMgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hpbmcgY2FwcyBvbiB0aGUgVzNDXG4gICAgLy8gKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2psaXBwcy9zaW1wbGUtd2Qtc3BlYyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllcylcbiAgICBsZXQgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFoYXNKU09OV1BDYXBzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzSlNPTldQQ2FwcyAmJiAhaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzKSB7XG4gICAgICBjb25zdCBkaWZmZXJpbmdLZXlzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMpKSwgXy5rZXlzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKSkpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoZGlmZmVyaW5nS2V5cykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQgaW4gdGhlIEpTT05XUCBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBtaXNzaW5nIGAgK1xuICAgICAgICAgIGBpbiBXM0MgY2FwYWJpbGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KGRpZmZlcmluZ0tleXMpfWApO1xuICAgICAgICBpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgJiYgaGFzSlNPTldQQ2Fwcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1RyeWluZyB0byBmaXggVzNDIGNhcGFiaWxpdGllcyBieSBtZXJnaW5nIHRoZW0gd2l0aCBKU09OV1AgY2FwcycpO1xuICAgICAgdzNjQ2FwYWJpbGl0aWVzID0gZml4VzNjQ2FwYWJpbGl0aWVzKHczY0NhcGFiaWxpdGllcywganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDb3VsZCBub3QgcGFyc2UgZml4ZWQgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfS4gRmFsbGluZyBiYWNrIHRvIEpTT05XUCBwcm90b2NvbGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc2lyZWRDYXBzOiBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllczogbnVsbCxcbiAgICAgICAgICBwcm90b2NvbDogTUpTT05XUCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdzNjIGNhcGFiaWxpdGllcyBwYXlsb2FkIHRoYXQgY29udGFpbnMgb25seSB0aGUgbWF0Y2hpbmcgY2FwcyBpbiBgYWx3YXlzTWF0Y2hgXG4gICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgYWx3YXlzTWF0Y2g6IHsuLi5pbnNlcnRBcHBpdW1QcmVmaXhlcyhkZXNpcmVkQ2Fwcyl9LFxuICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIHByb3RvY29sfTtcbn1cblxuLyoqXG4gKiBUaGlzIGhlbHBlciBtZXRob2QgdHJpZXMgdG8gZml4IGNvcnJ1cHRlZCBXM0MgY2FwYWJpbGl0aWVzIGJ5XG4gKiBtZXJnaW5nIHRoZW0gdG8gZXhpc3RpbmcgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwcyBXM0MgY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgY2FwYWJpbGl0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEZpeGVkIFczQyBjYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gZml4VzNjQ2FwYWJpbGl0aWVzICh3M2NDYXBzLCBqc29ud3BDYXBzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBmaXJzdE1hdGNoOiB3M2NDYXBzLmZpcnN0TWF0Y2ggfHwgW10sXG4gICAgYWx3YXlzTWF0Y2g6IHczY0NhcHMuYWx3YXlzTWF0Y2ggfHwge30sXG4gIH07XG4gIGNvbnN0IGtleXNUb0luc2VydCA9IF8ua2V5cyhqc29ud3BDYXBzKTtcbiAgY29uc3QgcmVtb3ZlTWF0Y2hpbmdLZXlzID0gKG1hdGNoKSA9PiB7XG4gICAgXy5wdWxsKGtleXNUb0luc2VydCwgbWF0Y2gpO1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBtYXRjaC5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uSW5kZXggPj0gMCAmJiBtYXRjaC5sZW5ndGggPiBjb2xvbkluZGV4KSB7XG4gICAgICBfLnB1bGwoa2V5c1RvSW5zZXJ0LCBtYXRjaC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpKTtcbiAgICB9XG4gICAgaWYgKGtleXNUb0luc2VydC5pbmNsdWRlcyhgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHttYXRjaH1gKSkge1xuICAgICAgXy5wdWxsKGtleXNUb0luc2VydCwgYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bWF0Y2h9YCk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mIHJlc3VsdC5maXJzdE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhmaXJzdE1hdGNoRW50cnkpKSB7XG4gICAgICByZW1vdmVNYXRjaGluZ0tleXMocGFpclswXSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhyZXN1bHQuYWx3YXlzTWF0Y2gpKSB7XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHBhaXJbMF0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvSW5zZXJ0KSB7XG4gICAgcmVzdWx0LmFsd2F5c01hdGNoW2tleV0gPSBqc29ud3BDYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNhcGFiaWxpdGllcyBvYmplY3RzIGFuZCBwcmVmaXhlcyBjYXBhYmlsaXRpZXMgd2l0aCBgYXBwaXVtOmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYXBzIERlc2lyZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICovXG5mdW5jdGlvbiBpbnNlcnRBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICAvLyBTdGFuZGFyZCwgbm9uLXByZWZpeGVkIGNhcGFiaWxpdGllcyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gIGNvbnN0IFNUQU5EQVJEX0NBUFMgPSBbXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICdhY2NlcHRJbnNlY3VyZUNlcnRzJyxcbiAgICAncGFnZUxvYWRTdHJhdGVneScsXG4gICAgJ3Byb3h5JyxcbiAgICAnc2V0V2luZG93UmVjdCcsXG4gICAgJ3RpbWVvdXRzJyxcbiAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InXG4gIF07XG5cbiAgbGV0IHByZWZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGlmIChTVEFOREFSRF9DQVBTLmluY2x1ZGVzKG5hbWUpIHx8IG5hbWUuaW5jbHVkZXMoJzonKSkge1xuICAgICAgcHJlZml4ZWRDYXBzW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHtuYW1lfWBdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeGVzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpKSB7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCBmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBmaXhlZENhcHNbcmVtb3ZlQXBwaXVtUHJlZml4KG5hbWUpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeCAoa2V5KSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke1czQ19BUFBJVU1fUFJFRklYfTpgO1xuICByZXR1cm4gXy5zdGFydHNXaXRoKGtleSwgcHJlZml4KSA/IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uIChwa2dOYW1lKSB7XG4gIGNvbnN0IHBrZ0luZm8gPSByZXF1aXJlKGAke3BrZ05hbWV9L3BhY2thZ2UuanNvbmApIHx8IHt9O1xuICByZXR1cm4gcGtnSW5mby52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFB1bGxzIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBBcHBpdW0gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzIGFyZ3VtZW50LlxuICogRWFjaCBzZXR0aW5nIGl0ZW0gbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHNldHRpbmdbc2V0dGluZ19uYW1lXTogc2V0dGluZ192YWx1ZWBcbiAqIFRoZSBjYXBhYmlsaXRpZXMgYXJndW1lbnQgaXRzZWxmIGdldHMgbXV0YXRlZCwgc28gaXQgZG9lcyBub3QgY29udGFpbiBwYXJzZWRcbiAqIHNldHRpbmdzIGFueW1vcmUgdG8gYXZvaWQgZnVydGhlciBwYXJzaW5nIGlzc3Vlcy5cbiAqIENoZWNrXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9ibG9iL21hc3Rlci9kb2NzL2VuL2FkdmFuY2VkLWNvbmNlcHRzL3NldHRpbmdzLm1kXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhdmFpbGFibGUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHs/T2JqZWN0fSBjYXBzIC0gQ2FwYWJpbGl0aWVzIGRpY3Rpb25hcnkuIEl0IGlzIG11dGF0ZWQgaWZcbiAqIG9uZSBvciBtb3JlIHNldHRpbmdzIGhhdmUgYmVlbiBwdWxsZWQgZnJvbSBpdFxuICogQHJldHVybiB7T2JqZWN0fSAtIEFuIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlIGdpdmVuIGNhcHMgY29udGFpbnMgbm9cbiAqIHNldHRpbmcgaXRlbXMgb3IgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgcGFyc2VkIEFwcGl1bSBzZXR0aW5nIG5hbWVzIGFsb25nIHdpdGhcbiAqIHRoZWlyIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcHVsbFNldHRpbmdzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpIHx8IF8uaXNFbXB0eShjYXBzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9cXGJzZXR0aW5nc1xcWyhcXFMrKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgZGVsZXRlIGNhcHNba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCByb290RGlyID0gZmluZFJvb3QoX19kaXJuYW1lKTtcblxuZXhwb3J0IHtcbiAgaW5zcGVjdE9iamVjdCwgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIGluc2VydEFwcGl1bVByZWZpeGVzLCByb290RGlyLFxuICBnZXRQYWNrYWdlVmVyc2lvbiwgcHVsbFNldHRpbmdzLCByZW1vdmVBcHBpdW1QcmVmaXhlcyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
304
|
+
exports.isPluginCommandArgs = isPluginCommandArgs;
|
|
305
|
+
/**
|
|
306
|
+
* @typedef {import('@appium/types').StringRecord} StringRecord
|
|
307
|
+
* @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
|
|
308
|
+
*/
|
|
309
|
+
/**
|
|
310
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
311
|
+
* @template [J=any]
|
|
312
|
+
* @typedef ParsedDriverCaps
|
|
313
|
+
* @property {Capabilities<C>} desiredCaps
|
|
314
|
+
* @property {string} protocol
|
|
315
|
+
* @property {J} [processedJsonwpCapabilities]
|
|
316
|
+
* @property {W3CCapabilities<C>} [processedW3CCapabilities]
|
|
317
|
+
*/
|
|
318
|
+
/**
|
|
319
|
+
* @todo protocol is more specific
|
|
320
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
321
|
+
* @template [J=any]
|
|
322
|
+
* @typedef InvalidCaps
|
|
323
|
+
* @property {Error} error
|
|
324
|
+
* @property {string} protocol
|
|
325
|
+
* @property {Capabilities<C>} [desiredCaps]
|
|
326
|
+
* @property {J} [processedJsonwpCapabilities]
|
|
327
|
+
* @property {W3CCapabilities<C>} [processedW3CCapabilities]
|
|
328
|
+
*/
|
|
329
|
+
/**
|
|
330
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
331
|
+
* @template {StringRecord|void} [Extra=void]
|
|
332
|
+
* @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
|
|
333
|
+
*/
|
|
334
|
+
/**
|
|
335
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
336
|
+
* @template {StringRecord|void} [Extra=void]
|
|
337
|
+
* @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
|
|
338
|
+
*/
|
|
339
|
+
/**
|
|
340
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
341
|
+
* @template {StringRecord|void} [Extra=void]
|
|
342
|
+
* @typedef {import('@appium/types').NSCapabilities<C, Extra>} NSCapabilities
|
|
343
|
+
*/
|
|
344
|
+
/**
|
|
345
|
+
* @template {Constraints} C
|
|
346
|
+
* @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps
|
|
347
|
+
*/
|
|
348
|
+
/**
|
|
349
|
+
* @template T
|
|
350
|
+
* @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
|
|
351
|
+
*/
|
|
352
|
+
/**
|
|
353
|
+
* @typedef {import('@appium/types').Constraints} Constraints
|
|
354
|
+
*/
|
|
355
|
+
/**
|
|
356
|
+
* @typedef {import('appium/types').CliCommand} CliCommand
|
|
357
|
+
* @typedef {import('appium/types').CliExtensionSubcommand} CliExtensionSubcommand
|
|
358
|
+
* @typedef {import('appium/types').CliExtensionCommand} CliExtensionCommand
|
|
359
|
+
* @typedef {import('appium/types').CliCommandServer} ServerCommand
|
|
360
|
+
* @typedef {import('appium/types').CliCommandDriver} DriverCommand
|
|
361
|
+
* @typedef {import('appium/types').CliCommandPlugin} PluginCommand
|
|
362
|
+
*/
|
|
363
|
+
/**
|
|
364
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
365
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
366
|
+
* @typedef {import('appium/types').Args<Cmd, SubCmd>} Args
|
|
367
|
+
*/
|
|
368
|
+
/**
|
|
369
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
370
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
371
|
+
* @typedef {import('appium/types').ParsedArgs<Cmd, SubCmd>} ParsedArgs
|
|
372
|
+
*/
|
|
373
|
+
//# sourceMappingURL=utils.js.map
|