appium 2.0.0-beta.24 → 2.0.0-beta.27

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 (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +5 -10
  11. package/build/lib/config.js +50 -20
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +42 -71
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +61 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +12 -15
  39. package/lib/config.js +55 -24
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +57 -93
  49. package/lib/schema/arg-spec.js +3 -3
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +67 -29
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -209
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -246
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
@@ -1,165 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.getExtConfigIOInstance = exports.PLUGIN_TYPE = exports.DRIVER_TYPE = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- require("source-map-support/register");
13
-
14
- var _support = require("@appium/support");
15
-
16
- var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
- var _path = _interopRequireDefault(require("path"));
19
-
20
- var _yaml = _interopRequireDefault(require("yaml"));
21
-
22
- const CONFIG_FILE_NAME = 'extensions.yaml';
23
- const CONFIG_SCHEMA_REV = 2;
24
- const DRIVER_TYPE = 'driver';
25
- exports.DRIVER_TYPE = DRIVER_TYPE;
26
- const PLUGIN_TYPE = 'plugin';
27
- exports.PLUGIN_TYPE = PLUGIN_TYPE;
28
- const VALID_EXT_TYPES = new Set([DRIVER_TYPE, PLUGIN_TYPE]);
29
- const CONFIG_DATA_DRIVER_KEY = `${DRIVER_TYPE}s`;
30
- const CONFIG_DATA_PLUGIN_KEY = `${PLUGIN_TYPE}s`;
31
-
32
- class ExtConfigIO {
33
- constructor(appiumHome) {
34
- (0, _defineProperty2.default)(this, "_dirty", void 0);
35
- (0, _defineProperty2.default)(this, "_data", void 0);
36
- (0, _defineProperty2.default)(this, "_extDataByType", new Map());
37
- (0, _defineProperty2.default)(this, "_filepath", void 0);
38
- (0, _defineProperty2.default)(this, "_appiumHome", void 0);
39
- (0, _defineProperty2.default)(this, "_writing", null);
40
- (0, _defineProperty2.default)(this, "_reading", null);
41
- this._filepath = _path.default.resolve(appiumHome, CONFIG_FILE_NAME);
42
- this._appiumHome = appiumHome;
43
- }
44
-
45
- _createProxy(extensionType, data) {
46
- return new Proxy(data[`${extensionType}s`], {
47
- set: (target, prop, value) => {
48
- if (value !== target[prop]) {
49
- this._dirty = true;
50
- }
51
-
52
- target[prop] = value;
53
- return Reflect.set(target, prop, value);
54
- },
55
- deleteProperty: (target, prop) => {
56
- if (prop in target) {
57
- this._dirty = true;
58
- }
59
-
60
- return Reflect.deleteProperty(target, prop);
61
- }
62
- });
63
- }
64
-
65
- get filepath() {
66
- return this._filepath;
67
- }
68
-
69
- async read(extensionType) {
70
- if (this._reading) {
71
- await this._reading;
72
- return this._extDataByType.get(extensionType);
73
- }
74
-
75
- this._reading = (async () => {
76
- if (!VALID_EXT_TYPES.has(extensionType)) {
77
- throw new TypeError(`Invalid extension type: ${extensionType}. Valid values are: ${[...VALID_EXT_TYPES].join(', ')}`);
78
- }
79
-
80
- if (this._extDataByType.has(extensionType)) {
81
- return;
82
- }
83
-
84
- let data;
85
- let isNewFile = false;
86
-
87
- try {
88
- await (0, _support.mkdirp)(this._appiumHome);
89
- const yaml = await _support.fs.readFile(this.filepath, 'utf8');
90
- data = _yaml.default.parse(yaml);
91
- } catch (err) {
92
- if (err.code === 'ENOENT') {
93
- data = {
94
- [CONFIG_DATA_DRIVER_KEY]: {},
95
- [CONFIG_DATA_PLUGIN_KEY]: {},
96
- schemaRev: CONFIG_SCHEMA_REV
97
- };
98
- isNewFile = true;
99
- } else {
100
- throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this.filepath}). Ensure it exists and is ` + `readable. Specific error: ${err.message}`);
101
- }
102
- }
103
-
104
- this._data = data;
105
-
106
- this._extDataByType.set(DRIVER_TYPE, this._createProxy(DRIVER_TYPE, data));
107
-
108
- this._extDataByType.set(PLUGIN_TYPE, this._createProxy(PLUGIN_TYPE, data));
109
-
110
- if (isNewFile) {
111
- await this.write(true);
112
- }
113
- })();
114
-
115
- try {
116
- await this._reading;
117
- return this._extDataByType.get(extensionType);
118
- } finally {
119
- this._reading = null;
120
- }
121
- }
122
-
123
- async write(force = false) {
124
- if (this._writing) {
125
- return this._writing;
126
- }
127
-
128
- this._writing = (async () => {
129
- try {
130
- if (!this._dirty && !force) {
131
- return false;
132
- }
133
-
134
- if (!this._data) {
135
- throw new ReferenceError('No data to write. Call `read()` first');
136
- }
137
-
138
- const dataToWrite = { ...this._data,
139
- [CONFIG_DATA_DRIVER_KEY]: this._extDataByType.get(DRIVER_TYPE),
140
- [CONFIG_DATA_PLUGIN_KEY]: this._extDataByType.get(PLUGIN_TYPE)
141
- };
142
-
143
- try {
144
- await _support.fs.writeFile(this.filepath, _yaml.default.stringify(dataToWrite), 'utf8');
145
- this._dirty = false;
146
- return true;
147
- } catch {
148
- throw new Error(`Appium could not parse or write from the Appium Home directory ` + `(${this._appiumHome}). Please ensure it is writable.`);
149
- }
150
- } finally {
151
- this._writing = null;
152
- }
153
- })();
154
-
155
- return await this._writing;
156
- }
157
-
158
- }
159
-
160
- const getExtConfigIOInstance = _lodash.default.memoize(appiumHome => new ExtConfigIO(appiumHome));
161
-
162
- exports.getExtConfigIOInstance = getExtConfigIOInstance;require('source-map-support').install();
163
-
164
-
165
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHQtY29uZmlnLWlvLmpzIl0sIm5hbWVzIjpbIkNPTkZJR19GSUxFX05BTUUiLCJDT05GSUdfU0NIRU1BX1JFViIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJWQUxJRF9FWFRfVFlQRVMiLCJTZXQiLCJDT05GSUdfREFUQV9EUklWRVJfS0VZIiwiQ09ORklHX0RBVEFfUExVR0lOX0tFWSIsIkV4dENvbmZpZ0lPIiwiY29uc3RydWN0b3IiLCJhcHBpdW1Ib21lIiwiTWFwIiwiX2ZpbGVwYXRoIiwicGF0aCIsInJlc29sdmUiLCJfYXBwaXVtSG9tZSIsIl9jcmVhdGVQcm94eSIsImV4dGVuc2lvblR5cGUiLCJkYXRhIiwiUHJveHkiLCJzZXQiLCJ0YXJnZXQiLCJwcm9wIiwidmFsdWUiLCJfZGlydHkiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJmaWxlcGF0aCIsInJlYWQiLCJfcmVhZGluZyIsIl9leHREYXRhQnlUeXBlIiwiZ2V0IiwiaGFzIiwiVHlwZUVycm9yIiwiam9pbiIsImlzTmV3RmlsZSIsInlhbWwiLCJmcyIsInJlYWRGaWxlIiwiWUFNTCIsInBhcnNlIiwiZXJyIiwiY29kZSIsInNjaGVtYVJldiIsIkVycm9yIiwibWVzc2FnZSIsIl9kYXRhIiwid3JpdGUiLCJmb3JjZSIsIl93cml0aW5nIiwiUmVmZXJlbmNlRXJyb3IiLCJkYXRhVG9Xcml0ZSIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImdldEV4dENvbmZpZ0lPSW5zdGFuY2UiLCJfIiwibWVtb2l6ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQU1BOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLGlCQUF6QjtBQUtBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCO0FBRU8sTUFBTUMsV0FBVyxHQUFHLFFBQXBCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxRQUFwQjs7QUFNUCxNQUFNQyxlQUFlLEdBQUcsSUFBSUMsR0FBSixDQUFR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Y0FBTUMsV0FBVyxHQUFHLEVBQ2xCLEdBQUcsS0FBS0wsS0FEVTtBQUVsQixXQUFDeEMsc0JBQUQsR0FBMEIsS0FBS3dCLGNBQUwsQ0FBb0JDLEdBQXBCLENBQXdCN0IsV0FBeEIsQ0FGUjtBQUdsQixXQUFDSyxzQkFBRCxHQUEwQixLQUFLdUIsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBd0I1QixXQUF4QjtBQUhSLFNBQXBCOztBQU1BLFlBQUk7QUFDRixnQkFBTWtDLFlBQUdlLFNBQUgsQ0FDSixLQUFLekIsUUFERCxFQUVKWSxjQUFLYyxTQUFMLENBQWVGLFdBQWYsQ0FGSSxFQUdKLE1BSEksQ0FBTjtBQUtBLGVBQUszQixNQUFMLEdBQWMsS0FBZDtBQUNBLGlCQUFPLElBQVA7QUFDRCxTQVJELENBUUUsTUFBTTtBQUNOLGdCQUFNLElBQUlvQixLQUFKLENBQ0gsaUVBQUQsR0FDRyxJQUFHLEtBQUs3QixXQUFZLGtDQUZuQixDQUFOO0FBSUQ7QUFDRixPQTdCRCxTQTZCVTtBQUNSLGFBQUtrQyxRQUFMLEdBQWdCLElBQWhCO0FBQ0Q7QUFDRixLQWpDZSxHQUFoQjs7QUFrQ0EsV0FBTyxNQUFNLEtBQUtBLFFBQWxCO0FBQ0Q7O0FBdk9lOztBQWlQWCxNQUFNSyxzQkFBc0IsR0FBR0MsZ0JBQUVDLE9BQUYsQ0FDbkM5QyxVQUFELElBQWdCLElBQUlGLFdBQUosQ0FBZ0JFLFVBQWhCLENBRG9CLENBQS9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogTW9kdWxlIGNvbnRhaW5pbmcge0BsaW5rIEV4dENvbmZpZ0lPfSB3aGljaCBoYW5kbGVzIHJlYWRpbmcgJiB3cml0aW5nIG9mIGV4dGVuc2lvbiBjb25maWcgZmlsZXMuXG4gKi9cblxuaW1wb3J0IHsgZnMsIG1rZGlycCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRSA9ICdleHRlbnNpb25zLnlhbWwnO1xuXG4vKipcbiAqIEN1cnJlbnQgY29uZmlndXJhdGlvbiBzY2hlbWEgcmV2aXNpb24hXG4gKi9cbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuZXhwb3J0IGNvbnN0IERSSVZFUl9UWVBFID0gJ2RyaXZlcic7XG5leHBvcnQgY29uc3QgUExVR0lOX1RZUEUgPSAncGx1Z2luJztcblxuLyoqXG4gKiBTZXQgb2YgdmFsaWQgZXh0ZW5zaW9uIHR5cGVzLlxuICogQHR5cGUge1JlYWRvbmx5PFNldDxFeHRlbnNpb25UeXBlPj59XG4gKi9cbmNvbnN0IFZBTElEX0VYVF9UWVBFUyA9IG5ldyBTZXQoW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pO1xuXG5jb25zdCBDT05GSUdfREFUQV9EUklWRVJfS0VZID0gYCR7RFJJVkVSX1RZUEV9c2A7XG5jb25zdCBDT05GSUdfREFUQV9QTFVHSU5fS0VZID0gYCR7UExVR0lOX1RZUEV9c2A7XG5cbi8qKlxuICogSGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICpcbiAqIE9ubHkgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICovXG5jbGFzcyBFeHRDb25maWdJTyB7XG4gIC8qKlxuICAgKiBcIkRpcnR5XCIgZmxhZy4gSWYgdHJ1ZSwgdGhlIGRhdGEgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3Qgd3JpdGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2RpcnR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgcGFyc2VkIFlBTUwgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlLlxuICAgKiBAdHlwZSB7b2JqZWN0P31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kYXRhO1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgZXh0ZW5zaW9uIHR5cGUgdG8gY29uZmlndXJhdGlvbiBkYXRhLiBDb25maWd1cmF0aW9uIGRhdGEgaXNcbiAgICoga2V5ZWQgb24gZXh0ZW5zaW9uIG5hbWUuXG4gICAqXG4gICAqIENvbnN1bWVycyBnZXQgdGhlIHZhbHVlcyBvZiB0aGlzIGBNYXBgIChjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAgKiBgZXh0ZW5zaW9uVHlwZWAgb2YgdGhlIGNvbnN1bWVyLCB3aGljaCB3aWxsIGJlIGEgc3ViY2xhc3Mgb2ZcbiAgICogYEV4dGVuc2lvbkNvbmZpZ2ApIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIG9iamVjdC5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge01hcDxFeHRlbnNpb25UeXBlLG9iamVjdD59XG4gICAqL1xuICBfZXh0RGF0YUJ5VHlwZSA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGF0aCB0byBjb25maWcgZmlsZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBfZmlsZXBhdGg7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIF9hcHBpdW1Ib21lO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCB3cml0aW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ud3JpdGV9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGB3cml0ZSgpYCBpcyBjb21wbGV0ZSwgdGhlIGBQcm9taXNlYFxuICAgKiB3aWxsIHJlc29sdmUgYW5kIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBgbnVsbGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8Ym9vbGVhbj4/fVxuICAgKi9cbiAgX3dyaXRpbmcgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCByZWFkaW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ucmVhZH0gd2lsbCBjYXVzZSBpdCB0byBiZVxuICAgKiBzZXQgdG8gYSBgUHJvbWlzZWAuIFdoZW4gdGhlIGNhbGwgdG8gYHJlYWQoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYG51bGxgLiAgQ29uY3VycmVudCBjYWxsc1xuICAgKiBtYWRlIHdoaWxlIHRoaXMgdmFsdWUgaXMgYSBgUHJvbWlzZWAgd2lsbCByZXR1cm4gdGhlIGBQcm9taXNlYCBpdHNlbGYuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+P31cbiAgICovXG4gIF9yZWFkaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lKSB7XG4gICAgdGhpcy5fZmlsZXBhdGggPSBwYXRoLnJlc29sdmUoYXBwaXVtSG9tZSwgQ09ORklHX0ZJTEVfTkFNRSk7XG4gICAgdGhpcy5fYXBwaXVtSG9tZSA9IGFwcGl1bUhvbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYWVzIGEgYFByb3h5YCB3aGljaCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBleHRlbnNpb24tdHlwZS1zcGVjaWZpY1xuICAgKiBjb25maWcgZGF0YS5cbiAgICpcbiAgICogV2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCwgaXQgc2V0cyBhIGBfZGlydHlgIGZsYWcuICBUaGUgbmV4dCBjYWxsIHRvXG4gICAqIHtAbGluayBFeHRDb25maWdJTy53cml0ZX0gd2lsbCBjaGVjayBpZiB0aGlzIGZsYWcgaXMgYHRydWVgIGJlZm9yZVxuICAgKiBwcm9jZWVkaW5nLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLG9iamVjdD59IGRhdGEgLSBFeHRlbnNpb24gY29uZmlnIGRhdGEsIGtleWVkIGJ5IG5hbWVcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsb2JqZWN0Pn1cbiAgICovXG4gIF9jcmVhdGVQcm94eSAoZXh0ZW5zaW9uVHlwZSwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZGF0YVtgJHtleHRlbnNpb25UeXBlfXNgXSwge1xuICAgICAgc2V0OiAodGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZS5cbiAgICovXG4gIGdldCBmaWxlcGF0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZGF0YSBmb3IgYW4gZXh0ZW5zaW9uIHR5cGUuICBSZWFkcyB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBGb3JjZS1yZWFkaW5nIGlzIF9ub3RfIHN1cHBvcnRlZCwgYXMgaXQncyBsaWtlbHkgdG8gYmUgYSBzb3VyY2Ugb2ZcbiAgICogYnVncy0taXQncyBlYXN5IHRvIG11dGF0ZSB0aGUgZGF0YSBhbmQgdGhlbiBvdmVyd3JpdGUgbWVtb3J5IHdpdGggdGhlIGZpbGVcbiAgICogY29udGVudHNcbiAgICpcbiAgICogSWRlYWxseSB0aGlzIHdpbGwgb25seSBldmVyIHJlYWQgdGhlIGZpbGUgX29uY2VfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBXaGljaCBiaXQgb2YgdGhlIGNvbmZpZyBkYXRhIHdlXG4gICAqIHdhbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIGRhdGFcbiAgICovXG4gIGFzeW5jIHJlYWQgKGV4dGVuc2lvblR5cGUpIHtcbiAgICBpZiAodGhpcy5fcmVhZGluZykge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZGluZztcbiAgICAgIHJldHVybiB0aGlzLl9leHREYXRhQnlUeXBlLmdldChleHRlbnNpb25UeXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWFkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghVkFMSURfRVhUX1RZUEVTLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGV4dGVuc2lvbiB0eXBlOiAke2V4dGVuc2lvblR5cGV9LiBWYWxpZCB2YWx1ZXMgYXJlOiAke1tcbiAgICAgICAgICAgIC4uLlZBTElEX0VYVF9UWVBFUyxcbiAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9leHREYXRhQnlUeXBlLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IGlzTmV3RmlsZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbWtkaXJwKHRoaXMuX2FwcGl1bUhvbWUpO1xuICAgICAgICBjb25zdCB5YW1sID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5maWxlcGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgZGF0YSA9IFlBTUwucGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHt9LFxuICAgICAgICAgICAgW0NPTkZJR19EQVRBX1BMVUdJTl9LRVldOiB7fSxcbiAgICAgICAgICAgIHNjaGVtYVJldjogQ09ORklHX1NDSEVNQV9SRVYsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpc05ld0ZpbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gaGFkIHRyb3VibGUgbG9hZGluZyB0aGUgZXh0ZW5zaW9uIGluc3RhbGxhdGlvbiBgICtcbiAgICAgICAgICAgICAgYGNhY2hlIGZpbGUgKCR7dGhpcy5maWxlcGF0aH0pLiBFbnN1cmUgaXQgZXhpc3RzIGFuZCBpcyBgICtcbiAgICAgICAgICAgICAgYHJlYWRhYmxlLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgRFJJVkVSX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KERSSVZFUl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KFBMVUdJTl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc05ld0ZpbGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkaW5nO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KGV4dGVuc2lvblR5cGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWFkaW5nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBkYXRhIGlmIGl0IG5lZWRzIHdyaXRpbmcuXG4gICAqXG4gICAqIElmIHRoZSBgc2NoZW1hUmV2YCBwcm9wIG5lZWRzIHVwZGF0aW5nLCB0aGUgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYSB3cml0ZSBldmVuIGlmIHRoZSBkYXRhIGlzIGNsZWFuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBkYXRhIHdhcyB3cml0dGVuXG4gICAqL1xuICBhc3luYyB3cml0ZSAoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGluZztcbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuX2RpcnR5ICYmICFmb3JjZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTm8gZGF0YSB0byB3cml0ZS4gQ2FsbCBgcmVhZCgpYCBmaXJzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVRvV3JpdGUgPSB7XG4gICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KERSSVZFUl9UWVBFKSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfUExVR0lOX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KFBMVUdJTl9UWVBFKSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICAgIHRoaXMuZmlsZXBhdGgsXG4gICAgICAgICAgICBZQU1MLnN0cmluZ2lmeShkYXRhVG9Xcml0ZSksXG4gICAgICAgICAgICAndXRmOCcsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCBwYXJzZSBvciB3cml0ZSBmcm9tIHRoZSBBcHBpdW0gSG9tZSBkaXJlY3RvcnkgYCArXG4gICAgICAgICAgICAgIGAoJHt0aGlzLl9hcHBpdW1Ib21lfSkuIFBsZWFzZSBlbnN1cmUgaXQgaXMgd3JpdGFibGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl93cml0aW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl93cml0aW5nO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEV4dENvbmZpZ0lPfS5cbiAqXG4gKiBNYWludGFpbnMgb25lIGluc3RhbmNlIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBgQVBQSVVNX0hPTUVgXG4gKiBAcmV0dXJucyB7RXh0Q29uZmlnSU99XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHRDb25maWdJT0luc3RhbmNlID0gXy5tZW1vaXplKFxuICAoYXBwaXVtSG9tZSkgPT4gbmV3IEV4dENvbmZpZ0lPKGFwcGl1bUhvbWUpLFxuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXh0Q29uZmlnSU99IEV4dGVuc2lvbkNvbmZpZ0lPXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7dHlwZW9mIERSSVZFUl9UWVBFIHwgdHlwZW9mIFBMVUdJTl9UWVBFfSBFeHRlbnNpb25UeXBlXG4gKi9cbiJdLCJmaWxlIjoibGliL2V4dC1jb25maWctaW8uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,320 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.DEFAULT_APPIUM_HOME = exports.APPIUM_HOME = void 0;
9
- Object.defineProperty(exports, "DRIVER_TYPE", {
10
- enumerable: true,
11
- get: function () {
12
- return _extConfigIo.DRIVER_TYPE;
13
- }
14
- });
15
- exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = void 0;
16
- Object.defineProperty(exports, "PLUGIN_TYPE", {
17
- enumerable: true,
18
- get: function () {
19
- return _extConfigIo.PLUGIN_TYPE;
20
- }
21
- });
22
- exports.default = void 0;
23
-
24
- require("source-map-support/register");
25
-
26
- var _lodash = _interopRequireDefault(require("lodash"));
27
-
28
- var _os = _interopRequireDefault(require("os"));
29
-
30
- var _path = _interopRequireDefault(require("path"));
31
-
32
- var _resolveFrom = _interopRequireDefault(require("resolve-from"));
33
-
34
- var _extConfigIo = require("./ext-config-io");
35
-
36
- var _logger = _interopRequireDefault(require("./logger"));
37
-
38
- var _schema = require("./schema/schema");
39
-
40
- const DEFAULT_APPIUM_HOME = _path.default.resolve(_os.default.homedir(), '.appium');
41
-
42
- exports.DEFAULT_APPIUM_HOME = DEFAULT_APPIUM_HOME;
43
- const APPIUM_HOME = process.env.APPIUM_HOME || DEFAULT_APPIUM_HOME;
44
- exports.APPIUM_HOME = APPIUM_HOME;
45
- const INSTALL_TYPE_NPM = 'npm';
46
- exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
47
- const INSTALL_TYPE_LOCAL = 'local';
48
- exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
49
- const INSTALL_TYPE_GITHUB = 'github';
50
- exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
51
- const INSTALL_TYPE_GIT = 'git';
52
- exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
53
- const INSTALL_TYPES = [INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM];
54
- exports.INSTALL_TYPES = INSTALL_TYPES;
55
-
56
- class ExtensionConfig {
57
- constructor(appiumHome, extensionType, logFn) {
58
- const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
59
- this.appiumHome = appiumHome;
60
- this.installedExtensions = {};
61
- this.io = (0, _extConfigIo.getExtConfigIOInstance)(appiumHome);
62
- this.extensionType = extensionType;
63
- this.configKey = `${extensionType}s`;
64
- this.log = logger;
65
- }
66
-
67
- validate(exts) {
68
- const foundProblems = {};
69
-
70
- for (const [extName, extData] of _lodash.default.toPairs(exts)) {
71
- foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData, extName), ...this.getSchemaProblems(extData, extName)];
72
- }
73
-
74
- const problemSummaries = [];
75
-
76
- for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
77
- if (_lodash.default.isEmpty(problems)) {
78
- continue;
79
- }
80
-
81
- delete exts[extName];
82
- problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
83
-
84
- for (const problem of problems) {
85
- problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
86
- }
87
- }
88
-
89
- if (!_lodash.default.isEmpty(problemSummaries)) {
90
- this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.io.filepath}):`);
91
-
92
- for (const summary of problemSummaries) {
93
- this.log(summary);
94
- }
95
- }
96
-
97
- return exts;
98
- }
99
-
100
- getSchemaProblems(extData, extName) {
101
- const problems = [];
102
- const {
103
- schema: argSchemaPath
104
- } = extData;
105
-
106
- if (argSchemaPath) {
107
- if (_lodash.default.isString(argSchemaPath)) {
108
- if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
109
- try {
110
- this.readExtensionSchema(extName, extData);
111
- } catch (err) {
112
- problems.push({
113
- err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
114
- val: argSchemaPath
115
- });
116
- }
117
- } else {
118
- problems.push({
119
- err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
120
- val: argSchemaPath
121
- });
122
- }
123
- } else if (_lodash.default.isPlainObject(argSchemaPath)) {
124
- try {
125
- this.readExtensionSchema(extName, extData);
126
- } catch (err) {
127
- problems.push({
128
- err: `Unable to register embedded schema; ${err.message}`,
129
- val: argSchemaPath
130
- });
131
- }
132
- } else {
133
- problems.push({
134
- err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
135
- val: argSchemaPath
136
- });
137
- }
138
- }
139
-
140
- return problems;
141
- }
142
-
143
- getGenericConfigProblems(extData, extName) {
144
- const {
145
- version,
146
- pkgName,
147
- installSpec,
148
- installType,
149
- installPath,
150
- mainClass
151
- } = extData;
152
- const problems = [];
153
-
154
- if (!_lodash.default.isString(version)) {
155
- problems.push({
156
- err: 'Missing or incorrect version',
157
- val: version
158
- });
159
- }
160
-
161
- if (!_lodash.default.isString(pkgName)) {
162
- problems.push({
163
- err: 'Missing or incorrect NPM package name',
164
- val: pkgName
165
- });
166
- }
167
-
168
- if (!_lodash.default.isString(installSpec)) {
169
- problems.push({
170
- err: 'Missing or incorrect installation spec',
171
- val: installSpec
172
- });
173
- }
174
-
175
- if (!_lodash.default.includes(INSTALL_TYPES, installType)) {
176
- problems.push({
177
- err: 'Missing or incorrect install type',
178
- val: installType
179
- });
180
- }
181
-
182
- if (!_lodash.default.isString(installPath)) {
183
- problems.push({
184
- err: 'Missing or incorrect installation path',
185
- val: installPath
186
- });
187
- }
188
-
189
- if (!_lodash.default.isString(mainClass)) {
190
- problems.push({
191
- err: 'Missing or incorrect driver class name',
192
- val: mainClass
193
- });
194
- }
195
-
196
- return problems;
197
- }
198
-
199
- getConfigProblems(extData, extName) {
200
- return [];
201
- }
202
-
203
- async read() {
204
- const extensions = await this.io.read(this.extensionType);
205
- this.installedExtensions = this.validate(extensions);
206
- return this.installedExtensions;
207
- }
208
-
209
- async write() {
210
- return await this.io.write();
211
- }
212
-
213
- async addExtension(extName, extData) {
214
- this.installedExtensions[extName] = extData;
215
- await this.write();
216
- }
217
-
218
- async updateExtension(extName, extData) {
219
- this.installedExtensions[extName] = { ...this.installedExtensions[extName],
220
- ...extData
221
- };
222
- await this.write();
223
- }
224
-
225
- async removeExtension(extName) {
226
- delete this.installedExtensions[extName];
227
- await this.write();
228
- }
229
-
230
- print() {
231
- const extNames = Object.keys(this.installedExtensions);
232
-
233
- if (_lodash.default.isEmpty(extNames)) {
234
- _logger.default.info(`No ${this.configKey} have been installed. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
235
-
236
- return;
237
- }
238
-
239
- _logger.default.info(`Available ${this.configKey}:`);
240
-
241
- for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
242
- _logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
243
- }
244
- }
245
-
246
- extensionDesc(extName, extData) {
247
- throw new Error('This must be implemented in a subclass');
248
- }
249
-
250
- getExtensionRequirePath(extName) {
251
- const {
252
- pkgName,
253
- installPath
254
- } = this.installedExtensions[extName];
255
- return _path.default.resolve(this.appiumHome, installPath, 'node_modules', pkgName);
256
- }
257
-
258
- getInstallPath(extName) {
259
- const {
260
- installPath
261
- } = this.installedExtensions[extName];
262
- return _path.default.resolve(this.appiumHome, installPath);
263
- }
264
-
265
- require(extName) {
266
- const {
267
- mainClass
268
- } = this.installedExtensions[extName];
269
- const reqPath = this.getExtensionRequirePath(extName);
270
-
271
- const reqResolved = require.resolve(reqPath);
272
-
273
- if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
274
- _logger.default.debug(`Removing ${reqResolved} from require cache`);
275
-
276
- delete require.cache[reqResolved];
277
- }
278
-
279
- return require(reqPath)[mainClass];
280
- }
281
-
282
- isInstalled(extName) {
283
- return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
284
- }
285
-
286
- static _readExtensionSchema(appiumHome, extType, extName, extData) {
287
- const {
288
- installPath,
289
- pkgName,
290
- schema: argSchemaPath
291
- } = extData;
292
-
293
- if (!argSchemaPath) {
294
- throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
295
- }
296
-
297
- let moduleObject;
298
-
299
- if (_lodash.default.isString(argSchemaPath)) {
300
- const schemaPath = (0, _resolveFrom.default)(_path.default.resolve(appiumHome, installPath), _path.default.normalize(`${pkgName}/${argSchemaPath}`));
301
- moduleObject = require(schemaPath);
302
- } else {
303
- moduleObject = argSchemaPath;
304
- }
305
-
306
- const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
307
- (0, _schema.registerSchema)(extType, extName, schema);
308
- return schema;
309
- }
310
-
311
- readExtensionSchema(extName, extData) {
312
- return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
313
- }
314
-
315
- }
316
-
317
- exports.default = ExtensionConfig;require('source-map-support').install();
318
-
319
-
320
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHRlbnNpb24tY29uZmlnLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwiaG9tZWRpciIsIkFQUElVTV9IT01FIiwicHJvY2VzcyIsImVudiIsIklOU1RBTExfVFlQRV9OUE0iLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRVMiLCJFeHRlbnNpb25Db25maWciLCJjb25zdHJ1Y3RvciIsImFwcGl1bUhvbWUiLCJleHRlbnNpb25UeXBlIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImxvZyIsImVycm9yIiwiYmluZCIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJpbyIsImNvbmZpZ0tleSIsInZhbGlkYXRlIiwiZXh0cyIsImZvdW5kUHJvYmxlbXMiLCJleHROYW1lIiwiZXh0RGF0YSIsInRvUGFpcnMiLCJnZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMiLCJnZXRDb25maWdQcm9ibGVtcyIsImdldFNjaGVtYVByb2JsZW1zIiwicHJvYmxlbVN1bW1hcmllcyIsInByb2JsZW1zIiwiaXNFbXB0eSIsInB1c2giLCJwcm9ibGVtIiwiZXJyIiwiSlNPTiIsInN0cmluZ2lmeSIsInZhbCIsImZpbGVwYXRoIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJpc1N0cmluZyIsInJlYWRFeHRlbnNpb25TY2hlbWEiLCJtZXNzYWdlIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsImpvaW4iLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsInBrZ05hbWUiLCJpbnN0YWxsU3BlYyIsImluc3RhbGxUeXBlIiwiaW5zdGFsbFBhdGgiLCJtYWluQ2xhc3MiLCJpbmNsdWRlcyIsInJlYWQiLCJleHRlbnNpb25zIiwid3JpdGUiLCJhZGRFeHRlbnNpb24iLCJ1cGRhdGVFeHRlbnNpb24iLCJyZW1vdmVFeHRlbnNpb24iLCJwcmludCIsImV4dE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCIsImdldEluc3RhbGxQYXRoIiwicmVxdWlyZSIsInJlcVBhdGgiLCJyZXFSZXNvbHZlZCIsIkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyIsImNhY2hlIiwiZGVidWciLCJpc0luc3RhbGxlZCIsIl9yZWFkRXh0ZW5zaW9uU2NoZW1hIiwiZXh0VHlwZSIsIlR5cGVFcnJvciIsIm1vZHVsZU9iamVjdCIsInNjaGVtYVBhdGgiLCJub3JtYWxpemUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLG1CQUFtQixHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFlBQUdDLE9BQUgsRUFBYixFQUEyQixTQUEzQixDQUE1Qjs7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsV0FBWixJQUEyQkwsbUJBQS9DOztBQUVBLE1BQU1RLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLE9BQTNCOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLFFBQTVCOztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQkQsZ0JBRG9CLEVBRXBCRCxtQkFGb0IsRUFHcEJELGtCQUhvQixFQUlwQkQsZ0JBSm9CLENBQXRCOzs7QUFPZSxNQUFNSyxlQUFOLENBQXNCO0FBT25DQyxFQUFBQSxXQUFXLENBQUVDLFVBQUYsRUFBY0MsYUFBZCxFQUE2QkMsS0FBN0IsRUFBb0M7QUFDN0MsVUFBTUMsTUFBTSxHQUFHQyxnQkFBRUMsVUFBRixDQUFhSCxLQUFiLElBQXNCQSxLQUF0QixHQUE4Qkks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RCxLQVBELE1BT087QUFDTEQsTUFBQUEsWUFBWSxHQUFHdkMsYUFBZjtBQUNEOztBQUVELFVBQU1ELE1BQU0sR0FBR3dDLFlBQVksQ0FBQ0csVUFBYixHQUNYSCxZQUFZLENBQUNJLE9BREYsR0FFWEosWUFGSjtBQUdBLGdDQUFlRixPQUFmLEVBQXdCdkQsT0FBeEIsRUFBaUNpQixNQUFqQztBQUNBLFdBQU9BLE1BQVA7QUFDRDs7QUFTREcsRUFBQUEsbUJBQW1CLENBQUVwQixPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDckMsV0FBT2xCLGVBQWUsQ0FBQ3VFLG9CQUFoQixDQUFxQyxLQUFLckUsVUFBMUMsRUFBc0QsS0FBS0MsYUFBM0QsRUFBMEVjLE9BQTFFLEVBQW1GQyxPQUFuRixDQUFQO0FBQ0Q7O0FBelRrQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlc29sdmVGcm9tIGZyb20gJ3Jlc29sdmUtZnJvbSc7XG5pbXBvcnQgeyBnZXRFeHRDb25maWdJT0luc3RhbmNlIH0gZnJvbSAnLi9leHQtY29uZmlnLWlvJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUywgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiwgcmVnaXN0ZXJTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBERUZBVUxUX0FQUElVTV9IT01FID0gcGF0aC5yZXNvbHZlKG9zLmhvbWVkaXIoKSwgJy5hcHBpdW0nKTtcbmNvbnN0IEFQUElVTV9IT01FID0gcHJvY2Vzcy5lbnYuQVBQSVVNX0hPTUUgfHwgREVGQVVMVF9BUFBJVU1fSE9NRTtcblxuY29uc3QgSU5TVEFMTF9UWVBFX05QTSA9ICducG0nO1xuY29uc3QgSU5TVEFMTF9UWVBFX0xPQ0FMID0gJ2xvY2FsJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVRIVUIgPSAnZ2l0aHViJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVQgPSAnZ2l0JztcbmNvbnN0IElOU1RBTExfVFlQRVMgPSBbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYFxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGV4dGVuc2lvblR5cGUsIGxvZ0ZuKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gXy5pc0Z1bmN0aW9uKGxvZ0ZuKSA/IGxvZ0ZuIDogbG9nLmVycm9yLmJpbmQobG9nKTtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLmFwcGl1bUhvbWUgPSBhcHBpdW1Ib21lO1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxvYmplY3Q+fSAqL1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHt9O1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25Db25maWdJT30gKi9cbiAgICB0aGlzLmlvID0gZ2V0RXh0Q29uZmlnSU9JbnN0YW5jZShhcHBpdW1Ib21lKTtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvblR5cGV9ICovXG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICAvKiogQHR5cGUgeydkcml2ZXJzJ3wncGx1Z2lucyd9ICovXG4gICAgdGhpcy5jb25maWdLZXkgPSBgJHtleHRlbnNpb25UeXBlfXNgOyAvLyB0b2RvIHVzZSB0ZW1wbGF0ZSB0eXBlXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSk9PnZvaWR9XG4gICAgICovXG4gICAgdGhpcy5sb2cgPSBsb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGV4dGVuc2lvbnMgZm9yIHByb2JsZW1zXG4gICAqIEB0ZW1wbGF0ZSBFeHREYXRhXG4gICAqIEBwYXJhbSB7RXh0RGF0YVtdfSBleHRzIC0gQXJyYXkgb2YgZXh0RGF0YSBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtFeHREYXRhW119XG4gICAqL1xuICB2YWxpZGF0ZSAoZXh0cykge1xuICAgIGNvbnN0IGZvdW5kUHJvYmxlbXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGZvdW5kUHJvYmxlbXNbZXh0TmFtZV0gPSBbXG4gICAgICAgIC4uLnRoaXMuZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldFNjaGVtYVByb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2JsZW1TdW1tYXJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBwcm9ibGVtc10gb2YgXy50b1BhaXJzKGZvdW5kUHJvYmxlbXMpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHByb2JsZW1zKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGlzIGV4dGVuc2lvbiBmcm9tIHRoZSBsaXN0IHNpbmNlIGl0J3Mgbm90IHZhbGlkXG4gICAgICBkZWxldGUgZXh0c1tleHROYW1lXTtcbiAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShwcm9ibGVtU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICAgICAgIGB0aGUgJHt0aGlzLmNvbmZpZ0tleX0gZXh0ZW5zaW9uIGZpbGUgKCR7dGhpcy5pby5maWxlcGF0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHByb2JsZW1TdW1tYXJpZXMpIHtcbiAgICAgICAgdGhpcy5sb2coc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge1Byb2JsZW1bXX1cbiAgICovXG4gIGdldFNjaGVtYVByb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKGFyZ1NjaGVtYVBhdGgpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe2VycjogYFVuYWJsZSB0byByZWdpc3RlciBzY2hlbWEgYXQgcGF0aCAke2FyZ1NjaGVtYVBhdGh9OyAke2Vyci5tZXNzYWdlfWAsIHZhbDogYXJnU2NoZW1hUGF0aH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGVycjogYFNjaGVtYSBmaWxlIGhhcyB1bnN1cHBvcnRlZCBleHRlbnNpb24uIEFsbG93ZWQ6ICR7Wy4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlNdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIGVtYmVkZGVkIHNjaGVtYTsgJHtlcnIubWVzc2FnZX1gLCB2YWw6IGFyZ1NjaGVtYVBhdGh9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHNjaGVtYSBmaWVsZDsgbXVzdCBiZSBhIHBhdGggdG8gYSBzY2hlbWEgZmlsZSBvciBhIHNjaGVtYSBvYmplY3QuJyxcbiAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldEdlbmVyaWNDb25maWdQcm9ibGVtcyAoZXh0RGF0YSwgZXh0TmFtZSkge1xuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lLCBpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIGluc3RhbGxQYXRoLCBtYWluQ2xhc3N9ID0gZXh0RGF0YTtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCB2ZXJzaW9uJywgdmFsOiB2ZXJzaW9ufSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJywgdmFsOiBwa2dOYW1lfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbGF0aW9uIHNwZWMnLCB2YWw6IGluc3RhbGxTcGVjfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmluY2x1ZGVzKElOU1RBTExfVFlQRVMsIGluc3RhbGxUeXBlKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJywgdmFsOiBpbnN0YWxsVHlwZX0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsUGF0aCkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBwYXRoJywgdmFsOiBpbnN0YWxsUGF0aH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBkcml2ZXIgY2xhc3MgbmFtZScsIHZhbDogbWFpbkNsYXNzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnM+fVxuICAgKi9cbiAgYXN5bmMgcmVhZCAoKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGF3YWl0IHRoaXMuaW8ucmVhZCh0aGlzLmV4dGVuc2lvblR5cGUpO1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHRoaXMudmFsaWRhdGUoZXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIHdyaXRlICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pby53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0gZXh0RGF0YTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSB7XG4gICAgICAuLi50aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0sXG4gICAgICAuLi5leHREYXRhLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRXh0ZW5zaW9uIChleHROYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICBwcmludCAoKSB7XG4gICAgY29uc3QgZXh0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkoZXh0TmFtZXMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJHt0aGlzLmNvbmZpZ0tleX0gaGF2ZSBiZWVuIGluc3RhbGxlZC4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSAke3RoaXMuY29uZmlnS2V5fTpgKTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHREYXRhKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBleHRlbnNpb25EZXNjIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHtwa2dOYW1lLCBpbnN0YWxsUGF0aH0gPSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmFwcGl1bUhvbWUsIGluc3RhbGxQYXRoLCAnbm9kZV9tb2R1bGVzJywgcGtnTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldEluc3RhbGxQYXRoIChleHROYW1lKSB7XG4gICAgY29uc3Qge2luc3RhbGxQYXRofSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGV4dGVuc2lvbiBhbmQgcmV0dXJucyBpdHMgbWFpbiBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5DbGFzczx1bmtub3duPn1cbiAgICovXG4gIHJlcXVpcmUgKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7bWFpbkNsYXNzfSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBjb25zdCByZXFQYXRoID0gdGhpcy5nZXRFeHRlbnNpb25SZXF1aXJlUGF0aChleHROYW1lKTtcbiAgICBjb25zdCByZXFSZXNvbHZlZCA9IHJlcXVpcmUucmVzb2x2ZShyZXFQYXRoKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWlyZShyZXFQYXRoKVttYWluQ2xhc3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNJbnN0YWxsZWQgKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gXy5pbmNsdWRlcyhPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpLCBleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBtZXRob2RzIG9mIHN1YmNsYXNzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZSAodW5pcXVlIHRvIGl0cyB0eXBlKVxuICAgKiBAcGFyYW0ge0V4dERhdGF9IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7aW5zdGFsbFBhdGgsIHBrZ05hbWUsIHNjaGVtYTogYXJnU2NoZW1hUGF0aH0gPSBleHREYXRhO1xuICAgIGlmICghYXJnU2NoZW1hUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYE5vIFxcYHNjaGVtYVxcYCBwcm9wZXJ0eSBmb3VuZCBpbiBjb25maWcgZm9yICR7ZXh0VHlwZX0gJHtwa2dOYW1lfSAtLSB3aHkgaXMgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQ/YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBtb2R1bGVPYmplY3Q7XG4gICAgaWYgKF8uaXNTdHJpbmcoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSByZXNvbHZlRnJvbShcbiAgICAgICAgcGF0aC5yZXNvbHZlKGFwcGl1bUhvbWUsIGluc3RhbGxQYXRoKSxcbiAgICAgICAgLy8gdGhpcyBwYXRoIHNlcCBpcyBmaW5lIGJlY2F1c2UgYHJlc29sdmVGcm9tYCB1c2VzIE5vZGUncyBtb2R1bGUgcmVzb2x1dGlvblxuICAgICAgICBwYXRoLm5vcm1hbGl6ZShgJHtwa2dOYW1lfS8ke2FyZ1NjaGVtYVBhdGh9YCksXG4gICAgICApO1xuICAgICAgbW9kdWxlT2JqZWN0ID0gcmVxdWlyZShzY2hlbWFQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kdWxlT2JqZWN0ID0gYXJnU2NoZW1hUGF0aDtcbiAgICB9XG4gICAgLy8gdGhpcyBzdWNrcy4gZGVmYXVsdCBleHBvcnRzIHNob3VsZCBiZSBkZXN0cm95ZWRcbiAgICBjb25zdCBzY2hlbWEgPSBtb2R1bGVPYmplY3QuX19lc01vZHVsZVxuICAgICAgPyBtb2R1bGVPYmplY3QuZGVmYXVsdFxuICAgICAgOiBtb2R1bGVPYmplY3Q7XG4gICAgcmVnaXN0ZXJTY2hlbWEoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGFuIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNjaGVtYSwgdGhpcyB3aWxsIGxvYWQgdGhlIHNjaGVtYSBhbmQgYXR0ZW1wdCB0b1xuICAgKiByZWdpc3RlciBpdCB3aXRoIHRoZSBzY2hlbWEgcmVnaXN0cmFyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0RGF0YX0gZXh0RGF0YSAtIEV4dGVuc2lvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICByZWFkRXh0ZW5zaW9uU2NoZW1hIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbkNvbmZpZy5fcmVhZEV4dGVuc2lvblNjaGVtYSh0aGlzLmFwcGl1bUhvbWUsIHRoaXMuZXh0ZW5zaW9uVHlwZSwgZXh0TmFtZSwgZXh0RGF0YSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi9leHQtY29uZmlnLWlvJztcbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUywgREVGQVVMVF9BUFBJVU1fSE9NRSwgQVBQSVVNX0hPTUVcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQWxpYXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEV4dGVuc2lvbiBkYXRhIChwdWxsZWQgZnJvbSBjb25maWcgWUFNTClcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dERhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfGltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fSBbc2NoZW1hXSAtIE9wdGlvbmFsIHNjaGVtYSBwYXRoIGlmIHRoZSBleHQgZGVmaW5lZCBpdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsUGF0aCAtIEFjdHVhbGx5IGxvb2tzIG1vcmUgbGlrZSBhIG1vZHVsZSBpZGVudGlmaWVyPyBSZXNvbHZlZCBmcm9tIGBBUFBJVU1fSE9NRWBcbiAqL1xuXG4iXSwiZmlsZSI6ImxpYi9leHRlbnNpb24tY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,69 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- require("source-map-support/register");
13
-
14
- var _lodash = _interopRequireDefault(require("lodash"));
15
-
16
- var _extensionConfig = _interopRequireDefault(require("./extension-config"));
17
-
18
- var _extConfigIo = require("./ext-config-io");
19
-
20
- var _logger = _interopRequireDefault(require("./logger"));
21
-
22
- class PluginConfig extends _extensionConfig.default {
23
- constructor(appiumHome, logFn) {
24
- super(appiumHome, _extConfigIo.PLUGIN_TYPE, logFn);
25
- }
26
-
27
- static getInstance(appiumHome, logFn) {
28
- var _PluginConfig$_instan;
29
-
30
- const instance = (_PluginConfig$_instan = PluginConfig._instances[appiumHome]) !== null && _PluginConfig$_instan !== void 0 ? _PluginConfig$_instan : new PluginConfig(appiumHome, logFn);
31
- PluginConfig._instances[appiumHome] = instance;
32
- return instance;
33
- }
34
-
35
- extensionDesc(pluginName, {
36
- version
37
- }) {
38
- return `${pluginName}@${version}`;
39
- }
40
-
41
- print(activeNames) {
42
- const pluginNames = Object.keys(this.installedExtensions);
43
-
44
- if (_lodash.default.isEmpty(pluginNames)) {
45
- _logger.default.info(`No plugins have been installed. Use the "appium plugin" ` + 'command to install the one(s) you want to use.');
46
-
47
- return;
48
- }
49
-
50
- _logger.default.info(`Available plugins:`);
51
-
52
- for (const [pluginName, pluginData] of _lodash.default.toPairs(this.installedExtensions)) {
53
- const activeTxt = _lodash.default.includes(activeNames, pluginName) ? ' (ACTIVE)' : '';
54
-
55
- _logger.default.info(` - ${this.extensionDesc(pluginName, pluginData)}${activeTxt}`);
56
- }
57
-
58
- if (_lodash.default.isEmpty(activeNames)) {
59
- _logger.default.info('No plugins activated. Use the --use-plugins flag with names of plugins to activate');
60
- }
61
- }
62
-
63
- }
64
-
65
- exports.default = PluginConfig;
66
- (0, _defineProperty2.default)(PluginConfig, "_instances", {});require('source-map-support').install();
67
-
68
-
69
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiX2luc3RhbmNlcyIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVlLE1BQU1BLFlBQU4sU0FBMkJDLHdCQUEzQixDQUEyQztBQWtCeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFkLEVBQXFCO0FBQzlCLFVBQU1ELFVBQU4sRUFBa0JFLHdCQUFsQixFQUErQkQsS0FBL0I7QUFDRDs7QUFRaUIsU0FBWEUsV0FBVyxDQUFFSCxVQUFGLEVBQWNDLEtBQWQsRUFBcUI7QUFBQTs7QUFDckMsVUFBTUcsUUFBUSw0QkFBR1AsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixDQUFILHlFQUEwQyxJQUFJSCxZQUFKLENBQWlCRyxVQUFqQixFQUE2QkMsS0FBN0IsQ0FBeEQ7QUFDQUosSUFBQUEsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixJQUFzQ0ksUUFBdEM7QUFDQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBRURFLEVBQUFBLGFBQWEsQ0FBRUMsVUFBRixFQUFjO0FBQUNDLElBQUFBO0FBQUQsR0FBZCxFQUF5QjtBQUNwQyxXQUFRLEdBQUVELFVBQVcsSUFBR0MsT0FBUSxFQUFoQztBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUVDLFdBQUYsRUFBZTtBQUNsQixVQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtDLG1CQUFqQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVTCxXQUFWLENBQUosRUFBNEI7QUFDMUJNLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDWCxVQUFELEVBQWFZLFVBQWIsQ0FBWCxJQUF1Q0osZ0JBQUVLLE9BQUYsQ0FBVSxLQUFLTixtQkFBZixDQUF2QyxFQUE0RTtBQUMxRSxZQUFNTyxTQUFTLEdBQUdOLGdCQUFFTyxRQUFGLENBQVdaLFdBQVgsRUFBd0JILFVBQXhCLElBQXNDLFdBQXRDLEdBQW9ELEVBQXRFOztBQUNBVSxzQkFBSUMsSUFBSixDQUFVLE9BQU0sS0FBS1osYUFBTCxDQUFtQkMsVUFBbkIsRUFBK0JZLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVTixXQUFWLENBQUosRUFBNEI7QUFDMUJPLHNCQUFJQyxJQUFKLENBQVMsb0ZBQVQ7QUFDRDtBQUNGOztBQXhEdUQ7Ozs4QkFBckNyQixZLGdCQVFDLEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZyBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dC1jb25maWctaW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkNvbmZpZyBleHRlbmRzIEV4dGVuc2lvbkNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiBgQVBQSVVNX0hPTUVgIHZhbHVlcyB0byB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqIEVhY2ggYEFQUElVTV9IT01FYCBzaG91bGQgb25seSBoYXZlIG9uZSBhc3NvY2lhdGVkIGBQbHVnaW5Db25maWdgIGluc3RhbmNlLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQbHVnaW5Db25maWc+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW5jZXMgPSB7fTtcblxuICAvKipcbiAgICogQ2FsbCB7QGxpbmsgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBKdXN0IGNhbGxzIHRoZSBzdXBlcmNsYXNzJyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYCBwYXRoXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKX0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lLCBsb2dGbikge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciBnZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5Db25maWd9IGJhc2VkIHZhbHVlIG9mIGBhcHBpdW1Ib21lYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIGBBUFBJVU1fSE9NRWAgcGF0aFxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1BsdWdpbkNvbmZpZ31cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSAoYXBwaXVtSG9tZSwgbG9nRm4pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID8/IG5ldyBQbHVnaW5Db25maWcoYXBwaXVtSG9tZSwgbG9nRm4pO1xuICAgIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgZXh0ZW5zaW9uRGVzYyAocGx1Z2luTmFtZSwge3ZlcnNpb259KSB7XG4gICAgcmV0dXJuIGAke3BsdWdpbk5hbWV9QCR7dmVyc2lvbn1gO1xuICB9XG5cbiAgcHJpbnQgKGFjdGl2ZU5hbWVzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZU5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oJ05vIHBsdWdpbnMgYWN0aXZhdGVkLiBVc2UgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZyB3aXRoIG5hbWVzIG9mIHBsdWdpbnMgdG8gYWN0aXZhdGUnKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJmaWxlIjoibGliL3BsdWdpbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,18 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.KNOWN_PLUGINS = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- const KNOWN_PLUGINS = {
11
- images: '@appium/images-plugin',
12
- 'execute-driver': '@appium/execute-driver-plugin',
13
- 'relaxed-caps': '@appium/relaxed-caps-plugin'
14
- };
15
- exports.KNOWN_PLUGINS = KNOWN_PLUGINS;require('source-map-support').install();
16
-
17
-
18
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbIktOT1dOX1BMVUdJTlMiLCJpbWFnZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlBLE1BQU1BLGFBQWEsR0FBRztBQUNwQkMsRUFBQUEsTUFBTSxFQUFFLHVCQURZO0FBRXBCLG9CQUFrQiwrQkFGRTtBQUdwQixrQkFBZ0I7QUFISSxDQUF0QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgYSBtYXAgb2YgcGx1Z2luIG5hbWVzIHRvIG5wbSBwYWNrYWdlcyByZXByZXNlbnRpbmcgdGhvc2UgcGx1Z2lucy5cbi8vIFRoZSBwbHVnaW5zIGluIHRoaXMgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgQ0xJIHNvIHVzZXJzIGNhbiBqdXN0XG4vLyB0eXBlICdhcHBpdW0gcGx1Z2luIGluc3RhbGwgJ25hbWUnJywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGZ1bGxcbi8vIG5wbSBwYWNrYWdlLiBJLmUuLCB0aGVzZSBhcmUgdGhlIG9mZmljaWFsbHkgcmVjb2duaXplZCBwbHVnaW5zLlxuY29uc3QgS05PV05fUExVR0lOUyA9IHtcbiAgaW1hZ2VzOiAnQGFwcGl1bS9pbWFnZXMtcGx1Z2luJyxcbiAgJ2V4ZWN1dGUtZHJpdmVyJzogJ0BhcHBpdW0vZXhlY3V0ZS1kcml2ZXItcGx1Z2luJyxcbiAgJ3JlbGF4ZWQtY2Fwcyc6ICdAYXBwaXVtL3JlbGF4ZWQtY2Fwcy1wbHVnaW4nLFxufTtcblxuZXhwb3J0IHtcbiAgS05PV05fUExVR0lOUyxcbn07XG4iXSwiZmlsZSI6ImxpYi9wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=