appium 2.0.0-beta.2 → 2.0.0-beta.23

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 (122) hide show
  1. package/README.md +9 -9
  2. package/build/check-npm-pack-files.js +23 -0
  3. package/build/commands-yml/parse.js +319 -0
  4. package/build/commands-yml/validator.js +130 -0
  5. package/build/index.js +19 -0
  6. package/build/lib/appium-config.schema.json +0 -0
  7. package/build/lib/appium.js +160 -53
  8. package/build/lib/cli/args.js +115 -279
  9. package/build/lib/cli/driver-command.js +11 -1
  10. package/build/lib/cli/extension-command.js +60 -8
  11. package/build/lib/cli/extension.js +30 -7
  12. package/build/lib/cli/npm.js +43 -29
  13. package/build/lib/cli/parser.js +156 -89
  14. package/build/lib/cli/plugin-command.js +11 -1
  15. package/build/lib/cli/utils.js +29 -3
  16. package/build/lib/config-file.js +141 -0
  17. package/build/lib/config.js +53 -65
  18. package/build/lib/driver-config.js +42 -19
  19. package/build/lib/drivers.js +8 -4
  20. package/build/lib/ext-config-io.js +165 -0
  21. package/build/lib/extension-config.js +130 -61
  22. package/build/lib/grid-register.js +22 -24
  23. package/build/lib/logger.js +3 -3
  24. package/build/lib/logsink.js +11 -13
  25. package/build/lib/main.js +197 -77
  26. package/build/lib/plugin-config.js +21 -11
  27. package/build/lib/plugins.js +4 -2
  28. package/build/lib/schema/appium-config-schema.js +253 -0
  29. package/build/lib/schema/arg-spec.js +120 -0
  30. package/build/lib/schema/cli-args.js +188 -0
  31. package/build/lib/schema/cli-transformers.js +76 -0
  32. package/build/lib/schema/index.js +36 -0
  33. package/build/lib/schema/keywords.js +72 -0
  34. package/build/lib/schema/schema.js +357 -0
  35. package/build/lib/utils.js +44 -99
  36. package/build/postinstall.js +90 -0
  37. package/build/test/cli/cli-e2e-specs.js +221 -0
  38. package/build/test/cli/cli-helpers.js +86 -0
  39. package/build/test/cli/cli-specs.js +71 -0
  40. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  41. package/build/test/cli/schema-args-specs.js +48 -0
  42. package/build/test/cli/schema-e2e-specs.js +47 -0
  43. package/build/test/config-e2e-specs.js +112 -0
  44. package/build/test/config-file-e2e-specs.js +209 -0
  45. package/build/test/config-file-specs.js +281 -0
  46. package/build/test/config-specs.js +159 -0
  47. package/build/test/driver-e2e-specs.js +435 -0
  48. package/build/test/driver-specs.js +321 -0
  49. package/build/test/ext-config-io-specs.js +181 -0
  50. package/build/test/extension-config-specs.js +365 -0
  51. package/build/test/fixtures/allow-feat.txt +5 -0
  52. package/build/test/fixtures/caps.json +3 -0
  53. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  54. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  55. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  56. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  57. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  58. package/build/test/fixtures/config/appium.config.good.js +40 -0
  59. package/build/test/fixtures/config/appium.config.good.json +33 -0
  60. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  61. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  62. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  63. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  64. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  65. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  66. package/build/test/fixtures/config/nodeconfig.json +3 -0
  67. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  68. package/build/test/fixtures/default-args.js +35 -0
  69. package/build/test/fixtures/deny-feat.txt +5 -0
  70. package/build/test/fixtures/driver.schema.js +20 -0
  71. package/build/test/fixtures/extensions.yaml +27 -0
  72. package/build/test/fixtures/flattened-schema.js +504 -0
  73. package/build/test/fixtures/plugin.schema.js +20 -0
  74. package/build/test/fixtures/schema-with-extensions.js +28 -0
  75. package/build/test/grid-register-specs.js +74 -0
  76. package/build/test/helpers.js +75 -0
  77. package/build/test/logger-specs.js +76 -0
  78. package/build/test/npm-specs.js +20 -0
  79. package/build/test/parser-specs.js +314 -0
  80. package/build/test/plugin-e2e-specs.js +316 -0
  81. package/build/test/schema/arg-spec-specs.js +70 -0
  82. package/build/test/schema/cli-args-specs.js +431 -0
  83. package/build/test/schema/schema-specs.js +389 -0
  84. package/build/test/utils-specs.js +266 -0
  85. package/index.js +11 -0
  86. package/lib/appium-config.schema.json +278 -0
  87. package/lib/appium.js +207 -65
  88. package/lib/cli/args.js +174 -375
  89. package/lib/cli/driver-command.js +4 -0
  90. package/lib/cli/extension-command.js +70 -5
  91. package/lib/cli/extension.js +25 -5
  92. package/lib/cli/npm.js +86 -18
  93. package/lib/cli/parser.js +257 -79
  94. package/lib/cli/plugin-command.js +4 -0
  95. package/lib/cli/utils.js +21 -1
  96. package/lib/config-file.js +227 -0
  97. package/lib/config.js +84 -63
  98. package/lib/driver-config.js +66 -11
  99. package/lib/drivers.js +4 -1
  100. package/lib/ext-config-io.js +287 -0
  101. package/lib/extension-config.js +225 -67
  102. package/lib/grid-register.js +27 -24
  103. package/lib/logger.js +1 -1
  104. package/lib/logsink.js +10 -7
  105. package/lib/main.js +214 -77
  106. package/lib/plugin-config.js +35 -6
  107. package/lib/plugins.js +1 -0
  108. package/lib/schema/appium-config-schema.js +287 -0
  109. package/lib/schema/arg-spec.js +222 -0
  110. package/lib/schema/cli-args.js +285 -0
  111. package/lib/schema/cli-transformers.js +123 -0
  112. package/lib/schema/index.js +2 -0
  113. package/lib/schema/keywords.js +135 -0
  114. package/lib/schema/schema.js +577 -0
  115. package/lib/utils.js +42 -88
  116. package/package.json +55 -84
  117. package/postinstall.js +71 -0
  118. package/types/appium-config.d.ts +197 -0
  119. package/types/types.d.ts +201 -0
  120. package/CHANGELOG.md +0 -3515
  121. package/build/lib/cli/parser-helpers.js +0 -82
  122. package/lib/cli/parser-helpers.js +0 -79
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _path = _interopRequireDefault(require("path"));
8
+
9
+ var _support = require("@appium/support");
10
+
11
+ var _drivers = require("../../lib/drivers");
12
+
13
+ var _helpers = require("../helpers");
14
+
15
+ var _cliHelpers = require("./cli-helpers");
16
+
17
+ describe('CLI', function () {
18
+ let appiumHome;
19
+ let run;
20
+ before(async function () {
21
+ appiumHome = await _support.tempDir.openDir();
22
+ const runner = (0, _cliHelpers.runAppium)(appiumHome);
23
+
24
+ run = async (extCommand, args = [], raw = false, ext = 'driver') => await runner([ext, extCommand, ...args], {
25
+ raw
26
+ });
27
+ });
28
+ after(async function () {
29
+ await _support.fs.rimraf(appiumHome);
30
+ });
31
+
32
+ async function clear() {
33
+ await _support.fs.rimraf(appiumHome);
34
+ await (0, _support.mkdirp)(appiumHome);
35
+ }
36
+
37
+ describe('Driver CLI', function () {
38
+ const localFakeDriverPath = _path.default.join(_helpers.PROJECT_ROOT, 'packages', 'fake-driver');
39
+
40
+ describe('list', function () {
41
+ it('should list available drivers', async function () {
42
+ const stdout = await run('list');
43
+
44
+ for (const d of Object.keys(_drivers.KNOWN_DRIVERS)) {
45
+ stdout.should.match(new RegExp(`${d}.+[not installed]`));
46
+ }
47
+ });
48
+ it('should list available drivers in json format', async function () {
49
+ const driverData = JSON.parse(await run('list', ['--json']));
50
+
51
+ for (const d of Object.keys(_drivers.KNOWN_DRIVERS)) {
52
+ driverData[d].should.eql({
53
+ installed: false,
54
+ pkgName: _drivers.KNOWN_DRIVERS[d]
55
+ });
56
+ }
57
+ });
58
+ it('should allow filtering by installed drivers', async function () {
59
+ const out = await run('list', ['--installed', '--json']);
60
+ JSON.parse(out).should.eql({});
61
+ });
62
+ it('should show updates for installed drivers with --updates', async function () {
63
+ const penultimateFakeDriverVersionAsOfRightNow = '3.0.4';
64
+ await clear();
65
+ await run('install', [`@appium/fake-driver@${penultimateFakeDriverVersionAsOfRightNow}`, '--source', 'npm', '--json']);
66
+ const {
67
+ fake
68
+ } = JSON.parse(await run('list', ['--updates', '--json']));
69
+ _support.util.compareVersions(fake.updateVersion, '>', penultimateFakeDriverVersionAsOfRightNow).should.be.true;
70
+ const stdout = await run('list', ['--updates']);
71
+ stdout.should.match(new RegExp(`fake.+[${fake.updateVersion} available]`));
72
+ });
73
+ });
74
+ describe('install', function () {
75
+ it('should install a driver from the list of known drivers', async function () {
76
+ await clear();
77
+ const ret = JSON.parse(await run('install', ['uiautomator2', '--json']));
78
+ ret.uiautomator2.pkgName.should.eql('appium-uiautomator2-driver');
79
+ ret.uiautomator2.installType.should.eql('npm');
80
+ ret.uiautomator2.installSpec.should.eql('uiautomator2');
81
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
82
+ delete list.uiautomator2.installed;
83
+ list.should.eql(ret);
84
+ });
85
+ it('should install a driver from npm', async function () {
86
+ await clear();
87
+ const ret = JSON.parse(await run('install', ['@appium/fake-driver', '--source', 'npm', '--json']));
88
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
89
+ ret.fake.installType.should.eql('npm');
90
+ ret.fake.installSpec.should.eql('@appium/fake-driver');
91
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
92
+ delete list.fake.installed;
93
+ list.should.eql(ret);
94
+ });
95
+ it('should install a driver from npm with a specific version/tag', async function () {
96
+ const currentFakeDriverVersionAsOfRightNow = '3.0.5';
97
+ await clear();
98
+ const installSpec = `@appium/fake-driver@${currentFakeDriverVersionAsOfRightNow}`;
99
+ const ret = JSON.parse(await run('install', [installSpec, '--source', 'npm', '--json']));
100
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
101
+ ret.fake.installType.should.eql('npm');
102
+ ret.fake.installSpec.should.eql(installSpec);
103
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
104
+ delete list.fake.installed;
105
+ list.should.eql(ret);
106
+ });
107
+ it('should install a driver from github', async function () {
108
+ await clear();
109
+ const ret = JSON.parse(await run('install', ['appium/appium-fake-driver', '--source', 'github', '--package', 'appium-fake-driver', '--json']));
110
+ ret.fake.pkgName.should.eql('appium-fake-driver');
111
+ ret.fake.installType.should.eql('github');
112
+ ret.fake.installSpec.should.eql('appium/appium-fake-driver');
113
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
114
+ delete list.fake.installed;
115
+ list.should.eql(ret);
116
+ });
117
+ it('should install a driver from a local git repo', async function () {
118
+ await clear();
119
+ const ret = JSON.parse(await run('install', [localFakeDriverPath, '--source', 'git', '--package', '@appium/fake-driver', '--json']));
120
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
121
+ ret.fake.installType.should.eql('git');
122
+ ret.fake.installSpec.should.eql(localFakeDriverPath);
123
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
124
+ delete list.fake.installed;
125
+ list.should.eql(ret);
126
+ });
127
+ it('should install a driver from a remote git repo', async function () {
128
+ await clear();
129
+ const ret = JSON.parse(await run('install', ['git+https://github.com/appium/appium-fake-driver.git', '--source', 'git', '--package', 'appium-fake-driver', '--json']));
130
+ ret.fake.pkgName.should.eql('appium-fake-driver');
131
+ ret.fake.installType.should.eql('git');
132
+ ret.fake.installSpec.should.eql('git+https://github.com/appium/appium-fake-driver');
133
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
134
+ delete list.fake.installed;
135
+ list.should.eql(ret);
136
+ });
137
+ it('should install a driver from a local npm module', async function () {
138
+ await clear();
139
+ const ret = JSON.parse(await run('install', [localFakeDriverPath, '--source', 'local', '--json']));
140
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
141
+ ret.fake.installType.should.eql('local');
142
+ ret.fake.installSpec.should.eql(localFakeDriverPath);
143
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
144
+ delete list.fake.installed;
145
+ list.should.eql(ret);
146
+ });
147
+ });
148
+ describe('uninstall', function () {
149
+ it('should uninstall a driver based on its driver name', async function () {
150
+ await clear();
151
+ const ret = JSON.parse(await run('install', ['@appium/fake-driver', '--source', 'npm', '--json']));
152
+
153
+ const installPath = _path.default.resolve(appiumHome, ret.fake.installPath);
154
+
155
+ await _support.fs.exists(installPath).should.eventually.be.true;
156
+ let list = JSON.parse(await run('list', ['--installed', '--json']));
157
+ list.fake.installed.should.be.true;
158
+ const uninstall = JSON.parse(await run('uninstall', ['fake', '--json']));
159
+ uninstall.should.not.have.key('fake');
160
+ await _support.fs.exists(installPath).should.eventually.be.false;
161
+ });
162
+ });
163
+ describe('run', function () {
164
+ before(async function () {
165
+ await clear();
166
+ await run('install', [localFakeDriverPath, '--source', 'local', '--json']);
167
+ });
168
+ it('should run a valid driver, valid script, and result in success', async function () {
169
+ const driverName = 'fake';
170
+ const scriptName = 'fake-success';
171
+ const out = JSON.parse(await run('run', [driverName, scriptName, '--json']));
172
+ out.should.not.include.key('error');
173
+ });
174
+ it('should run a valid driver, valid error prone script, and return error in json', async function () {
175
+ const driverName = 'fake';
176
+ const out = JSON.parse(await run('run', [driverName, 'fake-error', '--json']));
177
+ out.should.include.key('error');
178
+ });
179
+ it('should take a valid driver, invalid script, and throw an error', async function () {
180
+ const driverName = 'fake';
181
+ await chai.expect(run('run', [driverName, 'foo', '--json'])).to.eventually.be.rejectedWith(Error);
182
+ });
183
+ it('should take an invalid driver, invalid script, and throw an error', async function () {
184
+ const driverName = 'foo';
185
+ await chai.expect(run('run', [driverName, 'bar', '--json'])).to.eventually.be.rejectedWith(Error);
186
+ });
187
+ });
188
+ });
189
+ describe('Plugin CLI', function () {
190
+ const fakePluginDir = _path.default.dirname(require.resolve('@appium/fake-plugin/package.json'));
191
+
192
+ const ext = 'plugin';
193
+ describe('run', function () {
194
+ before(async function () {
195
+ await clear();
196
+ await run('install', [fakePluginDir, '--source', 'local', '--json'], false, ext);
197
+ });
198
+ it('should run a valid plugin, valid script, and result in success', async function () {
199
+ const pluginName = 'fake';
200
+ const scriptName = 'fake-success';
201
+ const out = JSON.parse(await run('run', [pluginName, scriptName, '--json'], false, ext));
202
+ out.should.not.include.key('error');
203
+ });
204
+ it('should run a valid plugin, valid error prone script, and return error in json', async function () {
205
+ const pluginName = 'fake';
206
+ const out = JSON.parse(await run('run', [pluginName, 'fake-error', '--json'], false, ext));
207
+ out.should.include.key('error');
208
+ });
209
+ it('should take a valid plugin, invalid script, and throw an error', async function () {
210
+ const pluginName = 'fake';
211
+ await chai.expect(run('run', [pluginName, 'foo', '--json'], false, ext)).to.eventually.be.rejectedWith(Error);
212
+ });
213
+ it('should take an invalid plugin, invalid script, and throw an error', async function () {
214
+ await chai.expect(run('run', ['foo', 'bar', '--json'], false, ext)).to.eventually.be.rejectedWith(Error);
215
+ });
216
+ });
217
+ });
218
+ });require('source-map-support').install();
219
+
220
+
221
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJhcHBpdW1Ib21lIiwicnVuIiwiYmVmb3JlIiwidGVtcERpciIsIm9wZW5EaXIiLCJydW5uZXIiLCJleHRDb21tYW5kIiwiYXJncyIsInJhdyIsImV4dCIsImFmdGVyIiwiZnMiLCJyaW1yYWYiLCJjbGVhciIsImxvY2FsRmFrZURyaXZlclBhdGgiLCJwYXRoIiwiam9pbiIsIlBST0pFQ1RfUk9PVCIsIml0Iiwic3Rkb3V0IiwiZCIsIk9iamVjdCIsImtleXMiLCJLTk9XTl9EUklWRVJTIiwic2hvdWxkIiwibWF0Y2giLCJSZWdFeHAiLCJkcml2ZXJEYXRhIiwiSlNPTiIsInBhcnNlIiwiZXFsIiwiaW5zdGFsbGVkIiwicGtnTmFtZSIsIm91dCIsInBlbnVsdGltYXRlRmFrZURyaXZlclZlcnNpb25Bc09mUmlnaHROb3ciLCJmYWtlIiwidXRpbCIsImNvbXBhcmVWZXJzaW9ucyIsInVwZGF0ZVZlcnNpb24iLCJiZSIsInRydWUiLCJyZXQiLCJ1aWF1dG9tYXRvcjIiLCJpbnN0YWxsVHlwZSIsImluc3RhbGxTcGVjIiwibGlzdCIsImN1cnJlbnRGYWtlRHJpdmVyVmVyc2lvbkFzT2ZSaWdodE5vdyIsImluc3RhbGxQYXRoIiwicmVzb2x2ZSIsImV4aXN0cyIsImV2ZW50dWFsbHkiLCJ1bmluc3RhbGwiLCJub3QiLCJoYXZlIiwia2V5IiwiZmFsc2UiLCJkcml2ZXJOYW1lIiwic2NyaXB0TmFtZSIsImluY2x1ZGUiLCJjaGFpIiwiZXhwZWN0IiwidG8iLCJyZWplY3RlZFdpdGgiLCJFcnJvciIsImZha2VQbHVnaW5EaXIiLCJkaXJuYW1lIiwicmVxdWlyZSIsInBsdWdpbk5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxRQUFRLENBQUMsS0FBRCxFQUFRLFlBQVk7QUFJMUIsTUFBSUMsVUFBSjtBQUtBLE1BQUlD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QUFDQSxjQUFNbEMsR0FBRyxHQUFHTCxJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDa0UsVUFBRCxFQUFhLFlBQWIsRUFBMkIsUUFBM0IsQ0FBUixFQUE4QyxLQUE5QyxFQUFxRDFELEdBQXJELENBQXBCLENBQVo7QUFDQXdCLFFBQUFBLEdBQUcsQ0FBQ1QsTUFBSixDQUFXa0MsT0FBWCxDQUFtQkosR0FBbkIsQ0FBdUIsT0FBdkI7QUFDRCxPQUpDLENBQUY7QUFLQXBDLE1BQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxrQkFBa0I7QUFDckYsY0FBTWlELFVBQVUsR0FBRyxNQUFuQjtBQUNBLGNBQU1SLElBQUksQ0FBQ0MsTUFBTCxDQUFZM0QsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDa0UsVUFBRCxFQUFhLEtBQWIsRUFBb0IsUUFBcEIsQ0FBUixFQUF1QyxLQUF2QyxFQUE4QzFELEdBQTlDLENBQWYsRUFBbUVvRCxFQUFuRSxDQUFzRVgsVUFBdEUsQ0FBaUZYLEVBQWpGLENBQW9GdUIsWUFBcEYsQ0FBaUdDLEtBQWpHLENBQU47QUFDRCxPQUhDLENBQUY7QUFJQTdDLE1BQUFBLEVBQUUsQ0FBQyxtRUFBRCxFQUFzRSxrQkFBa0I7QUFDeEYsY0FBTXlDLElBQUksQ0FBQ0MsTUFBTCxDQUFZM0QsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsUUFBZixDQUFSLEVBQWtDLEtBQWxDLEVBQXlDUSxHQUF6QyxDQUFmLEVBQThEb0QsRUFBOUQsQ0FBaUVYLFVBQWpFLENBQTRFWCxFQUE1RSxDQUErRXVCLFlBQS9FLENBQTRGQyxLQUE1RixDQUFOO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0F2Qk8sQ0FBUjtBQXdCRCxHQTNCTyxDQUFSO0FBNEJELENBN01PLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdGVtcERpciwgZnMsIG1rZGlycCwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBLTk9XTl9EUklWRVJTIH0gZnJvbSAnLi4vLi4vbGliL2RyaXZlcnMnO1xuaW1wb3J0IHsgUFJPSkVDVF9ST09UIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBydW5BcHBpdW0gfSBmcm9tICcuL2NsaS1oZWxwZXJzJztcblxuZGVzY3JpYmUoJ0NMSScsIGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBsZXQgYXBwaXVtSG9tZTtcblxuICAvKipcbiAgICogQHR5cGUgeyhleHRDb21tYW5kOiBzdHJpbmcsIGFyZ3M/OiBzdHJpbmdbXSwgcmF3PzogYm9vbGVhbiwgZXh0PzogRXh0ZW5zaW9uVHlwZSkgPT4gUHJvbWlzZTxzdHJpbmd8aW1wb3J0KCcuL2NsaS1oZWxwZXJzJykuVGVlblByb2Nlc3NFeGVjUmVzdWx0Pn1cbiAgICovXG4gIGxldCBydW47XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhcHBpdW1Ib21lID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcnVubmVyID0gcnVuQXBwaXVtKGFwcGl1bUhvbWUpO1xuICAgIHJ1biA9IGFzeW5jIChleHRDb21tYW5kLCBhcmdzID0gW10sIHJhdyA9IGZhbHNlLCBleHQgPSAnZHJpdmVyJykgPT4gYXdhaXQgcnVubmVyKFtleHQsIGV4dENvbW1hbmQsIC4uLmFyZ3NdLCB7cmF3fSk7XG4gIH0pO1xuXG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwaXVtSG9tZSk7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwaXVtSG9tZSk7XG4gICAgYXdhaXQgbWtkaXJwKGFwcGl1bUhvbWUpO1xuICB9XG5cbiAgZGVzY3JpYmUoJ0RyaXZlciBDTEknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9jYWxGYWtlRHJpdmVyUGF0aCA9IHBhdGguam9pbihQUk9KRUNUX1JPT1QsICdwYWNrYWdlcycsICdmYWtlLWRyaXZlcicpO1xuICAgIGRlc2NyaWJlKCdsaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBsaXN0IGF2YWlsYWJsZSBkcml2ZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBydW4oJ2xpc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBkIG9mIE9iamVjdC5rZXlzKEtOT1dOX0RSSVZFUlMpKSB7XG4gICAgICAgICAgc3Rkb3V0LnNob3VsZC5tYXRjaChuZXcgUmVnRXhwKGAke2R9Litbbm90IGluc3RhbGxlZF1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBsaXN0IGF2YWlsYWJsZSBkcml2ZXJzIGluIGpzb24gZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJEYXRhID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0tanNvbiddKSk7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBPYmplY3Qua2V5cyhLTk9XTl9EUklWRVJTKSkge1xuICAgICAgICAgIGRyaXZlckRhdGFbZF0uc2hvdWxkLmVxbCh7aW5zdGFsbGVkOiBmYWxzZSwgcGtnTmFtZTogS05PV05fRFJJVkVSU1tkXX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWxsb3cgZmlsdGVyaW5nIGJ5IGluc3RhbGxlZCBkcml2ZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvdXQgPSBhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKTtcbiAgICAgICAgSlNPTi5wYXJzZShvdXQpLnNob3VsZC5lcWwoe30pO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHNob3cgdXBkYXRlcyBmb3IgaW5zdGFsbGVkIGRyaXZlcnMgd2l0aCAtLXVwZGF0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBlbnVsdGltYXRlRmFrZURyaXZlclZlcnNpb25Bc09mUmlnaHROb3cgPSAnMy4wLjQnO1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBhd2FpdCBydW4oJ2luc3RhbGwnLCBbYEBhcHBpdW0vZmFrZS1kcml2ZXJAJHtwZW51bHRpbWF0ZUZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93fWAsICctLXNvdXJjZScsICducG0nLCAnLS1qc29uJ10pO1xuICAgICAgICBjb25zdCB7ZmFrZX0gPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS11cGRhdGVzJywgJy0tanNvbiddKSk7XG4gICAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKGZha2UudXBkYXRlVmVyc2lvbiwgJz4nLCBwZW51bHRpbWF0ZUZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93KS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgcnVuKCdsaXN0JywgWyctLXVwZGF0ZXMnXSk7XG4gICAgICAgIHN0ZG91dC5zaG91bGQubWF0Y2gobmV3IFJlZ0V4cChgZmFrZS4rWyR7ZmFrZS51cGRhdGVWZXJzaW9ufSBhdmFpbGFibGVdYCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgaW5zdGFsbCBhIGRyaXZlciBmcm9tIHRoZSBsaXN0IG9mIGtub3duIGRyaXZlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHJldCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdpbnN0YWxsJywgWyd1aWF1dG9tYXRvcjInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LnVpYXV0b21hdG9yMi5wa2dOYW1lLnNob3VsZC5lcWwoJ2FwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyJyk7XG4gICAgICAgIHJldC51aWF1dG9tYXRvcjIuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnbnBtJyk7XG4gICAgICAgIHJldC51aWF1dG9tYXRvcjIuaW5zdGFsbFNwZWMuc2hvdWxkLmVxbCgndWlhdXRvbWF0b3IyJyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS1pbnN0YWxsZWQnLCAnLS1qc29uJ10pKTtcbiAgICAgICAgZGVsZXRlIGxpc3QudWlhdXRvbWF0b3IyLmluc3RhbGxlZDtcbiAgICAgICAgbGlzdC5zaG91bGQuZXFsKHJldCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgaW5zdGFsbCBhIGRyaXZlciBmcm9tIG5wbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1zb3VyY2UnLCAnbnBtJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsVHlwZS5zaG91bGQuZXFsKCducG0nKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFNwZWMuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gbnBtIHdpdGggYSBzcGVjaWZpYyB2ZXJzaW9uL3RhZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93ID0gJzMuMC41JztcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgaW5zdGFsbFNwZWMgPSBgQGFwcGl1bS9mYWtlLWRyaXZlckAke2N1cnJlbnRGYWtlRHJpdmVyVmVyc2lvbkFzT2ZSaWdodE5vd31gO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFtpbnN0YWxsU3BlYywgJy0tc291cmNlJywgJ25wbScsICctLWpzb24nXSkpO1xuICAgICAgICByZXQuZmFrZS5wa2dOYW1lLnNob3VsZC5lcWwoJ0BhcHBpdW0vZmFrZS1kcml2ZXInKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnbnBtJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxTcGVjLnNob3VsZC5lcWwoaW5zdGFsbFNwZWMpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gZ2l0aHViJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFsnYXBwaXVtL2FwcGl1bS1mYWtlLWRyaXZlcicsICctLXNvdXJjZScsXG4gICAgICAgICAgJ2dpdGh1YicsICctLXBhY2thZ2UnLCAnYXBwaXVtLWZha2UtZHJpdmVyJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnYXBwaXVtLWZha2UtZHJpdmVyJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxUeXBlLnNob3VsZC5lcWwoJ2dpdGh1YicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKCdhcHBpdW0vYXBwaXVtLWZha2UtZHJpdmVyJyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS1pbnN0YWxsZWQnLCAnLS1qc29uJ10pKTtcbiAgICAgICAgZGVsZXRlIGxpc3QuZmFrZS5pbnN0YWxsZWQ7XG4gICAgICAgIGxpc3Quc2hvdWxkLmVxbChyZXQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGluc3RhbGwgYSBkcml2ZXIgZnJvbSBhIGxvY2FsIGdpdCByZXBvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFtsb2NhbEZha2VEcml2ZXJQYXRoLFxuICAgICAgICAgICctLXNvdXJjZScsICdnaXQnLCAnLS1wYWNrYWdlJywgJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LmZha2UucGtnTmFtZS5zaG91bGQuZXFsKCdAYXBwaXVtL2Zha2UtZHJpdmVyJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxUeXBlLnNob3VsZC5lcWwoJ2dpdCcpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKGxvY2FsRmFrZURyaXZlclBhdGgpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gYSByZW1vdGUgZ2l0IHJlcG8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHJldCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdpbnN0YWxsJywgWydnaXQraHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZmFrZS1kcml2ZXIuZ2l0JyxcbiAgICAgICAgICAnLS1zb3VyY2UnLCAnZ2l0JywgJy0tcGFja2FnZScsICdhcHBpdW0tZmFrZS1kcml2ZXInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LmZha2UucGtnTmFtZS5zaG91bGQuZXFsKCdhcHBpdW0tZmFrZS1kcml2ZXInKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnZ2l0Jyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxTcGVjLnNob3VsZC5lcWwoJ2dpdCtodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1mYWtlLWRyaXZlcicpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gYSBsb2NhbCBucG0gbW9kdWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICAvLyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdlIGtub3cgd2UgaGF2ZSBmYWtlIGRyaXZlciBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5IGluXG4gICAgICAgIC8vIHRoaXMgbW9kdWxlLCBzbyB3ZSBrbm93IGl0cyBsb2NhbCBwYXRoIG9uIGRpc2tcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbbG9jYWxGYWtlRHJpdmVyUGF0aCwgJy0tc291cmNlJywgJ2xvY2FsJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsVHlwZS5zaG91bGQuZXFsKCdsb2NhbCcpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKGxvY2FsRmFrZURyaXZlclBhdGgpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3VuaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdW5pbnN0YWxsIGEgZHJpdmVyIGJhc2VkIG9uIGl0cyBkcml2ZXIgbmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1zb3VyY2UnLCAnbnBtJywgJy0tanNvbiddKSk7XG4gICAgICAgIGNvbnN0IGluc3RhbGxQYXRoID0gcGF0aC5yZXNvbHZlKGFwcGl1bUhvbWUsIHJldC5mYWtlLmluc3RhbGxQYXRoKTtcbiAgICAgICAgYXdhaXQgZnMuZXhpc3RzKGluc3RhbGxQYXRoKS5zaG91bGQuZXZlbnR1YWxseS5iZS50cnVlO1xuICAgICAgICBsZXQgbGlzdCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdsaXN0JywgWyctLWluc3RhbGxlZCcsICctLWpzb24nXSkpO1xuICAgICAgICBsaXN0LmZha2UuaW5zdGFsbGVkLnNob3VsZC5iZS50cnVlO1xuICAgICAgICBjb25zdCB1bmluc3RhbGwgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bigndW5pbnN0YWxsJywgWydmYWtlJywgJy0tanNvbiddKSk7XG4gICAgICAgIHVuaW5zdGFsbC5zaG91bGQubm90LmhhdmUua2V5KCdmYWtlJyk7XG4gICAgICAgIGF3YWl0IGZzLmV4aXN0cyhpbnN0YWxsUGF0aCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUuZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBhd2FpdCBydW4oJ2luc3RhbGwnLCBbbG9jYWxGYWtlRHJpdmVyUGF0aCwgJy0tc291cmNlJywgJ2xvY2FsJywgJy0tanNvbiddKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBydW4gYSB2YWxpZCBkcml2ZXIsIHZhbGlkIHNjcmlwdCwgYW5kIHJlc3VsdCBpbiBzdWNjZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJOYW1lID0gJ2Zha2UnO1xuICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gJ2Zha2Utc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IG91dCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgc2NyaXB0TmFtZSwgJy0tanNvbiddKSk7XG4gICAgICAgIG91dC5zaG91bGQubm90LmluY2x1ZGUua2V5KCdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJ1biBhIHZhbGlkIGRyaXZlciwgdmFsaWQgZXJyb3IgcHJvbmUgc2NyaXB0LCBhbmQgcmV0dXJuIGVycm9yIGluIGpzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRyaXZlck5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGNvbnN0IG91dCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgJ2Zha2UtZXJyb3InLCAnLS1qc29uJ10pKTtcbiAgICAgICAgb3V0LnNob3VsZC5pbmNsdWRlLmtleSgnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0YWtlIGEgdmFsaWQgZHJpdmVyLCBpbnZhbGlkIHNjcmlwdCwgYW5kIHRocm93IGFuIGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJOYW1lID0gJ2Zha2UnO1xuICAgICAgICBhd2FpdCBjaGFpLmV4cGVjdChydW4oJ3J1bicsIFtkcml2ZXJOYW1lLCAnZm9vJywgJy0tanNvbiddKSkudG8uZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoRXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHRha2UgYW4gaW52YWxpZCBkcml2ZXIsIGludmFsaWQgc2NyaXB0LCBhbmQgdGhyb3cgYW4gZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRyaXZlck5hbWUgPSAnZm9vJztcbiAgICAgICAgYXdhaXQgY2hhaS5leHBlY3QocnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgJ2JhcicsICctLWpzb24nXSkpLnRvLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKEVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGx1Z2luIENMSScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWtlUGx1Z2luRGlyID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZSgnQGFwcGl1bS9mYWtlLXBsdWdpbi9wYWNrYWdlLmpzb24nKSk7XG4gICAgY29uc3QgZXh0ID0gJ3BsdWdpbic7XG4gICAgZGVzY3JpYmUoJ3J1bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGF3YWl0IHJ1bignaW5zdGFsbCcsIFtmYWtlUGx1Z2luRGlyLCAnLS1zb3VyY2UnLCAnbG9jYWwnLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJ1biBhIHZhbGlkIHBsdWdpbiwgdmFsaWQgc2NyaXB0LCBhbmQgcmVzdWx0IGluIHN1Y2Nlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAnZmFrZS1zdWNjZXNzJztcbiAgICAgICAgY29uc3Qgb3V0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ3J1bicsIFtwbHVnaW5OYW1lLCBzY3JpcHROYW1lLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKTtcbiAgICAgICAgb3V0LnNob3VsZC5ub3QuaW5jbHVkZS5rZXkoJ2Vycm9yJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgcnVuIGEgdmFsaWQgcGx1Z2luLCB2YWxpZCBlcnJvciBwcm9uZSBzY3JpcHQsIGFuZCByZXR1cm4gZXJyb3IgaW4ganNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGx1Z2luTmFtZSA9ICdmYWtlJztcbiAgICAgICAgY29uc3Qgb3V0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ3J1bicsIFtwbHVnaW5OYW1lLCAnZmFrZS1lcnJvcicsICctLWpzb24nXSwgZmFsc2UsIGV4dCkpO1xuICAgICAgICBvdXQuc2hvdWxkLmluY2x1ZGUua2V5KCdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHRha2UgYSB2YWxpZCBwbHVnaW4sIGludmFsaWQgc2NyaXB0LCBhbmQgdGhyb3cgYW4gZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGF3YWl0IGNoYWkuZXhwZWN0KHJ1bigncnVuJywgW3BsdWdpbk5hbWUsICdmb28nLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKS50by5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChFcnJvcik7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgdGFrZSBhbiBpbnZhbGlkIHBsdWdpbiwgaW52YWxpZCBzY3JpcHQsIGFuZCB0aHJvdyBhbiBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2hhaS5leHBlY3QocnVuKCdydW4nLCBbJ2ZvbycsICdiYXInLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKS50by5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL2xpYi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG4iXSwiZmlsZSI6InRlc3QvY2xpL2NsaS1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.runAppiumRaw = exports.runAppiumJson = exports.runAppium = exports.installLocalExtension = exports.EXECUTABLE = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _teen_process = require("teen_process");
15
+
16
+ var _helpers = require("../helpers");
17
+
18
+ var _path = _interopRequireDefault(require("path"));
19
+
20
+ const EXECUTABLE = _path.default.join(_helpers.PROJECT_ROOT, 'packages', 'appium', 'build', 'lib', 'main.js');
21
+
22
+ exports.EXECUTABLE = EXECUTABLE;
23
+
24
+ async function run(appiumHome, args) {
25
+ const env = {
26
+ APPIUM_HOME: appiumHome,
27
+ PATH: process.env.PATH
28
+ };
29
+
30
+ try {
31
+ return await (0, _teen_process.exec)(process.execPath, [EXECUTABLE, ...args], {
32
+ cwd: _helpers.PROJECT_ROOT,
33
+ env
34
+ });
35
+ } catch (err) {
36
+ const {
37
+ stdout,
38
+ stderr
39
+ } = err;
40
+ const runErr = Object.assign(err, {
41
+ originalMessage: err.message,
42
+ message: `${stdout.trim()}\n\n${stderr.trim()}`,
43
+ command: `${process.execPath} ${EXECUTABLE} ${args.join(' ')}`,
44
+ env,
45
+ cwd: _helpers.PROJECT_ROOT
46
+ });
47
+ throw runErr;
48
+ }
49
+ }
50
+
51
+ const runAppium = _lodash.default.curry(async (appiumHome, args) => {
52
+ const {
53
+ stdout
54
+ } = await run(appiumHome, args);
55
+ return stdout;
56
+ });
57
+
58
+ exports.runAppium = runAppium;
59
+
60
+ const runAppiumRaw = _lodash.default.curry(async (appiumHome, args) => await run(appiumHome, args));
61
+
62
+ exports.runAppiumRaw = runAppiumRaw;
63
+
64
+ const runAppiumJson = _lodash.default.curry(async (appiumHome, args) => {
65
+ if (!args.includes('--json')) {
66
+ args.push('--json');
67
+ }
68
+
69
+ const result = await runAppium(appiumHome, args);
70
+
71
+ try {
72
+ return JSON.parse(result);
73
+ } catch (err) {
74
+ err.message = `Error parsing JSON. Contents of STDOUT: ${result}`;
75
+ throw err;
76
+ }
77
+ });
78
+
79
+ exports.runAppiumJson = runAppiumJson;
80
+
81
+ const installLocalExtension = _lodash.default.curry(async (appiumHome, type, pathToExtension) => await runAppiumJson(appiumHome, [type, 'install', '--source', 'local', pathToExtension]));
82
+
83
+ exports.installLocalExtension = installLocalExtension;require('source-map-support').install();
84
+
85
+
86
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIkVYRUNVVEFCTEUiLCJwYXRoIiwiam9pbiIsIlBST0pFQ1RfUk9PVCIsInJ1biIsImFwcGl1bUhvbWUiLCJhcmdzIiwiZW52IiwiQVBQSVVNX0hPTUUiLCJQQVRIIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZXJyIiwic3Rkb3V0Iiwic3RkZXJyIiwicnVuRXJyIiwiT2JqZWN0IiwiYXNzaWduIiwib3JpZ2luYWxNZXNzYWdlIiwibWVzc2FnZSIsInRyaW0iLCJjb21tYW5kIiwicnVuQXBwaXVtIiwiXyIsImN1cnJ5IiwicnVuQXBwaXVtUmF3IiwicnVuQXBwaXVtSnNvbiIsImluY2x1ZGVzIiwicHVzaCIsInJlc3VsdCIsIkpTT04iLCJwYXJzZSIsImluc3RhbGxMb2NhbEV4dGVuc2lvbiIsInR5cGUiLCJwYXRoVG9FeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS08sTUFBTUEsVUFBVSxHQUFHQyxjQUFLQyxJQUFMLENBQ3hCQyxxQkFEd0IsRUFFeEIsVUFGd0IsRUFHeEIsUUFId0IsRUFJeEIsT0FKd0IsRUFLeEIsS0FMd0IsRUFNeEIsU0FOd0IsQ0FBbkI7Ozs7QUFpQlAsZUFBZUMsR0FBZixDQUFvQkMsVUFBcEIsRUFBZ0NDLElBQWhDLEVBQXNDO0FBQ3BDLFFBQU1DLEdBQUcsR0FBRztBQUNWQyxJQUFBQSxXQUFXLEVBQUVILFVBREg7QUFFVkksSUFBQUEsSUFBSSxFQUFFQyxPQUFPLENBQUNILEdBQVIsQ0FBWUU7QUFGUixHQUFaOztBQUlBLE1BQUk7QUFJRixXQUFPLE1BQU0sd0JBQUtDLE9BQU8sQ0FBQ0MsUUFBYixFQUF1QixDQUFDWCxVQUFELEVBQWEsR0FBR00sSUFBaEIsQ0FBdkIsRUFBOEM7QUFDekRNLE1BQUFBLEdBQUcsRUFBRVQscUJBRG9EO0FBRXpESSxNQUFBQTtBQUZ5RCxLQUE5QyxDQUFiO0FBSUQsR0FSRCxDQVFFLE9BQU9NLEdBQVAsRUFBWTtBQUNaLFVBQU07QUFBQ0MsTUFBQUEsTUFBRDtBQUFTQyxNQUFBQTtBQUFULFFBQXVERixHQUE3RDtBQUlBLFVBQU1HLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQ2JMLEdBRGEsRUFFYjtBQUNFTSxNQUFBQSxlQUFlLEVBQUVOLEdBQUcsQ0FBQ08sT0FEdkI7QUFFRUEsTUFBQUEsT0FBTyxFQUFHLEdBQUVOLE1BQU0sQ0FBQ08sSUFBUCxFQUFjLE9BQU1OLE1BQU0sQ0FBQ00sSUFBUCxFQUFjLEVBRmhEO0FBR0VDLE1BQUFBLE9BQU8sRUFBRyxHQUFFWixPQUFPLENBQUNDLFFBQVMsSUFBR1gsVUFBVyxJQUFHTSxJQUFJLENBQUNKLElBQUwsQ0FBVSxHQUFWLENBQWUsRUFIL0Q7QUFJRUssTUFBQUEsR0FKRjtBQUtFSyxNQUFBQSxHQUFHLEVBQUVUO0FBTFAsS0FGYSxDQUFmO0FBU0EsVUFBTWEsTUFBTjtBQUNEO0FBQ0Y7O0FBT00sTUFBTU8sU0FBUyxHQUFHQyxnQkFBRUMsS0FBRixDQU12QixPQUFPcEIsVUFBUCxFQUFtQkMsSUFBbkIsS0FBNEI7QUFDMUIsUUFBTTtBQUFDUSxJQUFBQTtBQUFELE1BQVcsTUFBTVYsR0FBRyxDQUFDQyxVQUFELEVBQWFDLElBQWIsQ0FBMUI7QUFDQSxTQUFPUSxNQUFQO0FBQ0QsQ0FUc0IsQ0FBbEI7Ozs7QUFnQkEsTUFBTVksWUFBWSxHQUFHRixnQkFBRUMsS0FBRixDQU0xQixPQUFPcEIsVUFBUCxFQUFtQkMsSUFBbkIsS0FBNEIsTUFBTUYsR0FBRyxDQUFDQyxVQUFELEVBQWFDLElBQWIsQ0FOWCxDQUFyQjs7OztBQWFBLE1BQU1xQixhQUFhLEdBQUdILGdCQUFFQyxLQUFGLENBTTNCLE9BQU9wQixVQUFQLEVBQW1CQyxJQUFuQixLQUE0QjtBQUMxQixNQUFJLENBQUNBLElBQUksQ0FBQ3NCLFFBQUwsQ0FBYyxRQUFkLENBQUwsRUFBOEI7QUFDNUJ0QixJQUFBQSxJQUFJLENBQUN1QixJQUFMLENBQVUsUUFBVjtBQUNEOztBQUNELFFBQU1DLE1BQU0sR0FBRyxNQUFNUCxTQUFTLENBQUNsQixVQUFELEVBQWFDLElBQWIsQ0FBOUI7O0FBQ0EsTUFBSTtBQUNGLFdBQU95QixJQUFJLENBQUNDLEtBQUwsQ0FBV0YsTUFBWCxDQUFQO0FBQ0QsR0FGRCxDQUVFLE9BQU9qQixHQUFQLEVBQVk7QUFDWkEsSUFBQUEsR0FBRyxDQUFDTyxPQUFKLEdBQWUsMkNBQTBDVSxNQUFPLEVBQWhFO0FBQ0EsVUFBTWpCLEdBQU47QUFDRDtBQUNGLENBakIwQixDQUF0Qjs7OztBQXVCQSxNQUFNb0IscUJBQXFCLEdBQUdULGdCQUFFQyxLQUFGLENBT25DLE9BQU9wQixVQUFQLEVBQW1CNkIsSUFBbkIsRUFBeUJDLGVBQXpCLEtBQ0UsTUFBTVIsYUFBYSxDQUFDdEIsVUFBRCxFQUFhLENBQzlCNkIsSUFEOEIsRUFFOUIsU0FGOEIsRUFHOUIsVUFIOEIsRUFJOUIsT0FKOEIsRUFLOUJDLGVBTDhCLENBQWIsQ0FSYyxDQUE5QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtleGVjfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtQUk9KRUNUX1JPT1R9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbi8qKlxuICogUGF0aCB0byB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZS4gU29ydCBvZi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYRUNVVEFCTEUgPSBwYXRoLmpvaW4oXG4gIFBST0pFQ1RfUk9PVCxcbiAgJ3BhY2thZ2VzJyxcbiAgJ2FwcGl1bScsXG4gICdidWlsZCcsXG4gICdsaWInLFxuICAnbWFpbi5qcycsXG4pO1xuXG4vKipcbiAqIFJ1bnMgdGhlIGBhcHBpdW1gIGV4ZWN1dGFibGUgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cbiAqXG4gKiBJZiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uemVybyBjb2RlLCB0aGUgZXJyb3Igd2lsbCBiZSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8VGVlblByb2Nlc3NFeGVjUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuIChhcHBpdW1Ib21lLCBhcmdzKSB7XG4gIGNvbnN0IGVudiA9IHtcbiAgICBBUFBJVU1fSE9NRTogYXBwaXVtSG9tZSxcbiAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICB9O1xuICB0cnkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtUZWVuUHJvY2Vzc0V4ZWNSZXN1bHR9XG4gICAgICovXG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMocHJvY2Vzcy5leGVjUGF0aCwgW0VYRUNVVEFCTEUsIC4uLmFyZ3NdLCB7XG4gICAgICBjd2Q6IFBST0pFQ1RfUk9PVCxcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IC8qKiBAdHlwZSB7VGVlblByb2Nlc3NFeGVjRXJyb3J9ICovKGVycik7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0FwcGl1bVJ1bkVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IHJ1bkVyciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBlcnIsXG4gICAgICB7XG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3N0ZG91dC50cmltKCl9XFxuXFxuJHtzdGRlcnIudHJpbSgpfWAsXG4gICAgICAgIGNvbW1hbmQ6IGAke3Byb2Nlc3MuZXhlY1BhdGh9ICR7RVhFQ1VUQUJMRX0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICBlbnYsXG4gICAgICAgIGN3ZDogUFJPSkVDVF9ST09ULFxuICAgICAgfSk7XG4gICAgdGhyb3cgcnVuRXJyO1xuICB9XG59XG5cbi8qKlxuICogUnVucyB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZSB3aXRoIHRoZSBnaXZlbiBhcmdzIGFuZCByZXR1cm5zIGNvbnRlbnRzIG9mIGBTVERPVVRgLlxuICpcbiAqIERvIG5vdCB1c2UgdGhpcyB3aGVuIHRlc3RpbmcgZXJyb3Igb3V0cHV0LCBhcyBpdCB3aWxsIGxpa2VseSBiZSBpbiBgU1RERVJSYC4gVXNlIHtAbGluayBydW5BcHBpdW1SYXd9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW0gPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBQYXRoIHRvIGBBUFBJVU1fSE9NRWBcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBDb250ZW50cyBvZiBgYFNURE9VVGBgXG4gICAqL1xuICBhc3luYyAoYXBwaXVtSG9tZSwgYXJncykgPT4ge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgcnVuKGFwcGl1bUhvbWUsIGFyZ3MpO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0sXG4pO1xuXG4vKipcbiAqIFJ1bnMgdGhlIGBhcHBpdW1gIGV4ZWN1dGFibGUgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQgcmV0dXJucyB0aGUgZW50aXJlXG4gKiB7QGxpbmsgVGVlblByb2Nlc3NFeGVjUmVzdWx0fSBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW1SYXcgPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBQYXRoIHRvIGBBUFBJVU1fSE9NRWBcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUZWVuUHJvY2Vzc0V4ZWNSZXN1bHQ+fSBSYXcgcmVzdWx0IG9mIGBleGVjYFxuICAgKi9cbiAgYXN5bmMgKGFwcGl1bUhvbWUsIGFyZ3MpID0+IGF3YWl0IHJ1bihhcHBpdW1Ib21lLCBhcmdzKSxcbik7XG5cbi8qKlxuICogUnVucyB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZSB3aXRoIHRoZSBnaXZlbiBhcmdzIGluIEpTT04gbW9kZS5cbiAqIFdpbGwgcmVqZWN0IHdpdGggdGhlIGNvbnRlbnRzIG9mIGBTVERPVVRgICh3aGljaCB3ZXJlIHRvIGJlIHBhc3JlZCkgaWYgcGFyc2luZyBpbnRvIEpTT04gZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW1Kc29uID0gXy5jdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gUGF0aCB0byBgQVBQSVVNX0hPTUVgXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBBcmdzLCBpbmNsdWRpbmcgY29tbWFuZHNcbiAgICogQHJldHVybnMge1Byb21pc2U8VGVlblByb2Nlc3NFeGVjUmVzdWx0Pn0gUmF3IHJlc3VsdCBvZiBgZXhlY2BcbiAgICovXG4gIGFzeW5jIChhcHBpdW1Ib21lLCBhcmdzKSA9PiB7XG4gICAgaWYgKCFhcmdzLmluY2x1ZGVzKCctLWpzb24nKSkge1xuICAgICAgYXJncy5wdXNoKCctLWpzb24nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQXBwaXVtKGFwcGl1bUhvbWUsIGFyZ3MpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgRXJyb3IgcGFyc2luZyBKU09OLiBDb250ZW50cyBvZiBTVERPVVQ6ICR7cmVzdWx0fWA7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9LFxuKTtcblxuLyoqXG4gKiBHaXZlbiBhIHBhdGggdG8gYSBsb2NhbCBleHRlbnNpb24sIGluc3RhbGwgaXQgaW50byBgQVBQSVVNX0hPTUVgIHZpYSBDTEkuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsTG9jYWxFeHRlbnNpb24gPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL2xpYi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFRvRXh0ZW5zaW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBhc3luYyAoYXBwaXVtSG9tZSwgdHlwZSwgcGF0aFRvRXh0ZW5zaW9uKSA9PlxuICAgIGF3YWl0IHJ1bkFwcGl1bUpzb24oYXBwaXVtSG9tZSwgW1xuICAgICAgdHlwZSxcbiAgICAgICdpbnN0YWxsJyxcbiAgICAgICctLXNvdXJjZScsXG4gICAgICAnbG9jYWwnLFxuICAgICAgcGF0aFRvRXh0ZW5zaW9uLFxuICAgIF0pLFxuKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuQXBwaXVtfS5cbiAqIEBwcml2YXRlXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSdW5BcHBpdW1PcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyYXddIC0gV2hldGhlciB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSBgdGVlbl9wcm9jZXNzYFxuICovXG5cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHdoaWNoIGV4ZWN1dGUgYGFwcGl1bWAuXG4gKiBAdHlwZWRlZiB7RXJyb3IgJiBBcHBpdW1SdW5FcnJvclByb3BzICYgaW1wb3J0KCcuLi8uLi9saWIvY2xpL25wbScpLlRlZW5Qcm9jZXNzRXhlY0Vycm9yUHJvcHN9IEFwcGl1bVJ1bkVycm9yXG4gKi9cblxuLyoqXG4gKiBXcmFwcyB0aGUgZXJyb3IgcmV0dXJuZWQgYnkge0BsaW5rIGV4ZWN9LlxuICogQHR5cGVkZWYge09iamVjdH0gQXBwaXVtUnVuRXJyb3JQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yaWdpbmFsTWVzc2FnZSAtIE9yaWdpbmFsIGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gQ29tbWFuZCB0aGF0IHdhcyBydW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnYgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjd2QgLSBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gKi9cbiJdLCJmaWxlIjoidGVzdC9jbGkvY2xpLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _extensionConfig = require("../../lib/extension-config");
8
+
9
+ var _driverConfig = _interopRequireDefault(require("../../lib/driver-config"));
10
+
11
+ var _driverCommand = _interopRequireDefault(require("../../lib/cli/driver-command"));
12
+
13
+ var _sinon = _interopRequireDefault(require("sinon"));
14
+
15
+ describe('DriverCommand', function () {
16
+ const config = new _driverConfig.default(_extensionConfig.DEFAULT_APPIUM_HOME);
17
+ const driver = 'fake';
18
+ const pkgName = '@appium/fake-driver';
19
+ config.installedExtensions = {
20
+ [driver]: {
21
+ version: '1.0.0',
22
+ pkgName
23
+ }
24
+ };
25
+ const dc = new _driverCommand.default({
26
+ config,
27
+ json: true
28
+ });
29
+ describe('#checkForExtensionUpdate', function () {
30
+ let npmMock;
31
+ beforeEach(function () {
32
+ npmMock = _sinon.default.mock(dc.npm);
33
+ });
34
+
35
+ function setupDriverUpdate(curVersion, latestVersion, latestSafeVersion) {
36
+ npmMock.expects('getLatestVersion').once().withExactArgs(pkgName).returns(latestVersion);
37
+ npmMock.expects('getLatestSafeUpgradeVersion').once().withExactArgs(pkgName, curVersion).returns(latestSafeVersion);
38
+ }
39
+
40
+ it('should not return an unsafe update if it is same as safe update', async function () {
41
+ setupDriverUpdate('1.0.0', '1.1.0', '1.1.0');
42
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
43
+ current: '1.0.0',
44
+ safeUpdate: '1.1.0',
45
+ unsafeUpdate: null
46
+ });
47
+ npmMock.verify();
48
+ });
49
+ it('should not return a safe update if there is not one', async function () {
50
+ setupDriverUpdate('1.0.0', '2.0.0', null);
51
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
52
+ current: '1.0.0',
53
+ safeUpdate: null,
54
+ unsafeUpdate: '2.0.0'
55
+ });
56
+ npmMock.verify();
57
+ });
58
+ it('should return both safe and unsafe update', async function () {
59
+ setupDriverUpdate('1.0.0', '2.0.0', '1.5.3');
60
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
61
+ current: '1.0.0',
62
+ safeUpdate: '1.5.3',
63
+ unsafeUpdate: '2.0.0'
64
+ });
65
+ npmMock.verify();
66
+ });
67
+ });
68
+ });require('source-map-support').install();
69
+
70
+
71
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImNvbmZpZyIsIkRyaXZlckNvbmZpZyIsIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJkcml2ZXIiLCJwa2dOYW1lIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsInZlcnNpb24iLCJkYyIsIkRyaXZlckNvbW1hbmQiLCJqc29uIiwibnBtTW9jayIsImJlZm9yZUVhY2giLCJzaW5vbiIsIm1vY2siLCJucG0iLCJzZXR1cERyaXZlclVwZGF0ZSIsImN1clZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwibGF0ZXN0U2FmZVZlcnNpb24iLCJleHBlY3RzIiwib25jZSIsIndpdGhFeGFjdEFyZ3MiLCJyZXR1cm5zIiwiaXQiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInNob3VsZCIsImV2ZW50dWFsbHkiLCJlcWwiLCJjdXJyZW50Iiwic2FmZVVwZGF0ZSIsInVuc2FmZVVwZGF0ZSIsInZlcmlmeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0FBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQVk7QUFDcEMsUUFBTUMsTUFBTSxHQUFHLElBQUlDLHFCQUFKLENBQWlCQyxvQ0FBakIsQ0FBZjtBQUNBLFFBQU1DLE1BQU0sR0FBRyxNQUFmO0FBQ0EsUUFBTUMsT0FBTyxHQUFHLHFCQUFoQjtBQUNBSixFQUFBQSxNQUFNLENBQUNLLG1CQUFQLEdBQTZCO0FBQUMsS0FBQ0YsTUFBRCxHQUFVO0FBQUNHLE1BQUFBLE9BQU8sRUFBRSxPQUFWO0FBQW1CRixNQUFBQTtBQUFuQjtBQUFYLEdBQTdCO0FBQ0EsUUFBTUcsRUFBRSxHQUFHLElBQUlDLHNCQUFKLENBQWtCO0FBQUNSLElBQUFBLE1BQUQ7QUFBU1MsSUFBQUEsSUFBSSxFQUFFO0FBQWYsR0FBbEIsQ0FBWDtBQUVBVixFQUFBQSxRQUFRLENBQUMsMEJBQUQsRUFBNkIsWUFBWTtBQUMvQyxRQUFJVyxPQUFKO0FBRUFDLElBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxNQUFBQSxPQUFPLEdBQUdFLGVBQU1DLElBQU4sQ0FBV04sRUFBRSxDQUFDTyxHQUFkLENBQVY7QUFDRCxLQUZTLENBQVY7O0FBSUEsYUFBU0MsaUJBQVQsQ0FBNEJDLFVBQTVCLEVBQXdDQyxhQUF4QyxFQUF1REMsaUJBQXZELEVBQTBFO0FBQ3hFUixNQUFBQSxPQUFPLENBQUNTLE9BQVIsQ0FBZ0Isa0JBQWhCLEVBQ0dDLElBREgsR0FFR0MsYUFGSCxDQUVpQmpCLE9BRmpCLEVBR0drQixPQUhILENBR1dMLGFBSFg7QUFJQVAsTUFBQUEsT0FBTyxDQUFDUyxPQUFSLENBQWdCLDZCQUFoQixFQUNHQyxJQURILEdBRUdDLGFBRkgsQ0FFaUJqQixPQUZqQixFQUUwQlksVUFGMUIsRUFHR00sT0FISCxDQUdXSixpQkFIWDtBQUlEOztBQUVESyxJQUFBQSxFQUFFLENBQUMsaUVBQUQsRUFBb0Usa0JBQWtCO0FBQ3RGUixNQUFBQSxpQkFBaUIsQ0FBQyxPQUFELEVBQVUsT0FBVixFQUFtQixPQUFuQixDQUFqQjtBQUNBLFlBQU1SLEVBQUUsQ0FBQ2lCLHVCQUFILENBQTJCLE1BQTNCLEVBQW1DQyxNQUFuQyxDQUEwQ0MsVUFBMUMsQ0FBcURDLEdBQXJELENBQXlEO0FBQzdEQyxRQUFBQSxPQUFPLEVBQUUsT0FEb0Q7QUFFN0RDLFFBQUFBLFVBQVUsRUFBRSxPQUZpRDtBQUc3REMsUUFBQUEsWUFBWSxFQUFFO0FBSCtDLE9BQXpELENBQU47QUFLQXBCLE1BQUFBLE9BQU8sQ0FBQ3FCLE1BQVI7QUFDRCxLQVJDLENBQUY7QUFVQVIsSUFBQUEsRUFBRSxDQUFDLHFEQUFELEVBQXdELGtCQUFrQjtBQUMxRVIsTUFBQUEsaUJBQWlCLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsSUFBbkIsQ0FBakI7QUFDQSxZQUFNUixFQUFFLENBQUNpQix1QkFBSCxDQUEyQixNQUEzQixFQUFtQ0MsTUFBbkMsQ0FBMENDLFVBQTFDLENBQXFEQyxHQUFyRCxDQUF5RDtBQUM3REMsUUFBQUEsT0FBTyxFQUFFLE9BRG9EO0FBRTdEQyxRQUFBQSxVQUFVLEVBQUUsSUFGaUQ7QUFHN0RDLFFBQUFBLFlBQVksRUFBRTtBQUgrQyxPQUF6RCxDQUFOO0FBS0FwQixNQUFBQSxPQUFPLENBQUNxQixNQUFSO0FBQ0QsS0FSQyxDQUFGO0FBVUFSLElBQUFBLEVBQUUsQ0FBQywyQ0FBRCxFQUE4QyxrQkFBa0I7QUFDaEVSLE1BQUFBLGlCQUFpQixDQUFDLE9BQUQsRUFBVSxPQUFWLEVBQW1CLE9BQW5CLENBQWpCO0FBQ0EsWUFBTVIsRUFBRSxDQUFDaUIsdUJBQUgsQ0FBMkIsTUFBM0IsRUFBbUNDLE1BQW5DLENBQTBDQyxVQUExQyxDQUFxREMsR0FBckQsQ0FBeUQ7QUFDN0RDLFFBQUFBLE9BQU8sRUFBRSxPQURvRDtBQUU3REMsUUFBQUEsVUFBVSxFQUFFLE9BRmlEO0FBRzdEQyxRQUFBQSxZQUFZLEVBQUU7QUFIK0MsT0FBekQsQ0FBTjtBQUtBcEIsTUFBQUEsT0FBTyxDQUFDcUIsTUFBUjtBQUNELEtBUkMsQ0FBRjtBQVNELEdBL0NPLENBQVI7QUFnREQsQ0F2RE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBERUZBVUxUX0FQUElVTV9IT01FIH0gZnJvbSAnLi4vLi4vbGliL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IERyaXZlckNvbmZpZyBmcm9tICcuLi8uLi9saWIvZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQgRHJpdmVyQ29tbWFuZCBmcm9tICcuLi8uLi9saWIvY2xpL2RyaXZlci1jb21tYW5kJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuZGVzY3JpYmUoJ0RyaXZlckNvbW1hbmQnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbmZpZyA9IG5ldyBEcml2ZXJDb25maWcoREVGQVVMVF9BUFBJVU1fSE9NRSk7XG4gIGNvbnN0IGRyaXZlciA9ICdmYWtlJztcbiAgY29uc3QgcGtnTmFtZSA9ICdAYXBwaXVtL2Zha2UtZHJpdmVyJztcbiAgY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMgPSB7W2RyaXZlcl06IHt2ZXJzaW9uOiAnMS4wLjAnLCBwa2dOYW1lfX07XG4gIGNvbnN0IGRjID0gbmV3IERyaXZlckNvbW1hbmQoe2NvbmZpZywganNvbjogdHJ1ZX0pO1xuXG4gIGRlc2NyaWJlKCcjY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5wbU1vY2s7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5wbU1vY2sgPSBzaW5vbi5tb2NrKGRjLm5wbSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzZXR1cERyaXZlclVwZGF0ZSAoY3VyVmVyc2lvbiwgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0U2FmZVZlcnNpb24pIHtcbiAgICAgIG5wbU1vY2suZXhwZWN0cygnZ2V0TGF0ZXN0VmVyc2lvbicpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLndpdGhFeGFjdEFyZ3MocGtnTmFtZSlcbiAgICAgICAgLnJldHVybnMobGF0ZXN0VmVyc2lvbik7XG4gICAgICBucG1Nb2NrLmV4cGVjdHMoJ2dldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbicpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLndpdGhFeGFjdEFyZ3MocGtnTmFtZSwgY3VyVmVyc2lvbilcbiAgICAgICAgLnJldHVybnMobGF0ZXN0U2FmZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbiB1bnNhZmUgdXBkYXRlIGlmIGl0IGlzIHNhbWUgYXMgc2FmZSB1cGRhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXR1cERyaXZlclVwZGF0ZSgnMS4wLjAnLCAnMS4xLjAnLCAnMS4xLjAnKTtcbiAgICAgIGF3YWl0IGRjLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKCdmYWtlJykuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHtcbiAgICAgICAgY3VycmVudDogJzEuMC4wJyxcbiAgICAgICAgc2FmZVVwZGF0ZTogJzEuMS4wJyxcbiAgICAgICAgdW5zYWZlVXBkYXRlOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBucG1Nb2NrLnZlcmlmeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIGEgc2FmZSB1cGRhdGUgaWYgdGhlcmUgaXMgbm90IG9uZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldHVwRHJpdmVyVXBkYXRlKCcxLjAuMCcsICcyLjAuMCcsIG51bGwpO1xuICAgICAgYXdhaXQgZGMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoJ2Zha2UnKS5zaG91bGQuZXZlbnR1YWxseS5lcWwoe1xuICAgICAgICBjdXJyZW50OiAnMS4wLjAnLFxuICAgICAgICBzYWZlVXBkYXRlOiBudWxsLFxuICAgICAgICB1bnNhZmVVcGRhdGU6ICcyLjAuMCcsXG4gICAgICB9KTtcbiAgICAgIG5wbU1vY2sudmVyaWZ5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBib3RoIHNhZmUgYW5kIHVuc2FmZSB1cGRhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXR1cERyaXZlclVwZGF0ZSgnMS4wLjAnLCAnMi4wLjAnLCAnMS41LjMnKTtcbiAgICAgIGF3YWl0IGRjLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKCdmYWtlJykuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHtcbiAgICAgICAgY3VycmVudDogJzEuMC4wJyxcbiAgICAgICAgc2FmZVVwZGF0ZTogJzEuNS4zJyxcbiAgICAgICAgdW5zYWZlVXBkYXRlOiAnMi4wLjAnLFxuICAgICAgfSk7XG4gICAgICBucG1Nb2NrLnZlcmlmeSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2NsaS9jbGktc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "test-driver",
3
+ "version": "1.0",
4
+ "private": true,
5
+ "appium": {
6
+ "driverName": "test",
7
+ "automationName": "Test",
8
+ "platformNames": [
9
+ "Test"
10
+ ],
11
+ "mainClass": "TestDriver",
12
+ "schema": {
13
+ "type": "object",
14
+ "properties": {
15
+ "mcmonkey-mcbean": {
16
+ "type": "string",
17
+ "appiumCliIgnored": true
18
+ },
19
+ "oliver-boliver": {
20
+ "type": "number",
21
+ "appiumDeprecated": true,
22
+ "description": "funkytelechy"
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _helpers = require("../helpers");
8
+
9
+ var _sinon = _interopRequireDefault(require("sinon"));
10
+
11
+ var _schema = require("../../lib/schema/schema");
12
+
13
+ const expect = chai.expect;
14
+ describe('cli/schema-args', function () {
15
+ let schemaArgs;
16
+ let sandbox;
17
+ beforeEach(function () {
18
+ sandbox = _sinon.default.createSandbox();
19
+ schemaArgs = _helpers.rewiremock.proxy(() => require('../../lib/schema/cli-args'));
20
+ });
21
+ afterEach(function () {
22
+ sandbox.restore();
23
+ });
24
+ describe('toParserArgs()', function () {
25
+ describe('when called with no parameters', function () {
26
+ beforeEach(_schema.finalizeSchema);
27
+ afterEach(_schema.resetSchema);
28
+ it('should return a Map', function () {
29
+ expect(schemaArgs.toParserArgs()).to.be.an.instanceof(Map).and.have.property('size').that.is.above(0);
30
+ });
31
+ it('should generate metavars in SCREAMING_SNAKE_CASE', function () {
32
+ const argDefs = schemaArgs.toParserArgs();
33
+ const argDefsWithMetavar = [...argDefs].filter(arg => arg[1].metavar);
34
+ expect(argDefsWithMetavar).not.to.be.empty;
35
+ expect(argDefsWithMetavar.every(arg => /[A-Z_]+/.test(arg[1].metavar))).to.be.true;
36
+ });
37
+ });
38
+ describe('when schema has not yet been compiled', function () {
39
+ it('should throw', function () {
40
+ (0, _schema.resetSchema)();
41
+ expect(() => schemaArgs.toParserArgs()).to.throw(_schema.SchemaFinalizationError);
42
+ });
43
+ });
44
+ });
45
+ });require('source-map-support').install();
46
+
47
+
48
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL3NjaGVtYS1hcmdzLXNwZWNzLmpzIl0sIm5hbWVzIjpbImV4cGVjdCIsImNoYWkiLCJkZXNjcmliZSIsInNjaGVtYUFyZ3MiLCJzYW5kYm94IiwiYmVmb3JlRWFjaCIsInNpbm9uIiwiY3JlYXRlU2FuZGJveCIsInJld2lyZW1vY2siLCJwcm94eSIsInJlcXVpcmUiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwiZmluYWxpemVTY2hlbWEiLCJyZXNldFNjaGVtYSIsIml0IiwidG9QYXJzZXJBcmdzIiwidG8iLCJiZSIsImFuIiwiaW5zdGFuY2VvZiIsIk1hcCIsImFuZCIsImhhdmUiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImFib3ZlIiwiYXJnRGVmcyIsImFyZ0RlZnNXaXRoTWV0YXZhciIsImZpbHRlciIsImFyZyIsIm1ldGF2YXIiLCJub3QiLCJlbXB0eSIsImV2ZXJ5IiwidGVzdCIsInRydWUiLCJ0aHJvdyIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUdDLElBQUksQ0FBQ0QsTUFBcEI7QUFFQUUsUUFBUSxDQUFDLGlCQUFELEVBQW9CLFlBQVk7QUFFdEMsTUFBSUMsVUFBSjtBQUtBLE1BQUlDLE9BQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQVk7QUFDckJELElBQUFBLE9BQU8sR0FBR0UsZUFBTUMsYUFBTixFQUFWO0FBQ0FKLElBQUFBLFVBQVUsR0FBR0ssb0JBQVdDLEtBQVgsQ0FBaUIsTUFBTUMsT0FBTyxDQUFDLDJCQUFELENBQTlCLENBQWI7QUFDRCxHQUhTLENBQVY7QUFLQUMsRUFBQUEsU0FBUyxDQUFDLFlBQVk7QUFDcEJQLElBQUFBLE9BQU8sQ0FBQ1EsT0FBUjtBQUNELEdBRlEsQ0FBVDtBQUlBVixFQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUNyQ0EsSUFBQUEsUUFBUSxDQUFDLGdDQUFELEVBQW1DLFlBQVk7QUFDckRHLE1BQUFBLFVBQVUsQ0FBQ1Esc0JBQUQsQ0FBVjtBQUVBRixNQUFBQSxTQUFTLENBQUNHLG1CQUFELENBQVQ7QUFFQUMsTUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQVk7QUFDcENmLFFBQUFBLE1BQU0sQ0FBQ0csVUFBVSxDQUFDYSxZQUFYLEVBQUQsQ0FBTixDQUFrQ0MsRUFBbEMsQ0FBcUNDLEVBQXJDLENBQXdDQyxFQUF4QyxDQUEyQ0MsVUFBM0MsQ0FBc0RDLEdBQXRELEVBQTJEQyxHQUEzRCxDQUErREMsSUFBL0QsQ0FBb0VDLFFBQXBFLENBQTZFLE1BQTdFLEVBQXFGQyxJQUFyRixDQUEwRkMsRUFBMUYsQ0FBNkZDLEtBQTdGLENBQW1HLENBQW5HO0FBQ0QsT0FGQyxDQUFGO0FBSUFaLE1BQUFBLEVBQUUsQ0FBQyxrREFBRCxFQUFxRCxZQUFZO0FBQ2pFLGNBQU1hLE9BQU8sR0FBR3pCLFVBQVUsQ0FBQ2EsWUFBWCxFQUFoQjtBQUNBLGNBQU1hLGtCQUFrQixHQUFHLENBQUMsR0FBR0QsT0FBSixFQUFhRSxNQUFiLENBQXFCQyxHQUFELElBQVNBLEdBQUcsQ0FBQyxDQUFELENBQUgsQ0FBT0MsT0FBcEMsQ0FBM0I7QUFDQWhDLFFBQUFBLE1BQU0sQ0FBQzZCLGtCQUFELENBQU4sQ0FBMkJJLEdBQTNCLENBQStCaEIsRUFBL0IsQ0FBa0NDLEVBQWxDLENBQXFDZ0IsS0FBckM7QUFFQWxDLFFBQUFBLE1BQU0sQ0FDSjZCLGtCQUFrQixDQUFDTSxLQUFuQixDQUEwQkosR0FBRCxJQUFTLFVBQVVLLElBQVYsQ0FBZUwsR0FBRyxDQUFDLENBQUQsQ0FBSCxDQUFPQyxPQUF0QixDQUFsQyxDQURJLENBQU4sQ0FFRWYsRUFGRixDQUVLQyxFQUZMLENBRVFtQixJQUZSO0FBR0QsT0FSQyxDQUFGO0FBU0QsS0FsQk8sQ0FBUjtBQW9CQW5DLElBQUFBLFFBQVEsQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQzVEYSxNQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQzdCO0FBQ0FmLFFBQUFBLE1BQU0sQ0FBQyxNQUFNRyxVQUFVLENBQUNhLFlBQVgsRUFBUCxDQUFOLENBQXdDQyxFQUF4QyxDQUEyQ3FCLEtBQTNDLENBQ0VDLCtCQURGO0FBR0QsT0FMQyxDQUFGO0FBTUQsS0FQTyxDQUFSO0FBUUQsR0E3Qk8sQ0FBUjtBQThCRCxDQWhETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtyZXdpcmVtb2NrfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQge2ZpbmFsaXplU2NoZW1hLCByZXNldFNjaGVtYSwgU2NoZW1hRmluYWxpemF0aW9uRXJyb3J9IGZyb20gJy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmRlc2NyaWJlKCdjbGkvc2NoZW1hLWFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi9saWIvc2NoZW1hL2NsaS1hcmdzJyl9ICovXG4gIGxldCBzY2hlbWFBcmdzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU2FuZGJveH1cbiAgICovXG4gIGxldCBzYW5kYm94O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgc2NoZW1hQXJncyA9IHJld2lyZW1vY2sucHJveHkoKCkgPT4gcmVxdWlyZSgnLi4vLi4vbGliL3NjaGVtYS9jbGktYXJncycpKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvUGFyc2VyQXJncygpJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCd3aGVuIGNhbGxlZCB3aXRoIG5vIHBhcmFtZXRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmVFYWNoKGZpbmFsaXplU2NoZW1hKTtcblxuICAgICAgYWZ0ZXJFYWNoKHJlc2V0U2NoZW1hKTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBNYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChzY2hlbWFBcmdzLnRvUGFyc2VyQXJncygpKS50by5iZS5hbi5pbnN0YW5jZW9mKE1hcCkuYW5kLmhhdmUucHJvcGVydHkoJ3NpemUnKS50aGF0LmlzLmFib3ZlKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbWV0YXZhcnMgaW4gU0NSRUFNSU5HX1NOQUtFX0NBU0UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ0RlZnMgPSBzY2hlbWFBcmdzLnRvUGFyc2VyQXJncygpO1xuICAgICAgICBjb25zdCBhcmdEZWZzV2l0aE1ldGF2YXIgPSBbLi4uYXJnRGVmc10uZmlsdGVyKChhcmcpID0+IGFyZ1sxXS5tZXRhdmFyKTtcbiAgICAgICAgZXhwZWN0KGFyZ0RlZnNXaXRoTWV0YXZhcikubm90LnRvLmJlLmVtcHR5O1xuICAgICAgICAvLyBpcyB0aGVyZSBhIG1vcmUgaWRpb21hdGljIHdheSB0byBkbyB0aGlzP1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgYXJnRGVmc1dpdGhNZXRhdmFyLmV2ZXJ5KChhcmcpID0+IC9bQS1aX10rLy50ZXN0KGFyZ1sxXS5tZXRhdmFyKSksXG4gICAgICAgICkudG8uYmUudHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gc2NoZW1hIGhhcyBub3QgeWV0IGJlZW4gY29tcGlsZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNldFNjaGVtYSgpO1xuICAgICAgICBleHBlY3QoKCkgPT4gc2NoZW1hQXJncy50b1BhcnNlckFyZ3MoKSkudG8udGhyb3coXG4gICAgICAgICAgU2NoZW1hRmluYWxpemF0aW9uRXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2NsaS9zY2hlbWEtYXJncy1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _path = _interopRequireDefault(require("path"));
8
+
9
+ var _support = require("@appium/support");
10
+
11
+ var _cliHelpers = require("./cli-helpers");
12
+
13
+ const {
14
+ expect
15
+ } = chai;
16
+ describe('CLI behavior controlled by schema', function () {
17
+ let appiumHome;
18
+ before(async function () {
19
+ appiumHome = await _support.tempDir.openDir();
20
+ });
21
+ after(async function () {
22
+ await _support.fs.rimraf(appiumHome);
23
+ });
24
+ describe('keyword', function () {
25
+ let help;
26
+ before(async function () {
27
+ await (0, _cliHelpers.installLocalExtension)(appiumHome, 'driver', _path.default.join(__dirname, 'fixtures', 'test-driver'));
28
+ help = await (0, _cliHelpers.runAppium)(appiumHome, ['server', '--help']);
29
+ });
30
+ describe('appiumCliIgnored', function () {
31
+ it('should still support arguments without this keyword', function () {
32
+ expect(help).to.match(/oliver-boliver/);
33
+ });
34
+ it('should cause the argument to be suppressed', function () {
35
+ expect(help).not.to.match(/mcmonkey-mcbean/);
36
+ });
37
+ });
38
+ describe('appiumDeprecated', function () {
39
+ it('should mark the argument as deprecated', function () {
40
+ expect(help).to.match(/\[DEPRECATED\] funkytelechy/);
41
+ });
42
+ });
43
+ });
44
+ });require('source-map-support').install();
45
+
46
+
47
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL3NjaGVtYS1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsImRlc2NyaWJlIiwiYXBwaXVtSG9tZSIsImJlZm9yZSIsInRlbXBEaXIiLCJvcGVuRGlyIiwiYWZ0ZXIiLCJmcyIsInJpbXJhZiIsImhlbHAiLCJwYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIml0IiwidG8iLCJtYXRjaCIsIm5vdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTTtBQUFDQSxFQUFBQTtBQUFELElBQVdDLElBQWpCO0FBRUFDLFFBQVEsQ0FBQyxtQ0FBRCxFQUFzQyxZQUFZO0FBSXhELE1BQUlDLFVBQUo7QUFFQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkQsSUFBQUEsVUFBVSxHQUFHLE1BQU1FLGlCQUFRQyxPQUFSLEVBQW5CO0FBQ0QsR0FGSyxDQUFOO0FBSUFDLEVBQUFBLEtBQUssQ0FBQyxrQkFBa0I7QUFDdEIsVUFBTUMsWUFBR0MsTUFBSCxDQUFVTixVQUFWLENBQU47QUFDRCxHQUZJLENBQUw7QUFJQUQsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFZO0FBSTlCLFFBQUlRLElBQUo7QUFFQU4sSUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QixZQUFNLHVDQUNKRCxVQURJLEVBRUosUUFGSSxFQUdKUSxjQUFLQyxJQUFMLENBQVVDLFNBQVYsRUFBcUIsVUFBckIsRUFBaUMsYUFBakMsQ0FISSxDQUFOO0FBS0FILE1BQUFBLElBQUksR0FBRyxNQUFNLDJCQUFVUCxVQUFWLEVBQXNCLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBdEIsQ0FBYjtBQUNELEtBUEssQ0FBTjtBQVNBRCxJQUFBQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtBQUN2Q1ksTUFBQUEsRUFBRSxDQUFDLHFEQUFELEVBQXdELFlBQVk7QUFDcEVkLFFBQUFBLE1BQU0sQ0FBQ1UsSUFBRCxDQUFOLENBQWFLLEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLGdCQUF0QjtBQUNELE9BRkMsQ0FBRjtBQUlBRixNQUFBQSxFQUFFLENBQUMsNENBQUQsRUFBK0MsWUFBWTtBQUMzRGQsUUFBQUEsTUFBTSxDQUFDVSxJQUFELENBQU4sQ0FBYU8sR0FBYixDQUFpQkYsRUFBakIsQ0FBb0JDLEtBQXBCLENBQTBCLGlCQUExQjtBQUNELE9BRkMsQ0FBRjtBQUdELEtBUk8sQ0FBUjtBQVVBZCxJQUFBQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtBQUN2Q1ksTUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLFlBQVk7QUFDdkRkLFFBQUFBLE1BQU0sQ0FBQ1UsSUFBRCxDQUFOLENBQWFLLEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLDZCQUF0QjtBQUNELE9BRkMsQ0FBRjtBQUdELEtBSk8sQ0FBUjtBQUtELEdBOUJPLENBQVI7QUErQkQsQ0E3Q08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge2ZzLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtpbnN0YWxsTG9jYWxFeHRlbnNpb24sIHJ1bkFwcGl1bX0gZnJvbSAnLi9jbGktaGVscGVycyc7XG5cbmNvbnN0IHtleHBlY3R9ID0gY2hhaTtcblxuZGVzY3JpYmUoJ0NMSSBiZWhhdmlvciBjb250cm9sbGVkIGJ5IHNjaGVtYScsIGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBsZXQgYXBwaXVtSG9tZTtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGFwcGl1bUhvbWUgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgfSk7XG5cbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihhcHBpdW1Ib21lKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2tleXdvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgaGVscDtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBpbnN0YWxsTG9jYWxFeHRlbnNpb24oXG4gICAgICAgIGFwcGl1bUhvbWUsXG4gICAgICAgICdkcml2ZXInLFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnZml4dHVyZXMnLCAndGVzdC1kcml2ZXInKSxcbiAgICAgICk7XG4gICAgICBoZWxwID0gYXdhaXQgcnVuQXBwaXVtKGFwcGl1bUhvbWUsIFsnc2VydmVyJywgJy0taGVscCddKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdhcHBpdW1DbGlJZ25vcmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzdGlsbCBzdXBwb3J0IGFyZ3VtZW50cyB3aXRob3V0IHRoaXMga2V5d29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGhlbHApLnRvLm1hdGNoKC9vbGl2ZXItYm9saXZlci8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2F1c2UgdGhlIGFyZ3VtZW50IHRvIGJlIHN1cHByZXNzZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChoZWxwKS5ub3QudG8ubWF0Y2goL21jbW9ua2V5LW1jYmVhbi8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnYXBwaXVtRGVwcmVjYXRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgbWFyayB0aGUgYXJndW1lbnQgYXMgZGVwcmVjYXRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGhlbHApLnRvLm1hdGNoKC9cXFtERVBSRUNBVEVEXFxdIGZ1bmt5dGVsZWNoeS8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY2xpL3NjaGVtYS1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==