UNPKG

studiocms

Version:

Astro Native CMS for AstroDB. Built from the ground up by the Astro community.

131 lines (130 loc) 3.51 kB
import { Context, Effect, Layer } from "../effect.js"; import { dashboardAPIEnabledRoutes, dashboardEnabledRoutes, error404Route, middleware, noDbSetupRoutes, oAuthEnabledRoutes, restRoutes, setupRoutes, usernameAndPasswordAPIRoutes, userRegistrationEnabledRoutes } from "./routes.js"; class StudioCMSRouteConfig extends Context.Tag("StudioCMSRouteConfig")() { static Live = (config) => Layer.succeed(this, config); } const processedConfig = Effect.fn( ({ dbStartPage, shouldInject404Route, dashboardEnabled, developerConfig, oAuthProvidersConfigured, authConfig: { enabled: authEnabled, providers: { usernameAndPassword, usernameAndPasswordConfig: { allowUserRegistration } } } }) => Effect.succeed({ dbStartPage, shouldInject404Route: shouldInject404Route && !dbStartPage, restAPIEnabled: !dbStartPage && authEnabled && !developerConfig.demoMode, dashboardEnabled: dashboardEnabled && !dbStartPage, dashboardAPIEnabled: dashboardEnabled && !dbStartPage && authEnabled, usernameAndPasswordAPI: authEnabled && usernameAndPassword, userRegistrationEnabled: authEnabled && usernameAndPassword && allowUserRegistration, oAuthEnabled: authEnabled && oAuthProvidersConfigured }) ); const setPrerenderFalse = (items) => { const routes = Array.isArray(items) ? items : [items]; return routes.map((item) => ({ ...item, prerender: false })); }; const mapProcessedConfig = Effect.fn( ({ dashboardAPIEnabled, dashboardEnabled, dbStartPage, oAuthEnabled, restAPIEnabled, shouldInject404Route, userRegistrationEnabled, usernameAndPasswordAPI, dashboardRoute }) => Effect.succeed([ { enabled: dbStartPage, routes: setPrerenderFalse(setupRoutes) }, { enabled: !dbStartPage, routes: setPrerenderFalse(noDbSetupRoutes) }, { enabled: shouldInject404Route, routes: setPrerenderFalse(error404Route) }, { enabled: restAPIEnabled, routes: setPrerenderFalse(restRoutes) }, { enabled: oAuthEnabled, routes: setPrerenderFalse(oAuthEnabledRoutes) }, { enabled: usernameAndPasswordAPI, routes: setPrerenderFalse(usernameAndPasswordAPIRoutes) }, { enabled: userRegistrationEnabled, routes: setPrerenderFalse(userRegistrationEnabledRoutes(dashboardRoute)) }, { enabled: dashboardEnabled, routes: setPrerenderFalse(dashboardEnabledRoutes(dashboardRoute)) }, { enabled: dashboardAPIEnabled, routes: setPrerenderFalse(dashboardAPIEnabledRoutes(dashboardRoute)) } ]) ); const flatMapProcessedConfig = (config) => Effect.fn( (processed) => mapProcessedConfig({ ...processed, dashboardRoute: config.dashboardRoute }) ); const mapRouteGroups = Effect.fn( (routeGroups) => Effect.succeed( routeGroups.reduce((acc, { enabled, routes }) => { if (enabled) { acc.push(...routes); } return acc; }, []) ) ); const injectExtraRoutes = (config) => Effect.fn( (routes) => Effect.succeed([...routes, ...config.extraRoutes]) ); const injectMiddleware = ({ dbStartPage }) => Effect.fn( (routes) => Effect.succeed({ routes, middleware: middleware(dbStartPage) }) ); export { StudioCMSRouteConfig, flatMapProcessedConfig, injectExtraRoutes, injectMiddleware, mapProcessedConfig, mapRouteGroups, processedConfig, setPrerenderFalse };