92 lines
2.7 KiB
JavaScript
92 lines
2.7 KiB
JavaScript
|
var path = require("path");
|
||
|
/**
|
||
|
* Node Plugin Loader
|
||
|
*/
|
||
|
var PluginLoader = function(less) {
|
||
|
this.less = less;
|
||
|
};
|
||
|
PluginLoader.prototype.tryLoadPlugin = function(name, argument) {
|
||
|
var plugin = this.tryRequirePlugin(name);
|
||
|
if (plugin) {
|
||
|
// support plugins being a function
|
||
|
// so that the plugin can be more usable programmatically
|
||
|
if (typeof plugin === "function") {
|
||
|
plugin = new plugin();
|
||
|
}
|
||
|
if (plugin.minVersion) {
|
||
|
if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {
|
||
|
console.log("plugin " + name + " requires version " + this.versionToString(plugin.minVersion));
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
if (argument) {
|
||
|
if (!plugin.setOptions) {
|
||
|
console.log("options have been provided but the plugin " + name + "does not support any options");
|
||
|
return null;
|
||
|
}
|
||
|
try {
|
||
|
plugin.setOptions(argument);
|
||
|
}
|
||
|
catch(e) {
|
||
|
console.log("Error setting options on plugin " + name);
|
||
|
console.log(e.message);
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
return plugin;
|
||
|
}
|
||
|
return null;
|
||
|
};
|
||
|
PluginLoader.prototype.compareVersion = function(aVersion, bVersion) {
|
||
|
for (var i = 0; i < aVersion.length; i++) {
|
||
|
if (aVersion[i] !== bVersion[i]) {
|
||
|
return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
};
|
||
|
PluginLoader.prototype.versionToString = function(version) {
|
||
|
var versionString = "";
|
||
|
for (var i = 0; i < version.length; i++) {
|
||
|
versionString += (versionString ? "." : "") + version[i];
|
||
|
}
|
||
|
return versionString;
|
||
|
};
|
||
|
PluginLoader.prototype.tryRequirePlugin = function(name) {
|
||
|
// is at the same level as the less.js module
|
||
|
try {
|
||
|
return require("../../../" + name);
|
||
|
}
|
||
|
catch(e) {
|
||
|
}
|
||
|
// is installed as a sub dependency of the current folder
|
||
|
try {
|
||
|
return require(path.join(process.cwd(), "node_modules", name));
|
||
|
}
|
||
|
catch(e) {
|
||
|
}
|
||
|
// is referenced relative to the current directory
|
||
|
try {
|
||
|
return require(path.join(process.cwd(), name));
|
||
|
}
|
||
|
catch(e) {
|
||
|
}
|
||
|
// unlikely - would have to be a dependency of where this code was running (less.js)...
|
||
|
if (name[0] !== '.') {
|
||
|
try {
|
||
|
return require(name);
|
||
|
}
|
||
|
catch(e) {
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
PluginLoader.prototype.printUsage = function(plugins) {
|
||
|
for (var i = 0; i < plugins.length; i++) {
|
||
|
var plugin = plugins[i];
|
||
|
if (plugin.printUsage) {
|
||
|
plugin.printUsage();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
module.exports = PluginLoader;
|