appium 2.0.0-beta.46 → 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.
- package/README.md +145 -44
- package/build/lib/appium.d.ts +3 -103
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +679 -549
- package/build/lib/appium.js.map +1 -1
- package/build/lib/cli/args.js +247 -127
- package/build/lib/cli/args.js.map +1 -1
- package/build/lib/cli/driver-command.js +63 -88
- package/build/lib/cli/driver-command.js.map +1 -1
- package/build/lib/cli/extension-command.d.ts +32 -23
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +730 -512
- package/build/lib/cli/extension-command.js.map +1 -1
- package/build/lib/cli/extension.d.ts +7 -6
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +68 -65
- package/build/lib/cli/extension.js.map +1 -1
- package/build/lib/cli/parser.d.ts +3 -3
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +234 -192
- package/build/lib/cli/parser.js.map +1 -1
- package/build/lib/cli/plugin-command.js +58 -87
- package/build/lib/cli/plugin-command.js.map +1 -1
- package/build/lib/cli/utils.js +66 -69
- package/build/lib/cli/utils.js.map +1 -1
- package/build/lib/config-file.d.ts.map +1 -1
- package/build/lib/config-file.js +189 -120
- package/build/lib/config-file.js.map +1 -1
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +254 -213
- package/build/lib/config.js.map +1 -1
- package/build/lib/constants.d.ts +5 -5
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +64 -59
- package/build/lib/constants.js.map +1 -1
- package/build/lib/extension/driver-config.js +199 -164
- package/build/lib/extension/driver-config.js.map +1 -1
- package/build/lib/extension/extension-config.d.ts +18 -16
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +523 -396
- package/build/lib/extension/extension-config.js.map +1 -1
- package/build/lib/extension/index.js +98 -68
- package/build/lib/extension/index.js.map +1 -1
- package/build/lib/extension/manifest-migrations.d.ts +27 -0
- package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
- package/build/lib/extension/manifest-migrations.js +99 -0
- package/build/lib/extension/manifest-migrations.js.map +1 -0
- package/build/lib/extension/manifest.d.ts +7 -56
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +432 -240
- package/build/lib/extension/manifest.js.map +1 -1
- package/build/lib/extension/package-changed.js +57 -61
- package/build/lib/extension/package-changed.js.map +1 -1
- package/build/lib/extension/plugin-config.d.ts +2 -3
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +94 -70
- package/build/lib/extension/plugin-config.js.map +1 -1
- package/build/lib/grid-register.js +119 -137
- package/build/lib/grid-register.js.map +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +5 -15
- package/build/lib/logger.js.map +1 -1
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +189 -183
- package/build/lib/logsink.js.map +1 -1
- package/build/lib/main.d.ts +19 -12
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +330 -304
- package/build/lib/main.js.map +1 -1
- package/build/lib/schema/arg-spec.js +153 -108
- package/build/lib/schema/arg-spec.js.map +1 -1
- package/build/lib/schema/cli-args.js +203 -164
- package/build/lib/schema/cli-args.js.map +1 -1
- package/build/lib/schema/cli-transformers.js +117 -72
- package/build/lib/schema/cli-transformers.js.map +1 -1
- package/build/lib/schema/index.js +17 -32
- package/build/lib/schema/index.js.map +1 -1
- package/build/lib/schema/keywords.js +125 -67
- package/build/lib/schema/keywords.js.map +1 -1
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +582 -417
- package/build/lib/schema/schema.js.map +1 -1
- package/build/lib/utils.d.ts +41 -255
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +342 -193
- package/build/lib/utils.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/cli.d.ts +45 -34
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/cli.js +3 -0
- package/build/types/cli.js.map +1 -0
- package/build/types/index.d.ts +1 -2
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js +19 -0
- package/build/types/index.js.map +1 -0
- package/build/types/manifest/base.d.ts +135 -0
- package/build/types/manifest/base.d.ts.map +1 -0
- package/build/types/manifest/base.js +3 -0
- package/build/types/manifest/base.js.map +1 -0
- package/build/types/manifest/index.d.ts +19 -0
- package/build/types/manifest/index.d.ts.map +1 -0
- package/build/types/manifest/index.js +40 -0
- package/build/types/manifest/index.js.map +1 -0
- package/build/types/manifest/v3.d.ts +139 -0
- package/build/types/manifest/v3.d.ts.map +1 -0
- package/build/types/manifest/v3.js +3 -0
- package/build/types/manifest/v3.js.map +1 -0
- package/lib/appium.js +1 -1
- package/lib/cli/args.js +1 -1
- package/lib/cli/extension-command.js +116 -61
- package/lib/cli/extension.js +9 -8
- package/lib/cli/parser.js +2 -2
- package/lib/config-file.js +2 -3
- package/lib/config.js +3 -2
- package/lib/constants.js +6 -5
- package/lib/extension/extension-config.js +24 -25
- package/lib/extension/manifest-migrations.js +99 -0
- package/lib/extension/manifest.js +79 -72
- package/lib/extension/plugin-config.js +1 -2
- package/lib/logsink.js +26 -5
- package/lib/main.js +58 -50
- package/lib/schema/schema.js +6 -1
- package/lib/utils.js +62 -0
- package/package.json +23 -24
- package/scripts/autoinstall-extensions.js +78 -26
- package/types/cli.ts +81 -42
- package/types/index.ts +1 -2
- package/types/manifest/README.md +30 -0
- package/types/manifest/base.ts +158 -0
- package/types/manifest/index.ts +27 -0
- package/types/manifest/v3.ts +161 -0
- package/build/types/appium-manifest.d.ts +0 -59
- package/build/types/appium-manifest.d.ts.map +0 -1
- package/build/types/extension-manifest.d.ts +0 -55
- package/build/types/extension-manifest.d.ts.map +0 -1
- package/types/appium-manifest.ts +0 -73
- package/types/extension-manifest.ts +0 -64
package/build/lib/main.js
CHANGED
|
@@ -1,336 +1,362 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
27
|
-
exports.resolveAppiumHome = void 0;
|
|
28
|
-
Object.defineProperty(exports, "validate", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
get: function () {
|
|
31
|
-
return _schema.validate;
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
require("source-map-support/register");
|
|
36
|
-
|
|
37
|
-
var _logsink = require("./logsink");
|
|
38
|
-
|
|
39
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
40
|
-
|
|
41
|
-
var _baseDriver = require("@appium/base-driver");
|
|
42
|
-
|
|
43
|
-
var _support = require("@appium/support");
|
|
44
|
-
|
|
45
|
-
var _asyncbox = require("asyncbox");
|
|
46
|
-
|
|
47
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
48
|
-
|
|
49
|
-
var _appium = require("./appium");
|
|
50
|
-
|
|
51
|
-
var _extension = require("./cli/extension");
|
|
52
|
-
|
|
53
|
-
var _parser = require("./cli/parser");
|
|
54
|
-
|
|
55
|
-
var _config = require("./config");
|
|
56
|
-
|
|
57
|
-
var _configFile = require("./config-file");
|
|
58
|
-
|
|
59
|
-
var _extension2 = require("./extension");
|
|
60
|
-
|
|
61
|
-
var _constants = require("./constants");
|
|
62
|
-
|
|
63
|
-
var _gridRegister = _interopRequireDefault(require("./grid-register"));
|
|
64
|
-
|
|
65
|
-
var _schema = require("./schema/schema");
|
|
66
|
-
|
|
67
|
-
var _utils = require("./utils");
|
|
68
|
-
|
|
69
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
70
|
-
|
|
71
|
-
const {
|
|
72
|
-
resolveAppiumHome
|
|
73
|
-
} = _support.env;
|
|
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.resolveAppiumHome = exports.init = exports.main = exports.validate = exports.getSchema = exports.finalizeSchema = exports.readConfigFile = void 0;
|
|
8
|
+
const logsink_1 = require("./logsink"); // this import needs to come first since it sets up global npmlog
|
|
9
|
+
const logger_1 = __importDefault(require("./logger")); // logger needs to remain second
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
const base_driver_1 = require("@appium/base-driver");
|
|
12
|
+
const support_1 = require("@appium/support");
|
|
13
|
+
const asyncbox_1 = require("asyncbox");
|
|
14
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
15
|
+
const appium_1 = require("./appium");
|
|
16
|
+
const extension_1 = require("./cli/extension");
|
|
17
|
+
const parser_1 = require("./cli/parser");
|
|
18
|
+
const config_1 = require("./config");
|
|
19
|
+
const config_file_1 = require("./config-file");
|
|
20
|
+
const extension_2 = require("./extension");
|
|
21
|
+
const constants_1 = require("./constants");
|
|
22
|
+
const grid_register_1 = __importDefault(require("./grid-register"));
|
|
23
|
+
const schema_1 = require("./schema/schema");
|
|
24
|
+
const utils_1 = require("./utils");
|
|
25
|
+
const { resolveAppiumHome } = support_1.env;
|
|
74
26
|
exports.resolveAppiumHome = resolveAppiumHome;
|
|
75
|
-
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param {ParsedArgs} args
|
|
30
|
+
* @param {boolean} [throwInsteadOfExit]
|
|
31
|
+
*/
|
|
76
32
|
async function preflightChecks(args, throwInsteadOfExit = false) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (args.tmpDir) {
|
|
94
|
-
await (0, _config.validateTmpDir)(args.tmpDir);
|
|
33
|
+
try {
|
|
34
|
+
(0, config_1.checkNodeOk)();
|
|
35
|
+
await (0, config_1.checkNpmOk)();
|
|
36
|
+
if (args.longStacktrace) {
|
|
37
|
+
require('longjohn').async_trace_limit = -1;
|
|
38
|
+
}
|
|
39
|
+
if (args.showBuildInfo) {
|
|
40
|
+
await (0, config_1.showBuildInfo)();
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
(0, config_1.warnNodeDeprecations)();
|
|
44
|
+
(0, schema_1.validate)(args);
|
|
45
|
+
if (args.tmpDir) {
|
|
46
|
+
await (0, config_1.validateTmpDir)(args.tmpDir);
|
|
47
|
+
}
|
|
95
48
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
49
|
+
catch (err) {
|
|
50
|
+
logger_1.default.error(err.message.red);
|
|
51
|
+
if (throwInsteadOfExit) {
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
process.exit(1);
|
|
101
55
|
}
|
|
102
|
-
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
105
56
|
}
|
|
106
|
-
|
|
57
|
+
/**
|
|
58
|
+
* @param {Args} args
|
|
59
|
+
*/
|
|
107
60
|
function logNonDefaultArgsWarning(args) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
(0, _utils.inspect)(args);
|
|
61
|
+
logger_1.default.info('Non-default server args:');
|
|
62
|
+
(0, utils_1.inspect)(args);
|
|
111
63
|
}
|
|
112
|
-
|
|
64
|
+
/**
|
|
65
|
+
* @param {Args['defaultCapabilities']} caps
|
|
66
|
+
*/
|
|
113
67
|
function logDefaultCapabilitiesWarning(caps) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
68
|
+
logger_1.default.info('Default capabilities, which will be added to each request ' +
|
|
69
|
+
'unless overridden by desired capabilities:');
|
|
70
|
+
(0, utils_1.inspect)(caps);
|
|
117
71
|
}
|
|
118
|
-
|
|
72
|
+
/**
|
|
73
|
+
* @param {ParsedArgs} args
|
|
74
|
+
*/
|
|
119
75
|
async function logStartupInfo(args) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
76
|
+
let welcome = `Welcome to Appium v${config_1.APPIUM_VER}`;
|
|
77
|
+
let appiumRev = await (0, config_1.getGitRev)();
|
|
78
|
+
if (appiumRev) {
|
|
79
|
+
welcome += ` (REV ${appiumRev})`;
|
|
80
|
+
}
|
|
81
|
+
logger_1.default.info(welcome);
|
|
82
|
+
let showArgs = (0, config_1.getNonDefaultServerArgs)(args);
|
|
83
|
+
if (lodash_1.default.size(showArgs)) {
|
|
84
|
+
logNonDefaultArgsWarning(showArgs);
|
|
85
|
+
}
|
|
86
|
+
if (!lodash_1.default.isEmpty(args.defaultCapabilities)) {
|
|
87
|
+
logDefaultCapabilitiesWarning(args.defaultCapabilities);
|
|
88
|
+
}
|
|
89
|
+
// TODO: bring back loglevel reporting below once logger is flushed out
|
|
90
|
+
// logger.info('Console LogLevel: ' + logger.transports.console.level);
|
|
91
|
+
// if (logger.transports.file) {
|
|
92
|
+
// logger.info('File LogLevel: ' + logger.transports.file.level);
|
|
93
|
+
// }
|
|
138
94
|
}
|
|
139
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Logs the address and port the server is listening on
|
|
97
|
+
* @param {string} address - Address
|
|
98
|
+
* @param {number} port - Port
|
|
99
|
+
* @returns {void}
|
|
100
|
+
*/
|
|
140
101
|
function logServerPort(address, port) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
_logger.default.info(logMessage);
|
|
102
|
+
let logMessage = `Appium REST http interface listener started on ` + `${address}:${port}`;
|
|
103
|
+
logger_1.default.info(logMessage);
|
|
144
104
|
}
|
|
145
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Gets a list of `updateServer` functions from all extensions
|
|
107
|
+
* @param {DriverNameMap} driverClasses
|
|
108
|
+
* @param {PluginNameMap} pluginClasses
|
|
109
|
+
* @returns {import('@appium/types').UpdateServerCallback[]}
|
|
110
|
+
*/
|
|
146
111
|
function getServerUpdaters(driverClasses, pluginClasses) {
|
|
147
|
-
|
|
112
|
+
return lodash_1.default.compact(lodash_1.default.map([...driverClasses.keys(), ...pluginClasses.keys()], 'updateServer'));
|
|
148
113
|
}
|
|
149
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Makes a big `MethodMap` from all the little `MethodMap`s in the extensions
|
|
116
|
+
* @param {DriverNameMap} driverClasses
|
|
117
|
+
* @param {PluginNameMap} pluginClasses
|
|
118
|
+
* @returns {import('@appium/types').MethodMap}
|
|
119
|
+
*/
|
|
150
120
|
function getExtraMethodMap(driverClasses, pluginClasses) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function areServerCommandArgs(args) {
|
|
157
|
-
return args.subcommand === _constants.SERVER_SUBCOMMAND;
|
|
121
|
+
return [...driverClasses.keys(), ...pluginClasses.keys()].reduce((map, klass) => ({
|
|
122
|
+
...map,
|
|
123
|
+
...(klass.newMethodMap ?? {}),
|
|
124
|
+
}), {});
|
|
158
125
|
}
|
|
159
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Initializes Appium, but does not start the server.
|
|
128
|
+
*
|
|
129
|
+
* Use this to get at the configuration schema.
|
|
130
|
+
*
|
|
131
|
+
* If `args` contains a non-empty `subcommand` which is not `server`, this function will return an empty object.
|
|
132
|
+
*
|
|
133
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
134
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
135
|
+
* @param {Args<Cmd, SubCmd>} [args] - Partial args (progammatic usage only)
|
|
136
|
+
* @returns {Promise<InitResult<Cmd>>}
|
|
137
|
+
* @example
|
|
138
|
+
* import {init, getSchema} from 'appium';
|
|
139
|
+
* const options = {}; // config object
|
|
140
|
+
* await init(options);
|
|
141
|
+
* const schema = getSchema(); // entire config schema including plugins and drivers
|
|
142
|
+
*/
|
|
160
143
|
async function init(args) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
144
|
+
const appiumHome = args?.appiumHome ?? (await resolveAppiumHome());
|
|
145
|
+
(0, utils_1.adjustNodePath)();
|
|
146
|
+
const { driverConfig, pluginConfig } = await (0, extension_2.loadExtensions)(appiumHome);
|
|
147
|
+
const parser = (0, parser_1.getParser)();
|
|
148
|
+
let throwInsteadOfExit = false;
|
|
149
|
+
/** @type {Args<Cmd, SubCmd>} */
|
|
150
|
+
let preConfigArgs;
|
|
151
|
+
if (args) {
|
|
152
|
+
// if we have a containing package instead of running as a CLI process,
|
|
153
|
+
// that package might not appreciate us calling 'process.exit' willy-
|
|
154
|
+
// nilly, so give it the option to have us throw instead of exit
|
|
155
|
+
if (args.throwInsteadOfExit) {
|
|
156
|
+
throwInsteadOfExit = true;
|
|
157
|
+
// but remove it since it's not a real server arg per se
|
|
158
|
+
delete args.throwInsteadOfExit;
|
|
159
|
+
}
|
|
160
|
+
preConfigArgs = { ...args, subcommand: args.subcommand ?? constants_1.SERVER_SUBCOMMAND };
|
|
175
161
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
};
|
|
180
|
-
} else {
|
|
181
|
-
preConfigArgs = parser.parseArgs();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const configResult = await (0, _configFile.readConfigFile)(preConfigArgs.configFile);
|
|
185
|
-
|
|
186
|
-
if (!_lodash.default.isEmpty(configResult.errors)) {
|
|
187
|
-
throw new Error(`Errors in config file ${configResult.filepath}:\n ${configResult.reason ?? configResult.errors}`);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (areServerCommandArgs(preConfigArgs)) {
|
|
191
|
-
var _configResult$config;
|
|
192
|
-
|
|
193
|
-
const defaults = (0, _schema.getDefaultsForSchema)(false);
|
|
194
|
-
|
|
195
|
-
const serverArgs = _lodash.default.defaultsDeep(preConfigArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, defaults);
|
|
196
|
-
|
|
197
|
-
if (preConfigArgs.showConfig) {
|
|
198
|
-
(0, _config.showConfig)((0, _config.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
|
|
199
|
-
return {};
|
|
162
|
+
else {
|
|
163
|
+
// otherwise parse from CLI
|
|
164
|
+
preConfigArgs = /** @type {Args<Cmd, SubCmd>} */ (parser.parseArgs());
|
|
200
165
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (serverArgs.logFilters) {
|
|
205
|
-
const {
|
|
206
|
-
issues,
|
|
207
|
-
rules
|
|
208
|
-
} = await _support.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
|
|
209
|
-
|
|
210
|
-
if (!_lodash.default.isEmpty(issues)) {
|
|
211
|
-
throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
if (_lodash.default.isEmpty(rules)) {
|
|
215
|
-
_logger.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
|
|
216
|
-
} else {
|
|
217
|
-
_logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
|
|
218
|
-
}
|
|
166
|
+
const configResult = await (0, config_file_1.readConfigFile)(preConfigArgs.configFile);
|
|
167
|
+
if (!lodash_1.default.isEmpty(configResult.errors)) {
|
|
168
|
+
throw new Error(`Errors in config file ${configResult.filepath}:\n ${configResult.reason ?? configResult.errors}`);
|
|
219
169
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
170
|
+
// merge config and apply defaults.
|
|
171
|
+
// the order of precendece is:
|
|
172
|
+
// 1. command line args
|
|
173
|
+
// 2. config file
|
|
174
|
+
// 3. defaults from config file.
|
|
175
|
+
if ((0, utils_1.isServerCommandArgs)(preConfigArgs)) {
|
|
176
|
+
const defaults = (0, schema_1.getDefaultsForSchema)(false);
|
|
177
|
+
/** @type {ParsedArgs} */
|
|
178
|
+
const serverArgs = lodash_1.default.defaultsDeep({}, preConfigArgs, configResult.config?.server, defaults);
|
|
179
|
+
if (preConfigArgs.showConfig) {
|
|
180
|
+
(0, config_1.showConfig)((0, config_1.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
|
|
181
|
+
return /** @type {InitResult<Cmd>} */ ({});
|
|
182
|
+
}
|
|
183
|
+
await (0, logsink_1.init)(serverArgs);
|
|
184
|
+
if (serverArgs.logFilters) {
|
|
185
|
+
const { issues, rules } = await support_1.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
|
|
186
|
+
if (!lodash_1.default.isEmpty(issues)) {
|
|
187
|
+
throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` +
|
|
188
|
+
JSON.stringify(issues, null, 2));
|
|
189
|
+
}
|
|
190
|
+
if (lodash_1.default.isEmpty(rules)) {
|
|
191
|
+
logger_1.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
logger_1.default.info(`Loaded ${support_1.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const appiumDriver = new appium_1.AppiumDriver(serverArgs);
|
|
198
|
+
// set the config on the umbrella driver so it can match drivers to caps
|
|
199
|
+
appiumDriver.driverConfig = driverConfig;
|
|
200
|
+
await preflightChecks(serverArgs, throwInsteadOfExit);
|
|
201
|
+
return /** @type {InitResult<Cmd>} */ ({
|
|
202
|
+
appiumDriver,
|
|
203
|
+
parsedArgs: serverArgs,
|
|
204
|
+
driverConfig,
|
|
205
|
+
pluginConfig,
|
|
206
|
+
});
|
|
236
207
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
208
|
+
else {
|
|
209
|
+
if ((0, utils_1.isExtensionCommandArgs)(preConfigArgs)) {
|
|
210
|
+
// if the user has requested the 'driver' CLI, don't run the normal server,
|
|
211
|
+
// but instead pass control to the driver CLI
|
|
212
|
+
if ((0, utils_1.isDriverCommandArgs)(preConfigArgs)) {
|
|
213
|
+
await (0, extension_1.runExtensionCommand)(preConfigArgs, driverConfig);
|
|
214
|
+
}
|
|
215
|
+
if ((0, utils_1.isPluginCommandArgs)(preConfigArgs)) {
|
|
216
|
+
await (0, extension_1.runExtensionCommand)(preConfigArgs, pluginConfig);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return /** @type {InitResult<Cmd>} */ ({});
|
|
241
220
|
}
|
|
242
|
-
|
|
243
|
-
return {};
|
|
244
|
-
}
|
|
245
221
|
}
|
|
246
|
-
|
|
222
|
+
exports.init = init;
|
|
223
|
+
/**
|
|
224
|
+
* Initializes Appium's config. Starts server if appropriate and resolves the
|
|
225
|
+
* server instance if so; otherwise resolves w/ `undefined`.
|
|
226
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
227
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
228
|
+
* @param {Args<Cmd, SubCmd>} [args] - Arguments from CLI or otherwise
|
|
229
|
+
* @returns {Promise<Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void>}
|
|
230
|
+
*/
|
|
247
231
|
async function main(args) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
} = await init(args);
|
|
254
|
-
|
|
255
|
-
if (!appiumDriver || !parsedArgs || !pluginConfig || !driverConfig) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const pluginClasses = (0, _extension2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
|
|
260
|
-
appiumDriver.pluginClasses = pluginClasses;
|
|
261
|
-
await logStartupInfo(parsedArgs);
|
|
262
|
-
let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
|
|
263
|
-
const driverClasses = (0, _extension2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
|
|
264
|
-
const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
|
|
265
|
-
const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
|
|
266
|
-
const serverOpts = {
|
|
267
|
-
routeConfiguringFunction,
|
|
268
|
-
port: parsedArgs.port,
|
|
269
|
-
hostname: parsedArgs.address,
|
|
270
|
-
allowCors: parsedArgs.allowCors,
|
|
271
|
-
basePath: parsedArgs.basePath,
|
|
272
|
-
serverUpdaters,
|
|
273
|
-
extraMethodMap,
|
|
274
|
-
cliArgs: parsedArgs
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
if (parsedArgs.keepAliveTimeout) {
|
|
278
|
-
serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
let server;
|
|
282
|
-
|
|
283
|
-
try {
|
|
284
|
-
server = await (0, _baseDriver.server)(serverOpts);
|
|
285
|
-
} catch (err) {
|
|
286
|
-
_logger.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` + `to update the server and failed. Original error: ${err.message}`);
|
|
287
|
-
|
|
288
|
-
_logger.default.debug(err.stack);
|
|
289
|
-
|
|
290
|
-
return process.exit(1);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
if (parsedArgs.allowCors) {
|
|
294
|
-
_logger.default.warn('You have enabled CORS requests from any host. Be careful not ' + 'to visit sites which could maliciously try to start Appium ' + 'sessions on your machine');
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
appiumDriver.server = server;
|
|
298
|
-
|
|
299
|
-
try {
|
|
300
|
-
if (parsedArgs.nodeconfig) {
|
|
301
|
-
await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
|
|
232
|
+
const initResult = await init(args);
|
|
233
|
+
if (lodash_1.default.isEmpty(initResult)) {
|
|
234
|
+
// if this branch is taken, we've run a different subcommand, so there's nothing
|
|
235
|
+
// left to do here.
|
|
236
|
+
return /** @type {Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void} */ (undefined);
|
|
302
237
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
238
|
+
const { appiumDriver, pluginConfig, driverConfig, parsedArgs } =
|
|
239
|
+
/** @type {InitResult<ServerCommand>} */ (initResult);
|
|
240
|
+
const pluginClasses = (0, extension_2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
|
|
241
|
+
// set the active plugins on the umbrella driver so it can use them for commands
|
|
242
|
+
appiumDriver.pluginClasses = pluginClasses;
|
|
243
|
+
await logStartupInfo(parsedArgs);
|
|
244
|
+
let routeConfiguringFunction = (0, base_driver_1.routeConfiguringFunction)(appiumDriver);
|
|
245
|
+
const driverClasses = (0, extension_2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
|
|
246
|
+
const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
|
|
247
|
+
const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
|
|
248
|
+
/** @type {import('@appium/base-driver').ServerOpts} */
|
|
249
|
+
const serverOpts = {
|
|
250
|
+
routeConfiguringFunction,
|
|
251
|
+
port: parsedArgs.port,
|
|
252
|
+
hostname: parsedArgs.address,
|
|
253
|
+
allowCors: parsedArgs.allowCors,
|
|
254
|
+
basePath: parsedArgs.basePath,
|
|
255
|
+
serverUpdaters,
|
|
256
|
+
extraMethodMap,
|
|
257
|
+
cliArgs: parsedArgs,
|
|
258
|
+
};
|
|
259
|
+
if (parsedArgs.keepAliveTimeout) {
|
|
260
|
+
serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
|
|
261
|
+
}
|
|
262
|
+
let server;
|
|
263
|
+
try {
|
|
264
|
+
server = await (0, base_driver_1.server)(serverOpts);
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
logger_1.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` +
|
|
268
|
+
`to update the server and failed. Original error: ${err.message}`);
|
|
269
|
+
logger_1.default.debug(err.stack);
|
|
270
|
+
return process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
if (parsedArgs.allowCors) {
|
|
273
|
+
logger_1.default.warn('You have enabled CORS requests from any host. Be careful not ' +
|
|
274
|
+
'to visit sites which could maliciously try to start Appium ' +
|
|
275
|
+
'sessions on your machine');
|
|
276
|
+
}
|
|
277
|
+
appiumDriver.server = server;
|
|
278
|
+
try {
|
|
279
|
+
// configure as node on grid, if necessary
|
|
280
|
+
// falsy values should not cause this to run
|
|
281
|
+
if (parsedArgs.nodeconfig) {
|
|
282
|
+
await (0, grid_register_1.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
317
286
|
await server.close();
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
287
|
+
throw err;
|
|
288
|
+
}
|
|
289
|
+
for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
290
|
+
process.once(signal, async function onSignal() {
|
|
291
|
+
logger_1.default.info(`Received ${signal} - shutting down`);
|
|
292
|
+
try {
|
|
293
|
+
await appiumDriver.deleteAllSessions({
|
|
294
|
+
force: true,
|
|
295
|
+
reason: `The process has received ${signal} signal`,
|
|
296
|
+
});
|
|
297
|
+
await server.close();
|
|
298
|
+
process.exit(0);
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
logger_1.default.warn(e);
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
logServerPort(parsedArgs.address, parsedArgs.port);
|
|
307
|
+
driverConfig.print();
|
|
308
|
+
pluginConfig.print([...pluginClasses.values()]);
|
|
309
|
+
return /** @type {Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void} */ (server);
|
|
331
310
|
}
|
|
332
|
-
|
|
311
|
+
exports.main = main;
|
|
312
|
+
// NOTE: this is here for backwards compat for any scripts referencing `main.js` directly
|
|
313
|
+
// (more specifically, `build/lib/main.js`)
|
|
314
|
+
// the executable is now `../index.js`, so that module will typically be `require.main`.
|
|
333
315
|
if (require.main === module) {
|
|
334
|
-
|
|
316
|
+
(0, asyncbox_1.asyncify)(main);
|
|
335
317
|
}
|
|
336
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvbHZlQXBwaXVtSG9tZSIsImVudiIsInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJjaGVja05vZGVPayIsImNoZWNrTnBtT2siLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dCdWlsZEluZm8iLCJwcm9jZXNzIiwiZXhpdCIsIndhcm5Ob2RlRGVwcmVjYXRpb25zIiwidmFsaWRhdGUiLCJ0bXBEaXIiLCJ2YWxpZGF0ZVRtcERpciIsImVyciIsImxvZ2dlciIsImVycm9yIiwibWVzc2FnZSIsInJlZCIsImxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyIsImluZm8iLCJpbnNwZWN0IiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsImdldEdpdFJldiIsInNob3dBcmdzIiwiZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MiLCJfIiwic2l6ZSIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwibG9nU2VydmVyUG9ydCIsImFkZHJlc3MiLCJwb3J0IiwibG9nTWVzc2FnZSIsImdldFNlcnZlclVwZGF0ZXJzIiwiZHJpdmVyQ2xhc3NlcyIsInBsdWdpbkNsYXNzZXMiLCJjb21wYWN0IiwibWFwIiwia2V5cyIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwia2xhc3MiLCJuZXdNZXRob2RNYXAiLCJhcmVTZXJ2ZXJDb21tYW5kQXJncyIsInN1YmNvbW1hbmQiLCJTRVJWRVJfU1VCQ09NTUFORCIsImluaXQiLCJhcHBpdW1Ib21lIiwiYWRqdXN0Tm9kZVBhdGgiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJsb2FkRXh0ZW5zaW9ucyIsInBhcnNlciIsImdldFBhcnNlciIsInByZUNvbmZpZ0FyZ3MiLCJwYXJzZUFyZ3MiLCJjb25maWdSZXN1bHQiLCJyZWFkQ29uZmlnRmlsZSIsImNvbmZpZ0ZpbGUiLCJlcnJvcnMiLCJFcnJvciIsImZpbGVwYXRoIiwicmVhc29uIiwiZGVmYXVsdHMiLCJnZXREZWZhdWx0c0ZvclNjaGVtYSIsInNlcnZlckFyZ3MiLCJkZWZhdWx0c0RlZXAiLCJjb25maWciLCJzZXJ2ZXIiLCJzaG93Q29uZmlnIiwibG9nc2lua0luaXQiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwidXRpbCIsInBsdXJhbGl6ZSIsImxlbmd0aCIsImFwcGl1bURyaXZlciIsIkFwcGl1bURyaXZlciIsInBhcnNlZEFyZ3MiLCJleHRlbnNpb25Db21tYW5kQXJncyIsIkRSSVZFUl9UWVBFIiwicnVuRXh0ZW5zaW9uQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwibWFpbiIsImdldEFjdGl2ZVBsdWdpbnMiLCJ1c2VQbHVnaW5zIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwibWFrZVJvdXRlciIsImdldEFjdGl2ZURyaXZlcnMiLCJ1c2VEcml2ZXJzIiwic2VydmVyVXBkYXRlcnMiLCJleHRyYU1ldGhvZE1hcCIsInNlcnZlck9wdHMiLCJob3N0bmFtZSIsImFsbG93Q29ycyIsImJhc2VQYXRoIiwiY2xpQXJncyIsImtlZXBBbGl2ZVRpbWVvdXQiLCJiYXNlU2VydmVyIiwiZGVidWciLCJzdGFjayIsIm5vZGVjb25maWciLCJyZWdpc3Rlck5vZGUiLCJjbG9zZSIsInNpZ25hbCIsIm9uY2UiLCJvblNpZ25hbCIsImRlbGV0ZUFsbFNlc3Npb25zIiwiZm9yY2UiLCJlIiwicHJpbnQiLCJ2YWx1ZXMiLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHtpbml0IGFzIGxvZ3NpbmtJbml0fSBmcm9tICcuL2xvZ3NpbmsnOyAvLyB0aGlzIGltcG9ydCBuZWVkcyB0byBjb21lIGZpcnN0IHNpbmNlIGl0IHNldHMgdXAgZ2xvYmFsIG5wbWxvZ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7IC8vIGxvZ2dlciBuZWVkcyB0byByZW1haW4gc2Vjb25kXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyLCBzZXJ2ZXIgYXMgYmFzZVNlcnZlcn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge2xvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsLCBlbnZ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge2FzeW5jaWZ5fSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBcHBpdW1Ecml2ZXJ9IGZyb20gJy4vYXBwaXVtJztcbmltcG9ydCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7Z2V0UGFyc2VyfSBmcm9tICcuL2NsaS9wYXJzZXInO1xuaW1wb3J0IHtcbiAgQVBQSVVNX1ZFUixcbiAgY2hlY2tOb2RlT2ssXG4gIGdldEdpdFJldixcbiAgZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MsXG4gIHNob3dDb25maWcsXG4gIHNob3dCdWlsZEluZm8sXG4gIHZhbGlkYXRlVG1wRGlyLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucyxcbiAgY2hlY2tOcG1Payxcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtyZWFkQ29uZmlnRmlsZX0gZnJvbSAnLi9jb25maWctZmlsZSc7XG5pbXBvcnQge2xvYWRFeHRlbnNpb25zLCBnZXRBY3RpdmVQbHVnaW5zLCBnZXRBY3RpdmVEcml2ZXJzfSBmcm9tICcuL2V4dGVuc2lvbic7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkR9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCByZWdpc3Rlck5vZGUgZnJvbSAnLi9ncmlkLXJlZ2lzdGVyJztcbmltcG9ydCB7Z2V0RGVmYXVsdHNGb3JTY2hlbWEsIHZhbGlkYXRlfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHtpbnNwZWN0LCBhZGp1c3ROb2RlUGF0aH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IHtyZXNvbHZlQXBwaXVtSG9tZX0gPSBlbnY7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UGFyc2VkQXJnc30gYXJnc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhyb3dJbnN0ZWFkT2ZFeGl0XVxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVmbGlnaHRDaGVja3MoYXJncywgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBjaGVja05vZGVPaygpO1xuICAgIGF3YWl0IGNoZWNrTnBtT2soKTtcbiAgICBpZiAoYXJncy5sb25nU3RhY2t0cmFjZSkge1xuICAgICAgcmVxdWlyZSgnbG9uZ2pvaG4nKS5hc3luY190cmFjZV9saW1pdCA9IC0xO1xuICAgIH1cbiAgICBpZiAoYXJncy5zaG93QnVpbGRJbmZvKSB7XG4gICAgICBhd2FpdCBzaG93QnVpbGRJbmZvKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG5cbiAgICB2YWxpZGF0ZShhcmdzKTtcblxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgYXdhaXQgdmFsaWRhdGVUbXBEaXIoYXJncy50bXBEaXIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLnJlZCk7XG4gICAgaWYgKHRocm93SW5zdGVhZE9mRXhpdCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJnc30gYXJnc1xuICovXG5mdW5jdGlvbiBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoYXJncykge1xuICBsb2dnZXIuaW5mbygnTm9uLWRlZmF1bHQgc2VydmVyIGFyZ3M6Jyk7XG4gIGluc3BlY3QoYXJncyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcmdzWydkZWZhdWx0Q2FwYWJpbGl0aWVzJ119IGNhcHNcbiAqL1xuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcoY2Fwcykge1xuICBsb2dnZXIuaW5mbyhcbiAgICAnRGVmYXVsdCBjYXBhYmlsaXRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gZWFjaCByZXF1ZXN0ICcgK1xuICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOidcbiAgKTtcbiAgaW5zcGVjdChjYXBzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IGFyZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9nU3RhcnR1cEluZm8oYXJncykge1xuICBsZXQgd2VsY29tZSA9IGBXZWxjb21lIHRvIEFwcGl1bSB2JHtBUFBJVU1fVkVSfWA7XG4gIGxldCBhcHBpdW1SZXYgPSBhd2FpdCBnZXRHaXRSZXYoKTtcbiAgaWYgKGFwcGl1bVJldikge1xuICAgIHdlbGNvbWUgKz0gYCAoUkVWICR7YXBwaXVtUmV2fSlgO1xuICB9XG4gIGxvZ2dlci5pbmZvKHdlbGNvbWUpO1xuXG4gIGxldCBzaG93QXJncyA9IGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKGFyZ3MpO1xuICBpZiAoXy5zaXplKHNob3dBcmdzKSkge1xuICAgIGxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyhzaG93QXJncyk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGxvZ0RlZmF1bHRDYXBhYmlsaXRpZXNXYXJuaW5nKGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gIH1cbiAgLy8gVE9ETzogYnJpbmcgYmFjayBsb2dsZXZlbCByZXBvcnRpbmcgYmVsb3cgb25jZSBsb2dnZXIgaXMgZmx1c2hlZCBvdXRcbiAgLy8gbG9nZ2VyLmluZm8oJ0NvbnNvbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5jb25zb2xlLmxldmVsKTtcbiAgLy8gaWYgKGxvZ2dlci50cmFuc3BvcnRzLmZpbGUpIHtcbiAgLy8gICBsb2dnZXIuaW5mbygnRmlsZSBMb2dMZXZlbDogJyArIGxvZ2dlci50cmFuc3BvcnRzLmZpbGUubGV2ZWwpO1xuICAvLyB9XG59XG5cbi8qKlxuICogTG9ncyB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0aGUgc2VydmVyIGlzIGxpc3RlbmluZyBvblxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBZGRyZXNzXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFBvcnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0KGFkZHJlc3MsIHBvcnQpIHtcbiAgbGV0IGxvZ01lc3NhZ2UgPSBgQXBwaXVtIFJFU1QgaHR0cCBpbnRlcmZhY2UgbGlzdGVuZXIgc3RhcnRlZCBvbiBgICsgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEdldHMgYSBsaXN0IG9mIGB1cGRhdGVTZXJ2ZXJgIGZ1bmN0aW9ucyBmcm9tIGFsbCBleHRlbnNpb25zXG4gKiBAcGFyYW0ge0RyaXZlck5hbWVNYXB9IGRyaXZlckNsYXNzZXNcbiAqIEBwYXJhbSB7UGx1Z2luTmFtZU1hcH0gcGx1Z2luQ2xhc3Nlc1xuICogQHJldHVybnMge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlVwZGF0ZVNlcnZlckNhbGxiYWNrW119XG4gKi9cbmZ1bmN0aW9uIGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIF8uY29tcGFjdChfLm1hcChbLi4uZHJpdmVyQ2xhc3Nlcy5rZXlzKCksIC4uLnBsdWdpbkNsYXNzZXMua2V5cygpXSwgJ3VwZGF0ZVNlcnZlcicpKTtcbn1cblxuLyoqXG4gKiBNYWtlcyBhIGJpZyBgTWV0aG9kTWFwYCBmcm9tIGFsbCB0aGUgbGl0dGxlIGBNZXRob2RNYXBgcyBpbiB0aGUgZXh0ZW5zaW9uc1xuICogQHBhcmFtIHtEcml2ZXJOYW1lTWFwfSBkcml2ZXJDbGFzc2VzXG4gKiBAcGFyYW0ge1BsdWdpbk5hbWVNYXB9IHBsdWdpbkNsYXNzZXNcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5NZXRob2RNYXB9XG4gKi9cbmZ1bmN0aW9uIGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLmtleXMoKSwgLi4ucGx1Z2luQ2xhc3Nlcy5rZXlzKCldLnJlZHVjZShcbiAgICAobWFwLCBrbGFzcykgPT4gKHtcbiAgICAgIC4uLm1hcCxcbiAgICAgIC4uLihrbGFzcy5uZXdNZXRob2RNYXAgPz8ge30pLFxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPVdpdGhTZXJ2ZXJTdWJjb21tYW5kXVxuICogQHBhcmFtIHtBcmdzPFQ+fSBhcmdzXG4gKiBAcmV0dXJucyB7YXJncyBpcyBBcmdzPFdpdGhTZXJ2ZXJTdWJjb21tYW5kPn1cbiAqL1xuZnVuY3Rpb24gYXJlU2VydmVyQ29tbWFuZEFyZ3MoYXJncykge1xuICByZXR1cm4gYXJncy5zdWJjb21tYW5kID09PSBTRVJWRVJfU1VCQ09NTUFORDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBBcHBpdW0sIGJ1dCBkb2VzIG5vdCBzdGFydCB0aGUgc2VydmVyLlxuICpcbiAqIFVzZSB0aGlzIHRvIGdldCBhdCB0aGUgY29uZmlndXJhdGlvbiBzY2hlbWEuXG4gKlxuICogSWYgYGFyZ3NgIGNvbnRhaW5zIGEgbm9uLWVtcHR5IGBzdWJjb21tYW5kYCB3aGljaCBpcyBub3QgYHNlcnZlcmAsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gUGFydGlhbCBhcmdzIChwcm9nYW1tYXRpYyB1c2FnZSBvbmx5KVxuICogQHJldHVybnMge1Byb21pc2U8U2VydmVySW5pdFJlc3VsdCB8IEV4dENvbW1hbmRJbml0UmVzdWx0Pn1cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge2luaXQsIGdldFNjaGVtYX0gZnJvbSAnYXBwaXVtJztcbiAqIGNvbnN0IG9wdGlvbnMgPSB7fTsgLy8gY29uZmlnIG9iamVjdFxuICogYXdhaXQgaW5pdChvcHRpb25zKTtcbiAqIGNvbnN0IHNjaGVtYSA9IGdldFNjaGVtYSgpOyAvLyBlbnRpcmUgY29uZmlnIHNjaGVtYSBpbmNsdWRpbmcgcGx1Z2lucyBhbmQgZHJpdmVyc1xuICovXG5hc3luYyBmdW5jdGlvbiBpbml0KGFyZ3MpIHtcbiAgY29uc3QgYXBwaXVtSG9tZSA9IGFyZ3M/LmFwcGl1bUhvbWUgPz8gKGF3YWl0IHJlc29sdmVBcHBpdW1Ib21lKCkpO1xuXG4gIGFkanVzdE5vZGVQYXRoKCk7XG5cbiAgY29uc3Qge2RyaXZlckNvbmZpZywgcGx1Z2luQ29uZmlnfSA9IGF3YWl0IGxvYWRFeHRlbnNpb25zKGFwcGl1bUhvbWUpO1xuXG4gIGNvbnN0IHBhcnNlciA9IGdldFBhcnNlcigpO1xuICBsZXQgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2U7XG4gIC8qKiBAdHlwZSB7QXJnczxUPn0gKi9cbiAgbGV0IHByZUNvbmZpZ0FyZ3M7XG5cbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY29udGFpbmluZyBwYWNrYWdlIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIENMSSBwcm9jZXNzLFxuICAgIC8vIHRoYXQgcGFja2FnZSBtaWdodCBub3QgYXBwcmVjaWF0ZSB1cyBjYWxsaW5nICdwcm9jZXNzLmV4aXQnIHdpbGx5LVxuICAgIC8vIG5pbGx5LCBzbyBnaXZlIGl0IHRoZSBvcHRpb24gdG8gaGF2ZSB1cyB0aHJvdyBpbnN0ZWFkIG9mIGV4aXRcbiAgICBpZiAoYXJncy50aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93SW5zdGVhZE9mRXhpdCA9IHRydWU7XG4gICAgICAvLyBidXQgcmVtb3ZlIGl0IHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBzZXJ2ZXIgYXJnIHBlciBzZVxuICAgICAgZGVsZXRlIGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0O1xuICAgIH1cbiAgICBwcmVDb25maWdBcmdzID0gey4uLmFyZ3MsIHN1YmNvbW1hbmQ6IGFyZ3Muc3ViY29tbWFuZCA/PyBTRVJWRVJfU1VCQ09NTUFORH07XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgcHJlQ29uZmlnQXJncyA9IC8qKiBAdHlwZSB7QXJnczxUPn0gKi8gKHBhcnNlci5wYXJzZUFyZ3MoKSk7XG4gIH1cblxuICBjb25zdCBjb25maWdSZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShwcmVDb25maWdBcmdzLmNvbmZpZ0ZpbGUpO1xuXG4gIGlmICghXy5pc0VtcHR5KGNvbmZpZ1Jlc3VsdC5lcnJvcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9ycyBpbiBjb25maWcgZmlsZSAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuICR7XG4gICAgICAgIGNvbmZpZ1Jlc3VsdC5yZWFzb24gPz8gY29uZmlnUmVzdWx0LmVycm9yc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbWVyZ2UgY29uZmlnIGFuZCBhcHBseSBkZWZhdWx0cy5cbiAgLy8gdGhlIG9yZGVyIG9mIHByZWNlbmRlY2UgaXM6XG4gIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdzXG4gIC8vIDIuIGNvbmZpZyBmaWxlXG4gIC8vIDMuIGRlZmF1bHRzIGZyb20gY29uZmlnIGZpbGUuXG4gIGlmIChhcmVTZXJ2ZXJDb21tYW5kQXJncyhwcmVDb25maWdBcmdzKSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZ2V0RGVmYXVsdHNGb3JTY2hlbWEoZmFsc2UpO1xuXG4gICAgLyoqIEB0eXBlIHtQYXJzZWRBcmdzfSAqL1xuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBfLmRlZmF1bHRzRGVlcChwcmVDb25maWdBcmdzLCBjb25maWdSZXN1bHQuY29uZmlnPy5zZXJ2ZXIsIGRlZmF1bHRzKTtcblxuICAgIGlmIChwcmVDb25maWdBcmdzLnNob3dDb25maWcpIHtcbiAgICAgIHNob3dDb25maWcoZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MocHJlQ29uZmlnQXJncyksIGNvbmZpZ1Jlc3VsdCwgZGVmYXVsdHMsIHNlcnZlckFyZ3MpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGxvZ3NpbmtJbml0KHNlcnZlckFyZ3MpO1xuXG4gICAgaWYgKHNlcnZlckFyZ3MubG9nRmlsdGVycykge1xuICAgICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKFxuICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShpc3N1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGxvZyBmaWx0ZXJpbmcgcnVsZXMgY29uZmlnICcke3NlcnZlckFyZ3MubG9nRmlsdGVyc30nIGhhcyBpc3N1ZXM6IGAgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXNzdWVzLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShydWxlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7c2VydmVyQXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYExvYWRlZCAke3V0aWwucGx1cmFsaXplKCdmaWx0ZXJpbmcgcnVsZScsIHJ1bGVzLmxlbmd0aCwgdHJ1ZSl9IGZyb20gJyR7XG4gICAgICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICAgICB9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKHNlcnZlckFyZ3MpO1xuICAgIC8vIHNldCB0aGUgY29uZmlnIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIG1hdGNoIGRyaXZlcnMgdG8gY2Fwc1xuICAgIGFwcGl1bURyaXZlci5kcml2ZXJDb25maWcgPSBkcml2ZXJDb25maWc7XG4gICAgYXdhaXQgcHJlZmxpZ2h0Q2hlY2tzKHNlcnZlckFyZ3MsIHRocm93SW5zdGVhZE9mRXhpdCk7XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTZXJ2ZXJJbml0UmVzdWx0fSAqLyAoe1xuICAgICAgYXBwaXVtRHJpdmVyLFxuICAgICAgcGFyc2VkQXJnczogc2VydmVyQXJncyxcbiAgICAgIGRyaXZlckNvbmZpZyxcbiAgICAgIHBsdWdpbkNvbmZpZyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb25Db21tYW5kQXJncyA9IC8qKiBAdHlwZSB7QXJnczxpbXBvcnQoJ2FwcGl1bS90eXBlcycpLldpdGhFeHRTdWJjb21tYW5kPn0gKi8gKFxuICAgICAgcHJlQ29uZmlnQXJnc1xuICAgICk7XG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gICAgLy8gYnV0IGluc3RlYWQgcGFzcyBjb250cm9sIHRvIHRoZSBkcml2ZXIgQ0xJXG4gICAgaWYgKHByZUNvbmZpZ0FyZ3Muc3ViY29tbWFuZCA9PT0gRFJJVkVSX1RZUEUpIHtcbiAgICAgIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoZXh0ZW5zaW9uQ29tbWFuZEFyZ3MsIGRyaXZlckNvbmZpZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChwcmVDb25maWdBcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKGV4dGVuc2lvbkNvbW1hbmRBcmdzLCBwbHVnaW5Db25maWcpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlblxuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtJ3MgY29uZmlnLiAgU3RhcnRzIHNlcnZlciBpZiBhcHByb3ByaWF0ZSBhbmQgcmVzb2x2ZXMgdGhlXG4gKiBzZXJ2ZXIgaW5zdGFuY2UgaWYgc287IG90aGVyd2lzZSByZXNvbHZlcyB3LyBgdW5kZWZpbmVkYC5cbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gQXJndW1lbnRzIGZyb20gQ0xJIG9yIG90aGVyd2lzZVxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfHVuZGVmaW5lZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJncykge1xuICBjb25zdCB7YXBwaXVtRHJpdmVyLCBwYXJzZWRBcmdzLCBwbHVnaW5Db25maWcsIGRyaXZlckNvbmZpZ30gPSAvKiogQHR5cGUge1NlcnZlckluaXRSZXN1bHR9ICovIChcbiAgICBhd2FpdCBpbml0KGFyZ3MpXG4gICk7XG5cbiAgaWYgKCFhcHBpdW1Ecml2ZXIgfHwgIXBhcnNlZEFyZ3MgfHwgIXBsdWdpbkNvbmZpZyB8fCAhZHJpdmVyQ29uZmlnKSB7XG4gICAgLy8gaWYgdGhpcyBicmFuY2ggaXMgdGFrZW4sIHdlJ3ZlIHJ1biBhIGRpZmZlcmVudCBzdWJjb21tYW5kLCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAvLyBsZWZ0IHRvIGRvIGhlcmUuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luQ2xhc3NlcyA9IGdldEFjdGl2ZVBsdWdpbnMocGx1Z2luQ29uZmlnLCBwYXJzZWRBcmdzLnVzZVBsdWdpbnMpO1xuICAvLyBzZXQgdGhlIGFjdGl2ZSBwbHVnaW5zIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtIGZvciBjb21tYW5kc1xuICBhcHBpdW1Ecml2ZXIucGx1Z2luQ2xhc3NlcyA9IHBsdWdpbkNsYXNzZXM7XG5cbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VkQXJncyk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGFwcGl1bURyaXZlcik7XG5cbiAgY29uc3QgZHJpdmVyQ2xhc3NlcyA9IGdldEFjdGl2ZURyaXZlcnMoZHJpdmVyQ29uZmlnLCBwYXJzZWRBcmdzLnVzZURyaXZlcnMpO1xuICBjb25zdCBzZXJ2ZXJVcGRhdGVycyA9IGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuICBjb25zdCBleHRyYU1ldGhvZE1hcCA9IGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdAYXBwaXVtL2Jhc2UtZHJpdmVyJykuU2VydmVyT3B0c30gKi9cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gICAgcG9ydDogcGFyc2VkQXJncy5wb3J0LFxuICAgIGhvc3RuYW1lOiBwYXJzZWRBcmdzLmFkZHJlc3MsXG4gICAgYWxsb3dDb3JzOiBwYXJzZWRBcmdzLmFsbG93Q29ycyxcbiAgICBiYXNlUGF0aDogcGFyc2VkQXJncy5iYXNlUGF0aCxcbiAgICBzZXJ2ZXJVcGRhdGVycyxcbiAgICBleHRyYU1ldGhvZE1hcCxcbiAgICBjbGlBcmdzOiBwYXJzZWRBcmdzLFxuICB9O1xuICBpZiAocGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgc2VydmVyT3B0cy5rZWVwQWxpdmVUaW1lb3V0ID0gcGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0ICogMTAwMDtcbiAgfVxuICBsZXQgc2VydmVyO1xuICB0cnkge1xuICAgIHNlcnZlciA9IGF3YWl0IGJhc2VTZXJ2ZXIoc2VydmVyT3B0cyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgIGBDb3VsZCBub3QgY29uZmlndXJlIEFwcGl1bSBzZXJ2ZXIuIEl0J3MgcG9zc2libGUgdGhhdCBhIGRyaXZlciBvciBwbHVnaW4gdHJpZWQgYCArXG4gICAgICAgIGB0byB1cGRhdGUgdGhlIHNlcnZlciBhbmQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICByZXR1cm4gcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHBhcnNlZEFyZ3MuYWxsb3dDb3JzKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnWW91IGhhdmUgZW5hYmxlZCBDT1JTIHJlcXVlc3RzIGZyb20gYW55IGhvc3QuIEJlIGNhcmVmdWwgbm90ICcgK1xuICAgICAgICAndG8gdmlzaXQgc2l0ZXMgd2hpY2ggY291bGQgbWFsaWNpb3VzbHkgdHJ5IHRvIHN0YXJ0IEFwcGl1bSAnICtcbiAgICAgICAgJ3Nlc3Npb25zIG9uIHlvdXIgbWFjaGluZSdcbiAgICApO1xuICB9XG4gIGFwcGl1bURyaXZlci5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgLy8gY29uZmlndXJlIGFzIG5vZGUgb24gZ3JpZCwgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZmFsc3kgdmFsdWVzIHNob3VsZCBub3QgY2F1c2UgdGhpcyB0byBydW5cbiAgICBpZiAocGFyc2VkQXJncy5ub2RlY29uZmlnKSB7XG4gICAgICBhd2FpdCByZWdpc3Rlck5vZGUoXG4gICAgICAgIHBhcnNlZEFyZ3Mubm9kZWNvbmZpZyxcbiAgICAgICAgcGFyc2VkQXJncy5hZGRyZXNzLFxuICAgICAgICBwYXJzZWRBcmdzLnBvcnQsXG4gICAgICAgIHBhcnNlZEFyZ3MuYmFzZVBhdGhcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJ10pIHtcbiAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBhc3luYyBmdW5jdGlvbiBvblNpZ25hbCgpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWNlaXZlZCAke3NpZ25hbH0gLSBzaHV0dGluZyBkb3duYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBpdW1Ecml2ZXIuZGVsZXRlQWxsU2Vzc2lvbnMoe1xuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYFRoZSBwcm9jZXNzIGhhcyByZWNlaXZlZCAke3NpZ25hbH0gc2lnbmFsYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dTZXJ2ZXJQb3J0KHBhcnNlZEFyZ3MuYWRkcmVzcywgcGFyc2VkQXJncy5wb3J0KTtcbiAgZHJpdmVyQ29uZmlnLnByaW50KCk7XG4gIHBsdWdpbkNvbmZpZy5wcmludChbLi4ucGx1Z2luQ2xhc3Nlcy52YWx1ZXMoKV0pO1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdCBmb3IgYW55IHNjcmlwdHMgcmVmZXJlbmNpbmcgYG1haW4uanNgIGRpcmVjdGx5XG4vLyAobW9yZSBzcGVjaWZpY2FsbHksIGBidWlsZC9saWIvbWFpbi5qc2ApXG4vLyB0aGUgZXhlY3V0YWJsZSBpcyBub3cgYC4uL2luZGV4LmpzYCwgc28gdGhhdCBtb2R1bGUgd2lsbCB0eXBpY2FsbHkgYmUgYHJlcXVpcmUubWFpbmAuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbi8vIGV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBBUEkuXG5leHBvcnQge3JlYWRDb25maWdGaWxlfSBmcm9tICcuL2NvbmZpZy1maWxlJztcbmV4cG9ydCB7ZmluYWxpemVTY2hlbWEsIGdldFNjaGVtYSwgdmFsaWRhdGV9IGZyb20gJy4vc2NoZW1hL3NjaGVtYSc7XG5leHBvcnQge21haW4sIGluaXQsIHJlc29sdmVBcHBpdW1Ib21lfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzc30gRHJpdmVyQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW5DbGFzc30gUGx1Z2luQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLldpdGhTZXJ2ZXJTdWJjb21tYW5kfSBXaXRoU2VydmVyU3ViY29tbWFuZFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9leHRlbnNpb24nKS5Ecml2ZXJOYW1lTWFwfSBEcml2ZXJOYW1lTWFwXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbicpLlBsdWdpbk5hbWVNYXB9IFBsdWdpbk5hbWVNYXBcbiAqL1xuXG4vKipcbiAqIExpdGVyYWxseSBhbiBlbXB0eSBvYmplY3RcbiAqIEB0eXBlZGVmIHsge30gfSBFeHRDb21tYW5kSW5pdFJlc3VsdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VydmVySW5pdERhdGFcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCcuL2FwcGl1bScpLkFwcGl1bURyaXZlcn0gYXBwaXVtRHJpdmVyIC0gVGhlIEFwcGl1bSBkcml2ZXJcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5QYXJzZWRBcmdzfSBwYXJzZWRBcmdzIC0gVGhlIHBhcnNlZCBhcmd1bWVudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtTZXJ2ZXJJbml0RGF0YSAmIGltcG9ydCgnLi9leHRlbnNpb24nKS5FeHRlbnNpb25Db25maWdzfSBTZXJ2ZXJJbml0UmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5BcmdzPFQ+fSBBcmdzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5QYXJzZWRBcmdzPFQ+fSBQYXJzZWRBcmdzXG4gKi9cbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNB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
|
|
318
|
+
// everything below here is intended to be a public API.
|
|
319
|
+
var config_file_2 = require("./config-file");
|
|
320
|
+
Object.defineProperty(exports, "readConfigFile", { enumerable: true, get: function () { return config_file_2.readConfigFile; } });
|
|
321
|
+
var schema_2 = require("./schema/schema");
|
|
322
|
+
Object.defineProperty(exports, "finalizeSchema", { enumerable: true, get: function () { return schema_2.finalizeSchema; } });
|
|
323
|
+
Object.defineProperty(exports, "getSchema", { enumerable: true, get: function () { return schema_2.getSchema; } });
|
|
324
|
+
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return schema_2.validate; } });
|
|
325
|
+
/**
|
|
326
|
+
* @typedef {import('@appium/types').DriverType} DriverType
|
|
327
|
+
* @typedef {import('@appium/types').PluginType} PluginType
|
|
328
|
+
* @typedef {import('@appium/types').DriverClass} DriverClass
|
|
329
|
+
* @typedef {import('@appium/types').PluginClass} PluginClass
|
|
330
|
+
* @typedef {import('appium/types').CliCommand} CliCommand
|
|
331
|
+
* @typedef {import('appium/types').CliExtensionSubcommand} CliExtensionSubcommand
|
|
332
|
+
* @typedef {import('appium/types').CliExtensionCommand} CliExtensionCommand
|
|
333
|
+
* @typedef {import('appium/types').ServerCommand} ServerCommand
|
|
334
|
+
* @typedef {import('appium/types').DriverCommand} DriverCommand
|
|
335
|
+
* @typedef {import('appium/types').PluginCommand} PluginCommand
|
|
336
|
+
* @typedef {import('./extension').DriverNameMap} DriverNameMap
|
|
337
|
+
* @typedef {import('./extension').PluginNameMap} PluginNameMap
|
|
338
|
+
*/
|
|
339
|
+
/**
|
|
340
|
+
* Literally an empty object
|
|
341
|
+
* @typedef { {} } ExtCommandInitResult
|
|
342
|
+
*/
|
|
343
|
+
/**
|
|
344
|
+
* @typedef ServerInitData
|
|
345
|
+
* @property {import('./appium').AppiumDriver} appiumDriver - The Appium driver
|
|
346
|
+
* @property {import('appium/types').ParsedArgs} parsedArgs - The parsed arguments
|
|
347
|
+
*/
|
|
348
|
+
/**
|
|
349
|
+
* @template {CliCommand} Cmd
|
|
350
|
+
* @typedef {Cmd extends ServerCommand ? ServerInitData & import('./extension').ExtensionConfigs : ExtCommandInitResult} InitResult
|
|
351
|
+
*/
|
|
352
|
+
/**
|
|
353
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
354
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
355
|
+
* @typedef {import('appium/types').Args<Cmd, SubCmd>} Args
|
|
356
|
+
*/
|
|
357
|
+
/**
|
|
358
|
+
* @template {CliCommand} [Cmd=ServerCommand]
|
|
359
|
+
* @template {CliExtensionSubcommand|void} [SubCmd=void]
|
|
360
|
+
* @typedef {import('appium/types').ParsedArgs<Cmd, SubCmd>} ParsedArgs
|
|
361
|
+
*/
|
|
362
|
+
//# sourceMappingURL=main.js.map
|