studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
131 lines (130 loc) • 3.51 kB
JavaScript
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
};