You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.1 KiB
207 lines
4.1 KiB
var _ = require("lodash"); |
|
|
|
/** |
|
* @constructor |
|
*/ |
|
var EasyExtender = function (plugins, hooks) { |
|
|
|
this.plugins = {}; |
|
this.pluginOptions = {}; |
|
this.returnValues = {}; |
|
|
|
this.hooks = hooks; |
|
this.defaultPlugins = plugins; |
|
|
|
return this; |
|
}; |
|
|
|
/** |
|
* @returns {EasyExtender} |
|
*/ |
|
EasyExtender.prototype.init = function () { |
|
|
|
if (this.defaultPlugins) { |
|
var required = Object.keys(this.defaultPlugins); |
|
required.forEach(function (name) { |
|
if (_.isUndefined(this.plugins[name])) { |
|
this.plugins[name] = this.defaultPlugins[name]; |
|
} |
|
}, this); |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
/** |
|
* Call the '.plugin()' method of all registered plugins |
|
*/ |
|
EasyExtender.prototype.initUserPlugins = function () { |
|
|
|
var args = _.toArray(arguments); |
|
|
|
var userPlugins = _.difference(Object.keys(this.plugins), Object.keys(this.defaultPlugins)); |
|
|
|
if (userPlugins.length) { |
|
|
|
userPlugins.forEach(function (plugin) { |
|
|
|
var pluginOptions = {}; |
|
|
|
if (this.pluginOptions) { |
|
pluginOptions = this.pluginOptions[plugin]; |
|
} |
|
|
|
this.returnValues[plugin].push({ |
|
value: this.get(plugin).apply(null, [pluginOptions].concat(args)) |
|
}); |
|
|
|
if (!_.isUndefined(pluginOptions) && !_.isUndefined(pluginOptions.enabled)) { |
|
if (pluginOptions.enabled) { |
|
this.enablePlugin(plugin); |
|
} else { |
|
this.disablePlugin(plugin); |
|
} |
|
} else { |
|
this.enablePlugin(plugin); |
|
} |
|
|
|
}, this); |
|
} |
|
}; |
|
|
|
/** |
|
* Wrap a module in East Extender pattern |
|
* @param module |
|
* @param localName |
|
*/ |
|
EasyExtender.prototype.wrap = function (module, localName) { |
|
this.registerPlugin({ |
|
"plugin:name": localName, |
|
"plugin": function () { |
|
return module; |
|
} |
|
}); |
|
}; |
|
|
|
/** |
|
* @param {String} name |
|
* @returns {Function|Boolean} |
|
*/ |
|
EasyExtender.prototype.get = function (name) { |
|
|
|
if (!_.isUndefined(this.plugins[name])) { |
|
return this.plugins[name].plugin || false; |
|
} |
|
|
|
return false; |
|
}; |
|
|
|
/** |
|
* @param {Object} module |
|
* @param {Object} [opts] |
|
* @param {Function} [cb] |
|
*/ |
|
EasyExtender.prototype.registerPlugin = function (module, opts, cb) { |
|
|
|
var pluginOptions; |
|
|
|
if (!_.isFunction(module.plugin)) { |
|
return _.isFunction(cb) ? cb("Module must implement a .plugin() method") : false; |
|
} |
|
|
|
if (!cb && opts) { |
|
if (_.isFunction(opts)) { |
|
cb = opts; |
|
} else { |
|
pluginOptions = opts; |
|
} |
|
} |
|
|
|
var name = _.isUndefined(module["plugin:name"]) ? _.uniqueId() : module["plugin:name"]; |
|
|
|
this.pluginOptions[name] = pluginOptions; |
|
this.returnValues[name] = []; |
|
|
|
this.plugins[name] = module; |
|
|
|
if (_.isFunction(cb)) { |
|
cb(null); |
|
} |
|
|
|
this.disablePlugin(name); |
|
|
|
return this; |
|
}; |
|
|
|
/** |
|
* |
|
* @param name |
|
*/ |
|
EasyExtender.prototype.getPlugin = function (module) { |
|
|
|
if (_.isString(module)) { |
|
module = this.plugins[module]; |
|
} |
|
|
|
if (!module) { |
|
return false; |
|
} |
|
|
|
return module; |
|
}; |
|
|
|
/** |
|
* |
|
* @param name |
|
*/ |
|
EasyExtender.prototype.disablePlugin = function (module) { |
|
|
|
module = this.getPlugin(module); |
|
module._enabled = false; |
|
|
|
return module; |
|
}; |
|
|
|
/** |
|
* @param name |
|
*/ |
|
EasyExtender.prototype.enablePlugin = function (module) { |
|
|
|
module = this.getPlugin(module); |
|
module._enabled = true; |
|
|
|
return module; |
|
}; |
|
|
|
/** |
|
* @param name |
|
* @returns {*} |
|
*/ |
|
EasyExtender.prototype.hook = function (name) { |
|
|
|
// Get any extra args |
|
var args = Array.prototype.slice.call(arguments, 1); |
|
|
|
// build a list of hook funcs |
|
var funcs = []; |
|
|
|
_.each(this.plugins, function (plugin) { |
|
if (plugin.hooks) { |
|
if (!_.isUndefined(plugin.hooks[name])) { |
|
funcs.push(plugin.hooks[name]); |
|
} |
|
} |
|
}); |
|
|
|
return this.hooks[name].apply(this, [funcs].concat(args)); |
|
}; |
|
|
|
/** |
|
* @param name |
|
* @returns {*} |
|
*/ |
|
EasyExtender.prototype.getReturnValues = function (name) { |
|
return this.returnValues[name] || []; |
|
}; |
|
|
|
module.exports = EasyExtender; |