executor.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.getFullCommandParts = exports.metadataToCmdOptsEnv = exports.runCommand = exports.Executor = exports.HELP_FLAGS = exports.VERSION_FLAGS = void 0;
  4. const tslib_1 = require("tslib");
  5. const cli_framework_1 = require("@ionic/cli-framework");
  6. const lodash = tslib_1.__importStar(require("lodash"));
  7. const guards_1 = require("../guards");
  8. const color_1 = require("./color");
  9. const config_1 = require("./config");
  10. const errors_1 = require("./errors");
  11. exports.VERSION_FLAGS = ['--version', '-v'];
  12. exports.HELP_FLAGS = ['--help', '-?', '-h'];
  13. class Executor extends cli_framework_1.BaseExecutor {
  14. async locate(argv) {
  15. const pargs = (0, cli_framework_1.stripOptions)(argv, {});
  16. const location = await this.namespace.locate(pargs);
  17. const args = lodash.drop(argv, location.path.length - 1);
  18. if (lodash.intersection(exports.VERSION_FLAGS, argv).length > 0) {
  19. return this.locate(['version', ...pargs]);
  20. }
  21. else if (lodash.intersection(exports.HELP_FLAGS, argv).length > 0 || !(0, guards_1.isCommand)(location.obj)) {
  22. return this.locate(['help', ...pargs]);
  23. }
  24. return { ...location, args };
  25. }
  26. async run(command, cmdargs, { location, env, executor }) {
  27. const metadata = await command.getMetadata();
  28. const parts = getFullCommandParts(location);
  29. if (metadata.options) {
  30. const optMap = metadataToCmdOptsEnv(metadata, parts.slice(1));
  31. // TODO: changes opt by reference, which is probably bad
  32. for (const [opt, envvar] of optMap.entries()) {
  33. const envdefault = env[envvar];
  34. if (typeof envdefault !== 'undefined') {
  35. opt.default = opt.type === Boolean ? (envdefault && envdefault !== '0' ? true : false) : envdefault;
  36. }
  37. }
  38. }
  39. const metadataOpts = [...metadata.options ? metadata.options : [], ...config_1.GLOBAL_OPTIONS];
  40. const minimistOpts = (0, cli_framework_1.metadataOptionsToParseArgsOptions)(metadataOpts);
  41. const cmdoptions = (0, cli_framework_1.parseArgs)(cmdargs, minimistOpts);
  42. const cmdinputs = cmdoptions._;
  43. const { project } = this.namespace;
  44. if (project) {
  45. if (project.details.context === 'multiapp') {
  46. cmdoptions['project'] = project.details.id;
  47. }
  48. }
  49. else {
  50. if (metadata.type === 'project') {
  51. throw new errors_1.FatalException(`Sorry! ${(0, color_1.input)(parts.join(' '))} can only be run in an Ionic project directory.\n` +
  52. `If this is a project you'd like to integrate with Ionic, run ${(0, color_1.input)('ionic init')}.`);
  53. }
  54. }
  55. await command.execute(cmdinputs, cmdoptions, { location, env, executor });
  56. }
  57. }
  58. exports.Executor = Executor;
  59. async function runCommand(runinfo, argv) {
  60. const { env, executor } = runinfo;
  61. const metadata = await executor.namespace.getMetadata();
  62. executor.namespace.env.log.msg(`> ${(0, color_1.input)([metadata.name, ...argv].map(a => a.includes(' ') ? `"${a}"` : a).join(' '))}`);
  63. await executor.execute(argv, env);
  64. }
  65. exports.runCommand = runCommand;
  66. function metadataToCmdOptsEnv(metadata, cmdNameParts) {
  67. const optMap = new Map();
  68. if (!metadata.options) {
  69. return optMap;
  70. }
  71. const prefix = `IONIC_CMDOPTS_${cmdNameParts.map(s => s.toUpperCase()).join('_')}`;
  72. for (const option of metadata.options) {
  73. optMap.set(option, `${prefix}_${option.name.toUpperCase().split('-').join('_')}`);
  74. }
  75. return optMap;
  76. }
  77. exports.metadataToCmdOptsEnv = metadataToCmdOptsEnv;
  78. function getFullCommandParts(location) {
  79. return location.path.map(([p]) => p);
  80. }
  81. exports.getFullCommandParts = getFullCommandParts;