diff --git a/packages/configtest/src/index.ts b/packages/configtest/src/index.ts index 6f93369d526..3390d7307f9 100644 --- a/packages/configtest/src/index.ts +++ b/packages/configtest/src/index.ts @@ -1,4 +1,6 @@ -import webpack from 'webpack'; +import { validate, version, ValidationError, WebpackOptionsValidationError } from 'webpack'; + +const isWebpack5: boolean = version.startsWith('5'); class ConfigTestCommand { async apply(cli): Promise { @@ -13,22 +15,29 @@ class ConfigTestCommand { pkg: '@webpack-cli/configtest', }, [], - async (configPath: string) => { + async (configPath: string): Promise => { const { options } = await cli.resolveConfig({ config: [configPath] }); - const isValidationError = (error) => { + const isValidationError = (error): boolean => { // https://github.com/webpack/webpack/blob/master/lib/index.js#L267 // https://github.com/webpack/webpack/blob/v4.44.2/lib/webpack.js#L90 - const ValidationError: any = webpack.ValidationError || webpack.WebpackOptionsValidationError; + //eslint-disable-next-line @typescript-eslint/no-explicit-any + const webpackValidationError: any = ValidationError || WebpackOptionsValidationError; - return error instanceof ValidationError; + return error instanceof webpackValidationError; }; //eslint-disable-next-line @typescript-eslint/no-explicit-any - const error: any = webpack.validate(options); - - if (error) { - logger.error(isValidationError(error) ? error.message : error); + const error: any = validate(options); + + if (error && error.length) { + if (isValidationError(error)) { + // eslint-disable-next-line @typescript-eslint/ban-ts-ignore + // @ts-ignore + logger.error(isWebpack5 ? error.message : new WebpackOptionsValidationError(error)); + } else { + logger.error(error); + } process.exit(2); } diff --git a/test/configtest/configtest.test.js b/test/configtest/configtest.test.js index 59c6f34bdfa..df1fced41e9 100644 --- a/test/configtest/configtest.test.js +++ b/test/configtest/configtest.test.js @@ -15,7 +15,7 @@ describe('basic info usage', () => { const { exitCode, stderr, stdout } = run(__dirname, ['configtest', './error.config.js'], false); expect(exitCode).toBe(2); - expect(stderr).toContain('ValidationError: Invalid configuration object.'); + expect(stderr).toContain('Invalid configuration object.'); expect(stderr).toContain('configuration.mode should be one of these:'); expect(stdout).toBeFalsy(); }); @@ -32,7 +32,7 @@ describe('basic info usage', () => { const { exitCode, stderr, stdout } = run(__dirname, ['t', './error.config.js'], false); expect(exitCode).toBe(2); - expect(stderr).toContain('ValidationError: Invalid configuration object.'); + expect(stderr).toContain('Invalid configuration object.'); expect(stderr).toContain('configuration.mode should be one of these:'); expect(stdout).toBeFalsy(); });