UNPKG

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