Ghost/core/server/plugins/index.js
Jacob Gable 0238909281 Initial Plugin API Implementation
Implements basic functionality described in #227 for loading plugins
from a specific directory and having a specific workflow with an init()
method and a disable() method.
2013-08-05 11:15:17 -05:00

72 lines
2.6 KiB
JavaScript

var _ = require("underscore"),
when = require('when'),
ghostApi,
loader = require("./loader"),
GhostPlugin = require("./GhostPlugin");
function getInstalledPlugins() {
if (!ghostApi) {
ghostApi = require('../api');
}
return ghostApi.settings.read("installedPlugins").then(function (installed) {
installed = installed || "[]";
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 ghostApi.settings.edit("installedPlugins", updatedPluginsInstalled);
});
}
module.exports = {
GhostPlugin: GhostPlugin,
init: function (ghost, pluginsToLoad) {
// 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, ghost).then(function (loadedPlugin) {
return recordLoadedPlugin(plugin, loadedPlugin);
});
}
// Install, then activate the plugin
return loader.installPluginByName(plugin, ghost).then(function () {
return loader.activatePluginByName(plugin, ghost);
}).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 () {
// Return the hash of all loaded plugins
return when.resolve(loadedPlugins);
});
});
}
};