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.
- package/LICENSE +201 -0
- package/build/check-npm-pack-files.js +23 -0
- package/build/commands-yml/parse.js +319 -0
- package/build/commands-yml/validator.js +130 -0
- package/build/index.js +19 -0
- package/build/lib/cli/parser.js +6 -2
- package/build/lib/config.js +1 -28
- package/build/lib/main.js +1 -1
- package/build/lib/plugin-config.js +2 -2
- package/build/lib/schema/appium-config-schema.js +3 -2
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/cli-args.js +20 -5
- package/build/lib/schema/keywords.js +14 -4
- package/build/postinstall.js +90 -0
- package/build/test/cli/cli-e2e-specs.js +221 -0
- package/build/test/cli/cli-helpers.js +86 -0
- package/build/test/cli/cli-specs.js +71 -0
- package/build/test/cli/fixtures/test-driver/package.json +27 -0
- package/build/test/cli/schema-args-specs.js +48 -0
- package/build/test/cli/schema-e2e-specs.js +47 -0
- package/build/test/config-e2e-specs.js +112 -0
- package/build/test/config-file-e2e-specs.js +209 -0
- package/build/test/config-file-specs.js +281 -0
- package/build/test/config-specs.js +159 -0
- package/build/test/driver-e2e-specs.js +435 -0
- package/build/test/driver-specs.js +321 -0
- package/build/test/ext-config-io-specs.js +181 -0
- package/build/test/extension-config-specs.js +365 -0
- package/build/test/fixtures/allow-feat.txt +5 -0
- package/build/test/fixtures/caps.json +3 -0
- package/build/test/fixtures/config/allow-insecure.txt +3 -0
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
- package/build/test/fixtures/config/appium.config.bad.json +32 -0
- package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
- package/build/test/fixtures/config/appium.config.good.js +40 -0
- package/build/test/fixtures/config/appium.config.good.json +33 -0
- package/build/test/fixtures/config/appium.config.good.yaml +30 -0
- package/build/test/fixtures/config/appium.config.invalid.json +31 -0
- package/build/test/fixtures/config/appium.config.security-array.json +5 -0
- package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
- package/build/test/fixtures/config/appium.config.security-path.json +5 -0
- package/build/test/fixtures/config/driver-fake.config.json +8 -0
- package/build/test/fixtures/config/nodeconfig.json +3 -0
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +35 -0
- package/build/test/fixtures/deny-feat.txt +5 -0
- package/build/test/fixtures/driver.schema.js +20 -0
- package/build/test/fixtures/extensions.yaml +27 -0
- package/build/test/fixtures/flattened-schema.js +504 -0
- package/build/test/fixtures/plugin.schema.js +20 -0
- package/build/test/fixtures/schema-with-extensions.js +28 -0
- package/build/test/grid-register-specs.js +74 -0
- package/build/test/helpers.js +75 -0
- package/build/test/logger-specs.js +76 -0
- package/build/test/npm-specs.js +20 -0
- package/build/test/parser-specs.js +314 -0
- package/build/test/plugin-e2e-specs.js +316 -0
- package/build/test/schema/arg-spec-specs.js +70 -0
- package/build/test/schema/cli-args-specs.js +431 -0
- package/build/test/schema/schema-specs.js +389 -0
- package/build/test/utils-specs.js +266 -0
- package/index.js +11 -0
- package/lib/appium-config.schema.json +2 -1
- package/lib/cli/parser.js +4 -1
- package/lib/config.js +1 -27
- package/lib/main.js +6 -3
- package/lib/plugin-config.js +1 -1
- package/lib/schema/appium-config-schema.js +1 -0
- package/lib/schema/arg-spec.js +4 -0
- package/lib/schema/cli-args.js +16 -4
- package/lib/schema/keywords.js +20 -4
- package/package.json +9 -14
- package/build/lib/cli/argparse-actions.js +0 -104
- 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
|
@@ -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
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
|
|
98
|
-
* the server init. We also want to send/assign them to the umbrella driver so it can use them
|
|
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
|
}
|
package/lib/plugin-config.js
CHANGED
|
@@ -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,
|
package/lib/schema/arg-spec.js
CHANGED
package/lib/schema/cli-args.js
CHANGED
|
@@ -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:
|
|
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),
|
package/lib/schema/keywords.js
CHANGED
|
@@ -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
|
-
|
|
90
|
-
keyword: '
|
|
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} [
|
|
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.
|
|
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": "
|
|
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
|
|
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.
|
|
46
|
+
"@appium/base-driver": "^8.2.1",
|
|
48
47
|
"@appium/base-plugin": "1.8.0",
|
|
49
|
-
"@appium/support": "^2.55.
|
|
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.
|
|
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.
|
|
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": "
|
|
82
|
+
"gitHead": "e36a70105880b845e99e2c8a958403f6253f45b6"
|
|
88
83
|
}
|