appium 2.0.0-beta.45 → 2.0.0-beta.47

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.
Files changed (138) hide show
  1. package/README.md +145 -44
  2. package/build/lib/appium.d.ts +3 -103
  3. package/build/lib/appium.d.ts.map +1 -1
  4. package/build/lib/appium.js +679 -549
  5. package/build/lib/appium.js.map +1 -1
  6. package/build/lib/cli/args.js +247 -127
  7. package/build/lib/cli/args.js.map +1 -1
  8. package/build/lib/cli/driver-command.js +63 -88
  9. package/build/lib/cli/driver-command.js.map +1 -1
  10. package/build/lib/cli/extension-command.d.ts +32 -23
  11. package/build/lib/cli/extension-command.d.ts.map +1 -1
  12. package/build/lib/cli/extension-command.js +730 -512
  13. package/build/lib/cli/extension-command.js.map +1 -1
  14. package/build/lib/cli/extension.d.ts +5 -4
  15. package/build/lib/cli/extension.d.ts.map +1 -1
  16. package/build/lib/cli/extension.js +68 -65
  17. package/build/lib/cli/extension.js.map +1 -1
  18. package/build/lib/cli/parser.d.ts +3 -3
  19. package/build/lib/cli/parser.d.ts.map +1 -1
  20. package/build/lib/cli/parser.js +234 -192
  21. package/build/lib/cli/parser.js.map +1 -1
  22. package/build/lib/cli/plugin-command.js +58 -87
  23. package/build/lib/cli/plugin-command.js.map +1 -1
  24. package/build/lib/cli/utils.js +66 -69
  25. package/build/lib/cli/utils.js.map +1 -1
  26. package/build/lib/config-file.d.ts.map +1 -1
  27. package/build/lib/config-file.js +189 -120
  28. package/build/lib/config-file.js.map +1 -1
  29. package/build/lib/config.d.ts.map +1 -1
  30. package/build/lib/config.js +254 -213
  31. package/build/lib/config.js.map +1 -1
  32. package/build/lib/constants.d.ts +5 -5
  33. package/build/lib/constants.d.ts.map +1 -1
  34. package/build/lib/constants.js +64 -59
  35. package/build/lib/constants.js.map +1 -1
  36. package/build/lib/extension/driver-config.js +199 -164
  37. package/build/lib/extension/driver-config.js.map +1 -1
  38. package/build/lib/extension/extension-config.d.ts +18 -16
  39. package/build/lib/extension/extension-config.d.ts.map +1 -1
  40. package/build/lib/extension/extension-config.js +523 -396
  41. package/build/lib/extension/extension-config.js.map +1 -1
  42. package/build/lib/extension/index.js +98 -68
  43. package/build/lib/extension/index.js.map +1 -1
  44. package/build/lib/extension/manifest-migrations.d.ts +27 -0
  45. package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
  46. package/build/lib/extension/manifest-migrations.js +99 -0
  47. package/build/lib/extension/manifest-migrations.js.map +1 -0
  48. package/build/lib/extension/manifest.d.ts +7 -56
  49. package/build/lib/extension/manifest.d.ts.map +1 -1
  50. package/build/lib/extension/manifest.js +432 -240
  51. package/build/lib/extension/manifest.js.map +1 -1
  52. package/build/lib/extension/package-changed.js +57 -61
  53. package/build/lib/extension/package-changed.js.map +1 -1
  54. package/build/lib/extension/plugin-config.d.ts +2 -3
  55. package/build/lib/extension/plugin-config.d.ts.map +1 -1
  56. package/build/lib/extension/plugin-config.js +94 -70
  57. package/build/lib/extension/plugin-config.js.map +1 -1
  58. package/build/lib/grid-register.js +119 -137
  59. package/build/lib/grid-register.js.map +1 -1
  60. package/build/lib/logger.d.ts +1 -1
  61. package/build/lib/logger.d.ts.map +1 -1
  62. package/build/lib/logger.js +5 -15
  63. package/build/lib/logger.js.map +1 -1
  64. package/build/lib/logsink.d.ts.map +1 -1
  65. package/build/lib/logsink.js +189 -183
  66. package/build/lib/logsink.js.map +1 -1
  67. package/build/lib/main.d.ts +19 -12
  68. package/build/lib/main.d.ts.map +1 -1
  69. package/build/lib/main.js +330 -304
  70. package/build/lib/main.js.map +1 -1
  71. package/build/lib/schema/arg-spec.js +153 -108
  72. package/build/lib/schema/arg-spec.js.map +1 -1
  73. package/build/lib/schema/cli-args.js +203 -164
  74. package/build/lib/schema/cli-args.js.map +1 -1
  75. package/build/lib/schema/cli-transformers.js +117 -72
  76. package/build/lib/schema/cli-transformers.js.map +1 -1
  77. package/build/lib/schema/index.js +17 -32
  78. package/build/lib/schema/index.js.map +1 -1
  79. package/build/lib/schema/keywords.js +125 -67
  80. package/build/lib/schema/keywords.js.map +1 -1
  81. package/build/lib/schema/schema.d.ts.map +1 -1
  82. package/build/lib/schema/schema.js +582 -417
  83. package/build/lib/schema/schema.js.map +1 -1
  84. package/build/lib/utils.d.ts +41 -255
  85. package/build/lib/utils.d.ts.map +1 -1
  86. package/build/lib/utils.js +342 -193
  87. package/build/lib/utils.js.map +1 -1
  88. package/build/tsconfig.tsbuildinfo +1 -1
  89. package/build/types/cli.d.ts +45 -34
  90. package/build/types/cli.d.ts.map +1 -1
  91. package/build/types/cli.js +3 -0
  92. package/build/types/cli.js.map +1 -0
  93. package/build/types/index.d.ts +1 -2
  94. package/build/types/index.d.ts.map +1 -1
  95. package/build/types/index.js +19 -0
  96. package/build/types/index.js.map +1 -0
  97. package/build/types/manifest/base.d.ts +135 -0
  98. package/build/types/manifest/base.d.ts.map +1 -0
  99. package/build/types/manifest/base.js +3 -0
  100. package/build/types/manifest/base.js.map +1 -0
  101. package/build/types/manifest/index.d.ts +19 -0
  102. package/build/types/manifest/index.d.ts.map +1 -0
  103. package/build/types/manifest/index.js +40 -0
  104. package/build/types/manifest/index.js.map +1 -0
  105. package/build/types/manifest/v3.d.ts +139 -0
  106. package/build/types/manifest/v3.d.ts.map +1 -0
  107. package/build/types/manifest/v3.js +3 -0
  108. package/build/types/manifest/v3.js.map +1 -0
  109. package/lib/appium.js +1 -1
  110. package/lib/cli/args.js +1 -1
  111. package/lib/cli/extension-command.js +116 -61
  112. package/lib/cli/extension.js +9 -8
  113. package/lib/cli/parser.js +2 -2
  114. package/lib/config-file.js +2 -3
  115. package/lib/config.js +3 -2
  116. package/lib/constants.js +6 -5
  117. package/lib/extension/extension-config.js +24 -25
  118. package/lib/extension/manifest-migrations.js +99 -0
  119. package/lib/extension/manifest.js +79 -72
  120. package/lib/extension/plugin-config.js +1 -2
  121. package/lib/logsink.js +26 -5
  122. package/lib/main.js +58 -50
  123. package/lib/schema/schema.js +6 -1
  124. package/lib/utils.js +62 -0
  125. package/package.json +23 -24
  126. package/scripts/autoinstall-extensions.js +78 -26
  127. package/types/cli.ts +81 -42
  128. package/types/index.ts +1 -2
  129. package/types/manifest/README.md +30 -0
  130. package/types/manifest/base.ts +158 -0
  131. package/types/manifest/index.ts +27 -0
  132. package/types/manifest/v3.ts +161 -0
  133. package/build/types/appium-manifest.d.ts +0 -59
  134. package/build/types/appium-manifest.d.ts.map +0 -1
  135. package/build/types/extension-manifest.d.ts +0 -55
  136. package/build/types/extension-manifest.d.ts.map +0 -1
  137. package/types/appium-manifest.ts +0 -73
  138. package/types/extension-manifest.ts +0 -64
