UNPKG

@paroicms/server

Version:
77 lines 2.74 kB
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