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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +257 -131
  5. package/build/lib/cli/args.d.ts +20 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +36 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +25 -18
  11. package/build/lib/cli/extension-command.d.ts +372 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +286 -156
  14. package/build/lib/cli/extension.d.ts +18 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +30 -17
  17. package/build/lib/cli/parser.d.ts +80 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +152 -95
  20. package/build/lib/cli/plugin-command.d.ts +33 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +24 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +41 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +92 -67
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +74 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +68 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +189 -90
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +180 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +452 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +112 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +517 -186
  99. package/lib/cli/args.js +269 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +612 -260
  102. package/lib/cli/extension.js +34 -16
  103. package/lib/cli/parser.js +241 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +210 -91
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +679 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +303 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +75 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +177 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/types/appium-manifest.ts +73 -0
  133. package/types/cli.ts +146 -0
  134. package/types/extension-manifest.ts +64 -0
  135. package/types/index.ts +21 -0
  136. package/CHANGELOG.md +0 -3515
  137. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  138. package/build/lib/cli/npm.js +0 -206
  139. package/build/lib/cli/parser-helpers.js +0 -82
  140. package/build/lib/driver-config.js +0 -77
  141. package/build/lib/drivers.js +0 -96
  142. package/build/lib/extension-config.js +0 -253
  143. package/build/lib/plugin-config.js +0 -59
  144. package/build/lib/plugins.js +0 -14
  145. package/lib/cli/npm.js +0 -183
  146. package/lib/cli/parser-helpers.js +0 -79
  147. package/lib/driver-config.js +0 -46
  148. package/lib/drivers.js +0 -81
  149. package/lib/extension-config.js +0 -209
  150. package/lib/plugin-config.js +0 -34
  151. package/lib/plugins.js +0 -10
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getActiveDrivers = getActiveDrivers;
9
+ exports.getActivePlugins = getActivePlugins;
10
+ exports.loadExtensions = loadExtensions;
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ var _constants = require("../constants");
17
+
18
+ var _logger = _interopRequireDefault(require("../logger"));
19
+
20
+ var _driverConfig = require("./driver-config");
21
+
22
+ var _manifest = require("./manifest");
23
+
24
+ var _pluginConfig = require("./plugin-config");
25
+
26
+ var _bluebird = _interopRequireDefault(require("bluebird"));
27
+
28
+ async function loadExtensions(appiumHome) {
29
+ var _DriverConfig$getInst, _PluginConfig$getInst;
30
+
31
+ const manifest = _manifest.Manifest.getInstance(appiumHome);
32
+
33
+ await manifest.read();
34
+ const driverConfig = (_DriverConfig$getInst = _driverConfig.DriverConfig.getInstance(manifest)) !== null && _DriverConfig$getInst !== void 0 ? _DriverConfig$getInst : _driverConfig.DriverConfig.create(manifest);
35
+ const pluginConfig = (_PluginConfig$getInst = _pluginConfig.PluginConfig.getInstance(manifest)) !== null && _PluginConfig$getInst !== void 0 ? _PluginConfig$getInst : _pluginConfig.PluginConfig.create(manifest);
36
+ await _bluebird.default.all([driverConfig.validate(), pluginConfig.validate()]);
37
+ return {
38
+ driverConfig,
39
+ pluginConfig
40
+ };
41
+ }
42
+
43
+ function getActivePlugins(pluginConfig, usePlugins = []) {
44
+ return new Map(_lodash.default.compact(Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(usePlugins, pluginName) || usePlugins.length === 1 && usePlugins[0] === _constants.USE_ALL_PLUGINS).map(pluginName => {
45
+ try {
46
+ _logger.default.info(`Attempting to load plugin ${pluginName}...`);
47
+
48
+ const PluginClass = pluginConfig.require(pluginName);
49
+
50
+ return [PluginClass, pluginName];
51
+ } catch (err) {
52
+ _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err.message}`);
53
+
54
+ _logger.default.debug(err.stack);
55
+ }
56
+ })));
57
+ }
58
+
59
+ function getActiveDrivers(driverConfig, useDrivers = []) {
60
+ return new Map(_lodash.default.compact(Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(useDrivers, driverName) || useDrivers.length === 0).map(driverName => {
61
+ try {
62
+ _logger.default.info(`Attempting to load driver ${driverName}...`);
63
+
64
+ const DriverClass = driverConfig.require(driverName);
65
+
66
+ return [DriverClass, driverName];
67
+ } catch (err) {
68
+ _logger.default.error(`Could not load driver '${driverName}', so it will not be available. Error ` + `in loading the driver was: ${err.message}`);
69
+
70
+ _logger.default.debug(err.stack);
71
+ }
72
+ })));
73
+ }
74
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2FkRXh0ZW5zaW9ucyIsImFwcGl1bUhvbWUiLCJtYW5pZmVzdCIsIk1hbmlmZXN0IiwiZ2V0SW5zdGFuY2UiLCJyZWFkIiwiZHJpdmVyQ29uZmlnIiwiRHJpdmVyQ29uZmlnIiwiY3JlYXRlIiwicGx1Z2luQ29uZmlnIiwiUGx1Z2luQ29uZmlnIiwiQiIsImFsbCIsInZhbGlkYXRlIiwiZ2V0QWN0aXZlUGx1Z2lucyIsInVzZVBsdWdpbnMiLCJNYXAiLCJfIiwiY29tcGFjdCIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiZmlsdGVyIiwicGx1Z2luTmFtZSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiVVNFX0FMTF9QTFVHSU5TIiwibWFwIiwibG9nIiwiaW5mbyIsIlBsdWdpbkNsYXNzIiwicmVxdWlyZSIsImVyciIsImVycm9yIiwibWVzc2FnZSIsImRlYnVnIiwic3RhY2siLCJnZXRBY3RpdmVEcml2ZXJzIiwidXNlRHJpdmVycyIsImRyaXZlck5hbWUiLCJEcml2ZXJDbGFzcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7VVNFX0FMTF9QTFVHSU5TfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtEcml2ZXJDb25maWd9IGZyb20gJy4vZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQge01hbmlmZXN0fSBmcm9tICcuL21hbmlmZXN0JztcbmltcG9ydCB7UGx1Z2luQ29uZmlnfSBmcm9tICcuL3BsdWdpbi1jb25maWcnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG4vKipcbiAqIExvYWRzIGV4dGVuc2lvbnMgYW5kIGNyZWF0ZXMgYEV4dGVuc2lvbkNvbmZpZ2AgaW5zdGFuY2VzLlxuICpcbiAqIC0gUmVhZHMgdGhlIG1hbmlmZXN0IGZpbGUsIGNyZWF0aW5nIGlmIG5lY2Vzc2FyeVxuICogLSBVc2luZyB0aGUgcGFyc2VkIGV4dGVuc2lvbiBkYXRhLCBjcmVhdGVzL2dldHMgdGhlIGBFeHRlbnNpb25Db25maWdgIHN1YmNsYXNzIGluc3RhbmNlc1xuICogLSBSZXR1cm5zIHRoZXNlIGluc3RhbmNlc1xuICpcbiAqIElmIGBhcHBpdW1Ib21lYCBpcyBuZWVkZWQsIHVzZSBgcmVzb2x2ZUFwcGl1bUhvbWVgIGZyb20gdGhlIGBlbnZgIG1vZHVsZSBpbiBgQGFwcGl1bS9zdXBwb3J0YC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeHRlbnNpb25Db25maWdzPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRFeHRlbnNpb25zKGFwcGl1bUhvbWUpIHtcbiAgY29uc3QgbWFuaWZlc3QgPSBNYW5pZmVzdC5nZXRJbnN0YW5jZShhcHBpdW1Ib21lKTtcbiAgYXdhaXQgbWFuaWZlc3QucmVhZCgpO1xuICBjb25zdCBkcml2ZXJDb25maWcgPSBEcml2ZXJDb25maWcuZ2V0SW5zdGFuY2UobWFuaWZlc3QpID8/IERyaXZlckNvbmZpZy5jcmVhdGUobWFuaWZlc3QpO1xuICBjb25zdCBwbHVnaW5Db25maWcgPSBQbHVnaW5Db25maWcuZ2V0SW5zdGFuY2UobWFuaWZlc3QpID8/IFBsdWdpbkNvbmZpZy5jcmVhdGUobWFuaWZlc3QpO1xuXG4gIGF3YWl0IEIuYWxsKFtkcml2ZXJDb25maWcudmFsaWRhdGUoKSwgcGx1Z2luQ29uZmlnLnZhbGlkYXRlKCldKTtcbiAgcmV0dXJuIHtkcml2ZXJDb25maWcsIHBsdWdpbkNvbmZpZ307XG59XG5cbi8qKlxuICogRmluZCBhbnkgcGx1Z2luIG5hbWUgd2hpY2ggaGFzIGJlZW4gaW5zdGFsbGVkLCBhbmQgd2hpY2ggaGFzIGJlZW4gcmVxdWVzdGVkIGZvciBhY3RpdmF0aW9uIGJ5XG4gKiB1c2luZyB0aGUgLS11c2UtcGx1Z2lucyBmbGFnLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGl0cyBjbGFzcywgc28gd2UgY2FuIHNlbmQgdGhlbSBhcyBvYmplY3RzXG4gKiB0byB0aGUgc2VydmVyIGluaXQuIFdlIGFsc28gd2FudCB0byBzZW5kL2Fzc2lnbiB0aGVtIHRvIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtXG4gKiB0byB3cmFwIGNvbW1hbmQgZXhlY3V0aW9uXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vcGx1Z2luLWNvbmZpZycpLlBsdWdpbkNvbmZpZ30gcGx1Z2luQ29uZmlnIC0gYSBwbHVnaW4gZXh0ZW5zaW9uIGNvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gdXNlUGx1Z2luc1xuICogQHJldHVybnMge1BsdWdpbk5hbWVNYXB9IE1hcHBpbmcgb2YgUGx1Z2luQ2xhc3MgdG8gbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlUGx1Z2lucyhwbHVnaW5Db25maWcsIHVzZVBsdWdpbnMgPSBbXSkge1xuICByZXR1cm4gbmV3IE1hcChcbiAgICBfLmNvbXBhY3QoXG4gICAgICBPYmplY3Qua2V5cyhwbHVnaW5Db25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAocGx1Z2luTmFtZSkgPT5cbiAgICAgICAgICAgIF8uaW5jbHVkZXModXNlUGx1Z2lucywgcGx1Z2luTmFtZSkgfHxcbiAgICAgICAgICAgICh1c2VQbHVnaW5zLmxlbmd0aCA9PT0gMSAmJiB1c2VQbHVnaW5zWzBdID09PSBVU0VfQUxMX1BMVUdJTlMpXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgocGx1Z2luTmFtZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIHBsdWdpbiAke3BsdWdpbk5hbWV9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCBQbHVnaW5DbGFzcyA9IHBsdWdpbkNvbmZpZy5yZXF1aXJlKHBsdWdpbk5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtQbHVnaW5DbGFzcywgcGx1Z2luTmFtZV07XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgbG9hZCBwbHVnaW4gJyR7cGx1Z2luTmFtZX0nLCBzbyBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEVycm9yIGAgK1xuICAgICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEZpbmQgYW55IGRyaXZlciBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHR1cm4gZWFjaCBvbmUgaW50byBpdHMgY2xhc3MsIHNvIHdlIGNhbiBzZW5kXG4gKiB0aGVtIGFzIG9iamVjdHMgdG8gdGhlIHNlcnZlciBpbml0IGluIGNhc2UgdGhleSBuZWVkIHRvIGFkZCBtZXRob2RzL3JvdXRlcyBvciB1cGRhdGUgdGhlIHNlcnZlci5cbiAqIElmIHRoZSAtLWRyaXZlcnMgZmxhZyB3YXMgZ2l2ZW4sIHRoaXMgbWV0aG9kIG9ubHkgbG9hZHMgdGhlIGdpdmVuIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vZHJpdmVyLWNvbmZpZycpLkRyaXZlckNvbmZpZ30gZHJpdmVyQ29uZmlnIC0gYSBkcml2ZXIgZXh0ZW5zaW9uIGNvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIC0gb3B0aW9uYWwgbGlzdCBvZiBkcml2ZXJzIHRvIGxvYWRcbiAqIEByZXR1cm5zIHtEcml2ZXJOYW1lTWFwfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRHJpdmVycyhkcml2ZXJDb25maWcsIHVzZURyaXZlcnMgPSBbXSkge1xuICByZXR1cm4gbmV3IE1hcChcbiAgICBfLmNvbXBhY3QoXG4gICAgICBPYmplY3Qua2V5cyhkcml2ZXJDb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgICAgLmZpbHRlcigoZHJpdmVyTmFtZSkgPT4gXy5pbmNsdWRlcyh1c2VEcml2ZXJzLCBkcml2ZXJOYW1lKSB8fCB1c2VEcml2ZXJzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgLm1hcCgoZHJpdmVyTmFtZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIGRyaXZlciAke2RyaXZlck5hbWV9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCBEcml2ZXJDbGFzcyA9IGRyaXZlckNvbmZpZy5yZXF1aXJlKGRyaXZlck5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtEcml2ZXJDbGFzcywgZHJpdmVyTmFtZV07XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgbG9hZCBkcml2ZXIgJyR7ZHJpdmVyTmFtZX0nLCBzbyBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEVycm9yIGAgK1xuICAgICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBkcml2ZXIgd2FzOiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEEgbWFwcGluZyBvZiB7QGxpbmtjb2RlIFBsdWdpbkNsYXNzfSBjbGFzc2VzIHRvIHRoZWlyIG5hbWVzLlxuICogQHR5cGVkZWYge01hcDxQbHVnaW5DbGFzcyxzdHJpbmc+fSBQbHVnaW5OYW1lTWFwXG4gKi9cblxuLyoqXG4gKiBBIG1hcHBpbmcgb2Yge0BsaW5rY29kZSBEcml2ZXJDbGFzc30gY2xhc3NlcyB0byB0aGVpciBuYW1lcy5cbiAqIEB0eXBlZGVmIHtNYXA8RHJpdmVyQ2xhc3Msc3RyaW5nPn0gRHJpdmVyTmFtZU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzfSBEcml2ZXJDbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnc1xuICogQHByb3BlcnR5IHtpbXBvcnQoJy4vZHJpdmVyLWNvbmZpZycpLkRyaXZlckNvbmZpZ30gZHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi9wbHVnaW4tY29uZmlnJykuUGx1Z2luQ29uZmlnfSBwbHVnaW5Db25maWdcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBYU8sZUFBZUEsY0FBZixDQUE4QkMsVUFBOUIsRUFBMEM7RUFBQTs7RUFDL0MsTUFBTUMsUUFBUSxHQUFHQyxrQkFBQSxDQUFTQyxXQUFULENBQXFCSCxVQUFyQixDQUFqQjs7RUFDQSxNQUFNQyxRQUFRLENBQUNHLElBQVQsRUFBTjtFQUNBLE1BQU1DLFlBQVksNEJBQUdDLDBCQUFBLENBQWFILFdBQWIsQ0FBeUJGLFFBQXpCLENBQUgseUVBQXlDSywwQkFBQSxDQUFhQyxNQUFiLENBQW9CTixRQUFwQixDQUEzRDtFQUNBLE1BQU1PLFlBQVksNEJBQUdDLDBCQUFBLENBQWFOLFdBQWIsQ0FBeUJGLFFBQXpCLENBQUgseUVBQXlDUSwwQkFBQSxDQUFhRixNQUFiLENBQW9CTixRQUFwQixDQUEzRDtFQUVBLE1BQU1TLGlCQUFBLENBQUVDLEdBQUYsQ0FBTSxDQUFDTixZQUFZLENBQUNPLFFBQWIsRUFBRCxFQUEwQkosWUFBWSxDQUFDSSxRQUFiLEVBQTFCLENBQU4sQ0FBTjtFQUNBLE9BQU87SUFBQ1AsWUFBRDtJQUFlRztFQUFmLENBQVA7QUFDRDs7QUFZTSxTQUFTSyxnQkFBVCxDQUEwQkwsWUFBMUIsRUFBd0NNLFVBQVUsR0FBRyxFQUFyRCxFQUF5RDtFQUM5RCxPQUFPLElBQUlDLEdBQUosQ0FDTEMsZUFBQSxDQUFFQyxPQUFGLENBQ0VDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZWCxZQUFZLENBQUNZLG1CQUF6QixFQUNHQyxNQURILENBRUtDLFVBQUQsSUFDRU4sZUFBQSxDQUFFTyxRQUFGLENBQVdULFVBQVgsRUFBdUJRLFVBQXZCLEtBQ0NSLFVBQVUsQ0FBQ1UsTUFBWCxLQUFzQixDQUF0QixJQUEyQlYsVUFBVSxDQUFDLENBQUQsQ0FBVixLQUFrQlcsMEJBSnBELEVBTUdDLEdBTkgsQ0FNUUosVUFBRCxJQUFnQjtJQUNuQixJQUFJO01BQ0ZLLGVBQUEsQ0FBSUMsSUFBSixDQUFVLDZCQUE0Qk4sVUFBVyxLQUFqRDs7TUFDQSxNQUFNTyxXQUFXLEdBQUdyQixZQUFZLENBQUNzQixPQUFiLENBQXFCUixVQUFyQixDQUFwQjs7TUFDQSxPQUFPLENBQUNPLFdBQUQsRUFBY1AsVUFBZCxDQUFQO0lBQ0QsQ0FKRCxDQUlFLE9BQU9TLEdBQVAsRUFBWTtNQUNaSixlQUFBLENBQUlLLEtBQUosQ0FDRywwQkFBeUJWLFVBQVcsd0NBQXJDLEdBQ0csOEJBQTZCUyxHQUFHLENBQUNFLE9BQVEsRUFGOUM7O01BSUFOLGVBQUEsQ0FBSU8sS0FBSixDQUFVSCxHQUFHLENBQUNJLEtBQWQ7SUFDRDtFQUNGLENBbEJILENBREYsQ0FESyxDQUFQO0FBdUJEOztBQVdNLFNBQVNDLGdCQUFULENBQTBCL0IsWUFBMUIsRUFBd0NnQyxVQUFVLEdBQUcsRUFBckQsRUFBeUQ7RUFDOUQsT0FBTyxJQUFJdEIsR0FBSixDQUNMQyxlQUFBLENBQUVDLE9BQUYsQ0FDRUMsTUFBTSxDQUFDQyxJQUFQLENBQVlkLFlBQVksQ0FBQ2UsbUJBQXpCLEVBQ0dDLE1BREgsQ0FDV2lCLFVBQUQsSUFBZ0J0QixlQUFBLENBQUVPLFFBQUYsQ0FBV2MsVUFBWCxFQUF1QkMsVUFBdkIsS0FBc0NELFVBQVUsQ0FBQ2IsTUFBWCxLQUFzQixDQUR0RixFQUVHRSxHQUZILENBRVFZLFVBQUQsSUFBZ0I7SUFDbkIsSUFBSTtNQUNGWCxlQUFBLENBQUlDLElBQUosQ0FBVSw2QkFBNEJVLFVBQVcsS0FBakQ7O01BQ0EsTUFBTUMsV0FBVyxHQUFHbEMsWUFBWSxDQUFDeUIsT0FBYixDQUFxQlEsVUFBckIsQ0FBcEI7O01BQ0EsT0FBTyxDQUFDQyxXQUFELEVBQWNELFVBQWQsQ0FBUDtJQUNELENBSkQsQ0FJRSxPQUFPUCxHQUFQLEVBQVk7TUFDWkosZUFBQSxDQUFJSyxLQUFKLENBQ0csMEJBQXlCTSxVQUFXLHdDQUFyQyxHQUNHLDhCQUE2QlAsR0FBRyxDQUFDRSxPQUFRLEVBRjlDOztNQUlBTixlQUFBLENBQUlPLEtBQUosQ0FBVUgsR0FBRyxDQUFDSSxLQUFkO0lBQ0Q7RUFDRixDQWRILENBREYsQ0FESyxDQUFQO0FBbUJEIn0=
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Handles reading & writing of extension config files.
3
+ *
4
+ * Only one instance of this class exists per value of `APPIUM_HOME`.
5
+ */
6
+ export class Manifest {
7
+ /**
8
+ * Returns a new or existing {@link Manifest} instance, based on the value of `appiumHome`.
9
+ *
10
+ * Maintains one instance per value of `appiumHome`.
11
+ * @param {string} appiumHome - Path to `APPIUM_HOME`
12
+ * @returns {Manifest}
13
+ */
14
+ static getInstance: ((appiumHome: any) => Manifest) & _.MemoizedFunction;
15
+ /**
16
+ * Sets internal data to a fresh clone of {@link INITIAL_MANIFEST_DATA}
17
+ *
18
+ * Use {@link Manifest.getInstance} instead.
19
+ * @param {string} appiumHome
20
+ * @private
21
+ */
22
+ private constructor();
23
+ /**
24
+ * The entire contents of a parsed YAML extension config file.
25
+ *
26
+ * Contains proxies for automatic persistence on disk
27
+ * @type {ManifestData}
28
+ * @private
29
+ */
30
+ private _data;
31
+ /**
32
+ * Path to `APPIUM_HOME`.
33
+ * @private
34
+ * @type {Readonly<string>}
35
+ */
36
+ private _appiumHome;
37
+ /**
38
+ * Path to `extensions.yaml`
39
+ * @type {string}
40
+ * Not set until {@link Manifest.read} is called.
41
+ */
42
+ _manifestPath: string;
43
+ /**
44
+ * Helps avoid writing multiple times.
45
+ *
46
+ * If this is `undefined`, calling {@link Manifest.write} will cause it to be
47
+ * set to a `Promise`. When the call to `write()` is complete, the `Promise`
48
+ * will resolve and then this value will be set to `undefined`. Concurrent calls
49
+ * made while this value is a `Promise` will return the `Promise` itself.
50
+ * @private
51
+ * @type {Promise<boolean>|undefined}
52
+ */
53
+ private _writing;
54
+ /**
55
+ * Helps avoid reading multiple times.
56
+ *
57
+ * If this is `undefined`, calling {@link Manifest.read} will cause it to be
58
+ * set to a `Promise`. When the call to `read()` is complete, the `Promise`
59
+ * will resolve and then this value will be set to `undefined`. Concurrent calls
60
+ * made while this value is a `Promise` will return the `Promise` itself.
61
+ * @private
62
+ * @type {Promise<void>|undefined}
63
+ */
64
+ private _reading;
65
+ /**
66
+ * Searches `APPIUM_HOME` for installed extensions and adds them to the manifest.
67
+ * @param {SyncWithInstalledExtensionsOpts} opts
68
+ * @returns {Promise<boolean>} `true` if any extensions were added, `false` otherwise.
69
+ */
70
+ syncWithInstalledExtensions({ depthLimit }?: SyncWithInstalledExtensionsOpts): Promise<boolean>;
71
+ /**
72
+ * Returns `true` if driver with name `name` is registered.
73
+ * @param {string} name - Driver name
74
+ * @returns {boolean}
75
+ */
76
+ hasDriver(name: string): boolean;
77
+ /**
78
+ * Returns `true` if plugin with name `name` is registered.
79
+ * @param {string} name - Plugin name
80
+ * @returns {boolean}
81
+ */
82
+ hasPlugin(name: string): boolean;
83
+ /**
84
+ * Given a path to a `package.json`, add it as either a driver or plugin to the manifest.
85
+ *
86
+ * Will _not_ overwrite existing entries.
87
+ * @template {ExtensionType} ExtType
88
+ * @param {ExtPackageJson<ExtType>} pkgJson
89
+ * @param {string} pkgPath
90
+ * @returns {boolean} - `true` upon success, `false` if the extension is already registered.
91
+ */
92
+ addExtensionFromPackage<ExtType extends import("@appium/types").ExtensionType>(pkgJson: ExtPackageJson<ExtType>, pkgPath: string): boolean;
93
+ /**
94
+ * Adds an extension to the manifest as was installed by the `appium` CLI. The
95
+ * `extData`, `extType`, and `extName` have already been determined.
96
+ *
97
+ * See {@link Manifest.addExtensionFromPackage} for adding an extension from an on-disk package.
98
+ * @template {ExtensionType} ExtType
99
+ * @param {ExtType} extType - `driver` or `plugin`
100
+ * @param {string} extName - Name of extension
101
+ * @param {ExtManifest<ExtType>} extData - Extension metadata
102
+ * @returns {ExtManifest<ExtType>} A clone of `extData`, potentially with a mutated `appiumVersion` field
103
+ */
104
+ addExtension<ExtType_1 extends import("@appium/types").ExtensionType>(extType: ExtType_1, extName: string, extData: ExtManifest<ExtType_1>): ExtManifest<ExtType_1>;
105
+ /**
106
+ * Returns the APPIUM_HOME path
107
+ */
108
+ get appiumHome(): string;
109
+ /**
110
+ * Returns the path to the manifest file
111
+ */
112
+ get manifestPath(): string;
113
+ /**
114
+ * Returns extension data for a particular type.
115
+ *
116
+ * @template {ExtensionType} ExtType
117
+ * @param {ExtType} extType
118
+ * @returns {ExtRecord<ExtType>}
119
+ */
120
+ getExtensionData<ExtType_2 extends import("@appium/types").ExtensionType>(extType: ExtType_2): ExtRecord<ExtType_2>;
121
+ /**
122
+ * Reads manifest from disk and _overwrites_ the internal data.
123
+ *
124
+ * If the manifest does not exist on disk, an {@link INITIAL_MANIFEST_DATA "empty"} manifest file will be created.
125
+ *
126
+ * If `APPIUM_HOME` contains a `package.json` with an `appium` dependency, then a hash of the `package.json` will be taken. If this hash differs from the last hash, the contents of `APPIUM_HOME/node_modules` will be scanned for extensions that may have been installed outside of the `appium` CLI. Any found extensions will be added to the manifest file, and if so, the manifest file will be written to disk.
127
+ *
128
+ * Only one read operation should happen at a time. This is controlled via the {@link Manifest._reading} property.
129
+ * @returns {Promise<ManifestData>} The data
130
+ */
131
+ read(): Promise<ManifestData>;
132
+ /**
133
+ * Ensures {@link Manifest._manifestPath} is set.
134
+ *
135
+ * Creates the directory if necessary.
136
+ * @private
137
+ * @returns {Promise<string>}
138
+ */
139
+ private _setManifestPath;
140
+ /**
141
+ * Writes the data if it need s writing.
142
+ *
143
+ * If the `schemaRev` prop needs updating, the file will be written.
144
+ *
145
+ * @todo If this becomes too much of a bottleneck, throttle it.
146
+ * @returns {Promise<boolean>} Whether the data was written
147
+ */
148
+ write(): Promise<boolean>;
149
+ }
150
+ /**
151
+ * Type of the string referring to a driver (typically as a key or type string)
152
+ */
153
+ export type DriverType = import('@appium/types').DriverType;
154
+ /**
155
+ * Type of the string referring to a plugin (typically as a key or type string)
156
+ */
157
+ export type PluginType = import('@appium/types').PluginType;
158
+ export type SyncWithInstalledExtensionsOpts = {
159
+ /**
160
+ * - Maximum depth to recurse into subdirectories
161
+ */
162
+ depthLimit?: number | undefined;
163
+ };
164
+ export type ManifestData = import('appium/types').ManifestData;
165
+ export type InternalMetadata = import('appium/types').InternalMetadata;
166
+ export type ExtPackageJson<T> = import('appium/types').ExtPackageJson<T>;
167
+ export type ExtManifest<T> = import('appium/types').ExtManifest<T>;
168
+ export type ExtRecord<T> = import('appium/types').ExtRecord<T>;
169
+ /**
170
+ * Either `driver` or `plugin` rn
171
+ */
172
+ export type ExtensionType = import('@appium/types').ExtensionType;
173
+ import _ from "lodash";
174
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../lib/extension/manifest.js"],"names":[],"mappings":"AAmGA;;;;GAIG;AACH;IA4DE;;;;;;OAMG;IACH,yEAEG;IArBH;;;;;;OAMG;IACH,sBAGC;IAzDD;;;;;;OAMG;IACH,cAAM;IAEN;;;;OAIG;IACH,oBAAY;IAEZ;;;;OAIG;IACH,eAHU,MAAM,CAGF;IAEd;;;;;;;;;OASG;IACH,iBAAS;IAET;;;;;;;;;OASG;IACH,iBAAS;IAyBT;;;;OAIG;IACH,6CAHW,+BAA+B,GAC7B,QAAQ,OAAO,CAAC,CAoB5B;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;OAQG;IACH,0HAHW,MAAM,GACJ,OAAO,CAuCnB;IAED;;;;;;;;;;OAUG;IACH,mGAJW,MAAM,2DAQhB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;;;OAMG;IACH,oHAEC;IAED;;;;;;;;;OASG;IACH,QAFa,QAAQ,YAAY,CAAC,CAuDjC;IAED;;;;;;OAMG;IACH,yBAaC;IAED;;;;;;;OAOG;IACH,SAFa,QAAQ,OAAO,CAAC,CAgC5B;CACF;;;;yBAIY,OAAO,eAAe,EAAE,UAAU;;;;yBAKlC,OAAO,eAAe,EAAE,UAAU;;;;;;;2BASlC,OAAO,cAAc,EAAE,YAAY;+BACnC,OAAO,cAAc,EAAE,gBAAgB;gCAKvC,OAAO,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;6BAKxC,OAAO,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;2BAKrC,OAAO,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;;;;4BAKnC,OAAO,eAAe,EAAE,aAAa"}
@@ -0,0 +1,256 @@
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
+ var _pkgJson$peerDependen;
108
+
109
+ const extensionPath = _path.default.dirname(pkgPath);
110
+
111
+ const internal = {
112
+ pkgName: pkgJson.name,
113
+ version: pkgJson.version,
114
+ appiumVersion: (_pkgJson$peerDependen = pkgJson.peerDependencies) === null || _pkgJson$peerDependen === void 0 ? void 0 : _pkgJson$peerDependen.appium,
115
+ installType: _extensionConfig.INSTALL_TYPE_NPM,
116
+ installSpec: `${pkgJson.name}@${pkgJson.version}`
117
+ };
118
+
119
+ if (isDriver(pkgJson)) {
120
+ if (!this.hasDriver(pkgJson.appium.driverName)) {
121
+ this.addExtension(_constants.DRIVER_TYPE, pkgJson.appium.driverName, { ..._lodash.default.omit(pkgJson.appium, 'driverName'),
122
+ ...internal
123
+ });
124
+ return true;
125
+ }
126
+
127
+ return false;
128
+ } else if (isPlugin(pkgJson)) {
129
+ if (!this.hasPlugin(pkgJson.appium.pluginName)) {
130
+ this.addExtension(_constants.PLUGIN_TYPE, pkgJson.appium.pluginName, { ..._lodash.default.omit(pkgJson.appium, 'pluginName'),
131
+ ...internal
132
+ });
133
+ return true;
134
+ }
135
+
136
+ return false;
137
+ } else {
138
+ throw new TypeError(`The extension in ${extensionPath} is neither a valid driver nor a valid plugin.`);
139
+ }
140
+ }
141
+
142
+ addExtension(extType, extName, extData) {
143
+ const data = _lodash.default.clone(extData);
144
+
145
+ this._data[`${extType}s`][extName] = data;
146
+ return data;
147
+ }
148
+
149
+ get appiumHome() {
150
+ return this._appiumHome;
151
+ }
152
+
153
+ get manifestPath() {
154
+ return this._manifestPath;
155
+ }
156
+
157
+ getExtensionData(extType) {
158
+ return this._data[`${extType}s`];
159
+ }
160
+
161
+ async read() {
162
+ if (this._reading) {
163
+ await this._reading;
164
+ return this._data;
165
+ }
166
+
167
+ this._reading = (async () => {
168
+ let data;
169
+ let isNewFile = false;
170
+ await this._setManifestPath();
171
+
172
+ try {
173
+ _logger.default.debug(`Reading ${this._manifestPath}...`);
174
+
175
+ const yaml = await _support.fs.readFile(this._manifestPath, 'utf8');
176
+ data = _yaml.default.parse(yaml);
177
+
178
+ _logger.default.debug(`Parsed manifest file: ${JSON.stringify(data, null, 2)}`);
179
+ } catch (err) {
180
+ if (err.code === 'ENOENT') {
181
+ data = _lodash.default.cloneDeep(INITIAL_MANIFEST_DATA);
182
+ isNewFile = true;
183
+ } else {
184
+ if (this._manifestPath) {
185
+ throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this._manifestPath}). It may be invalid YAML. Specific error: ${err.message}`);
186
+ } else {
187
+ throw new Error(`Appium encountered an unknown problem. Specific error: ${err.message}`);
188
+ }
189
+ }
190
+ }
191
+
192
+ this._data = data;
193
+ let installedExtensionsChanged = false;
194
+
195
+ if ((await _support.env.hasAppiumDependency(this.appiumHome)) && (await (0, _packageChanged.packageDidChange)(this.appiumHome))) {
196
+ installedExtensionsChanged = await this.syncWithInstalledExtensions();
197
+ }
198
+
199
+ if (isNewFile || installedExtensionsChanged) {
200
+ await this.write();
201
+ }
202
+ })();
203
+
204
+ try {
205
+ await this._reading;
206
+ return this._data;
207
+ } finally {
208
+ this._reading = undefined;
209
+ }
210
+ }
211
+
212
+ async _setManifestPath() {
213
+ if (!this._manifestPath) {
214
+ this._manifestPath = await _support.env.resolveManifestPath(this._appiumHome);
215
+
216
+ if (_path.default.relative(this._appiumHome, this._manifestPath).startsWith('.')) {
217
+ throw new Error(`Mismatch between location of APPIUM_HOME and manifest file. APPIUM_HOME: ${this.appiumHome}, manifest file: ${this._manifestPath}`);
218
+ }
219
+ }
220
+
221
+ return this._manifestPath;
222
+ }
223
+
224
+ async write() {
225
+ if (this._writing) {
226
+ return this._writing;
227
+ }
228
+
229
+ this._writing = (async () => {
230
+ await this._setManifestPath();
231
+
232
+ try {
233
+ await _support.fs.mkdirp(_path.default.dirname(this._manifestPath));
234
+ } catch (err) {
235
+ throw new Error(`Appium could not create the directory for the manifest file: ${_path.default.dirname(this._manifestPath)}. Original error: ${err.message}`);
236
+ }
237
+
238
+ try {
239
+ await _support.fs.writeFile(this._manifestPath, _yaml.default.stringify(this._data), 'utf8');
240
+ return true;
241
+ } catch (err) {
242
+ 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}`);
243
+ }
244
+ })();
245
+
246
+ try {
247
+ return await this._writing;
248
+ } finally {
249
+ this._writing = undefined;
250
+ }
251
+ }
252
+
253
+ }
254
+
255
+ exports.Manifest = Manifest;
256
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NFQVJDSF9ERVBUSCIsIkRFRkFVTFRfRklORF9FWFRFTlNJT05TX09QVFMiLCJPYmplY3QiLCJmcmVlemUiLCJkZXB0aExpbWl0IiwiZmlsdGVyIiwiZmlsZXBhdGgiLCJwYXRoIiwiYmFzZW5hbWUiLCJzdGFydHNXaXRoIiwiQ09ORklHX1NDSEVNQV9SRVYiLCJDT05GSUdfREFUQV9EUklWRVJfS0VZIiwiRFJJVkVSX1RZUEUiLCJDT05GSUdfREFUQV9QTFVHSU5fS0VZIiwiUExVR0lOX1RZUEUiLCJJTklUSUFMX01BTklGRVNUX0RBVEEiLCJzY2hlbWFSZXYiLCJpc0V4dGVuc2lvbiIsInZhbHVlIiwiXyIsImlzUGxhaW5PYmplY3QiLCJhcHBpdW0iLCJpc1N0cmluZyIsIm5hbWUiLCJ2ZXJzaW9uIiwiaXNEcml2ZXIiLCJnZXQiLCJpc0FycmF5IiwiaXNQbHVnaW4iLCJNYW5pZmVzdCIsIl9kYXRhIiwiX2FwcGl1bUhvbWUiLCJfbWFuaWZlc3RQYXRoIiwiX3dyaXRpbmciLCJfcmVhZGluZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImNsb25lRGVlcCIsImdldEluc3RhbmNlIiwibWVtb2l6ZSIsIl9nZXRJbnN0YW5jZSIsInN5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9ucyIsIndhbGtPcHRzIiwiZGVmYXVsdHMiLCJkaWRDaGFuZ2UiLCJzdGF0cyIsImZzIiwid2FsayIsImlzRGlyZWN0b3J5IiwicGtnIiwiZW52IiwicmVhZFBhY2thZ2VJbkRpciIsImFkZGVkIiwiYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2UiLCJqb2luIiwiaGFzRHJpdmVyIiwiQm9vbGVhbiIsImRyaXZlcnMiLCJoYXNQbHVnaW4iLCJwbHVnaW5zIiwicGtnSnNvbiIsInBrZ1BhdGgiLCJleHRlbnNpb25QYXRoIiwiZGlybmFtZSIsImludGVybmFsIiwicGtnTmFtZSIsImFwcGl1bVZlcnNpb24iLCJwZWVyRGVwZW5kZW5jaWVzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwiaW5zdGFsbFNwZWMiLCJkcml2ZXJOYW1lIiwiYWRkRXh0ZW5zaW9uIiwib21pdCIsInBsdWdpbk5hbWUiLCJUeXBlRXJyb3IiLCJleHRUeXBlIiwiZXh0TmFtZSIsImV4dERhdGEiLCJkYXRhIiwiY2xvbmUiLCJtYW5pZmVzdFBhdGgiLCJnZXRFeHRlbnNpb25EYXRhIiwicmVhZCIsImlzTmV3RmlsZSIsIl9zZXRNYW5pZmVzdFBhdGgiLCJsb2ciLCJkZWJ1ZyIsInlhbWwiLCJyZWFkRmlsZSIsIllBTUwiLCJwYXJzZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlcnIiLCJjb2RlIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQiLCJoYXNBcHBpdW1EZXBlbmRlbmN5IiwicGFja2FnZURpZENoYW5nZSIsIndyaXRlIiwidW5kZWZpbmVkIiwicmVzb2x2ZU1hbmlmZXN0UGF0aCIsInJlbGF0aXZlIiwibWtkaXJwIiwid3JpdGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2V4dGVuc2lvbi9tYW5pZmVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBjb250YWluaW5nIHtAbGluayBNYW5pZmVzdH0gd2hpY2ggaGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICovXG5cbmltcG9ydCB7ZW52LCBmc30gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEV9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQge0lOU1RBTExfVFlQRV9OUE19IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4vcGFja2FnZS1jaGFuZ2VkJztcblxuLyoqXG4gKiBEZWZhdWx0IGRlcHRoIHRvIHNlYXJjaCBpbiBkaXJlY3RvcnkgdHJlZSBmb3Igd2hhdGV2ZXIgaXQgaXMgd2UncmUgbG9va2luZyBmb3IuXG4gKlxuICogSXQncyA0IGJlY2F1c2Ugc21hbGxlciBudW1iZXJzIGRpZG4ndCB3b3JrLlxuICovXG5jb25zdCBERUZBVUxUX1NFQVJDSF9ERVBUSCA9IDQ7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB7QGxpbmsgZmluZEV4dGVuc2lvbnN9LlxuICogQHR5cGUge1JlYWRvbmx5PGltcG9ydCgna2xhdycpLk9wdGlvbnM+fVxuICovXG5jb25zdCBERUZBVUxUX0ZJTkRfRVhURU5TSU9OU19PUFRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGRlcHRoTGltaXQ6IERFRkFVTFRfU0VBUkNIX0RFUFRILFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmaWx0ZXI6IChmaWxlcGF0aCkgPT4gIXBhdGguYmFzZW5hbWUoZmlsZXBhdGgpLnN0YXJ0c1dpdGgoJy4nKSxcbn0pO1xuXG4vKipcbiAqIEN1cnJlbnQgY29uZmlndXJhdGlvbiBzY2hlbWEgcmV2aXNpb24hXG4gKi9cbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgcHJvcCAoYGRyaXZlcnNgKSB1c2VkIGluIGBleHRlbnNpb25zLnlhbWxgIGZvciBkcml2ZXJzLlxuICogQHR5cGUge2Ake3R5cGVvZiBEUklWRVJfVFlQRX1zYH1cbiAqL1xuY29uc3QgQ09ORklHX0RBVEFfRFJJVkVSX0tFWSA9IGAke0RSSVZFUl9UWVBFfXNgO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wIChgcGx1Z2luc2ApIHVzZWQgaW4gYGV4dGVuc2lvbnMueWFtbGAgZm9yIHBsdWdpbnMuXG4gKiBAdHlwZSB7YCR7dHlwZW9mIFBMVUdJTl9UWVBFfXNgfVxuICovXG5jb25zdCBDT05GSUdfREFUQV9QTFVHSU5fS0VZID0gYCR7UExVR0lOX1RZUEV9c2A7XG5cbi8qKlxuICogQHR5cGUge1JlYWRvbmx5PE1hbmlmZXN0RGF0YT59XG4gKi9cbmNvbnN0IElOSVRJQUxfTUFOSUZFU1RfREFUQSA9IE9iamVjdC5mcmVlemUoe1xuICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IE9iamVjdC5mcmVlemUoe30pLFxuICBbQ09ORklHX0RBVEFfUExVR0lOX0tFWV06IE9iamVjdC5mcmVlemUoe30pLFxuICBzY2hlbWFSZXY6IENPTkZJR19TQ0hFTUFfUkVWLFxufSk7XG5cbi8qKlxuICogR2l2ZW4gYSBgcGFja2FnZS5qc29uYCByZXR1cm4gYHRydWVgIGlmIGl0IHJlcHJlc2VudHMgYW4gQXBwaXVtIEV4dGVuc2lvbiAoZWl0aGVyIGEgZHJpdmVyIG9yIHBsdWdpbikuXG4gKlxuICogVGhlIGBwYWNrYWdlLmpzb25gIG11c3QgaGF2ZSBhbiBgYXBwaXVtYCBwcm9wZXJ0eSB3aGljaCBpcyBhbiBvYmplY3QuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBFeHRQYWNrYWdlSnNvbjxFeHRlbnNpb25UeXBlPn1cbiAqL1xuZnVuY3Rpb24gaXNFeHRlbnNpb24odmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICBfLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgXy5pc1BsYWluT2JqZWN0KHZhbHVlLmFwcGl1bSkgJiZcbiAgICBfLmlzU3RyaW5nKHZhbHVlLm5hbWUpICYmXG4gICAgXy5pc1N0cmluZyh2YWx1ZS52ZXJzaW9uKVxuICApO1xufVxuLyoqXG4gKiBHaXZlbiBhIGBwYWNrYWdlLmpzb25gLCByZXR1cm4gYHRydWVgIGlmIGl0IHJlcHJlc2VudHMgYW4gQXBwaXVtIERyaXZlci5cbiAqXG4gKiBUbyBiZSBjb25zaWRlcmVkIGEgZHJpdmVyLCBhIGBwYWNrYWdlLmpzb25gIG11c3QgaGF2ZSBhIGZpZWxkc1xuICogYGFwcGl1bS5kcml2ZXJOYW1lYCwgYGFwcGl1bS5hdXRvbWF0aW9uTmFtZWAgYW5kIGBhcHBpdW0ucGxhdGZvcm1OYW1lc2AuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgRXh0UGFja2FnZUpzb248RHJpdmVyVHlwZT59XG4gKi9cbmZ1bmN0aW9uIGlzRHJpdmVyKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaXNFeHRlbnNpb24odmFsdWUpICYmXG4gICAgXy5pc1N0cmluZyhfLmdldCh2YWx1ZSwgJ2FwcGl1bS5kcml2ZXJOYW1lJykpICYmXG4gICAgXy5pc1N0cmluZyhfLmdldCh2YWx1ZSwgJ2FwcGl1bS5hdXRvbWF0aW9uTmFtZScpKSAmJlxuICAgIF8uaXNBcnJheShfLmdldCh2YWx1ZSwgJ2FwcGl1bS5wbGF0Zm9ybU5hbWVzJykpXG4gICk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBgcGFja2FnZS5qc29uYCwgcmV0dXJuIGB0cnVlYCBpZiBpdCByZXByZXNlbnRzIGFuIEFwcGl1bSBQbHVnaW4uXG4gKlxuICogVG8gYmUgY29uc2lkZXJlZCBhIHBsdWdpbiwgYSBgcGFja2FnZS5qc29uYCBtdXN0IGhhdmUgYW4gYGFwcGl1bS5wbHVnaW5OYW1lYCBmaWVsZC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBFeHRQYWNrYWdlSnNvbjxQbHVnaW5UeXBlPn1cbiAqL1xuZnVuY3Rpb24gaXNQbHVnaW4odmFsdWUpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaW9uKHZhbHVlKSAmJiBfLmlzU3RyaW5nKF8uZ2V0KHZhbHVlLCAnYXBwaXVtLnBsdWdpbk5hbWUnKSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICpcbiAqIE9ubHkgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICovXG5leHBvcnQgY2xhc3MgTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIGVudGlyZSBjb250ZW50cyBvZiBhIHBhcnNlZCBZQU1MIGV4dGVuc2lvbiBjb25maWcgZmlsZS5cbiAgICpcbiAgICogQ29udGFpbnMgcHJveGllcyBmb3IgYXV0b21hdGljIHBlcnNpc3RlbmNlIG9uIGRpc2tcbiAgICogQHR5cGUge01hbmlmZXN0RGF0YX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kYXRhO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBBUFBJVU1fSE9NRWAuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgX2FwcGl1bUhvbWU7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gYGV4dGVuc2lvbnMueWFtbGBcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogTm90IHNldCB1bnRpbCB7QGxpbmsgTWFuaWZlc3QucmVhZH0gaXMgY2FsbGVkLlxuICAgKi9cbiAgX21hbmlmZXN0UGF0aDtcblxuICAvKipcbiAgICogSGVscHMgYXZvaWQgd3JpdGluZyBtdWx0aXBsZSB0aW1lcy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdW5kZWZpbmVkYCwgY2FsbGluZyB7QGxpbmsgTWFuaWZlc3Qud3JpdGV9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGB3cml0ZSgpYCBpcyBjb21wbGV0ZSwgdGhlIGBQcm9taXNlYFxuICAgKiB3aWxsIHJlc29sdmUgYW5kIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYC4gIENvbmN1cnJlbnQgY2FsbHNcbiAgICogbWFkZSB3aGlsZSB0aGlzIHZhbHVlIGlzIGEgYFByb21pc2VgIHdpbGwgcmV0dXJuIHRoZSBgUHJvbWlzZWAgaXRzZWxmLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UHJvbWlzZTxib29sZWFuPnx1bmRlZmluZWR9XG4gICAqL1xuICBfd3JpdGluZztcblxuICAvKipcbiAgICogSGVscHMgYXZvaWQgcmVhZGluZyBtdWx0aXBsZSB0aW1lcy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdW5kZWZpbmVkYCwgY2FsbGluZyB7QGxpbmsgTWFuaWZlc3QucmVhZH0gd2lsbCBjYXVzZSBpdCB0byBiZVxuICAgKiBzZXQgdG8gYSBgUHJvbWlzZWAuIFdoZW4gdGhlIGNhbGwgdG8gYHJlYWQoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8dm9pZD58dW5kZWZpbmVkfVxuICAgKi9cbiAgX3JlYWRpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgaW50ZXJuYWwgZGF0YSB0byBhIGZyZXNoIGNsb25lIG9mIHtAbGluayBJTklUSUFMX01BTklGRVNUX0RBVEF9XG4gICAqXG4gICAqIFVzZSB7QGxpbmsgTWFuaWZlc3QuZ2V0SW5zdGFuY2V9IGluc3RlYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcHBpdW1Ib21lKSB7XG4gICAgdGhpcy5fYXBwaXVtSG9tZSA9IGFwcGl1bUhvbWU7XG4gICAgdGhpcy5fZGF0YSA9IF8uY2xvbmVEZWVwKElOSVRJQUxfTUFOSUZFU1RfREFUQSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBvciBleGlzdGluZyB7QGxpbmsgTWFuaWZlc3R9IGluc3RhbmNlLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYGFwcGl1bUhvbWVgLlxuICAgKlxuICAgKiBNYWludGFpbnMgb25lIGluc3RhbmNlIHBlciB2YWx1ZSBvZiBgYXBwaXVtSG9tZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gUGF0aCB0byBgQVBQSVVNX0hPTUVgXG4gICAqIEByZXR1cm5zIHtNYW5pZmVzdH1cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSA9IF8ubWVtb2l6ZShmdW5jdGlvbiBfZ2V0SW5zdGFuY2UoYXBwaXVtSG9tZSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3QoYXBwaXVtSG9tZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBgQVBQSVVNX0hPTUVgIGZvciBpbnN0YWxsZWQgZXh0ZW5zaW9ucyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBtYW5pZmVzdC5cbiAgICogQHBhcmFtIHtTeW5jV2l0aEluc3RhbGxlZEV4dGVuc2lvbnNPcHRzfSBvcHRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBgdHJ1ZWAgaWYgYW55IGV4dGVuc2lvbnMgd2VyZSBhZGRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBzeW5jV2l0aEluc3RhbGxlZEV4dGVuc2lvbnMoe2RlcHRoTGltaXQgPSBERUZBVUxUX1NFQVJDSF9ERVBUSH0gPSB7fSkge1xuICAgIGNvbnN0IHdhbGtPcHRzID0gXy5kZWZhdWx0cyh7ZGVwdGhMaW1pdH0sIERFRkFVTFRfRklORF9FWFRFTlNJT05TX09QVFMpO1xuICAgIC8vIHRoaXMgY291bGQgYmUgcGFyYWxsZWxpemVkLCBidXQgd2UgY2FuJ3QgdXNlIGZzLndhbGsgYXMgYW4gYXN5bmMgaXRlcmF0b3JcbiAgICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gICAgZm9yIGF3YWl0IChjb25zdCB7c3RhdHMsIHBhdGg6IGZpbGVwYXRofSBvZiBmcy53YWxrKHRoaXMuX2FwcGl1bUhvbWUsIHdhbGtPcHRzKSkge1xuICAgICAgaWYgKGZpbGVwYXRoICE9PSB0aGlzLl9hcHBpdW1Ib21lICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwa2cgPSBhd2FpdCBlbnYucmVhZFBhY2thZ2VJbkRpcihmaWxlcGF0aCk7XG4gICAgICAgICAgaWYgKHBrZyAmJiBpc0V4dGVuc2lvbihwa2cpKSB7XG4gICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBleHRlbnNpb24gYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hbmlmZXN0LFxuICAgICAgICAgICAgLy8gc28gb25seSB1cGRhdGUgYGRpZENoYW5nZWAgaWYgaXQncyBuZXcuXG4gICAgICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2UocGtnLCBwYXRoLmpvaW4oZmlsZXBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSBkaWRDaGFuZ2UgfHwgYWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWRDaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgZHJpdmVyIHdpdGggbmFtZSBgbmFtZWAgaXMgcmVnaXN0ZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBEcml2ZXIgbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0RyaXZlcihuYW1lKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZGF0YS5kcml2ZXJzW25hbWVdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBwbHVnaW4gd2l0aCBuYW1lIGBuYW1lYCBpcyByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFBsdWdpbiBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzUGx1Z2luKG5hbWUpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9kYXRhLnBsdWdpbnNbbmFtZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgcGF0aCB0byBhIGBwYWNrYWdlLmpzb25gLCBhZGQgaXQgYXMgZWl0aGVyIGEgZHJpdmVyIG9yIHBsdWdpbiB0byB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIFdpbGwgX25vdF8gb3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMuXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dFBhY2thZ2VKc29uPEV4dFR5cGU+fSBwa2dKc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dQYXRoXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCB1cG9uIHN1Y2Nlc3MsIGBmYWxzZWAgaWYgdGhlIGV4dGVuc2lvbiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAqL1xuICBhZGRFeHRlbnNpb25Gcm9tUGFja2FnZShwa2dKc29uLCBwa2dQYXRoKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uUGF0aCA9IHBhdGguZGlybmFtZShwa2dQYXRoKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtJbnRlcm5hbE1ldGFkYXRhfVxuICAgICAqL1xuICAgIGNvbnN0IGludGVybmFsID0ge1xuICAgICAgcGtnTmFtZTogcGtnSnNvbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGtnSnNvbi52ZXJzaW9uLFxuICAgICAgYXBwaXVtVmVyc2lvbjogcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5hcHBpdW0sXG4gICAgICBpbnN0YWxsVHlwZTogSU5TVEFMTF9UWVBFX05QTSxcbiAgICAgIGluc3RhbGxTcGVjOiBgJHtwa2dKc29uLm5hbWV9QCR7cGtnSnNvbi52ZXJzaW9ufWAsXG4gICAgfTtcblxuICAgIGlmIChpc0RyaXZlcihwa2dKc29uKSkge1xuICAgICAgaWYgKCF0aGlzLmhhc0RyaXZlcihwa2dKc29uLmFwcGl1bS5kcml2ZXJOYW1lKSkge1xuICAgICAgICB0aGlzLmFkZEV4dGVuc2lvbihEUklWRVJfVFlQRSwgcGtnSnNvbi5hcHBpdW0uZHJpdmVyTmFtZSwge1xuICAgICAgICAgIC4uLl8ub21pdChwa2dKc29uLmFwcGl1bSwgJ2RyaXZlck5hbWUnKSxcbiAgICAgICAgICAuLi5pbnRlcm5hbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaXNQbHVnaW4ocGtnSnNvbikpIHtcbiAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4ocGtnSnNvbi5hcHBpdW0ucGx1Z2luTmFtZSkpIHtcbiAgICAgICAgdGhpcy5hZGRFeHRlbnNpb24oUExVR0lOX1RZUEUsIHBrZ0pzb24uYXBwaXVtLnBsdWdpbk5hbWUsIHtcbiAgICAgICAgICAuLi5fLm9taXQocGtnSnNvbi5hcHBpdW0sICdwbHVnaW5OYW1lJyksXG4gICAgICAgICAgLi4uaW50ZXJuYWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRoZSBleHRlbnNpb24gaW4gJHtleHRlbnNpb25QYXRofSBpcyBuZWl0aGVyIGEgdmFsaWQgZHJpdmVyIG5vciBhIHZhbGlkIHBsdWdpbi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4dGVuc2lvbiB0byB0aGUgbWFuaWZlc3QgYXMgd2FzIGluc3RhbGxlZCBieSB0aGUgYGFwcGl1bWAgQ0xJLiAgVGhlXG4gICAqIGBleHREYXRhYCwgYGV4dFR5cGVgLCBhbmQgYGV4dE5hbWVgIGhhdmUgYWxyZWFkeSBiZWVuIGRldGVybWluZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgTWFuaWZlc3QuYWRkRXh0ZW5zaW9uRnJvbVBhY2thZ2V9IGZvciBhZGRpbmcgYW4gZXh0ZW5zaW9uIGZyb20gYW4gb24tZGlzayBwYWNrYWdlLlxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHRUeXBlfSBleHRUeXBlIC0gYGRyaXZlcmAgb3IgYHBsdWdpbmBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhIC0gRXh0ZW5zaW9uIG1ldGFkYXRhXG4gICAqIEByZXR1cm5zIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gQSBjbG9uZSBvZiBgZXh0RGF0YWAsIHBvdGVudGlhbGx5IHdpdGggYSBtdXRhdGVkIGBhcHBpdW1WZXJzaW9uYCBmaWVsZFxuICAgKi9cbiAgYWRkRXh0ZW5zaW9uKGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCBkYXRhID0gXy5jbG9uZShleHREYXRhKTtcbiAgICB0aGlzLl9kYXRhW2Ake2V4dFR5cGV9c2BdW2V4dE5hbWVdID0gZGF0YTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBUFBJVU1fSE9NRSBwYXRoXG4gICAqL1xuICBnZXQgYXBwaXVtSG9tZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBtYW5pZmVzdCBmaWxlXG4gICAqL1xuICBnZXQgbWFuaWZlc3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleHRlbnNpb24gZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHJldHVybnMge0V4dFJlY29yZDxFeHRUeXBlPn1cbiAgICovXG4gIGdldEV4dGVuc2lvbkRhdGEoZXh0VHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7ZXh0VHlwZX1zYCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIG1hbmlmZXN0IGZyb20gZGlzayBhbmQgX292ZXJ3cml0ZXNfIHRoZSBpbnRlcm5hbCBkYXRhLlxuICAgKlxuICAgKiBJZiB0aGUgbWFuaWZlc3QgZG9lcyBub3QgZXhpc3Qgb24gZGlzaywgYW4ge0BsaW5rIElOSVRJQUxfTUFOSUZFU1RfREFUQSBcImVtcHR5XCJ9IG1hbmlmZXN0IGZpbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBJZiBgQVBQSVVNX0hPTUVgIGNvbnRhaW5zIGEgYHBhY2thZ2UuanNvbmAgd2l0aCBhbiBgYXBwaXVtYCBkZXBlbmRlbmN5LCB0aGVuIGEgaGFzaCBvZiB0aGUgYHBhY2thZ2UuanNvbmAgd2lsbCBiZSB0YWtlbi4gSWYgdGhpcyBoYXNoIGRpZmZlcnMgZnJvbSB0aGUgbGFzdCBoYXNoLCB0aGUgY29udGVudHMgb2YgYEFQUElVTV9IT01FL25vZGVfbW9kdWxlc2Agd2lsbCBiZSBzY2FubmVkIGZvciBleHRlbnNpb25zIHRoYXQgbWF5IGhhdmUgYmVlbiBpbnN0YWxsZWQgb3V0c2lkZSBvZiB0aGUgYGFwcGl1bWAgQ0xJLiAgQW55IGZvdW5kIGV4dGVuc2lvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFuaWZlc3QgZmlsZSwgYW5kIGlmIHNvLCB0aGUgbWFuaWZlc3QgZmlsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay5cbiAgICpcbiAgICogT25seSBvbmUgcmVhZCBvcGVyYXRpb24gc2hvdWxkIGhhcHBlbiBhdCBhIHRpbWUuICBUaGlzIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSB7QGxpbmsgTWFuaWZlc3QuX3JlYWRpbmd9IHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYW5pZmVzdERhdGE+fSBUaGUgZGF0YVxuICAgKi9cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGluZykge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZGluZztcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIHRoaXMuX3JlYWRpbmcgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtNYW5pZmVzdERhdGF9ICovXG4gICAgICBsZXQgZGF0YTtcbiAgICAgIGxldCBpc05ld0ZpbGUgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuX3NldE1hbmlmZXN0UGF0aCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWFkaW5nICR7dGhpcy5fbWFuaWZlc3RQYXRofS4uLmApO1xuICAgICAgICBjb25zdCB5YW1sID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5fbWFuaWZlc3RQYXRoLCAndXRmOCcpO1xuICAgICAgICBkYXRhID0gWUFNTC5wYXJzZSh5YW1sKTtcbiAgICAgICAgbG9nLmRlYnVnKGBQYXJzZWQgbWFuaWZlc3QgZmlsZTogJHtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKX1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgZGF0YSA9IF8uY2xvbmVEZWVwKElOSVRJQUxfTUFOSUZFU1RfREFUQSk7XG4gICAgICAgICAgaXNOZXdGaWxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5fbWFuaWZlc3RQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBcHBpdW0gaGFkIHRyb3VibGUgbG9hZGluZyB0aGUgZXh0ZW5zaW9uIGluc3RhbGxhdGlvbiBgICtcbiAgICAgICAgICAgICAgICBgY2FjaGUgZmlsZSAoJHt0aGlzLl9tYW5pZmVzdFBhdGh9KS4gSXQgbWF5IGJlIGludmFsaWQgWUFNTC4gU3BlY2lmaWMgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkIGFuIHVua25vd24gcHJvYmxlbS4gU3BlY2lmaWMgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICBsZXQgaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgKGF3YWl0IGVudi5oYXNBcHBpdW1EZXBlbmRlbmN5KHRoaXMuYXBwaXVtSG9tZSkpICYmXG4gICAgICAgIChhd2FpdCBwYWNrYWdlRGlkQ2hhbmdlKHRoaXMuYXBwaXVtSG9tZSkpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFsbGVkRXh0ZW5zaW9uc0NoYW5nZWQgPSBhd2FpdCB0aGlzLnN5bmNXaXRoSW5zdGFsbGVkRXh0ZW5zaW9ucygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOZXdGaWxlIHx8IGluc3RhbGxlZEV4dGVuc2lvbnNDaGFuZ2VkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGUoKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkaW5nO1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlYWRpbmcgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMge0BsaW5rIE1hbmlmZXN0Ll9tYW5pZmVzdFBhdGh9IGlzIHNldC5cbiAgICpcbiAgICogQ3JlYXRlcyB0aGUgZGlyZWN0b3J5IGlmIG5lY2Vzc2FyeS5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIF9zZXRNYW5pZmVzdFBhdGgoKSB7XG4gICAgaWYgKCF0aGlzLl9tYW5pZmVzdFBhdGgpIHtcbiAgICAgIHRoaXMuX21hbmlmZXN0UGF0aCA9IGF3YWl0IGVudi5yZXNvbHZlTWFuaWZlc3RQYXRoKHRoaXMuX2FwcGl1bUhvbWUpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChwYXRoLnJlbGF0aXZlKHRoaXMuX2FwcGl1bUhvbWUsIHRoaXMuX21hbmlmZXN0UGF0aCkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlzbWF0Y2ggYmV0d2VlbiBsb2NhdGlvbiBvZiBBUFBJVU1fSE9NRSBhbmQgbWFuaWZlc3QgZmlsZS4gQVBQSVVNX0hPTUU6ICR7dGhpcy5hcHBpdW1Ib21lfSwgbWFuaWZlc3QgZmlsZTogJHt0aGlzLl9tYW5pZmVzdFBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBkYXRhIGlmIGl0IG5lZWQgcyB3cml0aW5nLlxuICAgKlxuICAgKiBJZiB0aGUgYHNjaGVtYVJldmAgcHJvcCBuZWVkcyB1cGRhdGluZywgdGhlIGZpbGUgd2lsbCBiZSB3cml0dGVuLlxuICAgKlxuICAgKiBAdG9kbyBJZiB0aGlzIGJlY29tZXMgdG9vIG11Y2ggb2YgYSBib3R0bGVuZWNrLCB0aHJvdHRsZSBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGRhdGEgd2FzIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlKCkge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGluZztcbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl9zZXRNYW5pZmVzdFBhdGgoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChwYXRoLmRpcm5hbWUodGhpcy5fbWFuaWZlc3RQYXRoKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBcHBpdW0gY291bGQgbm90IGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGZvciB0aGUgbWFuaWZlc3QgZmlsZTogJHtwYXRoLmRpcm5hbWUoXG4gICAgICAgICAgICB0aGlzLl9tYW5pZmVzdFBhdGhcbiAgICAgICAgICApfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMuX21hbmlmZXN0UGF0aCwgWUFNTC5zdHJpbmdpZnkodGhpcy5fZGF0YSksICd1dGY4Jyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCB3cml0ZSB0byBtYW5pZmVzdCBhdCAke3RoaXMuX21hbmlmZXN0UGF0aH0gdXNpbmcgQVBQSVVNX0hPTUUgJHt0aGlzLl9hcHBpdW1Ib21lfS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIGVuc3VyZSBpdCBpcyB3cml0YWJsZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl93cml0aW5nO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93cml0aW5nID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgb2YgdGhlIHN0cmluZyByZWZlcnJpbmcgdG8gYSBkcml2ZXIgKHR5cGljYWxseSBhcyBhIGtleSBvciB0eXBlIHN0cmluZylcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBzdHJpbmcgcmVmZXJyaW5nIHRvIGEgcGx1Z2luICh0eXBpY2FsbHkgYXMgYSBrZXkgb3IgdHlwZSBzdHJpbmcpXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3luY1dpdGhJbnN0YWxsZWRFeHRlbnNpb25zT3B0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZXB0aExpbWl0XSAtIE1heGltdW0gZGVwdGggdG8gcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5NYW5pZmVzdERhdGF9IE1hbmlmZXN0RGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW50ZXJuYWxNZXRhZGF0YX0gSW50ZXJuYWxNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dFBhY2thZ2VKc29uPFQ+fSBFeHRQYWNrYWdlSnNvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1hbmlmZXN0PFQ+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dFJlY29yZDxUPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBFaXRoZXIgYGRyaXZlcmAgb3IgYHBsdWdpbmAgcm5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQSxNQUFNQSxvQkFBb0IsR0FBRyxDQUE3QjtBQU1BLE1BQU1DLDRCQUE0QixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztFQUNqREMsVUFBVSxFQUFFSixvQkFEcUM7RUFHakRLLE1BQU0sRUFBR0MsUUFBRCxJQUFjLENBQUNDLGFBQUEsQ0FBS0MsUUFBTCxDQUFjRixRQUFkLEVBQXdCRyxVQUF4QixDQUFtQyxHQUFuQztBQUgwQixDQUFkLENBQXJDO0FBU0EsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBMUI7QUFNQSxNQUFNQyxzQkFBc0IsR0FBSSxHQUFFQyxzQkFBWSxHQUE5QztBQU1BLE1BQU1DLHNCQUFzQixHQUFJLEdBQUVDLHNCQUFZLEdBQTlDO0FBS0EsTUFBTUMscUJBQXFCLEdBQUdiLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0VBQzFDLENBQUNRLHNCQUFELEdBQTBCVCxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLENBRGdCO0VBRTFDLENBQUNVLHNCQUFELEdBQTBCWCxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLENBRmdCO0VBRzFDYSxTQUFTLEVBQUVOO0FBSCtCLENBQWQsQ0FBOUI7O0FBYUEsU0FBU08sV0FBVCxDQUFxQkMsS0FBckIsRUFBNEI7RUFDMUIsT0FDRUMsZUFBQSxDQUFFQyxhQUFGLENBQWdCRixLQUFoQixLQUNBQyxlQUFBLENBQUVDLGFBQUYsQ0FBZ0JGLEtBQUssQ0FBQ0csTUFBdEIsQ0FEQSxJQUVBRixlQUFBLENBQUVHLFFBQUYsQ0FBV0osS0FBSyxDQUFDSyxJQUFqQixDQUZBLElBR0FKLGVBQUEsQ0FBRUcsUUFBRixDQUFXSixLQUFL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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":"AAMA;;;;;;;;GAQG;AACH,6CAHW,MAAM,GACJ,QAAQ,OAAO,CAAC,CAkD5B"}