UNPKG

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