gulp-factory v2.0.2
gulp-factory (v2.0.0)
a factory to create instant gulp-plugins and enforcing gulp plugin guidelines.
BREAKING CHANGE (v 2.0.0):
For simplicity & flexibility, API has changed as of V2.0.0. Now you'll pass pluginName & pluginFn as a part of options.
v 2.0.0 Changes
- API signature has been changed
- An optional
flushFn(refer through2 API) has been added. - Removed
options.warnings, that covered guidelines: 4, 5 & 13, as they seems no purpose served.
Intro
Majority of gulp-plugins share the same boilerplate code (except its implementation that wrapped inside through.obj(...)). gulp-factory takes care of them all as per gulp plugin guidelines - including error handling. All you need is just a few line of code to complete your gulp-plugins.
Quick Sample
// a fully functional plugin
var factory = require ('gulp-factory');
function plugin() {
return factory({
pluginName: 'gulp-text-changer',
pluginFn: (file) => {
file.contents = new Buffer('changed from plugin');
}
});
}
module.exports = plugin;// and calling from gulpfile.js
var changer = require ('./plugins/changer.js');
var gulp = require('gulp');
gulp.task('default', function () {
return gulp.src('./fixtures/*.txt')
.pipe(changer())
.pipe(gulp.dest('dist'));
});Installation
npm install --save gulp-factoryFeatures
Currently gulp-factory enforces / follows the below gulp plugin guidelines (gpg) by default:
- Does not throw errors inside a stream (6)
- Prefix any errors (uses PluginError) with the name of your plugin (7)
- Throws error if your plugin name doesn't prefixed with "gulp-" (if
homeMadeoption set totrue, it won't) (8) - If
file.contentsis null (non-read), it ignores the file and pass it along (9.1) - If
file.contentsis a Stream and you don't support that (streamSupport: false), emits an error (9.2) - Does not pass the file object downstream until you are done with it (10)
- Uses modules from gulp's recommended modules (12)
Usage
Your plugins could be either a module or just a function.
For example, you only need the below code to create a completely working front-matter gulp-plugin.
// index.js
var gm = require('gray-matter');
var factory = require('gulp-factory');
module.exports = function (options) {
options = options || {};
// plugin implementation
function plugin(file, encode) {
var raw = gm(file.contents.toString(encode), options);
file.yml = raw.data || {};
file.contents = new Buffer(raw.content);
}
// return factory
return factory({
pluginName: 'gulpfactory-gray-matter',
pluginFn: plugin,
homeMade: true
});
};Then from your gulpfile.js
// gulpfile.js
var gulp = require('gulp');
var grayMatter = require('./');
gulp.task('default', function yaml() {
return gulp.src('./fixtures/*.md')
.pipe(grayMatter({delims: '---'}))
.pipe(gulp.dest('./fixtures/output'));
})or just turn any of your function into a gulp-plugin
// gulpfile.js
var gulp = require('gulp');
var gm = require('gray-matter');
var factory = require('gulp-factory');
// plugin implementation
function plugin(file, encode) {
var raw = gm(file.contents.toString(encode), {delims: '---'});
file.yml = raw.data || {};
file.contents = new Buffer(raw.content);
}
gulp.task('default', function yaml() {
return gulp.src('./fixtures/*.md')
.pipe(factory({
pluginName: 'gulpfactory-gray-matter',
pluginFn: pluginFn,
homeMade: true
})
.pipe(gulp.dest('./fixtures/output'));
})API
factory (options)options
// default values
{
pluginName: '',
pluginFn: null,
flushFn: null,
streamSupport: false,
bufferSupport: true,
homeMade: false,
showStack: false,
showProperties: true
}options.pluginName
Type: string, required
Default: Empty
Unless
homeMademode enabled, plugin must be prefixed withgulp-. Will throw error otherwise.
options.pluginFn (file, encode)
Type: function, required
Default: null
gulp-factorysupplies onlyfile & encodearguments (both are optional) and takes care of calling yourcallback. So, your plugin function could be in either one of the following signature.
function pluginFunction() {
// If you have no file based operations but
// Just wrapping a function
}// or......
function pluginFunction(file) {
// Your file operations
// Remember that you do not have to return anything or callback
}// or......
function pluginFunction(file, encode) {
// Your file/encode operations
try {
const fileData = file.contents.toString(encode);
file.contents = new Buffer('new content');
} catch (e) {
// Just throw your error and
// gulp-factory will catch and throw PluginError
// Along with your pluginName as it's prefix
throw e;
}
}If needed, just
throwan error as above andgulp-factorywill wrap it withPluginErrorandpluginNameprefix.
options.flushFn ()
Type: function, optional
Default: null
This function will be passed to
through2'sflush argument. Also will call it'scallbackfunction. If needed, justthrowan error as above andgulp-factorywill wrap it withPluginErrorandpluginNameprefix.
options.streamSupport
Type: boolean
Default: false
Whether your plugin supports
stream. Throws PluginError if thefileisStream.
options.bufferSupport
Type: boolean
Default: true
Whether your plugin supports
buffer. Throws PluginError if thefileisBuffer.
options.homeMade
Type: boolean
Default: false
By default,
gulp-factoryoperates infactorymode:- that requires all your plugins prefixed withgulp-. However if you would just like to test your plugins on your local repository or wrapping your existing functions as gulp-plugins and have no plan to list them under gulp plugin registry, just sethomeMade: trueandgulp-factorywon't enforcegulp-prefix.
options.showStack
Type: boolean
Default: false
Refer gulp-util's PluginError
options.showProperties
Type: boolean
Default: true
Refer gulp-util's PluginError
gulpUtil
gulp-factoryexposes gulp-util for your plugins' convenience.
const gulpUtil = require('gulp-factory').gulpUtil;_ (lodash)
gulp-factoryexposes lodash for your plugins' convenience.
const _ = require('gulp-factory')._;Examples
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago