appium 2.0.0-beta.3 → 2.0.0-beta.34

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 (149) 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 +241 -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 +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 +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 +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 +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 +54 -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 +40 -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.d.ts +43 -0
  92. package/build/types/extension.d.ts.map +1 -0
  93. package/build/types/external-manifest.d.ts +47 -0
  94. package/build/types/external-manifest.d.ts.map +1 -0
  95. package/build/types/index.d.ts +15 -0
  96. package/build/types/index.d.ts.map +1 -0
  97. package/index.js +11 -0
  98. package/lib/appium-config.schema.json +278 -0
  99. package/lib/appium.js +402 -155
  100. package/lib/cli/args.js +174 -377
  101. package/lib/cli/driver-command.js +22 -7
  102. package/lib/cli/extension-command.js +372 -177
  103. package/lib/cli/extension.js +32 -10
  104. package/lib/cli/parser.js +253 -83
  105. package/lib/cli/plugin-command.js +19 -6
  106. package/lib/cli/utils.js +22 -2
  107. package/lib/config-file.js +223 -0
  108. package/lib/config.js +170 -69
  109. package/lib/constants.js +78 -0
  110. package/lib/extension/driver-config.js +249 -0
  111. package/lib/extension/extension-config.js +458 -0
  112. package/lib/extension/index.js +102 -0
  113. package/lib/extension/manifest.js +484 -0
  114. package/lib/extension/package-changed.js +63 -0
  115. package/lib/extension/plugin-config.js +113 -0
  116. package/lib/grid-register.js +25 -22
  117. package/lib/logger.js +1 -1
  118. package/lib/logsink.js +14 -7
  119. package/lib/main.js +255 -90
  120. package/lib/schema/arg-spec.js +232 -0
  121. package/lib/schema/cli-args.js +261 -0
  122. package/lib/schema/cli-transformers.js +122 -0
  123. package/lib/schema/index.js +2 -0
  124. package/lib/schema/keywords.js +134 -0
  125. package/lib/schema/schema.js +734 -0
  126. package/lib/utils.js +85 -129
  127. package/package.json +68 -85
  128. package/scripts/postinstall.js +71 -0
  129. package/types/appium-manifest.ts +61 -0
  130. package/types/cli.ts +153 -0
  131. package/types/extension.ts +56 -0
  132. package/types/external-manifest.ts +58 -0
  133. package/types/index.ts +14 -0
  134. package/CHANGELOG.md +0 -3515
  135. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  136. package/build/lib/cli/npm.js +0 -206
  137. package/build/lib/cli/parser-helpers.js +0 -82
  138. package/build/lib/driver-config.js +0 -77
  139. package/build/lib/drivers.js +0 -96
  140. package/build/lib/extension-config.js +0 -251
  141. package/build/lib/plugin-config.js +0 -59
  142. package/build/lib/plugins.js +0 -14
  143. package/lib/cli/npm.js +0 -183
  144. package/lib/cli/parser-helpers.js +0 -79
  145. package/lib/driver-config.js +0 -46
  146. package/lib/drivers.js +0 -81
  147. package/lib/extension-config.js +0 -208
  148. package/lib/plugin-config.js +0 -34
  149. 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NFQVJDSF9ERVBUSCIsIkRFRkFVTFRfRklORF9FWFRFTlNJT05TX09QVFMiLCJPYmplY3QiLCJmcmVlemUiLCJkZXB0aExpbWl0IiwiZmlsdGVyIiwiZmlsZXBhdGgiLCJwYXRoIiwiYmFzZW5hbWUiLCJzdGFydHNXaXRoIiwiQ09ORklHX1NDSEVNQV9SRVYiLCJDT05GSUdfREFUQV9EUklWRVJfS0VZIiwiRFJJVkVSX1RZUEUiLCJDT05GSUdfREFUQV9QTFVHSU5fS0VZIiwiUExVR0lOX1RZUEUiLCJJTklUSUFMX01BTklGRVNUX0RBVEEiLCJzY2hlbWFSZXYiLCJpc0V4dGVuc2lvbiIsInZhbHVlIiwiXyIsImlzUGxhaW5PYmplY3QiLCJhcHBpdW0iLCJpc1N0cmluZyIsIm5hbWUiLCJ2ZXJzaW9uIiwiaXNEcml2ZXIiLCJnZXQiLCJpc0FycmF5IiwiaXNQbHVnaW4iLCJNYW5pZmVzdCIsIl9kYXRhIiwiX2FwcGl1bUhvbWUiLCJfbWFuaWZlc3RQYXRoIiwiX3dyaXRpbmciLCJfcmVhZGluZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImNsb25lRGVlcCIsImdldEluc3RhbmNlIiwibWVtb2l6ZSIsIl9nZXRJbnN0YW5jZSIsInN5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9ucyIsIndhbGtPcHRzIiwiZGVmYXVsdHMiLCJkaWRDaGFuZ2UiLCJzdGF0cyIsImZzIiwid2FsayIsImlzRGlyZWN0b3J5IiwicGtnIiwiZW52IiwicmVhZFBhY2thZ2VJbkRpciIsImFkZGVkIiwiYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2UiLCJqb2luIiwiaGFzRHJpdmVyIiwiQm9vbGVhbiIsImRyaXZlcnMiLCJoYXNQbHVnaW4iLCJwbHVnaW5zIiwicGtnSnNvbiIsInBrZ1BhdGgiLCJpbnRlcm5hbCIsInBrZ05hbWUiLCJpbnN0YWxsVHlwZSIsIklOU1RBTExfVFlQRV9OUE0iLCJpbnN0YWxsU3BlYyIsImRyaXZlck5hbWUiLCJhZGRFeHRlbnNpb24iLCJvbWl0IiwicGx1Z2luTmFtZSIsIlR5cGVFcnJvciIsImRpcm5hbWUiLCJleHRUeXBlIiwiZXh0TmFtZSIsImV4dERhdGEiLCJtYW5pZmVzdFBhdGgiLCJnZXRFeHRlbnNpb25EYXRhIiwicmVhZCIsImRhdGEiLCJpc05ld0ZpbGUiLCJfc2V0TWFuaWZlc3RQYXRoIiwibG9nIiwiZGVidWciLCJ5YW1sIiwicmVhZEZpbGUiLCJZQU1MIiwicGFyc2UiLCJlcnIiLCJjb2RlIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQiLCJoYXNBcHBpdW1EZXBlbmRlbmN5Iiwid3JpdGUiLCJ1bmRlZmluZWQiLCJyZXNvbHZlTWFuaWZlc3RQYXRoIiwicmVsYXRpdmUiLCJta2RpcnAiLCJ3cml0ZUZpbGUiLCJzdHJpbmdpZnkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXh0ZW5zaW9uL21hbmlmZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIGNvbnRhaW5pbmcge0BsaW5rIE1hbmlmZXN0fSB3aGljaCBoYW5kbGVzIHJlYWRpbmcgJiB3cml0aW5nIG9mIGV4dGVuc2lvbiBjb25maWcgZmlsZXMuXG4gKi9cblxuaW1wb3J0IHsgZW52LCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNIH0gZnJvbSAnLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7IHBhY2thZ2VEaWRDaGFuZ2UgfSBmcm9tICcuL3BhY2thZ2UtY2hhbmdlZCc7XG5cbi8qKlxuICogRGVmYXVsdCBkZXB0aCB0byBzZWFyY2ggaW4gZGlyZWN0b3J5IHRyZWUgZm9yIHdoYXRldmVyIGl0IGlzIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICpcbiAqIEl0J3MgNCBiZWNhdXNlIHNtYWxsZXIgbnVtYmVycyBkaWRuJ3Qgd29yay5cbiAqL1xuY29uc3QgREVGQVVMVF9TRUFSQ0hfREVQVEggPSA0O1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3Ige0BsaW5rIGZpbmRFeHRlbnNpb25zfS5cbiAqIEB0eXBlIHtSZWFkb25seTxpbXBvcnQoJ2tsYXcnKS5PcHRpb25zPn1cbiAqL1xuY29uc3QgREVGQVVMVF9GSU5EX0VYVEVOU0lPTlNfT1BUUyA9IE9iamVjdC5mcmVlemUoe1xuICBkZXB0aExpbWl0OiBERUZBVUxUX1NFQVJDSF9ERVBUSCxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZmlsdGVyOiAoZmlsZXBhdGgpID0+ICFwYXRoLmJhc2VuYW1lKGZpbGVwYXRoKS5zdGFydHNXaXRoKCcuJyksXG59KTtcblxuLyoqXG4gKiBDdXJyZW50IGNvbmZpZ3VyYXRpb24gc2NoZW1hIHJldmlzaW9uIVxuICovXG5jb25zdCBDT05GSUdfU0NIRU1BX1JFViA9IDI7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHByb3AgKGBkcml2ZXJzYCkgdXNlZCBpbiBgZXh0ZW5zaW9ucy55YW1sYCBmb3IgZHJpdmVycy5cbiAqIEB0eXBlIHtgJHt0eXBlb2YgRFJJVkVSX1RZUEV9c2B9XG4gKi9cbmNvbnN0IENPTkZJR19EQVRBX0RSSVZFUl9LRVkgPSBgJHtEUklWRVJfVFlQRX1zYDtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgcHJvcCAoYHBsdWdpbnNgKSB1c2VkIGluIGBleHRlbnNpb25zLnlhbWxgIGZvciBwbHVnaW5zLlxuICogQHR5cGUge2Ake3R5cGVvZiBQTFVHSU5fVFlQRX1zYH1cbiAqL1xuY29uc3QgQ09ORklHX0RBVEFfUExVR0lOX0tFWSA9IGAke1BMVUdJTl9UWVBFfXNgO1xuXG4vKipcbiAqIEB0eXBlIHtSZWFkb25seTxNYW5pZmVzdERhdGE+fVxuICovXG5jb25zdCBJTklUSUFMX01BTklGRVNUX0RBVEEgPSBPYmplY3QuZnJlZXplKHtcbiAgW0NPTkZJR19EQVRBX0RSSVZFUl9LRVldOiBPYmplY3QuZnJlZXplKHt9KSxcbiAgW0NPTkZJR19EQVRBX1BMVUdJTl9LRVldOiBPYmplY3QuZnJlZXplKHt9KSxcbiAgc2NoZW1hUmV2OiBDT05GSUdfU0NIRU1BX1JFVixcbn0pO1xuXG4vKipcbiAqIEdpdmVuIGEgYHBhY2thZ2UuanNvbmAgcmV0dXJuIGB0cnVlYCBpZiBpdCByZXByZXNlbnRzIGFuIEFwcGl1bSBFeHRlbnNpb24gKGVpdGhlciBhIGRyaXZlciBvciBwbHVnaW4pLlxuICpcbiAqIFRoZSBgcGFja2FnZS5qc29uYCBtdXN0IGhhdmUgYW4gYGFwcGl1bWAgcHJvcGVydHkgd2hpY2ggaXMgYW4gb2JqZWN0LlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgRXh0UGFja2FnZUpzb248RXh0ZW5zaW9uVHlwZT59XG4gKi9cbmZ1bmN0aW9uIGlzRXh0ZW5zaW9uICh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiZcbiAgICBfLmlzUGxhaW5PYmplY3QodmFsdWUuYXBwaXVtKSAmJlxuICAgIF8uaXNTdHJpbmcodmFsdWUubmFtZSkgJiZcbiAgICBfLmlzU3RyaW5nKHZhbHVlLnZlcnNpb24pXG4gICk7XG59XG4vKipcbiAqIEdpdmVuIGEgYHBhY2thZ2UuanNvbmAsIHJldHVybiBgdHJ1ZWAgaWYgaXQgcmVwcmVzZW50cyBhbiBBcHBpdW0gRHJpdmVyLlxuICpcbiAqIFRvIGJlIGNvbnNpZGVyZWQgYSBkcml2ZXIsIGEgYHBhY2thZ2UuanNvbmAgbXVzdCBoYXZlIGEgZmllbGRzXG4gKiBgYXBwaXVtLmRyaXZlck5hbWVgLCBgYXBwaXVtLmF1dG9tYXRpb25OYW1lYCBhbmQgYGFwcGl1bS5wbGF0Zm9ybU5hbWVzYC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBFeHRQYWNrYWdlSnNvbjxEcml2ZXJUeXBlPn1cbiAqL1xuZnVuY3Rpb24gaXNEcml2ZXIgKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaXNFeHRlbnNpb24odmFsdWUpICYmXG4gICAgXy5pc1N0cmluZyhfLmdldCh2YWx1ZSwgJ2FwcGl1bS5kcml2ZXJOYW1lJykpICYmXG4gICAgXy5pc1N0cmluZyhfLmdldCh2YWx1ZSwgJ2FwcGl1bS5hdXRvbWF0aW9uTmFtZScpKSAmJlxuICAgIF8uaXNBcnJheShfLmdldCh2YWx1ZSwgJ2FwcGl1bS5wbGF0Zm9ybU5hbWVzJykpXG4gICk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBgcGFja2FnZS5qc29uYCwgcmV0dXJuIGB0cnVlYCBpZiBpdCByZXByZXNlbnRzIGFuIEFwcGl1bSBQbHVnaW4uXG4gKlxuICogVG8gYmUgY29uc2lkZXJlZCBhIHBsdWdpbiwgYSBgcGFja2FnZS5qc29uYCBtdXN0IGhhdmUgYW4gYGFwcGl1bS5wbHVnaW5OYW1lYCBmaWVsZC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBFeHRQYWNrYWdlSnNvbjxQbHVnaW5UeXBlPn1cbiAqL1xuZnVuY3Rpb24gaXNQbHVnaW4gKHZhbHVlKSB7XG4gIHJldHVybiBpc0V4dGVuc2lvbih2YWx1ZSkgJiYgXy5pc1N0cmluZyhfLmdldCh2YWx1ZSwgJ2FwcGl1bS5wbHVnaW5OYW1lJykpO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgcmVhZGluZyAmIHdyaXRpbmcgb2YgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlcy5cbiAqXG4gKiBPbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV4aXN0cyBwZXIgdmFsdWUgb2YgYEFQUElVTV9IT01FYC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBwYXJzZWQgWUFNTCBleHRlbnNpb24gY29uZmlnIGZpbGUuXG4gICAqXG4gICAqIENvbnRhaW5zIHByb3hpZXMgZm9yIGF1dG9tYXRpYyBwZXJzaXN0ZW5jZSBvbiBkaXNrXG4gICAqIEB0eXBlIHtNYW5pZmVzdERhdGF9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZGF0YTtcblxuICAvKipcbiAgICogUGF0aCB0byBgQVBQSVVNX0hPTUVgLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIF9hcHBpdW1Ib21lO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBleHRlbnNpb25zLnlhbWxgXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIE5vdCBzZXQgdW50aWwge0BsaW5rIE1hbmlmZXN0LnJlYWR9IGlzIGNhbGxlZC5cbiAgICovXG4gIF9tYW5pZmVzdFBhdGg7XG5cbiAgLyoqXG4gICAqIEhlbHBzIGF2b2lkIHdyaXRpbmcgbXVsdGlwbGUgdGltZXMuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYHVuZGVmaW5lZGAsIGNhbGxpbmcge0BsaW5rIE1hbmlmZXN0LndyaXRlfSB3aWxsIGNhdXNlIGl0IHRvIGJlXG4gICAqIHNldCB0byBhIGBQcm9taXNlYC4gV2hlbiB0aGUgY2FsbCB0byBgd3JpdGUoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8Ym9vbGVhbj58dW5kZWZpbmVkfVxuICAgKi9cbiAgX3dyaXRpbmc7XG5cbiAgLyoqXG4gICAqIEhlbHBzIGF2b2lkIHJlYWRpbmcgbXVsdGlwbGUgdGltZXMuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYHVuZGVmaW5lZGAsIGNhbGxpbmcge0BsaW5rIE1hbmlmZXN0LnJlYWR9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGByZWFkKClgIGlzIGNvbXBsZXRlLCB0aGUgYFByb21pc2VgXG4gICAqIHdpbGwgcmVzb2x2ZSBhbmQgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGB1bmRlZmluZWRgLiAgQ29uY3VycmVudCBjYWxsc1xuICAgKiBtYWRlIHdoaWxlIHRoaXMgdmFsdWUgaXMgYSBgUHJvbWlzZWAgd2lsbCByZXR1cm4gdGhlIGBQcm9taXNlYCBpdHNlbGYuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+fHVuZGVmaW5lZH1cbiAgICovXG4gIF9yZWFkaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIGludGVybmFsIGRhdGEgdG8gYSBmcmVzaCBjbG9uZSBvZiB7QGxpbmsgSU5JVElBTF9NQU5JRkVTVF9EQVRBfVxuICAgKlxuICAgKiBVc2Uge0BsaW5rIE1hbmlmZXN0LmdldEluc3RhbmNlfSBpbnN0ZWFkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUpIHtcbiAgICB0aGlzLl9hcHBpdW1Ib21lID0gYXBwaXVtSG9tZTtcbiAgICB0aGlzLl9kYXRhID0gXy5jbG9uZURlZXAoSU5JVElBTF9NQU5JRkVTVF9EQVRBKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IG9yIGV4aXN0aW5nIHtAbGluayBNYW5pZmVzdH0gaW5zdGFuY2UsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBgYXBwaXVtSG9tZWAuXG4gICAqXG4gICAqIE1haW50YWlucyBvbmUgaW5zdGFuY2UgcGVyIHZhbHVlIG9mIGBhcHBpdW1Ib21lYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBQYXRoIHRvIGBBUFBJVU1fSE9NRWBcbiAgICogQHJldHVybnMge01hbmlmZXN0fVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlID0gXy5tZW1vaXplKGZ1bmN0aW9uIF9nZXRJbnN0YW5jZSAoXG4gICAgYXBwaXVtSG9tZSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdChhcHBpdW1Ib21lKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGBBUFBJVU1fSE9NRWAgZm9yIGluc3RhbGxlZCBleHRlbnNpb25zIGFuZCBhZGRzIHRoZW0gdG8gdGhlIG1hbmlmZXN0LlxuICAgKiBAcGFyYW0ge1N5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9uc09wdHN9IG9wdHNcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IGB0cnVlYCBpZiBhbnkgZXh0ZW5zaW9ucyB3ZXJlIGFkZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIHN5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9ucyAoe2RlcHRoTGltaXQgPSBERUZBVUxUX1NFQVJDSF9ERVBUSH0gPSB7fSkge1xuICAgIGNvbnN0IHdhbGtPcHRzID0gXy5kZWZhdWx0cyh7ZGVwdGhMaW1pdH0sIERFRkFVTFRfRklORF9FWFRFTlNJT05TX09QVFMpO1xuICAgIC8vIHRoaXMgY291bGQgYmUgcGFyYWxsZWxpemVkLCBidXQgd2UgY2FuJ3QgdXNlIGZzLndhbGsgYXMgYW4gYXN5bmMgaXRlcmF0b3JcbiAgICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gICAgZm9yIGF3YWl0IChjb25zdCB7c3RhdHMsIHBhdGg6IGZpbGVwYXRofSBvZiBmcy53YWxrKFxuICAgICAgdGhpcy5fYXBwaXVtSG9tZSxcbiAgICAgIHdhbGtPcHRzLFxuICAgICkpIHtcbiAgICAgIGlmIChmaWxlcGF0aCAhPT0gdGhpcy5fYXBwaXVtSG9tZSAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGtnID0gYXdhaXQgZW52LnJlYWRQYWNrYWdlSW5EaXIoZmlsZXBhdGgpO1xuICAgICAgICAgIGlmIChwa2cgJiYgaXNFeHRlbnNpb24ocGtnKSkge1xuICAgICAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZXh0ZW5zaW9uIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYW5pZmVzdCxcbiAgICAgICAgICAgIC8vIHNvIG9ubHkgdXBkYXRlIGBkaWRDaGFuZ2VgIGlmIGl0J3MgbmV3LlxuICAgICAgICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLmFkZEV4dGVuc2lvbkZyb21QYWNrYWdlKFxuICAgICAgICAgICAgICBwa2csXG4gICAgICAgICAgICAgIHBhdGguam9pbihmaWxlcGF0aCwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRpZENoYW5nZSA9IGRpZENoYW5nZSB8fCBhZGRlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZENoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBkcml2ZXIgd2l0aCBuYW1lIGBuYW1lYCBpcyByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIERyaXZlciBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzRHJpdmVyIChuYW1lKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZGF0YS5kcml2ZXJzW25hbWVdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBwbHVnaW4gd2l0aCBuYW1lIGBuYW1lYCBpcyByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFBsdWdpbiBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzUGx1Z2luIChuYW1lKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZGF0YS5wbHVnaW5zW25hbWVdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHBhdGggdG8gYSBgcGFja2FnZS5qc29uYCwgYWRkIGl0IGFzIGVpdGhlciBhIGRyaXZlciBvciBwbHVnaW4gdG8gdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBXaWxsIF9ub3RfIG92ZXJ3cml0ZSBleGlzdGluZyBlbnRyaWVzLlxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnUGF0aFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBgdHJ1ZWAgdXBvbiBzdWNjZXNzLCBgZmFsc2VgIGlmIHRoZSBleHRlbnNpb24gaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKi9cbiAgYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2UgKHBrZ0pzb24sIHBrZ1BhdGgpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SW50ZXJuYWxNZXRhZGF0YX1cbiAgICAgKi9cbiAgICBjb25zdCBpbnRlcm5hbCA9IHtcbiAgICAgIHBrZ05hbWU6IHBrZ0pzb24ubmFtZSxcbiAgICAgIHZlcnNpb246IHBrZ0pzb24udmVyc2lvbixcbiAgICAgIGluc3RhbGxUeXBlOiBJTlNUQUxMX1RZUEVfTlBNLFxuICAgICAgaW5zdGFsbFNwZWM6IGAke3BrZ0pzb24ubmFtZX1AJHtwa2dKc29uLnZlcnNpb259YCxcbiAgICB9O1xuXG4gICAgaWYgKGlzRHJpdmVyKHBrZ0pzb24pKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzRHJpdmVyKHBrZ0pzb24uYXBwaXVtLmRyaXZlck5hbWUpKSB7XG4gICAgICAgIHRoaXMuYWRkRXh0ZW5zaW9uKERSSVZFUl9UWVBFLCBwa2dKc29uLmFwcGl1bS5kcml2ZXJOYW1lLCB7XG4gICAgICAgICAgLi4uXy5vbWl0KHBrZ0pzb24uYXBwaXVtLCAnZHJpdmVyTmFtZScpLFxuICAgICAgICAgIC4uLmludGVybmFsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzUGx1Z2luKHBrZ0pzb24pKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKHBrZ0pzb24uYXBwaXVtLnBsdWdpbk5hbWUpKSB7XG4gICAgICAgIHRoaXMuYWRkRXh0ZW5zaW9uKFBMVUdJTl9UWVBFLCBwa2dKc29uLmFwcGl1bS5wbHVnaW5OYW1lLCB7XG4gICAgICAgICAgLi4uXy5vbWl0KHBrZ0pzb24uYXBwaXVtLCAncGx1Z2luTmFtZScpLFxuICAgICAgICAgIC4uLmludGVybmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUaGUgZXh0ZW5zaW9uIGluICR7cGF0aC5kaXJuYW1lKFxuICAgICAgICAgIHBrZ1BhdGgsXG4gICAgICAgICl9IGlzIG5laXRoZXIgYSB2YWxpZCBkcml2ZXIgbm9yIGEgdmFsaWQgcGx1Z2luLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4dGVuc2lvbiB0byB0aGUgbWFuaWZlc3QgYXMgd2FzIGluc3RhbGxlZCBieSB0aGUgYGFwcGl1bWAgQ0xJLiAgVGhlXG4gICAqIGBleHREYXRhYCwgYGV4dFR5cGVgLCBhbmQgYGV4dE5hbWVgIGhhdmUgYWxyZWFkeSBiZWVuIGRldGVybWluZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgTWFuaWZlc3QuYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2V9IGZvciBhZGRpbmcgYW4gZXh0ZW5zaW9uIGZyb20gYW4gb24tZGlzayBwYWNrYWdlLlxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHRUeXBlfSBleHRUeXBlIC0gYGRyaXZlcmAgb3IgYHBsdWdpbmBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhIC0gRXh0ZW5zaW9uIG1ldGFkYXRhXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhpcy5fZGF0YVtgJHtleHRUeXBlfXNgXVtleHROYW1lXSA9IGV4dERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQVBQSVVNX0hPTUUgcGF0aFxuICAgKi9cbiAgZ2V0IGFwcGl1bUhvbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9hcHBpdW1Ib21lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGVcbiAgICovXG4gIGdldCBtYW5pZmVzdFBhdGggKCkge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleHRlbnNpb24gZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHJldHVybnMge0V4dFJlY29yZDxFeHRUeXBlPn1cbiAgICovXG4gIGdldEV4dGVuc2lvbkRhdGEgKGV4dFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke2V4dFR5cGV9c2ApXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBtYW5pZmVzdCBmcm9tIGRpc2sgYW5kIF9vdmVyd3JpdGVzXyB0aGUgaW50ZXJuYWwgZGF0YS5cbiAgICpcbiAgICogSWYgdGhlIG1hbmlmZXN0IGRvZXMgbm90IGV4aXN0IG9uIGRpc2ssIGFuIHtAbGluayBJTklUSUFMX01BTklGRVNUX0RBVEEgXCJlbXB0eVwifSBtYW5pZmVzdCBmaWxlIHdpbGwgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogSWYgYEFQUElVTV9IT01FYCBjb250YWlucyBhIGBwYWNrYWdlLmpzb25gIHdpdGggYW4gYGFwcGl1bWAgZGVwZW5kZW5jeSwgdGhlbiBhIGhhc2ggb2YgdGhlIGBwYWNrYWdlLmpzb25gIHdpbGwgYmUgdGFrZW4uIElmIHRoaXMgaGFzaCBkaWZmZXJzIGZyb20gdGhlIGxhc3QgaGFzaCwgdGhlIGNvbnRlbnRzIG9mIGBBUFBJVU1fSE9NRS9ub2RlX21vZHVsZXNgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZXh0ZW5zaW9ucyB0aGF0IG1heSBoYXZlIGJlZW4gaW5zdGFsbGVkIG91dHNpZGUgb2YgdGhlIGBhcHBpdW1gIENMSS4gIEFueSBmb3VuZCBleHRlbnNpb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1hbmlmZXN0IGZpbGUsIGFuZCBpZiBzbywgdGhlIG1hbmlmZXN0IGZpbGUgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suXG4gICAqXG4gICAqIE9ubHkgb25lIHJlYWQgb3BlcmF0aW9uIHNob3VsZCBoYXBwZW4gYXQgYSB0aW1lLiAgVGhpcyBpcyBjb250cm9sbGVkIHZpYSB0aGUge0BsaW5rIE1hbmlmZXN0Ll9yZWFkaW5nfSBwcm9wZXJ0eS5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFuaWZlc3REYXRhPn0gVGhlIGRhdGFcbiAgICovXG4gIGFzeW5jIHJlYWQgKCkge1xuICAgIGlmICh0aGlzLl9yZWFkaW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkaW5nO1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAvKiogQHR5cGUge01hbmlmZXN0RGF0YX0gKi9cbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IGlzTmV3RmlsZSA9IGZhbHNlO1xuICAgICAgYXdhaXQgdGhpcy5fc2V0TWFuaWZlc3RQYXRoKCk7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYFJlYWRpbmcgJHt0aGlzLl9tYW5pZmVzdFBhdGh9Li4uYCk7XG4gICAgICAgIGNvbnN0IHlhbWwgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLl9tYW5pZmVzdFBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGRhdGEgPSBZQU1MLnBhcnNlKHlhbWwpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICBkYXRhID0gXy5jbG9uZURlZXAoSU5JVElBTF9NQU5JRkVTVF9EQVRBKTtcbiAgICAgICAgICBpc05ld0ZpbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLl9tYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFwcGl1bSBoYWQgdHJvdWJsZSBsb2FkaW5nIHRoZSBleHRlbnNpb24gaW5zdGFsbGF0aW9uIGAgK1xuICAgICAgICAgICAgICAgIGBjYWNoZSBmaWxlICgke3RoaXMuX21hbmlmZXN0UGF0aH0pLiBJdCBtYXkgYmUgaW52YWxpZCBZQU1MLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkIGFuIHVua25vd24gcHJvYmxlbS4gU3BlY2lmaWMgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgbGV0IGluc3RhbGxlZEV4dGVuc2lvbnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIGF3YWl0IGVudi5oYXNBcHBpdW1EZXBlbmRlbmN5KHRoaXMuYXBwaXVtSG9tZSkgJiZcbiAgICAgICAgKGF3YWl0IHBhY2thZ2VEaWRDaGFuZ2UodGhpcy5hcHBpdW1Ib21lKSlcbiAgICAgICkge1xuICAgICAgICBpbnN0YWxsZWRFeHRlbnNpb25zQ2hhbmdlZCA9IGF3YWl0IHRoaXMuc3luY1dpdGhJbnN0YWxsZWRFeHRlbnNpb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05ld0ZpbGUgfHwgaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZSgpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWRpbmc7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVhZGluZyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB7QGxpbmsgTWFuaWZlc3QuX21hbmlmZXN0UGF0aH0gaXMgc2V0LlxuICAgKlxuICAgKiBDcmVhdGVzIHRoZSBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgX3NldE1hbmlmZXN0UGF0aCAoKSB7XG4gICAgaWYgKCF0aGlzLl9tYW5pZmVzdFBhdGgpIHtcbiAgICAgIHRoaXMuX21hbmlmZXN0UGF0aCA9IGF3YWl0IGVudi5yZXNvbHZlTWFuaWZlc3RQYXRoKHRoaXMuX2FwcGl1bUhvbWUpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChwYXRoLnJlbGF0aXZlKHRoaXMuX2FwcGl1bUhvbWUsIHRoaXMuX21hbmlmZXN0UGF0aCkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlzbWF0Y2ggYmV0d2VlbiBsb2NhdGlvbiBvZiBBUFBJVU1fSE9NRSBhbmQgbWFuaWZlc3QgZmlsZS4gQVBQSVVNX0hPTUU6ICR7dGhpcy5hcHBpdW1Ib21lfSwgbWFuaWZlc3QgZmlsZTogJHt0aGlzLl9tYW5pZmVzdFBhdGh9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWFuaWZlc3RQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgZGF0YSBpZiBpdCBuZWVkIHMgd3JpdGluZy5cbiAgICpcbiAgICogSWYgdGhlIGBzY2hlbWFSZXZgIHByb3AgbmVlZHMgdXBkYXRpbmcsIHRoZSBmaWxlIHdpbGwgYmUgd3JpdHRlbi5cbiAgICpcbiAgICogQHRvZG8gSWYgdGhpcyBiZWNvbWVzIHRvbyBtdWNoIG9mIGEgYm90dGxlbmVjaywgdGhyb3R0bGUgaXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBkYXRhIHdhcyB3cml0dGVuXG4gICAqL1xuICBhc3luYyB3cml0ZSAoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0aW5nO1xuICAgIH1cbiAgICB0aGlzLl93cml0aW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3NldE1hbmlmZXN0UGF0aCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKHBhdGguZGlybmFtZSh0aGlzLl9tYW5pZmVzdFBhdGgpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBjb3VsZCBub3QgY3JlYXRlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBtYW5pZmVzdCBmaWxlOiAke3BhdGguZGlybmFtZShcbiAgICAgICAgICAgIHRoaXMuX21hbmlmZXN0UGF0aCxcbiAgICAgICAgICApfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICB0aGlzLl9tYW5pZmVzdFBhdGgsXG4gICAgICAgICAgWUFNTC5zdHJpbmdpZnkodGhpcy5fZGF0YSksXG4gICAgICAgICAgJ3V0ZjgnLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBjb3VsZCBub3Qgd3JpdGUgdG8gbWFuaWZlc3QgYXQgJHt0aGlzLl9tYW5pZmVzdFBhdGh9IHVzaW5nIEFQUElVTV9IT01FICR7dGhpcy5fYXBwaXVtSG9tZX0uIGAgK1xuICAgICAgICAgICAgYFBsZWFzZSBlbnN1cmUgaXQgaXMgd3JpdGFibGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dyaXRpbmc7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3dyaXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBvZiB0aGUgc3RyaW5nIHJlZmVycmluZyB0byBhIGRyaXZlciAodHlwaWNhbGx5IGFzIGEga2V5IG9yIHR5cGUgc3RyaW5nKVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBzdHJpbmcgcmVmZXJyaW5nIHRvIGEgcGx1Z2luICh0eXBpY2FsbHkgYXMgYSBrZXkgb3IgdHlwZSBzdHJpbmcpXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9uc09wdHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVwdGhMaW1pdF0gLSBNYXhpbXVtIGRlcHRoIHRvIHJlY3Vyc2UgaW50byBzdWJkaXJlY3Rvcmllc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuTWFuaWZlc3REYXRhfSBNYW5pZmVzdERhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkludGVybmFsTWV0YWRhdGF9IEludGVybmFsTWV0YWRhdGFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkV4dFBhY2thZ2VKc29uPFQ+fSBFeHRQYWNrYWdlSnNvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkV4dE1hbmlmZXN0PFQ+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkV4dFJlY29yZDxUPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBFaXRoZXIgYGRyaXZlcmAgb3IgYHBsdWdpbmAgcm5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG5cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFDQTs7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
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYWNrYWdlRGlkQ2hhbmdlIiwiYXBwaXVtSG9tZSIsImhhc2hGaWxlbmFtZSIsInBhdGgiLCJqb2luIiwiUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgiLCJpc0NoYW5nZWQiLCJ3cml0ZUhhc2giLCJoYXNoIiwib2xkSGFzaCIsImhhc2hGaWxlbmFtZURpciIsImRpcm5hbWUiLCJsb2ciLCJkZWJ1ZyIsImZzIiwibWtkaXJwIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiY3dkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBpc1BhY2thZ2VDaGFuZ2VkIH0gZnJvbSAncGFja2FnZS1jaGFuZ2VkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgZXh0ZW5zaW9ucyBoYXZlIGNoYW5nZWQsIGFuZCB1cGRhdGVzIGEgaGFzaCB0aGUgYHBhY2thZ2UuanNvbmAgaW4gYGFwcGl1bUhvbWVgIGlmIHNvLlxuICpcbiAqIElmIHRoZXkgaGF2ZSwgd2UgbmVlZCB0byBzeW5jIHRoZW0gd2l0aCB0aGUgYGV4dGVuc2lvbnMueWFtbGAgbWFuaWZlc3QuXG4gKlxuICogX1dhcm5pbmc6IHRoaXMgbWFrZXMgYSBibG9ja2luZyBjYWxsIHRvIGB3cml0ZUZpbGVTeW5jYC5fXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IGB0cnVlYCBpZiBgcGFja2FnZS5qc29uYCBgYXBwaXVtSG9tZWAgY2hhbmdlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZURpZENoYW5nZSAoYXBwaXVtSG9tZSkge1xuICBjb25zdCBoYXNoRmlsZW5hbWUgPSBwYXRoLmpvaW4oYXBwaXVtSG9tZSwgUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgpO1xuXG4gIC8vIFhYWDogdGhlIHR5cGVzIGluIGBwYWNrYWdlLWNoYW5nZWRgIHNlZW0gdG8gYmUgd3JvbmcuXG5cbiAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICBsZXQgaXNDaGFuZ2VkO1xuICAvKiogQHR5cGUgeygpID0+IHZvaWR9ICovXG4gIGxldCB3cml0ZUhhc2g7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICBsZXQgaGFzaDtcbiAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICBsZXQgb2xkSGFzaDtcblxuICAvLyBmaXJzdCBta2RpcnAgdGhlIHRhcmdldCBkaXIuXG4gIGNvbnN0IGhhc2hGaWxlbmFtZURpciA9IHBhdGguZGlybmFtZShoYXNoRmlsZW5hbWUpO1xuICBsb2cuZGVidWcoYENyZWF0aW5nIGhhc2ggZmlsZSBkaXJlY3Rvcnk6ICR7aGFzaEZpbGVuYW1lRGlyfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlycChoYXNoRmlsZW5hbWVEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXBwaXVtIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSBmb3IgaGFzaCBmaWxlOiAke2hhc2hGaWxlbmFtZURpcn0uIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKHtpc0NoYW5nZWQsIHdyaXRlSGFzaCwgb2xkSGFzaCwgaGFzaH0gPSBhd2FpdCBpc1BhY2thZ2VDaGFuZ2VkKHtcbiAgICAgIGN3ZDogYXBwaXVtSG9tZSxcbiAgICAgIGhhc2hGaWxlbmFtZTogUEtHX0hBU0hGSUxFX1JFTEFUSVZFX1BBVEgsXG4gICAgfSkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0cnkge1xuICAgICAgd3JpdGVIYXNoKCk7XG4gICAgICBsb2cuZGVidWcoYFVwZGF0ZWQgaGFzaCBvZiAke2FwcGl1bUhvbWV9L3BhY2thZ2UuanNvbiBmcm9tOiAke29sZEhhc2ggPz8gJyhub25lKSd9IHRvOiAke2hhc2h9YCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcHBpdW0gY291bGQgbm90IHdyaXRlIGhhc2ggZmlsZTogJHtoYXNoRmlsZW5hbWVEaXJ9LiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDaGFuZ2VkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVdPLGVBQWVBLGdCQUFmLENBQWlDQyxVQUFqQyxFQUE2QztFQUNsRCxNQUFNQyxZQUFZLEdBQUdDLGNBQUtDLElBQUwsQ0FBVUgsVUFBVixFQUFzQkkscUNBQXRCLENBQXJCOztFQUtBLElBQUlDLFNBQUo7RUFFQSxJQUFJQyxTQUFKO0VBRUEsSUFBSUMsSUFBSjtFQUVBLElBQUlDLE9BQUo7O0VBR0EsTUFBTUMsZUFBZSxHQUFHUCxjQUFLUSxPQUFMLENBQWFULFlBQWIsQ0FBeEI7O0VBQ0FVLGdCQUFJQyxLQUFKLENBQVcsaUNBQWdDSCxlQUFnQixFQUEzRDs7RUFDQSxJQUFJO0lBQ0YsTUFBTUksWUFBR0MsTUFBSCxDQUFVTCxlQUFWLENBQU47RUFDRCxDQUZELENBRUUsT0FBT00sR0FBUCxFQUFZO0lBQ1osTUFBTSxJQUFJQyxLQUFKLENBQ0gsd0RBQXVEUCxlQUFnQixxQkFBb0JNLEdBQUcsQ0FBQ0UsT0FBUSxFQURwRyxDQUFOO0VBR0Q7O0VBRUQsSUFBSTtJQUNGLENBQUM7TUFBQ1osU0FBRDtNQUFZQyxTQUFaO01BQXVCRSxPQUF2QjtNQUFnQ0Q7SUFBaEMsSUFBd0MsTUFBTSxzQ0FBaUI7TUFDOURXLEdBQUcsRUFBRWxCLFVBRHlEO01BRTlEQyxZQUFZLEVBQUVHO0lBRmdELENBQWpCLENBQS9DO0VBSUQsQ0FMRCxDQUtFLE1BQU07SUFDTixPQUFPLElBQVA7RUFDRDs7RUFFRCxJQUFJQyxTQUFKLEVBQWU7SUFDYixJQUFJO01BQUE7O01BQ0ZDLFNBQVM7O01BQ1RLLGdCQUFJQyxLQUFKLENBQVcsbUJBQWtCWixVQUFXLHVCQUE5QixZQUFvRFEsT0FBcEQsK0NBQStELFFBQVMsUUFBT0QsSUFBSyxFQUE5RjtJQUNELENBSEQsQ0FHRSxPQUFPUSxHQUFQLEVBQVk7TUFDWixNQUFNLElBQUlDLEtBQUosQ0FDSCxxQ0FBb0NQLGVBQWdCLHFCQUFvQk0sR0FBRyxDQUFDRSxPQUFRLEVBRGpGLENBQU47SUFHRDtFQUNGOztFQUVELE9BQU9aLFNBQVA7QUFDRCJ9
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQbHVnaW5Db25maWciLCJFeHRlbnNpb25Db25maWciLCJfaW5zdGFuY2VzIiwiV2Vha01hcCIsImNvbnN0cnVjdG9yIiwibWFuaWZlc3QiLCJleHREYXRhIiwibG9nRm4iLCJQTFVHSU5fVFlQRSIsInZhbGlkYXRlIiwiY3JlYXRlIiwiaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsIkVycm9yIiwiYXBwaXVtSG9tZSIsInNldCIsImdldCIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vcGx1Z2luLWNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge0V4dGVuc2lvbkNvbmZpZ30gZnJvbSAnLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7UExVR0lOX1RZUEV9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQGV4dGVuZHMge0V4dGVuc2lvbkNvbmZpZzxQbHVnaW5UeXBlPn1cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkNvbmZpZyBleHRlbmRzIEV4dGVuc2lvbkNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB7QGxpbmsgTWFuaWZlc3R9IGluc3RhbmNlcyB0byB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIGBNYW5pZmVzdGAgYW5kIHtAbGluayBFeHRlbnNpb25Db25maWd9IGhhdmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXA7IGVhY2ggYE1hbmlmZXN0YCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgYERyaXZlckNvbmZpZ2AgYW5kIGEgYFBsdWdpbkNvbmZpZ2A7IG5vIG1vcmUsIG5vIGxlc3MuXG4gICAqXG4gICAqIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBgTWFuaWZlc3RgLXRvLWBQbHVnaW5Db25maWdgIHBvcnRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtXZWFrTWFwPE1hbmlmZXN0LFBsdWdpbkNvbmZpZz59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICAgc3RhdGljIF9pbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAvKipcbiAgICogQ2FsbCB7QGxpbmsgUGx1Z2luQ29uZmlnLmNyZWF0ZX0gaW5zdGVhZC5cbiAgICpcbiAgICogSnVzdCBjYWxscyB0aGUgc3VwZXJjbGFzcycgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVjdCBleHRlbnNpb24gdHlwZVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdCAtIElPIG9iamVjdFxuICAgKiBAcGFyYW0ge1BsdWdpbkNvbmZpZ09wdGlvbnN9IFtvcHRzXVxuICAgKi9cbiAgIGNvbnN0cnVjdG9yIChtYW5pZmVzdCwge2V4dERhdGEsIGxvZ0ZufSA9IHt9KSB7XG4gICAgIHN1cGVyKFBMVUdJTl9UWVBFLCBtYW5pZmVzdCwgbG9nRm4pO1xuXG4gICAgIGlmIChleHREYXRhKSB7XG4gICAgICAgdGhpcy52YWxpZGF0ZShleHREYXRhKTtcbiAgICAgfVxuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBsdWdpbkNvbmZpZ30gaW5zdGFuY2UgZm9yIGEge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZS5cbiAgICAqXG4gICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdFxuICAgICogQHBhcmFtIHtQbHVnaW5Db25maWdPcHRpb25zfSBbb3B0c11cbiAgICAqIEB0aHJvd3MgSWYgYG1hbmlmZXN0YCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGBQbHVnaW5Db25maWdgXG4gICAgKiBAcmV0dXJucyB7UGx1Z2luQ29uZmlnfVxuICAgICovXG4gICBzdGF0aWMgY3JlYXRlIChtYW5pZmVzdCwge2V4dERhdGEsIGxvZ0ZufSA9IHt9KSB7XG4gICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFBsdWdpbkNvbmZpZyhtYW5pZmVzdCwge2xvZ0ZuLCBleHREYXRhfSk7XG4gICAgIGlmIChQbHVnaW5Db25maWcuZ2V0SW5zdGFuY2UobWFuaWZlc3QpKSB7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYW5pZmVzdCB3aXRoIEFQUElVTV9IT01FICR7bWFuaWZlc3QuYXBwaXVtSG9tZX0gYWxyZWFkeSBoYXMgYSBQbHVnaW5Db25maWc7IHVzZSBQbHVnaW5Db25maWcuZ2V0SW5zdGFuY2UoKSB0byByZXRyaWV2ZSBpdC5gKTtcbiAgICAgfVxuICAgICBQbHVnaW5Db25maWcuX2luc3RhbmNlcy5zZXQobWFuaWZlc3QsIGluc3RhbmNlKTtcbiAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgfVxuXG4gICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUGx1Z2luQ29uZmlnIGFzc29jaWF0ZWQgd2l0aCBhIE1hbmlmZXN0XG4gICAgICogQHBhcmFtIHtNYW5pZmVzdH0gbWFuaWZlc3RcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQ29uZmlnfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgIHN0YXRpYyBnZXRJbnN0YW5jZSAobWFuaWZlc3QpIHtcbiAgICAgcmV0dXJuIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzLmdldChtYW5pZmVzdCk7XG4gICB9XG5cbiAgIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGx1Z2luTmFtZVxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8UGx1Z2luVHlwZT59IHBsdWdpbkRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gICBleHRlbnNpb25EZXNjIChwbHVnaW5OYW1lLCB7dmVyc2lvbn0pIHtcbiAgICAgcmV0dXJuIGAke3BsdWdpbk5hbWV9QCR7dmVyc2lvbn1gO1xuICAgfVxuXG4gICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoa2V5b2YgUGx1Z2luUmVjb3JkKVtdfSBhY3RpdmVOYW1lc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gICBwcmludCAoYWN0aXZlTmFtZXMpIHtcbiAgICAgY29uc3QgcGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuXG4gICAgIGlmIChfLmlzRW1wdHkocGx1Z2luTmFtZXMpKSB7XG4gICAgICAgbG9nLmluZm8oYE5vIHBsdWdpbnMgaGF2ZSBiZWVuIGluc3RhbGxlZC4gVXNlIHRoZSBcImFwcGl1bSBwbHVnaW5cIiBgICtcbiAgICAgICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJyk7XG4gICAgICAgcmV0dXJuO1xuICAgICB9XG5cbiAgICAgbG9nLmluZm8oYEF2YWlsYWJsZSBwbHVnaW5zOmApO1xuICAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgIGNvbnN0IGFjdGl2ZVR4dCA9IF8uaW5jbHVkZXMoYWN0aXZlTmFtZXMsIHBsdWdpbk5hbWUpID8gJyAoQUNUSVZFKScgOiAnJztcbiAgICAgICBsb2cuaW5mbyhgICAtICR7dGhpcy5leHRlbnNpb25EZXNjKHBsdWdpbk5hbWUsIHBsdWdpbkRhdGEpfSR7YWN0aXZlVHh0fWApO1xuICAgICB9XG5cbiAgICAgaWYgKF8uaXNFbXB0eShhY3RpdmVOYW1lcykpIHtcbiAgICAgICBsb2cuaW5mbygnTm8gcGx1Z2lucyBhY3RpdmF0ZWQuIFVzZSB0aGUgLS11c2UtcGx1Z2lucyBmbGFnIHdpdGggbmFtZXMgb2YgcGx1Z2lucyB0byBhY3RpdmF0ZScpO1xuICAgICB9XG4gICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUGx1Z2luQ29uZmlnT3B0aW9uc1xuICogQHByb3BlcnR5IHtpbXBvcnQoJy4vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkxvZ0ZufSBbbG9nRm5dIC0gT3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvblxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLlBsdWdpblJlY29yZH0gW2V4dERhdGFdIC0gRXh0ZW5zaW9uIGRhdGFcbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuUGx1Z2luUmVjb3JkfSBQbHVnaW5SZWNvcmRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZXJuYWwtbWFuaWZlc3QnKS5FeHRNZXRhZGF0YTxQbHVnaW5UeXBlPn0gUGx1Z2luTWV0YWRhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdH0gTWFuaWZlc3RcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtPLE1BQU1BLFlBQU4sU0FBMkJDLGdDQUEzQixDQUEyQztFQVk5QixPQUFWQyxVQUFVLEdBQUcsSUFBSUMsT0FBSixFQUFIOztFQVVqQkMsV0FBVyxDQUFFQyxRQUFGLEVBQVk7SUFBQ0MsT0FBRDtJQUFVQztFQUFWLElBQW1CLEVBQS9CLEVBQW1DO0lBQzVDLE1BQU1DLHNCQUFOLEVBQW1CSCxRQUFuQixFQUE2QkUsS0FBN0I7O0lBRUEsSUFBSUQsT0FBSixFQUFhO01BQ1gsS0FBS0csUUFBTCxDQUFjSCxPQUFkO0lBQ0Q7RUFDRjs7RUFVWSxPQUFOSSxNQUFNLENBQUVMLFFBQUYsRUFBWTtJQUFDQyxPQUFEO0lBQVVDO0VBQVYsSUFBbUIsRUFBL0IsRUFBbUM7SUFDOUMsTUFBTUksUUFBUSxHQUFHLElBQUlYLFlBQUosQ0FBaUJLLFFBQWpCLEVBQTJCO01BQUNFLEtBQUQ7TUFBUUQ7SUFBUixDQUEzQixDQUFqQjs7SUFDQSxJQUFJTixZQUFZLENBQUNZLFdBQWIsQ0FBeUJQLFFBQXpCLENBQUosRUFBd0M7TUFDdEMsTUFBTSxJQUFJUSxLQUFKLENBQVcsNkJBQTRCUixRQUFRLENBQUNTLFVBQVcsNkVBQTNELENBQU47SUFDRDs7SUFDRGQsWUFBWSxDQUFDRSxVQUFiLENBQXdCYSxHQUF4QixDQUE0QlYsUUFBNUIsRUFBc0NNLFFBQXRDOztJQUNBLE9BQU9BLFFBQVA7RUFDRDs7RUFPaUIsT0FBWEMsV0FBVyxDQUFFUCxRQUFGLEVBQVk7SUFDNUIsT0FBT0wsWUFBWSxDQUFDRSxVQUFiLENBQXdCYyxHQUF4QixDQUE0QlgsUUFBNUIsQ0FBUDtFQUNEOztFQU9EWSxhQUFhLENBQUVDLFVBQUYsRUFBYztJQUFDQztFQUFELENBQWQsRUFBeUI7SUFDcEMsT0FBUSxHQUFFRCxVQUFXLElBQUdDLE9BQVEsRUFBaEM7RUFDRDs7RUFPREMsS0FBSyxDQUFFQyxXQUFGLEVBQWU7SUFDbEIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFLQyxtQkFBakIsQ0FBcEI7O0lBRUEsSUFBSUMsZ0JBQUVDLE9BQUYsQ0FBVUwsV0FBVixDQUFKLEVBQTRCO01BQzFCTSxnQkFBSUMsSUFBSixDQUFVLDBEQUFELEdBQ0QsZ0RBRFI7O01BRUE7SUFDRDs7SUFFREQsZ0JBQUlDLElBQUosQ0FBVSxvQkFBVjs7SUFDQSxLQUFLLE1BQU0sQ0FBQ1gsVUFBRCxFQUFhWSxVQUFiLENBQVgsSUFBdUNKLGdCQUFFSyxPQUFGLENBQVUsS0FBS04sbUJBQWYsQ0FBdkMsRUFBNEU7TUFDMUUsTUFBTU8sU0FBUyxHQUFHTixnQkFBRU8sUUFBRixDQUFXWixXQUFYLEVBQXdCSCxVQUF4QixJQUFzQyxXQUF0QyxHQUFvRCxFQUF0RTs7TUFDQVUsZ0JBQUlDLElBQUosQ0FBVSxPQUFNLEtBQUtaLGFBQUwsQ0FBbUJDLFVBQW5CLEVBQStCWSxVQUEvQixDQUEyQyxHQUFFRSxTQUFVLEVBQXZFO0lBQ0Q7O0lBRUQsSUFBSU4sZ0JBQUVDLE9BQUYsQ0FBVU4sV0FBVixDQUFKLEVBQTRCO01BQzFCTyxnQkFBSUMsSUFBSixDQUFTLG9GQUFUO0lBQ0Q7RUFDRjs7QUF4RjhDIn0=
@@ -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"}