Ghost/core/server/plugins/index.js

92 lines
3.6 KiB
JavaScript

var _ = require('underscore'),
when = require('when'),
errors = require('../errorHandling'),
api = require('../api'),
loader = require('./loader'),
// Holds the available plugins
availablePlugins = {};
function getInstalledPlugins() {
return api.settings.read('installedPlugins').then(function (installed) {
installed.value = installed.value || '[]';
try {
installed = JSON.parse(installed.value);
} catch (e) {
return when.reject(e);
}
return installed;
});
}
function saveInstalledPlugins(installedPlugins) {
return getInstalledPlugins().then(function (currentInstalledPlugins) {
var updatedPluginsInstalled = _.uniq(installedPlugins.concat(currentInstalledPlugins));
return api.settings.edit('installedPlugins', updatedPluginsInstalled);
});
}
module.exports = {
init: function () {
var pluginsToLoad;
try {
// We have to parse the value because it's a string
api.settings.read('activePlugins').then(function (aPlugins) {
pluginsToLoad = JSON.parse(aPlugins.value) || [];
});
} catch (e) {
errors.logError(
'Failed to parse activePlugins setting value: ' + e.message,
'Your plugins will not be loaded.',
'Check your settings table for typos in the activePlugins value. It should look like: ["plugin-1", "plugin2"] (double quotes required).'
);
return when.resolve();
}
// Grab all installed plugins, install any not already installed that are in pluginsToLoad.
return getInstalledPlugins().then(function (installedPlugins) {
var loadedPlugins = {},
recordLoadedPlugin = function (name, loadedPlugin) {
// After loading the plugin, add it to our hash of loaded plugins
loadedPlugins[name] = loadedPlugin;
return when.resolve(loadedPlugin);
},
loadPromises = _.map(pluginsToLoad, function (plugin) {
// If already installed, just activate the plugin
if (_.contains(installedPlugins, plugin)) {
return loader.activatePluginByName(plugin).then(function (loadedPlugin) {
return recordLoadedPlugin(plugin, loadedPlugin);
});
}
// Install, then activate the plugin
return loader.installPluginByName(plugin).then(function () {
return loader.activatePluginByName(plugin);
}).then(function (loadedPlugin) {
return recordLoadedPlugin(plugin, loadedPlugin);
});
});
return when.all(loadPromises).then(function () {
// Save our installed plugins to settings
return saveInstalledPlugins(_.keys(loadedPlugins));
}).then(function () {
// Extend the loadedPlugins onto the available plugins
_.extend(availablePlugins, loadedPlugins);
}).otherwise(function (err) {
errors.logError(
err.message || err,
'The plugin will not be loaded',
'Check with the plugin creator, or read the plugin documentation for more details on plugin requirements'
);
});
});
},
availablePlugins: availablePlugins
};