diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 9a0913a2de2..2c8c47b7d89 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -91,6 +91,7 @@ jobs: - name: Run tests for webpack version ${{ matrix.webpack-version }} run: | + yarn run lerna bootstrap yarn prepsuite yarn test:ci env: diff --git a/packages/generators/src/addon-generator.ts b/packages/generators/src/addon-generator.ts index 3cab6939dc3..10fb9936512 100644 --- a/packages/generators/src/addon-generator.ts +++ b/packages/generators/src/addon-generator.ts @@ -54,8 +54,9 @@ const addonGenerator = ( const pathToProjectDir: string = this.destinationPath(this.props.name); try { mkdirp.sync(pathToProjectDir); - } catch (err) { - logger.error('Failed to create directory', err); + } catch (error) { + logger.error('Failed to create directory'); + logger.error(error); } this.destinationRoot(pathToProjectDir); } diff --git a/packages/webpack-cli/lib/groups/ConfigGroup.js b/packages/webpack-cli/lib/groups/ConfigGroup.js index 58aa983d6a5..d98a6183154 100644 --- a/packages/webpack-cli/lib/groups/ConfigGroup.js +++ b/packages/webpack-cli/lib/groups/ConfigGroup.js @@ -3,7 +3,6 @@ const { resolve, extname } = require('path'); const webpackMerge = require('webpack-merge'); const { extensions, jsVariants } = require('interpret'); const rechoir = require('rechoir'); -const ConfigError = require('../utils/errors/ConfigError'); const logger = require('../utils/logger'); // Order defines the priority, in increasing order @@ -92,7 +91,8 @@ const resolveConfigFiles = async (args) => { const configFiles = getConfigInfoFromFileName(configPath); if (!configFiles.length) { - throw new ConfigError(`The specified config file doesn't exist in ${configPath}`); + logger.error(`The specified config file doesn't exist in ${configPath}`); + process.exit(2); } const foundConfig = configFiles[0]; @@ -230,12 +230,12 @@ const resolveConfigMerging = async (args) => { // either by passing multiple configs by flags or passing a // single config exporting an array if (!Array.isArray(configOptions)) { - throw new ConfigError('Atleast two configurations are required for merge.', 'MergeError'); + logger.error('At least two configurations are required for merge.'); + process.exit(2); } // We return a single config object which is passed to the compiler - const mergedOptions = configOptions.reduce((currentConfig, mergedConfig) => webpackMerge(currentConfig, mergedConfig), {}); - opts['options'] = mergedOptions; + opts['options'] = configOptions.reduce((currentConfig, mergedConfig) => webpackMerge(currentConfig, mergedConfig), {}); } }; diff --git a/packages/webpack-cli/lib/utils/errors/ConfigError.js b/packages/webpack-cli/lib/utils/errors/ConfigError.js deleted file mode 100644 index 3a7539c21bc..00000000000 --- a/packages/webpack-cli/lib/utils/errors/ConfigError.js +++ /dev/null @@ -1,11 +0,0 @@ -class ConfigError extends Error { - constructor(message, name) { - super(message); - this.name = name || 'ConfigError'; - // No need to show stack trace for known errors - this.stack = ''; - process.exitCode = 2; - } -} - -module.exports = ConfigError; diff --git a/packages/webpack-cli/lib/utils/logger.js b/packages/webpack-cli/lib/utils/logger.js index b1d76269d56..3afafc1ad44 100644 --- a/packages/webpack-cli/lib/utils/logger.js +++ b/packages/webpack-cli/lib/utils/logger.js @@ -1,7 +1,8 @@ +const util = require('util'); const { red, cyan, yellow, green } = require('colorette'); module.exports = { - error: (val) => console.error(`[webpack-cli] ${red(val)}`), + error: (val) => console.error(`[webpack-cli] ${red(util.format(val))}`), warn: (val) => console.warn(`[webpack-cli] ${yellow(val)}`), info: (val) => console.info(`[webpack-cli] ${cyan(val)}`), success: (val) => console.log(`[webpack-cli] ${green(val)}`), diff --git a/test/config/absent/config-absent.test.js b/test/config/absent/config-absent.test.js index 51bbea08355..f2c2ee6fc7c 100644 --- a/test/config/absent/config-absent.test.js +++ b/test/config/absent/config-absent.test.js @@ -11,7 +11,7 @@ describe('Config:', () => { expect(stdout).toBeFalsy(); const configPath = resolve(__dirname, 'webpack.config.js'); // Should contain the correct error message - expect(stderr).toContain(`ConfigError: The specified config file doesn't exist in ${configPath}`); + expect(stderr).toContain(`The specified config file doesn't exist in ${configPath}`); // Should not bundle expect(existsSync(resolve(__dirname, './binary/a.bundle.js'))).toBeFalsy(); }); diff --git a/test/error/error.test.js b/test/error/error.test.js new file mode 100644 index 00000000000..de30128d161 --- /dev/null +++ b/test/error/error.test.js @@ -0,0 +1,14 @@ +'use strict'; + +const { run } = require('../utils/test-utils'); + +describe('error', () => { + it('should log error with stacktrace', async () => { + const { stderr, stdout, exitCode } = await run(__dirname); + + expect(stderr).toContain('Error: test'); + expect(stderr).toMatch(/at .+ (.+)/); + expect(stdout).toBeFalsy(); + expect(exitCode).toBe(2); + }); +}); diff --git a/test/error/src/index.js b/test/error/src/index.js new file mode 100644 index 00000000000..d00e0a2e12f --- /dev/null +++ b/test/error/src/index.js @@ -0,0 +1 @@ +module.exports = 'foo'; \ No newline at end of file diff --git a/test/error/webpack.config.js b/test/error/webpack.config.js new file mode 100644 index 00000000000..25018a41285 --- /dev/null +++ b/test/error/webpack.config.js @@ -0,0 +1,9 @@ +module.exports = { + plugins: [ + { + apply() { + throw new Error('test'); + }, + }, + ], +}; diff --git a/test/merge/config-absent/merge-config-absent.test.js b/test/merge/config-absent/merge-config-absent.test.js index 13d2f962fb0..c595fb7e34c 100644 --- a/test/merge/config-absent/merge-config-absent.test.js +++ b/test/merge/config-absent/merge-config-absent.test.js @@ -13,7 +13,7 @@ describe('merge flag configuration', () => { // Since the process will exit, nothing on stdout expect(stdout).toBeFalsy(); // Confirm that the user is notified - expect(stderr).toContain(`MergeError: Atleast two configurations are required for merge.`); + expect(stderr).toContain('At least two configurations are required for merge.'); // Default config would be used expect(fs.existsSync(join(__dirname, './dist/merged.js'))).toBeFalsy(); // Since the process will exit so no compilation will be done diff --git a/test/merge/config/merge-config.test.js b/test/merge/config/merge-config.test.js index 36a31eed43e..926ff5e4bbb 100644 --- a/test/merge/config/merge-config.test.js +++ b/test/merge/config/merge-config.test.js @@ -22,7 +22,7 @@ describe('merge flag configuration', () => { }); it('fails when there are less than 2 configurations to merge', () => { const { stdout, stderr, exitCode } = run(__dirname, ['--config', './1.js', '-m'], false); - expect(stderr).toContain(`MergeError: Atleast two configurations are required for merge.`); + expect(stderr).toContain('At least two configurations are required for merge.'); expect(stdout).toBeFalsy(); expect(exitCode).toBe(2); });