appium 2.0.0-beta.4 → 2.0.0-beta.40

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 (151) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +257 -131
  5. package/build/lib/cli/args.d.ts +20 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +36 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +25 -18
  11. package/build/lib/cli/extension-command.d.ts +372 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +286 -156
  14. package/build/lib/cli/extension.d.ts +18 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +30 -17
  17. package/build/lib/cli/parser.d.ts +80 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +152 -95
  20. package/build/lib/cli/plugin-command.d.ts +33 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +24 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +41 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +92 -67
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +74 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +68 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +189 -90
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +180 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +452 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +112 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +517 -186
  99. package/lib/cli/args.js +269 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +612 -260
  102. package/lib/cli/extension.js +34 -16
  103. package/lib/cli/parser.js +241 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +210 -91
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +679 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +303 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +75 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +177 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/types/appium-manifest.ts +73 -0
  133. package/types/cli.ts +146 -0
  134. package/types/extension-manifest.ts +64 -0
  135. package/types/index.ts +21 -0
  136. package/CHANGELOG.md +0 -3515
  137. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  138. package/build/lib/cli/npm.js +0 -206
  139. package/build/lib/cli/parser-helpers.js +0 -82
  140. package/build/lib/driver-config.js +0 -77
  141. package/build/lib/drivers.js +0 -96
  142. package/build/lib/extension-config.js +0 -253
  143. package/build/lib/plugin-config.js +0 -59
  144. package/build/lib/plugins.js +0 -14
  145. package/lib/cli/npm.js +0 -183
  146. package/lib/cli/parser-helpers.js +0 -79
  147. package/lib/driver-config.js +0 -46
  148. package/lib/drivers.js +0 -81
  149. package/lib/extension-config.js +0 -209
  150. package/lib/plugin-config.js +0 -34
  151. package/lib/plugins.js +0 -10
