diff --git a/packages/webpack-cli/lib/bootstrap.js b/packages/webpack-cli/lib/bootstrap.js index b6fc82879c6..87160c2215a 100644 --- a/packages/webpack-cli/lib/bootstrap.js +++ b/packages/webpack-cli/lib/bootstrap.js @@ -4,6 +4,7 @@ const logger = require('./utils/logger'); const { isCommandUsed } = require('./utils/arg-utils'); const argParser = require('./utils/arg-parser'); const leven = require('leven'); +const { options: coloretteOptions } = require('colorette'); process.title = 'webpack-cli'; @@ -23,6 +24,9 @@ const runCLI = async (cliArgs) => { // If the unknown arg starts with a '-', it will be considered an unknown flag rather than an entry let entry; + // enable/disable colors + coloretteOptions.enabled = parsedArgs.opts.color; + if (parsedArgs.unknownArgs.length > 0) { entry = []; diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 21682f939f5..9a2957003eb 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -235,10 +235,6 @@ class WebpackCLI { } } - if (!coloretteOptions.enabled && args.color) { - coloretteOptions.enabled = args.color; - } - stats.colors = typeof stats.colors !== 'undefined' ? stats.colors : coloretteOptions.enabled; return stats; diff --git a/test/json/json.test.js b/test/json/json.test.js index a248412bc0d..19a84c0cc43 100644 --- a/test/json/json.test.js +++ b/test/json/json.test.js @@ -2,6 +2,9 @@ const { run } = require('../utils/test-utils'); const { stat, readFile } = require('fs'); const { resolve } = require('path'); +const { green } = require('colorette'); + +const successMessage = 'stats are successfully stored as json to stats.json'; describe('json flag', () => { it('should return valid json', () => { @@ -16,7 +19,29 @@ describe('json flag', () => { it('should store json to a file', (done) => { const { stdout, exitCode } = run(__dirname, ['--json', 'stats.json']); - expect(stdout).toContain('stats are successfully stored as json to stats.json'); + expect(stdout).toContain(`${green(successMessage)}`); + expect(exitCode).toBe(0); + + stat(resolve(__dirname, './stats.json'), (err, stats) => { + expect(err).toBe(null); + expect(stats.isFile()).toBe(true); + + readFile(resolve(__dirname, 'stats.json'), 'utf-8', (err, data) => { + expect(err).toBe(null); + expect(JSON.parse(data)['hash']).toBeTruthy(); + expect(JSON.parse(data)['version']).toBeTruthy(); + expect(JSON.parse(data)['time']).toBeTruthy(); + expect(() => JSON.parse(data)).not.toThrow(); + done(); + }); + }); + }); + + it('should store json to a file and respect --no-color', (done) => { + const { stdout, exitCode } = run(__dirname, ['--json', 'stats.json', '--no-color']); + + expect(stdout).not.toContain(`${green(successMessage)}`); + expect(stdout).toContain(successMessage); expect(exitCode).toBe(0); stat(resolve(__dirname, './stats.json'), (err, stats) => { diff --git a/test/unknown/unknown.test.js b/test/unknown/unknown.test.js index 903122b2495..b060e1fe247 100644 --- a/test/unknown/unknown.test.js +++ b/test/unknown/unknown.test.js @@ -1,12 +1,22 @@ const { run } = require('../utils/test-utils'); +const { red } = require('colorette'); describe('unknown behaviour', () => { it('warns the user if an unknown flag is passed in', () => { const { stderr, exitCode } = run(__dirname, ['--unknown']); expect(stderr).toBeTruthy(); + expect(stderr).toContain(`${red('Unknown argument: --unknown')}`); + expect(exitCode).toBe(2); + }); + + it('throws error for unknow flag and respect --no-color', () => { + const { stderr, exitCode } = run(__dirname, ['--unknown', '--no-color']); + expect(stderr).toBeTruthy(); + expect(stderr).not.toContain(`${red('Unknown argument: --unknown')}`); expect(stderr).toContain('Unknown argument: --unknown'); expect(exitCode).toBe(2); }); + it('suggests the closest match to an unknown flag', () => { const { stderr, stdout, exitCode } = run(__dirname, ['--entyr', './a.js']); expect(stderr).toContain('Unknown argument: --entyr');