appium 2.0.0-beta.24 → 2.0.0-beta.25
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/build/lib/config-file.js +4 -7
- package/build/lib/config.js +44 -15
- package/build/lib/main.js +3 -4
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/schema.js +9 -3
- package/build/test/config-file-e2e-specs.js +11 -29
- package/build/test/config-specs.js +25 -13
- package/lib/config-file.js +9 -12
- package/lib/config.js +50 -20
- package/lib/main.js +6 -5
- package/lib/schema/arg-spec.js +1 -1
- package/lib/schema/schema.js +8 -2
- package/package.json +4 -4
|
@@ -4,6 +4,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
|
|
5
5
|
require("source-map-support/register");
|
|
6
6
|
|
|
7
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
+
|
|
7
9
|
var _sinon = _interopRequireDefault(require("sinon"));
|
|
8
10
|
|
|
9
11
|
var _parser = _interopRequireDefault(require("../lib/cli/parser"));
|
|
@@ -37,19 +39,21 @@ describe('Config', function () {
|
|
|
37
39
|
log.firstCall.args.should.contain(JSON.stringify(config));
|
|
38
40
|
});
|
|
39
41
|
});
|
|
40
|
-
describe('showConfig', function () {
|
|
42
|
+
describe('showConfig()', function () {
|
|
41
43
|
describe('when a config file is present', function () {
|
|
42
44
|
it('should dump the current Appium config', function () {
|
|
43
45
|
(0, _config.showConfig)({
|
|
44
|
-
|
|
46
|
+
address: 'bar'
|
|
45
47
|
}, {
|
|
46
48
|
config: {
|
|
47
49
|
server: {
|
|
48
|
-
|
|
50
|
+
callbackAddress: 'quux'
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
}, {
|
|
52
|
-
|
|
54
|
+
port: 1234
|
|
55
|
+
}, {
|
|
56
|
+
allowCors: false
|
|
53
57
|
});
|
|
54
58
|
log.should.have.been.calledWith('Appium Configuration\n');
|
|
55
59
|
});
|
|
@@ -68,7 +72,7 @@ describe('Config', function () {
|
|
|
68
72
|
}
|
|
69
73
|
}, {
|
|
70
74
|
spam: 'food'
|
|
71
|
-
});
|
|
75
|
+
}, {});
|
|
72
76
|
dir.should.have.been.calledWith({
|
|
73
77
|
foo: 'bar',
|
|
74
78
|
sheep: 0,
|
|
@@ -77,13 +81,23 @@ describe('Config', function () {
|
|
|
77
81
|
});
|
|
78
82
|
});
|
|
79
83
|
describe('when a config file is not present', function () {
|
|
80
|
-
it('should dump the current Appium config sans config file contents', function () {
|
|
84
|
+
it('should dump the current Appium config (sans config file contents)', function () {
|
|
81
85
|
(0, _config.showConfig)({
|
|
82
|
-
foo: 'bar'
|
|
86
|
+
foo: 'bar',
|
|
87
|
+
cows: {},
|
|
88
|
+
pigs: [],
|
|
89
|
+
sheep: 0,
|
|
90
|
+
ducks: false
|
|
83
91
|
}, {}, {
|
|
84
92
|
spam: 'food'
|
|
85
|
-
});
|
|
86
|
-
log.should.have.been.calledWith('(no configuration file loaded)
|
|
93
|
+
}, {});
|
|
94
|
+
log.should.have.been.calledWith('\n(no configuration file loaded)');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('when no CLI arguments (other than --show-config) provided', function () {
|
|
98
|
+
it('should not dump CLI args', function () {
|
|
99
|
+
(0, _config.showConfig)({}, {}, {}, {});
|
|
100
|
+
log.should.have.been.calledWith('\n(no CLI parameters provided)');
|
|
87
101
|
});
|
|
88
102
|
});
|
|
89
103
|
});
|
|
@@ -200,9 +214,7 @@ describe('Config', function () {
|
|
|
200
214
|
it('should catch a non-default argument', function () {
|
|
201
215
|
args['plugin.crypto-fiend.elite'] = false;
|
|
202
216
|
const nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(args);
|
|
203
|
-
nonDefaultArgs.should.eql({
|
|
204
|
-
'plugin.crypto-fiend.elite': false
|
|
205
|
-
});
|
|
217
|
+
nonDefaultArgs.should.eql(_lodash.default.set({}, 'plugin.crypto-fiend.elite', false));
|
|
206
218
|
});
|
|
207
219
|
});
|
|
208
220
|
});
|
|
@@ -243,4 +255,4 @@ describe('Config', function () {
|
|
|
243
255
|
});require('source-map-support').install();
|
|
244
256
|
|
|
245
257
|
|
|
246
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwic2FuZGJveCIsImJlZm9yZUVhY2giLCJzaW5vbiIsImNyZWF0ZVNhbmRib3giLCJhZnRlckVhY2giLCJyZXN0b3JlIiwibG9nIiwiZGlyIiwic3B5IiwiY29uc29sZSIsIml0IiwiY29uZmlnIiwic2hvdWxkIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWRPbmNlIiwiZmlyc3RDYWxsIiwiYXJncyIsImNvbnRhaW4iLCJKU09OIiwic3RyaW5naWZ5IiwiZm9vIiwic2VydmVyIiwiYWRkcmVzcyIsInNwYW0iLCJjYWxsZWRXaXRoIiwiY293cyIsInBpZ3MiLCJzaGVlcCIsImR1Y2tzIiwiX3Byb2Nlc3MiLCJwcm9jZXNzIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ1bnN1cHBvcnRlZFZlcnNpb25zIiwidmVyc2lvbiIsImNoZWNrTm9kZU9rIiwidGhyb3ciLCJub3QiLCJsb2dnZXIiLCJyZXNldEhpc3RvcnkiLCJ3YXJuIiwiY2FsbENvdW50IiwiZXF1YWwiLCJub25EZWZhdWx0QXJncyIsImJlIiwiZW1wdHkiLCJhbGxvd0NvcnMiLCJlcWwiLCJ1c2VQbHVnaW5zIiwidHlwZSIsInByb3BlcnRpZXMiLCJlbGl0ZSIsImRlZmF1bHQiLCJyZWplY3RlZFdpdGgiLCJyZWplY3RlZCIsImFyZ3YxIiwiYXJndiIsInByb2ciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxRQUFRLENBQUMsUUFBRCxFQUFXLFlBQVk7QUFFN0IsTUFBSUMsT0FBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQkQsSUFBQUEsT0FBTyxHQUFHRSxlQUFNQyxhQUFOLEVBQVY7QUFDRCxHQUZTLENBQVY7QUFJQUMsRUFBQUEsU0FBUyxDQUFDLFlBQVk7QUFDcEJKLElBQUFBLE9BQU8sQ0FBQ0ssT0FBUjtBQUNELEdBRlEsQ0FBVDtBQUlBTixFQUFBQSxRQUFR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akI7QUFDQUEsTUFBQUEsSUFBSSxDQUFDeUMsSUFBTCxDQUFVOUMsTUFBVixDQUFpQmlDLEVBQWpCLENBQW9CRixLQUFwQixDQUEwQixhQUExQjtBQUNELEtBSkMsQ0FBRjtBQUtELEdBMUJPLENBQVI7QUE0QkQsQ0FwTk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vLyB0cmFuc3BpbGU6bW9jaGFcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgZ2V0UGFyc2VyIGZyb20gJy4uL2xpYi9jbGkvcGFyc2VyJztcbmltcG9ydCB7IGNoZWNrTm9kZU9rLCBnZXRCdWlsZEluZm8sIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzLCBzaG93QnVpbGRJbmZvLCBzaG93Q29uZmlnLCB2YWxpZGF0ZVRtcERpciwgd2Fybk5vZGVEZXByZWNhdGlvbnMgfSBmcm9tICcuLi9saWIvY29uZmlnJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvclNjaGVtYSwgcmVzZXRTY2hlbWEsIHJlZ2lzdGVyU2NoZW1hLCBmaW5hbGl6ZVNjaGVtYSB9IGZyb20gJy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuZGVzY3JpYmUoJ0NvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TYW5kYm94fSAqL1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQXBwaXVtIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNweTxbbWVzc2FnZT86IGFueSwgLi4uZXh0cmE6IGFueVtdXSx2b2lkPn0gKi9cbiAgICBsZXQgbG9nO1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3B5PFttZXNzYWdlPzogYW55LCAuLi5leHRyYTogYW55W11dLHZvaWQ+fSAqL1xuICAgIGxldCBkaXI7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsb2cgPSBzYW5kYm94LnNweShjb25zb2xlLCAnbG9nJyk7XG4gICAgICBkaXIgPSBzYW5kYm94LnNweShjb25zb2xlLCAnZGlyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvd0J1aWxkSW5mbygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBsb2cgYnVpbGQgaW5mbyB0byBjb25zb2xlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRCdWlsZEluZm8oKTtcbiAgICAgICAgYXdhaXQgc2hvd0J1aWxkSW5mbygpO1xuICAgICAgICBsb2cuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgICAgICBsb2cuZmlyc3RDYWxsLmFyZ3Muc2hvdWxkLmNvbnRhaW4oSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG93Q29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gYSBjb25maWcgZmlsZSBpcyBwcmVzZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGR1bXAgdGhlIGN1cnJlbnQgQXBwaXVtIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG93Q29uZmlnKHtmb286ICdiYXInfSwge2NvbmZpZzoge3NlcnZlcjoge2FkZHJlc3M6ICdxdXV4J319fSwge3NwYW06ICdmb29kJ30pO1xuICAgICAgICAgIGxvZy5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZFdpdGgoJ0FwcGl1bSBDb25maWd1cmF0aW9uXFxuJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgc2tpcCBlbXB0eSBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3dDb25maWcoe2ZvbzogJ2JhcicsIGNvd3M6IHt9LCBwaWdzOiBbXSwgc2hlZXA6IDAsIGR1Y2tzOiBmYWxzZX0sIHtjb25maWc6IHtzZXJ2ZXI6IHthZGRyZXNzOiAncXV1eCd9fX0sIHtzcGFtOiAnZm9vZCd9KTtcbiAgICAgICAgICBkaXIuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRXaXRoKHtmb286ICdiYXInLCBzaGVlcDogMCwgZHVja3M6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29uZmlnIGZpbGUgaXMgbm90IHByZXNlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZHVtcCB0aGUgY3VycmVudCBBcHBpdW0gY29uZmlnIHNhbnMgY29uZmlnIGZpbGUgY29udGVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvd0NvbmZpZyh7Zm9vOiAnYmFyJ30sIHt9LCB7c3BhbTogJ2Zvb2QnfSk7XG4gICAgICAgICAgbG9nLnNob3VsZC5oYXZlLmJlZW4uY2FsbGVkV2l0aCgnKG5vIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2FkZWQpXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub2RlLmpzIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgX3Byb2Nlc3MgPSBwcm9jZXNzO1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBuZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gcHJvY2Vzcy52ZXJzaW9uXG4gICAgICAvLyBidXQgYWxzbyB0byBoYXZlIGFjY2VzcyB0byBwcm9jZXNzIG1ldGhvZHNcbiAgICAgIC8vIHNvIGNvcHkgdGhlbSBvdmVyIHRvIGEgd3JpdGFibGUgb2JqZWN0XG4gICAgICBwcm9jZXNzID0gey4uLnByb2Nlc3N9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWdsb2JhbC1hc3NpZ25cbiAgICB9KTtcbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzID0gX3Byb2Nlc3M7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdjaGVja05vZGVPaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlc2NyaWJlKCd1bnN1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRWZXJzaW9ucyA9IFtcbiAgICAgICAgICAndjAuMScsICd2MC45LjEyJywgJ3YwLjEwLjM2JywgJ3YwLjEyLjE0JyxcbiAgICAgICAgICAndjQuNC43JywgJ3Y1LjcuMCcsICd2Ni4zLjEnLCAndjcuMS4xJyxcbiAgICAgICAgICAndjguMC4wJywgJ3Y5LjIuMycsICd2MTAuMS4wJyxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHVuc3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgICAgICAgICBpdChgc2hvdWxkIGZhaWwgaWYgbm9kZSBpcyAke3ZlcnNpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgIGNoZWNrTm9kZU9rLnNob3VsZC50aHJvdygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3N1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTIrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEyLjAuMSc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTMrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEzLjYuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTQrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjE0LjAuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dhcm5Ob2RlRGVwcmVjYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHNweTtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweSA9IHNhbmRib3guc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgICAgIH0pO1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweS5yZXNldEhpc3RvcnkoKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgbG9nIGEgd2FybmluZyBpZiBub2RlIGlzIDgrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHByb2Nlc3MudmVyc2lvbiA9ICd2OC4wLjAnO1xuICAgICAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuICAgICAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBsb2cgYSB3YXJuaW5nIGlmIG5vZGUgaXMgOSsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gJ3Y5LjAuMCc7XG4gICAgICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG4gICAgICAgIGxvZ2dlci53YXJuLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlcnZlciBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICBkZXNjcmliZSgnZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2l0aG91dCBleHRlbnNpb24gc2NoZW1hcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHRzXG4gICAgICAgICAgYXJncyA9IGdldERlZmF1bHRzRm9yU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHNob3cgbm9uZSBpZiB3ZSBoYXZlIGFsbCB0aGUgZGVmYXVsdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBjYXRjaCBhIG5vbi1kZWZhdWx0IGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3MuYWxsb3dDb3JzID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKHthbGxvd0NvcnM6IHRydWV9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGFyZyBpcyBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgYXJnIGFzIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXJncy51c2VQbHVnaW5zID0gWydhbGwnXTtcbiAgICAgICAgICAgIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKGFyZ3MpLnNob3VsZC5lcWwoe3VzZVBsdWdpbnM6IFsnYWxsJ119KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGRlc2NyaWJlKCd3aXRoIGV4dGVuc2lvbiBzY2hlbWFzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXNldFNjaGVtYSgpO1xuICAgICAgICAgIHJlZ2lzdGVyU2NoZW1hKCdwbHVnaW4nLCAnY3J5cHRvLWZpZW5kJywge3R5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7ZWxpdGU6IHt0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IHRydWV9fX0pO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIGFyZ3MgPSBnZXREZWZhdWx0c0ZvclNjaGVtYSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRha2UgZXh0ZW5zaW9uIHNjaGVtYXMgaW50byBhY2NvdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhdGNoIGEgbm9uLWRlZmF1bHQgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1sncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZSddID0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKHsncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZSc6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVRtcERpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGEgdG1wIGRpciB3aXRoIGluY29ycmVjdCBwZXJtaXNzaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbGlkYXRlVG1wRGlyKCcvcHJpdmF0ZS9pZl95b3VfcnVuX3dpdGhfc3Vkb190aGlzX3dvbnRfZmFpbCcpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2NvdWxkIG5vdCBlbnN1cmUvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGFuIHVuZGVmaW5lZCB0bXAgZGlyJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgdmFsaWRhdGVUbXBEaXIoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9jb3VsZCBub3QgZW5zdXJlLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHVzZSBhIHRtcCBkaXIgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFsaWRhdGVUbXBEaXIoJy90bXAvdGVzdF90bXBfZGlyL3dpdGgvYW55L251bWJlci9vZi9sZXZlbHMnKS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2luZyBhcmdzIHdpdGggZW1wdHkgYXJndlsxXScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYXJndjE7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgYXJndjEgPSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc2V0U2NoZW1hKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSBhcmd2MTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGZhaWwgaWYgcHJvY2Vzcy5hcmd2WzFdIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgICBsZXQgYXJncyA9IGF3YWl0IGdldFBhcnNlcigpO1xuICAgICAgYXJncy5wcm9nLnNob3VsZC5iZS5lcXVhbCgnYXBwaXVtJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBcInByb2dcIiB0byBwcm9jZXNzLmFyZ3ZbMV0nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSAnSGVsbG8gV29ybGQnO1xuICAgICAgbGV0IGFyZ3MgPSBhd2FpdCBnZXRQYXJzZXIoKTtcbiAgICAgIGFyZ3MucHJvZy5zaG91bGQuYmUuZXF1YWwoJ0hlbGxvIFdvcmxkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdLCJmaWxlIjoidGVzdC9jb25maWctc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
258
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwic2FuZGJveCIsImJlZm9yZUVhY2giLCJzaW5vbiIsImNyZWF0ZVNhbmRib3giLCJhZnRlckVhY2giLCJyZXN0b3JlIiwibG9nIiwiZGlyIiwic3B5IiwiY29uc29sZSIsIml0IiwiY29uZmlnIiwic2hvdWxkIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWRPbmNlIiwiZmlyc3RDYWxsIiwiYXJncyIsImNvbnRhaW4iLCJKU09OIiwic3RyaW5naWZ5IiwiYWRkcmVzcyIsInNlcnZlciIsImNhbGxiYWNrQWRkcmVzcyIsInBvcnQiLCJhbGxvd0NvcnMiLCJjYWxsZWRXaXRoIiwiZm9vIiwiY293cyIsInBpZ3MiLCJzaGVlcCIsImR1Y2tzIiwic3BhbSIsIl9wcm9jZXNzIiwicHJvY2VzcyIsImJlZm9yZSIsImFmdGVyIiwidW5zdXBwb3J0ZWRWZXJzaW9ucyIsInZlcnNpb24iLCJjaGVja05vZGVPayIsInRocm93Iiwibm90IiwibG9nZ2VyIiwicmVzZXRIaXN0b3J5Iiwid2FybiIsImNhbGxDb3VudCIsImVxdWFsIiwibm9uRGVmYXVsdEFyZ3MiLCJiZSIsImVtcHR5IiwiZXFsIiwidXNlUGx1Z2lucyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwiZWxpdGUiLCJkZWZhdWx0IiwiXyIsInNldCIsInJlamVjdGVkV2l0aCIsInJlamVjdGVkIiwiYXJndjEiLCJhcmd2IiwicHJvZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBWTtBQUU3QixNQUFJQyxPQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxJQUFBQSxPQUFPLEdBQUdFLGVBQU1DLGFBQU4sRUFBVjtBQUNELEdBRlMsQ0FBVjtBQUlBQyxFQUFBQSxTQUFTLENBQUMsWUFBWTtBQUNwQkosSUFBQUEsT0FBTyxD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QSxVQUFVLENBQUMsWUFBWTtBQUNyQjtBQUNELEtBRlMsQ0FBVjtBQUlBbUMsSUFBQUEsS0FBSyxDQUFDLFlBQVk7QUFDaEJGLE1BQUFBLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxDQUFiLElBQWtCRCxLQUFsQjtBQUNELEtBRkksQ0FBTDtBQUlBbEQsSUFBQUEsRUFBRSxDQUFDLGlEQUFELEVBQW9ELGtCQUFrQjtBQUN0RSxhQUFPd0IsT0FBTyxDQUFDMkIsSUFBUixDQUFhLENBQWIsQ0FBUDtBQUNBLFVBQUk1QyxJQUFJLEdBQUcsTUFBTSxzQkFBakI7QUFDQUEsTUFBQUEsSUFBSSxDQUFDNkMsSUFBTCxDQUFVbEQsTUFBVixDQUFpQm9DLEVBQWpCLENBQW9CRixLQUFwQixDQUEwQixRQUExQjtBQUNELEtBSkMsQ0FBRjtBQU1BcEMsSUFBQUEsRUFBRSxDQUFDLHNDQUFELEVBQXlDLGtCQUFrQjtBQUMzRHdCLE1BQUFBLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxDQUFiLElBQWtCLGFBQWxCO0FBQ0EsVUFBSTVDLElBQUksR0FBRyxNQUFNLHNCQUFqQjtBQUNBQSxNQUFBQSxJQUFJLENBQUM2QyxJQUFMLENBQVVsRCxNQUFWLENBQWlCb0MsRUFBakIsQ0FBb0JGLEtBQXBCLENBQTBCLGFBQTFCO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0ExQk8sQ0FBUjtBQTRCRCxDQWhQTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8vIHRyYW5zcGlsZTptb2NoYVxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgZ2V0UGFyc2VyIGZyb20gJy4uL2xpYi9jbGkvcGFyc2VyJztcbmltcG9ydCB7IGNoZWNrTm9kZU9rLCBnZXRCdWlsZEluZm8sIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzLCBzaG93QnVpbGRJbmZvLCBzaG93Q29uZmlnLCB2YWxpZGF0ZVRtcERpciwgd2Fybk5vZGVEZXByZWNhdGlvbnMgfSBmcm9tICcuLi9saWIvY29uZmlnJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvclNjaGVtYSwgcmVzZXRTY2hlbWEsIHJlZ2lzdGVyU2NoZW1hLCBmaW5hbGl6ZVNjaGVtYSB9IGZyb20gJy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuZGVzY3JpYmUoJ0NvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TYW5kYm94fSAqL1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQXBwaXVtIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNweTxbbWVzc2FnZT86IGFueSwgLi4uZXh0cmE6IGFueVtdXSx2b2lkPn0gKi9cbiAgICBsZXQgbG9nO1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3B5PFttZXNzYWdlPzogYW55LCAuLi5leHRyYTogYW55W11dLHZvaWQ+fSAqL1xuICAgIGxldCBkaXI7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsb2cgPSBzYW5kYm94LnNweShjb25zb2xlLCAnbG9nJyk7XG4gICAgICBkaXIgPSBzYW5kYm94LnNweShjb25zb2xlLCAnZGlyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvd0J1aWxkSW5mbygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBsb2cgYnVpbGQgaW5mbyB0byBjb25zb2xlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRCdWlsZEluZm8oKTtcbiAgICAgICAgYXdhaXQgc2hvd0J1aWxkSW5mbygpO1xuICAgICAgICBsb2cuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgICAgICBsb2cuZmlyc3RDYWxsLmFyZ3Muc2hvdWxkLmNvbnRhaW4oSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG93Q29uZmlnKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2hlbiBhIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZHVtcCB0aGUgY3VycmVudCBBcHBpdW0gY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3dDb25maWcoXG4gICAgICAgICAgICB7YWRkcmVzczogJ2Jhcid9LFxuICAgICAgICAgICAge2NvbmZpZzoge1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHNlcnZlcjoge2NhbGxiYWNrQWRkcmVzczogJ3F1dXgnfX1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7cG9ydDogMTIzNH0sXG4gICAgICAgICAgICB7YWxsb3dDb3JzOiBmYWxzZX1cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZy5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZFdpdGgoJ0FwcGl1bSBDb25maWd1cmF0aW9uXFxuJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgc2tpcCBlbXB0eSBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3dDb25maWcoXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB7Zm9vOiAnYmFyJywgY293czoge30sIHBpZ3M6IFtdLCBzaGVlcDogMCwgZHVja3M6IGZhbHNlfSxcbiAgICAgICAgICAgIHtjb25maWc6IHtzZXJ2ZXI6IHthZGRyZXNzOiAncXV1eCd9fX0sXG4gICAgICAgICAgICB7c3BhbTogJ2Zvb2QnfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaXIuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRXaXRoKHtmb286ICdiYXInLCBzaGVlcDogMCwgZHVja3M6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29uZmlnIGZpbGUgaXMgbm90IHByZXNlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZHVtcCB0aGUgY3VycmVudCBBcHBpdW0gY29uZmlnIChzYW5zIGNvbmZpZyBmaWxlIGNvbnRlbnRzKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG93Q29uZmlnKFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAge2ZvbzogJ2JhcicsIGNvd3M6IHt9LCBwaWdzOiBbXSwgc2hlZXA6IDAsIGR1Y2tzOiBmYWxzZX0sXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtzcGFtOiAnZm9vZCd9LFxuICAgICAgICAgICAge31cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZy5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZFdpdGgoJ1xcbihubyBjb25maWd1cmF0aW9uIGZpbGUgbG9hZGVkKScpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBubyBDTEkgYXJndW1lbnRzIChvdGhlciB0aGFuIC0tc2hvdy1jb25maWcpIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIG5vdCBkdW1wIENMSSBhcmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBzaG93Q29uZmlnKHt9LCB7fSwge30sIHt9KTtcbiAgICAgICAgICBsb2cuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRXaXRoKCdcXG4obm8gQ0xJIHBhcmFtZXRlcnMgcHJvdmlkZWQpJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub2RlLmpzIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgX3Byb2Nlc3MgPSBwcm9jZXNzO1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBuZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gcHJvY2Vzcy52ZXJzaW9uXG4gICAgICAvLyBidXQgYWxzbyB0byBoYXZlIGFjY2VzcyB0byBwcm9jZXNzIG1ldGhvZHNcbiAgICAgIC8vIHNvIGNvcHkgdGhlbSBvdmVyIHRvIGEgd3JpdGFibGUgb2JqZWN0XG4gICAgICBwcm9jZXNzID0gey4uLnByb2Nlc3N9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWdsb2JhbC1hc3NpZ25cbiAgICB9KTtcbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzID0gX3Byb2Nlc3M7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdjaGVja05vZGVPaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlc2NyaWJlKCd1bnN1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRWZXJzaW9ucyA9IFtcbiAgICAgICAgICAndjAuMScsICd2MC45LjEyJywgJ3YwLjEwLjM2JywgJ3YwLjEyLjE0JyxcbiAgICAgICAgICAndjQuNC43JywgJ3Y1LjcuMCcsICd2Ni4zLjEnLCAndjcuMS4xJyxcbiAgICAgICAgICAndjguMC4wJywgJ3Y5LjIuMycsICd2MTAuMS4wJyxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHVuc3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgICAgICAgICBpdChgc2hvdWxkIGZhaWwgaWYgbm9kZSBpcyAke3ZlcnNpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgIGNoZWNrTm9kZU9rLnNob3VsZC50aHJvdygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3N1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTIrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEyLjAuMSc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTMrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEzLjYuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTQrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjE0LjAuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dhcm5Ob2RlRGVwcmVjYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHNweTtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweSA9IHNhbmRib3guc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgICAgIH0pO1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweS5yZXNldEhpc3RvcnkoKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgbG9nIGEgd2FybmluZyBpZiBub2RlIGlzIDgrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHByb2Nlc3MudmVyc2lvbiA9ICd2OC4wLjAnO1xuICAgICAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuICAgICAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBsb2cgYSB3YXJuaW5nIGlmIG5vZGUgaXMgOSsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gJ3Y5LjAuMCc7XG4gICAgICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG4gICAgICAgIGxvZ2dlci53YXJuLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlcnZlciBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICBkZXNjcmliZSgnZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2l0aG91dCBleHRlbnNpb24gc2NoZW1hcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHRzXG4gICAgICAgICAgYXJncyA9IGdldERlZmF1bHRzRm9yU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHNob3cgbm9uZSBpZiB3ZSBoYXZlIGFsbCB0aGUgZGVmYXVsdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBjYXRjaCBhIG5vbi1kZWZhdWx0IGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3MuYWxsb3dDb3JzID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKHthbGxvd0NvcnM6IHRydWV9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGFyZyBpcyBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgYXJnIGFzIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXJncy51c2VQbHVnaW5zID0gWydhbGwnXTtcbiAgICAgICAgICAgIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKGFyZ3MpLnNob3VsZC5lcWwoe3VzZVBsdWdpbnM6IFsnYWxsJ119KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGRlc2NyaWJlKCd3aXRoIGV4dGVuc2lvbiBzY2hlbWFzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXNldFNjaGVtYSgpO1xuICAgICAgICAgIHJlZ2lzdGVyU2NoZW1hKCdwbHVnaW4nLCAnY3J5cHRvLWZpZW5kJywge3R5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7ZWxpdGU6IHt0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IHRydWV9fX0pO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIGFyZ3MgPSBnZXREZWZhdWx0c0ZvclNjaGVtYSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRha2UgZXh0ZW5zaW9uIHNjaGVtYXMgaW50byBhY2NvdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhdGNoIGEgbm9uLWRlZmF1bHQgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1sncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZSddID0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKF8uc2V0KHt9LCAncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZScsIGZhbHNlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVRtcERpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGEgdG1wIGRpciB3aXRoIGluY29ycmVjdCBwZXJtaXNzaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbGlkYXRlVG1wRGlyKCcvcHJpdmF0ZS9pZl95b3VfcnVuX3dpdGhfc3Vkb190aGlzX3dvbnRfZmFpbCcpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2NvdWxkIG5vdCBlbnN1cmUvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGFuIHVuZGVmaW5lZCB0bXAgZGlyJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgdmFsaWRhdGVUbXBEaXIoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9jb3VsZCBub3QgZW5zdXJlLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHVzZSBhIHRtcCBkaXIgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFsaWRhdGVUbXBEaXIoJy90bXAvdGVzdF90bXBfZGlyL3dpdGgvYW55L251bWJlci9vZi9sZXZlbHMnKS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2luZyBhcmdzIHdpdGggZW1wdHkgYXJndlsxXScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYXJndjE7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgYXJndjEgPSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc2V0U2NoZW1hKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSBhcmd2MTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGZhaWwgaWYgcHJvY2Vzcy5hcmd2WzFdIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgICBsZXQgYXJncyA9IGF3YWl0IGdldFBhcnNlcigpO1xuICAgICAgYXJncy5wcm9nLnNob3VsZC5iZS5lcXVhbCgnYXBwaXVtJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBcInByb2dcIiB0byBwcm9jZXNzLmFyZ3ZbMV0nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSAnSGVsbG8gV29ybGQnO1xuICAgICAgbGV0IGFyZ3MgPSBhd2FpdCBnZXRQYXJzZXIoKTtcbiAgICAgIGFyZ3MucHJvZy5zaG91bGQuYmUuZXF1YWwoJ0hlbGxvIFdvcmxkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdLCJmaWxlIjoidGVzdC9jb25maWctc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/lib/config-file.js
CHANGED
|
@@ -113,10 +113,9 @@ export async function readConfigFile (filepath, opts = {}) {
|
|
|
113
113
|
? await loadConfigFile(lc, filepath)
|
|
114
114
|
: await searchConfigFile(lc);
|
|
115
115
|
|
|
116
|
-
if (result && !result
|
|
117
|
-
const {
|
|
116
|
+
if (result?.filepath && !result?.isEmpty) {
|
|
117
|
+
const {pretty = true} = opts;
|
|
118
118
|
try {
|
|
119
|
-
/** @type {ReadConfigFileResult} */
|
|
120
119
|
let configResult;
|
|
121
120
|
const errors = validate(result.config);
|
|
122
121
|
if (_.isEmpty(errors)) {
|
|
@@ -131,12 +130,10 @@ export async function readConfigFile (filepath, opts = {}) {
|
|
|
131
130
|
: {...result, errors};
|
|
132
131
|
}
|
|
133
132
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
configResult.config
|
|
137
|
-
|
|
138
|
-
);
|
|
139
|
-
}
|
|
133
|
+
// normalize (to camel case) all top-level property names of the config file
|
|
134
|
+
configResult.config = normalizeConfig(
|
|
135
|
+
/** @type {AppiumConfig} */ (configResult.config),
|
|
136
|
+
);
|
|
140
137
|
|
|
141
138
|
return configResult;
|
|
142
139
|
} finally {
|
|
@@ -152,11 +149,12 @@ export async function readConfigFile (filepath, opts = {}) {
|
|
|
152
149
|
* @param {AppiumConfig} config - Configuration object
|
|
153
150
|
* @returns {NormalizedAppiumConfig} New object with camel-cased keys (or `dest` keys).
|
|
154
151
|
*/
|
|
155
|
-
function normalizeConfig (config) {
|
|
152
|
+
export function normalizeConfig (config) {
|
|
156
153
|
const schema = getSchema();
|
|
157
154
|
/**
|
|
158
155
|
* @param {AppiumConfig} config
|
|
159
156
|
* @param {string} [section] - Keypath (lodash `_.get()` style) to section of config. If omitted, assume root Appium config schema
|
|
157
|
+
* @todo Rewrite as a loop
|
|
160
158
|
* @returns Normalized section of config
|
|
161
159
|
*/
|
|
162
160
|
const normalize = (config, section) => {
|
|
@@ -187,7 +185,7 @@ function normalizeConfig (config) {
|
|
|
187
185
|
* @property {import('ajv').ErrorObject[]} [errors] - Validation errors
|
|
188
186
|
* @property {string} [filepath] - The path to the config file, if found
|
|
189
187
|
* @property {boolean} [isEmpty] - If `true`, the config file exists but is empty
|
|
190
|
-
* @property {
|
|
188
|
+
* @property {NormalizedAppiumConfig} [config] - The parsed configuration
|
|
191
189
|
* @property {string|betterAjvErrors.IOutputError[]} [reason] - Human-readable error messages and suggestions. If the `pretty` option is `true`, this will be a nice string to print.
|
|
192
190
|
*/
|
|
193
191
|
|
|
@@ -195,7 +193,6 @@ function normalizeConfig (config) {
|
|
|
195
193
|
* Options for {@link readConfigFile}.
|
|
196
194
|
* @typedef {Object} ReadConfigFileOptions
|
|
197
195
|
* @property {boolean} [pretty=true] If `false`, do not use color and fancy formatting in the `reason` property of the {@link ReadConfigFileResult}. The value of `reason` is then suitable for machine-reading.
|
|
198
|
-
* @property {boolean} [normalize=true] If `false`, do not normalize key names to camel case.
|
|
199
196
|
*/
|
|
200
197
|
|
|
201
198
|
/**
|
package/lib/config.js
CHANGED
|
@@ -9,7 +9,7 @@ import { rootDir } from './utils';
|
|
|
9
9
|
import logger from './logger';
|
|
10
10
|
import semver from 'semver';
|
|
11
11
|
import findUp from 'find-up';
|
|
12
|
-
import { getDefaultsForSchema } from './schema/schema';
|
|
12
|
+
import { getDefaultsForSchema, getAllArgSpecs } from './schema/schema';
|
|
13
13
|
|
|
14
14
|
const npmPackage = fs.readPackageJsonFrom(__dirname);
|
|
15
15
|
|
|
@@ -159,21 +159,40 @@ async function showBuildInfo () {
|
|
|
159
159
|
|
|
160
160
|
/**
|
|
161
161
|
* Returns k/v pairs of server arguments which are _not_ the defaults.
|
|
162
|
-
* @param {ParsedArgs}
|
|
162
|
+
* @param {ParsedArgs} parsedArgs
|
|
163
163
|
* @returns {Partial<ParsedArgs>}
|
|
164
164
|
*/
|
|
165
|
-
function getNonDefaultServerArgs (
|
|
166
|
-
|
|
165
|
+
function getNonDefaultServerArgs (parsedArgs) {
|
|
166
|
+
/**
|
|
167
|
+
* Flattens parsed args into a single level object for comparison with
|
|
168
|
+
* flattened defaults across server args and extension args.
|
|
169
|
+
* @param {ParsedArgs} args
|
|
170
|
+
* @returns {Record<string, { value: any, argSpec: import('./schema/arg-spec').ArgSpec }>}
|
|
171
|
+
*/
|
|
172
|
+
const flatten = (args) => {
|
|
173
|
+
const argSpecs = getAllArgSpecs();
|
|
174
|
+
const flattened = _.reduce([...argSpecs.values()], (acc, argSpec) => {
|
|
175
|
+
if (_.has(args, argSpec.dest)) {
|
|
176
|
+
acc[argSpec.dest] = {value: _.get(args, argSpec.dest), argSpec};
|
|
177
|
+
}
|
|
178
|
+
return acc;
|
|
179
|
+
}, /** @type {Record<string, { value: any, argSpec: import('./schema/arg-spec').ArgSpec }>} */({}));
|
|
180
|
+
|
|
181
|
+
return flattened;
|
|
182
|
+
};
|
|
167
183
|
|
|
168
|
-
const
|
|
184
|
+
const args = flatten(parsedArgs);
|
|
185
|
+
|
|
186
|
+
// hopefully these function names are descriptive enough
|
|
187
|
+
const typesDiffer = /** @param {string} dest */(dest) => typeof args[dest].value !== typeof defaultsFromSchema[dest];
|
|
169
188
|
|
|
170
189
|
const defaultValueIsArray = /** @param {string} dest */(dest) => _.isArray(defaultsFromSchema[dest]);
|
|
171
190
|
|
|
172
|
-
const argsValueIsArray = /** @param {string} dest */(dest) => _.isArray(args[dest]);
|
|
191
|
+
const argsValueIsArray = /** @param {string} dest */(dest) => _.isArray(args[dest].value);
|
|
173
192
|
|
|
174
|
-
const arraysDiffer = /** @param {string} dest */(dest) => _.gt(_.size(_.difference(args[dest], defaultsFromSchema[dest])), 0);
|
|
193
|
+
const arraysDiffer = /** @param {string} dest */(dest) => _.gt(_.size(_.difference(args[dest].value, defaultsFromSchema[dest])), 0);
|
|
175
194
|
|
|
176
|
-
const valuesDiffer = /** @param {string} dest */(dest) => args[dest] !== defaultsFromSchema[dest];
|
|
195
|
+
const valuesDiffer = /** @param {string} dest */(dest) => args[dest].value !== defaultsFromSchema[dest];
|
|
177
196
|
|
|
178
197
|
const defaultIsDefined = /** @param {string} dest */(dest) => !_.isUndefined(defaultsFromSchema[dest]);
|
|
179
198
|
|
|
@@ -212,9 +231,13 @@ function getNonDefaultServerArgs (args) {
|
|
|
212
231
|
])
|
|
213
232
|
]);
|
|
214
233
|
|
|
215
|
-
const defaultsFromSchema = getDefaultsForSchema();
|
|
234
|
+
const defaultsFromSchema = getDefaultsForSchema(true);
|
|
216
235
|
|
|
217
|
-
return _.
|
|
236
|
+
return _.reduce(
|
|
237
|
+
_.pickBy(args, (__, key) => isNotDefault(key)),
|
|
238
|
+
// explodes the flattened object back into nested one
|
|
239
|
+
(acc, {value, argSpec}) => _.set(acc, argSpec.dest, value), /** @type {Partial<ParsedArgs>} */({})
|
|
240
|
+
);
|
|
218
241
|
}
|
|
219
242
|
|
|
220
243
|
/**
|
|
@@ -236,22 +259,29 @@ const compactConfig = _.partial(
|
|
|
236
259
|
* The actual shape of `preConfigParsedArgs` and `defaults` does not matter for the purposes of this function,
|
|
237
260
|
* but it's intended to be called with values of type {@link ParsedArgs} and `DefaultValues<true>`, respectively.
|
|
238
261
|
*
|
|
239
|
-
* @param {
|
|
240
|
-
* @param {import('./config-file').ReadConfigFileResult} configResult - Result of attempting to load a config file
|
|
241
|
-
* @param {
|
|
262
|
+
* @param {Partial<ParsedArgs>} nonDefaultPreConfigParsedArgs - Parsed CLI args (or param to `init()`) before config & defaults applied
|
|
263
|
+
* @param {import('./config-file').ReadConfigFileResult} configResult - Result of attempting to load a config file. _Must_ be normalized
|
|
264
|
+
* @param {Partial<ParsedArgs>} defaults - Configuration defaults from schemas
|
|
265
|
+
* @param {ParsedArgs} parsedArgs - Entire parsed args object
|
|
242
266
|
*/
|
|
243
|
-
function showConfig (
|
|
267
|
+
function showConfig (nonDefaultPreConfigParsedArgs, configResult, defaults, parsedArgs) {
|
|
244
268
|
console.log('Appium Configuration\n');
|
|
269
|
+
console.log('from defaults:\n');
|
|
270
|
+
console.dir(compactConfig(defaults));
|
|
245
271
|
if (configResult.config) {
|
|
246
|
-
console.log(
|
|
272
|
+
console.log(`\nfrom config file at ${configResult.filepath}:\n`);
|
|
247
273
|
console.dir(compactConfig(configResult.config));
|
|
248
274
|
} else {
|
|
249
|
-
console.log(
|
|
275
|
+
console.log(`\n(no configuration file loaded)`);
|
|
250
276
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
277
|
+
if (_.isEmpty(nonDefaultPreConfigParsedArgs)) {
|
|
278
|
+
console.log(`\n(no CLI parameters provided)`);
|
|
279
|
+
} else {
|
|
280
|
+
console.log('\nvia CLI or function call:\n');
|
|
281
|
+
console.dir(compactConfig(nonDefaultPreConfigParsedArgs));
|
|
282
|
+
}
|
|
283
|
+
console.log('\nfinal configuration:\n');
|
|
284
|
+
console.dir(compactConfig(parsedArgs));
|
|
255
285
|
}
|
|
256
286
|
|
|
257
287
|
/**
|
package/lib/main.js
CHANGED
|
@@ -236,16 +236,17 @@ async function init (args) {
|
|
|
236
236
|
if (preConfigParsedArgs.subcommand === SERVER_SUBCOMMAND) {
|
|
237
237
|
defaults = getDefaultsForSchema(false);
|
|
238
238
|
|
|
239
|
-
if (preConfigParsedArgs.showConfig) {
|
|
240
|
-
showConfig(preConfigParsedArgs, configResult, defaults);
|
|
241
|
-
return {};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
239
|
parsedArgs = _.defaultsDeep(
|
|
245
240
|
preConfigParsedArgs,
|
|
246
241
|
configResult.config?.server,
|
|
247
242
|
defaults
|
|
248
243
|
);
|
|
244
|
+
|
|
245
|
+
if (preConfigParsedArgs.showConfig) {
|
|
246
|
+
showConfig(getNonDefaultServerArgs(preConfigParsedArgs), configResult, defaults, parsedArgs);
|
|
247
|
+
return {};
|
|
248
|
+
}
|
|
249
|
+
|
|
249
250
|
} else {
|
|
250
251
|
parsedArgs = preConfigParsedArgs;
|
|
251
252
|
}
|
package/lib/schema/arg-spec.js
CHANGED
|
@@ -176,7 +176,7 @@ export class ArgSpec {
|
|
|
176
176
|
/**
|
|
177
177
|
* When given the root ID of a schema for an extension (`<extType>-<normalizedExtName>.json`) Returns an object containing the extension type and the _normalized_ extension name.
|
|
178
178
|
* @param {string} schemaId - Root schema ID
|
|
179
|
-
* @returns {{extType: ExtensionType|undefined, normalizedExtName: string|undefined}}
|
|
179
|
+
* @returns { {extType: ExtensionType|undefined, normalizedExtName: string|undefined} }
|
|
180
180
|
*/
|
|
181
181
|
static extensionInfoFromRootSchemaId (schemaId) {
|
|
182
182
|
const matches = schemaId.match(SCHEMA_ID_REGEXP);
|
package/lib/schema/schema.js
CHANGED
|
@@ -89,6 +89,7 @@ class AppiumSchema {
|
|
|
89
89
|
_.bindAll(instance, [
|
|
90
90
|
'finalize',
|
|
91
91
|
'flatten',
|
|
92
|
+
'getAllArgSpecs',
|
|
92
93
|
'getArgSpec',
|
|
93
94
|
'getDefaults',
|
|
94
95
|
'getDefaultsForExtension',
|
|
@@ -124,6 +125,10 @@ class AppiumSchema {
|
|
|
124
125
|
return Boolean(this._finalizedSchemas);
|
|
125
126
|
}
|
|
126
127
|
|
|
128
|
+
getAllArgSpecs () {
|
|
129
|
+
return this._argSpecs;
|
|
130
|
+
}
|
|
131
|
+
|
|
127
132
|
/**
|
|
128
133
|
* Call this when no more schemas will be registered.
|
|
129
134
|
*
|
|
@@ -403,7 +408,7 @@ class AppiumSchema {
|
|
|
403
408
|
flatten () {
|
|
404
409
|
const schema = this.getSchema();
|
|
405
410
|
|
|
406
|
-
/** @type {{properties: SchemaObject, prefix: string[]}[]} */
|
|
411
|
+
/** @type { {properties: SchemaObject, prefix: string[]}[] } */
|
|
407
412
|
const stack = [{properties: schema.properties, prefix: []}];
|
|
408
413
|
/** @type {FlattenedSchema} */
|
|
409
414
|
const flattened = [];
|
|
@@ -641,6 +646,7 @@ const appiumSchema = AppiumSchema.create();
|
|
|
641
646
|
|
|
642
647
|
export const {
|
|
643
648
|
registerSchema,
|
|
649
|
+
getAllArgSpecs,
|
|
644
650
|
getArgSpec,
|
|
645
651
|
hasArgSpec,
|
|
646
652
|
isFinalized,
|
|
@@ -678,7 +684,7 @@ export const {isAllowedSchemaFileExtension} = AppiumSchema;
|
|
|
678
684
|
* A list of schemas associated with properties and their corresponding {@link ArgSpec} objects.
|
|
679
685
|
*
|
|
680
686
|
* Intermediate data structure used when converting the entire schema down to CLI arguments.
|
|
681
|
-
* @typedef {{schema: SchemaObject, argSpec: ArgSpec}[]} FlattenedSchema
|
|
687
|
+
* @typedef { {schema: SchemaObject, argSpec: ArgSpec}[] } FlattenedSchema
|
|
682
688
|
*/
|
|
683
689
|
|
|
684
690
|
/**
|
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.25",
|
|
4
4
|
"description": "Automation for Apps.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"automation",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"zip-and-upload": "npm run zip && npm run upload"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@appium/base-driver": "^8.2.
|
|
46
|
+
"@appium/base-driver": "^8.2.4",
|
|
47
47
|
"@appium/base-plugin": "1.8.0",
|
|
48
|
-
"@appium/support": "^2.55.
|
|
48
|
+
"@appium/support": "^2.55.4",
|
|
49
49
|
"@babel/runtime": "7.16.3",
|
|
50
50
|
"@sidvind/better-ajv-errors": "0.9.2",
|
|
51
51
|
"ajv": "8.8.2",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"tag": "next"
|
|
80
80
|
},
|
|
81
81
|
"homepage": "https://appium.io",
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "42f4a2de2d763d57cf0bdb6fb6c9a3bc9c3d232f"
|
|
83
83
|
}
|