UNPKG

studiocms

Version:

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

181 lines (180 loc) 5.55 kB
import { icons as flatColorIcons } from "@iconify-json/flat-color-icons"; import { icons as simpleIcons } from "@iconify-json/simple-icons"; import { availablePermissionRanks } from "@withstudiocms/auth-kit/types"; import { stripIconify } from "./utils/stripIconify.js"; import { makeAPIRoute } from "./virtuals/lib/makeAPIRoute.js"; import { stripLeadingAndTrailingSlashes } from "./virtuals/lib/pathGenerators.js"; const CMSSiteConfigId = 1; const Next_SiteConfigId = "SCMS_SITE_CONFIG_1"; const CMSMailerConfigId = "1"; const Next_MailerConfigId = "SCMS_MAILER_CONFIG_1"; const CMSNotificationSettingsId = "1"; const Next_NotificationSettingsId = "SCMS_NOTIFICATION_SETTINGS_1"; const defaultCacheLifeTime = "5m"; const OneDay = 1e3 * 60 * 60 * 24; const versionCacheLifetime = OneDay * 7; const currentRESTAPIVersions = ["v1"]; const baseDir = (path) => `studiocms/src/${path}`; const baseRoutesDir = (path) => baseDir(`routes/${path}`); const baseMiddlewareDir = (path) => baseDir(`middleware/${path}`); const baseAPIRoutesDir = (path) => baseRoutesDir(`api/${path}`); const baseRestDir = (version) => (path) => baseRoutesDir(`api/rest/${version}/${path}`); const routesDir = { // Main Routes fts: (file) => baseRoutesDir(`firstTimeSetupRoutes/${file}`), dashRoute: (file) => baseRoutesDir(`dashboard/${file}`), errors: (file) => baseRoutesDir(`error-pages/${file}`), authPage: (file) => baseRoutesDir(`auth/${file}`), // API Routes dashApi: (file) => baseAPIRoutesDir(`dashboard/${file}`), authAPI: (file) => baseAPIRoutesDir(`auth/${file}`), api: (file) => baseAPIRoutesDir(file), sdk: (file) => baseAPIRoutesDir(`sdk/${file}`), mailer: (file) => baseAPIRoutesDir(`mailer/${file}`), // REST API Routes v1Rest: (file) => baseRestDir("v1")(file), // Middleware middleware: (file) => baseMiddlewareDir(file) }; const studioCMSSocials = { github: "https://github.com/withstudiocms/studiocms", githubLicense: "https://github.com/withstudiocms/studiocms/blob/main/packages/studiocms/LICENSE", githubContributors: "https://github.com/withstudiocms/studiocms/graphs/contributors", discord: "https://chat.studiocms.dev", changelog: "https://github.com/withstudiocms/studiocms/blob/main/packages/studiocms/CHANGELOG.md", releases: "https://github.com/withstudiocms/studiocms/releases", npm: "https://npm.im/studiocms" }; const GhostUserDefaults = { id: "_StudioCMS_Ghost_User_", name: "Ghost (deleted user)", username: "studiocms_ghost_user", avatar: "https://seccdn.libravatar.org/static/img/mm/80.png" }; const NotificationSettingsDefaults = { emailVerification: false, oAuthBypassVerification: false, requireEditorVerification: false, requireAdminVerification: false }; const dashboardAPIRoute = makeAPIRoute("dashboard"); const authAPIRoute = makeAPIRoute("auth"); const makeDashboardRoute = (route) => { const sanitized = route === "/" ? "" : stripLeadingAndTrailingSlashes(route ?? "dashboard"); return (path) => `${sanitized}/${path}`; }; const StudioCMSMarkdownDefaults = { flavor: "studiocms", autoLinkHeadings: false, callouts: false, discordSubtext: false }; const AstroConfigImageSettings = { remotePatterns: [ { protocol: "https" }, { protocol: "http" } ] }; const AstroConfigViteSettings = { build: { chunkSizeWarningLimit: 700 } }; const StudioCMSDefaultRobotsConfig = ({ config, sitemapEnabled, dashboardRoute }) => { let host = false; if (config.site) { try { const url = new URL(config.site); host = url.hostname; } catch { host = config.site.replace(/^https?:\/\/|:\d+$/g, "") || false; } } return { host, sitemap: sitemapEnabled, policy: [ { userAgent: ["*"], allow: ["/"], disallow: [dashboardRoute(""), "/studiocms_api/"] } ] }; }; const STUDIOCMS_EDITOR_CSRF_COOKIE_NAME = "studiocms-editor-csrf-token"; const STUDIOCMS_THEME_COLOR = "#a581f3"; const STUDIOCMS_CDN_URL = "https://cdn.studiocms.dev"; const FAVICON_ASSETS = { svg: `${STUDIOCMS_CDN_URL}/favicon.svg`, png: { light: `${STUDIOCMS_CDN_URL}/favicon-light.png`, dark: `${STUDIOCMS_CDN_URL}/favicon-dark.png` } }; const STUDIOCMS_UI_OPTS = { noInjectCSS: true, icons: { flatcoloricons: stripIconify({ src: flatColorIcons, icons: ["google"] }), simpleicons: stripIconify({ src: simpleIcons, icons: ["github", "discord", "auth0"] }) } }; function getUiOpts(userOpts) { const base = { ...STUDIOCMS_UI_OPTS }; const merged = { ...base, ...userOpts, icons: userOpts?.icons ? { ...base.icons, ...userOpts.icons } : base.icons }; return merged; } const LinkNewOAuthCookieName = "link-new-o-auth"; const AuthSessionCookieName = "auth_session"; const ValidRanks = new Set(availablePermissionRanks); export { AstroConfigImageSettings, AstroConfigViteSettings, AuthSessionCookieName, CMSMailerConfigId, CMSNotificationSettingsId, CMSSiteConfigId, FAVICON_ASSETS, GhostUserDefaults, LinkNewOAuthCookieName, Next_MailerConfigId, Next_NotificationSettingsId, Next_SiteConfigId, NotificationSettingsDefaults, STUDIOCMS_CDN_URL, STUDIOCMS_EDITOR_CSRF_COOKIE_NAME, STUDIOCMS_THEME_COLOR, STUDIOCMS_UI_OPTS, StudioCMSDefaultRobotsConfig, StudioCMSMarkdownDefaults, ValidRanks, authAPIRoute, currentRESTAPIVersions, dashboardAPIRoute, defaultCacheLifeTime, getUiOpts, makeDashboardRoute, routesDir, studioCMSSocials, versionCacheLifetime };