@paroicms/server
Version:
The ParoiCMS server
77 lines • 2.74 kB
JavaScript
import { isObj } from "@paroicms/public-anywhere-lib";
import { getPluginSlug } from "@paroicms/script-lib";
const importedPlugins = new Map();
export async function loadSitePlugins({ regSite, logger, pluginNames, pluginStaticConfigurations, }) {
const urlProvider = createAdminUiPluginUrlProvider(regSite.siteUrl);
const plugins = [];
for (const pluginName of pluginNames) {
const plugin = await getImportedPlugin(pluginName, logger);
if (!plugin)
continue;
const { adminUiPluginBaseUrl, slug } = urlProvider(plugin, pluginName);
plugins.push({
pluginName,
staticConfiguration: pluginStaticConfigurations.get(pluginName) ?? {
platform: false,
configuration: {},
},
plugin,
slug,
initData: {
adminUiPluginBaseUrl,
liquidFilters: [],
setLiquidTagHandlers: [],
outLiquidTagHandlers: [],
renderingHooks: [],
headTagsHandlers: [],
liquidRootDirectories: [],
siteSchemaLibraryDirectories: [],
hooks: [],
},
});
}
return plugins;
}
function createAdminUiPluginUrlProvider(siteUrl) {
const slugs = new Set();
return (_plugin, pluginName) => {
const slug = getPluginSlug(pluginName);
if (slugs.has(slug)) {
throw new Error(`Several plugins with the same slug "${slug}"`);
}
slugs.add(slug);
return {
adminUiPluginBaseUrl: `${siteUrl}/adm/plugins/${slug}`,
slug,
};
};
}
async function getImportedPlugin(pluginName, logger) {
if (importedPlugins.has(pluginName)) {
return importedPlugins.get(pluginName);
}
try {
const plugin = (await import(pluginName)).default;
checkPluginFormat(plugin);
importedPlugins.set(pluginName, plugin);
return plugin;
}
catch (error) {
logger.error(`Invalid plugin "${pluginName}"`, error);
importedPlugins.set(pluginName, undefined);
}
}
function checkPluginFormat(plugin) {
if (!isObj(plugin))
throw new Error("should export a 'plugin' object");
if (!plugin.version || typeof plugin.version !== "string") {
throw new Error("'plugin.version' should be a string");
}
if ("slug" in plugin && typeof plugin.slug !== "string") {
throw new Error("'plugin.slug' should be a string");
}
if (plugin.siteInit && typeof plugin.siteInit !== "function") {
throw new Error("'plugin.siteInit' should be a function");
}
}
//# sourceMappingURL=plugin-loader.js.map