appium 3.2.2 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/appium.d.ts +147 -205
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +169 -282
- package/build/lib/appium.js.map +1 -1
- package/build/lib/bidi-commands.d.ts.map +1 -1
- package/build/lib/bidi-commands.js +11 -11
- package/build/lib/bidi-commands.js.map +1 -1
- package/build/lib/bootstrap/appium-initializer.d.ts +21 -0
- package/build/lib/bootstrap/appium-initializer.d.ts.map +1 -0
- package/build/lib/bootstrap/appium-initializer.js +146 -0
- package/build/lib/bootstrap/appium-initializer.js.map +1 -0
- package/build/lib/bootstrap/appium-main-runner.d.ts +22 -0
- package/build/lib/bootstrap/appium-main-runner.d.ts.map +1 -0
- package/build/lib/bootstrap/appium-main-runner.js +109 -0
- package/build/lib/bootstrap/appium-main-runner.js.map +1 -0
- package/build/lib/bootstrap/config-file.d.ts +37 -0
- package/build/lib/bootstrap/config-file.d.ts.map +1 -0
- package/build/lib/{config-file.js → bootstrap/config-file.js} +62 -138
- package/build/lib/bootstrap/config-file.js.map +1 -0
- package/build/lib/bootstrap/grid-v3-register.d.ts +20 -0
- package/build/lib/bootstrap/grid-v3-register.d.ts.map +1 -0
- package/build/lib/bootstrap/grid-v3-register.js +185 -0
- package/build/lib/bootstrap/grid-v3-register.js.map +1 -0
- package/build/lib/bootstrap/init-types.d.ts +16 -0
- package/build/lib/bootstrap/init-types.d.ts.map +1 -0
- package/build/lib/bootstrap/init-types.js +3 -0
- package/build/lib/bootstrap/init-types.js.map +1 -0
- package/build/lib/bootstrap/main-helpers.d.ts +55 -0
- package/build/lib/bootstrap/main-helpers.d.ts.map +1 -0
- package/build/lib/bootstrap/main-helpers.js +187 -0
- package/build/lib/bootstrap/main-helpers.js.map +1 -0
- package/build/lib/bootstrap/node-helpers.d.ts +32 -0
- package/build/lib/bootstrap/node-helpers.d.ts.map +1 -0
- package/build/lib/bootstrap/node-helpers.js +201 -0
- package/build/lib/bootstrap/node-helpers.js.map +1 -0
- package/build/lib/bootstrap/startup-config.d.ts +22 -0
- package/build/lib/bootstrap/startup-config.d.ts.map +1 -0
- package/build/lib/bootstrap/startup-config.js +111 -0
- package/build/lib/bootstrap/startup-config.js.map +1 -0
- package/build/lib/cli/args.d.ts +16 -12
- package/build/lib/cli/args.d.ts.map +1 -1
- package/build/lib/cli/args.js +20 -40
- package/build/lib/cli/args.js.map +1 -1
- package/build/lib/cli/driver-command.d.ts +51 -93
- package/build/lib/cli/driver-command.d.ts.map +1 -1
- package/build/lib/cli/driver-command.js +11 -66
- package/build/lib/cli/driver-command.js.map +1 -1
- package/build/lib/cli/extension-command.d.ts +173 -377
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +387 -656
- package/build/lib/cli/extension-command.js.map +1 -1
- package/build/lib/cli/extension.d.ts +10 -15
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +15 -33
- package/build/lib/cli/extension.js.map +1 -1
- package/build/lib/cli/parser.d.ts +37 -66
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +69 -104
- package/build/lib/cli/parser.js.map +1 -1
- package/build/lib/cli/plugin-command.d.ts +50 -90
- package/build/lib/cli/plugin-command.d.ts.map +1 -1
- package/build/lib/cli/plugin-command.js +11 -63
- package/build/lib/cli/plugin-command.js.map +1 -1
- package/build/lib/cli/setup-command.d.ts +21 -26
- package/build/lib/cli/setup-command.d.ts.map +1 -1
- package/build/lib/cli/setup-command.js +19 -61
- package/build/lib/cli/setup-command.js.map +1 -1
- package/build/lib/cli/utils.d.ts +33 -35
- package/build/lib/cli/utils.d.ts.map +1 -1
- package/build/lib/cli/utils.js +48 -50
- package/build/lib/cli/utils.js.map +1 -1
- package/build/lib/constants.d.ts +23 -23
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +10 -15
- package/build/lib/constants.js.map +1 -1
- package/build/lib/doctor/doctor.d.ts +40 -57
- package/build/lib/doctor/doctor.d.ts.map +1 -1
- package/build/lib/doctor/doctor.js +31 -62
- package/build/lib/doctor/doctor.js.map +1 -1
- package/build/lib/extension/driver-config.d.ts +18 -77
- package/build/lib/extension/driver-config.d.ts.map +1 -1
- package/build/lib/extension/driver-config.js +37 -125
- package/build/lib/extension/driver-config.js.map +1 -1
- package/build/lib/extension/extension-config.d.ts +103 -210
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +180 -342
- package/build/lib/extension/extension-config.js.map +1 -1
- package/build/lib/extension/index.d.ts +12 -29
- package/build/lib/extension/index.d.ts.map +1 -1
- package/build/lib/extension/index.js +33 -75
- package/build/lib/extension/index.js.map +1 -1
- package/build/lib/extension/manifest-migrations.d.ts +3 -20
- package/build/lib/extension/manifest-migrations.d.ts.map +1 -1
- package/build/lib/extension/manifest-migrations.js +20 -101
- package/build/lib/extension/manifest-migrations.js.map +1 -1
- package/build/lib/extension/manifest.d.ts +61 -107
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +181 -356
- package/build/lib/extension/manifest.js.map +1 -1
- package/build/lib/extension/package-changed.d.ts +1 -3
- package/build/lib/extension/package-changed.d.ts.map +1 -1
- package/build/lib/extension/package-changed.js +8 -15
- package/build/lib/extension/package-changed.js.map +1 -1
- package/build/lib/extension/plugin-config.d.ts +10 -52
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +11 -63
- package/build/lib/extension/plugin-config.js.map +1 -1
- package/build/lib/helpers/build.d.ts +22 -0
- package/build/lib/helpers/build.d.ts.map +1 -0
- package/build/lib/helpers/build.js +109 -0
- package/build/lib/helpers/build.js.map +1 -0
- package/build/lib/helpers/capability.d.ts +38 -0
- package/build/lib/helpers/capability.d.ts.map +1 -0
- package/build/lib/helpers/capability.js +128 -0
- package/build/lib/helpers/capability.js.map +1 -0
- package/build/lib/helpers/network.d.ts +14 -0
- package/build/lib/helpers/network.d.ts.map +1 -0
- package/build/lib/helpers/network.js +35 -0
- package/build/lib/helpers/network.js.map +1 -0
- package/build/lib/insecure-features.js +6 -6
- package/build/lib/insecure-features.js.map +1 -1
- package/build/lib/inspector-commands.d.ts +6 -0
- package/build/lib/inspector-commands.d.ts.map +1 -1
- package/build/lib/inspector-commands.js +6 -0
- package/build/lib/inspector-commands.js.map +1 -1
- package/build/lib/logger.d.ts +2 -3
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +2 -3
- package/build/lib/logger.js.map +1 -1
- package/build/lib/logsink.d.ts +13 -22
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +48 -103
- package/build/lib/logsink.js.map +1 -1
- package/build/lib/main.d.ts +15 -58
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +25 -425
- package/build/lib/main.js.map +1 -1
- package/build/lib/schema/arg-spec.d.ts +32 -107
- package/build/lib/schema/arg-spec.d.ts.map +1 -1
- package/build/lib/schema/arg-spec.js +11 -107
- package/build/lib/schema/arg-spec.js.map +1 -1
- package/build/lib/schema/cli-args-guards.d.ts +34 -0
- package/build/lib/schema/cli-args-guards.d.ts.map +1 -0
- package/build/lib/schema/cli-args-guards.js +49 -0
- package/build/lib/schema/cli-args-guards.js.map +1 -0
- package/build/lib/schema/cli-args.d.ts +3 -15
- package/build/lib/schema/cli-args.d.ts.map +1 -1
- package/build/lib/schema/cli-args.js +17 -107
- package/build/lib/schema/cli-args.js.map +1 -1
- package/build/lib/schema/cli-transformers.d.ts +15 -12
- package/build/lib/schema/cli-transformers.d.ts.map +1 -1
- package/build/lib/schema/cli-transformers.js +15 -45
- package/build/lib/schema/cli-transformers.js.map +1 -1
- package/build/lib/schema/format-errors.d.ts +28 -0
- package/build/lib/schema/format-errors.d.ts.map +1 -0
- package/build/lib/schema/format-errors.js +29 -0
- package/build/lib/schema/format-errors.js.map +1 -0
- package/build/lib/schema/index.d.ts +4 -2
- package/build/lib/schema/index.d.ts.map +1 -1
- package/build/lib/schema/index.js +2 -0
- package/build/lib/schema/index.js.map +1 -1
- package/build/lib/schema/keywords.d.ts +12 -20
- package/build/lib/schema/keywords.d.ts.map +1 -1
- package/build/lib/schema/keywords.js +6 -51
- package/build/lib/schema/keywords.js.map +1 -1
- package/build/lib/schema/schema.d.ts +106 -231
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +88 -358
- package/build/lib/schema/schema.js.map +1 -1
- package/build/lib/utils.d.ts +7 -267
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +10 -409
- package/build/lib/utils.js.map +1 -1
- package/lib/{appium.js → appium.ts} +297 -341
- package/lib/bidi-commands.ts +10 -14
- package/lib/bootstrap/appium-initializer.ts +212 -0
- package/lib/bootstrap/appium-main-runner.ts +172 -0
- package/lib/bootstrap/config-file.ts +178 -0
- package/lib/bootstrap/grid-v3-register.ts +250 -0
- package/lib/bootstrap/init-types.ts +31 -0
- package/lib/bootstrap/main-helpers.ts +223 -0
- package/lib/bootstrap/node-helpers.ts +180 -0
- package/lib/bootstrap/startup-config.ts +143 -0
- package/lib/cli/{args.js → args.ts} +45 -56
- package/lib/cli/driver-command.ts +122 -0
- package/lib/cli/{extension-command.js → extension-command.ts} +827 -906
- package/lib/cli/extension.ts +65 -0
- package/lib/cli/{parser.js → parser.ts} +93 -116
- package/lib/cli/plugin-command.ts +117 -0
- package/lib/cli/{setup-command.js → setup-command.ts} +59 -74
- package/lib/cli/utils.ts +97 -0
- package/lib/{constants.js → constants.ts} +30 -41
- package/lib/doctor/{doctor.js → doctor.ts} +82 -92
- package/lib/extension/driver-config.ts +165 -0
- package/lib/extension/{extension-config.js → extension-config.ts} +291 -405
- package/lib/extension/index.ts +143 -0
- package/lib/extension/manifest-migrations.ts +57 -0
- package/lib/extension/manifest.ts +369 -0
- package/lib/extension/{package-changed.js → package-changed.ts} +9 -18
- package/lib/extension/plugin-config.ts +62 -0
- package/lib/helpers/build.ts +111 -0
- package/lib/helpers/capability.ts +171 -0
- package/lib/helpers/network.ts +30 -0
- package/lib/insecure-features.ts +1 -1
- package/lib/inspector-commands.ts +6 -1
- package/lib/{logger.js → logger.ts} +1 -2
- package/lib/{logsink.js → logsink.ts} +91 -137
- package/lib/main.ts +60 -0
- package/lib/schema/arg-spec.ts +131 -0
- package/lib/schema/cli-args-guards.ts +67 -0
- package/lib/schema/cli-args.ts +171 -0
- package/lib/schema/cli-transformers.ts +83 -0
- package/lib/schema/format-errors.ts +43 -0
- package/lib/schema/index.ts +4 -0
- package/lib/schema/keywords.ts +96 -0
- package/lib/schema/schema.ts +448 -0
- package/lib/utils.ts +73 -0
- package/package.json +17 -18
- package/scripts/autoinstall-extensions.js +3 -0
- package/build/lib/config-file.d.ts +0 -100
- package/build/lib/config-file.d.ts.map +0 -1
- package/build/lib/config-file.js.map +0 -1
- package/build/lib/config.d.ts +0 -70
- package/build/lib/config.d.ts.map +0 -1
- package/build/lib/config.js +0 -390
- package/build/lib/config.js.map +0 -1
- package/build/lib/grid-register.d.ts +0 -10
- package/build/lib/grid-register.d.ts.map +0 -1
- package/build/lib/grid-register.js +0 -134
- package/build/lib/grid-register.js.map +0 -1
- package/lib/cli/driver-command.js +0 -174
- package/lib/cli/extension.js +0 -74
- package/lib/cli/plugin-command.js +0 -164
- package/lib/cli/utils.js +0 -91
- package/lib/config-file.js +0 -228
- package/lib/config.js +0 -389
- package/lib/extension/driver-config.js +0 -245
- package/lib/extension/index.js +0 -169
- package/lib/extension/manifest-migrations.js +0 -136
- package/lib/extension/manifest.js +0 -550
- package/lib/extension/plugin-config.js +0 -112
- package/lib/grid-register.js +0 -146
- package/lib/main.js +0 -545
- package/lib/schema/arg-spec.js +0 -229
- package/lib/schema/cli-args.js +0 -254
- package/lib/schema/cli-transformers.js +0 -113
- package/lib/schema/index.js +0 -2
- package/lib/schema/keywords.js +0 -136
- package/lib/schema/schema.js +0 -725
- package/lib/utils.js +0 -512
package/build/lib/utils.js
CHANGED
|
@@ -3,178 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getAppiumModuleRoot = exports.
|
|
7
|
-
exports.makeNonW3cCapsError = makeNonW3cCapsError;
|
|
8
|
-
exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
|
|
9
|
-
exports.insertAppiumPrefixes = insertAppiumPrefixes;
|
|
10
|
-
exports.removeAppiumPrefixes = removeAppiumPrefixes;
|
|
11
|
-
exports.getPackageVersion = getPackageVersion;
|
|
12
|
-
exports.adjustNodePath = adjustNodePath;
|
|
13
|
-
exports.pullSettings = pullSettings;
|
|
14
|
-
exports.isServerCommandArgs = isServerCommandArgs;
|
|
15
|
-
exports.isSetupCommandArgs = isSetupCommandArgs;
|
|
16
|
-
exports.isExtensionCommandArgs = isExtensionCommandArgs;
|
|
17
|
-
exports.isDriverCommandArgs = isDriverCommandArgs;
|
|
18
|
-
exports.isPluginCommandArgs = isPluginCommandArgs;
|
|
19
|
-
exports.fetchInterfaces = fetchInterfaces;
|
|
6
|
+
exports.getAppiumModuleRoot = exports.npmPackage = void 0;
|
|
20
7
|
exports.adler32 = adler32;
|
|
21
|
-
exports.isBroadcastIp = isBroadcastIp;
|
|
22
8
|
const lodash_1 = __importDefault(require("lodash"));
|
|
23
|
-
const logger_1 = __importDefault(require("./logger"));
|
|
24
|
-
const base_driver_1 = require("@appium/base-driver");
|
|
25
|
-
const node_util_1 = require("node:util");
|
|
26
9
|
const support_1 = require("@appium/support");
|
|
27
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
28
|
-
const constants_1 = require("./constants");
|
|
29
|
-
const node_os_1 = __importDefault(require("node:os"));
|
|
30
|
-
const W3C_APPIUM_PREFIX = 'appium';
|
|
31
|
-
const STANDARD_CAPS_LOWERCASE = new Set([...base_driver_1.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
|
|
32
|
-
exports.V4_BROADCAST_IP = '0.0.0.0';
|
|
33
|
-
exports.V6_BROADCAST_IP = '::';
|
|
34
10
|
exports.npmPackage = support_1.fs.readPackageJsonFrom(__dirname);
|
|
35
11
|
/**
|
|
12
|
+
* Returns the root directory of the Appium module (memoized).
|
|
36
13
|
*
|
|
37
|
-
* If
|
|
38
|
-
*
|
|
39
|
-
* Used for tighter control over log output.
|
|
40
|
-
* @type {boolean}
|
|
41
|
-
*/
|
|
42
|
-
const isStdoutTTY = process.stdout.isTTY;
|
|
43
|
-
/**
|
|
44
|
-
* Creates an error object in case a session gets incompatible capabilities as the input.
|
|
45
|
-
*
|
|
46
|
-
* @returns {Error}
|
|
47
|
-
*/
|
|
48
|
-
function makeNonW3cCapsError() {
|
|
49
|
-
return new base_driver_1.errors.SessionNotCreatedError('Session capabilities format must comply to the W3C standard. Make sure your client is up to date. ' +
|
|
50
|
-
'See https://www.w3.org/TR/webdriver/#new-session for more details.');
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Dumps to value to the console using `info` logger.
|
|
54
|
-
*
|
|
55
|
-
* @todo May want to force color to be `false` if {@link isStdoutTTY} is `false`.
|
|
56
|
-
*/
|
|
57
|
-
exports.inspect = lodash_1.default.flow(lodash_1.default.partialRight(
|
|
58
|
-
/** @type {(object: any, options: import('util').InspectOptions) => string} */ (node_util_1.inspect), { colors: true, depth: null, compact: !isStdoutTTY }), (...args) => {
|
|
59
|
-
logger_1.default.info(...args);
|
|
60
|
-
});
|
|
61
|
-
/**
|
|
62
|
-
* Takes the caps that were provided in the request and translates them
|
|
63
|
-
* into caps that can be used by the inner drivers.
|
|
64
|
-
*
|
|
65
|
-
* @template {Constraints} C
|
|
66
|
-
* @param {W3CCapabilities<C>} w3cCapabilities
|
|
67
|
-
* @param {C} constraints
|
|
68
|
-
* @param {NSCapabilities<C>} [defaultCapabilities]
|
|
69
|
-
* @returns {ParsedDriverCaps<C>|InvalidCaps<C>}
|
|
70
|
-
*/
|
|
71
|
-
function parseCapsForInnerDriver(w3cCapabilities, constraints = /** @type {C} */ ({}), defaultCapabilities = {}) {
|
|
72
|
-
if (!(0, base_driver_1.isW3cCaps)(w3cCapabilities)) {
|
|
73
|
-
return /** @type {InvalidCaps<C>} */ ({
|
|
74
|
-
error: makeNonW3cCapsError(),
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
let desiredCaps = /** @type {ParsedDriverCaps<C>['desiredCaps']} */ ({});
|
|
78
|
-
/** @type {ParsedDriverCaps<C>['processedW3CCapabilities'] | undefined} */
|
|
79
|
-
let processedW3CCapabilities;
|
|
80
|
-
// Make sure we don't mutate the original arguments
|
|
81
|
-
w3cCapabilities = lodash_1.default.cloneDeep(w3cCapabilities);
|
|
82
|
-
defaultCapabilities = lodash_1.default.cloneDeep(defaultCapabilities);
|
|
83
|
-
if (!lodash_1.default.isEmpty(defaultCapabilities)) {
|
|
84
|
-
for (const [defaultCapKey, defaultCapValue] of lodash_1.default.toPairs(defaultCapabilities)) {
|
|
85
|
-
let isCapAlreadySet = false;
|
|
86
|
-
// Check if the key is already present in firstMatch entries
|
|
87
|
-
for (const firstMatchEntry of w3cCapabilities.firstMatch ?? []) {
|
|
88
|
-
if (lodash_1.default.isPlainObject(firstMatchEntry) &&
|
|
89
|
-
lodash_1.default.has(removeAppiumPrefixes(firstMatchEntry), removeAppiumPrefix(defaultCapKey))) {
|
|
90
|
-
isCapAlreadySet = true;
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Check if the key is already present in alwaysMatch entries
|
|
95
|
-
isCapAlreadySet =
|
|
96
|
-
isCapAlreadySet ||
|
|
97
|
-
(lodash_1.default.isPlainObject(w3cCapabilities.alwaysMatch) &&
|
|
98
|
-
lodash_1.default.has(removeAppiumPrefixes(w3cCapabilities.alwaysMatch), removeAppiumPrefix(defaultCapKey)));
|
|
99
|
-
if (isCapAlreadySet) {
|
|
100
|
-
// Skip if the key is already present in the provided caps
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
// Only add the default capability if it is not overridden
|
|
104
|
-
if (lodash_1.default.isEmpty(w3cCapabilities.firstMatch)) {
|
|
105
|
-
w3cCapabilities.firstMatch = /** @type {W3CCapabilities<C>['firstMatch']} */ ([
|
|
106
|
-
{ [defaultCapKey]: defaultCapValue },
|
|
107
|
-
]);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Call the process capabilities algorithm to find matching caps on the W3C
|
|
115
|
-
// (see: https://github.com/jlipps/simple-wd-spec#processing-capabilities)
|
|
116
|
-
try {
|
|
117
|
-
desiredCaps = (0, base_driver_1.processCapabilities)(w3cCapabilities, constraints, true);
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
logger_1.default.info(`Could not parse W3C capabilities: ${error.message}`);
|
|
121
|
-
return /** @type {InvalidCaps<C>} */ ({
|
|
122
|
-
desiredCaps,
|
|
123
|
-
processedW3CCapabilities,
|
|
124
|
-
error,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
// Create a new w3c capabilities payload that contains only the matching caps in `alwaysMatch`
|
|
128
|
-
processedW3CCapabilities = {
|
|
129
|
-
alwaysMatch: { ...insertAppiumPrefixes(desiredCaps) },
|
|
130
|
-
firstMatch: [{}],
|
|
131
|
-
};
|
|
132
|
-
return /** @type {ParsedDriverCaps<C>} */ ({
|
|
133
|
-
desiredCaps,
|
|
134
|
-
processedW3CCapabilities,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Takes a capabilities objects and prefixes capabilities with `appium:`
|
|
139
|
-
* @template {Constraints} [C={}]
|
|
140
|
-
* @param {Capabilities<C>} caps - Desired capabilities object
|
|
141
|
-
* @returns {NSCapabilities<C>}
|
|
142
|
-
*/
|
|
143
|
-
function insertAppiumPrefixes(caps) {
|
|
144
|
-
return /** @type {NSCapabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => STANDARD_CAPS_LOWERCASE.has(key.toLowerCase()) || key.includes(':')
|
|
145
|
-
? key
|
|
146
|
-
: `${W3C_APPIUM_PREFIX}:${key}`));
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* @template {Constraints} [C={}]
|
|
150
|
-
* @param {NSCapabilities<C>} caps
|
|
151
|
-
* @returns {Capabilities<C>}
|
|
152
|
-
*/
|
|
153
|
-
function removeAppiumPrefixes(caps) {
|
|
154
|
-
return /** @type {Capabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => removeAppiumPrefix(key)));
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* @param {string} key
|
|
158
|
-
* @returns {string}
|
|
159
|
-
*/
|
|
160
|
-
function removeAppiumPrefix(key) {
|
|
161
|
-
const prefix = `${W3C_APPIUM_PREFIX}:`;
|
|
162
|
-
return lodash_1.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
*
|
|
166
|
-
* @param {string} pkgName
|
|
167
|
-
* @returns {string|undefined}
|
|
168
|
-
*/
|
|
169
|
-
function getPackageVersion(pkgName) {
|
|
170
|
-
const pkgInfo = require(`${pkgName}/package.json`) || {};
|
|
171
|
-
return pkgInfo.version;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Returns the root directory of the Appium module.
|
|
175
|
-
*
|
|
176
|
-
* @returns {string} - The absolute path to the Appium module root directory.
|
|
177
|
-
* @throws {Error} - If the Appium module root cannot be determined.
|
|
14
|
+
* @throws {Error} If the appium module root cannot be determined.
|
|
178
15
|
*/
|
|
179
16
|
exports.getAppiumModuleRoot = lodash_1.default.memoize(function getAppiumModuleRoot() {
|
|
180
17
|
const selfRoot = support_1.node.getModuleRootSync('appium', __filename);
|
|
@@ -184,183 +21,13 @@ exports.getAppiumModuleRoot = lodash_1.default.memoize(function getAppiumModuleR
|
|
|
184
21
|
return selfRoot;
|
|
185
22
|
});
|
|
186
23
|
/**
|
|
187
|
-
*
|
|
188
|
-
* so CJS drivers and plugins could load their peer dependencies.
|
|
189
|
-
* Read https://nodejs.org/api/modules.html#loading-from-the-global-folders
|
|
190
|
-
* for more details.
|
|
191
|
-
*
|
|
192
|
-
* Unfortunately this hack does not work with ESM modules,
|
|
193
|
-
* @returns {void}
|
|
194
|
-
*/
|
|
195
|
-
function adjustNodePath() {
|
|
196
|
-
let appiumModuleSearchRoot;
|
|
197
|
-
try {
|
|
198
|
-
appiumModuleSearchRoot = node_path_1.default.dirname((0, exports.getAppiumModuleRoot)());
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
logger_1.default.warn(error.message);
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const refreshRequirePaths = () => {
|
|
205
|
-
try {
|
|
206
|
-
// ! This hack allows us to avoid modification of import
|
|
207
|
-
// ! statements in client modules. It uses a private API though,
|
|
208
|
-
// ! so it could break (maybe, eventually).
|
|
209
|
-
// See https://gist.github.com/branneman/8048520#7-the-hack
|
|
210
|
-
// @ts-ignore see above comment
|
|
211
|
-
require('node:module').Module._initPaths();
|
|
212
|
-
return true;
|
|
213
|
-
}
|
|
214
|
-
catch {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
if (!process.env.NODE_PATH) {
|
|
219
|
-
process.env.NODE_PATH = appiumModuleSearchRoot;
|
|
220
|
-
if (refreshRequirePaths()) {
|
|
221
|
-
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
delete process.env.NODE_PATH;
|
|
225
|
-
}
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
const nodePathParts = process.env.NODE_PATH.split(node_path_1.default.delimiter);
|
|
229
|
-
if (nodePathParts.includes(appiumModuleSearchRoot)) {
|
|
230
|
-
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
nodePathParts.push(appiumModuleSearchRoot);
|
|
234
|
-
process.env.NODE_PATH = nodePathParts.join(node_path_1.default.delimiter);
|
|
235
|
-
if (refreshRequirePaths()) {
|
|
236
|
-
process.env.APPIUM_OMIT_PEER_DEPS = '1';
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
process.env.NODE_PATH = lodash_1.default.without(nodePathParts, appiumModuleSearchRoot).join(node_path_1.default.delimiter);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Pulls the initial values of Appium settings from the given capabilities argument.
|
|
244
|
-
* Each setting item must satisfy the following format:
|
|
245
|
-
* `settings[setting_name]: setting_value`
|
|
246
|
-
* or
|
|
247
|
-
* ```
|
|
248
|
-
* settings = {
|
|
249
|
-
* setting_name1: 'setting_value1',
|
|
250
|
-
* setting_name2: 'setting_value2',
|
|
251
|
-
* }
|
|
252
|
-
* ```
|
|
253
|
-
* The capabilities argument itself gets mutated, so it does not contain parsed
|
|
254
|
-
* settings anymore to avoid further parsing issues.
|
|
255
|
-
* Check
|
|
256
|
-
* https://appium.io/docs/en/latest/guides/settings/
|
|
257
|
-
* for more details on the available settings.
|
|
258
|
-
*
|
|
259
|
-
* @param {?Object} caps - Capabilities dictionary. It is mutated if
|
|
260
|
-
* one or more settings have been pulled from it
|
|
261
|
-
* @return {Object} - An empty dictionary if the given caps contains no
|
|
262
|
-
* setting items or a dictionary containing parsed Appium setting names along with
|
|
263
|
-
* their values.
|
|
264
|
-
*/
|
|
265
|
-
function pullSettings(caps) {
|
|
266
|
-
if (!lodash_1.default.isPlainObject(caps) || lodash_1.default.isEmpty(caps)) {
|
|
267
|
-
return {};
|
|
268
|
-
}
|
|
269
|
-
const result = {};
|
|
270
|
-
const singleSettings = {};
|
|
271
|
-
for (const [key, value] of lodash_1.default.toPairs(caps)) {
|
|
272
|
-
let match;
|
|
273
|
-
if (/^(s|appium:s)ettings$/.test(key) && lodash_1.default.isPlainObject(value)) {
|
|
274
|
-
Object.assign(result, value);
|
|
275
|
-
delete caps[key];
|
|
276
|
-
}
|
|
277
|
-
else if ((match = /^(s|appium:s)ettings\[(\S+)\]$/.exec(key))) {
|
|
278
|
-
singleSettings[match[2]] = value;
|
|
279
|
-
delete caps[key];
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (!lodash_1.default.isEmpty(singleSettings)) {
|
|
283
|
-
Object.assign(result, singleSettings);
|
|
284
|
-
}
|
|
285
|
-
return result;
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* @template {CliCommand} [Cmd=ServerCommand]
|
|
289
|
-
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
290
|
-
* @param {Args<Cmd, SubCmd>} args
|
|
291
|
-
* @returns {args is Args<ServerCommand>}
|
|
292
|
-
*/
|
|
293
|
-
function isServerCommandArgs(args) {
|
|
294
|
-
return args.subcommand === constants_1.SERVER_SUBCOMMAND;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* @template {CliCommand} Cmd
|
|
298
|
-
* @template {CliExtensionSubcommand|CliCommandSetupSubcommand|void} [SubCmd=void]
|
|
299
|
-
* @param {Args<Cmd, SubCmd>} args
|
|
300
|
-
* @returns {args is Args<SetupCommand>}
|
|
301
|
-
*/
|
|
302
|
-
function isSetupCommandArgs(args) {
|
|
303
|
-
return args.subcommand === constants_1.SETUP_SUBCOMMAND;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* @template {CliCommand} [Cmd=ServerCommand]
|
|
307
|
-
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
308
|
-
* @param {Args<Cmd, SubCmd>} args
|
|
309
|
-
* @returns {args is Args<CliExtensionCommand, SubCmd>}
|
|
310
|
-
*/
|
|
311
|
-
function isExtensionCommandArgs(args) {
|
|
312
|
-
return args.subcommand === constants_1.DRIVER_TYPE || args.subcommand === constants_1.PLUGIN_TYPE;
|
|
313
|
-
}
|
|
314
|
-
/**
|
|
315
|
-
* @template {CliCommand} Cmd
|
|
316
|
-
* @template {CliExtensionSubcommand} SubCmd
|
|
317
|
-
* @param {Args<Cmd, SubCmd>} args
|
|
318
|
-
* @returns {args is Args<DriverCommand, SubCmd>}
|
|
319
|
-
*/
|
|
320
|
-
function isDriverCommandArgs(args) {
|
|
321
|
-
return args.subcommand === constants_1.DRIVER_TYPE;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* @template {CliCommand} Cmd
|
|
325
|
-
* @template {CliExtensionSubcommand} SubCmd
|
|
326
|
-
* @param {Args<Cmd, SubCmd>} args
|
|
327
|
-
* @returns {args is Args<PluginCommand, SubCmd>}
|
|
328
|
-
*/
|
|
329
|
-
function isPluginCommandArgs(args) {
|
|
330
|
-
return args.subcommand === constants_1.PLUGIN_TYPE;
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Fetches the list of matched network interfaces of the current host.
|
|
334
|
-
*
|
|
335
|
-
* @param {4|6|null} family Either 4 to include ipv4 addresses only,
|
|
336
|
-
* 6 to include ipv6 addresses only, or null to include all of them
|
|
337
|
-
* @returns {os.NetworkInterfaceInfo[]} The list of matched interfaces
|
|
338
|
-
*/
|
|
339
|
-
function fetchInterfaces(family = null) {
|
|
340
|
-
let familyValue = null;
|
|
341
|
-
// 'IPv4' is in Node <= 17, from 18 it's a number 4 or 6
|
|
342
|
-
if (family === 4) {
|
|
343
|
-
familyValue = [4, 'IPv4'];
|
|
344
|
-
}
|
|
345
|
-
else if (family === 6) {
|
|
346
|
-
familyValue = [6, 'IPv6'];
|
|
347
|
-
}
|
|
348
|
-
// @ts-ignore The linter does not understand the below filter
|
|
349
|
-
return lodash_1.default.flatMap(lodash_1.default.values(node_os_1.default.networkInterfaces()).filter(Boolean))
|
|
350
|
-
// @ts-ignore The linter does not understand the above filter
|
|
351
|
-
.filter(({ family }) => !familyValue || familyValue && familyValue.includes(family));
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* https://github.com/SheetJS/js-adler32
|
|
355
|
-
*
|
|
356
|
-
* @param {string} str
|
|
357
|
-
* @param {number?} [seed]
|
|
358
|
-
* @returns {number}
|
|
24
|
+
* Adler-32 checksum (see https://github.com/SheetJS/js-adler32).
|
|
359
25
|
*/
|
|
360
26
|
function adler32(str, seed = null) {
|
|
361
|
-
let a = 1, b = 0,
|
|
27
|
+
let a = 1, b = 0, M = 0, c = 0, d = 0;
|
|
28
|
+
const L = str.length;
|
|
362
29
|
if (typeof seed === 'number') {
|
|
363
|
-
a = seed &
|
|
30
|
+
a = seed & 0xffff;
|
|
364
31
|
b = seed >>> 16;
|
|
365
32
|
}
|
|
366
33
|
for (let i = 0; i < L;) {
|
|
@@ -376,7 +43,7 @@ function adler32(str, seed = null) {
|
|
|
376
43
|
--M;
|
|
377
44
|
a += 128 | (c & 63);
|
|
378
45
|
}
|
|
379
|
-
else if (c >=
|
|
46
|
+
else if (c >= 0xd800 && c < 0xe000) {
|
|
380
47
|
c = (c & 1023) + 64;
|
|
381
48
|
d = str.charCodeAt(i++) & 1023;
|
|
382
49
|
a += 240 | ((c >> 8) & 7);
|
|
@@ -402,75 +69,9 @@ function adler32(str, seed = null) {
|
|
|
402
69
|
b += a;
|
|
403
70
|
--M;
|
|
404
71
|
}
|
|
405
|
-
a =
|
|
406
|
-
b =
|
|
72
|
+
a = 15 * (a >>> 16) + (a & 65535);
|
|
73
|
+
b = 15 * (b >>> 16) + (b & 65535);
|
|
407
74
|
}
|
|
408
75
|
return ((b % 65521) << 16) | (a % 65521);
|
|
409
76
|
}
|
|
410
|
-
/**
|
|
411
|
-
* Checks if the provided address is a broadcast one.
|
|
412
|
-
*
|
|
413
|
-
* @param {string} address
|
|
414
|
-
* @returns {boolean}
|
|
415
|
-
*/
|
|
416
|
-
function isBroadcastIp(address) {
|
|
417
|
-
return [exports.V4_BROADCAST_IP, exports.V6_BROADCAST_IP, `[${exports.V6_BROADCAST_IP}]`].includes(address);
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* @typedef {import('@appium/types').StringRecord} StringRecord
|
|
421
|
-
* @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
|
|
422
|
-
*/
|
|
423
|
-
/**
|
|
424
|
-
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
425
|
-
* @typedef ParsedDriverCaps
|
|
426
|
-
* @property {Capabilities<C>} desiredCaps
|
|
427
|
-
* @property {W3CCapabilities<C>} processedW3CCapabilities
|
|
428
|
-
*/
|
|
429
|
-
/**
|
|
430
|
-
* @todo protocol is more specific
|
|
431
|
-
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
432
|
-
* @typedef InvalidCaps
|
|
433
|
-
* @property {Error} error
|
|
434
|
-
* @property {Capabilities<C>} [desiredCaps]
|
|
435
|
-
* @property {W3CCapabilities<C>} [processedW3CCapabilities]
|
|
436
|
-
*/
|
|
437
|
-
/**
|
|
438
|
-
* @template {Constraints} C
|
|
439
|
-
* @typedef {import('@appium/types').Capabilities<C>} Capabilities
|
|
440
|
-
*/
|
|
441
|
-
/**
|
|
442
|
-
* @template {Constraints} C
|
|
443
|
-
* @typedef {import('@appium/types').W3CCapabilities<C>} W3CCapabilities
|
|
444
|
-
*/
|
|
445
|
-
/**
|
|
446
|
-
* @template {Constraints} C
|
|
447
|
-
* @typedef {import('@appium/types').NSCapabilities<C>} NSCapabilities
|
|
448
|
-
*/
|
|
449
|
-
/**
|
|
450
|
-
* @template {Constraints} C
|
|
451
|
-
* @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps
|
|
452
|
-
*/
|
|
453
|
-
/**
|
|
454
|
-
* @typedef {import('@appium/types').Constraints} Constraints
|
|
455
|
-
*/
|
|
456
|
-
/**
|
|
457
|
-
* @typedef {import('appium/types').CliCommand} CliCommand
|
|
458
|
-
* @typedef {import('appium/types').CliExtensionSubcommand} CliExtensionSubcommand
|
|
459
|
-
* @typedef {import('appium/types').CliExtensionCommand} CliExtensionCommand
|
|
460
|
-
* @typedef {import('appium/types').CliCommandSetupSubcommand} CliCommandSetupSubcommand
|
|
461
|
-
* @typedef {import('appium/types').CliCommandServer} ServerCommand
|
|
462
|
-
* @typedef {import('appium/types').CliCommandDriver} DriverCommand
|
|
463
|
-
* @typedef {import('appium/types').CliCommandPlugin} PluginCommand
|
|
464
|
-
* @typedef {import('appium/types').CliCommandSetup} SetupCommand
|
|
465
|
-
*/
|
|
466
|
-
/**
|
|
467
|
-
* @template {CliCommand} [Cmd=ServerCommand]
|
|
468
|
-
* @template {CliExtensionSubcommand|CliCommandSetupSubcommand|void} [SubCmd=void]
|
|
469
|
-
* @typedef {import('appium/types').Args<Cmd, SubCmd>} Args
|
|
470
|
-
*/
|
|
471
|
-
/**
|
|
472
|
-
* @template {CliCommand} [Cmd=ServerCommand]
|
|
473
|
-
* @template {CliExtensionSubcommand|CliCommandSetupSubcommand|void} [SubCmd=void]
|
|
474
|
-
* @typedef {import('appium/types').ParsedArgs<Cmd, SubCmd>} ParsedArgs
|
|
475
|
-
*/
|
|
476
77
|
//# sourceMappingURL=utils.js.map
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"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"}
|