in src/program.js [239:343]
async execute({
checkForUpdates = defaultUpdateChecker,
systemProcess = process,
logStream = defaultLogStream,
getVersion = defaultVersionGetter,
applyConfigToArgv = defaultApplyConfigToArgv,
discoverConfigFiles = defaultConfigDiscovery,
loadJSConfigFile = defaultLoadJSConfigFile,
shouldExitProgram = true,
globalEnv = defaultGlobalEnv,
} = {}) {
this.shouldExitProgram = shouldExitProgram;
this.yargs.exitProcess(this.shouldExitProgram);
this.cleanupProcessEnvConfigs(systemProcess);
const argv = this.getArguments();
const cmd = argv._[0];
const version = await getVersion(this.absolutePackageDir);
const runCommand = this.commands[cmd];
if (argv.verbose) {
this.enableVerboseMode(logStream, version);
}
let adjustedArgv = { ...argv, webextVersion: version };
try {
if (cmd === undefined) {
throw new UsageError('No sub-command was specified in the args');
}
if (!runCommand) {
throw new UsageError(`Unknown command: ${cmd}`);
}
if (globalEnv === 'production') {
checkForUpdates({ version });
}
const configFiles = [];
if (argv.configDiscovery) {
log.debug(
'Discovering config files. ' + 'Set --no-config-discovery to disable',
);
const discoveredConfigs = await discoverConfigFiles();
configFiles.push(...discoveredConfigs);
} else {
log.debug('Not discovering config files');
}
if (argv.config) {
configFiles.push(path.resolve(argv.config));
}
if (configFiles.length) {
const niceFileList = configFiles
.map((f) => f.replace(process.cwd(), '.'))
.map((f) => f.replace(os.homedir(), '~'))
.join(', ');
log.debug(
'Applying config file' +
`${configFiles.length !== 1 ? 's' : ''}: ` +
`${niceFileList}`,
);
}
for (const configFileName of configFiles) {
const configObject = await loadJSConfigFile(configFileName);
adjustedArgv = applyConfigToArgv({
argv: adjustedArgv,
argvFromCLI: argv,
configFileName,
configObject,
options: this.options,
});
}
if (adjustedArgv.verbose) {
// Ensure that the verbose is enabled when specified in a config file.
this.enableVerboseMode(logStream, version);
}
this.checkRequiredArguments(adjustedArgv);
await runCommand(adjustedArgv, { shouldExitProgram });
} catch (error) {
if (!(error instanceof UsageError) || adjustedArgv.verbose) {
log.error(`\n${error.stack}\n`);
} else {
log.error(`\n${String(error)}\n`);
}
if (error.code) {
log.error(`Error code: ${error.code}\n`);
}
log.debug(`Command executed: ${cmd}`);
if (this.shouldExitProgram) {
systemProcess.exit(1);
} else {
throw error;
}
}
}