summaryrefslogtreecommitdiffstats
path: root/lib/plugins/loadForBook.js
diff options
context:
space:
mode:
authorSamy Pesse <samypesse@gmail.com>2016-06-10 22:08:16 +0200
committerSamy Pesse <samypesse@gmail.com>2016-06-10 22:08:16 +0200
commit1e3d871c1e288b58dc486053cc7fa0f274c4cf31 (patch)
tree5f221cb283e5f4591a3764112569ee62220e6da2 /lib/plugins/loadForBook.js
parent50a132cb2c0b0666b3b067e32d37e10bfb9e50da (diff)
parent94a4310c1e4b9ee71def9cbd9efd8a4c491f4444 (diff)
downloadgitbook-1e3d871c1e288b58dc486053cc7fa0f274c4cf31.zip
gitbook-1e3d871c1e288b58dc486053cc7fa0f274c4cf31.tar.gz
gitbook-1e3d871c1e288b58dc486053cc7fa0f274c4cf31.tar.bz2
Merge branch 'fix/plugins_loading'
Diffstat (limited to 'lib/plugins/loadForBook.js')
-rw-r--r--lib/plugins/loadForBook.js68
1 files changed, 45 insertions, 23 deletions
diff --git a/lib/plugins/loadForBook.js b/lib/plugins/loadForBook.js
index 96a0cb5..757677e 100644
--- a/lib/plugins/loadForBook.js
+++ b/lib/plugins/loadForBook.js
@@ -1,47 +1,69 @@
-var Promise = require('../utils/promise');
+var Immutable = require('immutable');
-var listForBook = require('./listForBook');
+var Promise = require('../utils/promise');
+var listDepsForBook = require('./listDepsForBook');
var findForBook = require('./findForBook');
var loadPlugin = require('./loadPlugin');
/**
- * Load a list of plugins in a book
+ * Load all plugins in a book
+ *
* @param {Book}
* @return {Promise<Map<String:Plugin>}
*/
function loadForBook(book) {
var logger = book.getLogger();
- var requirements = listForBook(book);
- var requirementsKeys = requirements.keySeq().toList();
+ // List the dependencies
+ var requirements = listDepsForBook(book);
+
+ // List all plugins installed in the book
return findForBook(book)
- .then(function(installed) {
- // Filter out plugins not listed of first level
- // (aka pre-installed plugins)
- installed = installed.filter(function(plugin) {
- return (
- plugin.getDepth() > 0 ||
- requirements.has(plugin.getName())
- );
- });
+ .then(function(installedMap) {
+ var missing = [];
+ var plugins = requirements.reduce(function(result, dep) {
+ var name = dep.getName();
+ var installed = installedMap.get(name);
+
+ if (installed) {
+ var deps = installedMap
+ .filter(function(plugin) {
+ return plugin.getParent() === name;
+ })
+ .toArray();
+
+ result = result.concat(deps);
+ result.push(installed);
+ } else {
+ missing.push(name);
+ }
+
+ return result;
+ }, []);
+
+ // Convert plugins list to a map
+ plugins = Immutable.List(plugins)
+ .map(function(plugin) {
+ return [
+ plugin.getName(),
+ plugin
+ ];
+ });
+ plugins = Immutable.OrderedMap(plugins);
// Log state
- logger.info.ln(installed.size + ' plugins are installed');
- if (requirements.size != installed.size) {
+ logger.info.ln(installedMap.size + ' plugins are installed');
+ if (requirements.size != installedMap.size) {
logger.info.ln(requirements.size + ' explicitly listed');
}
// Verify that all plugins are present
- var notInstalled = requirementsKeys.filter(function(name) {
- return !installed.has(name);
- });
-
- if (notInstalled.size > 0) {
- throw new Error('Couldn\'t locate plugins "' + notInstalled.join(', ') + '", Run \'gitbook install\' to install plugins from registry.');
+ if (missing.length > 0) {
+ throw new Error('Couldn\'t locate plugins "' + missing.join(', ') + '", Run \'gitbook install\' to install plugins from registry.');
}
- return Promise.map(installed, function(plugin) {
+ return Promise.map(plugins, function(plugin) {
return loadPlugin(book, plugin);
});
});