commander.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _commander = require("commander");
  7. var _path = _interopRequireDefault(require("path"));
  8. var _Deprecator = _interopRequireDefault(require("../../Deprecator/Deprecator"));
  9. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  10. /* eslint-disable no-console */
  11. let _definitions;
  12. let _reverseDefinitions;
  13. let _defaults;
  14. _commander.Command.prototype.loadDefinitions = function (definitions) {
  15. _definitions = definitions;
  16. Object.keys(definitions).reduce((program, opt) => {
  17. if (typeof definitions[opt] == 'object') {
  18. const additionalOptions = definitions[opt];
  19. if (additionalOptions.required === true) {
  20. return program.option(`--${opt} <${opt}>`, additionalOptions.help, additionalOptions.action);
  21. } else {
  22. return program.option(`--${opt} [${opt}]`, additionalOptions.help, additionalOptions.action);
  23. }
  24. }
  25. return program.option(`--${opt} [${opt}]`);
  26. }, this);
  27. _reverseDefinitions = Object.keys(definitions).reduce((object, key) => {
  28. let value = definitions[key];
  29. if (typeof value == 'object') {
  30. value = value.env;
  31. }
  32. if (value) {
  33. object[value] = key;
  34. }
  35. return object;
  36. }, {});
  37. _defaults = Object.keys(definitions).reduce((defs, opt) => {
  38. if (_definitions[opt].default !== undefined) {
  39. defs[opt] = _definitions[opt].default;
  40. }
  41. return defs;
  42. }, {});
  43. /* istanbul ignore next */
  44. this.on('--help', function () {
  45. console.log(' Configure From Environment:');
  46. console.log('');
  47. Object.keys(_reverseDefinitions).forEach(key => {
  48. console.log(` $ ${key}='${_reverseDefinitions[key]}'`);
  49. });
  50. console.log('');
  51. });
  52. };
  53. function parseEnvironment(env = {}) {
  54. return Object.keys(_reverseDefinitions).reduce((options, key) => {
  55. if (env[key]) {
  56. const originalKey = _reverseDefinitions[key];
  57. let action = option => option;
  58. if (typeof _definitions[originalKey] === 'object') {
  59. action = _definitions[originalKey].action || action;
  60. }
  61. options[_reverseDefinitions[key]] = action(env[key]);
  62. }
  63. return options;
  64. }, {});
  65. }
  66. function parseConfigFile(program) {
  67. let options = {};
  68. if (program.args.length > 0) {
  69. let jsonPath = program.args[0];
  70. jsonPath = _path.default.resolve(jsonPath);
  71. const jsonConfig = require(jsonPath);
  72. if (jsonConfig.apps) {
  73. if (jsonConfig.apps.length > 1) {
  74. throw 'Multiple apps are not supported';
  75. }
  76. options = jsonConfig.apps[0];
  77. } else {
  78. options = jsonConfig;
  79. }
  80. Object.keys(options).forEach(key => {
  81. const value = options[key];
  82. if (!_definitions[key]) {
  83. throw `error: unknown option ${key}`;
  84. }
  85. const action = _definitions[key].action;
  86. if (action) {
  87. options[key] = action(value);
  88. }
  89. });
  90. console.log(`Configuration loaded from ${jsonPath}`);
  91. }
  92. return options;
  93. }
  94. _commander.Command.prototype.setValuesIfNeeded = function (options) {
  95. Object.keys(options).forEach(key => {
  96. if (!Object.prototype.hasOwnProperty.call(this, key)) {
  97. this[key] = options[key];
  98. }
  99. });
  100. };
  101. _commander.Command.prototype._parse = _commander.Command.prototype.parse;
  102. _commander.Command.prototype.parse = function (args, env) {
  103. this._parse(args);
  104. // Parse the environment first
  105. const envOptions = parseEnvironment(env);
  106. const fromFile = parseConfigFile(this);
  107. // Load the env if not passed from command line
  108. this.setValuesIfNeeded(envOptions);
  109. // Load from file to override
  110. this.setValuesIfNeeded(fromFile);
  111. // Scan for deprecated Parse Server options
  112. _Deprecator.default.scanParseServerOptions(this);
  113. // Last set the defaults
  114. this.setValuesIfNeeded(_defaults);
  115. };
  116. _commander.Command.prototype.getOptions = function () {
  117. return Object.keys(_definitions).reduce((options, key) => {
  118. if (typeof this[key] !== 'undefined') {
  119. options[key] = this[key];
  120. }
  121. return options;
  122. }, {});
  123. };
  124. var _default = exports.default = new _commander.Command().storeOptionsAsProperties();
  125. /* eslint-enable no-console */
  126. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZGVyIiwicmVxdWlyZSIsIl9wYXRoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9EZXByZWNhdG9yIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX2RlZmluaXRpb25zIiwiX3JldmVyc2VEZWZpbml0aW9ucyIsIl9kZWZhdWx0cyIsIkNvbW1hbmQiLCJwcm90b3R5cGUiLCJsb2FkRGVmaW5pdGlvbnMiLCJkZWZpbml0aW9ucyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJwcm9ncmFtIiwib3B0IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJyZXF1aXJlZCIsIm9wdGlvbiIsImhlbHAiLCJhY3Rpb24iLCJvYmplY3QiLCJrZXkiLCJ2YWx1ZSIsImVudiIsImRlZnMiLCJ1bmRlZmluZWQiLCJvbiIsImNvbnNvbGUiLCJsb2ciLCJmb3JFYWNoIiwicGFyc2VFbnZpcm9ubWVudCIsIm9wdGlvbnMiLCJvcmlnaW5hbEtleSIsInBhcnNlQ29uZmlnRmlsZSIsImFyZ3MiLCJsZW5ndGgiLCJqc29uUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwianNvbkNvbmZpZyIsImFwcHMiLCJzZXRWYWx1ZXNJZk5lZWRlZCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIl9wYXJzZSIsInBhcnNlIiwiZW52T3B0aW9ucyIsImZyb21GaWxlIiwiRGVwcmVjYXRvciIsInNjYW5QYXJzZVNlcnZlck9wdGlvbnMiLCJnZXRPcHRpb25zIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwic3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS91dGlscy9jb21tYW5kZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4uLy4uL0RlcHJlY2F0b3IvRGVwcmVjYXRvcic7XG5cbmxldCBfZGVmaW5pdGlvbnM7XG5sZXQgX3JldmVyc2VEZWZpbml0aW9ucztcbmxldCBfZGVmYXVsdHM7XG5cbkNvbW1hbmQucHJvdG90eXBlLmxvYWREZWZpbml0aW9ucyA9IGZ1bmN0aW9uIChkZWZpbml0aW9ucykge1xuICBfZGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcblxuICBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykucmVkdWNlKChwcm9ncmFtLCBvcHQpID0+IHtcbiAgICBpZiAodHlwZW9mIGRlZmluaXRpb25zW29wdF0gPT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0gZGVmaW5pdGlvbnNbb3B0XTtcbiAgICAgIGlmIChhZGRpdGlvbmFsT3B0aW9ucy5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gcHJvZ3JhbS5vcHRpb24oXG4gICAgICAgICAgYC0tJHtvcHR9IDwke29wdH0+YCxcbiAgICAgICAgICBhZGRpdGlvbmFsT3B0aW9ucy5oZWxwLFxuICAgICAgICAgIGFkZGl0aW9uYWxPcHRpb25zLmFjdGlvblxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW0ub3B0aW9uKFxuICAgICAgICAgIGAtLSR7b3B0fSBbJHtvcHR9XWAsXG4gICAgICAgICAgYWRkaXRpb25hbE9wdGlvbnMuaGVscCxcbiAgICAgICAgICBhZGRpdGlvbmFsT3B0aW9ucy5hY3Rpb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2dyYW0ub3B0aW9uKGAtLSR7b3B0fSBbJHtvcHR9XWApO1xuICB9LCB0aGlzKTtcblxuICBfcmV2ZXJzZURlZmluaXRpb25zID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpLnJlZHVjZSgob2JqZWN0LCBrZXkpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBkZWZpbml0aW9uc1trZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuZW52O1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIG9iamVjdFt2YWx1ZV0gPSBrZXk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH0sIHt9KTtcblxuICBfZGVmYXVsdHMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykucmVkdWNlKChkZWZzLCBvcHQpID0+IHtcbiAgICBpZiAoX2RlZmluaXRpb25zW29wdF0uZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWZzW29wdF0gPSBfZGVmaW5pdGlvbnNbb3B0XS5kZWZhdWx0O1xuICAgIH1cbiAgICByZXR1cm4gZGVmcztcbiAgfSwge30pO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHRoaXMub24oJy0taGVscCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnICBDb25maWd1cmUgRnJvbSBFbnZpcm9ubWVudDonKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgT2JqZWN0LmtleXMoX3JldmVyc2VEZWZpbml0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYCAgICAkICR7a2V5fT0nJHtfcmV2ZXJzZURlZmluaXRpb25zW2tleV19J2ApO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUVudmlyb25tZW50KGVudiA9IHt9KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhfcmV2ZXJzZURlZmluaXRpb25zKS5yZWR1Y2UoKG9wdGlvbnMsIGtleSkgPT4ge1xuICAgIGlmIChlbnZba2V5XSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBfcmV2ZXJzZURlZmluaXRpb25zW2tleV07XG4gICAgICBsZXQgYWN0aW9uID0gb3B0aW9uID0+IG9wdGlvbjtcbiAgICAgIGlmICh0eXBlb2YgX2RlZmluaXRpb25zW29yaWdpbmFsS2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYWN0aW9uID0gX2RlZmluaXRpb25zW29yaWdpbmFsS2V5XS5hY3Rpb24gfHwgYWN0aW9uO1xuICAgICAgfVxuICAgICAgb3B0aW9uc1tfcmV2ZXJzZURlZmluaXRpb25zW2tleV1dID0gYWN0aW9uKGVudltrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb25maWdGaWxlKHByb2dyYW0pIHtcbiAgbGV0IG9wdGlvbnMgPSB7fTtcbiAgaWYgKHByb2dyYW0uYXJncy5sZW5ndGggPiAwKSB7XG4gICAgbGV0IGpzb25QYXRoID0gcHJvZ3JhbS5hcmdzWzBdO1xuICAgIGpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGpzb25QYXRoKTtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gcmVxdWlyZShqc29uUGF0aCk7XG4gICAgaWYgKGpzb25Db25maWcuYXBwcykge1xuICAgICAgaWYgKGpzb25Db25maWcuYXBwcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93ICdNdWx0aXBsZSBhcHBzIGFyZSBub3Qgc3VwcG9ydGVkJztcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBqc29uQ29uZmlnLmFwcHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBqc29uQ29uZmlnO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcbiAgICAgIGlmICghX2RlZmluaXRpb25zW2tleV0pIHtcbiAgICAgICAgdGhyb3cgYGVycm9yOiB1bmtub3duIG9wdGlvbiAke2tleX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aW9uID0gX2RlZmluaXRpb25zW2tleV0uYWN0aW9uO1xuICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICBvcHRpb25zW2tleV0gPSBhY3Rpb24odmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tICR7anNvblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbkNvbW1hbmQucHJvdG90eXBlLnNldFZhbHVlc0lmTmVlZGVkID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGtleSkpIHtcbiAgICAgIHRoaXNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xufTtcblxuQ29tbWFuZC5wcm90b3R5cGUuX3BhcnNlID0gQ29tbWFuZC5wcm90b3R5cGUucGFyc2U7XG5cbkNvbW1hbmQucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKGFyZ3MsIGVudikge1xuICB0aGlzLl9wYXJzZShhcmdzKTtcbiAgLy8gUGFyc2UgdGhlIGVudmlyb25tZW50IGZpcnN0XG4gIGNvbnN0IGVudk9wdGlvbnMgPSBwYXJzZUVudmlyb25tZW50KGVudik7XG4gIGNvbnN0IGZyb21GaWxlID0gcGFyc2VDb25maWdGaWxlKHRoaXMpO1xuICAvLyBMb2FkIHRoZSBlbnYgaWYgbm90IHBhc3NlZCBmcm9tIGNvbW1hbmQgbGluZVxuICB0aGlzLnNldFZhbHVlc0lmTmVlZGVkKGVudk9wdGlvbnMpO1xuICAvLyBMb2FkIGZyb20gZmlsZSB0byBvdmVycmlkZVxuICB0aGlzLnNldFZhbHVlc0lmTmVlZGVkKGZyb21GaWxlKTtcbiAgLy8gU2NhbiBmb3IgZGVwcmVjYXRlZCBQYXJzZSBTZXJ2ZXIgb3B0aW9uc1xuICBEZXByZWNhdG9yLnNjYW5QYXJzZVNlcnZlck9wdGlvbnModGhpcyk7XG4gIC8vIExhc3Qgc2V0IHRoZSBkZWZhdWx0c1xuICB0aGlzLnNldFZhbHVlc0lmTmVlZGVkKF9kZWZhdWx0cyk7XG59O1xuXG5Db21tYW5kLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoX2RlZmluaXRpb25zKS5yZWR1Y2UoKG9wdGlvbnMsIGtleSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGhpc1trZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9uc1trZXldID0gdGhpc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfSwge30pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IENvbW1hbmQoKS5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKTtcbi8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFBcUQsU0FBQUUsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFIckQ7O0FBS0EsSUFBSUcsWUFBWTtBQUNoQixJQUFJQyxtQkFBbUI7QUFDdkIsSUFBSUMsU0FBUztBQUViQyxrQkFBTyxDQUFDQyxTQUFTLENBQUNDLGVBQWUsR0FBRyxVQUFVQyxXQUFXLEVBQUU7RUFDekROLFlBQVksR0FBR00sV0FBVztFQUUxQkMsTUFBTSxDQUFDQyxJQUFJLENBQUNGLFdBQVcsQ0FBQyxDQUFDRyxNQUFNLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxHQUFHLEtBQUs7SUFDaEQsSUFBSSxPQUFPTCxXQUFXLENBQUNLLEdBQUcsQ0FBQyxJQUFJLFFBQVEsRUFBRTtNQUN2QyxNQUFNQyxpQkFBaUIsR0FBR04sV0FBVyxDQUFDSyxHQUFHLENBQUM7TUFDMUMsSUFBSUMsaUJBQWlCLENBQUNDLFFBQVEsS0FBSyxJQUFJ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