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.
@@ -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
- foo: 'bar'
46
+ address: 'bar'
45
47
  }, {
46
48
  config: {
47
49
  server: {
48
- address: 'quux'
50
+ callbackAddress: 'quux'
49
51
  }
50
52
  }
51
53
  }, {
52
- spam: 'food'
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)\n');
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==
@@ -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.isEmpty && result.filepath) {
117
- const {normalize = true, pretty = true} = opts;
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
- if (normalize) {
135
- // normalize (to camel case) all top-level property names of the config file
136
- configResult.config = normalizeConfig(
137
- /** @type {AppiumConfig} */ (configResult.config),
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 {AppiumConfig} [config] - The parsed configuration
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} args
162
+ * @param {ParsedArgs} parsedArgs
163
163
  * @returns {Partial<ParsedArgs>}
164
164
  */
165
- function getNonDefaultServerArgs (args) {
166
- // hopefully these function names are descriptive enough
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 typesDiffer = /** @param {string} dest */(dest) => typeof args[dest] !== typeof defaultsFromSchema[dest];
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 _.pickBy(args, (__, key) => isNotDefault(key));
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 {object} preConfigParsedArgs - Parsed CLI args (or param to `init()`) before config & defaults applied
240
- * @param {import('./config-file').ReadConfigFileResult} configResult - Result of attempting to load a config file
241
- * @param {object} defaults - Configuration defaults from schemas
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 (preConfigParsedArgs, configResult, defaults) {
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(`via config file at ${configResult.filepath}:\n`);
272
+ console.log(`\nfrom config file at ${configResult.filepath}:\n`);
247
273
  console.dir(compactConfig(configResult.config));
248
274
  } else {
249
- console.log(`(no configuration file loaded)\n`);
275
+ console.log(`\n(no configuration file loaded)`);
250
276
  }
251
- console.log('via CLI or function call:\n');
252
- console.dir(compactConfig(preConfigParsedArgs));
253
- console.log('\nvia defaults:\n');
254
- console.dir(compactConfig(defaults));
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
  }
@@ -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);
@@ -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.24",
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.3",
46
+ "@appium/base-driver": "^8.2.4",
47
47
  "@appium/base-plugin": "1.8.0",
48
- "@appium/support": "^2.55.3",
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": "ca90a11813546ab4851e5b1f0406f420a53227e6"
82
+ "gitHead": "42f4a2de2d763d57cf0bdb6fb6c9a3bc9c3d232f"
83
83
  }