Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added postRequireTransforms #119

Merged
merged 4 commits into from
Sep 9, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 32 additions & 20 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ function camelize(str) {
// to use the same functionality as gulp-util for backwards compatibility
// with gulp 3x cli
function logger() {
if(hasGulplog()){
if (hasGulplog()) {
// specifically deferring loading here to keep from registering it globally
var gulplog = require('gulplog');
gulplog.info.apply(gulplog, arguments);
Expand All @@ -39,7 +39,7 @@ module.exports = function(options) {

var DEBUG = options.DEBUG || false;
var pattern = arrayify(options.pattern || ['gulp-*', 'gulp.*', '@*/gulp{-,.}*']);
var config = options.config || findup('package.json', {cwd: parentDir});
var config = options.config || findup('package.json', { cwd: parentDir });
var scope = arrayify(options.scope || ['dependencies', 'devDependencies', 'peerDependencies']);
var replaceString = options.replaceString || /^gulp(-|\.)/;
var camelizePluginName = options.camelize !== false;
Expand All @@ -48,15 +48,17 @@ module.exports = function(options) {

logDebug('Debug enabled with options: ' + JSON.stringify(options));

var renameFn = options.renameFn || function (name) {
var renameFn = options.renameFn || function(name) {
name = name.replace(replaceString, '');
return camelizePluginName ? camelize(name) : name;
};

if(typeof options.requireFn === 'function') {
var postRequireTransforms = options.postRequireTransforms || {};

if (typeof options.requireFn === 'function') {
requireFn = options.requireFn;
} else if(typeof config === 'string') {
requireFn = function (name) {
} else if (typeof config === 'string') {
requireFn = function(name) {
// This searches up from the specified package.json file, making sure
// the config option behaves as expected. See issue #56.
var src = resolve.sync(name, { basedir: path.dirname(config) });
Expand All @@ -68,7 +70,7 @@ module.exports = function(options) {

configObject = (typeof config === 'string') ? require(config) : config;

if(!configObject) {
if (!configObject) {
throw new Error('Could not find dependencies. Do you have a package.json file in your project?');
}

Expand All @@ -81,36 +83,36 @@ module.exports = function(options) {
pattern.push('!gulp-load-plugins');

function logDebug(message) {
if(DEBUG) {
if (DEBUG) {
logger('gulp-load-plugins: ' + message);
}
}

function defineProperty(object, requireName, name) {
if(object[requireName]){
function defineProperty(object, transform, requireName, name) {
if (object[requireName]) {
logDebug('error: defineProperty ' + name);
throw new Error('Could not define the property \"' + requireName + '\", you may have repeated dependencies in your package.json like' + ' "gulp-' + requireName + '" and ' + '"' + requireName + '"' );
throw new Error('Could not define the property "' + requireName + '", you may have repeated dependencies in your package.json like' + ' "gulp-' + requireName + '" and ' + '"' + requireName + '"');
}

if(lazy) {
if (lazy) {
logDebug('lazyload: adding property ' + requireName);
Object.defineProperty(object, requireName, {
enumerable: true,
get: function() {
logDebug('lazyload: requiring ' + name + '...');
return requireFn(name);
return transform(requireName, requireFn(name));
}
});
} else {
logDebug('requiring ' + name + '...');
object[requireName] = requireFn(name);
object[requireName] = transform(requireName, requireFn(name));
}
}

function getRequireName(name) {
var requireName;

if(renameObj[name]) {
if (renameObj[name]) {
requireName = options.rename[name];
} else {
requireName = renameFn(name);
Expand All @@ -121,23 +123,33 @@ module.exports = function(options) {
return requireName;
}

function applyTransform(requireName, plugin) {
var transform = postRequireTransforms[requireName];

if (transform && typeof transform === 'function') { // if postRequireTransform function is passed, pass it the plugin and return it
logDebug('transforming ' + requireName);
return transform(plugin);
} else {
return plugin; // if no postRequireTransform function passed, return the plugin as is
}
}

var scopeTest = new RegExp('^@');
var scopeDecomposition = new RegExp('^@(.+)/(.+)');

unique(micromatch(names, pattern)).forEach(function(name) {
var decomposition;
if(scopeTest.test(name)) {
if (scopeTest.test(name)) {
decomposition = scopeDecomposition.exec(name);

if(!finalObject.hasOwnProperty(decomposition[1])) {
if (!finalObject.hasOwnProperty(decomposition[1])) {
finalObject[decomposition[1]] = {};
}

defineProperty(finalObject[decomposition[1]], getRequireName(decomposition[2]), name);
defineProperty(finalObject[decomposition[1]], applyTransform, getRequireName(decomposition[2]), name);
} else {
defineProperty(finalObject, getRequireName(name), name);
defineProperty(finalObject, applyTransform, getRequireName(name), name);
}

});

return finalObject;
Expand Down
15 changes: 15 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,21 @@ var commonTests = function(lazy) {
name: 'foo-bar'
});
});

it('supports transforming', function() {
var x = gulpLoadPlugins({
lazy: lazy,
config: { dependencies: { 'gulp-foo': '1.0.0' } },
postRequireTransforms: {
foo: function(foo) {
foo.bar = 'test string';
return foo;
}
}
});

assert.strictEqual(x.foo.bar, 'test string');
});
};

describe('no lazy loading', function() {
Expand Down