Webpack Config Validator
Validate webpack configuration files exported as JSON for structural correctness, entry/output issues, deprecated loaders and plugins, optimization configuration, and best practices. Pure Python 3 stdlib — no external dependencies.
Note: webpack configs are JS/TS, not directly parseable. This validator works with JSON-exported configs. Export via:
node -e "console.log(JSON.stringify(require('./webpack.config.js')))" > config.json
python3 scripts/webpack_config_validator.py validate config.json
Commands
validate — Full validation with all rules
python3 scripts/webpack_config_validator.py validate config.json
python3 scripts/webpack_config_validator.py validate config.json --strict
python3 scripts/webpack_config_validator.py validate config.json --format json --mode production
check — Quick check (errors and warnings only)
python3 scripts/webpack_config_validator.py check config.json
python3 scripts/webpack_config_validator.py check config.json --format summary
explain — Show all rules with descriptions
python3 scripts/webpack_config_validator.py explain config.json
python3 scripts/webpack_config_validator.py explain config.json --format json
suggest — Run validation and propose fixes
python3 scripts/webpack_config_validator.py suggest config.json
python3 scripts/webpack_config_validator.py suggest config.json --format json
Flags
| Flag | Description |
|---|
--strict | Treat warnings as errors — exit code 1 (CI-friendly) |
--format text | Human-readable output (default) |
--format json | Machine-readable JSON |
--format summary | Compact summary with counts |
--mode production | Override mode context for mode-specific rules (E3, O3) |
--mode development | Override mode context for mode-specific rules |
Validation Rules (24)
Structure (5)
| Rule | Severity | Description |
|---|
| S1 | error | File not found or unreadable |
| S2 | error | Empty config file |
| S3 | error | Invalid JSON syntax |
| S4 | error | Missing required fields (entry, output) |
| S5 | warning/info | Unknown or deprecated top-level keys |
Entry/Output (4)
| Rule | Severity | Description |
|---|
| E1 | error | Empty entry point (empty string, object, or array) |
| E2 | error | Output section missing 'path' property |
| E3 | warning | Output filename without content hash in production mode |
| E4 | warning | publicPath not set |
Module/Rules (4)
| Rule | Severity | Description |
|---|
| M1 | warning | Module rule without 'test' pattern |
| M2 | warning | Duplicate loader for same test pattern |
| M3 | warning | Deprecated loaders (raw-loader, url-loader, file-loader, json-loader) |
| M4 | info | No babel-loader/ts-loader/esbuild-loader/swc-loader for JS/TS |
Plugins (4)
| Rule | Severity | Description |
|---|
| P1 | error | Deprecated plugins (UglifyJsPlugin, ExtractTextPlugin, CommonsChunkPlugin) |
| P2 | warning | Duplicate plugin instances |
| P3 | info | HtmlWebpackPlugin without explicit template |
| P4 | warning | MiniCssExtractPlugin without corresponding loader in rules |
Optimization (3)
| Rule | Severity | Description |
|---|
| O1 | info | Missing splitChunks configuration |
| O2 | info | Missing custom minimizer configuration |
| O3 | warning/info | devtool set to eval or source-map in production mode |
Best Practices (4)
| Rule | Severity | Description |
|---|
| B1 | info | Missing resolve.extensions |
| B2 | warning | Hardcoded absolute filesystem paths in config |
| B3 | warning | No mode set (development/production/none) |
| B4 | info | Missing devServer configuration |
Exit Codes
| Code | Meaning |
|---|
| 0 | No errors (warnings allowed unless --strict) |
| 1 | Errors found (or warnings in --strict mode) |
| 2 | File not found / parse error |
CI Integration
# GitHub Actions example
- name: Validate webpack config
run: |
node -e "console.log(JSON.stringify(require('./webpack.config.js')))" > /tmp/wp-config.json
python3 scripts/webpack_config_validator.py validate /tmp/wp-config.json --strict --mode production --format json
Example Output
webpack.config validate — config.json
======================================
[ERROR ] S4: Missing required top-level field(s): output
Every webpack config needs at least 'entry' and 'output'.
[WARNING] E4: output.publicPath not set
Set publicPath to ensure assets are loaded from the correct URL. Common values: '/', '/assets/', 'auto'.
[WARNING] M3: Deprecated loader 'file-loader' in rule 2
Replace with asset/resource (webpack 5 built-in).
[ERROR ] P1: Deprecated plugin 'UglifyJsPlugin' at index 0
Replace with TerserPlugin (terser-webpack-plugin).
[INFO ] O1: No optimization.splitChunks configuration
splitChunks enables automatic code splitting for shared dependencies. Add optimization: { splitChunks: { chunks: 'all' } } for better caching.
[WARNING] B3: No 'mode' set (development/production/none)
Set mode to enable webpack's built-in optimizations. Without mode, webpack defaults to 'production' with a warning.
Result: INVALID
Summary: 2 error(s), 3 warning(s), 1 info