UNPKG

@oberoncms/core

Version:

OberonCMS is a cloud deployable CMS written in typescript based on the Puck visual editor

136 lines (128 loc) 4.08 kB
import { type OberonPlugin, type OberonPluginAdapter, type OberonPermissions, type PluginVersion, type OberonHandler, type OberonAdapter, } from "../lib/dtd" import { notImplemented } from "../lib/utils" import { getInitialData } from "./get-initial-data" type InititalisedPlugins = { adapter: OberonPluginAdapter handlers: Record<string, (adapter: OberonAdapter) => OberonHandler> versions: PluginVersion[] } export const baseAccumulator: InititalisedPlugins = { handlers: {}, versions: [], adapter: { prebuild: async () => {}, getCurrentUser: notImplemented("getCurrentUser"), hasPermission: ({ user, action, permission }) => { const permissions: OberonPermissions = { unauthenticated: { pages: "read", }, user: { site: "read", pages: "write", images: "write", }, } const role = user?.role || ("unauthenticated" as const) if (role === "admin") { return true } return ( permissions[role][action] === permission || permissions[role][action] === "write" ) }, signIn: notImplemented("signIn"), signOut: notImplemented("signOut"), // OberonSendAdapter sendVerificationRequest: notImplemented("sendVerificationRequest"), // OberonBaseAdapter addImage: notImplemented("addImage"), addPage: notImplemented("addPage"), addUser: notImplemented("addUser"), changeRole: notImplemented("changeRole"), deleteImage: notImplemented("deleteImage"), deletePage: notImplemented("deletePage"), deleteUser: notImplemented("deleteUser"), getAllImages: notImplemented("getAllImages"), getAllPages: notImplemented("getAllPages"), getAllUsers: notImplemented("getAllUsers"), getPageData: notImplemented("getPageData"), getSite: notImplemented("getSite"), updatePageData: notImplemented("updatePageData"), updateSite: notImplemented("updateSite"), // OberonAuthAdapter createSession: notImplemented("createSession"), createUser: notImplemented("createUser"), createVerificationToken: notImplemented("createVerificationToken"), deleteSession: notImplemented("deleteSession"), // deleteUser // duplicate getSessionAndUser: notImplemented("getSessionAndUser"), getUser: notImplemented("getUser"), getUserByAccount: notImplemented("getUserByAccount"), getUserByEmail: notImplemented("getUserByEmail"), linkAccount: notImplemented("linkAccount"), unlinkAccount: notImplemented("unlinkAccount"), useVerificationToken: notImplemented("useVerificationToken"), updateSession: notImplemented("updateSession"), updateUser: notImplemented("updateUser"), } satisfies OberonPluginAdapter, } export function initPlugins(plugins: OberonPlugin[] = []) { const oberon: InititalisedPlugins = plugins.reduce<InititalisedPlugins>( (accumulator, plugin) => { const { name, version, disabled, adapter, handlers = {}, } = plugin(accumulator.adapter) if (disabled) { return { ...accumulator, versions: [ ...accumulator.versions, { name, disabled, version: version || "" }, ], } } return { versions: [ ...accumulator.versions, { name, disabled, version: version || "" }, ], handlers: { ...accumulator.handlers, ...handlers, }, adapter: { ...accumulator.adapter, ...adapter, }, } satisfies InititalisedPlugins }, baseAccumulator, ) return { ...oberon, adapter: { ...oberon.adapter, prebuild: async () => { await oberon.adapter.prebuild() const allPages = await oberon.adapter.getAllPages() if (!allPages.length) { console.log("Initialising welcome page") await oberon.adapter.updatePageData(getInitialData()) } }, }, } satisfies InititalisedPlugins }