appium 2.0.0-beta.21 → 2.0.0-beta.22

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 (75) hide show
  1. package/LICENSE +201 -0
  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/cli/parser.js +6 -2
  7. package/build/lib/config.js +1 -28
  8. package/build/lib/main.js +1 -1
  9. package/build/lib/plugin-config.js +2 -2
  10. package/build/lib/schema/appium-config-schema.js +3 -2
  11. package/build/lib/schema/arg-spec.js +1 -1
  12. package/build/lib/schema/cli-args.js +20 -5
  13. package/build/lib/schema/keywords.js +14 -4
  14. package/build/postinstall.js +90 -0
  15. package/build/test/cli/cli-e2e-specs.js +221 -0
  16. package/build/test/cli/cli-helpers.js +86 -0
  17. package/build/test/cli/cli-specs.js +71 -0
  18. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  19. package/build/test/cli/schema-args-specs.js +48 -0
  20. package/build/test/cli/schema-e2e-specs.js +47 -0
  21. package/build/test/config-e2e-specs.js +112 -0
  22. package/build/test/config-file-e2e-specs.js +209 -0
  23. package/build/test/config-file-specs.js +281 -0
  24. package/build/test/config-specs.js +159 -0
  25. package/build/test/driver-e2e-specs.js +435 -0
  26. package/build/test/driver-specs.js +321 -0
  27. package/build/test/ext-config-io-specs.js +181 -0
  28. package/build/test/extension-config-specs.js +365 -0
  29. package/build/test/fixtures/allow-feat.txt +5 -0
  30. package/build/test/fixtures/caps.json +3 -0
  31. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  32. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  33. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  34. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  35. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  36. package/build/test/fixtures/config/appium.config.good.js +40 -0
  37. package/build/test/fixtures/config/appium.config.good.json +33 -0
  38. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  39. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  40. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  41. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  42. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  43. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  44. package/build/test/fixtures/config/nodeconfig.json +3 -0
  45. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  46. package/build/test/fixtures/default-args.js +35 -0
  47. package/build/test/fixtures/deny-feat.txt +5 -0
  48. package/build/test/fixtures/driver.schema.js +20 -0
  49. package/build/test/fixtures/extensions.yaml +27 -0
  50. package/build/test/fixtures/flattened-schema.js +504 -0
  51. package/build/test/fixtures/plugin.schema.js +20 -0
  52. package/build/test/fixtures/schema-with-extensions.js +28 -0
  53. package/build/test/grid-register-specs.js +74 -0
  54. package/build/test/helpers.js +75 -0
  55. package/build/test/logger-specs.js +76 -0
  56. package/build/test/npm-specs.js +20 -0
  57. package/build/test/parser-specs.js +314 -0
  58. package/build/test/plugin-e2e-specs.js +316 -0
  59. package/build/test/schema/arg-spec-specs.js +70 -0
  60. package/build/test/schema/cli-args-specs.js +431 -0
  61. package/build/test/schema/schema-specs.js +389 -0
  62. package/build/test/utils-specs.js +266 -0
  63. package/index.js +11 -0
  64. package/lib/appium-config.schema.json +2 -1
  65. package/lib/cli/parser.js +4 -1
  66. package/lib/config.js +1 -27
  67. package/lib/main.js +6 -3
  68. package/lib/plugin-config.js +1 -1
  69. package/lib/schema/appium-config-schema.js +1 -0
  70. package/lib/schema/arg-spec.js +4 -0
  71. package/lib/schema/cli-args.js +16 -4
  72. package/lib/schema/keywords.js +20 -4
  73. package/package.json +9 -14
  74. package/build/lib/cli/argparse-actions.js +0 -104
  75. package/lib/cli/argparse-actions.js +0 -77
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _utils = require("../lib/utils");
8
+
9
+ var _helpers = require("./helpers");
10
+
11
+ var _lodash = _interopRequireDefault(require("lodash"));
12
+
13
+ describe('utils', function () {
14
+ describe('parseCapsForInnerDriver()', function () {
15
+ it('should return an error if only JSONWP provided', function () {
16
+ let {
17
+ error,
18
+ protocol
19
+ } = (0, _utils.parseCapsForInnerDriver)(_helpers.BASE_CAPS);
20
+ protocol.should.equal('W3C');
21
+ error.message.should.match(/W3C/);
22
+ });
23
+ it('should return W3C caps unchanged if only W3C caps were provided', function () {
24
+ let {
25
+ desiredCaps,
26
+ processedJsonwpCapabilities,
27
+ processedW3CCapabilities,
28
+ protocol
29
+ } = (0, _utils.parseCapsForInnerDriver)(undefined, _helpers.W3C_CAPS);
30
+ desiredCaps.should.deep.equal(_helpers.BASE_CAPS);
31
+ should.not.exist(processedJsonwpCapabilities);
32
+ processedW3CCapabilities.should.deep.equal(_helpers.W3C_CAPS);
33
+ protocol.should.equal('W3C');
34
+ });
35
+ it('should return JSONWP and W3C caps if both were provided', function () {
36
+ let {
37
+ desiredCaps,
38
+ processedJsonwpCapabilities,
39
+ processedW3CCapabilities,
40
+ protocol
41
+ } = (0, _utils.parseCapsForInnerDriver)(_helpers.BASE_CAPS, _helpers.W3C_CAPS);
42
+ desiredCaps.should.deep.equal(_helpers.BASE_CAPS);
43
+ processedJsonwpCapabilities.should.deep.equal(_helpers.BASE_CAPS);
44
+ processedW3CCapabilities.should.deep.equal(_helpers.W3C_CAPS);
45
+ protocol.should.equal('W3C');
46
+ });
47
+ it('should include default capabilities in results', function () {
48
+ const defaultW3CCaps = {
49
+ 'appium:foo': 'bar',
50
+ 'appium:baz': 'bla'
51
+ };
52
+ const expectedDefaultCaps = {
53
+ foo: 'bar',
54
+ baz: 'bla'
55
+ };
56
+ const {
57
+ desiredCaps,
58
+ processedJsonwpCapabilities,
59
+ processedW3CCapabilities
60
+ } = (0, _utils.parseCapsForInnerDriver)(_helpers.BASE_CAPS, _helpers.W3C_CAPS, {}, defaultW3CCaps);
61
+ desiredCaps.should.deep.equal({ ...expectedDefaultCaps,
62
+ ..._helpers.BASE_CAPS
63
+ });
64
+ processedJsonwpCapabilities.should.deep.equal({ ...expectedDefaultCaps,
65
+ ..._helpers.BASE_CAPS
66
+ });
67
+ processedW3CCapabilities.alwaysMatch.should.deep.equal({ ...(0, _utils.insertAppiumPrefixes)(expectedDefaultCaps),
68
+ ...(0, _utils.insertAppiumPrefixes)(_helpers.BASE_CAPS)
69
+ });
70
+ });
71
+ it('should allow valid default capabilities', function () {
72
+ const res = (0, _utils.parseCapsForInnerDriver)(null, _helpers.W3C_CAPS, {}, {
73
+ 'appium:foo': 'bar2'
74
+ });
75
+ res.processedW3CCapabilities.alwaysMatch['appium:foo'].should.eql('bar2');
76
+ });
77
+ it('should not allow invalid default capabilities', function () {
78
+ const res = (0, _utils.parseCapsForInnerDriver)(null, _helpers.W3C_CAPS, {}, {
79
+ foo: 'bar',
80
+ 'appium:foo2': 'bar2'
81
+ });
82
+ res.error.should.eql({
83
+ jsonwpCode: 61,
84
+ error: 'invalid argument',
85
+ w3cStatus: 400,
86
+ _stacktrace: null
87
+ });
88
+ });
89
+ it('should reject if W3C caps are not passing constraints', function () {
90
+ const err = (0, _utils.parseCapsForInnerDriver)(undefined, _helpers.W3C_CAPS, {
91
+ hello: {
92
+ presence: true
93
+ }
94
+ }).error;
95
+ err.message.should.match(/'hello' can't be blank/);
96
+ _lodash.default.isError(err).should.be.true;
97
+ });
98
+ it('should only accept W3C caps that have passing constraints', function () {
99
+ let w3cCaps = { ..._helpers.W3C_CAPS,
100
+ firstMatch: [{
101
+ foo: 'bar'
102
+ }, {
103
+ 'appium:hello': 'world'
104
+ }]
105
+ };
106
+ (0, _utils.parseCapsForInnerDriver)(_helpers.BASE_CAPS, w3cCaps, {
107
+ hello: {
108
+ presence: true
109
+ }
110
+ }).error.should.eql({
111
+ jsonwpCode: 61,
112
+ error: 'invalid argument',
113
+ w3cStatus: 400,
114
+ _stacktrace: null
115
+ });
116
+ });
117
+ it('should add appium prefixes to W3C caps that are not standard in W3C', function () {
118
+ (0, _utils.parseCapsForInnerDriver)(undefined, {
119
+ alwaysMatch: {
120
+ platformName: 'Fake',
121
+ propertyName: 'PROP_NAME'
122
+ }
123
+ }).error.error.should.includes('invalid argument');
124
+ });
125
+ });
126
+ describe('removeAppiumPrefixes()', function () {
127
+ it('should remove appium prefixes from cap names', function () {
128
+ (0, _utils.removeAppiumPrefixes)({
129
+ 'appium:cap1': 'value1',
130
+ 'ms:cap2': 'value2',
131
+ someCap: 'someCap'
132
+ }).should.eql({
133
+ 'cap1': 'value1',
134
+ 'ms:cap2': 'value2',
135
+ someCap: 'someCap'
136
+ });
137
+ });
138
+ });
139
+ describe('insertAppiumPrefixes()', function () {
140
+ it('should apply prefixes to non-standard capabilities', function () {
141
+ (0, _utils.insertAppiumPrefixes)({
142
+ someCap: 'someCap'
143
+ }).should.deep.equal({
144
+ 'appium:someCap': 'someCap'
145
+ });
146
+ });
147
+ it('should not apply prefixes to standard capabilities', function () {
148
+ (0, _utils.insertAppiumPrefixes)({
149
+ browserName: 'BrowserName',
150
+ platformName: 'PlatformName'
151
+ }).should.deep.equal({
152
+ browserName: 'BrowserName',
153
+ platformName: 'PlatformName'
154
+ });
155
+ });
156
+ it('should not apply prefixes to capabilities that already have a prefix', function () {
157
+ (0, _utils.insertAppiumPrefixes)({
158
+ 'appium:someCap': 'someCap',
159
+ 'moz:someOtherCap': 'someOtherCap'
160
+ }).should.deep.equal({
161
+ 'appium:someCap': 'someCap',
162
+ 'moz:someOtherCap': 'someOtherCap'
163
+ });
164
+ });
165
+ it('should apply prefixes to non-prefixed, non-standard capabilities; should not apply prefixes to any other capabilities', function () {
166
+ (0, _utils.insertAppiumPrefixes)({
167
+ 'appium:someCap': 'someCap',
168
+ 'moz:someOtherCap': 'someOtherCap',
169
+ browserName: 'BrowserName',
170
+ platformName: 'PlatformName',
171
+ someOtherCap: 'someOtherCap',
172
+ yetAnotherCap: 'yetAnotherCap'
173
+ }).should.deep.equal({
174
+ 'appium:someCap': 'someCap',
175
+ 'moz:someOtherCap': 'someOtherCap',
176
+ browserName: 'BrowserName',
177
+ platformName: 'PlatformName',
178
+ 'appium:someOtherCap': 'someOtherCap',
179
+ 'appium:yetAnotherCap': 'yetAnotherCap'
180
+ });
181
+ });
182
+ });
183
+ describe('pullSettings()', function () {
184
+ it('should pull settings from caps', function () {
185
+ const caps = {
186
+ platformName: 'foo',
187
+ browserName: 'bar',
188
+ 'settings[settingName]': 'baz',
189
+ 'settings[settingName2]': 'baz2'
190
+ };
191
+ const settings = (0, _utils.pullSettings)(caps);
192
+ settings.should.eql({
193
+ settingName: 'baz',
194
+ settingName2: 'baz2'
195
+ });
196
+ caps.should.eql({
197
+ platformName: 'foo',
198
+ browserName: 'bar'
199
+ });
200
+ });
201
+ it('should pull settings dict if object values are present in caps', function () {
202
+ const caps = {
203
+ platformName: 'foo',
204
+ browserName: 'bar',
205
+ 'settings[settingName]': {
206
+ key: 'baz'
207
+ }
208
+ };
209
+ const settings = (0, _utils.pullSettings)(caps);
210
+ settings.should.eql({
211
+ settingName: {
212
+ key: 'baz'
213
+ }
214
+ });
215
+ caps.should.eql({
216
+ platformName: 'foo',
217
+ browserName: 'bar'
218
+ });
219
+ });
220
+ it('should pull empty dict if no settings are present in caps', function () {
221
+ const caps = {
222
+ platformName: 'foo',
223
+ browserName: 'bar',
224
+ 'setting[settingName]': 'baz'
225
+ };
226
+ const settings = (0, _utils.pullSettings)(caps);
227
+ settings.should.eql({});
228
+ caps.should.eql({
229
+ platformName: 'foo',
230
+ browserName: 'bar',
231
+ 'setting[settingName]': 'baz'
232
+ });
233
+ });
234
+ it('should pull empty dict if caps are empty', function () {
235
+ const caps = {};
236
+ const settings = (0, _utils.pullSettings)(caps);
237
+ settings.should.eql({});
238
+ caps.should.eql({});
239
+ });
240
+ });
241
+ describe('ReadonlyMap', function () {
242
+ it('should allow writing', function () {
243
+ const map = new _utils.ReadonlyMap();
244
+ (() => map.set('foo', 'bar')).should.not.throw();
245
+ });
246
+ it('should allow reading', function () {
247
+ const map = new _utils.ReadonlyMap([['foo', 'bar']]);
248
+ (() => map.get('foo')).should.not.throw();
249
+ });
250
+ it('should not allow deletion', function () {
251
+ const map = new _utils.ReadonlyMap([['foo', 'bar']]);
252
+ (() => map.delete('foo')).should.throw();
253
+ });
254
+ it('should not allow clearing', function () {
255
+ const map = new _utils.ReadonlyMap([['foo', 'bar']]);
256
+ (() => map.clear()).should.throw();
257
+ });
258
+ it('should not allow updating', function () {
259
+ const map = new _utils.ReadonlyMap([['foo', 'bar']]);
260
+ (() => map.set('foo', 'baz')).should.throw();
261
+ });
262
+ });
263
+ });require('source-map-support').install();
264
+
265
+
266
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdXRpbHMtc3BlY3MuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJpdCIsImVycm9yIiwicHJvdG9jb2wiLCJCQVNFX0NBUFMiLCJzaG91bGQiLCJlcXVhbCIsIm1lc3NhZ2UiLCJtYXRjaCIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwidW5kZWZpbmVkIiwiVzNDX0NBUFMiLCJkZWVwIiwibm90IiwiZXhpc3QiLCJkZWZhdWx0VzNDQ2FwcyIsImV4cGVjdGVkRGVmYXVsdENhcHMiLCJmb28iLCJiYXoiLCJhbHdheXNNYXRjaCIsInJlcyIsImVxbCIsImpzb253cENvZGUiLCJ3M2NTdGF0dXMiLCJfc3RhY2t0cmFjZSIsImVyciIsImhlbGxvIiwicHJlc2VuY2UiLCJfIiwiaXNFcnJvciIsImJlIiwidHJ1ZSIsInczY0NhcHMiLCJmaXJzdE1hdGNoIiwicGxhdGZvcm1OYW1lIiwicHJvcGVydHlOYW1lIiwiaW5jbHVkZXMiLCJzb21lQ2FwIiwiYnJvd3Nlck5hbWUiLCJzb21lT3RoZXJDYXAiLCJ5ZXRBbm90aGVyQ2FwIiwiY2FwcyIsInNldHRpbmdzIiwic2V0dGluZ05hbWUiLCJzZXR0aW5nTmFtZTIiLCJrZXkiLCJtYXAiLCJSZWFkb25seU1hcCIsInNldCIsInRocm93IiwiZ2V0IiwiZGVsZXRlIiwiY2xlYXIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUlBOztBQUNBOztBQUVBQSxRQUFRLENBQUMsT0FBRCxFQUFVLFlBQVk7QUFDNUJBLEVBQUFBLFFBQVEsQ0FBQywyQkFBRCxFQUE4QixZQUFZO0FBQ2hEQyxJQUFBQSxFQUFFLENBQUMsZ0RBQUQsRUFBbUQsWUFBWTtBQUMvRCxVQUFJO0FBQUNDLFFBQUFBLEtBQUQ7QUFBUUMsUUFBQUE7QUFBUixVQUFvQixvQ0FBd0JDLGtCQUF4QixDQUF4QjtBQUNBRCxNQUFBQSxRQUFRLENBQUNFLE1BQVQsQ0FB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QWUsS0FBZixDQUFQLEVBQThCN0MsTUFBOUIsQ0FBcUM4QyxLQUFyQztBQUNELEtBSEMsQ0FBRjtBQUlELEdBMUJPLENBQVI7QUEyQkQsQ0F2T08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBpbnNlcnRBcHBpdW1QcmVmaXhlcywgcHVsbFNldHRpbmdzLFxuICByZW1vdmVBcHBpdW1QcmVmaXhlcywgUmVhZG9ubHlNYXBcbn0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IEJBU0VfQ0FQUywgVzNDX0NBUFMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZGVzY3JpYmUoJ3V0aWxzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgncGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiBvbmx5IEpTT05XUCBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCB7ZXJyb3IsIHByb3RvY29sfSA9IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyKEJBU0VfQ0FQUyk7XG4gICAgICBwcm90b2NvbC5zaG91bGQuZXF1YWwoJ1czQycpO1xuICAgICAgZXJyb3IubWVzc2FnZS5zaG91bGQubWF0Y2goL1czQy8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIFczQyBjYXBzIHVuY2hhbmdlZCBpZiBvbmx5IFczQyBjYXBzIHdlcmUgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9ID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIodW5kZWZpbmVkLCBXM0NfQ0FQUyk7XG4gICAgICBkZXNpcmVkQ2Fwcy5zaG91bGQuZGVlcC5lcXVhbChCQVNFX0NBUFMpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMpO1xuICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLnNob3VsZC5kZWVwLmVxdWFsKFczQ19DQVBTKTtcbiAgICAgIHByb3RvY29sLnNob3VsZC5lcXVhbCgnVzNDJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gSlNPTldQIGFuZCBXM0MgY2FwcyBpZiBib3RoIHdlcmUgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9ID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoQkFTRV9DQVBTLCBXM0NfQ0FQUyk7XG4gICAgICBkZXNpcmVkQ2Fwcy5zaG91bGQuZGVlcC5lcXVhbChCQVNFX0NBUFMpO1xuICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLnNob3VsZC5kZWVwLmVxdWFsKEJBU0VfQ0FQUyk7XG4gICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMuc2hvdWxkLmRlZXAuZXF1YWwoVzNDX0NBUFMpO1xuICAgICAgcHJvdG9jb2wuc2hvdWxkLmVxdWFsKCdXM0MnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgZGVmYXVsdCBjYXBhYmlsaXRpZXMgaW4gcmVzdWx0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXM0NDYXBzID0ge1xuICAgICAgICAnYXBwaXVtOmZvbyc6ICdiYXInLFxuICAgICAgICAnYXBwaXVtOmJheic6ICdibGEnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkRGVmYXVsdENhcHMgPSB7XG4gICAgICAgIGZvbzogJ2JhcicsXG4gICAgICAgIGJhejogJ2JsYScsXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBkZXNpcmVkQ2FwcyxcbiAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXNcbiAgICAgIH0gPSBwYXJzZUNhcHNGb3JJbm5lckRyaXZlcihCQVNFX0NBUFMsIFczQ19DQVBTLCB7fSwgZGVmYXVsdFczQ0NhcHMpO1xuICAgICAgZGVzaXJlZENhcHMuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAuLi5leHBlY3RlZERlZmF1bHRDYXBzLFxuICAgICAgICAuLi5CQVNFX0NBUFMsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcy5zaG91bGQuZGVlcC5lcXVhbCh7XG4gICAgICAgIC4uLmV4cGVjdGVkRGVmYXVsdENhcHMsXG4gICAgICAgIC4uLkJBU0VfQ0FQU1xuICAgICAgfSk7XG4gICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2guc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAuLi5pbnNlcnRBcHBpdW1QcmVmaXhlcyhleHBlY3RlZERlZmF1bHRDYXBzKSxcbiAgICAgICAgLi4uaW5zZXJ0QXBwaXVtUHJlZml4ZXMoQkFTRV9DQVBTKVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyB2YWxpZCBkZWZhdWx0IGNhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyKG51bGwsIFczQ19DQVBTLCB7fSwge1xuICAgICAgICAnYXBwaXVtOmZvbyc6ICdiYXIyJyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaFsnYXBwaXVtOmZvbyddLnNob3VsZC5lcWwoJ2JhcjInKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBpbnZhbGlkIGRlZmF1bHQgY2FwYWJpbGl0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIobnVsbCwgVzNDX0NBUFMsIHt9LCB7XG4gICAgICAgIGZvbzogJ2JhcicsICdhcHBpdW06Zm9vMic6ICdiYXIyJyxcbiAgICAgIH0pO1xuICAgICAgcmVzLmVycm9yLnNob3VsZC5lcWwoe1xuICAgICAgICBqc29ud3BDb2RlOiA2MSwgZXJyb3I6ICdpbnZhbGlkIGFyZ3VtZW50JywgdzNjU3RhdHVzOiA0MDAsIF9zdGFja3RyYWNlOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpZiBXM0MgY2FwcyBhcmUgbm90IHBhc3NpbmcgY29uc3RyYWludHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlcnIgPSBwYXJzZUNhcHNGb3JJbm5lckRyaXZlcih1bmRlZmluZWQsIFczQ19DQVBTLCB7aGVsbG86IHtwcmVzZW5jZTogdHJ1ZX19KS5lcnJvcjtcbiAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5tYXRjaCgvJ2hlbGxvJyBjYW4ndCBiZSBibGFuay8pO1xuICAgICAgXy5pc0Vycm9yKGVycikuc2hvdWxkLmJlLnRydWU7XG5cbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG9ubHkgYWNjZXB0IFczQyBjYXBzIHRoYXQgaGF2ZSBwYXNzaW5nIGNvbnN0cmFpbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHczY0NhcHMgPSB7XG4gICAgICAgIC4uLlczQ19DQVBTLFxuICAgICAgICBmaXJzdE1hdGNoOiBbXG4gICAgICAgICAge2ZvbzogJ2Jhcid9LFxuICAgICAgICAgIHsnYXBwaXVtOmhlbGxvJzogJ3dvcmxkJ30sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoQkFTRV9DQVBTLCB3M2NDYXBzLCB7aGVsbG86IHtwcmVzZW5jZTogdHJ1ZX19KS5lcnJvci5zaG91bGQuZXFsKHtcbiAgICAgICAganNvbndwQ29kZTogNjEsIGVycm9yOiAnaW52YWxpZCBhcmd1bWVudCcsIHczY1N0YXR1czogNDAwLCBfc3RhY2t0cmFjZTogbnVsbFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhZGQgYXBwaXVtIHByZWZpeGVzIHRvIFczQyBjYXBzIHRoYXQgYXJlIG5vdCBzdGFuZGFyZCBpbiBXM0MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwYXJzZUNhcHNGb3JJbm5lckRyaXZlcih1bmRlZmluZWQsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdGYWtlJyxcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6ICdQUk9QX05BTUUnLFxuICAgICAgICB9LFxuICAgICAgfSkuZXJyb3IuZXJyb3Iuc2hvdWxkLmluY2x1ZGVzKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW1vdmVBcHBpdW1QcmVmaXhlcygpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGFwcGl1bSBwcmVmaXhlcyBmcm9tIGNhcCBuYW1lcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZUFwcGl1bVByZWZpeGVzKHtcbiAgICAgICAgJ2FwcGl1bTpjYXAxJzogJ3ZhbHVlMScsXG4gICAgICAgICdtczpjYXAyJzogJ3ZhbHVlMicsXG4gICAgICAgIHNvbWVDYXA6ICdzb21lQ2FwJyxcbiAgICAgIH0pLnNob3VsZC5lcWwoe1xuICAgICAgICAnY2FwMSc6ICd2YWx1ZTEnLFxuICAgICAgICAnbXM6Y2FwMic6ICd2YWx1ZTInLFxuICAgICAgICBzb21lQ2FwOiAnc29tZUNhcCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luc2VydEFwcGl1bVByZWZpeGVzKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhcHBseSBwcmVmaXhlcyB0byBub24tc3RhbmRhcmQgY2FwYWJpbGl0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaW5zZXJ0QXBwaXVtUHJlZml4ZXMoe1xuICAgICAgICBzb21lQ2FwOiAnc29tZUNhcCcsXG4gICAgICB9KS5zaG91bGQuZGVlcC5lcXVhbCh7XG4gICAgICAgICdhcHBpdW06c29tZUNhcCc6ICdzb21lQ2FwJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGFwcGx5IHByZWZpeGVzIHRvIHN0YW5kYXJkIGNhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGluc2VydEFwcGl1bVByZWZpeGVzKHtcbiAgICAgICAgYnJvd3Nlck5hbWU6ICdCcm93c2VyTmFtZScsXG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ1BsYXRmb3JtTmFtZScsXG4gICAgICB9KS5zaG91bGQuZGVlcC5lcXVhbCh7XG4gICAgICAgIGJyb3dzZXJOYW1lOiAnQnJvd3Nlck5hbWUnLFxuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdQbGF0Zm9ybU5hbWUnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBub3QgYXBwbHkgcHJlZml4ZXMgdG8gY2FwYWJpbGl0aWVzIHRoYXQgYWxyZWFkeSBoYXZlIGEgcHJlZml4JywgZnVuY3Rpb24gKCkge1xuICAgICAgaW5zZXJ0QXBwaXVtUHJlZml4ZXMoe1xuICAgICAgICAnYXBwaXVtOnNvbWVDYXAnOiAnc29tZUNhcCcsXG4gICAgICAgICdtb3o6c29tZU90aGVyQ2FwJzogJ3NvbWVPdGhlckNhcCcsXG4gICAgICB9KS5zaG91bGQuZGVlcC5lcXVhbCh7XG4gICAgICAgICdhcHBpdW06c29tZUNhcCc6ICdzb21lQ2FwJyxcbiAgICAgICAgJ21vejpzb21lT3RoZXJDYXAnOiAnc29tZU90aGVyQ2FwJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYXBwbHkgcHJlZml4ZXMgdG8gbm9uLXByZWZpeGVkLCBub24tc3RhbmRhcmQgY2FwYWJpbGl0aWVzOyBzaG91bGQgbm90IGFwcGx5IHByZWZpeGVzIHRvIGFueSBvdGhlciBjYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpbnNlcnRBcHBpdW1QcmVmaXhlcyh7XG4gICAgICAgICdhcHBpdW06c29tZUNhcCc6ICdzb21lQ2FwJyxcbiAgICAgICAgJ21vejpzb21lT3RoZXJDYXAnOiAnc29tZU90aGVyQ2FwJyxcbiAgICAgICAgYnJvd3Nlck5hbWU6ICdCcm93c2VyTmFtZScsXG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ1BsYXRmb3JtTmFtZScsXG4gICAgICAgIHNvbWVPdGhlckNhcDogJ3NvbWVPdGhlckNhcCcsXG4gICAgICAgIHlldEFub3RoZXJDYXA6ICd5ZXRBbm90aGVyQ2FwJyxcbiAgICAgIH0pLnNob3VsZC5kZWVwLmVxdWFsKHtcbiAgICAgICAgJ2FwcGl1bTpzb21lQ2FwJzogJ3NvbWVDYXAnLFxuICAgICAgICAnbW96OnNvbWVPdGhlckNhcCc6ICdzb21lT3RoZXJDYXAnLFxuICAgICAgICBicm93c2VyTmFtZTogJ0Jyb3dzZXJOYW1lJyxcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnUGxhdGZvcm1OYW1lJyxcbiAgICAgICAgJ2FwcGl1bTpzb21lT3RoZXJDYXAnOiAnc29tZU90aGVyQ2FwJyxcbiAgICAgICAgJ2FwcGl1bTp5ZXRBbm90aGVyQ2FwJzogJ3lldEFub3RoZXJDYXAnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwdWxsU2V0dGluZ3MoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHB1bGwgc2V0dGluZ3MgZnJvbSBjYXBzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FwcyA9IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnZm9vJyxcbiAgICAgICAgYnJvd3Nlck5hbWU6ICdiYXInLFxuICAgICAgICAnc2V0dGluZ3Nbc2V0dGluZ05hbWVdJzogJ2JheicsXG4gICAgICAgICdzZXR0aW5nc1tzZXR0aW5nTmFtZTJdJzogJ2JhejInLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gcHVsbFNldHRpbmdzKGNhcHMpO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkLmVxbCh7XG4gICAgICAgIHNldHRpbmdOYW1lOiAnYmF6JyxcbiAgICAgICAgc2V0dGluZ05hbWUyOiAnYmF6MicsXG4gICAgICB9KTtcbiAgICAgIGNhcHMuc2hvdWxkLmVxbCh7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2ZvbycsXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnYmFyJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHVsbCBzZXR0aW5ncyBkaWN0IGlmIG9iamVjdCB2YWx1ZXMgYXJlIHByZXNlbnQgaW4gY2FwcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2ZvbycsXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnYmFyJyxcbiAgICAgICAgJ3NldHRpbmdzW3NldHRpbmdOYW1lXSc6IHtrZXk6ICdiYXonfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHB1bGxTZXR0aW5ncyhjYXBzKTtcbiAgICAgIHNldHRpbmdzLnNob3VsZC5lcWwoe1xuICAgICAgICBzZXR0aW5nTmFtZToge2tleTogJ2Jheid9LFxuICAgICAgfSk7XG4gICAgICBjYXBzLnNob3VsZC5lcWwoe1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdmb28nLFxuICAgICAgICBicm93c2VyTmFtZTogJ2JhcicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHB1bGwgZW1wdHkgZGljdCBpZiBubyBzZXR0aW5ncyBhcmUgcHJlc2VudCBpbiBjYXBzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FwcyA9IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnZm9vJyxcbiAgICAgICAgYnJvd3Nlck5hbWU6ICdiYXInLFxuICAgICAgICAnc2V0dGluZ1tzZXR0aW5nTmFtZV0nOiAnYmF6JyxcbiAgICAgIH07XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHB1bGxTZXR0aW5ncyhjYXBzKTtcbiAgICAgIHNldHRpbmdzLnNob3VsZC5lcWwoe30pO1xuICAgICAgY2Fwcy5zaG91bGQuZXFsKHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnZm9vJyxcbiAgICAgICAgYnJvd3Nlck5hbWU6ICdiYXInLFxuICAgICAgICAnc2V0dGluZ1tzZXR0aW5nTmFtZV0nOiAnYmF6JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHVsbCBlbXB0eSBkaWN0IGlmIGNhcHMgYXJlIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FwcyA9IHt9O1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwdWxsU2V0dGluZ3MoY2Fwcyk7XG4gICAgICBzZXR0aW5ncy5zaG91bGQuZXFsKHt9KTtcbiAgICAgIGNhcHMuc2hvdWxkLmVxbCh7fSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWFkb25seU1hcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IHdyaXRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgUmVhZG9ubHlNYXAoKTtcbiAgICAgICgoKSA9PiBtYXAuc2V0KCdmb28nLCAnYmFyJykpLnNob3VsZC5ub3QudGhyb3coKTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyByZWFkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWFwID0gbmV3IFJlYWRvbmx5TWFwKFtbJ2ZvbycsICdiYXInXV0pO1xuICAgICAgKCgpID0+IG1hcC5nZXQoJ2ZvbycpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBkZWxldGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBSZWFkb25seU1hcChbWydmb28nLCAnYmFyJ11dKTtcbiAgICAgICgoKSA9PiBtYXAuZGVsZXRlKCdmb28nKSkuc2hvdWxkLnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBjbGVhcmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBSZWFkb25seU1hcChbWydmb28nLCAnYmFyJ11dKTtcbiAgICAgICgoKSA9PiBtYXAuY2xlYXIoKSkuc2hvdWxkLnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyB1cGRhdGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBSZWFkb25seU1hcChbWydmb28nLCAnYmFyJ11dKTtcbiAgICAgICgoKSA9PiBtYXAuc2V0KCdmb28nLCAnYmF6JykpLnNob3VsZC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L3V0aWxzLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
package/index.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+
3
+ const {asyncify} = require('asyncbox');
4
+
5
+ const appium = require('./build/lib/main.js');
6
+
7
+ if (require.main === module) {
8
+ asyncify(appium.main);
9
+ }
10
+
11
+ module.exports = appium;
@@ -210,7 +210,8 @@
210
210
  "default": false,
211
211
  "description": "Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it's not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using \"deny-insecure\"",
212
212
  "title": "relaxed-security config",
213
- "type": "boolean"
213
+ "type": "boolean",
214
+ "appiumCliDest": "relaxedSecurityEnabled"
214
215
  },