@@ -1,224 +1,373 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.adjustNodePath = adjustNodePath;
7
- exports.getPackageVersion = getPackageVersion;
8
- exports.insertAppiumPrefixes = insertAppiumPrefixes;
9
- exports.inspect = void 0;
10
- exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
11
- exports.pullSettings = pullSettings;
12
- exports.removeAppiumPrefixes = removeAppiumPrefixes;
13
-
14
- require("source-map-support/register");
15
-
16
- var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
- var _logger = _interopRequireDefault(require("./logger"));
19
-
20
- var _baseDriver = require("@appium/base-driver");
21
-
22
- var _util = require("util");
23
-
24
- var _support = require("@appium/support");
25
-
26
- var _path = _interopRequireDefault(require("path"));
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
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");
30
14
  const W3C_APPIUM_PREFIX = 'appium';
31
- const STANDARD_CAPS_LOWERCASE = new Set([..._baseDriver.STANDARD_CAPS].map(cap => cap.toLowerCase()));
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
+ */
32
23
  const isStdoutTTY = process.stdout.isTTY;
33
-
34
- const inspect = _lodash.default.flow(_lodash.default.partialRight(_util.inspect, {
35
- colors: true,
36
- depth: null,
37
- compact: !isStdoutTTY
38
- }), (...args) => {
39
- _logger.default.info(...args);
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);
40
32
  });
41
-
42
33
  exports.inspect = inspect;
