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;