appium 2.0.0-beta.23 → 2.0.0-beta.26
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/README.md +1 -2
- package/build/lib/appium-config.schema.json +278 -0
- package/build/lib/appium.js +62 -71
- package/build/lib/cli/args.js +31 -53
- package/build/lib/cli/driver-command.js +5 -9
- package/build/lib/cli/extension-command.js +73 -64
- package/build/lib/cli/extension.js +10 -23
- package/build/lib/cli/parser.js +10 -20
- package/build/lib/cli/plugin-command.js +5 -9
- package/build/lib/cli/utils.js +2 -4
- package/build/lib/config-file.js +5 -10
- package/build/lib/config.js +67 -30
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logsink.js +2 -4
- package/build/lib/main.js +64 -92
- package/build/lib/schema/appium-config-schema.js +2 -4
- package/build/lib/schema/arg-spec.js +14 -15
- package/build/lib/schema/cli-args.js +8 -16
- package/build/lib/schema/cli-transformers.js +2 -4
- package/build/lib/schema/index.js +2 -4
- package/build/lib/schema/keywords.js +2 -4
- package/build/lib/schema/schema.js +136 -41
- package/build/lib/utils.js +13 -64
- package/lib/appium.js +74 -55
- package/lib/cli/args.js +36 -37
- package/lib/cli/driver-command.js +10 -2
- package/lib/cli/extension-command.js +216 -135
- package/lib/cli/extension.js +7 -15
- package/lib/cli/parser.js +7 -15
- package/lib/cli/plugin-command.js +1 -2
- package/lib/config-file.js +12 -15
- package/lib/config.js +111 -36
- package/lib/constants.js +79 -0
- package/lib/extension/driver-config.js +230 -0
- package/lib/extension/extension-config.js +459 -0
- package/lib/extension/index.js +103 -0
- package/lib/extension/manifest.js +590 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +111 -0
- package/lib/grid-register.js +4 -4
- package/lib/main.js +110 -96
- package/lib/schema/arg-spec.js +11 -5
- package/lib/schema/cli-args.js +7 -30
- package/lib/schema/keywords.js +1 -1
- package/lib/schema/schema.js +206 -48
- package/lib/utils.js +27 -58
- package/package.json +29 -21
- package/{postinstall.js → scripts/postinstall.js} +1 -1
- package/types/types.d.ts +72 -28
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/check-npm-pack-files.js +0 -23
- package/build/commands-yml/parse.js +0 -319
- package/build/commands-yml/validator.js +0 -130
- package/build/index.js +0 -19
- package/build/lib/cli/npm.js +0 -220
- package/build/lib/driver-config.js +0 -100
- package/build/lib/drivers.js +0 -100
- package/build/lib/ext-config-io.js +0 -165
- package/build/lib/extension-config.js +0 -320
- package/build/lib/plugin-config.js +0 -69
- package/build/lib/plugins.js +0 -16
- package/build/postinstall.js +0 -90
- package/build/test/cli/cli-e2e-specs.js +0 -221
- package/build/test/cli/cli-helpers.js +0 -86
- package/build/test/cli/cli-specs.js +0 -71
- package/build/test/cli/fixtures/test-driver/package.json +0 -27
- package/build/test/cli/schema-args-specs.js +0 -48
- package/build/test/cli/schema-e2e-specs.js +0 -47
- package/build/test/config-e2e-specs.js +0 -112
- package/build/test/config-file-e2e-specs.js +0 -209
- package/build/test/config-file-specs.js +0 -281
- package/build/test/config-specs.js +0 -159
- package/build/test/driver-e2e-specs.js +0 -435
- package/build/test/driver-specs.js +0 -321
- package/build/test/ext-config-io-specs.js +0 -181
- package/build/test/extension-config-specs.js +0 -365
- package/build/test/fixtures/allow-feat.txt +0 -5
- package/build/test/fixtures/caps.json +0 -3
- package/build/test/fixtures/config/allow-insecure.txt +0 -3
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
- package/build/test/fixtures/config/appium.config.bad.json +0 -32
- package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
- package/build/test/fixtures/config/appium.config.good.js +0 -40
- package/build/test/fixtures/config/appium.config.good.json +0 -33
- package/build/test/fixtures/config/appium.config.good.yaml +0 -30
- package/build/test/fixtures/config/appium.config.invalid.json +0 -31
- package/build/test/fixtures/config/appium.config.security-array.json +0 -5
- package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
- package/build/test/fixtures/config/appium.config.security-path.json +0 -5
- package/build/test/fixtures/config/driver-fake.config.json +0 -8
- package/build/test/fixtures/config/nodeconfig.json +0 -3
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +0 -35
- package/build/test/fixtures/deny-feat.txt +0 -5
- package/build/test/fixtures/driver.schema.js +0 -20
- package/build/test/fixtures/extensions.yaml +0 -27
- package/build/test/fixtures/flattened-schema.js +0 -504
- package/build/test/fixtures/plugin.schema.js +0 -20
- package/build/test/fixtures/schema-with-extensions.js +0 -28
- package/build/test/grid-register-specs.js +0 -74
- package/build/test/helpers.js +0 -75
- package/build/test/logger-specs.js +0 -76
- package/build/test/npm-specs.js +0 -20
- package/build/test/parser-specs.js +0 -314
- package/build/test/plugin-e2e-specs.js +0 -316
- package/build/test/schema/arg-spec-specs.js +0 -70
- package/build/test/schema/cli-args-specs.js +0 -431
- package/build/test/schema/schema-specs.js +0 -389
- package/build/test/utils-specs.js +0 -266
- package/lib/cli/npm.js +0 -251
- package/lib/driver-config.js +0 -101
- package/lib/drivers.js +0 -84
- package/lib/ext-config-io.js +0 -287
- package/lib/extension-config.js +0 -366
- package/lib/plugin-config.js +0 -63
- package/lib/plugins.js +0 -11
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
-
|
|
9
|
-
var _sinon = _interopRequireDefault(require("sinon"));
|
|
10
|
-
|
|
11
|
-
var _yaml = _interopRequireDefault(require("yaml"));
|
|
12
|
-
|
|
13
|
-
var schema = _interopRequireWildcard(require("../lib/schema/schema"));
|
|
14
|
-
|
|
15
|
-
var _helpers = require("./helpers");
|
|
16
|
-
|
|
17
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
18
|
-
|
|
19
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
20
|
-
|
|
21
|
-
const expect = chai.expect;
|
|
22
|
-
describe('config-file', function () {
|
|
23
|
-
const GOOD_YAML_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.yaml');
|
|
24
|
-
const GOOD_JSON_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.json');
|
|
25
|
-
const GOOD_JS_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.js');
|
|
26
|
-
|
|
27
|
-
const GOOD_YAML_CONFIG = _yaml.default.parse(_fs.default.readFileSync(GOOD_YAML_CONFIG_FILEPATH, 'utf8'));
|
|
28
|
-
|
|
29
|
-
const GOOD_JSON_CONFIG = require(GOOD_JSON_CONFIG_FILEPATH);
|
|
30
|
-
|
|
31
|
-
const BAD_JSON_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad.json');
|
|
32
|
-
|
|
33
|
-
const BAD_JSON_CONFIG = require(BAD_JSON_CONFIG_FILEPATH);
|
|
34
|
-
|
|
35
|
-
let sandbox;
|
|
36
|
-
let readConfigFile;
|
|
37
|
-
let lc;
|
|
38
|
-
let configFileModule;
|
|
39
|
-
let mocks;
|
|
40
|
-
before(function () {
|
|
41
|
-
schema.finalizeSchema();
|
|
42
|
-
});
|
|
43
|
-
beforeEach(function () {
|
|
44
|
-
sandbox = _sinon.default.createSandbox();
|
|
45
|
-
const load = sandbox.stub().resolves({
|
|
46
|
-
config: GOOD_JSON_CONFIG,
|
|
47
|
-
filepath: GOOD_JSON_CONFIG_FILEPATH
|
|
48
|
-
});
|
|
49
|
-
load.withArgs(GOOD_YAML_CONFIG_FILEPATH).resolves({
|
|
50
|
-
config: GOOD_YAML_CONFIG,
|
|
51
|
-
filepath: GOOD_YAML_CONFIG_FILEPATH
|
|
52
|
-
});
|
|
53
|
-
load.withArgs(BAD_JSON_CONFIG_FILEPATH).resolves({
|
|
54
|
-
config: BAD_JSON_CONFIG,
|
|
55
|
-
filepath: BAD_JSON_CONFIG_FILEPATH
|
|
56
|
-
});
|
|
57
|
-
const search = sandbox.stub().resolves({
|
|
58
|
-
config: GOOD_JSON_CONFIG,
|
|
59
|
-
filepath: GOOD_JSON_CONFIG_FILEPATH
|
|
60
|
-
});
|
|
61
|
-
lc = {
|
|
62
|
-
load,
|
|
63
|
-
search
|
|
64
|
-
};
|
|
65
|
-
mocks = {
|
|
66
|
-
lilconfig: {
|
|
67
|
-
lilconfig: sandbox.stub().returns(lc)
|
|
68
|
-
},
|
|
69
|
-
'@sidvind/better-ajv-errors': sandbox.stub().returns('')
|
|
70
|
-
};
|
|
71
|
-
configFileModule = _helpers.rewiremock.proxy(() => require('../lib/config-file'), mocks);
|
|
72
|
-
readConfigFile = configFileModule.readConfigFile;
|
|
73
|
-
sandbox.spy(schema, 'validate');
|
|
74
|
-
});
|
|
75
|
-
afterEach(function () {
|
|
76
|
-
sandbox.restore();
|
|
77
|
-
});
|
|
78
|
-
describe('readConfigFile()', function () {
|
|
79
|
-
let result;
|
|
80
|
-
it('should support yaml', async function () {
|
|
81
|
-
const {
|
|
82
|
-
config
|
|
83
|
-
} = await readConfigFile(GOOD_YAML_CONFIG_FILEPATH);
|
|
84
|
-
expect(config).to.eql(GOOD_JSON_CONFIG);
|
|
85
|
-
expect(schema.validate).to.have.been.calledOnce;
|
|
86
|
-
});
|
|
87
|
-
it('should support json', async function () {
|
|
88
|
-
const {
|
|
89
|
-
config
|
|
90
|
-
} = await readConfigFile(GOOD_JSON_CONFIG_FILEPATH);
|
|
91
|
-
expect(config).to.eql(GOOD_JSON_CONFIG);
|
|
92
|
-
expect(schema.validate).to.have.been.calledOnce;
|
|
93
|
-
});
|
|
94
|
-
it('should support js', async function () {
|
|
95
|
-
const {
|
|
96
|
-
config
|
|
97
|
-
} = await readConfigFile(GOOD_JS_CONFIG_FILEPATH);
|
|
98
|
-
expect(config).to.eql(GOOD_JSON_CONFIG);
|
|
99
|
-
expect(schema.validate).to.have.been.calledOnce;
|
|
100
|
-
});
|
|
101
|
-
describe('when no filepath provided', function () {
|
|
102
|
-
beforeEach(async function () {
|
|
103
|
-
result = await readConfigFile();
|
|
104
|
-
});
|
|
105
|
-
it('should search for a config file', function () {
|
|
106
|
-
expect(lc.search).to.have.been.calledOnce;
|
|
107
|
-
expect(schema.validate).to.have.been.calledOnce;
|
|
108
|
-
});
|
|
109
|
-
it('should not try to load a config file directly', function () {
|
|
110
|
-
expect(lc.load).to.not.have.been.called;
|
|
111
|
-
});
|
|
112
|
-
describe('when no config file is found', function () {
|
|
113
|
-
beforeEach(async function () {
|
|
114
|
-
lc.search.resolves();
|
|
115
|
-
schema.validate.resetHistory();
|
|
116
|
-
result = await readConfigFile();
|
|
117
|
-
});
|
|
118
|
-
it('should resolve with an empty object', function () {
|
|
119
|
-
expect(result).to.be.an('object').that.is.empty;
|
|
120
|
-
expect(schema.validate).not.to.have.been.called;
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe('when a config file is found', function () {
|
|
124
|
-
describe('when the config file is empty', function () {
|
|
125
|
-
beforeEach(async function () {
|
|
126
|
-
lc.search.resolves({
|
|
127
|
-
isEmpty: true,
|
|
128
|
-
filepath: '/path/to/file.json',
|
|
129
|
-
config: {}
|
|
130
|
-
});
|
|
131
|
-
result = await readConfigFile();
|
|
132
|
-
});
|
|
133
|
-
it('should resolve with an object with an `isEmpty` property', function () {
|
|
134
|
-
expect(result).to.have.property('isEmpty', true);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
describe('when the config file is not empty', function () {
|
|
138
|
-
it('should validate the config against a schema', function () {
|
|
139
|
-
expect(schema.validate).to.have.been.calledOnceWith(GOOD_JSON_CONFIG);
|
|
140
|
-
});
|
|
141
|
-
describe('when the config file is valid', function () {
|
|
142
|
-
beforeEach(async function () {
|
|
143
|
-
result = await readConfigFile();
|
|
144
|
-
});
|
|
145
|
-
it('should resolve with an object having `config` property and empty array of errors', function () {
|
|
146
|
-
expect(result).to.deep.equal({
|
|
147
|
-
config: GOOD_JSON_CONFIG,
|
|
148
|
-
errors: [],
|
|
149
|
-
filepath: GOOD_JSON_CONFIG_FILEPATH
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe('when the config file is invalid', function () {
|
|
154
|
-
beforeEach(function () {
|
|
155
|
-
lc.search.resolves({
|
|
156
|
-
config: {
|
|
157
|
-
foo: 'bar'
|
|
158
|
-
},
|
|
159
|
-
filepath: '/path/to/file.json'
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
beforeEach(async function () {
|
|
163
|
-
result = await readConfigFile();
|
|
164
|
-
});
|
|
165
|
-
it('should resolve with an object having a nonempty array of errors', function () {
|
|
166
|
-
expect(result).to.have.property('errors').that.is.not.empty;
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
describe('when filepath provided', function () {
|
|
173
|
-
beforeEach(async function () {
|
|
174
|
-
result = await readConfigFile('appium.json');
|
|
175
|
-
});
|
|
176
|
-
it('should not attempt to find a config file', function () {
|
|
177
|
-
expect(lc.search).to.not.have.been.called;
|
|
178
|
-
});
|
|
179
|
-
it('should try to load a config file directly', function () {
|
|
180
|
-
expect(lc.load).to.have.been.calledOnce;
|
|
181
|
-
});
|
|
182
|
-
describe('when no config file exists at path', function () {
|
|
183
|
-
beforeEach(function () {
|
|
184
|
-
lc.load.rejects(Object.assign(new Error(), {
|
|
185
|
-
code: 'ENOENT'
|
|
186
|
-
}));
|
|
187
|
-
});
|
|
188
|
-
it('should reject with user-friendly message', async function () {
|
|
189
|
-
await expect(readConfigFile('appium.json')).to.be.rejectedWith(/not found at user-provided path/);
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
describe('when the config file is invalid JSON', function () {
|
|
193
|
-
beforeEach(function () {
|
|
194
|
-
lc.load.rejects(new SyntaxError());
|
|
195
|
-
});
|
|
196
|
-
it('should reject with user-friendly message', async function () {
|
|
197
|
-
await expect(readConfigFile('appium.json')).to.be.rejectedWith(/Config file at user-provided path appium.json is invalid/);
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
describe('when something else is wrong with loading the config file', function () {
|
|
201
|
-
beforeEach(function () {
|
|
202
|
-
lc.load.rejects(new Error('guru meditation'));
|
|
203
|
-
});
|
|
204
|
-
it('should pass error through', async function () {
|
|
205
|
-
await expect(readConfigFile('appium.json')).to.be.rejectedWith(/guru meditation/);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
describe('when a config file is found', function () {
|
|
209
|
-
describe('when the config file is empty', function () {
|
|
210
|
-
beforeEach(async function () {
|
|
211
|
-
lc.search.resolves({
|
|
212
|
-
isEmpty: true,
|
|
213
|
-
filepath: '/path/to/file.json',
|
|
214
|
-
config: {}
|
|
215
|
-
});
|
|
216
|
-
result = await readConfigFile();
|
|
217
|
-
});
|
|
218
|
-
it('should resolve with an object with an `isEmpty` property', function () {
|
|
219
|
-
expect(result).to.have.property('isEmpty', true);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
describe('when the config file is not empty', function () {
|
|
223
|
-
it('should validate the config against a schema', function () {
|
|
224
|
-
expect(schema.validate).to.have.been.calledOnceWith(GOOD_JSON_CONFIG);
|
|
225
|
-
});
|
|
226
|
-
describe('when the config file is valid', function () {
|
|
227
|
-
beforeEach(async function () {
|
|
228
|
-
result = await readConfigFile();
|
|
229
|
-
});
|
|
230
|
-
it('should resolve with an object having `config` property and empty array of errors', function () {
|
|
231
|
-
expect(result).to.deep.equal({
|
|
232
|
-
errors: [],
|
|
233
|
-
config: GOOD_JSON_CONFIG,
|
|
234
|
-
filepath: GOOD_JSON_CONFIG_FILEPATH
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe('when the config file is invalid', function () {
|
|
239
|
-
beforeEach(async function () {
|
|
240
|
-
result = await readConfigFile(BAD_JSON_CONFIG_FILEPATH);
|
|
241
|
-
});
|
|
242
|
-
it('should resolve with an object having a nonempty array of errors', function () {
|
|
243
|
-
expect(result).to.have.property('errors').that.is.not.empty;
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
describe('formatErrors()', function () {
|
|
251
|
-
describe('when provided `errors` as an empty array', function () {
|
|
252
|
-
it('should throw', function () {
|
|
253
|
-
expect(() => configFileModule.formatErrors([])).to.throw(TypeError, 'Array of errors must be non-empty');
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('when provided `errors` as `undefined`', function () {
|
|
257
|
-
it('should throw', function () {
|
|
258
|
-
expect(() => configFileModule.formatErrors()).to.throw(TypeError, 'Array of errors must be non-empty');
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
describe('when provided `errors` as a non-empty array', function () {
|
|
262
|
-
it('should return a string', function () {
|
|
263
|
-
expect(configFileModule.formatErrors([{}])).to.be.a('string');
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
describe('when `opts.json` is a string', function () {
|
|
267
|
-
it('should call `betterAjvErrors()` with option `json: opts.json`', function () {
|
|
268
|
-
configFileModule.formatErrors([{}], {}, {
|
|
269
|
-
json: '{"foo": "bar"}'
|
|
270
|
-
});
|
|
271
|
-
expect(mocks['@sidvind/better-ajv-errors']).to.have.been.calledWith(schema.getSchema(), {}, [{}], {
|
|
272
|
-
format: 'cli',
|
|
273
|
-
json: '{"foo": "bar"}'
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
});require('source-map-support').install();
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsImRlc2NyaWJlIiwiR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCIsIkdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgiLCJHT09EX0pTX0NPTkZJR19GSUxFUEFUSCIsIkdPT0RfWUFNTF9DT05GSUciLCJZQU1MIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsIkdPT0RfSlNPTl9DT05GSUciLCJyZXF1aXJlIiwiQkFEX0pTT05fQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0pTT05fQ09ORklHIiwic2FuZGJveCIsInJlYWRDb25maWdGaWxlIiwibGMiLCJjb25maWdGaWxlTW9kdWxlIiwibW9ja3MiLCJiZWZvcmUiLCJzY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsImJlZm9yZUVhY2giLCJzaW5vbiIsImNyZWF0ZVNhbmRib3giLCJsb2FkIiwic3R1YiIsInJlc29sdmVzIiwiY29uZmlnIiwiZmlsZXBhdGgiLCJ3aXRoQXJncyIsInNlYXJjaCIsImxpbGNvbmZpZyIsInJldHVybnMiLCJyZXdpcmVtb2NrIiwicHJveHkiLCJzcHkiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwicmVzdWx0IiwiaXQiLCJ0byIsImVxbCIsInZhbGlkYXRlIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWRPbmNlIiwibm90IiwiY2FsbGVkIiwicmVzZXRIaXN0b3J5IiwiYmUiLCJhbiIsInRoYXQiLCJpcyIsImVtcHR5IiwiaXNFbXB0eSIsInByb3BlcnR5IiwiY2FsbGVkT25jZVdpdGgiLCJkZWVwIiwiZXF1YWwiLCJlcnJvcnMiLCJmb28iLCJyZWplY3RzIiwiT2JqZWN0IiwiYXNzaWduIiwiRXJyb3IiLCJjb2RlIiwicmVqZWN0ZWRXaXRoIiwiU3ludGF4RXJyb3IiLCJmb3JtYXRFcnJvcnMiLCJ0aHJvdyIsIlR5cGVFcnJvciIsImEiLCJqc29uIiwiY2FsbGVkV2l0aCIsImdldFNjaGVtYSIs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QUFBQSxNQUFNLENBQUNrQixnQkFBZ0IsQ0FBQ29ELFlBQWpCLENBQThCLENBQUMsRUFBRCxDQUE5QixDQUFELENBQU4sQ0FBNEM1QixFQUE1QyxDQUErQ1MsRUFBL0MsQ0FBa0RzQixDQUFsRCxDQUFvRCxRQUFwRDtBQUNELE9BSEMsQ0FBRjtBQUlELEtBTE8sQ0FBUjtBQU9BdkUsSUFBQUEsUUFBUSxDQUFDLDhCQUFELEVBQWlDLFlBQVk7QUFDbkR1QyxNQUFBQSxFQUFFLENBQUMsK0RBQUQsRUFBa0UsWUFBWTtBQUU5RXZCLFFBQUFBLGdCQUFnQixDQUFDb0QsWUFBakIsQ0FBOEIsQ0FBQyxFQUFELENBQTlCLEVBQW9DLEVBQXBDLEVBQXdDO0FBQUNJLFVBQUFBLElBQUksRUFBRTtBQUFQLFNBQXhDO0FBQ0ExRSxRQUFBQSxNQUFNLENBQUNtQixLQUFLLENBQUMsNEJBQUQsQ0FBTixDQUFOLENBQTRDdUIsRUFBNUMsQ0FBK0NHLElBQS9DLENBQW9EQyxJQUFwRCxDQUF5RDZCLFVBQXpELENBQ0V0RCxNQUFNLENBQUN1RCxTQUFQLEVBREYsRUFFRSxFQUZGLEVBR0UsQ0FBQyxFQUFELENBSEYsRUFJRTtBQUFDQyxVQUFBQSxNQUFNLEVBQUUsS0FBVDtBQUFnQkgsVUFBQUEsSUFBSSxFQUFFO0FBQXRCLFNBSkY7QUFNRCxPQVRDLENBQUY7QUFVRCxLQVhPLENBQVI7QUFZRCxHQXZDTyxDQUFSO0FBd0NELENBbldPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCAqIGFzIHNjaGVtYSBmcm9tICcuLi9saWIvc2NoZW1hL3NjaGVtYSc7XG5pbXBvcnQgeyByZXNvbHZlRml4dHVyZSwgcmV3aXJlbW9jayB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5kZXNjcmliZSgnY29uZmlnLWZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEdPT0RfWUFNTF9DT05GSUdfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5nb29kLnlhbWwnLFxuICApO1xuICBjb25zdCBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZ29vZC5qc29uJyxcbiAgKTtcbiAgY29uc3QgR09PRF9KU19DT05GSUdfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2FwcGl1bS5jb25maWcuZ29vZC5qcycpO1xuICBjb25zdCBHT09EX1lBTUxfQ09ORklHID0gWUFNTC5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCwgJ3V0ZjgnKSxcbiAgKTtcbiAgY29uc3QgR09PRF9KU09OX0NPTkZJRyA9IHJlcXVpcmUoR09PRF9KU09OX0NPTkZJR19GSUxFUEFUSCk7XG4gIGNvbnN0IEJBRF9KU09OX0NPTkZJR19GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmJhZC5qc29uJyxcbiAgKTtcbiAgY29uc3QgQkFEX0pTT05fQ09ORklHID0gcmVxdWlyZShCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU2FuZGJveH1cbiAgICovXG4gIGxldCBzYW5kYm94O1xuXG4gIC8qKlxuICAgKiBgcmVhZENvbmZpZ0ZpbGUoKWAgZnJvbSBhbiBpc29sYXRlZCBgY29uZmlnLWZpbGVgIG1vZHVsZVxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi4vbGliL2NvbmZpZy1maWxlJykucmVhZENvbmZpZ0ZpbGV9XG4gICAqL1xuICBsZXQgcmVhZENvbmZpZ0ZpbGU7XG4gIC8qKlxuICAgKiBNb2NrIGluc3RhbmNlIG9mIGBsaWxjb25maWdgIGNvbnRhaW5pbmcgc3R1YnMgZm9yXG4gICAqIGBsaWxjb25maWcjc2VhcmNoKClgIGFuZCBgbGlsY29uZmlnI2xvYWRgLlxuICAgKiBOb3QgX2FjdHVhbGx5XyBhIGBTaW5vblN0dWJiZWRJbnN0YW5jZWAsIGJ1dCBkdWNrLXR5cGVkLlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3R1YmJlZEluc3RhbmNlPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+Pn1cbiAgICovXG4gIGxldCBsYztcblxuICAvKipcbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4uL2xpYi9jb25maWctZmlsZScpfVxuICAgKi9cbiAgbGV0IGNvbmZpZ0ZpbGVNb2R1bGU7XG5cbiAgbGV0IG1vY2tzO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gZ2VuZXJhbGx5IGNhbGxlZCB2aWEgdGhlIENMSSBwYXJzZXIsIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBtYW51YWxseSBpbiB0ZXN0cy5cbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIF9lYWNoXyB0ZXN0LCBiZWNhdXNlIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgc2NoZW1hLlxuICAgIC8vIGlmIHdlIGRpZCBjaGFuZ2UgdGhlIHNjaGVtYSwgdGhpcyB3b3VsZCBuZWVkIHRvIGJlIGluIGBiZWZvcmVFYWNoKClgIGFuZCBgYWZ0ZXJFYWNoKClgXG4gICAgLy8gd291bGQgbmVlZCB0byBjYWxsIGBzY2hlbWEucmVzZXQoKWAuXG4gICAgc2NoZW1hLmZpbmFsaXplU2NoZW1hKCk7XG4gIH0pO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG5cbiAgICAvLyB3ZSBoYXZlIHRvIG1hbnVhbGx5IHR5cGUgdGhpcyAoYW5kIGBzZWFyY2goKWApIGJlY2F1c2Ugd2UnZCBvbmx5IGdldCB0aGUgcmVhbCB0eXBlXG4gICAgLy8gd2hlbiBzdHViYmluZyBhbiBvYmplY3QgcHJvcDsgZS5nLiwgYHN0dWIobGlsY29uZmlnLCAnbG9hZCcpYFxuICAgIGNvbnN0IGxvYWQgPSAvKiogQHR5cGUge0FzeW5jU2VhcmNoZXJMb2FkU3R1Yn0gKi8gKFxuICAgICAgc2FuZGJveC5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBjb25maWc6IEdPT0RfSlNPTl9DT05GSUcsXG4gICAgICAgIGZpbGVwYXRoOiBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRILFxuICAgICAgfSlcbiAgICApO1xuICAgIGxvYWQud2l0aEFyZ3MoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCkucmVzb2x2ZXMoe1xuICAgICAgY29uZmlnOiBHT09EX1lBTUxfQ09ORklHLFxuICAgICAgZmlsZXBhdGg6IEdPT0RfWUFNTF9DT05GSUdfRklMRVBBVEgsXG4gICAgfSk7XG4gICAgbG9hZC53aXRoQXJncyhCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpLnJlc29sdmVzKHtcbiAgICAgIGNvbmZpZzogQkFEX0pTT05fQ09ORklHLFxuICAgICAgZmlsZXBhdGg6IEJBRF9KU09OX0NPTkZJR19GSUxFUEFUSCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlYXJjaCA9IC8qKiBAdHlwZSB7QXN5bmNTZWFyY2hlckxvYWRTdHVifSAqLyAoXG4gICAgICBzYW5kYm94LnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGNvbmZpZzogR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgZmlsZXBhdGg6IEdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBsYyA9IHtcbiAgICAgIGxvYWQsXG4gICAgICBzZWFyY2gsXG4gICAgfTtcblxuICAgIG1vY2tzID0ge1xuICAgICAgbGlsY29uZmlnOiB7XG4gICAgICAgIGxpbGNvbmZpZzogc2FuZGJveC5zdHViKCkucmV0dXJucyhsYyksXG4gICAgICB9LFxuICAgICAgJ0BzaWR2aW5kL2JldHRlci1hanYtZXJyb3JzJzogc2FuZGJveC5zdHViKCkucmV0dXJucygnJyksXG4gICAgfTtcblxuICAgIC8vIGxvYWRzIHRoZSBgY29uZmlnLWZpbGVgIG1vZHVsZSB1c2luZyB0aGUgbGlsY29uZmlnIG1vY2suXG4gICAgLy8gd2Ugb25seSBtb2NrIGxpbGNvbmZpZyBiZWNhdXNlIGl0J2Qgb3RoZXJ3aXNlIGJlIGEgcGFpbiBpbiB0aGUgcmVhciB0byB0ZXN0XG4gICAgLy8gc2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMsIGFuZCBpdCBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCB3ZSdkIGxvYWQgdGhlIHdyb25nIGZpbGUuXG4gICAgY29uZmlnRmlsZU1vZHVsZSA9IHJld2lyZW1vY2sucHJveHkoKCkgPT4gcmVxdWlyZSgnLi4vbGliL2NvbmZpZy1maWxlJyksIG1vY2tzKTtcbiAgICByZWFkQ29uZmlnRmlsZSA9IGNvbmZpZ0ZpbGVNb2R1bGUucmVhZENvbmZpZ0ZpbGU7XG5cbiAgICAvLyBqdXN0IHdhbnQgdG8gYmUgZXh0cmEtc3VyZSBgdmFsaWRhdGUoKWAgaGFwcGVuc1xuICAgIHNhbmRib3guc3B5KHNjaGVtYSwgJ3ZhbGlkYXRlJyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkQ29uZmlnRmlsZSgpJywgZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtpbXBvcnQoJy4uL2xpYi9jb25maWctZmlsZScpLlJlYWRDb25maWdGaWxlUmVzdWx0fVxuICAgICAqL1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgeWFtbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHtjb25maWd9ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCk7XG4gICAgICBleHBlY3QoY29uZmlnKS50by5lcWwoR09PRF9KU09OX0NPTkZJRyk7XG4gICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VwcG9ydCBqc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSBhd2FpdCByZWFkQ29uZmlnRmlsZShHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRIKTtcbiAgICAgIGV4cGVjdChjb25maWcpLnRvLmVxbChHT09EX0pTT05fQ09ORklHKTtcbiAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGpzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSBhd2FpdCByZWFkQ29uZmlnRmlsZShHT09EX0pTX0NPTkZJR19GSUxFUEFUSCk7XG4gICAgICBleHBlY3QoY29uZmlnKS50by5lcWwoR09PRF9KU09OX0NPTkZJRyk7XG4gICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIG5vIGZpbGVwYXRoIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzZWFyY2ggZm9yIGEgY29uZmlnIGZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChsYy5zZWFyY2gpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0cnkgdG8gbG9hZCBhIGNvbmZpZyBmaWxlIGRpcmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobGMubG9hZCkudG8ubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gbm8gY29uZmlnIGZpbGUgaXMgZm91bmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLnNlYXJjaC5yZXNvbHZlcygpO1xuICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3BpZWRNZW1iZXI8dHlwZW9mIHNjaGVtYS52YWxpZGF0ZT59ICovKHNjaGVtYS52YWxpZGF0ZSkucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHdpdGggYW4gZW1wdHkgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmJlLmFuKCdvYmplY3QnKS50aGF0LmlzLmVtcHR5O1xuICAgICAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLm5vdC50by5oYXZlLmJlZW4uY2FsbGVkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBhIGNvbmZpZyBmaWxlIGlzIGZvdW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsYy5zZWFyY2gucmVzb2x2ZXMoe1xuICAgICAgICAgICAgICBpc0VtcHR5OiB0cnVlLFxuICAgICAgICAgICAgICBmaWxlcGF0aDogJy9wYXRoL3RvL2ZpbGUuanNvbicsXG4gICAgICAgICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCB3aXRoIGFuIGBpc0VtcHR5YCBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2lzRW1wdHknLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIG5vdCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRoZSBjb25maWcgYWdhaW5zdCBhIHNjaGVtYScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlV2l0aChcbiAgICAgICAgICAgICAgR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgd2l0aCBhbiBvYmplY3QgaGF2aW5nIGBjb25maWdgIHByb3BlcnR5IGFuZCBlbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICAgIGNvbmZpZzogR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRILFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgbGMuc2VhcmNoLnJlc29sdmVzKHtcbiAgICAgICAgICAgICAgICBjb25maWc6IHtmb286ICdiYXInfSxcbiAgICAgICAgICAgICAgICBmaWxlcGF0aDogJy9wYXRoL3RvL2ZpbGUuanNvbicsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYSBub25lbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMubm90LmVtcHR5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBmaWxlcGF0aCBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGZpbmQgYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGxjLnNlYXJjaCkudG8ubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0cnkgdG8gbG9hZCBhIGNvbmZpZyBmaWxlIGRpcmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobGMubG9hZCkudG8uaGF2ZS5iZWVuLmNhbGxlZE9uY2U7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gbm8gY29uZmlnIGZpbGUgZXhpc3RzIGF0IHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLmxvYWQucmVqZWN0cyhPYmplY3QuYXNzaWduKG5ldyBFcnJvcigpLCB7Y29kZTogJ0VOT0VOVCd9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL25vdCBmb3VuZCBhdCB1c2VyLXByb3ZpZGVkIHBhdGgvLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLmxvYWQucmVqZWN0cyhuZXcgU3ludGF4RXJyb3IoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL0NvbmZpZyBmaWxlIGF0IHVzZXItcHJvdmlkZWQgcGF0aCBhcHBpdW0uanNvbiBpcyBpbnZhbGlkLyxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyB3aXRoIGxvYWRpbmcgdGhlIGNvbmZpZyBmaWxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsYy5sb2FkLnJlamVjdHMobmV3IEVycm9yKCdndXJ1IG1lZGl0YXRpb24nKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGFzcyBlcnJvciB0aHJvdWdoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL2d1cnUgbWVkaXRhdGlvbi8sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gYSBjb25maWcgZmlsZSBpcyBmb3VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGMuc2VhcmNoLnJlc29sdmVzKHtcbiAgICAgICAgICAgICAgaXNFbXB0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgZmlsZXBhdGg6ICcvcGF0aC90by9maWxlLmpzb24nLFxuICAgICAgICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHdpdGggYW4gb2JqZWN0IHdpdGggYW4gYGlzRW1wdHlgIHByb3BlcnR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uaGF2ZS5wcm9wZXJ0eSgnaXNFbXB0eScsIHRydWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgbm90IGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIGNvbmZpZyBhZ2FpbnN0IGEgc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHNjaGVtYS52YWxpZGF0ZSkudG8uaGF2ZS5iZWVuLmNhbGxlZE9uY2VXaXRoKFxuICAgICAgICAgICAgICBHT09EX0pTT05fQ09ORklHLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyB2YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYGNvbmZpZ2AgcHJvcGVydHkgYW5kIGVtcHR5IGFycmF5IG9mIGVycm9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgICAgICBjb25maWc6IEdPT0RfSlNPTl9DT05GSUcsXG4gICAgICAgICAgICAgICAgZmlsZXBhdGg6IEdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYSBub25lbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMubm90LmVtcHR5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb3JtYXRFcnJvcnMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBgZXJyb3JzYCBhcyBhbiBlbXB0eSBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycyhbXSkpLnRvLnRocm93KFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAnQXJyYXkgb2YgZXJyb3JzIG11c3QgYmUgbm9uLWVtcHR5JyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gcHJvdmlkZWQgYGVycm9yc2AgYXMgYHVuZGVmaW5lZGAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGV4cGVjdCgoKSA9PiBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycygpKS50by50aHJvdyhcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgJ0FycmF5IG9mIGVycm9ycyBtdXN0IGJlIG5vbi1lbXB0eScsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGBlcnJvcnNgIGFzIGEgbm9uLWVtcHR5IGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXhwZWN0KGNvbmZpZ0ZpbGVNb2R1bGUuZm9ybWF0RXJyb3JzKFt7fV0pKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gYG9wdHMuanNvbmAgaXMgYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGNhbGwgYGJldHRlckFqdkVycm9ycygpYCB3aXRoIG9wdGlvbiBganNvbjogb3B0cy5qc29uYCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycyhbe31dLCB7fSwge2pzb246ICd7XCJmb29cIjogXCJiYXJcIn0nfSk7XG4gICAgICAgIGV4cGVjdChtb2Nrc1snQHNpZHZpbmQvYmV0dGVyLWFqdi1lcnJvcnMnXSkudG8uaGF2ZS5iZWVuLmNhbGxlZFdpdGgoXG4gICAgICAgICAgc2NoZW1hLmdldFNjaGVtYSgpLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFt7fV0sXG4gICAgICAgICAge2Zvcm1hdDogJ2NsaScsIGpzb246ICd7XCJmb29cIjogXCJiYXJcIn0nfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vLyB0aGUgZm9sbG93aW5nIGFyZSBqdXN0IGFsaWFzZXNcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdH0gRXJyb3JPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FqdicpLlZhbGlkYXRlRnVuY3Rpb259IFZhbGlkYXRlRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TdHViYmVkTWVtYmVyPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+Wydsb2FkJ10+fSBBc3luY1NlYXJjaGVyTG9hZFN0dWJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TdHViYmVkTWVtYmVyPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+WydzZWFyY2gnXT59IEFzeW5jU2VhcmNoZXJTZWFyY2hTdHViXG4gKi9cbiJdLCJmaWxlIjoidGVzdC9jb25maWctZmlsZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
-
|
|
9
|
-
var _sinon = _interopRequireDefault(require("sinon"));
|
|
10
|
-
|
|
11
|
-
var _parser = _interopRequireDefault(require("../lib/cli/parser"));
|
|
12
|
-
|
|
13
|
-
var _config = require("../lib/config");
|
|
14
|
-
|
|
15
|
-
var _logger = _interopRequireDefault(require("../lib/logger"));
|
|
16
|
-
|
|
17
|
-
var _schema = require("../lib/schema/schema");
|
|
18
|
-
|
|
19
|
-
describe('Config', function () {
|
|
20
|
-
describe('Appium config', function () {
|
|
21
|
-
describe('showConfig', function () {
|
|
22
|
-
before(function () {
|
|
23
|
-
_sinon.default.spy(console, 'log');
|
|
24
|
-
});
|
|
25
|
-
it('should log the config to console', async function () {
|
|
26
|
-
const config = (0, _config.getBuildInfo)();
|
|
27
|
-
await (0, _config.showConfig)();
|
|
28
|
-
console.log.calledOnce.should.be.true;
|
|
29
|
-
console.log.getCall(0).args[0].should.contain(JSON.stringify(config));
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe('node.js config', function () {
|
|
34
|
-
let _process = process;
|
|
35
|
-
before(function () {
|
|
36
|
-
let tempProcess = {};
|
|
37
|
-
|
|
38
|
-
for (let [prop, value] of _lodash.default.toPairs(process)) {
|
|
39
|
-
tempProcess[prop] = value;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
process = tempProcess;
|
|
43
|
-
});
|
|
44
|
-
after(function () {
|
|
45
|
-
process = _process;
|
|
46
|
-
});
|
|
47
|
-
describe('checkNodeOk', function () {
|
|
48
|
-
describe('unsupported nodes', function () {
|
|
49
|
-
const unsupportedVersions = ['v0.1', 'v0.9.12', 'v0.10.36', 'v0.12.14', 'v4.4.7', 'v5.7.0', 'v6.3.1', 'v7.1.1', 'v8.0.0', 'v9.2.3', 'v10.1.0'];
|
|
50
|
-
|
|
51
|
-
for (const version of unsupportedVersions) {
|
|
52
|
-
it(`should fail if node is ${version}`, function () {
|
|
53
|
-
process.version = version;
|
|
54
|
-
|
|
55
|
-
_config.checkNodeOk.should.throw();
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
describe('supported nodes', function () {
|
|
60
|
-
it('should succeed if node is 12+', function () {
|
|
61
|
-
process.version = 'v12.0.1';
|
|
62
|
-
|
|
63
|
-
_config.checkNodeOk.should.not.throw();
|
|
64
|
-
});
|
|
65
|
-
it('should succeed if node is 13+', function () {
|
|
66
|
-
process.version = 'v13.6.0';
|
|
67
|
-
|
|
68
|
-
_config.checkNodeOk.should.not.throw();
|
|
69
|
-
});
|
|
70
|
-
it('should succeed if node is 14+', function () {
|
|
71
|
-
process.version = 'v14.0.0';
|
|
72
|
-
|
|
73
|
-
_config.checkNodeOk.should.not.throw();
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
describe('warnNodeDeprecations', function () {
|
|
78
|
-
let spy;
|
|
79
|
-
before(function () {
|
|
80
|
-
spy = _sinon.default.spy(_logger.default, 'warn');
|
|
81
|
-
});
|
|
82
|
-
beforeEach(function () {
|
|
83
|
-
spy.resetHistory();
|
|
84
|
-
});
|
|
85
|
-
it('should not log a warning if node is 8+', function () {
|
|
86
|
-
process.version = 'v8.0.0';
|
|
87
|
-
(0, _config.warnNodeDeprecations)();
|
|
88
|
-
|
|
89
|
-
_logger.default.warn.callCount.should.equal(0);
|
|
90
|
-
});
|
|
91
|
-
it('should not log a warning if node is 9+', function () {
|
|
92
|
-
process.version = 'v9.0.0';
|
|
93
|
-
(0, _config.warnNodeDeprecations)();
|
|
94
|
-
|
|
95
|
-
_logger.default.warn.callCount.should.equal(0);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe('server arguments', function () {
|
|
100
|
-
let parser;
|
|
101
|
-
let args;
|
|
102
|
-
before(async function () {
|
|
103
|
-
parser = await (0, _parser.default)();
|
|
104
|
-
parser.debug = true;
|
|
105
|
-
});
|
|
106
|
-
beforeEach(function () {
|
|
107
|
-
args = (0, _schema.getDefaultsFromSchema)();
|
|
108
|
-
});
|
|
109
|
-
describe('getNonDefaultServerArgs', function () {
|
|
110
|
-
it('should show none if we have all the defaults', function () {
|
|
111
|
-
let nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(parser, args);
|
|
112
|
-
nonDefaultArgs.should.be.empty;
|
|
113
|
-
});
|
|
114
|
-
it('should catch a non-default argument', function () {
|
|
115
|
-
args.allowCors = true;
|
|
116
|
-
let nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(parser, args);
|
|
117
|
-
nonDefaultArgs.should.eql({
|
|
118
|
-
allowCors: true
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe('validateTmpDir', function () {
|
|
124
|
-
it('should fail to use a tmp dir with incorrect permissions', function () {
|
|
125
|
-
(0, _config.validateTmpDir)('/private/if_you_run_with_sudo_this_wont_fail').should.be.rejectedWith(/could not ensure/);
|
|
126
|
-
});
|
|
127
|
-
it('should fail to use an undefined tmp dir', function () {
|
|
128
|
-
(0, _config.validateTmpDir)().should.be.rejectedWith(/could not ensure/);
|
|
129
|
-
});
|
|
130
|
-
it('should be able to use a tmp dir with correct permissions', function () {
|
|
131
|
-
(0, _config.validateTmpDir)('/tmp/test_tmp_dir/with/any/number/of/levels').should.not.be.rejected;
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
describe('parsing args with empty argv[1]', function () {
|
|
135
|
-
let argv1;
|
|
136
|
-
before(function () {
|
|
137
|
-
argv1 = process.argv[1];
|
|
138
|
-
});
|
|
139
|
-
beforeEach(function () {
|
|
140
|
-
(0, _schema.resetSchema)();
|
|
141
|
-
});
|
|
142
|
-
after(function () {
|
|
143
|
-
process.argv[1] = argv1;
|
|
144
|
-
});
|
|
145
|
-
it('should not fail if process.argv[1] is undefined', async function () {
|
|
146
|
-
process.argv[1] = undefined;
|
|
147
|
-
let args = await (0, _parser.default)();
|
|
148
|
-
args.prog.should.be.equal('appium');
|
|
149
|
-
});
|
|
150
|
-
it('should set "prog" to process.argv[1]', async function () {
|
|
151
|
-
process.argv[1] = 'Hello World';
|
|
152
|
-
let args = await (0, _parser.default)();
|
|
153
|
-
args.prog.should.be.equal('Hello World');
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
});require('source-map-support').install();
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiYmVmb3JlIiwic2lub24iLCJzcHkiLCJjb25zb2xlIiwiaXQiLCJjb25maWciLCJsb2ciLCJjYWxsZWRPbmNlIiwic2hvdWxkIiwiYmUiLCJ0cnVlIiwiZ2V0Q2FsbCIsImFyZ3MiLCJjb250YWluIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9wcm9jZXNzIiwicHJvY2VzcyIsInRlbXBQcm9jZXNzIiwicHJvcCIsInZhbHVlIiwiXyIsInRvUGFpcnMiLCJhZnRlciIsInVuc3VwcG9ydGVkVmVyc2lvbnMiLCJ2ZXJzaW9uIiwiY2hlY2tOb2RlT2siLCJ0aHJvdyIsIm5vdCIsImxvZ2dlciIsImJlZm9yZUVhY2giLCJyZXNldEhpc3RvcnkiLCJ3YXJuIiwiY2FsbENvdW50IiwiZXF1YWwiLCJwYXJzZXIiLCJkZWJ1ZyIsIm5vbkRlZmF1bHRBcmdzIiwiZW1wdHkiLCJhbGxvd0NvcnMiLCJlcWwiLCJyZWplY3RlZFdpdGgiLCJyZWplY3RlZCIsImFyZ3YxIiwiYXJndiIsInVuZGVmaW5lZCIsInByb2ciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxRQUFRLENBQUMsUUFBRCxFQUFXLFlBQVk7QUFDN0JBLEVBQUFBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQVk7QUFDcENBLElBQUFBLFFBQVEsQ0FBQyxZQUFELEVBQWUsWUFBWTtBQUNqQ0MsTUFBQUEsTUFBTSxDQUFDLFlBQVk7QUFDakJDLHVCQUFNQyxHQUFOLENBQVVDLE9BQVYsRUFBbUIsS0FBbkI7QUFDRCxPQUZLLENBQU47QUFHQUMsTUFBQUEsRUFBRSxDQUFDLGtDQUFELEVBQXFDLGtCQUFrQjtBQUN2RCxjQUFNQyxNQUFNLEdBQUcsMkJBQWY7QUFDQSxjQUFNLHlCQUFOO0FBQ0FGLFFBQUFBLE9BQU8sQ0FBQ0csR0FBUixDQUFZQyxVQUFaLENBQXVCQyxNQUF2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S0FGSSxDQUFMO0FBSUF2QyxJQUFBQSxFQUFFLENBQUMsaURBQUQsRUFBb0Qsa0JBQWtCO0FBQ3RFYSxNQUFBQSxPQUFPLENBQUMyQixJQUFSLENBQWEsQ0FBYixJQUFrQkMsU0FBbEI7QUFDQSxVQUFJakMsSUFBSSxHQUFHLE1BQU0sc0JBQWpCO0FBQ0FBLE1BQUFBLElBQUksQ0FBQ2tDLElBQUwsQ0FBVXRDLE1BQVYsQ0FBaUJDLEVBQWpCLENBQW9CeUIsS0FBcEIsQ0FBMEIsUUFBMUI7QUFDRCxLQUpDLENBQUY7QUFNQTlCLElBQUFBLEVBQUUsQ0FBQyxzQ0FBRCxFQUF5QyxrQkFBa0I7QUFDM0RhLE1BQUFBLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxDQUFiLElBQWtCLGFBQWxCO0FBQ0EsVUFBSWhDLElBQUksR0FBRyxNQUFNLHNCQUFqQjtBQUNBQSxNQUFBQSxJQUFJLENBQUNrQyxJQUFMLENBQVV0QyxNQUFWLENBQWlCQyxFQUFqQixDQUFvQnlCLEtBQXBCLENBQTBCLGFBQTFCO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0ExQk8sQ0FBUjtBQTRCRCxDQXJKTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IGdldFBhcnNlciBmcm9tICcuLi9saWIvY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBjaGVja05vZGVPaywgZ2V0QnVpbGRJbmZvLCBnZXROb25EZWZhdWx0U2VydmVyQXJncywgc2hvd0NvbmZpZywgdmFsaWRhdGVUbXBEaXIsIHdhcm5Ob2RlRGVwcmVjYXRpb25zIH0gZnJvbSAnLi4vbGliL2NvbmZpZyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xpYi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHNGcm9tU2NoZW1hLCByZXNldFNjaGVtYSB9IGZyb20gJy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuZGVzY3JpYmUoJ0NvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ0FwcGl1bSBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ3Nob3dDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgICBzaW5vbi5zcHkoY29uc29sZSwgJ2xvZycpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGxvZyB0aGUgY29uZmlnIHRvIGNvbnNvbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldEJ1aWxkSW5mbygpO1xuICAgICAgICBhd2FpdCBzaG93Q29uZmlnKCk7XG4gICAgICAgIGNvbnNvbGUubG9nLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZy5nZXRDYWxsKDApLmFyZ3NbMF0uc2hvdWxkLmNvbnRhaW4oSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub2RlLmpzIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgX3Byb2Nlc3MgPSBwcm9jZXNzO1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBuZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gcHJvY2Vzcy52ZXJzaW9uXG4gICAgICAvLyBidXQgYWxzbyB0byBoYXZlIGFjY2VzcyB0byBwcm9jZXNzIG1ldGhvZHNcbiAgICAgIC8vIHNvIGNvcHkgdGhlbSBvdmVyIHRvIGEgd3JpdGFibGUgb2JqZWN0XG4gICAgICBsZXQgdGVtcFByb2Nlc3MgPSB7fTtcbiAgICAgIGZvciAobGV0IFtwcm9wLCB2YWx1ZV0gb2YgXy50b1BhaXJzKHByb2Nlc3MpKSB7XG4gICAgICAgIHRlbXBQcm9jZXNzW3Byb3BdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBwcm9jZXNzID0gdGVtcFByb2Nlc3M7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxuICAgIH0pO1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MgPSBfcHJvY2VzczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1nbG9iYWwtYXNzaWduXG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ2NoZWNrTm9kZU9rJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3Vuc3VwcG9ydGVkIG5vZGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZFZlcnNpb25zID0gW1xuICAgICAgICAgICd2MC4xJywgJ3YwLjkuMTInLCAndjAuMTAuMzYnLCAndjAuMTIuMTQnLFxuICAgICAgICAgICd2NC40LjcnLCAndjUuNy4wJywgJ3Y2LjMuMScsICd2Ny4xLjEnLFxuICAgICAgICAgICd2OC4wLjAnLCAndjkuMi4zJywgJ3YxMC4xLjAnLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnNpb24gb2YgdW5zdXBwb3J0ZWRWZXJzaW9ucykge1xuICAgICAgICAgIGl0KGBzaG91bGQgZmFpbCBpZiBub2RlIGlzICR7dmVyc2lvbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLnRocm93KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc3VwcG9ydGVkIG5vZGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgaWYgbm9kZSBpcyAxMisnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gJ3YxMi4wLjEnO1xuICAgICAgICAgIGNoZWNrTm9kZU9rLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCBpZiBub2RlIGlzIDEzKycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEzLjYuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTQrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHByb2Nlc3MudmVyc2lvbiA9ICd2MTQuMC4wJztcbiAgICAgICAgICBjaGVja05vZGVPay5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2Fybk5vZGVEZXByZWNhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc3B5O1xuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3B5ID0gc2lub24uc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgICAgIH0pO1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweS5yZXNldEhpc3RvcnkoKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgbG9nIGEgd2FybmluZyBpZiBub2RlIGlzIDgrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjguMC4wJztcbiAgICAgICAgd2Fybk5vZGVEZXByZWNhdGlvbnMoKTtcbiAgICAgICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgbG9nIGEgd2FybmluZyBpZiBub2RlIGlzIDkrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjkuMC4wJztcbiAgICAgICAgd2Fybk5vZGVEZXByZWNhdGlvbnMoKTtcbiAgICAgICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VydmVyIGFyZ3VtZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcGFyc2VyO1xuICAgIGxldCBhcmdzO1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBhcnNlciA9IGF3YWl0IGdldFBhcnNlcigpO1xuICAgICAgcGFyc2VyLmRlYnVnID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZ2V0IGFsbCB0aGUgZGVmYXVsdHNcbiAgICAgIGFyZ3MgPSBnZXREZWZhdWx0c0Zyb21TY2hlbWEoKTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHNob3cgbm9uZSBpZiB3ZSBoYXZlIGFsbCB0aGUgZGVmYXVsdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBub25EZWZhdWx0QXJncyA9IGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKHBhcnNlciwgYXJncyk7XG4gICAgICAgIG5vbkRlZmF1bHRBcmdzLnNob3VsZC5iZS5lbXB0eTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBjYXRjaCBhIG5vbi1kZWZhdWx0IGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzLmFsbG93Q29ycyA9IHRydWU7XG4gICAgICAgIGxldCBub25EZWZhdWx0QXJncyA9IGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKHBhcnNlciwgYXJncyk7XG4gICAgICAgIG5vbkRlZmF1bHRBcmdzLnNob3VsZC5lcWwoe2FsbG93Q29yczogdHJ1ZX0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlVG1wRGlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB1c2UgYSB0bXAgZGlyIHdpdGggaW5jb3JyZWN0IHBlcm1pc3Npb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFsaWRhdGVUbXBEaXIoJy9wcml2YXRlL2lmX3lvdV9ydW5fd2l0aF9zdWRvX3RoaXNfd29udF9mYWlsJykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvY291bGQgbm90IGVuc3VyZS8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB1c2UgYW4gdW5kZWZpbmVkIHRtcCBkaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWxpZGF0ZVRtcERpcigpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2NvdWxkIG5vdCBlbnN1cmUvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gdXNlIGEgdG1wIGRpciB3aXRoIGNvcnJlY3QgcGVybWlzc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWxpZGF0ZVRtcERpcignL3RtcC90ZXN0X3RtcF9kaXIvd2l0aC9hbnkvbnVtYmVyL29mL2xldmVscycpLnNob3VsZC5ub3QuYmUucmVqZWN0ZWQ7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzaW5nIGFyZ3Mgd2l0aCBlbXB0eSBhcmd2WzFdJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhcmd2MTtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBhcmd2MSA9IHByb2Nlc3MuYXJndlsxXTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgcmVzZXRTY2hlbWEoKTtcbiAgICB9KTtcblxuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MuYXJndlsxXSA9IGFyZ3YxO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZmFpbCBpZiBwcm9jZXNzLmFyZ3ZbMV0gaXMgdW5kZWZpbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5hcmd2WzFdID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGFyZ3MgPSBhd2FpdCBnZXRQYXJzZXIoKTtcbiAgICAgIGFyZ3MucHJvZy5zaG91bGQuYmUuZXF1YWwoJ2FwcGl1bScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgXCJwcm9nXCIgdG8gcHJvY2Vzcy5hcmd2WzFdJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5hcmd2WzFdID0gJ0hlbGxvIFdvcmxkJztcbiAgICAgIGxldCBhcmdzID0gYXdhaXQgZ2V0UGFyc2VyKCk7XG4gICAgICBhcmdzLnByb2cuc2hvdWxkLmJlLmVxdWFsKCdIZWxsbyBXb3JsZCcpO1xuICAgIH0pO1xuICB9KTtcblxufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|