Skip to content

Commit

Permalink
Merge branch 'master' into fix/help
Browse files Browse the repository at this point in the history
  • Loading branch information
snitin315 committed Oct 20, 2020
2 parents 267b2f3 + 1cc1fa0 commit 0c81fa7
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 222 deletions.
65 changes: 0 additions & 65 deletions packages/webpack-cli/__tests__/cli-executer.test.js

This file was deleted.

101 changes: 31 additions & 70 deletions packages/webpack-cli/lib/bootstrap.js
@@ -1,99 +1,60 @@
const { options } = require('colorette');
const WebpackCLI = require('./webpack-cli');
const { core } = require('./utils/cli-flags');
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 parsedArgs = argParser(core, cliArgs, true, process.title);

const commandIsUsed = isCommandUsed(cliArgs);
const parsedArgs = parseArgs(cliArgs);

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
// Create a new instance of the CLI object
const cli = new WebpackCLI();

// 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}`);

if (parsedArgs.unknownArgs.length > 0) {
entry = [];

parsedArgs.unknownArgs = parsedArgs.unknownArgs.filter((item) => {
if (item.startsWith('-')) {
return true;
}

entry.push(item);

return false;
});
const args = await cliExecuter();
const { opts } = parseArgs(args);
await cli.run(opts, core);
return;
}

if (parsedArgs.unknownArgs.length > 0) {
parsedArgs.unknownArgs.forEach(async (unknown) => {
logger.error(`Unknown argument: ${unknown}`);
});

process.exit(2);
}

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;
}
await cli.run(parsedArgsOpts, core);
} catch (error) {
logger.error(error);
process.exit(2);
}
};

Expand Down
17 changes: 15 additions & 2 deletions packages/webpack-cli/lib/utils/arg-parser.js
Expand Up @@ -16,6 +16,7 @@ const { defaultCommands } = require('./commands');
*/
const argParser = (options, args, argsOnly = false, name = '') => {
const parser = new commander.Command();

// Set parser name
parser.name(name);
parser.storeOptionsAsProperties(false);
Expand Down Expand Up @@ -58,6 +59,7 @@ const argParser = (options, args, argsOnly = false, name = '') => {
options.reduce((parserInstance, option) => {
let optionType = option.type;
let isStringOrBool = false;

if (Array.isArray(optionType)) {
// filter out duplicate types
optionType = optionType.filter((type, index) => {
Expand All @@ -84,7 +86,9 @@ const argParser = (options, args, argsOnly = false, name = '') => {
}

const flags = option.alias ? `-${option.alias}, --${option.name}` : `--${option.name}`;

let flagsWithType = flags;

if (isStringOrBool) {
// commander recognizes [value] as an optional placeholder,
// making this flag work either as a string or a boolean
Expand All @@ -107,17 +111,25 @@ const argParser = (options, args, argsOnly = false, name = '') => {
// this ensures we're only splitting by the first `=`
const [allKeys, val] = value.split(/=(.+)/, 2);
const splitKeys = allKeys.split(/\.(?!$)/);

let prevRef = previous;

splitKeys.forEach((someKey, index) => {
if (!prevRef[someKey]) prevRef[someKey] = {};
if (!prevRef[someKey]) {
prevRef[someKey] = {};
}

if ('string' === typeof prevRef[someKey]) {
prevRef[someKey] = {};
}

if (index === splitKeys.length - 1) {
prevRef[someKey] = val || true;
}

prevRef = prevRef[someKey];
});

return previous;
};
parserInstance.option(flagsWithType, option.description, multiArg, option.defaultValue).action(() => {});
Expand Down Expand Up @@ -151,15 +163,16 @@ const argParser = (options, args, argsOnly = false, name = '') => {

const result = parser.parse(args, parseOptions);
const opts = result.opts();

const unknownArgs = result.args;

args.forEach((arg) => {
const flagName = arg.slice(5);
const option = options.find((opt) => opt.name === flagName);
const flag = `--${flagName}`;
const flagUsed = args.includes(flag) && !unknownArgs.includes(flag);
let alias = '';
let aliasUsed = false;

if (option && option.alias) {
alias = `-${option.alias}`;
aliasUsed = args.includes(alias) && !unknownArgs.includes(alias);
Expand Down
64 changes: 0 additions & 64 deletions packages/webpack-cli/lib/utils/cli-executer.js

This file was deleted.

18 changes: 0 additions & 18 deletions packages/webpack-cli/lib/utils/process-log.js

This file was deleted.

7 changes: 4 additions & 3 deletions test/watch/watch-flag.test.js
@@ -1,18 +1,19 @@
'use strict';

const stripAnsi = require('strip-ansi');
const { runAndGetWatchProc, isWebpack5 } = require('../utils/test-utils');
const { writeFileSync } = require('fs');
const { resolve } = require('path');

const wordsInStatsv4 = ['Hash', 'Version', 'Time', 'Built at:', 'main.js'];
const wordsInStatsv5 = ['asset', 'index.js', `compiled \u001b[1m\u001b[32msuccessfully\u001b[39m\u001b[22m`];
const wordsInStatsv5 = ['asset', 'index.js', 'compiled successfully'];

describe('--watch flag', () => {
it('should recompile upon file change', (done) => {
const proc = runAndGetWatchProc(__dirname, ['--watch'], false, '', true);
let semaphore = 0;
proc.stdout.on('data', (chunk) => {
const data = chunk.toString();
const data = stripAnsi(chunk.toString());

if (semaphore === 0 && data.includes('watching files for updates')) {
process.nextTick(() => {
Expand Down Expand Up @@ -47,7 +48,7 @@ describe('--watch flag', () => {
const proc = runAndGetWatchProc(__dirname, ['--watch'], false, '', true);
let semaphore = 0;
proc.stdout.on('data', (chunk) => {
const data = chunk.toString();
const data = stripAnsi(chunk.toString());

if (semaphore === 0 && data.includes('Compilation starting')) {
semaphore++;
Expand Down

0 comments on commit 0c81fa7

Please sign in to comment.