appium 2.0.0-beta.3 → 2.0.0-beta.30

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 (139) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +215 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +238 -132
  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 +19 -12
  11. package/build/lib/cli/extension-command.d.ts +345 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +171 -96
  14. package/build/lib/cli/extension.d.ts +14 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +31 -16
  17. package/build/lib/cli/parser.d.ts +79 -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 +39 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +18 -13
  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 +40 -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 +84 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +190 -0
  38. package/build/lib/extension/extension-config.d.ts +170 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +297 -0
  41. package/build/lib/extension/index.d.ts +39 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +77 -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 +246 -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 +62 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +87 -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 +12 -16
  62. package/build/lib/main.d.ts +51 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +174 -82
  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/index.js +11 -0
  88. package/lib/appium-config.schema.json +278 -0
  89. package/lib/appium.js +398 -155
  90. package/lib/cli/args.js +174 -377
  91. package/lib/cli/driver-command.js +22 -7
  92. package/lib/cli/extension-command.js +372 -177
  93. package/lib/cli/extension.js +32 -10
  94. package/lib/cli/parser.js +252 -83
  95. package/lib/cli/plugin-command.js +19 -6
  96. package/lib/cli/utils.js +22 -2
  97. package/lib/config-file.js +223 -0
  98. package/lib/config.js +169 -69
  99. package/lib/constants.js +78 -0
  100. package/lib/extension/driver-config.js +249 -0
  101. package/lib/extension/extension-config.js +458 -0
  102. package/lib/extension/index.js +102 -0
  103. package/lib/extension/manifest.js +486 -0
  104. package/lib/extension/package-changed.js +63 -0
  105. package/lib/extension/plugin-config.js +113 -0
  106. package/lib/grid-register.js +25 -22
  107. package/lib/logger.js +1 -1
  108. package/lib/logsink.js +14 -7
  109. package/lib/main.js +233 -83
  110. package/lib/schema/arg-spec.js +232 -0
  111. package/lib/schema/cli-args.js +261 -0
  112. package/lib/schema/cli-transformers.js +122 -0
  113. package/lib/schema/index.js +2 -0
  114. package/lib/schema/keywords.js +134 -0
  115. package/lib/schema/schema.js +734 -0
  116. package/lib/utils.js +85 -129
  117. package/package.json +62 -85
  118. package/scripts/postinstall.js +71 -0
  119. package/types/appium-manifest.d.ts +61 -0
  120. package/types/cli.d.ts +134 -0
  121. package/types/extension.d.ts +56 -0
  122. package/types/external-manifest.d.ts +58 -0
  123. package/types/index.d.ts +7 -0
  124. package/CHANGELOG.md +0 -3515
  125. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  126. package/build/lib/cli/npm.js +0 -206
  127. package/build/lib/cli/parser-helpers.js +0 -82
  128. package/build/lib/driver-config.js +0 -77
  129. package/build/lib/drivers.js +0 -96
  130. package/build/lib/extension-config.js +0 -251
  131. package/build/lib/plugin-config.js +0 -59
  132. package/build/lib/plugins.js +0 -14
  133. package/lib/cli/npm.js +0 -183
  134. package/lib/cli/parser-helpers.js +0 -79
  135. package/lib/driver-config.js +0 -46
  136. package/lib/drivers.js +0 -81
  137. package/lib/extension-config.js +0 -208
  138. package/lib/plugin-config.js +0 -34
  139. package/lib/plugins.js +0 -10
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.Manifest = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _support = require("@appium/support");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ var _path = _interopRequireDefault(require("path"));
17
+
18
+ var _yaml = _interopRequireDefault(require("yaml"));
19
+
20
+ var _constants = require("../constants");
21
+
22
+ var _logger = _interopRequireDefault(require("../logger"));
23
+
24
+ var _extensionConfig = require("./extension-config");
25
+
26
+ var _packageChanged = require("./package-changed");
27
+
28
+ const DEFAULT_SEARCH_DEPTH = 4;
29
+ const DEFAULT_FIND_EXTENSIONS_OPTS = Object.freeze({
30
+ depthLimit: DEFAULT_SEARCH_DEPTH,
31
+ filter: filepath => !_path.default.basename(filepath).startsWith('.')
32
+ });
33
+ const CONFIG_SCHEMA_REV = 2;
34
+ const CONFIG_DATA_DRIVER_KEY = `${_constants.DRIVER_TYPE}s`;
35
+ const CONFIG_DATA_PLUGIN_KEY = `${_constants.PLUGIN_TYPE}s`;
36
+ const INITIAL_MANIFEST_DATA = Object.freeze({
37
+ [CONFIG_DATA_DRIVER_KEY]: Object.freeze({}),
38
+ [CONFIG_DATA_PLUGIN_KEY]: Object.freeze({}),
39
+ schemaRev: CONFIG_SCHEMA_REV
40
+ });
41
+
42
+ function isExtension(value) {
43
+ return _lodash.default.isPlainObject(value) && _lodash.default.isPlainObject(value.appium) && _lodash.default.isString(value.name) && _lodash.default.isString(value.version);
44
+ }
45
+
46
+ function isDriver(value) {
47
+ return isExtension(value) && _lodash.default.isString(_lodash.default.get(value, 'appium.driverName')) && _lodash.default.isString(_lodash.default.get(value, 'appium.automationName')) && _lodash.default.isArray(_lodash.default.get(value, 'appium.platformNames'));
48
+ }
49
+
50
+ function isPlugin(value) {
51
+ return isExtension(value) && _lodash.default.isString(_lodash.default.get(value, 'appium.pluginName'));
52
+ }
53
+
54
+ class Manifest {
55
+ _data;
56
+ _appiumHome;
57
+ _manifestPath;
58
+ _writing;
59
+ _reading;
60
+
61
+ constructor(appiumHome) {
62
+ this._appiumHome = appiumHome;
63
+ this._data = _lodash.default.cloneDeep(INITIAL_MANIFEST_DATA);
64
+ }
65
+
66
+ static getInstance = _lodash.default.memoize(function _getInstance(appiumHome) {
67
+ return new Manifest(appiumHome);
68
+ });
69
+
70
+ async syncWithInstalledExtensions({
71
+ depthLimit = DEFAULT_SEARCH_DEPTH
72
+ } = {}) {
73
+ const walkOpts = _lodash.default.defaults({
74
+ depthLimit
75
+ }, DEFAULT_FIND_EXTENSIONS_OPTS);
76
+
77
+ let didChange = false;
78
+
79
+ for await (const {
80
+ stats,
81
+ path: filepath
82
+ } of _support.fs.walk(this._appiumHome, walkOpts)) {
83
+ if (filepath !== this._appiumHome && stats.isDirectory()) {
84
+ try {
85
+ const pkg = await _support.env.readPackageInDir(filepath);
86
+
87
+ if (pkg && isExtension(pkg)) {
88
+ const added = this.addExtensionFromPackage(pkg, _path.default.join(filepath, 'package.json'));
89
+ didChange = didChange || added;
90
+ }
91
+ } catch {}
92
+ }
93
+ }
94
+
95
+ return didChange;
96
+ }
97
+
98
+ hasDriver(name) {
99
+ return Boolean(this._data.drivers[name]);
100
+ }
101
+
102
+ hasPlugin(name) {
103
+ return Boolean(this._data.plugins[name]);
104
+ }
105
+
106
+ addExtensionFromPackage(pkgJson, pkgPath) {
107
+ const internal = {
108
+ pkgName: pkgJson.name,
109
+ version: pkgJson.version,
110
+ installType: _extensionConfig.INSTALL_TYPE_NPM,
111
+ installSpec: `${pkgJson.name}@${pkgJson.version}`
112
+ };
113
+
114
+ if (isDriver(pkgJson)) {
115
+ if (!this.hasDriver(pkgJson.appium.driverName)) {
116
+ this.addExtension(_constants.DRIVER_TYPE, pkgJson.appium.driverName, { ..._lodash.default.omit(pkgJson.appium, 'driverName'),
117
+ ...internal
118
+ });
119
+ return true;
120
+ }
121
+
122
+ return false;
123
+ } else if (isPlugin(pkgJson)) {
124
+ if (!this.hasPlugin(pkgJson.appium.pluginName)) {
125
+ this.addExtension(_constants.PLUGIN_TYPE, pkgJson.appium.pluginName, { ..._lodash.default.omit(pkgJson.appium, 'pluginName'),
126
+ ...internal
127
+ });
128
+ return true;
129
+ }
130
+
131
+ return false;
132
+ } else {
133
+ throw new TypeError(`The extension in ${_path.default.dirname(pkgPath)} is neither a valid driver nor a valid plugin.`);
134
+ }
135
+ }
136
+
137
+ addExtension(extType, extName, extData) {
138
+ this._data[`${extType}s`][extName] = extData;
139
+ }
140
+
141
+ get appiumHome() {
142
+ return this._appiumHome;
143
+ }
144
+
145
+ get manifestPath() {
146
+ return this._manifestPath;
147
+ }
148
+
149
+ getExtensionData(extType) {
150
+ return this._data[`${extType}s`];
151
+ }
152
+
153
+ async read() {
154
+ if (this._reading) {
155
+ await this._reading;
156
+ return this._data;
157
+ }
158
+
159
+ this._reading = (async () => {
160
+ let data;
161
+ let isNewFile = false;
162
+ await this._setManifestPath();
163
+
164
+ try {
165
+ _logger.default.debug(`Reading ${this._manifestPath}...`);
166
+
167
+ const yaml = await _support.fs.readFile(this._manifestPath, 'utf8');
168
+ data = _yaml.default.parse(yaml);
169
+ } catch (err) {
170
+ if (err.code === 'ENOENT') {
171
+ data = _lodash.default.cloneDeep(INITIAL_MANIFEST_DATA);
172
+ isNewFile = true;
173
+ } else {
174
+ if (this._manifestPath) {
175
+ throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this._manifestPath}). It may be invalid YAML. Specific error: ${err.message}`);
176
+ } else {
177
+ throw new Error(`Appium encountered an unknown problem. Specific error: ${err.message}`);
178
+ }
179
+ }
180
+ }
181
+
182
+ this._data = data;
183
+ let installedExtensionsChanged = false;
184
+
185
+ if ((await _support.env.hasAppiumDependency(this.appiumHome)) && (await (0, _packageChanged.packageDidChange)(this.appiumHome))) {
186
+ installedExtensionsChanged = await this.syncWithInstalledExtensions();
187
+ }
188
+
189
+ if (isNewFile || installedExtensionsChanged) {
190
+ await this.write();
191
+ }
192
+ })();
193
+
194
+ try {
195
+ await this._reading;
196
+ return this._data;
197
+ } finally {
198
+ this._reading = undefined;
199
+ }
200
+ }
201
+
202
+ async _setManifestPath() {
203
+ if (!this._manifestPath) {
204
+ this._manifestPath = await _support.env.resolveManifestPath(this._appiumHome);
205
+
206
+ if (_path.default.relative(this._appiumHome, this._manifestPath).startsWith('.')) {
207
+ throw new Error(`Mismatch between location of APPIUM_HOME and manifest file. APPIUM_HOME: ${this.appiumHome}, manifest file: ${this._manifestPath}`);
208
+ }
209
+ }
210
+
211
+ return this._manifestPath;
212
+ }
213
+
214
+ async write() {
215
+ if (this._writing) {
216
+ return this._writing;
217
+ }
218
+
219
+ this._writing = (async () => {
220
+ await this._setManifestPath();
221
+
222
+ try {
223
+ await _support.fs.mkdirp(_path.default.dirname(this._manifestPath));
224
+ } catch (err) {
225
+ throw new Error(`Appium could not create the directory for the manifest file: ${_path.default.dirname(this._manifestPath)}. Original error: ${err.message}`);
226
+ }
227
+
228
+ try {
229
+ await _support.fs.writeFile(this._manifestPath, _yaml.default.stringify(this._data), 'utf8');
230
+ return true;
231
+ } catch (err) {
232
+ throw new Error(`Appium could not write to manifest at ${this._manifestPath} using APPIUM_HOME ${this._appiumHome}. ` + `Please ensure it is writable. Original error: ${err.message}`);
233
+ }
234
+ })();
235
+
236
+ try {
237
+ return await this._writing;
238
+ } finally {
239
+ this._writing = undefined;
240
+ }
241
+ }
242
+
243
+ }
244
+
245
+ exports.Manifest = Manifest;
246
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vbWFuaWZlc3QuanMiXSwibmFtZXMiOlsiREVGQVVMVF9TRUFSQ0hfREVQVEgiLCJERUZBVUxUX0ZJTkRfRVhURU5TSU9OU19PUFRTIiwiT2JqZWN0IiwiZnJlZXplIiwiZGVwdGhMaW1pdCIsImZpbHRlciIsImZpbGVwYXRoIiwicGF0aCIsImJhc2VuYW1lIiwic3RhcnRzV2l0aCIsIkNPTkZJR19TQ0hFTUFfUkVWIiwiQ09ORklHX0RBVEFfRFJJVkVSX0tFWSIsIkRSSVZFUl9UWVBFIiwiQ09ORklHX0RBVEFfUExVR0lOX0tFWSIsIlBMVUdJTl9UWVBFIiwiSU5JVElBTF9NQU5JRkVTVF9EQVRBIiwic2NoZW1hUmV2IiwiaXNFeHRlbnNpb24iLCJ2YWx1ZSIsIl8iLCJpc1BsYWluT2JqZWN0IiwiYXBwaXVtIiwiaXNTdHJpbmciLCJuYW1lIiwidmVyc2lvbiIsImlzRHJpdmVyIiwiZ2V0IiwiaXNBcnJheSIsImlzUGx1Z2luIiwiTWFuaWZlc3QiLCJfZGF0YSIsIl9hcHBpdW1Ib21lIiwiX21hbmlmZXN0UGF0aCIsIl93cml0aW5nIiwiX3JlYWRpbmciLCJjb25zdHJ1Y3RvciIsImFwcGl1bUhvbWUiLCJjbG9uZURlZXAiLCJnZXRJbnN0YW5jZSIsIm1lbW9pemUiLCJfZ2V0SW5zdGFuY2UiLCJzeW5jV2l0aEluc3RhbGxlZEV4dGVuc2lvbnMiLCJ3YWxrT3B0cyIsImRlZmF1bHRzIiwiZGlkQ2hhbmdlIiwic3RhdHMiLCJmcyIsIndhbGsiLCJpc0RpcmVjdG9yeSIsInBrZyIsImVudiIsInJlYWRQYWNrYWdlSW5EaXIiLCJhZGRlZCIsImFkZEV4dGVuc2lvbkZyb21QYWNrYWdlIiwiam9pbiIsImhhc0RyaXZlciIsIkJvb2xlYW4iLCJkcml2ZXJzIiwiaGFzUGx1Z2luIiwicGx1Z2lucyIsInBrZ0pzb24iLCJwa2dQYXRoIiwiaW50ZXJuYWwiLCJwa2dOYW1lIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwiaW5zdGFsbFNwZWMiLCJkcml2ZXJOYW1lIiwiYWRkRXh0ZW5zaW9uIiwib21pdCIsInBsdWdpbk5hbWUiLCJUeXBlRXJyb3IiLCJkaXJuYW1lIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHREYXRhIiwibWFuaWZlc3RQYXRoIiwiZ2V0RXh0ZW5zaW9uRGF0YSIsInJlYWQiLCJkYXRhIiwiaXNOZXdGaWxlIiwiX3NldE1hbmlmZXN0UGF0aCIsImxvZyIsImRlYnVnIiwieWFtbCIsInJlYWRGaWxlIiwiWUFNTCIsInBhcnNlIiwiZXJyIiwiY29kZSIsIkVycm9yIiwibWVzc2FnZSIsImluc3RhbGxlZEV4dGVuc2lvbnNDaGFuZ2VkIiwiaGFzQXBwaXVtRGVwZW5kZW5jeSIsIndyaXRlIiwidW5kZWZpbmVkIiwicmVzb2x2ZU1hbmlmZXN0UGF0aCIsInJlbGF0aXZlIiwibWtkaXJwIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQU1BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU9BLE1BQU1BLG9CQUFvQixHQUFHLENBQTdCO0FBTUEsTUFBTUMsNEJBQTRCLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ2pEQyxFQUFBQSxVQUFVLEVBQUVKLG9CQURxQztBQUdqREssRUFBQUEsTUFBTSxFQUFHQyxRQUFELElBQWMsQ0FBQ0MsY0FBS0MsUUFBTCxDQUFjRixRQUFkLEVBQXdCRyxVQUF4QixDQUFtQyxHQUFuQztBQUgwQixDQUFkLENBQXJDO0FBU0EsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBMUI7QUFNQSxNQUFNQyxzQkFBc0IsR0FBSSxHQUFFQyxzQkFBWSxHQUE5QztBQU1BLE1BQU1DLHNCQUFzQixHQUFJLEdBQUVDLHNCQUFZLEdBQTlDO0FBS0EsTUFBTUMscUJBQXFCLEdBQUdiLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQzFDLEdBQUNRLHNCQUFELEdBQTBCVCxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFk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LE9BQU8wRCxHQUFQLEVBQVk7QUFDWixjQUFNLElBQUlFLEtBQUosQ0FDSCx5Q0FBd0MsS0FBSzFELGFBQWMsc0JBQXFCLEtBQUtELFdBQVksSUFBbEcsR0FDRyxpREFBZ0R5RCxHQUFHLENBQUNHLE9BQVEsRUFGM0QsQ0FBTjtBQUlEO0FBQ0YsS0F4QmUsR0FBaEI7O0FBeUJBLFFBQUk7QUFDRixhQUFPLE1BQU0sS0FBSzFELFFBQWxCO0FBQ0QsS0FGRCxTQUVVO0FBQ1IsV0FBS0EsUUFBTCxHQUFnQjhELFNBQWhCO0FBQ0Q7QUFDRjs7QUFqVm1CIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdC5kLnRzXCIgLz5cblxuLyoqXG4gKiBNb2R1bGUgY29udGFpbmluZyB7QGxpbmsgTWFuaWZlc3R9IHdoaWNoIGhhbmRsZXMgcmVhZGluZyAmIHdyaXRpbmcgb2YgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlcy5cbiAqL1xuXG5pbXBvcnQgeyBlbnYsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IElOU1RBTExfVFlQRV9OUE0gfSBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgcGFja2FnZURpZENoYW5nZSB9IGZyb20gJy4vcGFja2FnZS1jaGFuZ2VkJztcblxuLyoqXG4gKiBEZWZhdWx0IGRlcHRoIHRvIHNlYXJjaCBpbiBkaXJlY3RvcnkgdHJlZSBmb3Igd2hhdGV2ZXIgaXQgaXMgd2UncmUgbG9va2luZyBmb3IuXG4gKlxuICogSXQncyA0IGJlY2F1c2Ugc21hbGxlciBudW1iZXJzIGRpZG4ndCB3b3JrLlxuICovXG5jb25zdCBERUZBVUxUX1NFQVJDSF9ERVBUSCA9IDQ7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB7QGxpbmsgZmluZEV4dGVuc2lvbnN9LlxuICogQHR5cGUge1JlYWRvbmx5PGltcG9ydCgna2xhdycpLk9wdGlvbnM+fVxuICovXG5jb25zdCBERUZBVUxUX0ZJTkRfRVhURU5TSU9OU19PUFRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGRlcHRoTGltaXQ6IERFRkFVTFRfU0VBUkNIX0RFUFRILFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmaWx0ZXI6IChmaWxlcGF0aCkgPT4gIXBhdGguYmFzZW5hbWUoZmlsZXBhdGgpLnN0YXJ0c1dpdGgoJy4nKSxcbn0pO1xuXG4vKipcbiAqIEN1cnJlbnQgY29uZmlndXJhdGlvbiBzY2hlbWEgcmV2aXNpb24hXG4gKi9cbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgcHJvcCAoYGRyaXZlcnNgKSB1c2VkIGluIGBleHRlbnNpb25zLnlhbWxgIGZvciBkcml2ZXJzLlxuICogQHR5cGUge2Ake3R5cGVvZiBEUklWRVJfVFlQRX1zYH1cbiAqL1xuY29uc3QgQ09ORklHX0RBVEFfRFJJVkVSX0tFWSA9IGAke0RSSVZFUl9UWVBFfXNgO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wIChgcGx1Z2luc2ApIHVzZWQgaW4gYGV4dGVuc2lvbnMueWFtbGAgZm9yIHBsdWdpbnMuXG4gKiBAdHlwZSB7YCR7dHlwZW9mIFBMVUdJTl9UWVBFfXNgfVxuICovXG5jb25zdCBDT05GSUdfREFUQV9QTFVHSU5fS0VZID0gYCR7UExVR0lOX1RZUEV9c2A7XG5cbi8qKlxuICogQHR5cGUge1JlYWRvbmx5PE1hbmlmZXN0RGF0YT59XG4gKi9cbmNvbnN0IElOSVRJQUxfTUFOSUZFU1RfREFUQSA9IE9iamVjdC5mcmVlemUoe1xuICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IE9iamVjdC5mcmVlemUoe30pLFxuICBbQ09ORklHX0RBVEFfUExVR0lOX0tFWV06IE9iamVjdC5mcmVlemUoe30pLFxuICBzY2hlbWFSZXY6IENPTkZJR19TQ0hFTUFfUkVWLFxufSk7XG5cbi8qKlxuICogR2l2ZW4gYSBgcGFja2FnZS5qc29uYCByZXR1cm4gYHRydWVgIGlmIGl0IHJlcHJlc2VudHMgYW4gQXBwaXVtIEV4dGVuc2lvbiAoZWl0aGVyIGEgZHJpdmVyIG9yIHBsdWdpbikuXG4gKlxuICogVGhlIGBwYWNrYWdlLmpzb25gIG11c3QgaGF2ZSBhbiBgYXBwaXVtYCBwcm9wZXJ0eSB3aGljaCBpcyBhbiBvYmplY3QuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBFeHRQYWNrYWdlSnNvbjxFeHRlbnNpb25UeXBlPn1cbiAqL1xuZnVuY3Rpb24gaXNFeHRlbnNpb24gKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgXy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJlxuICAgIF8uaXNQbGFpbk9iamVjdCh2YWx1ZS5hcHBpdW0pICYmXG4gICAgXy5pc1N0cmluZyh2YWx1ZS5uYW1lKSAmJlxuICAgIF8uaXNTdHJpbmcodmFsdWUudmVyc2lvbilcbiAgKTtcbn1cbi8qKlxuICogR2l2ZW4gYSBgcGFja2FnZS5qc29uYCwgcmV0dXJuIGB0cnVlYCBpZiBpdCByZXByZXNlbnRzIGFuIEFwcGl1bSBEcml2ZXIuXG4gKlxuICogVG8gYmUgY29uc2lkZXJlZCBhIGRyaXZlciwgYSBgcGFja2FnZS5qc29uYCBtdXN0IGhhdmUgYSBmaWVsZHNcbiAqIGBhcHBpdW0uZHJpdmVyTmFtZWAsIGBhcHBpdW0uYXV0b21hdGlvbk5hbWVgIGFuZCBgYXBwaXVtLnBsYXRmb3JtTmFtZXNgLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge3ZhbHVlIGlzIEV4dFBhY2thZ2VKc29uPERyaXZlclR5cGU+fVxuICovXG5mdW5jdGlvbiBpc0RyaXZlciAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICBpc0V4dGVuc2lvbih2YWx1ZSkgJiZcbiAgICBfLmlzU3RyaW5nKF8uZ2V0KHZhbHVlLCAnYXBwaXVtLmRyaXZlck5hbWUnKSkgJiZcbiAgICBfLmlzU3RyaW5nKF8uZ2V0KHZhbHVlLCAnYXBwaXVtLmF1dG9tYXRpb25OYW1lJykpICYmXG4gICAgXy5pc0FycmF5KF8uZ2V0KHZhbHVlLCAnYXBwaXVtLnBsYXRmb3JtTmFtZXMnKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGBwYWNrYWdlLmpzb25gLCByZXR1cm4gYHRydWVgIGlmIGl0IHJlcHJlc2VudHMgYW4gQXBwaXVtIFBsdWdpbi5cbiAqXG4gKiBUbyBiZSBjb25zaWRlcmVkIGEgcGx1Z2luLCBhIGBwYWNrYWdlLmpzb25gIG11c3QgaGF2ZSBhbiBgYXBwaXVtLnBsdWdpbk5hbWVgIGZpZWxkLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge3ZhbHVlIGlzIEV4dFBhY2thZ2VKc29uPFBsdWdpblR5cGU+fVxuICovXG5mdW5jdGlvbiBpc1BsdWdpbiAodmFsdWUpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaW9uKHZhbHVlKSAmJiBfLmlzU3RyaW5nKF8uZ2V0KHZhbHVlLCAnYXBwaXVtLnBsdWdpbk5hbWUnKSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICpcbiAqIE9ubHkgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICovXG5leHBvcnQgY2xhc3MgTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIGVudGlyZSBjb250ZW50cyBvZiBhIHBhcnNlZCBZQU1MIGV4dGVuc2lvbiBjb25maWcgZmlsZS5cbiAgICpcbiAgICogQ29udGFpbnMgcHJveGllcyBmb3IgYXV0b21hdGljIHBlcnNpc3RlbmNlIG9uIGRpc2tcbiAgICogQHR5cGUge01hbmlmZXN0RGF0YX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kYXRhO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBBUFBJVU1fSE9NRWAuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgX2FwcGl1bUhvbWU7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gYGV4dGVuc2lvbnMueWFtbGBcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogTm90IHNldCB1bnRpbCB7QGxpbmsgTWFuaWZlc3QucmVhZH0gaXMgY2FsbGVkLlxuICAgKi9cbiAgX21hbmlmZXN0UGF0aDtcblxuICAvKipcbiAgICogSGVscHMgYXZvaWQgd3JpdGluZyBtdWx0aXBsZSB0aW1lcy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdW5kZWZpbmVkYCwgY2FsbGluZyB7QGxpbmsgTWFuaWZlc3Qud3JpdGV9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGB3cml0ZSgpYCBpcyBjb21wbGV0ZSwgdGhlIGBQcm9taXNlYFxuICAgKiB3aWxsIHJlc29sdmUgYW5kIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYC4gIENvbmN1cnJlbnQgY2FsbHNcbiAgICogbWFkZSB3aGlsZSB0aGlzIHZhbHVlIGlzIGEgYFByb21pc2VgIHdpbGwgcmV0dXJuIHRoZSBgUHJvbWlzZWAgaXRzZWxmLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UHJvbWlzZTxib29sZWFuPnx1bmRlZmluZWR9XG4gICAqL1xuICBfd3JpdGluZztcblxuICAvKipcbiAgICogSGVscHMgYXZvaWQgcmVhZGluZyBtdWx0aXBsZSB0aW1lcy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdW5kZWZpbmVkYCwgY2FsbGluZyB7QGxpbmsgTWFuaWZlc3QucmVhZH0gd2lsbCBjYXVzZSBpdCB0byBiZVxuICAgKiBzZXQgdG8gYSBgUHJvbWlzZWAuIFdoZW4gdGhlIGNhbGwgdG8gYHJlYWQoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8dm9pZD58dW5kZWZpbmVkfVxuICAgKi9cbiAgX3JlYWRpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgaW50ZXJuYWwgZGF0YSB0byBhIGZyZXNoIGNsb25lIG9mIHtAbGluayBJTklUSUFMX01BTklGRVNUX0RBVEF9XG4gICAqXG4gICAqIFVzZSB7QGxpbmsgTWFuaWZlc3QuZ2V0SW5zdGFuY2V9IGluc3RlYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoYXBwaXVtSG9tZSkge1xuICAgIHRoaXMuX2FwcGl1bUhvbWUgPSBhcHBpdW1Ib21lO1xuICAgIHRoaXMuX2RhdGEgPSBfLmNsb25lRGVlcChJTklUSUFMX01BTklGRVNUX0RBVEEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgb3IgZXhpc3Rpbmcge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZSwgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGBhcHBpdW1Ib21lYC5cbiAgICpcbiAgICogTWFpbnRhaW5zIG9uZSBpbnN0YW5jZSBwZXIgdmFsdWUgb2YgYGFwcGl1bUhvbWVgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICAgKiBAcmV0dXJucyB7TWFuaWZlc3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UgPSBfLm1lbW9pemUoZnVuY3Rpb24gX2dldEluc3RhbmNlIChcbiAgICBhcHBpdW1Ib21lLFxuICApIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0KGFwcGl1bUhvbWUpO1xuICB9KTtcblxuICAvKipcbiAgICogU2VhcmNoZXMgYEFQUElVTV9IT01FYCBmb3IgaW5zdGFsbGVkIGV4dGVuc2lvbnMgYW5kIGFkZHMgdGhlbSB0byB0aGUgbWFuaWZlc3QuXG4gICAqIEBwYXJhbSB7U3luY1dpdGhJbnN0YWxsZWRFeHRlbnNpb25zT3B0c30gb3B0c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gYHRydWVgIGlmIGFueSBleHRlbnNpb25zIHdlcmUgYWRkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgc3luY1dpdGhJbnN0YWxsZWRFeHRlbnNpb25zICh7ZGVwdGhMaW1pdCA9IERFRkFVTFRfU0VBUkNIX0RFUFRIfSA9IHt9KSB7XG4gICAgY29uc3Qgd2Fsa09wdHMgPSBfLmRlZmF1bHRzKHtkZXB0aExpbWl0fSwgREVGQVVMVF9GSU5EX0VYVEVOU0lPTlNfT1BUUyk7XG4gICAgLy8gdGhpcyBjb3VsZCBiZSBwYXJhbGxlbGl6ZWQsIGJ1dCB3ZSBjYW4ndCB1c2UgZnMud2FsayBhcyBhbiBhc3luYyBpdGVyYXRvclxuICAgIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHtzdGF0cywgcGF0aDogZmlsZXBhdGh9IG9mIGZzLndhbGsoXG4gICAgICB0aGlzLl9hcHBpdW1Ib21lLFxuICAgICAgd2Fsa09wdHMsXG4gICAgKSkge1xuICAgICAgaWYgKGZpbGVwYXRoICE9PSB0aGlzLl9hcHBpdW1Ib21lICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwa2cgPSBhd2FpdCBlbnYucmVhZFBhY2thZ2VJbkRpcihmaWxlcGF0aCk7XG4gICAgICAgICAgaWYgKHBrZyAmJiBpc0V4dGVuc2lvbihwa2cpKSB7XG4gICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBleHRlbnNpb24gYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hbmlmZXN0LFxuICAgICAgICAgICAgLy8gc28gb25seSB1cGRhdGUgYGRpZENoYW5nZWAgaWYgaXQncyBuZXcuXG4gICAgICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2UoXG4gICAgICAgICAgICAgIHBrZyxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGZpbGVwYXRoLCAncGFja2FnZS5qc29uJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGlkQ2hhbmdlID0gZGlkQ2hhbmdlIHx8IGFkZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlkQ2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGRyaXZlciB3aXRoIG5hbWUgYG5hbWVgIGlzIHJlZ2lzdGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRHJpdmVyIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXNEcml2ZXIgKG5hbWUpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9kYXRhLmRyaXZlcnNbbmFtZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHBsdWdpbiB3aXRoIG5hbWUgYG5hbWVgIGlzIHJlZ2lzdGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGx1Z2luIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXNQbHVnaW4gKG5hbWUpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9kYXRhLnBsdWdpbnNbbmFtZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgcGF0aCB0byBhIGBwYWNrYWdlLmpzb25gLCBhZGQgaXQgYXMgZWl0aGVyIGEgZHJpdmVyIG9yIHBsdWdpbiB0byB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIFdpbGwgX25vdF8gb3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMuXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dFBhY2thZ2VKc29uPEV4dFR5cGU+fSBwa2dKc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dQYXRoXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCB1cG9uIHN1Y2Nlc3MsIGBmYWxzZWAgaWYgdGhlIGV4dGVuc2lvbiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAqL1xuICBhZGRFeHRlbnNpb25Gcm9tUGFja2FnZSAocGtnSnNvbiwgcGtnUGF0aCkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtJbnRlcm5hbE1ldGFkYXRhfVxuICAgICAqL1xuICAgIGNvbnN0IGludGVybmFsID0ge1xuICAgICAgcGtnTmFtZTogcGtnSnNvbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGtnSnNvbi52ZXJzaW9uLFxuICAgICAgaW5zdGFsbFR5cGU6IElOU1RBTExfVFlQRV9OUE0sXG4gICAgICBpbnN0YWxsU3BlYzogYCR7cGtnSnNvbi5uYW1lfUAke3BrZ0pzb24udmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICBpZiAoaXNEcml2ZXIocGtnSnNvbikpIHtcbiAgICAgIGlmICghdGhpcy5oYXNEcml2ZXIocGtnSnNvbi5hcHBpdW0uZHJpdmVyTmFtZSkpIHtcbiAgICAgICAgdGhpcy5hZGRFeHRlbnNpb24oRFJJVkVSX1RZUEUsIHBrZ0pzb24uYXBwaXVtLmRyaXZlck5hbWUsIHtcbiAgICAgICAgICAuLi5fLm9taXQocGtnSnNvbi5hcHBpdW0sICdkcml2ZXJOYW1lJyksXG4gICAgICAgICAgLi4uaW50ZXJuYWxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaXNQbHVnaW4ocGtnSnNvbikpIHtcbiAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4ocGtnSnNvbi5hcHBpdW0ucGx1Z2luTmFtZSkpIHtcbiAgICAgICAgdGhpcy5hZGRFeHRlbnNpb24oUExVR0lOX1RZUEUsIHBrZ0pzb24uYXBwaXVtLnBsdWdpbk5hbWUsIHtcbiAgICAgICAgICAuLi5fLm9taXQocGtnSnNvbi5hcHBpdW0sICdwbHVnaW5OYW1lJyksXG4gICAgICAgICAgLi4uaW50ZXJuYWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRoZSBleHRlbnNpb24gaW4gJHtwYXRoLmRpcm5hbWUoXG4gICAgICAgICAgcGtnUGF0aCxcbiAgICAgICAgKX0gaXMgbmVpdGhlciBhIHZhbGlkIGRyaXZlciBub3IgYSB2YWxpZCBwbHVnaW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBtYW5pZmVzdCBhcyB3YXMgaW5zdGFsbGVkIGJ5IHRoZSBgYXBwaXVtYCBDTEkuICBUaGVcbiAgICogYGV4dERhdGFgLCBgZXh0VHlwZWAsIGFuZCBgZXh0TmFtZWAgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZXJtaW5lZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBNYW5pZmVzdC5hZGRFeHRlbnNpb25Gcm9tUGFja2FnZX0gZm9yIGFkZGluZyBhbiBleHRlbnNpb24gZnJvbSBhbiBvbi1kaXNrIHBhY2thZ2UuXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGUgLSBgZHJpdmVyYCBvciBgcGx1Z2luYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gbWV0YWRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRFeHRlbnNpb24gKGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aGlzLl9kYXRhW2Ake2V4dFR5cGV9c2BdW2V4dE5hbWVdID0gZXh0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBUFBJVU1fSE9NRSBwYXRoXG4gICAqL1xuICBnZXQgYXBwaXVtSG9tZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGl1bUhvbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgbWFuaWZlc3QgZmlsZVxuICAgKi9cbiAgZ2V0IG1hbmlmZXN0UGF0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hbmlmZXN0UGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4dGVuc2lvbiBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdHlwZS5cbiAgICpcbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0VHlwZX0gZXh0VHlwZVxuICAgKiBAcmV0dXJucyB7RXh0UmVjb3JkPEV4dFR5cGU+fVxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uRGF0YSAoZXh0VHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7ZXh0VHlwZX1zYCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIG1hbmlmZXN0IGZyb20gZGlzayBhbmQgX292ZXJ3cml0ZXNfIHRoZSBpbnRlcm5hbCBkYXRhLlxuICAgKlxuICAgKiBJZiB0aGUgbWFuaWZlc3QgZG9lcyBub3QgZXhpc3Qgb24gZGlzaywgYW4ge0BsaW5rIElOSVRJQUxfTUFOSUZFU1RfREFUQSBcImVtcHR5XCJ9IG1hbmlmZXN0IGZpbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBJZiBgQVBQSVVNX0hPTUVgIGNvbnRhaW5zIGEgYHBhY2thZ2UuanNvbmAgd2l0aCBhbiBgYXBwaXVtYCBkZXBlbmRlbmN5LCB0aGVuIGEgaGFzaCBvZiB0aGUgYHBhY2thZ2UuanNvbmAgd2lsbCBiZSB0YWtlbi4gSWYgdGhpcyBoYXNoIGRpZmZlcnMgZnJvbSB0aGUgbGFzdCBoYXNoLCB0aGUgY29udGVudHMgb2YgYEFQUElVTV9IT01FL25vZGVfbW9kdWxlc2Agd2lsbCBiZSBzY2FubmVkIGZvciBleHRlbnNpb25zIHRoYXQgbWF5IGhhdmUgYmVlbiBpbnN0YWxsZWQgb3V0c2lkZSBvZiB0aGUgYGFwcGl1bWAgQ0xJLiAgQW55IGZvdW5kIGV4dGVuc2lvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFuaWZlc3QgZmlsZSwgYW5kIGlmIHNvLCB0aGUgbWFuaWZlc3QgZmlsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay5cbiAgICpcbiAgICogT25seSBvbmUgcmVhZCBvcGVyYXRpb24gc2hvdWxkIGhhcHBlbiBhdCBhIHRpbWUuICBUaGlzIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSB7QGxpbmsgTWFuaWZlc3QuX3JlYWRpbmd9IHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYW5pZmVzdERhdGE+fSBUaGUgZGF0YVxuICAgKi9cbiAgYXN5bmMgcmVhZCAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRpbmcpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWRpbmc7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWFkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7TWFuaWZlc3REYXRhfSAqL1xuICAgICAgbGV0IGRhdGE7XG4gICAgICBsZXQgaXNOZXdGaWxlID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLl9zZXRNYW5pZmVzdFBhdGgoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVhZGluZyAke3RoaXMuX21hbmlmZXN0UGF0aH0uLi5gKTtcbiAgICAgICAgY29uc3QgeWFtbCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMuX21hbmlmZXN0UGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgZGF0YSA9IFlBTUwucGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGRhdGEgPSBfLmNsb25lRGVlcChJTklUSUFMX01BTklGRVNUX0RBVEEpO1xuICAgICAgICAgIGlzTmV3RmlsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuX21hbmlmZXN0UGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXBwaXVtIGhhZCB0cm91YmxlIGxvYWRpbmcgdGhlIGV4dGVuc2lvbiBpbnN0YWxsYXRpb24gYCArXG4gICAgICAgICAgICAgICAgYGNhY2hlIGZpbGUgKCR7dGhpcy5fbWFuaWZlc3RQYXRofSkuIEl0IG1heSBiZSBpbnZhbGlkIFlBTUwuIFNwZWNpZmljIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBcHBpdW0gZW5jb3VudGVyZWQgYW4gdW5rbm93biBwcm9ibGVtLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICBsZXQgaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgYXdhaXQgZW52Lmhhc0FwcGl1bURlcGVuZGVuY3kodGhpcy5hcHBpdW1Ib21lKSAmJlxuICAgICAgICAoYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmFwcGl1bUhvbWUpKVxuICAgICAgKSB7XG4gICAgICAgIGluc3RhbGxlZEV4dGVuc2lvbnNDaGFuZ2VkID0gYXdhaXQgdGhpcy5zeW5jV2l0aEluc3RhbGxlZEV4dGVuc2lvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmV3RmlsZSB8fCBpbnN0YWxsZWRFeHRlbnNpb25zQ2hhbmdlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZGluZztcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWFkaW5nID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHtAbGluayBNYW5pZmVzdC5fbWFuaWZlc3RQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIENyZWF0ZXMgdGhlIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyBfc2V0TWFuaWZlc3RQYXRoICgpIHtcbiAgICBpZiAoIXRoaXMuX21hbmlmZXN0UGF0aCkge1xuICAgICAgdGhpcy5fbWFuaWZlc3RQYXRoID0gYXdhaXQgZW52LnJlc29sdmVNYW5pZmVzdFBhdGgodGhpcy5fYXBwaXVtSG9tZSk7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHBhdGgucmVsYXRpdmUodGhpcy5fYXBwaXVtSG9tZSwgdGhpcy5fbWFuaWZlc3RQYXRoKS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNtYXRjaCBiZXR3ZWVuIGxvY2F0aW9uIG9mIEFQUElVTV9IT01FIGFuZCBtYW5pZmVzdCBmaWxlLiBBUFBJVU1fSE9NRTogJHt0aGlzLmFwcGl1bUhvbWV9LCBtYW5pZmVzdCBmaWxlOiAke3RoaXMuX21hbmlmZXN0UGF0aH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBkYXRhIGlmIGl0IG5lZWQgcyB3cml0aW5nLlxuICAgKlxuICAgKiBJZiB0aGUgYHNjaGVtYVJldmAgcHJvcCBuZWVkcyB1cGRhdGluZywgdGhlIGZpbGUgd2lsbCBiZSB3cml0dGVuLlxuICAgKlxuICAgKiBAdG9kbyBJZiB0aGlzIGJlY29tZXMgdG9vIG11Y2ggb2YgYSBib3R0bGVuZWNrLCB0aHJvdHRsZSBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGRhdGEgd2FzIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRpbmc7XG4gICAgfVxuICAgIHRoaXMuX3dyaXRpbmcgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fc2V0TWFuaWZlc3RQYXRoKCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcnAocGF0aC5kaXJuYW1lKHRoaXMuX21hbmlmZXN0UGF0aCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIG1hbmlmZXN0IGZpbGU6ICR7cGF0aC5kaXJuYW1lKFxuICAgICAgICAgICAgdGhpcy5fbWFuaWZlc3RQYXRoLFxuICAgICAgICAgICl9LiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICAgIHRoaXMuX21hbmlmZXN0UGF0aCxcbiAgICAgICAgICBZQU1MLnN0cmluZ2lmeSh0aGlzLl9kYXRhKSxcbiAgICAgICAgICAndXRmOCcsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCB3cml0ZSB0byBtYW5pZmVzdCBhdCAke3RoaXMuX21hbmlmZXN0UGF0aH0gdXNpbmcgQVBQSVVNX0hPTUUgJHt0aGlzLl9hcHBpdW1Ib21lfS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIGVuc3VyZSBpdCBpcyB3cml0YWJsZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fd3JpdGluZztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fd3JpdGluZyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBzdHJpbmcgcmVmZXJyaW5nIHRvIGEgZHJpdmVyICh0eXBpY2FsbHkgYXMgYSBrZXkgb3IgdHlwZSBzdHJpbmcpXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqL1xuXG4vKipcbiAqIFR5cGUgb2YgdGhlIHN0cmluZyByZWZlcnJpbmcgdG8gYSBwbHVnaW4gKHR5cGljYWxseSBhcyBhIGtleSBvciB0eXBlIHN0cmluZylcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3luY1dpdGhJbnN0YWxsZWRFeHRlbnNpb25zT3B0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZXB0aExpbWl0XSAtIE1heGltdW0gZGVwdGggdG8gcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5NYW5pZmVzdERhdGF9IE1hbmlmZXN0RGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuSW50ZXJuYWxNZXRhZGF0YX0gSW50ZXJuYWxNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2V4dGVybmFsLW1hbmlmZXN0JykuRXh0UGFja2FnZUpzb248VD59IEV4dFBhY2thZ2VKc29uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEVpdGhlciBgZHJpdmVyYCBvciBgcGx1Z2luYCByblxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKi9cblxuIl19
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Determines if extensions have changed, and updates a hash the `package.json` in `appiumHome` if so.
3
+ *
4
+ * If they have, we need to sync them with the `extensions.yaml` manifest.
5
+ *
6
+ * _Warning: this makes a blocking call to `writeFileSync`._
7
+ * @param {string} appiumHome
8
+ * @returns {Promise<boolean>} `true` if `package.json` `appiumHome` changed
9
+ */
10
+ export function packageDidChange(appiumHome: string): Promise<boolean>;
11
+ //# sourceMappingURL=package-changed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-changed.d.ts","sourceRoot":"","sources":["../../../lib/extension/package-changed.js"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,6CAHW,MAAM,GACJ,QAAQ,OAAO,CAAC,CAgD5B"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.packageDidChange = packageDidChange;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _support = require("@appium/support");
13
+
14
+ var _packageChanged = require("package-changed");
15
+
16
+ var _path = _interopRequireDefault(require("path"));
17
+
18
+ var _constants = require("../constants");
19
+
20
+ var _logger = _interopRequireDefault(require("../logger"));
21
+
22
+ async function packageDidChange(appiumHome) {
23
+ const hashFilename = _path.default.join(appiumHome, _constants.PKG_HASHFILE_RELATIVE_PATH);
24
+
25
+ let isChanged;
26
+ let writeHash;
27
+ let hash;
28
+ let oldHash;
29
+
30
+ const hashFilenameDir = _path.default.dirname(hashFilename);
31
+
32
+ _logger.default.debug(`Creating hash file directory: ${hashFilenameDir}`);
33
+
34
+ try {
35
+ await _support.fs.mkdirp(hashFilenameDir);
36
+ } catch (err) {
37
+ throw new Error(`Appium could not create the directory for hash file: ${hashFilenameDir}. Original error: ${err.message}`);
38
+ }
39
+
40
+ try {
41
+ ({
42
+ isChanged,
43
+ writeHash,
44
+ oldHash,
45
+ hash
46
+ } = await (0, _packageChanged.isPackageChanged)({
47
+ cwd: appiumHome,
48
+ hashFilename: _constants.PKG_HASHFILE_RELATIVE_PATH
49
+ }));
50
+ } catch {
51
+ return true;
52
+ }
53
+
54
+ if (isChanged) {
55
+ try {
56
+ var _oldHash;
57
+
58
+ writeHash();
59
+
60
+ _logger.default.debug(`Updated hash of ${appiumHome}/package.json from: ${(_oldHash = oldHash) !== null && _oldHash !== void 0 ? _oldHash : '(none)'} to: ${hash}`);
61
+ } catch (err) {
62
+ throw new Error(`Appium could not write hash file: ${hashFilenameDir}. Original error: ${err.message}`);
63
+ }
64
+ }
65
+
66
+ return isChanged;
67
+ }
68
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vcGFja2FnZS1jaGFuZ2VkLmpzIl0sIm5hbWVzIjpbInBhY2thZ2VEaWRDaGFuZ2UiLCJhcHBpdW1Ib21lIiwiaGFzaEZpbGVuYW1lIiwicGF0aCIsImpvaW4iLCJQS0dfSEFTSEZJTEVfUkVMQVRJVkVfUEFUSCIsImlzQ2hhbmdlZCIsIndyaXRlSGFzaCIsImhhc2giLCJvbGRIYXNoIiwiaGFzaEZpbGVuYW1lRGlyIiwiZGlybmFtZSIsImxvZyIsImRlYnVnIiwiZnMiLCJta2RpcnAiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJjd2QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBV08sZUFBZUEsZ0JBQWYsQ0FBaUNDLFVBQWpDLEVBQTZDO0FBQ2xELFFBQU1DLFlBQVksR0FBR0MsY0FBS0MsSUFBTCxDQUFVSCxVQUFWLEVBQXNCSSxxQ0FBdEIsQ0FBckI7O0FBS0EsTUFBSUMsU0FBSjtBQUVBLE1BQUlDLFNBQUo7QUFFQSxNQUFJQyxJQUFKO0FBRUEsTUFBSUMsT0FBSjs7QUFHQSxRQUFNQyxlQUFlLEdBQUdQLGNBQUtRLE9BQUwsQ0FBYVQsWUFBYixDQUF4Qjs7QUFDQVUsa0JBQUlDLEtBQUosQ0FBVyxpQ0FBZ0NILGVBQWdCLEVBQTNEOztBQUNBLE1BQUk7QUFDRixVQUFNSSxZQUFHQyxNQUFILENBQVVMLGVBQVYsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPTSxHQUFQLEVBQVk7QUFDWixVQUFNLElBQUlDLEtBQUosQ0FDSCx3REFBdURQLGVBQWdCLHFCQUFvQk0sR0FBRyxDQUFDRSxPQUFRLEVBRHBHLENBQU47QUFHRDs7QUFFRCxNQUFJO0FBQ0YsS0FBQztBQUFDWixNQUFBQSxTQUFEO0FBQVlDLE1BQUFBLFNBQVo7QUFBdUJFLE1BQUFBLE9BQXZCO0FBQWdDRCxNQUFBQTtBQUFoQyxRQUF3QyxNQUFNLHNDQUFpQjtBQUM5RFcsTUFBQUEsR0FBRyxFQUFFbEIsVUFEeUQ7QUFFOURDLE1BQUFBLFlBQVksRUFBRUc7QUFGZ0QsS0FBakIsQ0FBL0M7QUFJRCxHQUxELENBS0UsTUFBTTtBQUNOLFdBQU8sSUFBUDtBQUNEOztBQUVELE1BQUlDLFNBQUosRUFBZTtBQUNiLFFBQUk7QUFBQTs7QUFDRkMsTUFBQUEsU0FBUzs7QUFDVEssc0JBQUlDLEtBQUosQ0FBVyxtQkFBa0JaLFVBQVcsdUJBQTlCLFlBQW9EUSxPQUFwRCwrQ0FBK0QsUUFBUyxRQUFPRCxJQUFLLEVBQTlGO0FBQ0QsS0FIRCxDQUdFLE9BQU9RLEdBQVAsRUFBWTtBQUNaLFlBQU0sSUFBSUMsS0FBSixDQUNILHFDQUFvQ1AsZUFBZ0IscUJBQW9CTSxHQUFHLENBQUNFLE9BQVEsRUFEakYsQ0FBTjtBQUdEO0FBQ0Y7O0FBRUQsU0FBT1osU0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBpc1BhY2thZ2VDaGFuZ2VkIH0gZnJvbSAncGFja2FnZS1jaGFuZ2VkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgZXh0ZW5zaW9ucyBoYXZlIGNoYW5nZWQsIGFuZCB1cGRhdGVzIGEgaGFzaCB0aGUgYHBhY2thZ2UuanNvbmAgaW4gYGFwcGl1bUhvbWVgIGlmIHNvLlxuICpcbiAqIElmIHRoZXkgaGF2ZSwgd2UgbmVlZCB0byBzeW5jIHRoZW0gd2l0aCB0aGUgYGV4dGVuc2lvbnMueWFtbGAgbWFuaWZlc3QuXG4gKlxuICogX1dhcm5pbmc6IHRoaXMgbWFrZXMgYSBibG9ja2luZyBjYWxsIHRvIGB3cml0ZUZpbGVTeW5jYC5fXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IGB0cnVlYCBpZiBgcGFja2FnZS5qc29uYCBgYXBwaXVtSG9tZWAgY2hhbmdlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZURpZENoYW5nZSAoYXBwaXVtSG9tZSkge1xuICBjb25zdCBoYXNoRmlsZW5hbWUgPSBwYXRoLmpvaW4oYXBwaXVtSG9tZSwgUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgpO1xuXG4gIC8vIFhYWDogdGhlIHR5cGVzIGluIGBwYWNrYWdlLWNoYW5nZWRgIHNlZW0gdG8gYmUgd3JvbmcuXG5cbiAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICBsZXQgaXNDaGFuZ2VkO1xuICAvKiogQHR5cGUgeygpID0+IHZvaWR9ICovXG4gIGxldCB3cml0ZUhhc2g7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICBsZXQgaGFzaDtcbiAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICBsZXQgb2xkSGFzaDtcblxuICAvLyBmaXJzdCBta2RpcnAgdGhlIHRhcmdldCBkaXIuXG4gIGNvbnN0IGhhc2hGaWxlbmFtZURpciA9IHBhdGguZGlybmFtZShoYXNoRmlsZW5hbWUpO1xuICBsb2cuZGVidWcoYENyZWF0aW5nIGhhc2ggZmlsZSBkaXJlY3Rvcnk6ICR7aGFzaEZpbGVuYW1lRGlyfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlycChoYXNoRmlsZW5hbWVEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXBwaXVtIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSBmb3IgaGFzaCBmaWxlOiAke2hhc2hGaWxlbmFtZURpcn0uIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKHtpc0NoYW5nZWQsIHdyaXRlSGFzaCwgb2xkSGFzaCwgaGFzaH0gPSBhd2FpdCBpc1BhY2thZ2VDaGFuZ2VkKHtcbiAgICAgIGN3ZDogYXBwaXVtSG9tZSxcbiAgICAgIGhhc2hGaWxlbmFtZTogUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgsXG4gICAgfSkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0cnkge1xuICAgICAgd3JpdGVIYXNoKCk7XG4gICAgICBsb2cuZGVidWcoYFVwZGF0ZWQgaGFzaCBvZiAke2FwcGl1bUhvbWV9L3BhY2thZ2UuanNvbiBmcm9tOiAke29sZEhhc2ggPz8gJyhub25lKSd9IHRvOiAke2hhc2h9YCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcHBpdW0gY291bGQgbm90IHdyaXRlIGhhc2ggZmlsZTogJHtoYXNoRmlsZW5hbWVEaXJ9LiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDaGFuZ2VkO1xufVxuIl19
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @extends {ExtensionConfig<PluginType>}
3
+ */
4
+ export class PluginConfig extends ExtensionConfig<"plugin"> {
5
+ /**
6
+ * A mapping of {@link Manifest} instances to {@link PluginConfig} instances.
7
+ *
8
+ * `Manifest` and {@link ExtensionConfig} have a one-to-many relationship; each `Manifest` should be associated with a `DriverConfig` and a `PluginConfig`; no more, no less.
9
+ *
10
+ * This variable tracks the `Manifest`-to-`PluginConfig` portion.
11
+ *
12
+ * @type {WeakMap<Manifest,PluginConfig>}
13
+ * @private
14
+ */
15
+ private static _instances;
16
+ /**
17
+ * Creates a new {@link PluginConfig} instance for a {@link Manifest} instance.
18
+ *
19
+ * @param {Manifest} manifest
20
+ * @param {PluginConfigOptions} [opts]
21
+ * @throws If `manifest` already associated with a `PluginConfig`
22
+ * @returns {PluginConfig}
23
+ */
24
+ static create(manifest: Manifest, { extData, logFn }?: PluginConfigOptions | undefined): PluginConfig;
25
+ /**
26
+ * Returns a PluginConfig associated with a Manifest
27
+ * @param {Manifest} manifest
28
+ * @returns {PluginConfig|undefined}
29
+ */
30
+ static getInstance(manifest: Manifest): PluginConfig | undefined;
31
+ /**
32
+ * Call {@link PluginConfig.create} instead.
33
+ *
34
+ * Just calls the superclass' constructor with the correct extension type
35
+ * @private
36
+ * @param {Manifest} manifest - IO object
37
+ * @param {PluginConfigOptions} [opts]
38
+ */
39
+ private constructor();
40
+ /**
41
+ *
42
+ * @param {(keyof PluginRecord)[]} activeNames
43
+ * @returns {void}
44
+ */
45
+ print(activeNames: (keyof PluginRecord)[]): void;
46
+ }
47
+ export type PluginConfigOptions = {
48
+ /**
49
+ * - Optional logging function
50
+ */
51
+ logFn?: import("./extension-config").ExtensionLogFn | undefined;
52
+ /**
53
+ * - Extension data
54
+ */
55
+ extData?: import("../../types").PluginRecord | undefined;
56
+ };
57
+ export type PluginRecord = import('../../types/appium-manifest').PluginRecord;
58
+ export type PluginType = import('../../types').PluginType;
59
+ export type PluginMetadata = import('../../types/external-manifest').ExtMetadata<PluginType>;
60
+ export type Manifest = import('./manifest').Manifest;
61
+ import { ExtensionConfig } from "./extension-config";
62
+ //# sourceMappingURL=plugin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../../../lib/extension/plugin-config.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IAEE;;;;;;;;;OASG;IACF,0BAAkC;IAkBlC;;;;;;;OAOG;IACH,wBALW,QAAQ,yDAGN,YAAY,CASxB;IAED;;;;QAII;IACJ,6BAHY,QAAQ,GACN,YAAY,GAAC,SAAS,CAInC;IAxCD;;;;;;;MAOE;IACF,sBAMC;IAqCD;;;;MAIE;IACF,mBAHU,CAAC,MAAM,YAAY,CAAC,EAAE,GACpB,IAAI,CAoBf;CACH;;;;;;;;;;;2BAUY,OAAO,6BAA6B,EAAE,YAAY;yBAClD,OAAO,aAAa,EAAE,UAAU;6BAChC,OAAO,+BAA+B,EAAE,WAAW,CAAC,UAAU,CAAC;uBAC/D,OAAO,YAAY,EAAE,QAAQ"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.PluginConfig = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _extensionConfig = require("./extension-config");
15
+
16
+ var _logger = _interopRequireDefault(require("../logger"));
17
+
18
+ var _constants = require("../constants");
19
+
20
+ class PluginConfig extends _extensionConfig.ExtensionConfig {
21
+ static _instances = new WeakMap();
22
+
23
+ constructor(manifest, {
24
+ extData,
25
+ logFn
26
+ } = {}) {
27
+ super(_constants.PLUGIN_TYPE, manifest, logFn);
28
+
29
+ if (extData) {
30
+ this.validate(extData);
31
+ }
32
+ }
33
+
34
+ static create(manifest, {
35
+ extData,
36
+ logFn
37
+ } = {}) {
38
+ const instance = new PluginConfig(manifest, {
39
+ logFn,
40
+ extData
41
+ });
42
+
43
+ if (PluginConfig.getInstance(manifest)) {
44
+ throw new Error(`Manifest with APPIUM_HOME ${manifest.appiumHome} already has a PluginConfig; use PluginConfig.getInstance() to retrieve it.`);
45
+ }
46
+
47
+ PluginConfig._instances.set(manifest, instance);
48
+
49
+ return instance;
50
+ }
51
+
52
+ static getInstance(manifest) {
53
+ return PluginConfig._instances.get(manifest);
54
+ }
55
+
56
+ extensionDesc(pluginName, {
57
+ version
58
+ }) {
59
+ return `${pluginName}@${version}`;
60
+ }
61
+
62
+ print(activeNames) {
63
+ const pluginNames = Object.keys(this.installedExtensions);
64
+
65
+ if (_lodash.default.isEmpty(pluginNames)) {
66
+ _logger.default.info(`No plugins have been installed. Use the "appium plugin" ` + 'command to install the one(s) you want to use.');
67
+
68
+ return;
69
+ }
70
+
71
+ _logger.default.info(`Available plugins:`);
72
+
73
+ for (const [pluginName, pluginData] of _lodash.default.toPairs(this.installedExtensions)) {
74
+ const activeTxt = _lodash.default.includes(activeNames, pluginName) ? ' (ACTIVE)' : '';
75
+
76
+ _logger.default.info(` - ${this.extensionDesc(pluginName, pluginData)}${activeTxt}`);
77
+ }
78
+
79
+ if (_lodash.default.isEmpty(activeNames)) {
80
+ _logger.default.info('No plugins activated. Use the --use-plugins flag with names of plugins to activate');
81
+ }
82
+ }
83
+
84
+ }
85
+
86
+ exports.PluginConfig = PluginConfig;
87
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vcGx1Z2luLWNvbmZpZy5qcyJdLCJuYW1lcyI6WyJQbHVnaW5Db25maWciLCJFeHRlbnNpb25Db25maWciLCJfaW5zdGFuY2VzIiwiV2Vha01hcCIsImNvbnN0cnVjdG9yIiwibWFuaWZlc3QiLCJleHREYXRhIiwibG9nRm4iLCJQTFVHSU5fVFlQRSIsInZhbGlkYXRlIiwiY3JlYXRlIiwiaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsIkVycm9yIiwiYXBwaXVtSG9tZSIsInNldCIsImdldCIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLTyxNQUFNQSxZQUFOLFNBQTJCQyxnQ0FBM0IsQ0FBMkM7QUFZOUIsU0FBVkMsVUFBVSxHQUFHLElBQUlDLE9BQUosRUFBSDs7QUFVakJDLEVBQUFBLFdBQVcsQ0FBRUMsUUFBRixFQUFZO0FBQUNDLElBQUFBLE9BQUQ7QUFBVUMsSUFBQUE7QUFBVixNQUFtQixFQUEvQixFQUFtQztBQUM1QyxVQUFNQyxzQkFBTixFQUFtQkgsUUFBbkIsRUFBNkJFLEtBQTdCOztBQUVBLFFBQUlELE9BQUosRUFBYTtBQUNYLFdBQUtHLFFBQUwsQ0FBY0gsT0FBZDtBQUNEO0FBQ0Y7O0FBVVksU0FBTkksTUFBTSxDQUFFTCxRQUFGLEVBQVk7QUFBQ0MsSUFBQUEsT0FBRDtBQUFVQyxJQUFBQTtBQUFWLE1BQW1CLEVBQS9CLEVBQW1DO0FBQzlDLFVBQU1JLFFBQVEsR0FBRyxJQUFJWCxZQUFKLENBQWlCSyxRQUFqQixFQUEyQjtBQUFDRSxNQUFBQSxLQUFEO0FBQVFELE1BQUFBO0FBQVIsS0FBM0IsQ0FBakI7O0FBQ0EsUUFBSU4sWUFBWSxDQUFDWSxXQUFiLENBQXlCUCxRQUF6QixDQUFKLEVBQXdDO0FBQ3RDLFlBQU0sSUFBSVEsS0FBSixDQUFXLDZCQUE0QlIsUUFBUSxDQUFDUyxVQUFXLDZFQUEzRCxDQUFOO0FBQ0Q7O0FBQ0RkLElBQUFBLFlBQVksQ0FBQ0UsVUFBYixDQUF3QmEsR0FBeEIsQ0FBNEJWLFFBQTVCLEVBQXNDTSxRQUF0Qzs7QUFDQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBT2lCLFNBQVhDLFdBQVcsQ0FBRVAsUUFBRixFQUFZO0FBQzVCLFdBQU9MLFlBQVksQ0FBQ0UsVUFBYixDQUF3QmMsR0FBeEIsQ0FBNEJYLFFBQTVCLENBQVA7QUFDRDs7QUFPRFksRUFBQUEsYUFBYSxDQUFFQyxVQUFGLEVBQWM7QUFBQ0MsSUFBQUE7QUFBRCxHQUFkLEVBQXlCO0FBQ3BDLFdBQVEsR0FBRUQsVUFBVyxJQUFHQyxPQUFRLEVBQWhDO0FBQ0Q7O0FBT0RDLEVBQUFBLEtBQUssQ0FBRUMsV0FBRixFQUFlO0FBQ2xCLFVBQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0MsbUJBQWpCLENBQXBCOztBQUVBLFFBQUlDLGdCQUFFQyxPQUFGLENBQVVMLFdBQVYsQ0FBSixFQUE0QjtBQUMxQk0sc0JBQUlDLElBQUosQ0FBVSwwREFBRCxHQUNELGdEQURSOztBQUVBO0FBQ0Q7O0FBRURELG9CQUFJQyxJQUFKLENBQVUsb0JBQVY7O0FBQ0EsU0FBSyxNQUFNLENBQUNYLFVBQUQsRUFBYVksVUFBYixDQUFYLElBQXVDSixnQkFBRUssT0FBRixDQUFVLEtBQUtOLG1CQUFmLENBQXZDLEVBQTRFO0FBQzFFLFlBQU1PLFNBQVMsR0FBR04sZ0JBQUVPLFFBQUYsQ0FBV1osV0FBWCxFQUF3QkgsVUFBeEIsSUFBc0MsV0FBdEMsR0FBb0QsRUFBdEU7O0FBQ0FVLHNCQUFJQyxJQUFKLENBQVUsT0FBTSxLQUFLWixhQUFMLENBQW1CQyxVQUFuQixFQUErQlksVUFBL0IsQ0FBMkMsR0FBRUUsU0FBVSxFQUF2RTtBQUNEOztBQUVELFFBQUlOLGdCQUFFQyxPQUFGLENBQVVOLFdBQVYsQ0FBSixFQUE0QjtBQUMxQk8sc0JBQUlDLElBQUosQ0FBUyxvRkFBVDtBQUNEO0FBQ0Y7O0FBeEY4QyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RXh0ZW5zaW9uQ29uZmlnfSBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtQTFVHSU5fVFlQRX0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uQ29uZmlnPFBsdWdpblR5cGU+fVxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ29uZmlnIGV4dGVuZHMgRXh0ZW5zaW9uQ29uZmlnIHtcblxuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHtAbGluayBNYW5pZmVzdH0gaW5zdGFuY2VzIHRvIHtAbGluayBQbHVnaW5Db25maWd9IGluc3RhbmNlcy5cbiAgICpcbiAgICogYE1hbmlmZXN0YCBhbmQge0BsaW5rIEV4dGVuc2lvbkNvbmZpZ30gaGF2ZSBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcDsgZWFjaCBgTWFuaWZlc3RgIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYSBgRHJpdmVyQ29uZmlnYCBhbmQgYSBgUGx1Z2luQ29uZmlnYDsgbm8gbW9yZSwgbm8gbGVzcy5cbiAgICpcbiAgICogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGBNYW5pZmVzdGAtdG8tYFBsdWdpbkNvbmZpZ2AgcG9ydGlvbi5cbiAgICpcbiAgICogQHR5cGUge1dlYWtNYXA8TWFuaWZlc3QsUGx1Z2luQ29uZmlnPn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gICBzdGF0aWMgX2luc3RhbmNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgIC8qKlxuICAgKiBDYWxsIHtAbGluayBQbHVnaW5Db25maWcuY3JlYXRlfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBKdXN0IGNhbGxzIHRoZSBzdXBlcmNsYXNzJyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TWFuaWZlc3R9IG1hbmlmZXN0IC0gSU8gb2JqZWN0XG4gICAqIEBwYXJhbSB7UGx1Z2luQ29uZmlnT3B0aW9uc30gW29wdHNdXG4gICAqL1xuICAgY29uc3RydWN0b3IgKG1hbmlmZXN0LCB7ZXh0RGF0YSwgbG9nRm59ID0ge30pIHtcbiAgICAgc3VwZXIoUExVR0lOX1RZUEUsIG1hbmlmZXN0LCBsb2dGbik7XG5cbiAgICAgaWYgKGV4dERhdGEpIHtcbiAgICAgICB0aGlzLnZhbGlkYXRlKGV4dERhdGEpO1xuICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZSBmb3IgYSB7QGxpbmsgTWFuaWZlc3R9IGluc3RhbmNlLlxuICAgICpcbiAgICAqIEBwYXJhbSB7TWFuaWZlc3R9IG1hbmlmZXN0XG4gICAgKiBAcGFyYW0ge1BsdWdpbkNvbmZpZ09wdGlvbnN9IFtvcHRzXVxuICAgICogQHRocm93cyBJZiBgbWFuaWZlc3RgIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGEgYFBsdWdpbkNvbmZpZ2BcbiAgICAqIEByZXR1cm5zIHtQbHVnaW5Db25maWd9XG4gICAgKi9cbiAgIHN0YXRpYyBjcmVhdGUgKG1hbmlmZXN0LCB7ZXh0RGF0YSwgbG9nRm59ID0ge30pIHtcbiAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUGx1Z2luQ29uZmlnKG1hbmlmZXN0LCB7bG9nRm4sIGV4dERhdGF9KTtcbiAgICAgaWYgKFBsdWdpbkNvbmZpZy5nZXRJbnN0YW5jZShtYW5pZmVzdCkpIHtcbiAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbmlmZXN0IHdpdGggQVBQSVVNX0hPTUUgJHttYW5pZmVzdC5hcHBpdW1Ib21lfSBhbHJlYWR5IGhhcyBhIFBsdWdpbkNvbmZpZzsgdXNlIFBsdWdpbkNvbmZpZy5nZXRJbnN0YW5jZSgpIHRvIHJldHJpZXZlIGl0LmApO1xuICAgICB9XG4gICAgIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzLnNldChtYW5pZmVzdCwgaW5zdGFuY2UpO1xuICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICB9XG5cbiAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQbHVnaW5Db25maWcgYXNzb2NpYXRlZCB3aXRoIGEgTWFuaWZlc3RcbiAgICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdFxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5Db25maWd8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgc3RhdGljIGdldEluc3RhbmNlIChtYW5pZmVzdCkge1xuICAgICByZXR1cm4gUGx1Z2luQ29uZmlnLl9pbnN0YW5jZXMuZ2V0KG1hbmlmZXN0KTtcbiAgIH1cblxuICAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwbHVnaW5OYW1lXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHRNYW5pZmVzdDxQbHVnaW5UeXBlPn0gcGx1Z2luRGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgIGV4dGVuc2lvbkRlc2MgKHBsdWdpbk5hbWUsIHt2ZXJzaW9ufSkge1xuICAgICByZXR1cm4gYCR7cGx1Z2luTmFtZX1AJHt2ZXJzaW9ufWA7XG4gICB9XG5cbiAgIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyhrZXlvZiBQbHVnaW5SZWNvcmQpW119IGFjdGl2ZU5hbWVzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgIHByaW50IChhY3RpdmVOYW1lcykge1xuICAgICBjb25zdCBwbHVnaW5OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG5cbiAgICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgICBsb2cuaW5mbyhgTm8gcGx1Z2lucyBoYXZlIGJlZW4gaW5zdGFsbGVkLiBVc2UgdGhlIFwiYXBwaXVtIHBsdWdpblwiIGAgK1xuICAgICAgICAgICAgICAgJ2NvbW1hbmQgdG8gaW5zdGFsbCB0aGUgb25lKHMpIHlvdSB3YW50IHRvIHVzZS4nKTtcbiAgICAgICByZXR1cm47XG4gICAgIH1cblxuICAgICBsb2cuaW5mbyhgQXZhaWxhYmxlIHBsdWdpbnM6YCk7XG4gICAgIGZvciAoY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbkRhdGFdIG9mIF8udG9QYWlycyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpKSB7XG4gICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MocGx1Z2luTmFtZSwgcGx1Z2luRGF0YSl9JHthY3RpdmVUeHR9YCk7XG4gICAgIH1cblxuICAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZU5hbWVzKSkge1xuICAgICAgIGxvZy5pbmZvKCdObyBwbHVnaW5zIGFjdGl2YXRlZC4gVXNlIHRoZSAtLXVzZS1wbHVnaW5zIGZsYWcgd2l0aCBuYW1lcyBvZiBwbHVnaW5zIHRvIGFjdGl2YXRlJyk7XG4gICAgIH1cbiAgIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBQbHVnaW5Db25maWdPcHRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uTG9nRm59IFtsb2dGbl0gLSBPcHRpb25hbCBsb2dnaW5nIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuUGx1Z2luUmVjb3JkfSBbZXh0RGF0YV0gLSBFeHRlbnNpb24gZGF0YVxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5QbHVnaW5SZWNvcmR9IFBsdWdpblJlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkV4dE1ldGFkYXRhPFBsdWdpblR5cGU+fSBQbHVnaW5NZXRhZGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9tYW5pZmVzdCcpLk1hbmlmZXN0fSBNYW5pZmVzdFxuICovXG4iXX0=
@@ -0,0 +1,10 @@
1
+ export default registerNode;
2
+ /**
3
+ * Registers a new node with a selenium grid
4
+ * @param {string|object} data - Path or object representing selenium grid node config file. If a `string`, all subsequent arguments are required!
5
+ * @param {string} [addr] - Bind to this address
6
+ * @param {number} [port] - Bind to this port
7
+ * @param {string} [basePath] - Base path for the grid
8
+ */
9
+ declare function registerNode(data: string | object, addr?: string | undefined, port?: number | undefined, basePath?: string | undefined): Promise<void>;
10
+ //# sourceMappingURL=grid-register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-register.d.ts","sourceRoot":"","sources":["../../lib/grid-register.js"],"names":[],"mappings":";AAWA;;;;;;GAMG;AACH,oCALW,MAAM,GAAC,MAAM,sGAwBvB"}