summaryrefslogtreecommitdiffstats
path: root/lib/pluginslist.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pluginslist.js')
-rw-r--r--lib/pluginslist.js84
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;