UNPKG

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