43
-
44
- function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = {}, defaultCapabilities = {}) {
45
- const hasW3CCaps = _lodash.default.isPlainObject(w3cCapabilities) && (_lodash.default.has(w3cCapabilities, 'alwaysMatch') || _lodash.default.has(w3cCapabilities, 'firstMatch'));
46
-
47
- const hasJSONWPCaps = _lodash.default.isPlainObject(jsonwpCapabilities);
48
-
49
- let desiredCaps = {};
50
- let processedW3CCapabilities;
51
- let processedJsonwpCapabilities;
52
-
53
- if (!hasW3CCaps) {
54
- return {
55
- protocol: _baseDriver.PROTOCOLS.W3C,
56
- error: new Error('W3C capabilities should be provided')
57
- };
58
- }
59
-
60
- const {
61
- W3C
62
- } = _baseDriver.PROTOCOLS;
63
- const protocol = W3C;
64
- jsonwpCapabilities = _lodash.default.cloneDeep(jsonwpCapabilities);
65
- w3cCapabilities = _lodash.default.cloneDeep(w3cCapabilities);
66
- defaultCapabilities = _lodash.default.cloneDeep(defaultCapabilities);
67
-
68
- if (!_lodash.default.isEmpty(defaultCapabilities)) {
69
- if (hasW3CCaps) {
70
- for (const [defaultCapKey, defaultCapValue] of _lodash.default.toPairs(defaultCapabilities)) {
71
- let isCapAlreadySet = false;
72
-
73
- for (const firstMatchEntry of w3cCapabilities.firstMatch ?? []) {
74
- if (_lodash.default.isPlainObject(firstMatchEntry) && _lodash.default.has(removeAppiumPrefixes(firstMatchEntry), removeAppiumPrefix(defaultCapKey))) {
75
- isCapAlreadySet = true;
76
- break;
77
- }
78
- }
79
-
80
- isCapAlreadySet = isCapAlreadySet || _lodash.default.isPlainObject(w3cCapabilities.alwaysMatch) && _lodash.default.has(removeAppiumPrefixes(w3cCapabilities.alwaysMatch), removeAppiumPrefix(defaultCapKey));
81
-
82
- if (isCapAlreadySet) {
83
- continue;
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
+ });
61
+ }
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
+ }
84
99
  }
85
-
86
- if (_lodash.default.isEmpty(w3cCapabilities.firstMatch)) {
87
- w3cCapabilities.firstMatch = [{
88
- [defaultCapKey]: defaultCapValue
89
- }];
90
- } else {
91
- w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
100
+ if (hasJSONWPCaps) {
101
+ jsonwpCapabilities = {
102
+ ...removeAppiumPrefixes(defaultCapabilities),
103
+ ...jsonwpCapabilities,
104
+ };
92
105
  }
93
- }
94
106
  }
95
-
107
+ // Get MJSONWP caps
96
108
  if (hasJSONWPCaps) {
97
- jsonwpCapabilities = { ...removeAppiumPrefixes(defaultCapabilities),
98
- ...jsonwpCapabilities
99
- };
109
+ processedJsonwpCapabilities = { ...jsonwpCapabilities };
100
110
  }
101
- }
102
-
103
- if (hasJSONWPCaps) {
104
- processedJsonwpCapabilities = { ...jsonwpCapabilities
105
- };
106
- }
107
-
108
- if (hasW3CCaps) {
109
- try {
110
- desiredCaps = (0, _baseDriver.processCapabilities)(w3cCapabilities, constraints, true);
111
- } catch (error) {
112
- _logger.default.info(`Could not parse W3C capabilities: ${error.message}`);
113
-
114
- return {
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: [{}],
132
+ };
133
+ }
134
+ return /** @type {ParsedDriverCaps<C,J>} */ ({
115
135
  desiredCaps,
116
136
  processedJsonwpCapabilities,
117
137
  processedW3CCapabilities,
118
138
  protocol,
119
- error
120
- };
121
- }
122
-
123
- processedW3CCapabilities = {
124
- alwaysMatch: { ...insertAppiumPrefixes(desiredCaps)
125
- },
126
- firstMatch: [{}]
127
- };
128
- }
129
-
130
- return {
131
- desiredCaps,
132
- processedJsonwpCapabilities,
133
- processedW3CCapabilities,
134
- protocol
135
- };
139
+ });
136
140
  }
