Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Scripts

BracketSpace MicropackagenpmLicense

Micropackage logo

🧬 About Scripts

This is a collection of scripts useful for (not only) WordPress development. Inspired by @wordpress/scripts, this package contianis essential tools with default configuration.

💾 Installation

You only need to install one module:

npm install @micropackage/scripts --save-dev

or

yarn add -D @micropackage/scripts

🕹 Usage

This package exposes a binary called mp-scripts which can be called directly with npx or yarn.

npx mp-scripts build
yarn mp-scripts build

However it is intended to use this module in the scripts section in the package.json file of our project.

{
"scripts": {
"build": "mp-scripts build",
"lint:js": "mp-scripts lint-js",
"lint:style": "mp-scripts lint-style",
"start": "mp-scripts start"
}
}

WordPress Dependencies

This package uses the Dependency Extraction Webpack Plugin to extract wordpress dependencies. It does two things:

  • Externalize dependencies that are available as script dependencies on modern WordPress sites.
  • Add an asset file for each entry point that declares an object with the list of WordPress script dependencies for the entry point. The asset file also contains the current version calculated for the current source code.

This plugin is enabled by default with default configuration but can be easyli turned off by passing --no-deps flag to your build script:

{
"scripts": {
"build": "mp-scripts build --no-deps",
}
}

If you need to use this plugin with other configuration (for example you want it to generate json files instead php - see the plugin's documentation) you can extend webpack config. See Advanced Usage for more information.

Using WordPress Dependencies

Let's assume we are creating a Gutenberg block. We want to import Component class and some Gutenberg components to use in our block. Entry file would be custom-block.js:

import{Component}from'@wordpress/element';import{Button,CheckboxControl}from'@wordpress/components';
...

While running mp-scripts build command the Dependency Extraction Webpack Plugin will create additional php file containing an object with dependencies list and asset version. Note, that there is also no need to add imported packages to your package.json - since they are being externalized you don't need them in node_modules. The output files for this scenario are:

  • custom-block.js
  • custom-block.asset.php

Both files are located in the output directory. The php file will have the following content:

<?phpreturnarray('dependencies' => array('wp-components', 'wp-element', 'wp-polyfill'), 'version' => 'e7e3b282b35389ecd440edc71e073e5d'); ?>

Note that version will change if your source changes.

Here is a simple example of usage:

<?phpadd_action( 'enqueue_block_editor_assets', function() {
$dir = plugin_dir_path( __FILE__ );
$src = "{$dir}/dist/custom-block.js";
$asset_file = "{$dir}/dist/custom-block.asset.php";
if ( file_exists( $src ) && file_exists( $asset_file ) ) {
$asset_info = require$asset_file;
wp_enqueue_script(
'custom-block',
$src,
$asset_info['dependencies'],
$asset_info['version'],
true
);
}
} );
?>

📜 Available Scripts

build

Uses webpack to transform your code. By default it will scan the source paths to automatically create an entry point for each file. Subfolders are not scanned, also files which names start with underscore are skipped. Entry points can be js and (s)css files. Using MiniCssExtractPlugin and a custom plugin for asset cleanup this will emit only css file for (s)css entry.

This script can be configured using CLI arguments or by setting up a mpScriptsConfig property in the package.json.

All arguments other than listed below will be directly passed to webpack.

Configuration

NameArgumentTypeDescription
inlineAssetstrueboolean|numberWhether to use url-loader for images. If number is passed it will be used as 'limit' option.
Default: true
imagemin--boolean|objectWhether to use image-webpack-loader to optimize images with imagemin. Object will be passed as image-webpack-loader configuration.
Default: true
paths.src--src-pathstringSource path relative to project root.
Default: 'src/assets'
paths.output--output-pathstringOutput path relative to project root.
Default: 'dist'
paths.scripts--scripts-pathstringScripts path relative to src|output. Use false to skip this path.
Default: 'js'
paths.styles--styles-pathstringStyles path relative to src|output. Use false to skip this path.
Default: 'scss'
paths.images--images-pathstringImages path relative to output. Images included in scripts and styles will be placed in this location if inlineAssets is turned off or the image size exceeds limit.
Default: 'images'
paths.fonts--fonts-pathFontsFonts path relative to output. Font files included in scripts and styles will be placed in this location.
Default: 'fonts'

Example:

{
"mpScriptsConfig": {
"inlineAssets": 8192,
"imagemin": {
"svgo": {
"plugins": [
{ "removeDoctype": false }
]
}
},
"paths": {
"src": "src/assets",
"output": "dist",
"scripts": "js",
"styles": "scss",
}
}
}

Usage

Example:

{
"scripts": {
"build": "mp-scripts build",
"build:dev": "mp-scripts build --mode=development",
"build:custom": "mp-scripts build entry-one.js entry-two.js --output-path=custom",
"build:other": "mp-scripts build --entry-path=other/src --output-path=other/dist --scripts-path=scripts --styles-path=styles"
}
}

How to use it:

  • yarn build - builds the code for production using entries from src/assets/js and src/assets/scss. Only files located directly in this folders will be used. All file names starting with _ (underscore) are skipped. Output files will be placed inside dist/js and dist/css directories
  • yarn build:custom - builds the code for production with two entry points and a custom output folder. Paths for custom entry points are relative to the project root.
  • yarn build:other - this will work like the default build, but will look for entries inside other/src/scripts and other/src/styles directories. Output files will be placed inside other/dist/scripts and other/dist/styles.

Mode

By default build script will work in development mode. There are two ways to use another mode:

  • by adding --mode argument to your command
  • by setting NODE_ENV variable

lint-js

Lints your code using eslint. Default linting ruleset is @wordpress/eslint-plugin/recommended. This can be overwriten by placing an eslint config file in your project or specifing eslintConfig field in a package.json.

Example:

{
"scripts": {
"lint:js": "mp-scripts lint-js",
"fix:js": "mp-scripts lint-js --fix",
"lint:js:src": "mp-scripts lint-js ./src"
}
}

How to use it:

  • yarn lint:js - lints JavaScript files in the entire project’s directories.
  • yarn lint:js:src - lints JavaScript files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

lint-style

Uses stylelint to lint your style files.

Example:

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"fix:style": "mp-scripts lint-style --fix",
"lint:css:src": "mp-scripts lint-style 'src/**/*.css'"
}
}

