@ionic/cli
Version:
A tool for creating and developing Ionic Framework mobile apps.
82 lines (81 loc) • 3.88 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFullCommandParts = exports.metadataToCmdOptsEnv = exports.runCommand = exports.Executor = exports.HELP_FLAGS = exports.VERSION_FLAGS = void 0;
const tslib_1 = require("tslib");
const cli_framework_1 = require("@ionic/cli-framework");
const lodash = tslib_1.__importStar(require("lodash"));
const guards_1 = require("../guards");
const color_1 = require("./color");
const config_1 = require("./config");
const errors_1 = require("./errors");
exports.VERSION_FLAGS = ['--version', '-v'];
exports.HELP_FLAGS = ['--help', '-?', '-h'];
class Executor extends cli_framework_1.BaseExecutor {
async locate(argv) {
const pargs = (0, cli_framework_1.stripOptions)(argv, {});
const location = await this.namespace.locate(pargs);
const args = lodash.drop(argv, location.path.length - 1);
if (lodash.intersection(exports.VERSION_FLAGS, argv).length > 0) {
return this.locate(['version', ...pargs]);
}
else if (lodash.intersection(exports.HELP_FLAGS, argv).length > 0 || !(0, guards_1.isCommand)(location.obj)) {
return this.locate(['help', ...pargs]);
}
return { ...location, args };
}
async run(command, cmdargs, { location, env, executor }) {
const metadata = await command.getMetadata();
const parts = getFullCommandParts(location);
if (metadata.options) {
const optMap = metadataToCmdOptsEnv(metadata, parts.slice(1));
// TODO: changes opt by reference, which is probably bad
for (const [opt, envvar] of optMap.entries()) {
const envdefault = env[envvar];
if (typeof envdefault !== 'undefined') {
opt.default = opt.type === Boolean ? (envdefault && envdefault !== '0' ? true : false) : envdefault;
}
}
}
const metadataOpts = [...metadata.options ? metadata.options : [], ...config_1.GLOBAL_OPTIONS];
const minimistOpts = (0, cli_framework_1.metadataOptionsToParseArgsOptions)(metadataOpts);
const cmdoptions = (0, cli_framework_1.parseArgs)(cmdargs, minimistOpts);
const cmdinputs = cmdoptions._;
const { project } = this.namespace;
if (project) {
if (project.details.context === 'multiapp') {
cmdoptions['project'] = project.details.id;
}
}
else {
if (metadata.type === 'project') {
throw new errors_1.FatalException(`Sorry! ${(0, color_1.input)(parts.join(' '))} can only be run in an Ionic project directory.\n` +
`If this is a project you'd like to integrate with Ionic, run ${(0, color_1.input)('ionic init')}.`);
}
}
await command.execute(cmdinputs, cmdoptions, { location, env, executor });
}
}
exports.Executor = Executor;
async function runCommand(runinfo, argv) {
const { env, executor } = runinfo;
const metadata = await executor.namespace.getMetadata();
executor.namespace.env.log.msg(`> ${(0, color_1.input)([metadata.name, ...argv].map(a => a.includes(' ') ? `"${a}"` : a).join(' '))}`);
await executor.execute(argv, env);
}
exports.runCommand = runCommand;
function metadataToCmdOptsEnv(metadata, cmdNameParts) {
const optMap = new Map();
if (!metadata.options) {
return optMap;
}
const prefix = `IONIC_CMDOPTS_${cmdNameParts.map(s => s.toUpperCase()).join('_')}`;
for (const option of metadata.options) {
optMap.set(option, `${prefix}_${option.name.toUpperCase().split('-').join('_')}`);
}
return optMap;
}
exports.metadataToCmdOptsEnv = metadataToCmdOptsEnv;
function getFullCommandParts(location) {
return location.path.map(([p]) => p);
}
exports.getFullCommandParts = getFullCommandParts;
;