137
-
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
+ */
138
148
  function insertAppiumPrefixes(caps) {
139
- return _lodash.default.mapKeys(caps, (_, key) => STANDARD_CAPS_LOWERCASE.has(key.toLowerCase()) || key.includes(':') ? key : `${W3C_APPIUM_PREFIX}:${key}`);
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}`));
140
152
  }
141
-
153
+ exports.insertAppiumPrefixes = insertAppiumPrefixes;
154
+ /**
155
+ * @template {Constraints} [C={}]
156
+ * @param {NSCapabilities<C>} caps
157
+ * @returns {Capabilities<C>}
158
+ */
142
159
  function removeAppiumPrefixes(caps) {
143
- return _lodash.default.mapKeys(caps, (_, key) => removeAppiumPrefix(key));
160
+ return /** @type {Capabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => removeAppiumPrefix(key)));
144
161
  }
145
-
162
+ exports.removeAppiumPrefixes = removeAppiumPrefixes;
163
+ /**
164
+ * @param {string} key
165
+ * @returns {string}
166
+ */
146
167
  function removeAppiumPrefix(key) {
147
- const prefix = `${W3C_APPIUM_PREFIX}:`;
148
- return _lodash.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
168
+ const prefix = `${W3C_APPIUM_PREFIX}:`;
169
+ return lodash_1.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
149
170
  }
150
-
171
+ /**
172
+ *
173
+ * @param {string} pkgName
174
+ * @returns {string|undefined}
175
+ */
151
176
  function getPackageVersion(pkgName) {
152
- const pkgInfo = require(`${pkgName}/package.json`) || {};
153
- return pkgInfo.version;
177
+ const pkgInfo = require(`${pkgName}/package.json`) || {};
178
+ return pkgInfo.version;
154
179
  }
155
-
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
+ */
156
188
  function adjustNodePath() {
157
- const selfRoot = _support.node.getModuleRootSync('appium', __filename);
158
-
159
- if (!selfRoot || _path.default.dirname(selfRoot).length >= selfRoot.length) {
160
- return;
161
- }
162
-
163
- const nodeModulesRoot = _path.default.dirname(selfRoot);
164
-
165
- const refreshRequirePaths = () => {
166
- try {
167
- require('module').Module._initPaths();
168
-
169
- return true;
170
- } catch (e) {
171
- return false;
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;
172
222
  }
173
- };
174
-
175
- if (!process.env.NODE_PATH) {
176
- process.env.NODE_PATH = nodeModulesRoot;
177
-
223
+ nodePathParts.push(nodeModulesRoot);
224
+ process.env.NODE_PATH = nodePathParts.join(path_1.default.delimiter);
178
225
  if (refreshRequirePaths()) {
179
- process.env.APPIUM_OMIT_PEER_DEPS = '1';
180
- } else {
181
- delete process.env.NODE_PATH;
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);
182
230
  }
183
-
184
- return;
185
- }
186
-
187
- const nodePathParts = process.env.NODE_PATH.split(_path.default.delimiter);
188
-
189
- if (nodePathParts.includes(nodeModulesRoot)) {
190
- process.env.APPIUM_OMIT_PEER_DEPS = '1';
191
- return;
192
- }
193
-
194
- nodePathParts.push(nodeModulesRoot);
195
- process.env.NODE_PATH = nodePathParts.join(_path.default.delimiter);
196
-
197
- if (refreshRequirePaths()) {
198
- process.env.APPIUM_OMIT_PEER_DEPS = '1';
199
- } else {
200
- process.env.NODE_PATH = _lodash.default.without(nodePathParts, nodeModulesRoot).join(_path.default.delimiter);
201
- }
202
231
  }
203
-
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
+ */
204
249
  function pullSettings(caps) {
205
- if (!_lodash.default.isPlainObject(caps) || _lodash.default.isEmpty(caps)) {
206
- return {};
207
- }
208
-
209
- const result = {};
210
-
211
- for (const [key, value] of _lodash.default.toPairs(caps)) {
212
- const match = /\bsettings\[(\S+)\]$/.exec(key);
213
-
214
- if (!match) {
215
- continue;
250
+ if (!lodash_1.default.isPlainObject(caps) || lodash_1.default.isEmpty(caps)) {
251
+ return {};
216
252
  }
217
-
218
- result[match[1]] = value;
219
- delete caps[key];
220
- }
221
-
222
- return result;
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];
261
+ }
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;
223
303
  }
224
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsIlNUQU5EQVJEX0NBUFNfTE9XRVJDQVNFIiwiU2V0IiwiU1RBTkRBUkRfQ0FQUyIsIm1hcCIsImNhcCIsInRvTG93ZXJDYXNlIiwiaXNTdGRvdXRUVFkiLCJwcm9jZXNzIiwic3Rkb3V0IiwiaXNUVFkiLCJpbnNwZWN0IiwiXyIsImZsb3ciLCJwYXJ0aWFsUmlnaHQiLCJkdW1wIiwiY29sb3JzIiwiZGVwdGgiLCJjb21wYWN0IiwiYXJncyIsImxvZ2dlciIsImluZm8iLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiY2xvbmVEZWVwIiwiaXNFbXB0eSIsImRlZmF1bHRDYXBLZXkiLCJkZWZhdWx0Q2FwVmFsdWUiLCJ0b1BhaXJzIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZUFwcGl1bVByZWZpeGVzIiwicmVtb3ZlQXBwaXVtUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJwcm9jZXNzQ2FwYWJpbGl0aWVzIiwibWVzc2FnZSIsImluc2VydEFwcGl1bVByZWZpeGVzIiwiY2FwcyIsIm1hcEtleXMiLCJrZXkiLCJpbmNsdWRlcyIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJnZXRQYWNrYWdlVmVyc2lvbiIsInBrZ05hbWUiLCJwa2dJbmZvIiwicmVxdWlyZSIsInZlcnNpb24iLCJhZGp1c3ROb2RlUGF0aCIsInNlbGZSb290Iiwibm9kZSIsImdldE1vZHVsZVJvb3RTeW5jIiwiX19maWxlbmFtZSIsInBhdGgiLCJkaXJuYW1lIiwibm9kZU1vZHVsZXNSb290IiwicmVmcmVzaFJlcXVpcmVQYXRocyIsIk1vZHVsZSIsIl9pbml0UGF0aHMiLCJlIiwiZW52IiwiTk9ERV9QQVRIIiwiQVBQSVVNX09NSVRfUEVFUl9ERVBTIiwibm9kZVBhdGhQYXJ0cyIsInNwbGl0IiwiZGVsaW1pdGVyIiwicHVzaCIsImpvaW4iLCJ3aXRob3V0IiwicHVsbFNldHRpbmdzIiwicmVzdWx0IiwidmFsdWUiLCJtYXRjaCIsImV4ZWMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHtwcm9jZXNzQ2FwYWJpbGl0aWVzLCBQUk9UT0NPTFMsIFNUQU5EQVJEX0NBUFN9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHtpbnNwZWN0IGFzIGR1bXB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHtub2RlfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFczQ19BUFBJVU1fUFJFRklYID0gJ2FwcGl1bSc7XG5jb25zdCBTVEFOREFSRF9DQVBTX0xPV0VSQ0FTRSA9IG5ldyBTZXQoWy4uLlNUQU5EQVJEX0NBUFNdLm1hcCgoY2FwKSA9PiBjYXAudG9Mb3dlckNhc2UoKSkpO1xuXG4vKipcbiAqXG4gKiBJZiBgc3Rkb3V0YCBpcyBhIFRUWSwgdGhpcyBpcyBgdHJ1ZWAuXG4gKlxuICogVXNlZCBmb3IgdGlnaHRlciBjb250cm9sIG92ZXIgbG9nIG91dHB1dC5cbiAqIEB0eXBlIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0ZG91dFRUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZO1xuXG4vKipcbiAqIER1bXBzIHRvIHZhbHVlIHRvIHRoZSBjb25zb2xlIHVzaW5nIGBpbmZvYCBsb2dnZXIuXG4gKlxuICogQHRvZG8gTWF5IHdhbnQgdG8gZm9yY2UgY29sb3IgdG8gYmUgYGZhbHNlYCBpZiB7QGxpbmsgaXNTdGRvdXRUVFl9IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IGluc3BlY3QgPSBfLmZsb3coXG4gIF8ucGFydGlhbFJpZ2h0KFxuICAgIC8qKiBAdHlwZSB7KG9iamVjdDogYW55LCBvcHRpb25zOiBpbXBvcnQoJ3V0aWwnKS5JbnNwZWN0T3B0aW9ucykgPT4gc3RyaW5nfSAqLyAoZHVtcCksXG4gICAge2NvbG9yczogdHJ1ZSwgZGVwdGg6IG51bGwsIGNvbXBhY3Q6ICFpc1N0ZG91dFRUWX1cbiAgKSxcbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBsb2dnZXIuaW5mbyguLi5hcmdzKTtcbiAgfVxuKTtcblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHRlbXBsYXRlIFtKPWFueV1cbiAqIEBwYXJhbSB7Sn0ganNvbndwQ2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllczxDPn0gdzNjQ2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge0N9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge05TQ2FwYWJpbGl0aWVzPEM+fSBbZGVmYXVsdENhcGFiaWxpdGllc11cbiAqIEByZXR1cm5zIHtQYXJzZWREcml2ZXJDYXBzPEMsSj58SW52YWxpZENhcHM8QyxKPn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gIGpzb253cENhcGFiaWxpdGllcyxcbiAgdzNjQ2FwYWJpbGl0aWVzLFxuICBjb25zdHJhaW50cyA9IC8qKiBAdHlwZSB7Q30gKi8gKHt9KSxcbiAgZGVmYXVsdENhcGFiaWxpdGllcyA9IHt9XG4pIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGNhbGxlciBzZW50IEpTT05XUCBjYXBzLCBXM0MgY2Fwcywgb3IgYm90aFxuICBjb25zdCBoYXNXM0NDYXBzID1cbiAgICBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IGRlc2lyZWRDYXBzID0gLyoqIEB0eXBlIHtQYXJzZWREcml2ZXJDYXBzPEM+WydkZXNpcmVkQ2FwcyddfSAqLyAoe30pO1xuICAvKiogQHR5cGUge1BhcnNlZERyaXZlckNhcHM8Qz5bJ3Byb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyddfSAqL1xuICBsZXQgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzO1xuICAvKiogQHR5cGUge1BhcnNlZERyaXZlckNhcHM8Qz5bJ3Byb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyddfSAqL1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzO1xuXG4gIGlmICghaGFzVzNDQ2Fwcykge1xuICAgIHJldHVybiAvKiogQHR5cGUge0ludmFsaWRDYXBzPEM+fSAqLyAoe1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdXM0MgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBwcm92aWRlZCcpLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qge1czQ30gPSBQUk9UT0NPTFM7XG4gIGNvbnN0IHByb3RvY29sID0gVzNDO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggPz8gW10pIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KSAmJlxuICAgICAgICAgICAgXy5oYXMocmVtb3ZlQXBwaXVtUHJlZml4ZXMoZmlyc3RNYXRjaEVudHJ5KSwgcmVtb3ZlQXBwaXVtUHJlZml4KGRlZmF1bHRDYXBLZXkpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBhbHdheXNNYXRjaCBlbnRyaWVzXG4gICAgICAgIGlzQ2FwQWxyZWFkeVNldCA9XG4gICAgICAgICAgaXNDYXBBbHJlYWR5U2V0IHx8XG4gICAgICAgICAgKF8uaXNQbGFpbk9iamVjdCh3M2NDYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2gpICYmXG4gICAgICAgICAgICBfLmhhcyhcbiAgICAgICAgICAgICAgcmVtb3ZlQXBwaXVtUHJlZml4ZXModzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKSxcbiAgICAgICAgICAgICAgcmVtb3ZlQXBwaXVtUHJlZml4KGRlZmF1bHRDYXBLZXkpXG4gICAgICAgICAgICApKTtcbiAgICAgICAgaWYgKGlzQ2FwQWxyZWFkeVNldCkge1xuICAgICAgICAgIC8vIFNraXAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHByb3ZpZGVkIGNhcHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgYWRkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdHkgaWYgaXQgaXMgbm90IG92ZXJyaWRkZW5cbiAgICAgICAgaWYgKF8uaXNFbXB0eSh3M2NDYXBhYmlsaXRpZXMuZmlyc3RNYXRjaCkpIHtcbiAgICAgICAgICB3M2NDYXBhYmlsaXRpZXMuZmlyc3RNYXRjaCA9IC8qKiBAdHlwZSB7VzNDQ2FwYWJpbGl0aWVzPEM+WydmaXJzdE1hdGNoJ119ICovIChbXG4gICAgICAgICAgICB7W2RlZmF1bHRDYXBLZXldOiBkZWZhdWx0Q2FwVmFsdWV9LFxuICAgICAgICAgIF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSB7XG4gICAgICAgIC4uLnJlbW92ZUFwcGl1bVByZWZpeGVzKGRlZmF1bHRDYXBhYmlsaXRpZXMpLFxuICAgICAgICAuLi5qc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBNSlNPTldQIGNhcHNcbiAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMgPSB7Li4uanNvbndwQ2FwYWJpbGl0aWVzfTtcbiAgfVxuXG4gIC8vIEdldCBXM0MgY2Fwc1xuICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgIC8vIENhbGwgdGhlIHByb2Nlc3MgY2FwYWJpbGl0aWVzIGFsZ29yaXRobSB0byBmaW5kIG1hdGNoaW5nIGNhcHMgb24gdGhlIFczQ1xuICAgIC8vIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qbGlwcHMvc2ltcGxlLXdkLXNwZWMjcHJvY2Vzc2luZy1jYXBhYmlsaXRpZXMpXG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmluZm8oYENvdWxkIG5vdCBwYXJzZSBXM0MgY2FwYWJpbGl0aWVzOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtJbnZhbGlkQ2FwczxDLEo+fSAqLyAoe1xuICAgICAgICBkZXNpcmVkQ2FwcyxcbiAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3M2MgY2FwYWJpbGl0aWVzIHBheWxvYWQgdGhhdCBjb250YWlucyBvbmx5IHRoZSBtYXRjaGluZyBjYXBzIGluIGBhbHdheXNNYXRjaGBcbiAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSB7XG4gICAgICBhbHdheXNNYXRjaDogey4uLmluc2VydEFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKX0sXG4gICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtQYXJzZWREcml2ZXJDYXBzPEMsSj59ICovICh7XG4gICAgZGVzaXJlZENhcHMsXG4gICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICBwcm90b2NvbCxcbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgYSBjYXBhYmlsaXRpZXMgb2JqZWN0cyBhbmQgcHJlZml4ZXMgY2FwYWJpbGl0aWVzIHdpdGggYGFwcGl1bTpgXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz17fV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPEM+fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKiBAcmV0dXJucyB7TlNDYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIGluc2VydEFwcGl1bVByZWZpeGVzKGNhcHMpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TlNDYXBhYmlsaXRpZXM8Qz59ICovIChcbiAgICBfLm1hcEtleXMoY2FwcywgKF8sIGtleSkgPT5cbiAgICAgIFNUQU5EQVJEX0NBUFNfTE9XRVJDQVNFLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkgfHwga2V5LmluY2x1ZGVzKCc6JylcbiAgICAgICAgPyBrZXlcbiAgICAgICAgOiBgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHtrZXl9YFxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz17fV1cbiAqIEBwYXJhbSB7TlNDYXBhYmlsaXRpZXM8Qz59IGNhcHNcbiAqIEByZXR1cm5zIHtDYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeGVzKGNhcHMpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FwYWJpbGl0aWVzPEM+fSAqLyAoXy5tYXBLZXlzKGNhcHMsIChfLCBrZXkpID0+IHJlbW92ZUFwcGl1bVByZWZpeChrZXkpKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4KGtleSkge1xuICBjb25zdCBwcmVmaXggPSBgJHtXM0NfQVBQSVVNX1BSRUZJWH06YDtcbiAgcmV0dXJuIF8uc3RhcnRzV2l0aChrZXksIHByZWZpeCkgPyBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpIDoga2V5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnTmFtZVxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uKHBrZ05hbWUpIHtcbiAgY29uc3QgcGtnSW5mbyA9IHJlcXVpcmUoYCR7cGtnTmFtZX0vcGFja2FnZS5qc29uYCkgfHwge307XG4gIHJldHVybiBwa2dJbmZvLnZlcnNpb247XG59XG5cbi8qKlxuICogQWRqdXN0cyBOT0RFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsXG4gKiBzbyBkcml2ZXJzIGFuZCBwbHVnaW5zIGNvdWxkIGxvYWQgdGhlaXIgcGVlciBkZXBlbmRlbmNpZXMuXG4gKiBSZWFkIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvbW9kdWxlcy5odG1sI2xvYWRpbmctZnJvbS10aGUtZ2xvYmFsLWZvbGRlcnNcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRqdXN0Tm9kZVBhdGgoKSB7XG4gIGNvbnN0IHNlbGZSb290ID0gbm9kZS5nZXRNb2R1bGVSb290U3luYygnYXBwaXVtJywgX19maWxlbmFtZSk7XG4gIGlmICghc2VsZlJvb3QgfHwgcGF0aC5kaXJuYW1lKHNlbGZSb290KS5sZW5ndGggPj0gc2VsZlJvb3QubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5vZGVNb2R1bGVzUm9vdCA9IHBhdGguZGlybmFtZShzZWxmUm9vdCk7XG5cbiAgY29uc3QgcmVmcmVzaFJlcXVpcmVQYXRocyA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gISBUaGlzIGhhY2sgYWxsb3dzIHVzIHRvIGF2b2lkIG1vZGlmaWNhdGlvbiBvZiBpbXBvcnRcbiAgICAgIC8vICEgc3RhdGVtZW50cyBpbiBjbGllbnQgbW9kdWxlcy4gSXQgdXNlcyBhIHByaXZhdGUgQVBJIHRob3VnaCxcbiAgICAgIC8vICEgc28gaXQgY291bGQgYnJlYWsgKG1heWJlLCBldmVudHVhbGx5KS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9icmFubmVtYW4vODA0ODUyMCM3LXRoZS1oYWNrXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXF1aXJlKCdtb2R1bGUnKS5Nb2R1bGUuX2luaXRQYXRocygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpZiAoIXByb2Nlc3MuZW52Lk5PREVfUEFUSCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfUEFUSCA9IG5vZGVNb2R1bGVzUm9vdDtcbiAgICBpZiAocmVmcmVzaFJlcXVpcmVQYXRocygpKSB7XG4gICAgICBwcm9jZXNzLmVudi5BUFBJVU1fT01JVF9QRUVSX0RFUFMgPSAnMSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5OT0RFX1BBVEg7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5vZGVQYXRoUGFydHMgPSBwcm9jZXNzLmVudi5OT0RFX1BBVEguc3BsaXQocGF0aC5kZWxpbWl0ZXIpO1xuICBpZiAobm9kZVBhdGhQYXJ0cy5pbmNsdWRlcyhub2RlTW9kdWxlc1Jvb3QpKSB7XG4gICAgcHJvY2Vzcy5lbnYuQVBQSVVNX09NSVRfUEVFUl9ERVBTID0gJzEnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5vZGVQYXRoUGFydHMucHVzaChub2RlTW9kdWxlc1Jvb3QpO1xuICBwcm9jZXNzLmVudi5OT0RFX1BBVEggPSBub2RlUGF0aFBhcnRzLmpvaW4ocGF0aC5kZWxpbWl0ZXIpO1xuICBpZiAocmVmcmVzaFJlcXVpcmVQYXRocygpKSB7XG4gICAgcHJvY2Vzcy5lbnYuQVBQSVVNX09NSVRfUEVFUl9ERVBTID0gJzEnO1xuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfUEFUSCA9IF8ud2l0aG91dChub2RlUGF0aFBhcnRzLCBub2RlTW9kdWxlc1Jvb3QpLmpvaW4ocGF0aC5kZWxpbWl0ZXIpO1xuICB9XG59XG5cbi8qKlxuICogUHVsbHMgdGhlIGluaXRpYWwgdmFsdWVzIG9mIEFwcGl1bSBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgYXJndW1lbnQuXG4gKiBFYWNoIHNldHRpbmcgaXRlbSBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBgc2V0dGluZ1tzZXR0aW5nX25hbWVdOiBzZXR0aW5nX3ZhbHVlYFxuICogVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCBpdHNlbGYgZ2V0cyBtdXRhdGVkLCBzbyBpdCBkb2VzIG5vdCBjb250YWluIHBhcnNlZFxuICogc2V0dGluZ3MgYW55bW9yZSB0byBhdm9pZCBmdXJ0aGVyIHBhcnNpbmcgaXNzdWVzLlxuICogQ2hlY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvc2V0dGluZ3MubWRcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGF2YWlsYWJsZSBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IGNhcHMgLSBDYXBhYmlsaXRpZXMgZGljdGlvbmFyeS4gSXQgaXMgbXV0YXRlZCBpZlxuICogb25lIG9yIG1vcmUgc2V0dGluZ3MgaGF2ZSBiZWVuIHB1bGxlZCBmcm9tIGl0XG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gQW4gZW1wdHkgZGljdGlvbmFyeSBpZiB0aGUgZ2l2ZW4gY2FwcyBjb250YWlucyBub1xuICogc2V0dGluZyBpdGVtcyBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBwYXJzZWQgQXBwaXVtIHNldHRpbmcgbmFtZXMgYWxvbmcgd2l0aFxuICogdGhlaXIgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBwdWxsU2V0dGluZ3MoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSB8fCBfLmlzRW1wdHkoY2FwcykpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXFxic2V0dGluZ3NcXFsoXFxTKylcXF0kLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IHZhbHVlO1xuICAgIGRlbGV0ZSBjYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IHtcbiAgaW5zcGVjdCxcbiAgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsXG4gIGluc2VydEFwcGl1bVByZWZpeGVzLFxuICBnZXRQYWNrYWdlVmVyc2lvbixcbiAgcHVsbFNldHRpbmdzLFxuICByZW1vdmVBcHBpdW1QcmVmaXhlcyxcbiAgYWRqdXN0Tm9kZVBhdGgsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdGVtcGxhdGUgW0o9YW55XVxuICogQHR5cGVkZWYgUGFyc2VkRHJpdmVyQ2Fwc1xuICogQHByb3BlcnR5IHtDYXBhYmlsaXRpZXM8Qz59IGRlc2lyZWRDYXBzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2xcbiAqIEBwcm9wZXJ0eSB7Sn0gW3Byb2Nlc3NlZEpzb253cENhcGFiaWxpdGllc11cbiAqIEBwcm9wZXJ0eSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSBbcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzXVxuICovXG5cbi8qKlxuICogQHRvZG8gcHJvdG9jb2wgaXMgbW9yZSBzcGVjaWZpY1xuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIFtKPWFueV1cbiAqIEB0eXBlZGVmIEludmFsaWRDYXBzXG4gKiBAcHJvcGVydHkge0Vycm9yfSBlcnJvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sXG4gKiBAcHJvcGVydHkge0NhcGFiaWxpdGllczxDPn0gW2Rlc2lyZWRDYXBzXVxuICogQHByb3BlcnR5IHtKfSBbcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzXVxuICogQHByb3BlcnR5IHtXM0NDYXBhYmlsaXRpZXM8Qz59IFtwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXNdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdGVtcGxhdGUge1N0cmluZ1JlY29yZHx2b2lkfSBbRXh0cmE9dm9pZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8QywgRXh0cmE+fSBDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllczxDLCBFeHRyYT59IFczQ0NhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuTlNDYXBhYmlsaXRpZXM8QywgRXh0cmE+fSBOU0NhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzVG9DYXBzPEM+fSBDb25zdHJhaW50c1RvQ2Fwc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlN0cmluZ0tleU9mPFQ+fSBTdHJpbmdLZXlPZlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxJQUFJQyxHQUFKLENBQVEsQ0FBQyxHQUFHQyx5QkFBSixFQUFtQkMsR0FBbkIsQ0FBd0JDLEdBQUQsSUFBU0EsR0FBRyxDQUFDQyxXQUFKLEVBQWhDLENBQVIsQ0FBaEM7QUFTQSxNQUFNQyxXQUFXLEdBQUdDLE9BQU8sQ0FBQ0MsTUFBUixDQUFlQyxLQUFuQzs7QUFPQSxNQUFNQyxPQUFPLEdBQUdDLGVBQUEsQ0FBRUMsSUFBRixD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
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').ServerCommand} ServerCommand
360
+ * @typedef {import('appium/types').DriverCommand} DriverCommand
361
+ * @typedef {import('appium/types').PluginCommand} 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