101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
// @ts-check
|
|
import cloudflare from "@astrojs/cloudflare";
|
|
import react from "@astrojs/react";
|
|
import {
|
|
d1,
|
|
r2,
|
|
access,
|
|
sandbox,
|
|
cloudflareCache,
|
|
cloudflareImages,
|
|
cloudflareStream,
|
|
} from "@emdash-cms/cloudflare";
|
|
import { formsPlugin } from "@emdash-cms/plugin-forms";
|
|
import { webhookNotifierPlugin } from "@emdash-cms/plugin-webhook-notifier";
|
|
import { defineConfig } from "astro/config";
|
|
import emdash from "emdash/astro";
|
|
|
|
export default defineConfig({
|
|
output: "server",
|
|
adapter: cloudflare({
|
|
imageService: "cloudflare",
|
|
}),
|
|
i18n: {
|
|
defaultLocale: "en",
|
|
locales: ["en", "fr", "es"],
|
|
fallback: {
|
|
fr: "en",
|
|
es: "en",
|
|
},
|
|
},
|
|
image: {
|
|
// Enable responsive images globally
|
|
layout: "constrained",
|
|
responsiveStyles: true,
|
|
},
|
|
integrations: [
|
|
react(),
|
|
emdash({
|
|
// D1 database - binding name must match wrangler.jsonc
|
|
// session: "auto" enables read replicas (nearest replica for anon,
|
|
// bookmark-based consistency for authenticated users)
|
|
database: d1({ binding: "DB", session: "auto" }),
|
|
// R2 storage for media
|
|
storage: r2({ binding: "MEDIA" }),
|
|
// Cloudflare Access authentication
|
|
// Reads CF_ACCESS_AUDIENCE from env (wrangler secret or .dev.vars)
|
|
auth: access({
|
|
teamDomain: "cloudflare-cto.cloudflareaccess.com",
|
|
autoProvision: true,
|
|
defaultRole: 30, // Author
|
|
// Map your IdP groups to roles (optional)
|
|
// roleMapping: {
|
|
// "Admins": 50,
|
|
// "Editors": 40,
|
|
// },
|
|
}),
|
|
// Media providers - Cloudflare Images and Stream
|
|
// Reads from env vars at runtime: CF_ACCOUNT_ID, CF_IMAGES_TOKEN, CF_STREAM_TOKEN
|
|
// Or customize with accountIdEnvVar/apiTokenEnvVar options
|
|
mediaProviders: [
|
|
cloudflareImages({
|
|
accountIdEnvVar: "CF_MEDIA_ACCOUNT_ID",
|
|
apiTokenEnvVar: "CF_MEDIA_API_TOKEN",
|
|
accountHash: "5LGXGUnHU18h6ehN_xjpXQ",
|
|
}),
|
|
cloudflareStream({
|
|
accountIdEnvVar: "CF_MEDIA_ACCOUNT_ID",
|
|
apiTokenEnvVar: "CF_MEDIA_API_TOKEN",
|
|
}),
|
|
],
|
|
// Trusted plugins (run in host worker)
|
|
plugins: [
|
|
// Test plugin that exercises all v2 APIs
|
|
formsPlugin(),
|
|
],
|
|
// Sandboxed plugins (run in isolated workers)
|
|
sandboxed: [webhookNotifierPlugin()],
|
|
// Sandbox runner for Cloudflare
|
|
sandboxRunner: sandbox(),
|
|
// Plugin marketplace
|
|
marketplace: "https://marketplace.emdashcms.com",
|
|
}),
|
|
],
|
|
experimental: {
|
|
cache: {
|
|
provider: cloudflareCache(),
|
|
},
|
|
routeRules: {
|
|
"/": {
|
|
maxAge: 3_600,
|
|
swr: 864_000,
|
|
},
|
|
"/[...slug]": {
|
|
maxAge: 3_600,
|
|
swr: 864_000,
|
|
},
|
|
},
|
|
},
|
|
devToolbar: { enabled: false },
|
|
});
|