Automatically loads any gulp plugins from package.json dependencies and attaches them to a configurable object
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Gulp Load Plugins automatically loads any gulp plugins from package.json dependencies and attaches them to a configurable object. It eliminates the need for manual require() statements for each gulp plugin by scanning package dependencies, filtering for gulp-prefixed packages, and creating a plugins object with camelCase property names.
npm install --save-dev gulp-load-pluginsconst gulpLoadPlugins = require('gulp-load-plugins');
const plugins = gulpLoadPlugins();Or more concisely:
const plugins = require('gulp-load-plugins')();Given a package.json with gulp plugin dependencies:
{
"dependencies": {
"gulp-jshint": "*",
"gulp-concat": "*",
"gulp-uglify": "*"
}
}Load all plugins automatically:
const gulp = require('gulp');
const plugins = require('gulp-load-plugins')();
// Now you can use plugins without requiring them individually
gulp.task('scripts', () => {
return gulp.src('src/**/*.js')
.pipe(plugins.jshint())
.pipe(plugins.concat('app.js'))
.pipe(plugins.uglify())
.pipe(gulp.dest('dist'));
});This is equivalent to manually requiring each plugin:
const jshint = require('gulp-jshint');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');The main export is a function that scans package.json dependencies and returns an object with lazy-loaded gulp plugins.
/**
* Loads gulp plugins from package dependencies and attaches them to an object
* @param {LoadPluginsOptions} options - Configuration options
* @returns {object} Object with plugin properties that load on first access
*/
function gulpLoadPlugins(options);All configuration options are optional and have sensible defaults.
interface LoadPluginsOptions {
/** Enable debug logging to console (default: false) */
DEBUG?: boolean;
/** Glob patterns to search for plugins (default: ['gulp-*', 'gulp.*', '@*/gulp{-,.}*']) */
pattern?: string | string[];
/** When true, overrides built-in patterns; when false, extends them (default: true) */
overridePattern?: boolean;
/** Path to package.json or config object (default: auto-discovered from current working directory) */
config?: string | object;
/** Which dependency sections to scan (default: ['dependencies', 'devDependencies', 'peerDependencies']) */
scope?: string | string[];
/** Pattern to remove from plugin names (default: /^gulp(-|\.)/) */
replaceString?: RegExp;
/** Transform hyphenated names to camelCase (default: true) */
camelize?: boolean;
/** Whether plugins should be lazy loaded on demand (default: true) */
lazy?: boolean;
/** Manual mapping for renaming specific plugins (default: {}) */
rename?: { [pluginName: string]: string };
/** Custom function for plugin name transformation */
renameFn?: (name: string) => string;
/** Transform functions applied after plugin loading (default: {}) */
postRequireTransforms?: { [pluginName: string]: (plugin: any) => any };
/** Keep scoped packages in nested objects vs flattened (default: true) */
maintainScope?: boolean;
/** Custom require function for loading plugins */
requireFn?: (name: string) => any;
}Most common configuration options:
const plugins = require('gulp-load-plugins')({
DEBUG: false, // Enable for troubleshooting
lazy: true, // Lazy load plugins (recommended)
camelize: true, // Convert hyphenated names to camelCase
maintainScope: true // Keep scoped packages nested
});Override or extend the default plugin search patterns:
// Override default patterns completely
const plugins = require('gulp-load-plugins')({
pattern: ['gulp-*', 'my-gulp-*'],
overridePattern: true
});
// Extend default patterns
const plugins = require('gulp-load-plugins')({
pattern: ['my-gulp-*'],
overridePattern: false // Adds to built-in patterns
});Rename plugins for cleaner access:
const plugins = require('gulp-load-plugins')({
rename: {
'gulp-ruby-sass': 'sass',
'gulp-typescript': 'ts'
}
});
// Access as plugins.sass and plugins.tsUse a custom function for plugin name transformation:
const plugins = require('gulp-load-plugins')({
renameFn: function(name) {
// Custom logic to transform plugin names
return name.replace(/^gulp-/, '').replace(/-(\w)/g, (m, p1) => p1.toUpperCase());
}
});Transform plugins after they're loaded:
const plugins = require('gulp-load-plugins')({
postRequireTransforms: {
sass: function(sass) {
return sass.logError; // Return a specific method
},
foo: function(foo) {
return foo.configure({ /* options */ });
}
}
});Merge configurations from multiple package.json files:
const merge = require('lodash.merge');
const packages = merge(
require('some-shared-config/package.json'),
require('./package.json')
);
const plugins = require('gulp-load-plugins')({
config: packages
});Handle npm scoped packages:
// With maintainScope: true (default)
const plugins = require('gulp-load-plugins')();
// @mycompany/gulp-eslint becomes plugins.mycompany.eslint
// With maintainScope: false
const plugins = require('gulp-load-plugins')({
maintainScope: false
});
// @mycompany/gulp-eslint becomes plugins.eslintThe plugin name resolution follows these steps:
replaceString patternrename optionrenameFn if providedcamelize is truemaintainScope is trueThe default patterns match these plugin types:
gulp-*: Standard plugins (e.g., gulp-concat → concat)gulp.*: Dot notation plugins (e.g., gulp.spritesmith → spritesmith)@*/gulp{-,.}*: Scoped plugins (e.g., @myco/gulp-eslint → myco.eslint)Note: The module automatically excludes gulp-load-plugins itself from being loaded to prevent circular references.
| Package Name | Default Property | With maintainScope: false |
|---|---|---|
gulp-concat | plugins.concat | plugins.concat |
gulp-ruby-sass | plugins.rubySass | plugins.rubySass |
@angular/gulp-build | plugins.angular.build | plugins.build |
gulp.spritesmith | plugins.spritesmith | plugins.spritesmith |
The function throws errors in these cases:
try {
const plugins = require('gulp-load-plugins')({
config: null
});
} catch (error) {
console.error(error.message);
// Throws: "Could not find dependencies. Do you have a package.json file in your project?"
}Enable debug mode to troubleshoot plugin loading:
const plugins = require('gulp-load-plugins')({
DEBUG: true
});
// Console output will show:
// gulp-load-plugins: Debug enabled with options: {...}
// gulp-load-plugins: 15 plugin(s) found: gulp-concat gulp-uglify ...
// gulp-load-plugins: renaming gulp-concat to concat
// gulp-load-plugins: lazyload: adding property concatscope option to limit which dependency sections are scanned// Optimize for performance
const plugins = require('gulp-load-plugins')({
lazy: true, // Only load plugins when used
scope: ['devDependencies'], // Only scan dev dependencies
pattern: ['gulp-*'] // Only match standard gulp plugins
});interface LoadPluginsOptions {
DEBUG?: boolean;
pattern?: string | string[];
overridePattern?: boolean;
config?: string | object;
scope?: string | string[];
replaceString?: RegExp;
camelize?: boolean;
lazy?: boolean;
rename?: { [pluginName: string]: string };
renameFn?: (name: string) => string;
postRequireTransforms?: { [pluginName: string]: (plugin: any) => any };
maintainScope?: boolean;
requireFn?: (name: string) => any;
}
/**
* Return type is a dynamic object where property names depend on the plugins found
* and the configuration options applied. Each property contains the loaded plugin.
*/
interface PluginsObject {
[pluginName: string]: any;
}