diff options
Diffstat (limited to 'lib/pluginslist.js')
-rw-r--r-- | lib/pluginslist.js | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/pluginslist.js b/lib/pluginslist.js index 10e21ac..b4b601e 100644 --- a/lib/pluginslist.js +++ b/lib/pluginslist.js @@ -1,7 +1,16 @@ var _ = require("lodash"); var Q = require("q"); +var npmi = require('npmi'); +var npm = require('npm'); +var semver = require('semver'); var Plugin = require("./plugin"); +var pkg = require("../package.json"); + +var initNPM = _.memoize(function() { + return Q.nfcall(npm.load, { silent: true, loglevel: 'silent' }); +}); + var PluginsList = function(book, plugins) { this.book = book; @@ -138,4 +147,79 @@ PluginsList.prototype.resources = function(namespace) { return this.namespaces[namespace].resources; }; +// Install plugins from a book +PluginsList.prototype.install = function() { + var that = this; + var defaultsPlugins = _.pluck(that.book.options.defaultsPlugins) + + // Remove defaults (no need to install) + var plugins = _.filter(that.book.options.plugins, function(plugin) { + return !_.contains(defaultsPlugins, plugin.name); + }); + + // Install plugins one by one + that.book.log.info.ln(plugins.length+" plugins to install"); + return _.reduce(plugins, function(prev, plugin) { + return prev.then(function() { + var fullname = "gitbook-plugin-"+plugin.name; + + return Q() + + // Resolve version if needed + .then(function() { + if (plugin.version) return plugin.version; + + that.book.log.info.ln("No version specified, resolve plugin", plugin.name); + return initNPM() + .then(function() { + return Q.nfcall(npm.commands.view, [fullname+"@>=0.0.0", "engines"], true); + }) + .then(function(versions) { + return _.chain(versions) + .pairs() + .map(function(v) { + return { + version: v[0], + gitbook: (v[1].engines || {})["gitbook"] + } + }) + .filter(function(v) { + return v.gitbook && semver.satisfies(pkg.version, v.gitbook); + }) + .sort(function(v1, v2) { + return semver.lt(v1.version, v2.version)? 1 : -1; + }) + .pluck("version") + .first() + .value(); + }); + }) + + // Install the plugin with the resolved version + .then(function(version) { + if (!version) { + throw "Found no satisfactory version for plugin "+plugin.name; + } + + that.book.log.info.ln("install plugin", plugin.name, "from npm ("+fullname+") with version", version); + return Q.nfcall(npmi, { + 'name': fullname, + 'version': version, + 'path': that.book.root, + 'npmLoad': { + 'loglevel': 'silent', + 'loaded': true, + 'prefix': that.book.root + } + }); + }) + .then(function() { + that.book.log.info.ok("plugin", plugin.name, "installed with success"); + }); + }); + }, Q()); +}; + + + module.exports = PluginsList; |