studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
365 lines (364 loc) • 11.6 kB
JavaScript
import { Effect } from "../effect.js";
import {
flatMapProcessedConfig,
injectExtraRoutes,
injectMiddleware,
mapRouteGroups,
processedConfig,
StudioCMSRouteConfig
} from "./utils.js";
export * from "./types.js";
export * from "./utils.js";
const resolvePath = (path) => `studiocms/frontend/${path}`;
const setupRoutes = [
// Frontend setup pages
{
pattern: "/",
entrypoint: resolvePath("setup-pages/index.astro")
},
{
pattern: "/start",
entrypoint: resolvePath("setup-pages/1-start.astro")
},
{
pattern: "/start/1",
entrypoint: resolvePath("setup-pages/1-start.astro")
},
{
pattern: "/start/2",
entrypoint: resolvePath("setup-pages/2-next.astro")
},
{
pattern: "/done",
entrypoint: resolvePath("setup-pages/3-done.astro")
},
// Backend setup API routes
{
pattern: "/studiocms_api/dashboard/step-1",
entrypoint: resolvePath("setup-pages/studiocms_api/dashboard/step-1.ts")
},
{
pattern: "/studiocms_api/dashboard/step-2",
entrypoint: resolvePath("setup-pages/studiocms_api/dashboard/step-2.ts")
}
];
const noDbSetupRoutes = [
// SDK API routes
{
pattern: "/studiocms_api/sdk/list-pages",
entrypoint: resolvePath("pages/studiocms_api/sdk/list-pages.ts")
},
{
pattern: "/studiocms_api/sdk/update-latest-version-cache",
entrypoint: resolvePath("pages/studiocms_api/sdk/update-latest-version-cache.ts")
},
{
pattern: "/studiocms_api/sdk/fallback-list-pages.json",
entrypoint: resolvePath("pages/studiocms_api/sdk/fallback-list-pages.json.ts")
},
{
pattern: "/studiocms_api/sdk/full-changelog.json",
entrypoint: resolvePath("pages/studiocms_api/sdk/full-changelog.json.ts")
},
// Renderer service route
{
pattern: "/studiocms_api/renderer/render",
entrypoint: resolvePath("pages/studiocms_api/renderer/render.astro")
}
];
const restRoutes = [
{
pattern: "/studiocms_api/rest/v1/folders",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/folders/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/folders/[id]",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/folders/[id].ts")
},
{
pattern: "/studiocms_api/rest/v1/pages",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/pages/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/pages/[id]",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/pages/[id]/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/pages/[id]/history",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/pages/[id]/history/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/pages/[id]/history/[diffid]",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/pages/[id]/history/[diffid].ts")
},
{
pattern: "/studiocms_api/rest/v1/settings",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/settings/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/users",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/users/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/users/[id]",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/users/[id].ts")
},
{
pattern: "/studiocms_api/rest/v1/public/pages",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/public/pages/index.ts")
},
{
pattern: "/studiocms_api/rest/v1/public/pages/[id]",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/public/pages/[id].ts")
},
{
pattern: "/studiocms_api/rest/v1/public/folders",
entrypoint: resolvePath("pages/studiocms_api/rest/v1/public/folders/index.ts")
}
];
const oAuthEnabledRoutes = [
{
pattern: "/studiocms_api/auth/[provider]",
entrypoint: resolvePath("pages/studiocms_api/auth/[provider]/index.ts")
},
{
pattern: "/studiocms_api/auth/[provider]/callback",
entrypoint: resolvePath("pages/studiocms_api/auth/[provider]/callback.ts")
}
];
const usernameAndPasswordAPIRoutes = [
{
pattern: "/studiocms_api/auth/login",
entrypoint: resolvePath("pages/studiocms_api/auth/login.ts")
},
{
pattern: "/studiocms_api/auth/forgot-password",
entrypoint: resolvePath("pages/studiocms_api/auth/forgot-password.ts")
}
];
const userRegistrationEnabledRoutes = (dashboardRoute) => [
{
pattern: "/studiocms_api/auth/register",
entrypoint: resolvePath("pages/studiocms_api/auth/register.ts")
},
{
pattern: dashboardRoute("signup/"),
entrypoint: resolvePath("pages/[dashboard]/signup.astro")
}
];
const dashboardEnabledRoutes = (dashboardRoute) => [
// Dashboard API Routes
{
pattern: "/studiocms_api/dashboard/templates",
entrypoint: resolvePath("pages/studiocms_api/dashboard/templates.ts")
},
{
pattern: "/studiocms_api/dashboard/live-render",
entrypoint: resolvePath("pages/studiocms_api/dashboard/partials/LiveRender.astro")
},
{
pattern: "/studiocms_api/dashboard/editor",
entrypoint: resolvePath("pages/studiocms_api/dashboard/partials/Editor.astro")
},
{
pattern: "/studiocms_api/dashboard/search-list",
entrypoint: resolvePath("pages/studiocms_api/dashboard/search-list.ts")
},
{
pattern: "/studiocms_api/dashboard/user-list-items",
entrypoint: resolvePath("pages/studiocms_api/dashboard/partials/UserListItems.astro")
},
{
pattern: "/studiocms_api/auth/logout",
entrypoint: resolvePath("pages/studiocms_api/auth/logout.ts")
},
// Dashboard Frontend Route
{
pattern: dashboardRoute("/"),
entrypoint: resolvePath("pages/[dashboard]/index.astro")
},
{
pattern: dashboardRoute("content-management"),
entrypoint: resolvePath("pages/[dashboard]/content-management/index.astro")
},
{
pattern: dashboardRoute("content-management/create"),
entrypoint: resolvePath("pages/[dashboard]/content-management/createpage.astro")
},
{
pattern: dashboardRoute("content-management/create-folder"),
entrypoint: resolvePath("pages/[dashboard]/content-management/createfolder.astro")
},
{
pattern: dashboardRoute("content-management/edit"),
entrypoint: resolvePath("pages/[dashboard]/content-management/editpage.astro")
},
{
pattern: dashboardRoute("content-management/edit-folder"),
entrypoint: resolvePath("pages/[dashboard]/content-management/editfolder.astro")
},
{
pattern: dashboardRoute("content-management/diff"),
entrypoint: resolvePath("pages/[dashboard]/content-management/diff.astro")
},
{
pattern: dashboardRoute("profile"),
entrypoint: resolvePath("pages/[dashboard]/profile.astro")
},
{
pattern: dashboardRoute("configuration"),
entrypoint: resolvePath("pages/[dashboard]/configuration.astro")
},
{
pattern: dashboardRoute("user-management"),
entrypoint: resolvePath("pages/[dashboard]/user-management/index.astro")
},
{
pattern: dashboardRoute("user-management/edit"),
entrypoint: resolvePath("pages/[dashboard]/user-management/edit.astro")
},
{
pattern: dashboardRoute("plugins/[plugin]"),
entrypoint: resolvePath("pages/[dashboard]/plugins/[plugin].astro")
},
{
pattern: dashboardRoute("smtp-configuration"),
entrypoint: resolvePath("pages/[dashboard]/smtp-configuration.astro")
},
{
pattern: dashboardRoute("unverified-email"),
entrypoint: resolvePath("pages/[dashboard]/unverified-email.astro")
},
{
pattern: dashboardRoute("login/"),
entrypoint: resolvePath("pages/[dashboard]/login.astro")
},
{
pattern: dashboardRoute("logout/"),
entrypoint: resolvePath("pages/[dashboard]/logout.astro")
}
];
const dashboardAPIEnabledRoutes = (dashboardRoute) => [
// Dashboard page routes
{
pattern: dashboardRoute("password-reset"),
entrypoint: resolvePath("pages/[dashboard]/password-reset.astro")
},
// API Routes
{
pattern: "/studiocms_api/dashboard/config",
entrypoint: resolvePath("pages/studiocms_api/dashboard/config.ts")
},
{
pattern: "/studiocms_api/dashboard/profile",
entrypoint: resolvePath("pages/studiocms_api/dashboard/profile.ts")
},
{
pattern: "/studiocms_api/dashboard/users",
entrypoint: resolvePath("pages/studiocms_api/dashboard/users.ts")
},
{
pattern: "/studiocms_api/dashboard/content/page",
entrypoint: resolvePath("pages/studiocms_api/dashboard/content/page.ts")
},
{
pattern: "/studiocms_api/dashboard/content/folder",
entrypoint: resolvePath("pages/studiocms_api/dashboard/content/folder.ts")
},
{
pattern: "/studiocms_api/dashboard/content/diff",
entrypoint: resolvePath("pages/studiocms_api/dashboard/content/diff.ts")
},
{
pattern: "/studiocms_api/dashboard/create-reset-link",
entrypoint: resolvePath("pages/studiocms_api/dashboard/create-reset-link.ts")
},
{
pattern: "/studiocms_api/dashboard/reset-password",
entrypoint: resolvePath("pages/studiocms_api/dashboard/reset-password.ts")
},
{
pattern: "/studiocms_api/dashboard/plugins/[plugin]",
entrypoint: resolvePath("pages/studiocms_api/dashboard/plugins/[plugin].ts")
},
{
pattern: "/studiocms_api/dashboard/create-user",
entrypoint: resolvePath("pages/studiocms_api/dashboard/create-user.ts")
},
{
pattern: "/studiocms_api/dashboard/create-user-invite",
entrypoint: resolvePath("pages/studiocms_api/dashboard/create-user-invite.ts")
},
{
pattern: "/studiocms_api/dashboard/api-tokens",
entrypoint: resolvePath("pages/studiocms_api/dashboard/api-tokens.ts")
},
{
pattern: "/studiocms_api/dashboard/verify-session",
entrypoint: resolvePath("pages/studiocms_api/dashboard/verify-session.ts")
},
{
pattern: "/studiocms_api/dashboard/mailer/config",
entrypoint: resolvePath("pages/studiocms_api/dashboard/mailer/config.ts")
},
{
pattern: "/studiocms_api/dashboard/mailer/test-email",
entrypoint: resolvePath("pages/studiocms_api/dashboard/mailer/check-email.ts")
},
{
pattern: "/studiocms_api/dashboard/verify-email",
entrypoint: resolvePath("pages/studiocms_api/dashboard/verify-email.ts")
},
{
pattern: "/studiocms_api/dashboard/email-notification-settings-site",
entrypoint: resolvePath("pages/studiocms_api/dashboard/email-notification-settings-site.ts")
},
{
pattern: "/studiocms_api/dashboard/resend-verify-email",
entrypoint: resolvePath("pages/studiocms_api/dashboard/resend-verify-email.ts")
},
{
pattern: "/studiocms_api/dashboard/update-user-notifications",
entrypoint: resolvePath("pages/studiocms_api/dashboard/update-user-notifications.ts")
}
];
const error404Route = {
pattern: "/404",
entrypoint: resolvePath("pages/404.astro")
};
const middleware = (dbStartPage) => {
const middlewares = [];
if (!dbStartPage) {
middlewares.push({
order: "pre",
entrypoint: resolvePath("middleware/index.ts")
});
}
return middlewares;
};
const getAstroProject = Effect.gen(function* () {
const config = yield* StudioCMSRouteConfig;
return yield* processedConfig(config).pipe(
// Map processed config to route groups
Effect.flatMap(flatMapProcessedConfig(config)),
// Map route groups to final routes
Effect.flatMap(mapRouteGroups),
// Inject extra routes from config
Effect.flatMap(injectExtraRoutes(config)),
// Inject middleware based on config
Effect.flatMap(injectMiddleware(config))
);
});
export {
dashboardAPIEnabledRoutes,
dashboardEnabledRoutes,
error404Route,
getAstroProject,
middleware,
noDbSetupRoutes,
oAuthEnabledRoutes,
restRoutes,
setupRoutes,
userRegistrationEnabledRoutes,
usernameAndPasswordAPIRoutes
};