@appium/base-driver 8.7.2 → 9.0.0
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/basedriver/capabilities.d.ts +11 -163
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +354 -236
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +7 -6
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/event.js +55 -35
- package/build/lib/basedriver/commands/event.js.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +7 -6
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.js +66 -58
- package/build/lib/basedriver/commands/execute.js.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +9 -7
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +102 -54
- package/build/lib/basedriver/commands/find.js.map +1 -1
- package/build/lib/basedriver/commands/index.d.ts +3 -7
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +30 -33
- package/build/lib/basedriver/commands/index.js.map +1 -1
- package/build/lib/basedriver/commands/log.d.ts +8 -9
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +54 -38
- package/build/lib/basedriver/commands/log.js.map +1 -1
- package/build/lib/basedriver/commands/session.d.ts +7 -6
- package/build/lib/basedriver/commands/session.d.ts.map +1 -1
- package/build/lib/basedriver/commands/session.js +46 -39
- package/build/lib/basedriver/commands/session.js.map +1 -1
- package/build/lib/basedriver/commands/settings.d.ts +7 -7
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +35 -28
- package/build/lib/basedriver/commands/settings.js.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +7 -5
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +144 -162
- package/build/lib/basedriver/commands/timeout.js.map +1 -1
- package/build/lib/basedriver/core.d.ts +6 -157
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +361 -230
- package/build/lib/basedriver/core.js.map +1 -1
- package/build/lib/basedriver/desired-caps.js +80 -110
- package/build/lib/basedriver/desired-caps.js.map +1 -1
- package/build/lib/basedriver/device-settings.js +57 -62
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/driver.d.ts +21 -267
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -258
- package/build/lib/basedriver/driver.js.map +1 -1
- package/build/lib/basedriver/helpers.js +500 -495
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -1
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +5 -15
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/constants.js +14 -14
- package/build/lib/constants.js.map +1 -1
- package/build/lib/express/crash.js +8 -15
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.js +49 -59
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.js +125 -177
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -1
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +5 -15
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.js +82 -107
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +17 -5
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +259 -224
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.js +64 -81
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.js +115 -87
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +1 -59
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +72 -69
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/index.js +64 -180
- package/build/lib/index.js.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +355 -393
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.js +119 -130
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/errors.d.ts +135 -32
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +871 -919
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.js +37 -37
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.js +22 -109
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.js +394 -350
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +1238 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +964 -1327
- package/build/lib/protocol/routes.js.map +1 -1
- package/build/lib/protocol/validators.js +32 -39
- package/build/lib/protocol/validators.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +80 -39
- package/lib/basedriver/commands/event.js +10 -5
- package/lib/basedriver/commands/execute.js +14 -9
- package/lib/basedriver/commands/find.js +18 -12
- package/lib/basedriver/commands/index.js +21 -16
- package/lib/basedriver/commands/log.js +24 -18
- package/lib/basedriver/commands/session.js +10 -5
- package/lib/basedriver/commands/settings.js +9 -6
- package/lib/basedriver/commands/timeout.js +10 -4
- package/lib/basedriver/core.js +2 -3
- package/lib/basedriver/driver.js +29 -18
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +11 -7
- package/package.json +14 -16
|
@@ -1,253 +1,371 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
exports.findNonPrefixedCaps =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
exports.stripAppiumPrefixes = stripAppiumPrefixes;
|
|
14
|
-
exports.validateCaps = validateCaps;
|
|
15
|
-
|
|
16
|
-
require("source-map-support/register");
|
|
17
|
-
|
|
18
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
|
-
|
|
20
|
-
var _desiredCaps = require("./desired-caps");
|
|
21
|
-
|
|
22
|
-
var _support = require("@appium/support");
|
|
23
|
-
|
|
24
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
25
|
-
|
|
26
|
-
var _errors = require("../protocol/errors");
|
|
27
|
-
|
|
28
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
-
|
|
2
|
+
// @ts-check
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PREFIXED_APPIUM_OPTS_CAP = exports.promoteAppiumOptions = exports.stripAppiumPrefixes = exports.isStandardCap = exports.findNonPrefixedCaps = exports.APPIUM_VENDOR_PREFIX = exports.mergeCaps = exports.validateCaps = exports.processCapabilities = exports.parseCaps = exports.STANDARD_CAPS = void 0;
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const desired_caps_1 = require("./desired-caps");
|
|
10
|
+
const support_1 = require("@appium/support");
|
|
11
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
12
|
+
const errors_1 = require("../protocol/errors");
|
|
30
13
|
const APPIUM_VENDOR_PREFIX = 'appium:';
|
|
31
14
|
exports.APPIUM_VENDOR_PREFIX = APPIUM_VENDOR_PREFIX;
|
|
32
|
-
const
|
|
33
|
-
exports.APPIUM_OPTS_CAP = APPIUM_OPTS_CAP;
|
|
34
|
-
const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}${APPIUM_OPTS_CAP}`;
|
|
15
|
+
const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}options`;
|
|
35
16
|
exports.PREFIXED_APPIUM_OPTS_CAP = PREFIXED_APPIUM_OPTS_CAP;
|
|
36
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Takes primary caps object and merges it into a secondary caps object.
|
|
19
|
+
* @template {Constraints} [T={}]
|
|
20
|
+
* @template {Constraints} [U={}]
|
|
21
|
+
* @param {Capabilities<T>} [primary]
|
|
22
|
+
* @param {Capabilities<U>} [secondary]
|
|
23
|
+
* @returns {Merge<Capabilities<T>, Capabilities<U>>}
|
|
24
|
+
* @see https://www.w3.org/TR/webdriver/#dfn-merging-capabilities)
|
|
25
|
+
*/
|
|
37
26
|
function mergeCaps(primary = {}, secondary = {}) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return result;
|
|
27
|
+
let result = /** @type {Merge<Capabilities<T>, Capabilities<U>>} */ ({
|
|
28
|
+
...primary,
|
|
29
|
+
});
|
|
30
|
+
for (let [name, value] of /** @type {[keyof typeof secondary, any]} */ (lodash_1.default.toPairs(secondary))) {
|
|
31
|
+
// Overwriting is not allowed. Primary and secondary must have different properties (w3c rule 4.4)
|
|
32
|
+
if (!lodash_1.default.isUndefined(primary[name])) {
|
|
33
|
+
throw new errors_1.errors.InvalidArgumentError(`property '${name}' should not exist on both primary (${JSON.stringify(primary)}) and secondary (${JSON.stringify(secondary)}) object`);
|
|
34
|
+
}
|
|
35
|
+
result[ /** @type {keyof typeof result} */(name)] = value;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
50
38
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
39
|
+
exports.mergeCaps = mergeCaps;
|
|
40
|
+
// Validates caps against a set of constraints
|
|
41
|
+
/**
|
|
42
|
+
* @template {Constraints} [C={}]
|
|
43
|
+
* @param {Capabilities<C>} caps
|
|
44
|
+
* @param {C} [constraints]
|
|
45
|
+
* @param {ValidateCapsOpts} [opts]
|
|
46
|
+
* @returns {Capabilities<C>}
|
|
47
|
+
*/
|
|
48
|
+
function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
|
|
49
|
+
let { skipPresenceConstraint } = opts;
|
|
50
|
+
if (!lodash_1.default.isPlainObject(caps)) {
|
|
51
|
+
throw new errors_1.errors.InvalidArgumentError(`must be a JSON object`);
|
|
52
|
+
}
|
|
53
|
+
// Remove the 'presence' constraint if we're not checking for it
|
|
54
|
+
constraints = /** @type {C} */ (lodash_1.default.mapValues(constraints, skipPresenceConstraint
|
|
55
|
+
? /** @param {Constraint} constraint */
|
|
56
|
+
(constraint) => lodash_1.default.omit(constraint, 'presence')
|
|
57
|
+
: /** @param {Constraint} constraint */
|
|
58
|
+
(constraint) => {
|
|
59
|
+
if (constraint.presence === true) {
|
|
60
|
+
return { ...lodash_1.default.omit(constraint, 'presence'), presence: { allowEmpty: false } };
|
|
61
|
+
}
|
|
62
|
+
return constraint;
|
|
63
|
+
}));
|
|
64
|
+
const validationErrors = desired_caps_1.validator.validate(lodash_1.default.pickBy(caps, support_1.util.hasValue), constraints, {
|
|
65
|
+
fullMessages: false,
|
|
66
|
+
});
|
|
67
|
+
if (validationErrors) {
|
|
68
|
+
let message = [];
|
|
69
|
+
for (let [attribute, reasons] of lodash_1.default.toPairs(validationErrors)) {
|
|
70
|
+
for (let reason of reasons) {
|
|
71
|
+
message.push(`'${attribute}' ${reason}`);
|
|
72
|
+
}
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const validationErrors = _desiredCaps.validator.validate(_lodash.default.pickBy(caps, _support.util.hasValue), constraints, {
|
|
74
|
-
fullMessages: false
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
if (validationErrors) {
|
|
78
|
-
let message = [];
|
|
79
|
-
|
|
80
|
-
for (let [attribute, reasons] of _lodash.default.toPairs(validationErrors)) {
|
|
81
|
-
for (let reason of reasons) {
|
|
82
|
-
message.push(`'${attribute}' ${reason}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
throw new _errors.errors.InvalidArgumentError(message.join('; '));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return caps;
|
|
74
|
+
throw new errors_1.errors.InvalidArgumentError(message.join('; '));
|
|
75
|
+
}
|
|
76
|
+
// Return caps
|
|
77
|
+
return caps;
|
|
90
78
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
79
|
+
exports.validateCaps = validateCaps;
|
|
80
|
+
/**
|
|
81
|
+
* Standard, non-prefixed capabilities
|
|
82
|
+
* @see https://www.w3.org/TR/webdriver/#dfn-table-of-standard-capabilities)
|
|
83
|
+
*/
|
|
84
|
+
exports.STANDARD_CAPS = Object.freeze(new Set(
|
|
85
|
+
/** @type {StringKeyOf<import('@appium/types').StandardCapabilities>[]} */ ([
|
|
86
|
+
'browserName',
|
|
87
|
+
'browserVersion',
|
|
88
|
+
'platformName',
|
|
89
|
+
'acceptInsecureCerts',
|
|
90
|
+
'pageLoadStrategy',
|
|
91
|
+
'proxy',
|
|
92
|
+
'setWindowRect',
|
|
93
|
+
'timeouts',
|
|
94
|
+
'unhandledPromptBehavior',
|
|
95
|
+
])));
|
|
96
|
+
const STANDARD_CAPS_LOWER = new Set([...exports.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
|
|
97
|
+
/**
|
|
98
|
+
* @param {string} cap
|
|
99
|
+
* @returns {boolean}
|
|
100
|
+
*/
|
|
96
101
|
function isStandardCap(cap) {
|
|
97
|
-
|
|
102
|
+
return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
|
|
98
103
|
}
|
|
99
|
-
|
|
104
|
+
exports.isStandardCap = isStandardCap;
|
|
105
|
+
/**
|
|
106
|
+
* If the 'appium:' prefix was provided and it's a valid capability, strip out the prefix
|
|
107
|
+
* @template {Constraints} [C={}]
|
|
108
|
+
* @param {import('@appium/types').NSCapabilities<C>} caps
|
|
109
|
+
* @see https://www.w3.org/TR/webdriver/#dfn-extension-capabilities
|
|
110
|
+
* @internal
|
|
111
|
+
* @returns {import('@appium/types').Capabilities<C>}
|
|
112
|
+
*/
|
|
100
113
|
function stripAppiumPrefixes(caps) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
114
|
+
// split into prefixed and non-prefixed.
|
|
115
|
+
// non-prefixed should be standard caps at this point
|
|
116
|
+
const [prefixedCaps, nonPrefixedCaps] = lodash_1.default.partition(lodash_1.default.keys(caps), (cap) => String(cap).startsWith(APPIUM_VENDOR_PREFIX));
|
|
117
|
+
// initialize this with the k/v pairs of the non-prefixed caps
|
|
118
|
+
let strippedCaps = /** @type {import('@appium/types').Capabilities<C>} */ (lodash_1.default.pick(caps, nonPrefixedCaps));
|
|
119
|
+
const badPrefixedCaps = [];
|
|
120
|
+
// Strip out the 'appium:' prefix
|
|
121
|
+
for (let prefixedCap of prefixedCaps) {
|
|
122
|
+
const strippedCapName = /** @type {StringKeyOf<import('@appium/types').Capabilities<C>>} */ (prefixedCap.substring(APPIUM_VENDOR_PREFIX.length));
|
|
123
|
+
// If it's standard capability that was prefixed, add it to an array of incorrectly prefixed capabilities
|
|
124
|
+
if (isStandardCap(strippedCapName)) {
|
|
125
|
+
badPrefixedCaps.push(strippedCapName);
|
|
126
|
+
if (lodash_1.default.isNil(strippedCaps[strippedCapName])) {
|
|
127
|
+
strippedCaps[strippedCapName] = caps[prefixedCap];
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
logger_1.default.warn(`Ignoring capability '${prefixedCap}=${caps[prefixedCap]}' and ` +
|
|
131
|
+
`using capability '${strippedCapName}=${strippedCaps[strippedCapName]}'`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
strippedCaps[strippedCapName] = caps[prefixedCap];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// If we found standard caps that were incorrectly prefixed, throw an exception (e.g.: don't accept 'appium:platformName', only accept just 'platformName')
|
|
139
|
+
if (badPrefixedCaps.length > 0) {
|
|
140
|
+
logger_1.default.warn(`The capabilities ${JSON.stringify(badPrefixedCaps)} are standard capabilities and do not require "appium:" prefix`);
|
|
141
|
+
}
|
|
142
|
+
return strippedCaps;
|
|
128
143
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
144
|
+
exports.stripAppiumPrefixes = stripAppiumPrefixes;
|
|
145
|
+
/**
|
|
146
|
+
* Get an array of all the unprefixed caps that are being used in 'alwaysMatch' and all of the 'firstMatch' object
|
|
147
|
+
* @template {Constraints} [C={}]
|
|
148
|
+
* @param {import('@appium/types').W3CCapabilities<C>} caps A capabilities object
|
|
149
|
+
*/
|
|
150
|
+
function findNonPrefixedCaps({ alwaysMatch = {}, firstMatch = [] }) {
|
|
151
|
+
return lodash_1.default.chain([alwaysMatch, ...firstMatch])
|
|
152
|
+
.reduce((unprefixedCaps, caps) => [
|
|
153
|
+
...unprefixedCaps,
|
|
154
|
+
...Object.keys(caps).filter((cap) => !cap.includes(':') && !isStandardCap(cap)),
|
|
155
|
+
], [])
|
|
156
|
+
.uniq()
|
|
157
|
+
.value();
|
|
135
158
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
requiredCaps,
|
|
202
|
-
|
|
203
|
-
validatedFirstMatchCaps
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
159
|
+
exports.findNonPrefixedCaps = findNonPrefixedCaps;
|
|
160
|
+
/**
|
|
161
|
+
* Parse capabilities
|
|
162
|
+
* @template {Constraints} [C={}]
|
|
163
|
+
* @param {import('@appium/types').W3CCapabilities<C>} caps
|
|
164
|
+
* @param {C} [constraints]
|
|
165
|
+
* @param {boolean} [shouldValidateCaps]
|
|
166
|
+
* @see https://www.w3.org/TR/webdriver/#processing-capabilities
|
|
167
|
+
*/
|
|
168
|
+
function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
|
|
169
|
+
// If capabilities request is not an object, return error (#1.1)
|
|
170
|
+
if (!lodash_1.default.isPlainObject(caps)) {
|
|
171
|
+
throw new errors_1.errors.InvalidArgumentError('The capabilities argument was not valid for the following reason(s): "capabilities" must be a JSON object.');
|
|
172
|
+
}
|
|
173
|
+
// Let 'requiredCaps' be property named 'alwaysMatch' from capabilities request (#2)
|
|
174
|
+
// and 'allFirstMatchCaps' be property named 'firstMatch' from capabilities request (#3)
|
|
175
|
+
let { alwaysMatch: requiredCaps = {}, // If 'requiredCaps' is undefined, set it to an empty JSON object (#2.1)
|
|
176
|
+
firstMatch: allFirstMatchCaps = [{}], // If 'firstMatch' is undefined set it to a singleton list with one empty object (#3.1)
|
|
177
|
+
} = caps;
|
|
178
|
+
// Reject 'firstMatch' argument if it's not an array (#3.2)
|
|
179
|
+
if (!lodash_1.default.isArray(allFirstMatchCaps)) {
|
|
180
|
+
throw new errors_1.errors.InvalidArgumentError('The capabilities.firstMatch argument was not valid for the following reason(s): "capabilities.firstMatch" must be a JSON array or undefined');
|
|
181
|
+
}
|
|
182
|
+
// If an empty array as provided, we'll be forgiving and make it an array of one empty object
|
|
183
|
+
// In the future, reject 'firstMatch' argument if its array did not have one or more entries (#3.2)
|
|
184
|
+
if (allFirstMatchCaps.length === 0) {
|
|
185
|
+
logger_1.default.warn(`The firstMatch array in the given capabilities has no entries. Adding an empty entry fo rnow, ` +
|
|
186
|
+
`but it will require one or more entries as W3C spec.`);
|
|
187
|
+
allFirstMatchCaps.push({});
|
|
188
|
+
}
|
|
189
|
+
// Check for non-prefixed, non-standard capabilities and log warnings if they are found
|
|
190
|
+
let nonPrefixedCaps = findNonPrefixedCaps(caps);
|
|
191
|
+
if (!lodash_1.default.isEmpty(nonPrefixedCaps)) {
|
|
192
|
+
throw new errors_1.errors.InvalidArgumentError(`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`);
|
|
193
|
+
}
|
|
194
|
+
// Strip out the 'appium:' prefix from all
|
|
195
|
+
let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
|
|
196
|
+
let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
|
|
197
|
+
// Validate the requiredCaps. But don't validate 'presence' because if that constraint fails on 'alwaysMatch' it could still pass on one of the 'firstMatch' keys
|
|
198
|
+
if (shouldValidateCaps) {
|
|
199
|
+
strippedRequiredCaps = validateCaps(strippedRequiredCaps, constraints, {
|
|
200
|
+
skipPresenceConstraint: true,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Remove the 'presence' constraint for any keys that are already present in 'requiredCaps'
|
|
204
|
+
// since we know that this constraint has already passed
|
|
205
|
+
const filteredConstraints = /** @type {C} */ (lodash_1.default.omitBy(constraints, (_, key) => key in strippedRequiredCaps));
|
|
206
|
+
// Validate all of the first match capabilities and return an array with only the valid caps (see spec #5)
|
|
207
|
+
/** @type {string[]} */
|
|
208
|
+
let validationErrors = [];
|
|
209
|
+
let validatedFirstMatchCaps = lodash_1.default.compact(strippedAllFirstMatchCaps.map(
|
|
210
|
+
/**
|
|
211
|
+
* @param {import('@appium/types').Capabilities<C>} firstMatchCaps
|
|
212
|
+
*/
|
|
213
|
+
(firstMatchCaps) => {
|
|
214
|
+
try {
|
|
215
|
+
// Validate firstMatch caps
|
|
216
|
+
return shouldValidateCaps
|
|
217
|
+
? validateCaps(firstMatchCaps, filteredConstraints)
|
|
218
|
+
: firstMatchCaps;
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
validationErrors.push(e.message);
|
|
222
|
+
}
|
|
223
|
+
}));
|
|
224
|
+
// Try to merge requiredCaps with first match capabilities, break once it finds its first match (see spec #6)
|
|
225
|
+
let matchedCaps = null;
|
|
226
|
+
for (let firstMatchCaps of validatedFirstMatchCaps) {
|
|
227
|
+
try {
|
|
228
|
+
matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
|
|
229
|
+
if (matchedCaps) {
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
logger_1.default.warn(err.message);
|
|
235
|
+
validationErrors.push(err.message);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Returns variables for testing purposes
|
|
239
|
+
return {
|
|
240
|
+
requiredCaps,
|
|
241
|
+
allFirstMatchCaps,
|
|
242
|
+
validatedFirstMatchCaps,
|
|
243
|
+
matchedCaps,
|
|
244
|
+
validationErrors,
|
|
245
|
+
};
|
|
207
246
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
247
|
+
exports.parseCaps = parseCaps;
|
|
248
|
+
// Calls parseCaps and just returns the matchedCaps variable
|
|
249
|
+
/**
|
|
250
|
+
* @template {Constraints} C
|
|
251
|
+
* @param {import('@appium/types').W3CCapabilities<C>} w3cCaps
|
|
252
|
+
* @param {C} [constraints]
|
|
253
|
+
* @param {boolean} [shouldValidateCaps]
|
|
254
|
+
* @returns {import('@appium/types').Capabilities<C>}
|
|
255
|
+
*/
|
|
256
|
+
function processCapabilities(w3cCaps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
|
|
257
|
+
const { matchedCaps, validationErrors } = parseCaps(w3cCaps, constraints, shouldValidateCaps);
|
|
258
|
+
// If we found an error throw an exception
|
|
259
|
+
if (!support_1.util.hasValue(matchedCaps)) {
|
|
260
|
+
if (lodash_1.default.isArray(w3cCaps.firstMatch) && w3cCaps.firstMatch.length > 1) {
|
|
261
|
+
// If there was more than one 'firstMatch' cap, indicate that we couldn't find a matching capabilities set and show all the errors
|
|
262
|
+
throw new errors_1.errors.InvalidArgumentError(`Could not find matching capabilities from ${JSON.stringify(w3cCaps)}:\n ${validationErrors.join('\n')}`);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Otherwise, just show the singular error message
|
|
266
|
+
throw new errors_1.errors.InvalidArgumentError(validationErrors[0]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return /** @type {Capabilities<C>} */ (matchedCaps ?? {});
|
|
224
270
|
}
|
|
225
|
-
|
|
271
|
+
exports.processCapabilities = processCapabilities;
|
|
272
|
+
/**
|
|
273
|
+
* Return a copy of a capabilities object which has taken everything within the 'options'
|
|
274
|
+
* capability and promoted it to the top level.
|
|
275
|
+
*
|
|
276
|
+
* @template {Constraints} C
|
|
277
|
+
* @param {import('@appium/types').W3CCapabilities<C>} originalCaps
|
|
278
|
+
* @return {import('@appium/types').W3CCapabilities<C>} the capabilities with 'options' promoted if necessary
|
|
279
|
+
*/
|
|
226
280
|
function promoteAppiumOptions(originalCaps) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
281
|
+
const promoteForObject = (obj) => {
|
|
282
|
+
const appiumOptions = obj[PREFIXED_APPIUM_OPTS_CAP];
|
|
283
|
+
if (!appiumOptions) {
|
|
284
|
+
return obj;
|
|
285
|
+
}
|
|
286
|
+
if (!lodash_1.default.isPlainObject(appiumOptions)) {
|
|
287
|
+
throw new errors_1.errors.SessionNotCreatedError(`The ${PREFIXED_APPIUM_OPTS_CAP} capability must be an object`);
|
|
288
|
+
}
|
|
289
|
+
if (lodash_1.default.isEmpty(appiumOptions)) {
|
|
290
|
+
return obj;
|
|
291
|
+
}
|
|
292
|
+
logger_1.default.debug(`Found ${PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
|
|
293
|
+
/**
|
|
294
|
+
* @param {string} capName
|
|
295
|
+
*/
|
|
296
|
+
const shouldAddVendorPrefix = (capName) => !capName.startsWith(APPIUM_VENDOR_PREFIX);
|
|
297
|
+
const verifyIfAcceptable = (capName) => {
|
|
298
|
+
if (!lodash_1.default.isString(capName)) {
|
|
299
|
+
throw new errors_1.errors.SessionNotCreatedError(`Capability names in ${PREFIXED_APPIUM_OPTS_CAP} must be strings. '${capName}' is unexpected`);
|
|
300
|
+
}
|
|
301
|
+
if (isStandardCap(capName)) {
|
|
302
|
+
throw new errors_1.errors.SessionNotCreatedError(`${PREFIXED_APPIUM_OPTS_CAP} must only contain vendor-specific capabilties. '${capName}' is unexpected`);
|
|
303
|
+
}
|
|
304
|
+
return capName;
|
|
305
|
+
};
|
|
306
|
+
const preprocessedOptions = (0, lodash_1.default)(appiumOptions)
|
|
307
|
+
.mapKeys((value, key) => verifyIfAcceptable(key))
|
|
308
|
+
.mapKeys((value, key) => shouldAddVendorPrefix(key) ? `${APPIUM_VENDOR_PREFIX}${key}` : key)
|
|
309
|
+
.value();
|
|
310
|
+
// warn if we are going to overwrite any keys on the base caps object
|
|
311
|
+
const overwrittenKeys = lodash_1.default.intersection(Object.keys(obj), Object.keys(preprocessedOptions));
|
|
312
|
+
if (overwrittenKeys.length > 0) {
|
|
313
|
+
logger_1.default.warn(`Found capabilities inside ${PREFIXED_APPIUM_OPTS_CAP} that will overwrite ` +
|
|
314
|
+
`capabilities at the top level: ${JSON.stringify(overwrittenKeys)}`);
|
|
315
|
+
}
|
|
316
|
+
return lodash_1.default.cloneDeep({
|
|
317
|
+
...(lodash_1.default.omit(obj, PREFIXED_APPIUM_OPTS_CAP)),
|
|
318
|
+
...preprocessedOptions
|
|
319
|
+
});
|
|
320
|
+
};
|
|
321
|
+
const { alwaysMatch, firstMatch } = originalCaps;
|
|
322
|
+
const result = {};
|
|
323
|
+
if (lodash_1.default.isPlainObject(alwaysMatch)) {
|
|
324
|
+
result.alwaysMatch = promoteForObject(alwaysMatch);
|
|
325
|
+
}
|
|
326
|
+
else if ('alwaysMatch' in originalCaps) {
|
|
327
|
+
result.alwaysMatch = alwaysMatch;
|
|
328
|
+
}
|
|
329
|
+
if (lodash_1.default.isArray(firstMatch)) {
|
|
330
|
+
result.firstMatch = firstMatch.map(promoteForObject);
|
|
331
|
+
}
|
|
332
|
+
else if ('firstMatch' in originalCaps) {
|
|
333
|
+
result.firstMatch = firstMatch;
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
252
336
|
}
|
|
253
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBJVU1fVkVORE9SX1BSRUZJWCIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsIm1lcmdlQ2FwcyIsInByaW1hcnkiLCJzZWNvbmRhcnkiLCJyZXN1bHQiLCJuYW1lIiwidmFsdWUiLCJfIiwidG9QYWlycyIsImlzVW5kZWZpbmVkIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsaWRhdGVDYXBzIiwiY2FwcyIsImNvbnN0cmFpbnRzIiwib3B0cyIsInNraXBQcmVzZW5jZUNvbnN0cmFpbnQiLCJpc1BsYWluT2JqZWN0IiwibWFwVmFsdWVzIiwiY29uc3RyYWludCIsIm9taXQiLCJwcmVzZW5jZSIsImFsbG93RW1wdHkiLCJ2YWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJwaWNrQnkiLCJ1dGlsIiwiaGFzVmFsdWUiLCJmdWxsTWVzc2FnZXMiLCJtZXNzYWdlIiwiYXR0cmlidXRlIiwicmVhc29ucyIsInJlYXNvbiIsInB1c2giLCJqb2luIiwiU1RBTkRBUkRfQ0FQUyIsIk9iamVjdCIsImZyZWV6ZSIsIlNldCIsIlNUQU5EQVJEX0NBUFNfTE9XRVIiLCJtYXAiLCJjYXAiLCJ0b0xvd2VyQ2FzZSIsImlzU3RhbmRhcmRDYXAiLCJoYXMiLCJzdHJpcEFwcGl1bVByZWZpeGVzIiwicHJlZml4ZWRDYXBzIiwibm9uUHJlZml4ZWRDYXBzIiwicGFydGl0aW9uIiwia2V5cyIsIlN0cmluZyIsInN0YXJ0c1dpdGgiLCJzdHJpcHBlZENhcHMiLCJwaWNrIiwiYmFkUHJlZml4ZWRDYXBzIiwicHJlZml4ZWRDYXAiLCJzdHJpcHBlZENhcE5hbWUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJpc05pbCIsImxvZyIsIndhcm4iLCJmaW5kTm9uUHJlZml4ZWRDYXBzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiY2hhaW4iLCJyZWR1Y2UiLCJ1bnByZWZpeGVkQ2FwcyIsImZpbHRlciIsImluY2x1ZGVzIiwidW5pcSIsInBhcnNlQ2FwcyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInJlcXVpcmVkQ2FwcyIsImFsbEZpcnN0TWF0Y2hDYXBzIiwiaXNBcnJheSIsImlzRW1wdHkiLCJzdHJpcHBlZFJlcXVpcmVkQ2FwcyIsInN0cmlwcGVkQWxsRmlyc3RNYXRjaENhcHMiLCJmaWx0ZXJlZENvbnN0cmFpbnRzIiwib21pdEJ5Iiwia2V5IiwidmFsaWRhdGVkRmlyc3RNYXRjaENhcHMiLCJjb21wYWN0IiwiZmlyc3RNYXRjaENhcHMiLCJlIiwibWF0Y2hlZENhcHMiLCJlcnIiLCJwcm9jZXNzQ2FwYWJpbGl0aWVzIiwidzNjQ2FwcyIsInByb21vdGVBcHBpdW1PcHRpb25zIiwib3JpZ2luYWxDYXBzIiwiYXBwaXVtT3B0aW9ucyIsImNsb25lRGVlcCIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJzdHJpcHBlZEFwcGl1bU9wdGlvbnMiLCJvdmVyd3JpdHRlbktleXMiLCJpbnRlcnNlY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9jYXBhYmlsaXRpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3ZhbGlkYXRvcn0gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge2Vycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wvZXJyb3JzJztcblxuY29uc3QgQVBQSVVNX1ZFTkRPUl9QUkVGSVggPSAnYXBwaXVtOic7XG5jb25zdCBBUFBJVU1fT1BUU19DQVAgPSAnb3B0aW9ucyc7XG5jb25zdCBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAgPSBgJHtBUFBJVU1fVkVORE9SX1BSRUZJWH0ke0FQUElVTV9PUFRTX0NBUH1gO1xuXG4vKipcbiAqIFRha2VzIHByaW1hcnkgY2FwcyBvYmplY3QgYW5kIG1lcmdlcyBpdCBpbnRvIGEgc2Vjb25kYXJ5IGNhcHMgb2JqZWN0LlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW1Q9e31dXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbVT17fV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFQ+fSBbcHJpbWFyeV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFU+fSBbc2Vjb25kYXJ5XVxuICogQHJldHVybnMge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tbWVyZ2luZy1jYXBhYmlsaXRpZXMpXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ2FwcyhwcmltYXJ5ID0ge30sIHNlY29uZGFyeSA9IHt9KSB7XG4gIGxldCByZXN1bHQgPSAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fSAqLyAoe1xuICAgIC4uLnByaW1hcnksXG4gIH0pO1xuXG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgLyoqIEB0eXBlIHtba2V5b2YgdHlwZW9mIHNlY29uZGFyeSwgYW55XX0gKi8gKF8udG9QYWlycyhzZWNvbmRhcnkpKSkge1xuICAgIC8vIE92ZXJ3cml0aW5nIGlzIG5vdCBhbGxvd2VkLiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgbXVzdCBoYXZlIGRpZmZlcmVudCBwcm9wZXJ0aWVzICh3M2MgcnVsZSA0LjQpXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByaW1hcnlbbmFtZV0pKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgcHJvcGVydHkgJyR7bmFtZX0nIHNob3VsZCBub3QgZXhpc3Qgb24gYm90aCBwcmltYXJ5ICgke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByaW1hcnlcbiAgICAgICAgKX0pIGFuZCBzZWNvbmRhcnkgKCR7SlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5KX0pIG9iamVjdGBcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdFsvKiogQHR5cGUge2tleW9mIHR5cGVvZiByZXN1bHR9ICovIChuYW1lKV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFZhbGlkYXRlcyBjYXBzIGFnYWluc3QgYSBzZXQgb2YgY29uc3RyYWludHNcbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge0NhcGFiaWxpdGllczxDPn0gY2Fwc1xuICogQHBhcmFtIHtDfSBbY29uc3RyYWludHNdXG4gKiBAcGFyYW0ge1ZhbGlkYXRlQ2Fwc09wdHN9IFtvcHRzXVxuICogQHJldHVybnMge0NhcGFiaWxpdGllczxDPn1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDYXBzKGNhcHMsIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLCBvcHRzID0ge30pIHtcbiAgbGV0IHtza2lwUHJlc2VuY2VDb25zdHJhaW50fSA9IG9wdHM7XG5cbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBtdXN0IGJlIGEgSlNPTiBvYmplY3RgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgJ3ByZXNlbmNlJyBjb25zdHJhaW50IGlmIHdlJ3JlIG5vdCBjaGVja2luZyBmb3IgaXRcbiAgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovIChcbiAgICBfLm1hcFZhbHVlcyhcbiAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgc2tpcFByZXNlbmNlQ29uc3RyYWludFxuICAgICAgICA/IC8qKiBAcGFyYW0ge0NvbnN0cmFpbnR9IGNvbnN0cmFpbnQgKi9cbiAgICAgICAgICAoY29uc3RyYWludCkgPT4gXy5vbWl0KGNvbnN0cmFpbnQsICdwcmVzZW5jZScpXG4gICAgICAgIDogLyoqIEBwYXJhbSB7Q29uc3RyYWludH0gY29uc3RyYWludCAqL1xuICAgICAgICAgIChjb25zdHJhaW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5wcmVzZW5jZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gey4uLl8ub21pdChjb25zdHJhaW50LCAncHJlc2VuY2UnKSwgcHJlc2VuY2U6IHthbGxvd0VtcHR5OiBmYWxzZX19O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gICAgICAgICAgfVxuICAgIClcbiAgKTtcblxuICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdG9yLnZhbGlkYXRlKF8ucGlja0J5KGNhcHMsIHV0aWwuaGFzVmFsdWUpLCBjb25zdHJhaW50cywge1xuICAgIGZ1bGxNZXNzYWdlczogZmFsc2UsXG4gIH0pO1xuXG4gIGlmICh2YWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBbXTtcbiAgICBmb3IgKGxldCBbYXR0cmlidXRlLCByZWFzb25zXSBvZiBfLnRvUGFpcnModmFsaWRhdGlvbkVycm9ycykpIHtcbiAgICAgIGZvciAobGV0IHJlYXNvbiBvZiByZWFzb25zKSB7XG4gICAgICAgIG1lc3NhZ2UucHVzaChgJyR7YXR0cmlidXRlfScgJHtyZWFzb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IobWVzc2FnZS5qb2luKCc7ICcpKTtcbiAgfVxuXG4gIC8vIFJldHVybiBjYXBzXG4gIHJldHVybiBjYXBzO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkLCBub24tcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFOREFSRF9DQVBTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChcbiAgICAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuU3RyaW5nS2V5T2Y8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU3RhbmRhcmRDYXBhYmlsaXRpZXM+W119ICovIChbXG4gICAgICAnYnJvd3Nlck5hbWUnLFxuICAgICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICAgJ2FjY2VwdEluc2VjdXJlQ2VydHMnLFxuICAgICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICAgJ3Byb3h5JyxcbiAgICAgICdzZXRXaW5kb3dSZWN0JyxcbiAgICAgICd0aW1lb3V0cycsXG4gICAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InLFxuICAgIF0pXG4gIClcbik7XG5cbmNvbnN0IFNUQU5EQVJEX0NBUFNfTE9XRVIgPSBuZXcgU2V0KFsuLi5TVEFOREFSRF9DQVBTXS5tYXAoKGNhcCkgPT4gY2FwLnRvTG93ZXJDYXNlKCkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FwXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZENhcChjYXApIHtcbiAgcmV0dXJuIFNUQU5EQVJEX0NBUFNfTE9XRVIuaGFzKGNhcC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgJ2FwcGl1bTonIHByZWZpeCB3YXMgcHJvdmlkZWQgYW5kIGl0J3MgYSB2YWxpZCBjYXBhYmlsaXR5LCBzdHJpcCBvdXQgdGhlIHByZWZpeFxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEM+fSBjYXBzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1leHRlbnNpb24tY2FwYWJpbGl0aWVzXG4gKiBAaW50ZXJuYWxcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHN0cmlwQXBwaXVtUHJlZml4ZXMoY2Fwcykge1xuICAvLyBzcGxpdCBpbnRvIHByZWZpeGVkIGFuZCBub24tcHJlZml4ZWQuXG4gIC8vIG5vbi1wcmVmaXhlZCBzaG91bGQgYmUgc3RhbmRhcmQgY2FwcyBhdCB0aGlzIHBvaW50XG4gIGNvbnN0IFtwcmVmaXhlZENhcHMsIG5vblByZWZpeGVkQ2Fwc10gPSBfLnBhcnRpdGlvbihfLmtleXMoY2FwcyksIChjYXApID0+XG4gICAgU3RyaW5nKGNhcCkuc3RhcnRzV2l0aChBUFBJVU1fVkVORE9SX1BSRUZJWClcbiAgKTtcblxuICAvLyBpbml0aWFsaXplIHRoaXMgd2l0aCB0aGUgay92IHBhaXJzIG9mIHRoZSBub24tcHJlZml4ZWQgY2Fwc1xuICBsZXQgc3RyaXBwZWRDYXBzID0gLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59ICovIChcbiAgICBfLnBpY2soY2Fwcywgbm9uUHJlZml4ZWRDYXBzKVxuICApO1xuICBjb25zdCBiYWRQcmVmaXhlZENhcHMgPSBbXTtcblxuICAvLyBTdHJpcCBvdXQgdGhlICdhcHBpdW06JyBwcmVmaXhcbiAgZm9yIChsZXQgcHJlZml4ZWRDYXAgb2YgcHJlZml4ZWRDYXBzKSB7XG4gICAgY29uc3Qgc3RyaXBwZWRDYXBOYW1lID1cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCd0eXBlLWZlc3QnKS5TdHJpbmdLZXlPZjxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz4+fSAqLyAoXG4gICAgICAgIHByZWZpeGVkQ2FwLnN1YnN0cmluZyhBUFBJVU1fVkVORE9SX1BSRUZJWC5sZW5ndGgpXG4gICAgICApO1xuXG4gICAgLy8gSWYgaXQncyBzdGFuZGFyZCBjYXBhYmlsaXR5IHRoYXQgd2FzIHByZWZpeGVkLCBhZGQgaXQgdG8gYW4gYXJyYXkgb2YgaW5jb3JyZWN0bHkgcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gICAgaWYgKGlzU3RhbmRhcmRDYXAoc3RyaXBwZWRDYXBOYW1lKSkge1xuICAgICAgYmFkUHJlZml4ZWRDYXBzLnB1c2goc3RyaXBwZWRDYXBOYW1lKTtcbiAgICAgIGlmIChfLmlzTmlsKHN0cmlwcGVkQ2Fwc1tzdHJpcHBlZENhcE5hbWVdKSkge1xuICAgICAgICBzdHJpcHBlZENhcHNbc3RyaXBwZWRDYXBOYW1lXSA9IGNhcHNbcHJlZml4ZWRDYXBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYElnbm9yaW5nIGNhcGFiaWxpdHkgJyR7cHJlZml4ZWRDYXB9PSR7Y2Fwc1twcmVmaXhlZENhcF19JyBhbmQgYCArXG4gICAgICAgICAgICBgdXNpbmcgY2FwYWJpbGl0eSAnJHtzdHJpcHBlZENhcE5hbWV9PSR7c3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV19J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV0gPSBjYXBzW3ByZWZpeGVkQ2FwXTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBmb3VuZCBzdGFuZGFyZCBjYXBzIHRoYXQgd2VyZSBpbmNvcnJlY3RseSBwcmVmaXhlZCwgdGhyb3cgYW4gZXhjZXB0aW9uIChlLmcuOiBkb24ndCBhY2NlcHQgJ2FwcGl1bTpwbGF0Zm9ybU5hbWUnLCBvbmx5IGFjY2VwdCBqdXN0ICdwbGF0Zm9ybU5hbWUnKVxuICBpZiAoYmFkUHJlZml4ZWRDYXBzLmxlbmd0aCA+IDApIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBUaGUgY2FwYWJpbGl0aWVzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGJhZFByZWZpeGVkQ2Fwc1xuICAgICAgKX0gYXJlIHN0YW5kYXJkIGNhcGFiaWxpdGllcyBhbmQgZG8gbm90IHJlcXVpcmUgXCJhcHBpdW06XCIgcHJlZml4YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkQ2Fwcztcbn1cblxuLyoqXG4gKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSB1bnByZWZpeGVkIGNhcHMgdGhhdCBhcmUgYmVpbmcgdXNlZCBpbiAnYWx3YXlzTWF0Y2gnIGFuZCBhbGwgb2YgdGhlICdmaXJzdE1hdGNoJyBvYmplY3RcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHMgQSBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpbmROb25QcmVmaXhlZENhcHMoe2Fsd2F5c01hdGNoID0ge30sIGZpcnN0TWF0Y2ggPSBbXX0pIHtcbiAgcmV0dXJuIF8uY2hhaW4oW2Fsd2F5c01hdGNoLCAuLi5maXJzdE1hdGNoXSlcbiAgICAucmVkdWNlKFxuICAgICAgKHVucHJlZml4ZWRDYXBzLCBjYXBzKSA9PiBbXG4gICAgICAgIC4uLnVucHJlZml4ZWRDYXBzLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhjYXBzKS5maWx0ZXIoKGNhcCkgPT4gIWNhcC5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcCkpLFxuICAgICAgXSxcbiAgICAgIFtdXG4gICAgKVxuICAgIC51bmlxKClcbiAgICAudmFsdWUoKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBjYXBhYmlsaXRpZXNcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHNcbiAqIEBwYXJhbSB7Q30gW2NvbnN0cmFpbnRzXVxuICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkVmFsaWRhdGVDYXBzXVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHMoY2FwcywgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovICh7fSksIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgLy8gSWYgY2FwYWJpbGl0aWVzIHJlcXVlc3QgaXMgbm90IGFuIG9iamVjdCwgcmV0dXJuIGVycm9yICgjMS4xKVxuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAnVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCB3YXMgbm90IHZhbGlkIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbihzKTogXCJjYXBhYmlsaXRpZXNcIiBtdXN0IGJlIGEgSlNPTiBvYmplY3QuJ1xuICAgICk7XG4gIH1cblxuICAvLyBMZXQgJ3JlcXVpcmVkQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2Fsd2F5c01hdGNoJyBmcm9tIGNhcGFiaWxpdGllcyByZXF1ZXN0ICgjMilcbiAgLy8gYW5kICdhbGxGaXJzdE1hdGNoQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2ZpcnN0TWF0Y2gnIGZyb20gY2FwYWJpbGl0aWVzIHJlcXVlc3QgKCMzKVxuICBsZXQge1xuICAgIGFsd2F5c01hdGNoOiByZXF1aXJlZENhcHMgPSB7fSwgLy8gSWYgJ3JlcXVpcmVkQ2FwcycgaXMgdW5kZWZpbmVkLCBzZXQgaXQgdG8gYW4gZW1wdHkgSlNPTiBvYmplY3QgKCMyLjEpXG4gICAgZmlyc3RNYXRjaDogYWxsRmlyc3RNYXRjaENhcHMgPSBbe31dLCAvLyBJZiAnZmlyc3RNYXRjaCcgaXMgdW5kZWZpbmVkIHNldCBpdCB0byBhIHNpbmdsZXRvbiBsaXN0IHdpdGggb25lIGVtcHR5IG9iamVjdCAoIzMuMSlcbiAgfSA9IGNhcHM7XG5cbiAgLy8gUmVqZWN0ICdmaXJzdE1hdGNoJyBhcmd1bWVudCBpZiBpdCdzIG5vdCBhbiBhcnJheSAoIzMuMilcbiAgaWYgKCFfLmlzQXJyYXkoYWxsRmlyc3RNYXRjaENhcHMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICdUaGUgY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggYXJndW1lbnQgd2FzIG5vdCB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb24ocyk6IFwiY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hcIiBtdXN0IGJlIGEgSlNPTiBhcnJheSBvciB1bmRlZmluZWQnXG4gICAgKTtcbiAgfVxuXG4gIC8vIElmIGFuIGVtcHR5IGFycmF5IGFzIHByb3ZpZGVkLCB3ZSdsbCBiZSBmb3JnaXZpbmcgYW5kIG1ha2UgaXQgYW4gYXJyYXkgb2Ygb25lIGVtcHR5IG9iamVjdFxuICAvLyBJbiB0aGUgZnV0dXJlLCByZWplY3QgJ2ZpcnN0TWF0Y2gnIGFyZ3VtZW50IGlmIGl0cyBhcnJheSBkaWQgbm90IGhhdmUgb25lIG9yIG1vcmUgZW50cmllcyAoIzMuMilcbiAgaWYgKGFsbEZpcnN0TWF0Y2hDYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFRoZSBmaXJzdE1hdGNoIGFycmF5IGluIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgaGFzIG5vIGVudHJpZXMuIEFkZGluZyBhbiBlbXB0eSBlbnRyeSBmbyBybm93LCBgICtcbiAgICAgICAgYGJ1dCBpdCB3aWxsIHJlcXVpcmUgb25lIG9yIG1vcmUgZW50cmllcyBhcyBXM0Mgc3BlYy5gXG4gICAgKTtcbiAgICBhbGxGaXJzdE1hdGNoQ2Fwcy5wdXNoKHt9KTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBub24tcHJlZml4ZWQsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgYW5kIGxvZyB3YXJuaW5ncyBpZiB0aGV5IGFyZSBmb3VuZFxuICBsZXQgbm9uUHJlZml4ZWRDYXBzID0gZmluZE5vblByZWZpeGVkQ2FwcyhjYXBzKTtcbiAgaWYgKCFfLmlzRW1wdHkobm9uUHJlZml4ZWRDYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgQWxsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgc2hvdWxkIGhhdmUgYSB2ZW5kb3IgcHJlZml4LiBUaGUgZm9sbG93aW5nIGNhcGFiaWxpdGllcyBkaWQgbm90IGhhdmUgb25lOiAke25vblByZWZpeGVkQ2Fwc31gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0cmlwIG91dCB0aGUgJ2FwcGl1bTonIHByZWZpeCBmcm9tIGFsbFxuICBsZXQgc3RyaXBwZWRSZXF1aXJlZENhcHMgPSBzdHJpcEFwcGl1bVByZWZpeGVzKHJlcXVpcmVkQ2Fwcyk7XG4gIGxldCBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzID0gYWxsRmlyc3RNYXRjaENhcHMubWFwKHN0cmlwQXBwaXVtUHJlZml4ZXMpO1xuXG4gIC8vIFZhbGlkYXRlIHRoZSByZXF1aXJlZENhcHMuIEJ1dCBkb24ndCB2YWxpZGF0ZSAncHJlc2VuY2UnIGJlY2F1c2UgaWYgdGhhdCBjb25zdHJhaW50IGZhaWxzIG9uICdhbHdheXNNYXRjaCcgaXQgY291bGQgc3RpbGwgcGFzcyBvbiBvbmUgb2YgdGhlICdmaXJzdE1hdGNoJyBrZXlzXG4gIGlmIChzaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICBzdHJpcHBlZFJlcXVpcmVkQ2FwcyA9IHZhbGlkYXRlQ2FwcyhzdHJpcHBlZFJlcXVpcmVkQ2FwcywgY29uc3RyYWludHMsIHtcbiAgICAgIHNraXBQcmVzZW5jZUNvbnN0cmFpbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgLy8gUmVtb3ZlIHRoZSAncHJlc2VuY2UnIGNvbnN0cmFpbnQgZm9yIGFueSBrZXlzIHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudCBpbiAncmVxdWlyZWRDYXBzJ1xuICAvLyBzaW5jZSB3ZSBrbm93IHRoYXQgdGhpcyBjb25zdHJhaW50IGhhcyBhbHJlYWR5IHBhc3NlZFxuICBjb25zdCBmaWx0ZXJlZENvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoXG4gICAgXy5vbWl0QnkoY29uc3RyYWludHMsIChfLCBrZXkpID0+IGtleSBpbiBzdHJpcHBlZFJlcXVpcmVkQ2FwcylcbiAgKTtcblxuICAvLyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGZpcnN0IG1hdGNoIGNhcGFiaWxpdGllcyBhbmQgcmV0dXJuIGFuIGFycmF5IHdpdGggb25seSB0aGUgdmFsaWQgY2FwcyAoc2VlIHNwZWMgIzUpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gW107XG4gIGxldCB2YWxpZGF0ZWRGaXJzdE1hdGNoQ2FwcyA9IF8uY29tcGFjdChcbiAgICBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzLm1hcChcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59IGZpcnN0TWF0Y2hDYXBzXG4gICAgICAgKi9cbiAgICAgIChmaXJzdE1hdGNoQ2FwcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIGZpcnN0TWF0Y2ggY2Fwc1xuICAgICAgICAgIHJldHVybiBzaG91bGRWYWxpZGF0ZUNhcHNcbiAgICAgICAgICAgID8gdmFsaWRhdGVDYXBzKGZpcnN0TWF0Y2hDYXBzLCBmaWx0ZXJlZENvbnN0cmFpbnRzKVxuICAgICAgICAgICAgOiBmaXJzdE1hdGNoQ2FwcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICApO1xuXG4gIC8vIFRyeSB0byBtZXJnZSByZXF1aXJlZENhcHMgd2l0aCBmaXJzdCBtYXRjaCBjYXBhYmlsaXRpZXMsIGJyZWFrIG9uY2UgaXQgZmluZHMgaXRzIGZpcnN0IG1hdGNoIChzZWUgc3BlYyAjNilcbiAgbGV0IG1hdGNoZWRDYXBzID0gbnVsbDtcbiAgZm9yIChsZXQgZmlyc3RNYXRjaENhcHMgb2YgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMpIHtcbiAgICB0cnkge1xuICAgICAgbWF0Y2hlZENhcHMgPSBtZXJnZUNhcHMoc3RyaXBwZWRSZXF1aXJlZENhcHMsIGZpcnN0TWF0Y2hDYXBzKTtcbiAgICAgIGlmIChtYXRjaGVkQ2Fwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGVyci5tZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlcnIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB2YXJpYWJsZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlZENhcHMsXG4gICAgYWxsRmlyc3RNYXRjaENhcHMsXG4gICAgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMsXG4gICAgbWF0Y2hlZENhcHMsXG4gICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgfTtcbn1cblxuLy8gQ2FsbHMgcGFyc2VDYXBzIGFuZCBqdXN0IHJldHVybnMgdGhlIG1hdGNoZWRDYXBzIHZhcmlhYmxlXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEM+fSB3M2NDYXBzXG4gKiBAcGFyYW0ge0N9IFtjb25zdHJhaW50c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZFZhbGlkYXRlQ2Fwc11cbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDYXBhYmlsaXRpZXMoXG4gIHczY0NhcHMsXG4gIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLFxuICBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlXG4pIHtcbiAgY29uc3Qge21hdGNoZWRDYXBzLCB2YWxpZGF0aW9uRXJyb3JzfSA9IHBhcnNlQ2Fwcyh3M2NDYXBzLCBjb25zdHJhaW50cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAvLyBJZiB3ZSBmb3VuZCBhbiBlcnJvciB0aHJvdyBhbiBleGNlcHRpb25cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG1hdGNoZWRDYXBzKSkge1xuICAgIGlmIChfLmlzQXJyYXkodzNjQ2Fwcy5maXJzdE1hdGNoKSAmJiB3M2NDYXBzLmZpcnN0TWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gSWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgJ2ZpcnN0TWF0Y2gnIGNhcCwgaW5kaWNhdGUgdGhhdCB3ZSBjb3VsZG4ndCBmaW5kIGEgbWF0Y2hpbmcgY2FwYWJpbGl0aWVzIHNldCBhbmQgc2hvdyBhbGwgdGhlIGVycm9yc1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGNhcGFiaWxpdGllcyBmcm9tICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgdzNjQ2Fwc1xuICAgICAgICApfTpcXG4gJHt2YWxpZGF0aW9uRXJyb3JzLmpvaW4oJ1xcbicpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSwganVzdCBzaG93IHRoZSBzaW5ndWxhciBlcnJvciBtZXNzYWdlXG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKHZhbGlkYXRpb25FcnJvcnNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge0NhcGFiaWxpdGllczxDPn0gKi8gKG1hdGNoZWRDYXBzID8/IHt9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb3B5IG9mIGEgY2FwYWJpbGl0aWVzIG9iamVjdCB3aGljaCBoYXMgdGFrZW4gZXZlcnl0aGluZyB3aXRoaW4gdGhlICdvcHRpb25zJ1xuICogY2FwYWJpbGl0eSBhbmQgcHJvbW90ZWQgaXQgdG8gdGhlIHRvcCBsZXZlbC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBydW4gYWZ0ZXJcbiAqIGFsbCB2ZW5kb3IgcHJlZml4ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgZnJvbSB0aGUgdG9wIGxldmVsLiBTbyB3ZSBhcmUgZGVhbGluZyB3aXRoIGUuZy5cbiAqICdvcHRpb25zJyBhbmQgbm90ICdhcHBpdW06b3B0aW9ucycgYXQgdGhpcyBwb2ludC4gQW55IHByZWZpeGVzIF9pbnNpZGVfIHRoZSAnb3B0aW9ucycgY2FwYWJpbGl0eVxuICogd2lsbCB0aGVtc2VsdmVzIGJlIHN0cmlwcGVkLiBUaGlzIGlzIGRlc2lnbmVkIGFzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBub3Qgb25lIHRvIG9wZXJhdGUgb25cbiAqIHVzZXItY29uc3RydWN0ZWQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcmlnaW5hbENhcHMgLSB0aGUgY2FwYWJpbGl0aWVzIHRvIGFuYWx5emUgYW5kIHByb21vdGUgZnJvbSAnb3B0aW9ucydcbiAqIEByZXR1cm4ge29iamVjdCF9IC0gdGhlIGNhcGFiaWxpdGllcyB3aXRoICdvcHRpb25zJyBwcm9tb3RlZCBpZiBuZWNlc3NhcnlcbiAqL1xuZnVuY3Rpb24gcHJvbW90ZUFwcGl1bU9wdGlvbnMob3JpZ2luYWxDYXBzKSB7XG4gIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSBvcmlnaW5hbENhcHNbQVBQSVVNX09QVFNfQ0FQXTtcbiAgaWYgKCFhcHBpdW1PcHRpb25zKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsQ2FwcztcbiAgfVxuXG4gIGxldCBjYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoYXBwaXVtT3B0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoYFRoZSAke0FQUElVTV9PUFRTX0NBUH0gY2FwYWJpbGl0eSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICB9XG5cbiAgLy8gZmlyc3QgZ2V0IHJpZCBvZiBhbnkgcHJlZml4ZXMgaW5zaWRlIGFwcGl1bTpvcHRpb25zXG4gIGNvbnN0IHN0cmlwcGVkQXBwaXVtT3B0aW9ucyA9IHN0cmlwQXBwaXVtUHJlZml4ZXMoYXBwaXVtT3B0aW9ucyk7XG4gIC8vIHdhcm4gaWYgd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSBhbnkga2V5cyBvbiB0aGUgYmFzZSBjYXBzIG9iamVjdFxuICBjb25zdCBvdmVyd3JpdHRlbktleXMgPSBfLmludGVyc2VjdGlvbihPYmplY3Qua2V5cyhjYXBzKSwgT2JqZWN0LmtleXMoc3RyaXBwZWRBcHBpdW1PcHRpb25zKSk7XG4gIGlmIChvdmVyd3JpdHRlbktleXMubGVuZ3RoID4gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYEZvdW5kIGNhcGFiaWxpdGllcyBpbnNpZGUgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IHRoYXQgd2lsbCBvdmVyd3JpdGUgYCArXG4gICAgICAgIGBjYXBhYmlsaXRpZXMgYXQgdGhlIHRvcCBsZXZlbDogJHtKU09OLnN0cmluZ2lmeShvdmVyd3JpdHRlbktleXMpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbm93IGp1c3QgYXBwbHkgdGhlbSB0byB0aGUgbWFpbiBjYXBzIG9iamVjdFxuICBjYXBzID0gey4uLmNhcHMsIC4uLnN0cmlwcGVkQXBwaXVtT3B0aW9uc307XG5cbiAgLy8gYW5kIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBvcHRpb25zIGNhcFxuICBkZWxldGUgY2Fwc1tBUFBJVU1fT1BUU19DQVBdO1xuICByZXR1cm4gY2Fwcztcbn1cblxuZXhwb3J0IHtcbiAgcGFyc2VDYXBzLFxuICBwcm9jZXNzQ2FwYWJpbGl0aWVzLFxuICB2YWxpZGF0ZUNhcHMsXG4gIG1lcmdlQ2FwcyxcbiAgQVBQSVVNX1ZFTkRPUl9QUkVGSVgsXG4gIEFQUElVTV9PUFRTX0NBUCxcbiAgZmluZE5vblByZWZpeGVkQ2FwcyxcbiAgaXNTdGFuZGFyZENhcCxcbiAgc3RyaXBBcHBpdW1QcmVmaXhlcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnMsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnR9IENvbnN0cmFpbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWxpZGF0ZUNhcHNPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwUHJlc2VuY2VDb25zdHJhaW50XSAtIGlmIHRydWUsIHNraXAgdGhlIHByZXNlbmNlIGNvbnN0cmFpbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gTlNDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gVzNDQ2FwYWJpbGl0aWVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLFNBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4Qjs7QUFDQSxNQUFNQyx3QkFBd0IsR0FBSSxHQUFFRixvQkFBcUIsR0FBRUMsZUFBZ0IsRUFBM0U7OztBQVdBLFNBQVNFLFNBQVQsQ0FBbUJDLE9BQU8sR0FBRyxFQUE3QixFQUFpQ0MsU0FBUyxHQUFHLEVBQTdDLEVBQWlEO0VBQy9DLElBQUlDLE1BQU0sR0FBK0UsRUFDdkYsR0FBR0Y7RUFEb0YsQ0FBekY7O0VBSUEsS0FBSyxJQUFJLENBQUNHLElBQUQsRUFBT0MsS0FBUCxDQUFULElBQXdFQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUwsU0FBVixDQUF4RSxFQUErRjtJQUU3RixJQUFJLENBQUNJLGVBQUEsQ0FBRUUsV0FBRixDQUFjUCxPQUFPLENBQUNHLElBQUQsQ0FBckIsQ0FBTCxFQUFtQztNQUNqQyxNQUFNLElBQUlLLGNBQUEsQ0FBT0Msb0JBQVgsQ0FDSCxhQUFZTixJQUFLLHVDQUFzQ08sSUFBSSxDQUFDQyxTQUFMLENBQ3REWCxPQURzRCxDQUV0RCxvQkFBbUJVLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixTQUFmLENBQTBCLFVBSDNDLENBQU47SUFLRDs7SUFDREMsTUFBTSxDQUFxQ0MsSUFBckMsQ0FBTixHQUFvREMsS0FBcEQ7RUFD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
|
|
337
|
+
exports.promoteAppiumOptions = promoteAppiumOptions;
|
|
338
|
+
/**
|
|
339
|
+
* @typedef {import('@appium/types').Constraints} Constraints
|
|
340
|
+
* @typedef {import('@appium/types').Constraint} Constraint
|
|
341
|
+
* @typedef {import('@appium/types').StringRecord} StringRecord
|
|
342
|
+
* @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
|
|
343
|
+
*/
|
|
344
|
+
/**
|
|
345
|
+
* @typedef ValidateCapsOpts
|
|
346
|
+
* @property {boolean} [skipPresenceConstraint] - if true, skip the presence constraint
|
|
347
|
+
*/
|
|
348
|
+
/**
|
|
349
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
350
|
+
* @template {StringRecord|void} [Extra=void]
|
|
351
|
+
* @typedef {import('@appium/types').NSCapabilities<C, Extra>} NSCapabilities
|
|
352
|
+
*/
|
|
353
|
+
/**
|
|
354
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
355
|
+
* @template {StringRecord|void} [Extra=void]
|
|
356
|
+
* @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
|
|
357
|
+
*/
|
|
358
|
+
/**
|
|
359
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
360
|
+
* @template {StringRecord|void} [Extra=void]
|
|
361
|
+
* @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
|
|
362
|
+
*/
|
|
363
|
+
/**
|
|
364
|
+
* @template T,U
|
|
365
|
+
* @typedef {import('type-fest').Merge<T,U>} Merge
|
|
366
|
+
*/
|
|
367
|
+
/**
|
|
368
|
+
* @template T
|
|
369
|
+
* @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
|
|
370
|
+
*/
|
|
371
|
+
//# sourceMappingURL=capabilities.js.map
|