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