Build tools for WordPress plugins and themes - Webpack config wrapper and package transpilation for monorepos
- Extends
@wordpress/scriptswith intelligent defaults - Customizable source/output paths (defaults:
assets/src/→assets/build/) - Auto-copy images and fonts
- Bundle optimization (removes empty scripts, trims timezone data)
- Clean progress reporting with WebpackBar
- Transpiles TypeScript/JavaScript packages using Babel
- Compiles SCSS to CSS with RTL support
- Builds both CommonJS (
build/) and ESM (build-module/) outputs - TypeScript declaration generation
- Watch mode for development
- Works with both monorepos (workspaces) and single packages
npm install @byteever/scripts --save-dev
npm install @wordpress/scripts --save-devCreate webpack.config.js in your project root:
const createConfig = require('@byteever/scripts');
const baseConfig = require('@wordpress/scripts/config/webpack.config');
module.exports = createConfig(baseConfig);With custom entries:
module.exports = createConfig(baseConfig, {
'client/index': './assets/src/client/index.js',
'admin/settings': './assets/src/admin/settings.js',
});With function-based config override:
module.exports = createConfig(baseConfig, (config) => ({
devtool: 'source-map',
output: {
...config.output,
filename: '[name].[contenthash].js',
},
}));Custom paths via CLI:
wp-scripts build --source-path=src --output-path=distOr set environment variables before importing the config (defaults apply if not set).
Add scripts to your root package.json:
{
"scripts": {
"build": "byteever-scripts build-package && wp-scripts build",
"start": "byteever-scripts build-package && concurrently \"byteever-scripts watch-package\" \"wp-scripts start\""
}
}Package detection:
Packages are detected by the presence of a "module" field in their package.json:
{
"name": "@myproject/components",
"version": "1.0.0",
"main": "build/index.js",
"module": "build-module/index.js"
}Monorepo setup (with workspaces):
{
"name": "my-plugin",
"workspaces": ["packages/*"],
"devDependencies": {
"@byteever/scripts": "^2.2.0",
"concurrently": "^9.0.0"
}
}Single package setup (no workspaces):
If your root package.json has a "module" field, it will be built as a single package.
Directory structure:
project/
├── packages/
│ ├── components/
│ │ ├── src/
│ │ │ ├── index.js
│ │ │ └── Button.js
│ │ ├── package.json # Has "module" field
│ │ ├── build/ # Generated (CommonJS)
│ │ └── build-module/ # Generated (ESM)
│ └── data/
│ ├── src/
│ ├── package.json # Has "module" field
│ ├── build/
│ └── build-module/
├── assets/
│ ├── src/ # JS/CSS source
│ └── build/ # Compiled output
├── webpack.config.js
└── package.json
Builds packages with a "module" field in their package.json.
What it does:
- Transpiles JS/TS/TSX files from
src/tobuild/(CommonJS) andbuild-module/(ESM) - Compiles SCSS files to CSS with automatic RTL generation in
build-style/ - Copies JSON files
- Generates TypeScript declarations (if
tsconfig.jsonexists)
File extensions handled:
.js,.ts,.tsx→ Babel transpilation.scss→ Sass compilation + PostCSS + RTL.json→ Direct copy
Same as build-package but watches for file changes and rebuilds incrementally.
Given this source structure:
packages/components/src/
├── index.js
├── Button.js
└── styles.scss
Build produces:
packages/components/
├── build/ # CommonJS
│ ├── index.js
│ ├── index.js.map
│ ├── Button.js
│ └── Button.js.map
├── build-module/ # ESM
│ ├── index.js
│ ├── index.js.map
│ ├── Button.js
│ └── Button.js.map
└── build-style/ # CSS
├── styles.css
└── styles-rtl.css
webpackbar- Clean progress barcopy-webpack-plugin- Auto-copy images/fontswebpack-remove-empty-scripts- Removes empty JS from CSS-only entriesmoment-timezone-data-webpack-plugin- Reduces timezone data (from year 2000)
WP_SOURCE_PATH- Source directory (default:assets/src)WP_OUTPUT_PATH- Output directory (default:assets/build)NODE_ENV- Set todevelopmentto build only ESM for packages
Object (replaces entries):
module.exports = createConfig(baseConfig, {
'app': './src/app.js',
});Function (merges with base config):
module.exports = createConfig(baseConfig, (config) => ({
devtool: 'source-map',
}));In package.json:
{
"name": "@myproject/utils",
"version": "1.0.0",
"main": "build/index.js",
"module": "build-module/index.js"
}The "module" field is required for the package to be detected and built.
{
"name": "my-plugin",
"workspaces": ["packages/*"],
"scripts": {
"build": "byteever-scripts build-package && wp-scripts build",
"start": "byteever-scripts build-package && concurrently \"byteever-scripts watch-package\" \"wp-scripts start\""
}
}{
"name": "@myorg/library",
"main": "build/index.js",
"module": "build-module/index.js",
"scripts": {
"build": "byteever-scripts build-package"
}
}// webpack.config.js
const createConfig = require('@byteever/scripts');
const baseConfig = require('@wordpress/scripts/config/webpack.config');
module.exports = createConfig(baseConfig, {
'client/index': './assets/src/client/index.js',
});Built by ByteEver
MIT