How to use it:

  • yarn lint:style - lints CSS and SCSS files in the entire project’s directories.
  • yarn lint:css:src - lints only CSS files in the project’s src subfolder’s directories.

By default, files located in dist, vendor and node_modules folders are ignored.

start

This script works exactly like build but configured for development. It will also automatically rebuild if the code will change. All the params work the same way as in build script.

Example:

{
"scripts": {
"start": "mp-scripts start",
"start:custom": "mp-scripts start --entry-path=custom/src --output-path=custom/build"
}
}

🕵️ Advanced Usage

This package ships with default config files for eslint, stylelint and webpack. Each config file can be overriden in your project.

Extending webpack config

To extend default webpack config you can provide your own webpack.config.js file and require the provided webpack.config.js file. You can use spread operator to import parts of the config.

In the example below a webpack.config.js file is added to the root folder extending the provided webpack config to include url-loader for images:

constdefaultConfig=require("@micropackage/scripts/config/webpack.config");module.exports={
...defaultConfig,module: {
...defaultConfig.module,rules: [
...defaultConfig.module.rules,{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: '[name].[ext]',outputPath: 'images',},},],},],},};

Run scripts in parallel or sequential

There are separate scripts to lint js and (s)css files, but it would be nice to have a single task to lint both. It can be accomplished using external modules, e.g. npm-run-all. Using this module ypu can define scripts which will run other scripts in parallel or sequential using run-p or run-s commands.

{
"scripts": {
"lint:style": "mp-scripts lint-style",
"lint:js": "mp-scripts lint-js",
"fix:style": "mp-scripts lint-style --fix",
"fix:js": "mp-scripts lint-js --fix",
"lint": "run-p \"lint:*\"",
"lint:fix": "run-p \"fix:*\"",
}
}

With the above config in your package.json you can run:

  • yarn lint - to run both lint:style and lint:js in parallel
  • yarn lint:fix - to run both fix:style and fix:js in parallel

📦 About the Micropackage project

Micropackages - as the name suggests - are micro packages with a tiny bit of reusable code, helpful particularly in WordPress development.

The aim is to have multiple packages which can be put together to create something bigger by defining only the structure.

Micropackages are maintained by BracketSpace.

📖 Changelog

See the changelog file.

📃 License

GNU General Public License (GPL) v3.0. See the LICENSE file for more information.

About

Simpler @wordpress/scripts equivalent - minimal and configurable Webpack setup

Topics

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages