You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

111 lines
3.9 KiB

const { options } = require('colorette');
const WebpackCLI = require('./webpack-cli');
const { core } = require('./utils/cli-flags');
const versionRunner = require('./groups/runVersion');
const helpRunner = require('./groups/runHelp');
const logger = require('./utils/logger');
const { isCommandUsed } = require('./utils/arg-utils');
const cliExecuter = require('./utils/cli-executer');
const argParser = require('./utils/arg-parser');
require('./utils/process-log');
process.title = 'webpack-cli';
// Create a new instance of the CLI object
const cli = new WebpackCLI();
const parseArgs = (args) => argParser(core, args, true, process.title);
const runCLI = async (cliArgs) => {
let args;
const commandIsUsed = isCommandUsed(cliArgs);
const parsedArgs = parseArgs(cliArgs);
if (parsedArgs.unknownArgs.includes('help') || parsedArgs.opts.help) {
options.enabled = !cliArgs.includes('--no-color');
helpRunner(cliArgs);
process.exit(0);
}
if (parsedArgs.unknownArgs.includes('version') || parsedArgs.opts.version) {
options.enabled = !cliArgs.includes('--no-color');
versionRunner(cliArgs, commandIsUsed);
process.exit(0);
}
if (commandIsUsed) {
return;
}
try {
// handle the default webpack entry CLI argument, where instead
// of doing 'webpack-cli --entry ./index.js' you can simply do
// 'webpack-cli ./index.js'
// if the unknown arg starts with a '-', it will be considered
// an unknown flag rather than an entry
let entry;
if (parsedArgs.unknownArgs.length > 0 && !parsedArgs.unknownArgs[0].startsWith('-')) {
if (parsedArgs.unknownArgs.length === 1) {
entry = parsedArgs.unknownArgs[0];
} else {
entry = [];
parsedArgs.unknownArgs.forEach((unknown) => {
if (!unknown.startsWith('-')) {
entry.push(unknown);
}
});
}
} else if (parsedArgs.unknownArgs.length > 0) {
parsedArgs.unknownArgs.forEach((unknown) => {
logger.warn(`Unknown argument: ${unknown}`);
});
const args = await cliExecuter();
const { opts } = parseArgs(args);
await cli.run(opts, core);
return;
}
const parsedArgsOpts = parsedArgs.opts;
// Enable/Disable color on console
options.enabled = parsedArgsOpts.color ? true : false;
if (entry) {
parsedArgsOpts.entry = entry;
}
const result = await cli.run(parsedArgsOpts, core);
if (!result) {
return;
}
} catch (err) {
if (err.name === 'UNKNOWN_VALUE') {
logger.error(`Parse Error (unknown argument): ${err.value}`);
return;
} else if (err.name === 'ALREADY_SET') {
const argsMap = {};
const keysToDelete = [];
cliArgs.forEach((arg, idx) => {
const oldMapValue = argsMap[arg];
argsMap[arg] = {
value: cliArgs[idx],
pos: idx,
};
// Swap idx of overridden value
if (oldMapValue) {
argsMap[arg].pos = oldMapValue.pos;
keysToDelete.push(idx + 1);
}
});
// Filter out the value for the overridden key
const newArgKeys = Object.keys(argsMap).filter((arg) => !keysToDelete.includes(argsMap[arg].pos));
cliArgs = newArgKeys;
args = argParser('', core, cliArgs);
await cli.run(args.opts, core);
logger.warn('\nDuplicate flags found, defaulting to last set value');
} else {
logger.error(err);
return;
}
}
};
module.exports = runCLI;