215
216
  "session-override": {
216
217
  "default": false,
package/lib/cli/parser.js CHANGED
@@ -165,7 +165,10 @@ class ArgParser {
165
165
  */
166
166
  static _patchExit (parser) {
167
167
  parser.exit = (code, msg) => {
168
- throw new Error(msg);
168
+ if (code) {
169
+ throw new Error(msg);
170
+ }
171
+ process.exit();
169
172
  };
170
173
  }
171
174
 
package/lib/config.js CHANGED
@@ -5,9 +5,6 @@ import { exec } from 'teen_process';
5
5
  import { rootDir } from './utils';
6
6
  import logger from './logger';
7
7
  import semver from 'semver';
8
- import {
9
- StoreDeprecatedDefaultCapabilityAction, DEFAULT_CAPS_ARG,
10
- } from './cli/argparse-actions';
11
8
  import findUp from 'find-up';
12
9
  import { getDefaultsFromSchema } from './schema/schema';
13
10
 
@@ -28,11 +25,6 @@ function getNodeVersion () {
28
25
  return semver.coerce(process.version);
29
26
  }
30
27
 
31
- function isSubClass (candidateClass, superClass) {
32
- return _.isFunction(superClass) && _.isFunction(candidateClass)
33
- && (candidateClass.prototype instanceof superClass || candidateClass === superClass);
34
- }
35
-
36
28
  async function updateBuildInfo (useGithubApiFallback = false) {
37
29
  const sha = await getGitRev(useGithubApiFallback);
38
30
  if (!sha) {
@@ -225,23 +217,6 @@ function getNonDefaultServerArgs (parser, args) {
225
217
  return _.pickBy(args, (__, key) => isNotDefault(key));
226
218
  }
227
219
 
228
- function getDeprecatedArgs (parser, args) {
229
- // go through the server command line arguments and figure
230
- // out which of the ones used are deprecated
231
- return parser.rawArgs.reduce((acc, [[name], {dest, default: defaultValue, action}]) => {
232
- if (!args[dest] || args[dest] === defaultValue) {
233
- return acc;
234
- }
235
-
236
- if (action?.deprecated_for) {
237
- acc[name] = action.deprecated_for;
238
- } else if (isSubClass(action, StoreDeprecatedDefaultCapabilityAction)) {
239
- acc[name] = DEFAULT_CAPS_ARG;
240
- }
241
- return acc;
242
- }, {});
243
- }
244
-
245
220
  async function validateTmpDir (tmpDir) {
246
221
  try {
247
222
  await mkdirp(tmpDir);
@@ -254,6 +229,5 @@ async function validateTmpDir (tmpDir) {
254
229
  export {
255
230
  getBuildInfo, checkNodeOk, showConfig,
256
231
  warnNodeDeprecations, validateTmpDir, getNonDefaultServerArgs,
257
- getGitRev, APPIUM_VER, updateBuildInfo,
258
- getDeprecatedArgs
232
+ getGitRev, APPIUM_VER, updateBuildInfo
259
233
  };
package/lib/main.js CHANGED
@@ -94,9 +94,9 @@ function logServerPort (address, port) {
94
94
 
95
95
  /**
96
96
  * Find any plugin name which has been installed, and which has been requested for activation by
97
- * using the --plugins flag, and turn each one into its class, so we can send them as objects to
98
- * the server init. We also want to send/assign them to the umbrella driver so it can use them to
99
- * wrap command execution
97
+ * using the --use-plugins flag, and turn each one into its class, so we can send them as objects
98
+ * to the server init. We also want to send/assign them to the umbrella driver so it can use them
99
+ * to wrap command execution
100
100
  *
101
101
  * @param {Object} args - argparser parsed dict
102
102
  * @param {import('./plugin-config').default} pluginConfig - a plugin extension config
@@ -335,6 +335,9 @@ async function main (args) {
335
335
  return server;
336
336
  }
337
337
 
338
+ // NOTE: this is here for backwards compat for any scripts referencing `main.js` directly
339
+ // (more specifically, `build/lib/main.js`)
340
+ // the executable is now `../index.js`, so that module will typically be `require.main`.
338
341
  if (require.main === module) {
339
342
  asyncify(main);
340
343
  }
@@ -57,7 +57,7 @@ export default class PluginConfig extends ExtensionConfig {
57
57
  }
58
58
 
59
59
  if (_.isEmpty(activeNames)) {
60
- log.info('No plugins activated. Use the --plugins flag with names of plugins to activate');
60
+ log.info('No plugins activated. Use the --use-plugins flag with names of plugins to activate');
61
61
  }
62
62
  }
63
63
  }
@@ -212,6 +212,7 @@ const schema = /** @type {const} */ ({
212
212
  'Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it\'s not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using "deny-insecure"',
213
213
  title: 'relaxed-security config',
214
214
  type: 'boolean',
215
+ appiumCliDest: 'relaxedSecurityEnabled'
215
216
  },
216
217
  'session-override': {
217
218
  default: false,
@@ -216,3 +216,7 @@ export class ArgSpec {
216
216
  * @property {string} [dest]
217
217
  * @property {D} [defaultValue]
218
218
  */
219
+
220
+ /**
221
+ * @typedef {import('../ext-config-io').ExtensionType} ExtensionType
222
+ */
@@ -79,6 +79,20 @@ function getSchemaValidator ({ref: schemaId}, coerce = _.identity) {
79
79
  };
80
80
  }
81
81
 
82
+ /**
83
+ * Determine the description for display on the CLI, given the schema.
84
+ * @param {AppiumJSONSchema} schema
85
+ * @returns {string}
86
+ */
87
+ function makeDescription (schema) {
88
+ const {appiumCliDescription, description = '', appiumDeprecated} = schema;
89
+ let desc = appiumCliDescription ?? description;
90
+ if (appiumDeprecated) {
91
+ desc = `[DEPRECATED] ${desc}`;
92
+ }
93
+ return desc;
94
+ }
95
+
82
96
  /**
83
97
  * Given arg `name`, a JSON schema `subSchema`, and options, return an argument definition
84
98
  * as understood by `argparse`.
@@ -93,8 +107,6 @@ function subSchemaToArgDef (subSchema, argSpec, opts = {}) {
93
107
  type,
94
108
  appiumCliAliases,
95
109
  appiumCliTransformer,
96
- appiumCliDescription,
97
- description,
98
110
  enum: enumValues,
99
111
  } = subSchema;
100
112
 
@@ -110,7 +122,7 @@ function subSchemaToArgDef (subSchema, argSpec, opts = {}) {
110
122
  /** @type {import('argparse').ArgumentOptions} */
111
123
  let argOpts = {
112
124
  required: false,
113
- help: appiumCliDescription ?? description,
125
+ help: makeDescription(subSchema)
114
126
  };
115
127
 
116
128
  /**
@@ -238,7 +250,7 @@ function subSchemaToArgDef (subSchema, argSpec, opts = {}) {
238
250
  * aliases to `argparse` arguments; empty if no schema found
239
251
  */
240
252
  export function toParserArgs (opts = {}) {
241
- const flattened = flattenSchema();
253
+ const flattened = flattenSchema().filter(({schema}) => !schema.appiumCliIgnored);
242
254
  return new Map(
243
255
  _.map(flattened, ({schema, argSpec}) =>
244
256
  subSchemaToArgDef(schema, argSpec, opts),
@@ -86,11 +86,26 @@ export const keywords = {
86
86
  * Flag to tell Appium to _not_ provide this property as a CLI argument.
87
87
  * @type {KeywordDefinition}
88
88
  */
89
- appiumCliIgnore: {
90
- keyword: 'appiumCliIgnore',
89
+ appiumCliIgnored: {
90
+ keyword: 'appiumCliIgnored',
91
91
  metaSchema: {
92
92
  type: 'boolean',
93
- description: 'If `true`, Appium will not provide this property as a CLI argument.'
93
+ description: 'If `true`, Appium will not provide this property as a CLI argument. This is NOT the same as a "hidden" argument.',
94
+ enum: [true]
95
+ }
96
+ },
97
+
98
+ /**
99
+ * Mark this property as deprecated.
100
+ * @type {KeywordDefinition}
101
+ */
102
+ appiumDeprecated: {
103
+ keyword: 'appiumDeprecated',
104
+ metaSchema: {
105
+ type: 'boolean',
106
+ description: 'If `true`, this property will be displayed as "deprecated" to the user',
107
+ enum: [true],
108
+ $comment: 'JSON schema draft-2019-09 keyword `deprecated` serves the same purpose. This keyword should itself be deprecated if we move to draft-2019-09!'
94
109
  }
95
110
  }
96
111
  };
@@ -109,8 +124,9 @@ export const keywords = {
109
124
  * @property {string} [appiumCliDest]
110
125
  * @property {string} [appiumCliDescription]
111
126
  * @property {string[]} [appiumCliAliases]
112
- * @property {boolean} [appiumCliIgnore]
127
+ * @property {boolean} [appiumCliIgnored]
113
128
  * @property {AppiumCliTransformerName} [appiumCliTransformer]
129
+ * @property {boolean} [appiumDeprecated]
114
130
  */
115
131
 
116
132
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium",
3
- "version": "2.0.0-beta.21",
3
+ "version": "2.0.0-beta.22",
4
4
  "description": "Automation for Apps.",
5
5
  "keywords": [
6
6
  "automation",
@@ -21,9 +21,8 @@
21
21
  },
22
22
  "license": "Apache-2.0",
23
23
  "author": "https://github.com/appium",
24
- "main": "./build/lib/main.js",
25
24
  "bin": {
26
- "appium": "./build/lib/main.js"
25
+ "appium": "index.js"
27
26
  },
28
27
  "directories": {
29
28
  "lib": "./lib"
@@ -31,25 +30,25 @@
31
30
  "files": [
32
31
  "bin",
33
32
  "lib",
34
- "build/lib",
33
+ "build",
34
+ "index.js",
35
35
  "postinstall.js",
36
36
  "types"
37
37
  ],
38
38
  "scripts": {
39
39
  "generate-docs": "gulp transpile && node ./build/commands-yml/parse.js",
40
40
  "postinstall": "node ./postinstall.js",
41
- "install-fake-driver": "node . driver install --source=local ../fake-driver",
42
41
  "upload": "gulp github-upload",
43
42
  "zip": "zip -qr appium.zip .",
44
43
  "zip-and-upload": "npm run zip && npm run upload"
45
44
  },
46
45
  "dependencies": {
47
- "@appium/base-driver": "^8.2.0",
46
+ "@appium/base-driver": "^8.2.1",
48
47
  "@appium/base-plugin": "1.8.0",
49
- "@appium/support": "^2.55.1",
48
+ "@appium/support": "^2.55.2",
50
49
  "@babel/runtime": "7.16.3",
51
50
  "@sidvind/better-ajv-errors": "0.9.2",
52
- "ajv": "8.8.0",
51
+ "ajv": "8.8.1",
53
52
  "ajv-formats": "2.1.1",
54
53
  "argparse": "2.0.1",
55
54
  "async-lock": "1.3.0",
@@ -65,16 +64,12 @@
65
64
  "ora": "5.4.1",
66
65
  "resolve-from": "5.0.0",
67
66
  "semver": "7.3.5",
68
- "source-map-support": "0.5.20",
67
+ "source-map-support": "0.5.21",
69
68
  "teen_process": "1.16.0",
70
69
  "winston": "3.3.3",
71
70
  "word-wrap": "1.2.3",
72
71
  "yaml": "1.10.2"
73
72
  },
74
- "devDependencies": {
75
- "@appium/fake-driver": "^3.2.0",
76
- "@appium/gulp-plugins": "^5.5.5"
77
- },
78
73
  "engines": {
79
74
  "node": ">=12",
80
75
  "npm": ">=6"
@@ -84,5 +79,5 @@
84
79
  "tag": "next"
85
80
  },
86
81
  "homepage": "https://appium.io",
87
- "gitHead": "ec6a90a797d2dadb407922426be16efaec9def07"
82
+ "gitHead": "e36a70105880b845e99e2c8a958403f6253f45b6"
88
83
  }