@@ -1,253 +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.PLUGIN_TYPE = exports.DRIVER_TYPE = exports.DEFAULT_APPIUM_HOME = exports.INSTALL_TYPES = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPE_NPM = exports.default = void 0;
9
-
10
- require("source-map-support/register");
11
-
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
- var _logger = _interopRequireDefault(require("./logger"));
15
-
16
- var _appiumSupport = require("appium-support");
17
-
18
- var _path = _interopRequireDefault(require("path"));
19
-
20
- var _os = _interopRequireDefault(require("os"));
21
-
22
- var _yaml = _interopRequireDefault(require("yaml"));
23
-
24
- const DRIVER_TYPE = 'driver';
25
- exports.DRIVER_TYPE = DRIVER_TYPE;
26
- const PLUGIN_TYPE = 'plugin';
27
- exports.PLUGIN_TYPE = PLUGIN_TYPE;
28
-
29
- const DEFAULT_APPIUM_HOME = _os.default.homedir();
30
-
31
- exports.DEFAULT_APPIUM_HOME = DEFAULT_APPIUM_HOME;
32
- const CONFIG_FILE_NAME = 'extensions.yaml';
33
- const CONFIG_SCHEMA_REV = 2;
34
- const INSTALL_TYPE_NPM = 'npm';
35
- exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
36
- const INSTALL_TYPE_LOCAL = 'local';
37
- exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
38
- const INSTALL_TYPE_GITHUB = 'github';
39
- exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
40
- const INSTALL_TYPE_GIT = 'git';
41
- exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
42
- const INSTALL_TYPES = [INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM];
43
- exports.INSTALL_TYPES = INSTALL_TYPES;
44
-
45
- class ExtensionConfig {
46
- constructor(appiumHome, extensionType, logFn = null) {
47
- if (logFn === null) {
48
- logFn = _logger.default.error.bind(_logger.default);
49
- }
50
-
51
- this.appiumHome = appiumHome;
52
- this.configFile = _path.default.resolve(this.appiumHome, CONFIG_FILE_NAME);
53
- this.installedExtensions = {};
54
- this.extensionType = extensionType;
55
- this.configKey = `${extensionType}s`;
56
- this.yamlData = {
57
- [`${DRIVER_TYPE}s`]: {},
58
- [`${PLUGIN_TYPE}s`]: {}
59
- };
60
- this.log = logFn;
61
- }
62
-
63
- validate(exts) {
64
- const foundProblems = {};
65
-
66
- for (const [extName, extData] of _lodash.default.toPairs(exts)) {
67
- foundProblems[extName] = [...this.getGenericConfigProblems(extData), ...this.getConfigProblems(extData)];
68
- }
69
-
70
- const problemSummaries = [];
71
-
72
- for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
73
- if (_lodash.default.isEmpty(problems)) {
74
- continue;
75
- }
76
-
77
- delete exts[extName];
78
- problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
79
-
80
- for (const problem of problems) {
81
- problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
82
- }
83
- }
84
-
85
- if (!_lodash.default.isEmpty(problemSummaries)) {
86
- this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.configFile}):`);
87
-
88
- for (const summary of problemSummaries) {
89
- this.log(summary);
90
- }
91
- }
92
-
93
- return exts;
94
- }
95
-
96
- getGenericConfigProblems(ext) {
97
- const {
98
- version,
99
- pkgName,
100
- installSpec,
101
- installType,
102
- installPath,
103
- mainClass
104
- } = ext;
105
- const problems = [];
106
-
107
- if (!_lodash.default.isString(version)) {
108
- problems.push({
109
- err: 'Missing or incorrect version',
110
- val: version
111
- });
112
- }
113
-
114
- if (!_lodash.default.isString(pkgName)) {
115
- problems.push({
116
- err: 'Missing or incorrect NPM package name',
117
- val: pkgName
118
- });
119
- }
120
-
121
- if (!_lodash.default.isString(installSpec)) {
122
- problems.push({
123
- err: 'Missing or incorrect installation spec',
124
- val: installSpec
125
- });
126
- }
127
-
128
- if (!_lodash.default.includes(INSTALL_TYPES, installType)) {
129
- problems.push({
130
- err: 'Missing or incorrect install type',
131
- val: installType
132
- });
133
- }
134
-
135
- if (!_lodash.default.isString(installPath)) {
136
- problems.push({
137
- err: 'Missing or incorrect installation path',
138
- val: installPath
139
- });
140
- }
141
-
142
- if (!_lodash.default.isString(mainClass)) {
143
- problems.push({
144
- err: 'Missing or incorrect driver class name',
145
- val: mainClass
146
- });
147
- }
148
-
149
- return problems;
150
- }
151
-
152
- getConfigProblems() {
153
- return [];
154
- }
155
-
156
- applySchemaMigrations() {
157
- if (this.yamlData.schemaRev < 2 && _lodash.default.isUndefined(this.yamlData[PLUGIN_TYPE])) {
158
- this.yamlData[PLUGIN_TYPE] = {};
159
- }
160
- }
161
-
162
- async read() {
163
- await (0, _appiumSupport.mkdirp)(this.appiumHome);
164
-
165
- try {
166
- this.yamlData = _yaml.default.parse(await _appiumSupport.fs.readFile(this.configFile, 'utf8'));
167
- this.applySchemaMigrations();
168
- this.installedExtensions = this.validate(this.yamlData[this.configKey]);
169
- } catch (err) {
170
- if (await _appiumSupport.fs.exists(this.configFile)) {
171
- throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this.configFile}). Ensure it exists and is ` + `readable. Specific error: ${err.message}`);
172
- }
173
-
174
- try {
175
- await this.write();
176
- } catch {
177
- throw new Error(`Appium could not read or write from the Appium Home directory ` + `(${this.appiumHome}). Please ensure it is writable.`);
178
- }
179
- }
180
-
181
- return this.installedExtensions;
182
- }
183
-
184
- async write() {
185
- const newYamlData = { ...this.yamlData,
186
- schemaRev: CONFIG_SCHEMA_REV,
187
- [this.configKey]: this.installedExtensions
188
- };
189
- await _appiumSupport.fs.writeFile(this.configFile, _yaml.default.stringify(newYamlData), 'utf8');
190
- }
191
-
192
- async addExtension(extName, extData) {
193
- this.installedExtensions[extName] = extData;
194
- await this.write();
195
- }
196
-
197
- async removeExtension(extName) {
198
- delete this.installedExtensions[extName];
199
- await this.write();
200
- }
201
-
202
- print() {
203
- const extNames = Object.keys(this.installedExtensions);
204
-
205
- if (_lodash.default.isEmpty(extNames)) {
206
- _logger.default.info(`No ${this.configKey} have been installed. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
207
-
208
- return;
209
- }
210
-
211
- _logger.default.info(`Available ${this.configKey}:`);
212
-
213
- for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
214
- _logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
215
- }
216
- }
217
-
218
- extensionDesc() {
219
- throw new Error('This must be implemented in a final class');
220
- }
221
-
222
- getExtensionRequirePath(extName) {
223
- const {
224
- pkgName,
225
- installPath
226
- } = this.installedExtensions[extName];
227
- return _path.default.resolve(this.appiumHome, installPath, 'node_modules', pkgName);
228
- }
229
-
230
- getInstallPath(extName) {
231
- const {
232
- installPath
233
- } = this.installedExtensions[extName];
234
- return _path.default.resolve(this.appiumHome, installPath);
235
- }
236
-
237
- require(extName) {
238
- const {
239
- mainClass
240
- } = this.installedExtensions[extName];
241
- return require(this.getExtensionRequirePath(extName))[mainClass];
242
- }
243
-
244
- isInstalled(extName) {
245
- return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
246
- }
247
-
248
- }
249
-
250
- exports.default = ExtensionConfig;require('source-map-support').install();
251
-
252
-
253
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHRlbnNpb24tY29uZmlnLmpzIl0sIm5hbWVzIjpbIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJERUZBVUxUX0FQUElVTV9IT01FIiwib3MiLCJob21lZGlyIiwiQ09ORklHX0ZJTEVfTkFNRSIsIkNPTkZJR19TQ0hFTUFfUkVWIiwiSU5TVEFMTF9UWVBFX05QTSIsIklOU1RBTExfVFlQRV9MT0NBTCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJJTlNUQUxMX1RZUEVfR0lUIiwiSU5TVEFMTF9UWVBFUyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImV4dGVuc2lvblR5cGUiLCJsb2dGbiIsImxvZyIsImVycm9yIiwiYmluZCIsImNvbmZpZ0ZpbGUiLCJwYXRoIiwicmVzb2x2ZSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJjb25maWdLZXkiLCJ5YW1sRGF0YSIsInZhbGlkYXRlIiwiZXh0cyIsImZvdW5kUHJvYmxlbXMiLCJleHROYW1lIiwiZXh0RGF0YSIsIl8iLCJ0b1BhaXJzIiwiZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJwcm9ibGVtU3VtbWFyaWVzIiwicHJvYmxlbXMiLCJpc0VtcHR5IiwicHVzaCIsInByb2JsZW0iLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsIiwic3VtbWFyeSIsImV4dCIsInZlcnNpb24iLCJwa2dOYW1lIiwiaW5zdGFsbFNwZWMiLCJpbnN0YWxsVHlwZSIsImluc3RhbGxQYXRoIiwibWFpbkNsYXNzIiwiaXNTdHJpbmciLCJpbmNsdWRlcyIsImFwcGx5U2NoZW1hTWlncmF0aW9ucyIsInNjaGVtYVJldiIsImlzVW5kZWZpbmVkIiwicmVhZCIsIllBTUwiLCJwYXJzZSIsImZzIiwicmVhZEZpbGUiLCJleGlzdHMiLCJFcnJvciIsIm1lc3NhZ2UiLCJ3cml0ZSIsIm5ld1lhbWxEYXRhIiwid3JpdGVGaWxlIiwiYWRkRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJleHROYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbmZvIiwiZXh0ZW5zaW9uRGVzYyIsImdldEV4dGVuc2lvblJlcXVpcmVQYXRoIiwiZ2V0SW5zdGFsbFBhdGgiLCJyZXF1aXJlIiwiaXNJbnN0YWxsZWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLFFBQXBCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxRQUFwQjs7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUdDLFlBQUdDLE9BQUgsRUFBNUI7OztBQUVBLE1BQU1DLGdCQUFnQixHQUFHLGlCQUF6QjtBQUNBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsT0FBM0I7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsUUFBNUI7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCRCxnQkFEb0IsRUFFcEJELG1CQUZvQixFQUdwQkQsa0JBSG9CLEVBSXBCRCxnQkFKb0IsQ0FBdEI7OztBQVFlLE1BQU1LLGVBQU4sQ0FBc0I7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxhQUFkLEVBQTZCQyxLQUFLLEdBQUcsSUFBckMsRUFBMkM7QUFDcEQsUUFBSUEsS0FBSyxLQUFLLElBQWQsRUFBb0I7QUFDbEJBLE1BQUFBLEtBQUssR0FBR0MsZ0JBQUlDLEtBQUosQ0FBVUMsSUFBVixDQUFlRixlQUFmLENBQVI7QUFDRDs7QUFDRCxTQUFLSCxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtNLFVBQUwsR0FBa0JDLGNBQUtDLE9BQUwsQ0FBYSxLQUFLUixVQUFsQixFQUE4QlQsZ0JBQTlCLENBQWxCO0FBQ0EsU0FBS2tCLG1CQUFMLEdBQTJCLEVBQTNCO0FBQ0Es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QUwsQ0FBeUJNLE9BQXpCLENBQXRCO0FBQ0EsV0FBT1IsY0FBS0MsT0FBTCxDQUFhLEtBQUtSLFVBQWxCLEVBQThCb0MsV0FBOUIsQ0FBUDtBQUNEOztBQUVENEIsRUFBQUEsT0FBTyxDQUFFakQsT0FBRixFQUFXO0FBQ2hCLFVBQU07QUFBQ3NCLE1BQUFBO0FBQUQsUUFBYyxLQUFLNUIsbUJBQUwsQ0FBeUJNLE9BQXpCLENBQXBCO0FBQ0EsV0FBT2lELE9BQU8sQ0FBQyxLQUFLRix1QkFBTCxDQUE2Qi9DLE9BQTdCLENBQUQsQ0FBUCxDQUErQ3NCLFNBQS9DLENBQVA7QUFDRDs7QUFFRDRCLEVBQUFBLFdBQVcsQ0FBRWxELE9BQUYsRUFBVztBQUNwQixXQUFPRSxnQkFBRXNCLFFBQUYsQ0FBV21CLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtsRCxtQkFBakIsQ0FBWCxFQUFrRE0sT0FBbEQsQ0FBUDtBQUNEOztBQWhMa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5cbmNvbnN0IERSSVZFUl9UWVBFID0gJ2RyaXZlcic7XG5jb25zdCBQTFVHSU5fVFlQRSA9ICdwbHVnaW4nO1xuY29uc3QgREVGQVVMVF9BUFBJVU1fSE9NRSA9IG9zLmhvbWVkaXIoKTtcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRSA9ICdleHRlbnNpb25zLnlhbWwnO1xuY29uc3QgQ09ORklHX1NDSEVNQV9SRVYgPSAyO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuY29uc3QgSU5TVEFMTF9UWVBFUyA9IFtcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxuICBJTlNUQUxMX1RZUEVfTlBNXG5dO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dGVuc2lvbkNvbmZpZyB7XG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lLCBleHRlbnNpb25UeXBlLCBsb2dGbiA9IG51bGwpIHtcbiAgICBpZiAobG9nRm4gPT09IG51bGwpIHtcbiAgICAgIGxvZ0ZuID0gbG9nLmVycm9yLmJpbmQobG9nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBpdW1Ib21lID0gYXBwaXVtSG9tZTtcbiAgICB0aGlzLmNvbmZpZ0ZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5hcHBpdW1Ib21lLCBDT05GSUdfRklMRV9OQU1FKTtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMgPSB7fTtcbiAgICB0aGlzLmV4dGVuc2lvblR5cGUgPSBleHRlbnNpb25UeXBlO1xuICAgIHRoaXMuY29uZmlnS2V5ID0gYCR7ZXh0ZW5zaW9uVHlwZX1zYDtcbiAgICB0aGlzLnlhbWxEYXRhID0ge1tgJHtEUklWRVJfVFlQRX1zYF06IHt9LCBbYCR7UExVR0lOX1RZUEV9c2BdOiB7fX07XG4gICAgdGhpcy5sb2cgPSBsb2dGbjtcbiAgfVxuXG4gIHZhbGlkYXRlIChleHRzKSB7XG4gICAgY29uc3QgZm91bmRQcm9ibGVtcyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIGV4dERhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgZm91bmRQcm9ibGVtc1tleHROYW1lXSA9IFtcbiAgICAgICAgLi4udGhpcy5nZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMoZXh0RGF0YSksXG4gICAgICAgIC4uLnRoaXMuZ2V0Q29uZmlnUHJvYmxlbXMoZXh0RGF0YSlcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3QgcHJvYmxlbVN1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHByb2JsZW1zXSBvZiBfLnRvUGFpcnMoZm91bmRQcm9ibGVtcykpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocHJvYmxlbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoaXMgZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgc2luY2UgaXQncyBub3QgdmFsaWRcbiAgICAgIGRlbGV0ZSBleHRzW2V4dE5hbWVdO1xuICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKGAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gJHtleHROYW1lfSBoYWQgZXJyb3JzIGFuZCB3aWxsIG5vdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYmUgYXZhaWxhYmxlLiBFcnJvcnM6YCk7XG4gICAgICBmb3IgKGNvbnN0IHByb2JsZW0gb2YgcHJvYmxlbXMpIHtcbiAgICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKGAgIC0gJHtwcm9ibGVtLmVycn0gKEFjdHVhbCB2YWx1ZTogYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShwcm9ibGVtLnZhbCl9KWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KHByb2JsZW1TdW1tYXJpZXMpKSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIGVuY291bnRlcmVkIG9uZSBvciBtb3JlIGVycm9ycyB3aGlsZSB2YWxpZGF0aW5nIGAgK1xuICAgICAgICAgICAgICAgYHRoZSAke3RoaXMuY29uZmlnS2V5fSBleHRlbnNpb24gZmlsZSAoJHt0aGlzLmNvbmZpZ0ZpbGV9KTpgKTtcbiAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBwcm9ibGVtU3VtbWFyaWVzKSB7XG4gICAgICAgIHRoaXMubG9nKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIChleHQpIHtcbiAgICBjb25zdCB7dmVyc2lvbiwgcGtnTmFtZSwgaW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBpbnN0YWxsUGF0aCwgbWFpbkNsYXNzfSA9IGV4dDtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCB2ZXJzaW9uJywgdmFsOiB2ZXJzaW9ufSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJywgdmFsOiBwa2dOYW1lfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbGF0aW9uIHNwZWMnLCB2YWw6IGluc3RhbGxTcGVjfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmluY2x1ZGVzKElOU1RBTExfVFlQRVMsIGluc3RhbGxUeXBlKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJywgdmFsOiBpbnN0YWxsVHlwZX0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsUGF0aCkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBwYXRoJywgdmFsOiBpbnN0YWxsUGF0aH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBkcml2ZXIgY2xhc3MgbmFtZScsIHZhbDogbWFpbkNsYXNzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgZ2V0Q29uZmlnUHJvYmxlbXMgKC8qZXh0Ki8pIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXBwbHlTY2hlbWFNaWdyYXRpb25zICgpIHtcbiAgICBpZiAodGhpcy55YW1sRGF0YS5zY2hlbWFSZXYgPCAyICYmIF8uaXNVbmRlZmluZWQodGhpcy55YW1sRGF0YVtQTFVHSU5fVFlQRV0pKSB7XG4gICAgICAvLyBhdCBzY2hlbWEgcmV2aXNpb24gMiwgd2Ugc3RhcnRlZCBpbmNsdWRpbmcgcGx1Z2lucyBhcyB3ZWxsIGFzIGRyaXZlcnMgaW4gdGhlIGZpbGUsXG4gICAgICAvLyBzbyBtYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhbiBlbXB0eSBzZWN0aW9uIGZvciBpdFxuICAgICAgdGhpcy55YW1sRGF0YVtQTFVHSU5fVFlQRV0gPSB7fTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWFkICgpIHtcbiAgICBhd2FpdCBta2RpcnAodGhpcy5hcHBpdW1Ib21lKTsgLy8gZW5zdXJlIGFwcGl1bSBob21lIGV4aXN0c1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnlhbWxEYXRhID0gWUFNTC5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmNvbmZpZ0ZpbGUsICd1dGY4JykpO1xuICAgICAgdGhpcy5hcHBseVNjaGVtYU1pZ3JhdGlvbnMoKTtcblxuICAgICAgLy8gc2V0IHRoZSBsaXN0IG9mIGRyaXZlcnMgdGhlIHVzZXIgaGFzIGluc3RhbGxlZFxuICAgICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0gdGhpcy52YWxpZGF0ZSh0aGlzLnlhbWxEYXRhW3RoaXMuY29uZmlnS2V5XSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMuY29uZmlnRmlsZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIGZpbGUgZXhpc3RzIGFuZCB3ZSBjb3VsZG4ndCBwYXJzZSBpdCwgdGhhdCdzIGEgcHJvYmxlbVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcGl1bSBoYWQgdHJvdWJsZSBsb2FkaW5nIHRoZSBleHRlbnNpb24gaW5zdGFsbGF0aW9uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGNhY2hlIGZpbGUgKCR7dGhpcy5jb25maWdGaWxlfSkuIEVuc3VyZSBpdCBleGlzdHMgYW5kIGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHJlYWRhYmxlLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGNvbmZpZyBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRyeSB0byB3cml0ZSBhbiBlbXB0eSBvbmUsIHRvIG1ha2VcbiAgICAgIC8vIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSB3cml0ZSBwcml2aWxlZ2VzLCBhbmQgY29tcGxhaW4gaWYgd2UgZG9uJ3RcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcGl1bSBjb3VsZCBub3QgcmVhZCBvciB3cml0ZSBmcm9tIHRoZSBBcHBpdW0gSG9tZSBkaXJlY3RvcnkgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7dGhpcy5hcHBpdW1Ib21lfSkuIFBsZWFzZSBlbnN1cmUgaXQgaXMgd3JpdGFibGUuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuXG4gIGFzeW5jIHdyaXRlICgpIHtcbiAgICBjb25zdCBuZXdZYW1sRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMueWFtbERhdGEsXG4gICAgICBzY2hlbWFSZXY6IENPTkZJR19TQ0hFTUFfUkVWLFxuICAgICAgW3RoaXMuY29uZmlnS2V5XTogdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zXG4gICAgfTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5jb25maWdGaWxlLCBZQU1MLnN0cmluZ2lmeShuZXdZYW1sRGF0YSksICd1dGY4Jyk7XG4gIH1cblxuICBhc3luYyBhZGRFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSBleHREYXRhO1xuICAgIGF3YWl0IHRoaXMud3JpdGUoKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUV4dGVuc2lvbiAoZXh0TmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgYXdhaXQgdGhpcy53cml0ZSgpO1xuICB9XG5cbiAgcHJpbnQgKCkge1xuICAgIGNvbnN0IGV4dE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBpZiAoXy5pc0VtcHR5KGV4dE5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICR7dGhpcy5jb25maWdLZXl9IGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gJHt0aGlzLmV4dGVuc2lvblR5cGV9XCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgJHt0aGlzLmNvbmZpZ0tleX06YCk7XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgZXh0RGF0YV0gb2YgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucykpIHtcbiAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MoZXh0TmFtZSwgZXh0RGF0YSl9YCk7XG4gICAgfVxuICB9XG5cbiAgZXh0ZW5zaW9uRGVzYyAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgZ2V0RXh0ZW5zaW9uUmVxdWlyZVBhdGggKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgaW5zdGFsbFBhdGh9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5hcHBpdW1Ib21lLCBpbnN0YWxsUGF0aCwgJ25vZGVfbW9kdWxlcycsIHBrZ05hbWUpO1xuICB9XG5cbiAgZ2V0SW5zdGFsbFBhdGggKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7aW5zdGFsbFBhdGh9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5hcHBpdW1Ib21lLCBpbnN0YWxsUGF0aCk7XG4gIH1cblxuICByZXF1aXJlIChleHROYW1lKSB7XG4gICAgY29uc3Qge21haW5DbGFzc30gPSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgcmV0dXJuIHJlcXVpcmUodGhpcy5nZXRFeHRlbnNpb25SZXF1aXJlUGF0aChleHROYW1lKSlbbWFpbkNsYXNzXTtcbiAgfVxuXG4gIGlzSW5zdGFsbGVkIChleHROYW1lKSB7XG4gICAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSwgZXh0TmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICBJTlNUQUxMX1RZUEVTLCBERUZBVUxUX0FQUElVTV9IT01FLCBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUsXG59O1xuIl0sImZpbGUiOiJsaWIvZXh0ZW5zaW9uLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,59 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.default = void 0;
11
-
12
- require("source-map-support/register");
13
-
14
- var _lodash = _interopRequireDefault(require("lodash"));
15
-
16
- var _extensionConfig = _interopRequireWildcard(require("./extension-config"));
17
-
18
- var _logger = _interopRequireDefault(require("./logger"));
19
-
20
- class PluginConfig extends _extensionConfig.default {
21
- constructor(appiumHome, logFn = null) {
22
- super(appiumHome, _extensionConfig.PLUGIN_TYPE, logFn);
23
- }
24
-
25
- extensionDesc(pluginName, {
26
- version
27
- }) {
28
- return `${pluginName}@${version}`;
29
- }
30
-
31
- print(activePlugins) {
32
- const pluginNames = Object.keys(this.installedExtensions);
33
- const activeNames = activePlugins.map(p => p.name);
34
-
35
- if (_lodash.default.isEmpty(pluginNames)) {
36
- _logger.default.info(`No plugins have been installed. Use the "appium plugin" ` + 'command to install the one(s) you want to use.');
37
-
38
- return;
39
- }
40
-
41
- _logger.default.info(`Available plugins:`);
42
-
43
- for (const [pluginName, pluginData] of _lodash.default.toPairs(this.installedExtensions)) {
44
- const activeTxt = _lodash.default.includes(activeNames, pluginName) ? ' (ACTIVE)' : '';
45
-
46
- _logger.default.info(` - ${this.extensionDesc(pluginName, pluginData)}${activeTxt}`);
47
- }
48
-
49
- if (_lodash.default.isEmpty(activePlugins)) {
50
- _logger.default.info('No plugins activated. Use the --plugins flag with names of plugins to activate');
51
- }
52
- }
53
-
54
- }
55
-
56
- exports.default = PluginConfig;require('source-map-support').install();
57
-
58
-
59
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJleHRlbnNpb25EZXNjIiwicGx1Z2luTmFtZSIsInZlcnNpb24iLCJwcmludCIsImFjdGl2ZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiYWN0aXZlTmFtZXMiLCJtYXAiLCJwIiwibmFtZSIsIl8iLCJpc0VtcHR5IiwibG9nIiwiaW5mbyIsInBsdWdpbkRhdGEiLCJ0b1BhaXJzIiwiYWN0aXZlVHh0IiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFZSxNQUFNQSxZQUFOLFNBQTJCQyx3QkFBM0IsQ0FBMkM7QUFDeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFLLEdBQUcsSUFBdEIsRUFBNEI7QUFDckMsVUFBTUQsVUFBTixFQUFrQkUsNEJBQWxCLEVBQStCRCxLQUEvQjtBQUNEOztBQUVERSxFQUFBQSxhQUFhLENBQUVDLFVBQUYsRUFBYztBQUFDQyxJQUFBQTtBQUFELEdBQWQsRUFBeUI7QUFDcEMsV0FBUSxHQUFFRCxVQUFXLElBQUdDLE9BQVEsRUFBaEM7QUFDRDs7QUFFREMsRUFBQUEsS0FBSyxDQUFFQyxhQUFGLEVBQWlCO0FBQ3BCLFVBQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0MsbUJBQWpCLENBQXBCO0FBQ0EsVUFBTUMsV0FBVyxHQUFHTCxhQUFhLENBQUNNLEdBQWQsQ0FBbUJDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxJQUEzQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVVCxXQUFWLENBQUosRUFBNEI7QUFDMUJVLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDZixVQUFELEVBQWFnQixVQUFiLENBQVgsSUFBdUNKLGdCQUFFSyxPQUFGLENBQVUsS0FBS1YsbUJBQWYsQ0FBdkMsRUFBNEU7QUFDMUUsWUFBTVcsU0FBUyxHQUFHTixnQkFBRU8sUUFBRixDQUFXWCxXQUFYLEVBQXdCUixVQUF4QixJQUFzQyxXQUF0QyxHQUFvRCxFQUF0RTs7QUFDQWMsc0JBQUlDLElBQUosQ0FBVSxPQUFNLEtBQUtoQixhQUFMLENBQW1CQyxVQUFuQixFQUErQmdCLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVVixhQUFWLENBQUosRUFBOEI7QUFDNUJXLHNCQUFJQyxJQUFKLENBQVMsZ0ZBQVQ7QUFDRDtBQUNGOztBQTVCdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZywgeyBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29uZmlnIGV4dGVuZHMgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGxvZ0ZuID0gbnVsbCkge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICBleHRlbnNpb25EZXNjIChwbHVnaW5OYW1lLCB7dmVyc2lvbn0pIHtcbiAgICByZXR1cm4gYCR7cGx1Z2luTmFtZX1AJHt2ZXJzaW9ufWA7XG4gIH1cblxuICBwcmludCAoYWN0aXZlUGx1Z2lucykge1xuICAgIGNvbnN0IHBsdWdpbk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBhY3RpdmVOYW1lcyA9IGFjdGl2ZVBsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZVBsdWdpbnMpKSB7XG4gICAgICBsb2cuaW5mbygnTm8gcGx1Z2lucyBhY3RpdmF0ZWQuIFVzZSB0aGUgLS1wbHVnaW5zIGZsYWcgd2l0aCBuYW1lcyBvZiBwbHVnaW5zIHRvIGFjdGl2YXRlJyk7XG4gICAgfVxuICB9XG59XG4iXSwiZmlsZSI6ImxpYi9wbHVnaW4tY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,14 +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
- exports.KNOWN_PLUGINS = KNOWN_PLUGINS;require('source-map-support').install();
12
-
13
-
14
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbIktOT1dOX1BMVUdJTlMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlBLE1BQU1BLGFBQWEsR0FBRyxFQUF0QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgYSBtYXAgb2YgcGx1Z2luIG5hbWVzIHRvIG5wbSBwYWNrYWdlcyByZXByZXNlbnRpbmcgdGhvc2UgcGx1Z2lucy5cbi8vIFRoZSBwbHVnaW5zIGluIHRoaXMgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgQ0xJIHNvIHVzZXJzIGNhbiBqdXN0XG4vLyB0eXBlICdhcHBpdW0gcGx1Z2luIGluc3RhbGwgJ25hbWUnJywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGZ1bGxcbi8vIG5wbSBwYWNrYWdlLiBJLmUuLCB0aGVzZSBhcmUgdGhlIG9mZmljaWFsbHkgcmVjb2duaXplZCBwbHVnaW5zLlxuY29uc3QgS05PV05fUExVR0lOUyA9IHtcbn07XG5cbmV4cG9ydCB7XG4gIEtOT1dOX1BMVUdJTlMsXG59O1xuIl0sImZpbGUiOiJsaWIvcGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
package/lib/cli/npm.js DELETED
@@ -1,183 +0,0 @@
1
- import _ from 'lodash';
2
- import path from 'path';
3
- import semver from 'semver';
4
- import { exec } from 'teen_process';
5
- import { mkdirp, util } from 'appium-support';
6
-
7
- const INSTALL_LOCKFILE = '.appium.install.lock';
8
- const LINK_LOCKFILE = '.appium.link.lock';
9
-
10
- export default class NPM {
11
-
12
- constructor (appiumHome) {
13
- this.appiumHome = appiumHome;
14
- }
15
-
16
- async exec (cmd, args, opts, execOpts = {}) {
17
- let { cwd, json, lockFile } = opts;
18
- if (!cwd) {
19
- cwd = this.appiumHome;
20
- }
21
- // ensure the directory we want to install inside of exists
22
- await mkdirp(cwd);
23
-
24
- // make sure we perform the current operation in cwd
25
- execOpts = {...execOpts, cwd};
26
-
27
- args.unshift(cmd);
28
- if (json) {
29
- args.push('-json');
30
- }
31
- let runner = async () => await exec('npm', args, execOpts);
32
- if (lockFile) {
33
- const acquireLock = util.getLockFileGuard(path.resolve(cwd, lockFile));
34
- const _runner = runner;
35
- runner = async () => await acquireLock(_runner);
36
- }
37
- const {stdout, stderr, code} = await runner();
38
- const ret = {stdout, stderr, code, json: null};
39
-
40
- if (json) {
41
- // if possible, parse NPM's json output. During NPM install 3rd-party
42
- // packages can write to stdout, so sometimes the json output can't be
43
- // guaranteed to be parseable
44
- try {
45
- ret.json = JSON.parse(stdout);
46
- } catch (ign) {}
47
- }
48
-
49
- return ret;
50
- }
51
-
52
- async getLatestVersion (pkg) {
53
- return (await this.exec('view', [pkg, 'dist-tags'], {
54
- json: true
55
- })).json.latest;
56
- }
57
-
58
- async getLatestSafeUpgradeVersion (pkg, curVersion) {
59
- const allVersions = (await this.exec('view', [pkg, 'versions'], {
60
- json: true
61
- })).json;
62
- return this.getLatestSafeUpgradeFromVersions(curVersion, allVersions);
63
- }
64
-
65
- /**
66
- * Given a current version and a list of all versions for a package, return the version which is
67
- * the highest safely-upgradable version (meaning not crossing any major revision boundaries, and
68
- * not including any alpha/beta/rc versions)
69
- *
70
- * @param {string} curVersion - the current version of a package
71
- * @param {Array<string>} allVersions - a list of version strings
72
- *
73
- * @return {string|null} - the highest safely-upgradable version, or null if there isn't one
74
- */
75
- getLatestSafeUpgradeFromVersions (curVersion, allVersions) {
76
- let safeUpgradeVer = null;
77
- const curSemver = semver.parse(curVersion);
78
- if (curSemver === null) {
79
- throw new Error(`Could not parse current version '${curVersion}'`);
80
- }
81
- for (const testVer of allVersions) {
82
- const testSemver = semver.parse(testVer);
83
- if (testSemver === null) {
84
- throw new Error(`Could not parse version to test against: '${testVer}'`);
85
- }
86
- // if the test version is a prerelease, ignore it
87
- if (testSemver.prerelease.length > 0) {
88
- continue;
89
- }
90
- // if the current version is later than the test version, skip this test version
91
- if (curSemver.compare(testSemver) === 1) {
92
- continue;
93
- }
94
- // if the test version is newer, but crosses a major revision boundary, also skip it
95
- if (testSemver.major > curSemver.major) {
96
- continue;
97
- }
98
- // otherwise this version is safe to upgrade to. But there might be multiple ones of this
99
- // kind, so keep iterating and keeping the highest
100
- if (safeUpgradeVer === null || testSemver.compare(safeUpgradeVer) === 1) {
101
- safeUpgradeVer = testSemver;
102
- }
103
- }
104
- if (safeUpgradeVer) {
105
- safeUpgradeVer = safeUpgradeVer.format();
106
- }
107
- return safeUpgradeVer;
108
- }
109
-
110
- async installPackage ({pkgDir, pkgName, pkgVer}) {
111
- const res = await this.exec('install', [
112
- '--no-save',
113
- '--no-package-lock',
114
- pkgVer ? `${pkgName}@${pkgVer}` : pkgName
115
- ], {
116
- cwd: pkgDir,
117
- json: true,
118
- lockFile: INSTALL_LOCKFILE
119
- });
120
-
121
- if (res.json) {
122
- // we parsed a valid json response, so if we got an error here, return that
123
- // message straightaway
124
- if (res.json.error) {
125
- throw new Error(res.json.error);
126
- }
127
-
128
- // if we tried to install a package via git/github, we might not have been
129
- // certain of the package name, so if we can retrieve it unambiguously from
130
- // the json report of the install, do so
131
- const names = _.uniq([...res.json.added, ...res.json.updated].map((x) => x.name));
132
- if (names.length === 1) {
133
- pkgName = names[0];
134
- }
135
- }
136
-
137
- // Now read package data from the installed package to return, and make sure
138
- // everything got installed ok. Remember, pkgName might end up with a / in it due to an npm
139
- // org, so if so, that will get correctly exploded into multiple directories, by path.resolve here
140
- // (even on Windows!)
141
- const pkgJson = path.resolve(pkgDir, 'node_modules', pkgName, 'package.json');
142
- try {
143
- return require(pkgJson);
144
- } catch {
145
- throw new Error('The package was not downloaded correctly; its package.json ' +
146
- 'did not exist or was unreadable. We looked for it at ' +
147
- pkgJson);
148
- }
149
- }
150
-
151
- async linkPackage (pkgPath) {
152
- // from the path alone we don't know the npm package name, so we need to
153
- // look in package.json
154
- let pkgName;
155
- try {
156
- pkgName = require(path.resolve(pkgPath, 'package.json')).name;
157
- } catch {
158
- throw new Error('Could not find package.json inside the package path ' +
159
- `provided: ${pkgPath}`);
160
- }
161
-
162
- const pkgHome = path.resolve(this.appiumHome, pkgName);
163
- const res = await this.exec('link', [pkgPath], {cwd: pkgHome, lockFile: LINK_LOCKFILE});
164
- if (res.json && res.json.error) {
165
- throw new Error(res.json.error);
166
- }
167
-
168
- // now ensure it was linked to the correct place
169
- try {
170
- return require(path.resolve(pkgHome, 'node_modules', pkgName, 'package.json'));
171
- } catch {
172
- throw new Error('The package was not linked correctly; its package.json ' +
173
- 'did not exist or was unreadable');
174
- }
175
- }
176
-
177
- async uninstallPackage (pkgDir, pkg) {
178
- await this.exec('uninstall', [pkg], {
179
- cwd: pkgDir,
180
- lockFile: INSTALL_LOCKFILE
181
- });
182
- }
183
- }
@@ -1,79 +0,0 @@
1
- import fs from 'fs';
2
- import _ from 'lodash';
3
- import { INSTALL_TYPES } from '../extension-config';
4
-
5
- // serverArgs will be added to the `server` (default) subcommand
6
- function parseSecurityFeatures (features) {
7
- const splitter = (splitOn, str) => `${str}`.split(splitOn).map((s) => s.trim()).filter(Boolean);
8
- let parsedFeatures;
9
- try {
10
- parsedFeatures = splitter(',', features);
11
- } catch (err) {
12
- throw new Error('Could not parse value of --allow/deny-insecure. Should be ' +
13
- 'a list of strings separated by commas, or a path to a file ' +
14
- 'listing one feature name per line.');
15
- }
16
-
17
- if (parsedFeatures.length === 1 && fs.existsSync(parsedFeatures[0])) {
18
- // we might have a file which is a list of features
19
- try {
20
- const fileFeatures = fs.readFileSync(parsedFeatures[0], 'utf8');
21
- parsedFeatures = splitter('\n', fileFeatures);
22
- } catch (err) {
23
- throw new Error(`Attempted to read --allow/deny-insecure feature names ` +
24
- `from file ${parsedFeatures[0]} but got error: ${err.message}`);
25
- }
26
- }
27
-
28
- return parsedFeatures;
29
- }
30
-
31
- function parsePluginNames (names) {
32
- if (!_.isString(names)) {
33
- throw new Error('To parse plugin names, names must be a CSV string');
34
- }
35
-
36
- try {
37
- return names.split(',').map((s) => s.trim()).filter(Boolean);
38
- } catch (err) {
39
- throw new Error('Could not parse value of --plugins. Should be a list of plugin names ' +
40
- 'separated by commas. Plugin names are those found when running `appium ' +
41
- 'plugin list`');
42
- }
43
- }
44
-
45
- function parseDefaultCaps (caps) {
46
- try {
47
- // use synchronous file access, as `argparse` provides no way of either
48
- // awaiting or using callbacks. This step happens in startup, in what is
49
- // effectively command-line code, so nothing is blocked in terms of
50
- // sessions, so holding up the event loop does not incur the usual
51
- // drawbacks.
52
- if (fs.statSync(caps).isFile()) {
53
- caps = fs.readFileSync(caps, 'utf8');
54
- }
55
- } catch (err) {
56
- // not a file, or not readable
57
- }
58
- caps = JSON.parse(caps);
59
- if (!_.isPlainObject(caps)) {
60
- throw 'Invalid format for default capabilities';
61
- }
62
- return caps;
63
- }
64
-
65
- function parseInstallTypes (source) {
66
- if (!_.includes(INSTALL_TYPES, source)) {
67
- throw `Argument to --source was '${source}', which is not a valid ` +
68
- `driver source type. It must be one of ${JSON.stringify(INSTALL_TYPES)}`;
69
- }
70
-
71
- return source;
72
- }
73
-
74
- export {
75
- parseSecurityFeatures,
76
- parseDefaultCaps,
77
- parseInstallTypes,
78
- parsePluginNames,
79
- };
@@ -1,46 +0,0 @@
1
- import _ from 'lodash';
2
- import ExtensionConfig, { DRIVER_TYPE } from './extension-config';
3
-
4
- export default class DriverConfig extends ExtensionConfig {
5
- constructor (appiumHome, logFn = null) {
6
- super(appiumHome, DRIVER_TYPE, logFn);
7
- }
8
-
9
- getConfigProblems (driver) {
10
- const problems = [];
11
- const automationNames = [];
12
- const {platformNames, automationName} = driver;
13
-
14
- if (!_.isArray(platformNames)) {
15
- problems.push({
16
- err: 'Missing or incorrect supported platformName list.',
17
- val: platformNames
18
- });
19
- } else {
20
- for (const pName of platformNames) {
21
- if (!_.isString(pName)) {
22
- problems.push({err: 'Incorrectly formatted platformName.', val: pName});
23
- }
24
- }
25
- }
26
-
27
- if (!_.isString(automationName)) {
28
- problems.push({err: 'Missing or incorrect automationName', val: automationName});
29
- }
30
-
31
- if (_.includes(automationNames, automationName)) {
32
- problems.push({
33
- err: 'Multiple drivers claim support for the same automationName',
34
- val: automationName
35
- });
36
- }
37
- automationNames.push(automationName);
38
-
39
- return problems;
40
- }
41
-
42
- extensionDesc (driverName, {version, automationName}) {
43
- return `${driverName}@${version} (automationName '${automationName}')`;
44
- }
45
- }
46
-