diff options
Diffstat (limited to 'packages/integrations/cloudflare/src')
-rw-r--r-- | packages/integrations/cloudflare/src/entrypoints/server.ts | 5 | ||||
-rw-r--r-- | packages/integrations/cloudflare/src/index.ts | 13 | ||||
-rw-r--r-- | packages/integrations/cloudflare/src/utils/env.ts | 15 |
3 files changed, 33 insertions, 0 deletions
diff --git a/packages/integrations/cloudflare/src/entrypoints/server.ts b/packages/integrations/cloudflare/src/entrypoints/server.ts index af4106b4e..e17dd6a25 100644 --- a/packages/integrations/cloudflare/src/entrypoints/server.ts +++ b/packages/integrations/cloudflare/src/entrypoints/server.ts @@ -5,8 +5,10 @@ import type { } from '@cloudflare/workers-types'; import type { SSRManifest } from 'astro'; import { App } from 'astro/app'; +import { createGetEnv } from '../utils/env.js'; type Env = { + [key: string]: unknown; ASSETS: { fetch: (req: Request | string) => Promise<Response> }; ASTRO_STUDIO_APP_TOKEN?: string; }; @@ -69,6 +71,9 @@ export function createExports(manifest: SSRManifest) { }, }, }; + // Won't throw if the virtual module is not available because it's not supported in + // the users's astro version or if astro:env is not enabled in the project + await import('astro/env/setup').then((mod) => mod.setGetEnv(createGetEnv(env))).catch(() => {}); const response = await app.render(request, { routeData, locals }); diff --git a/packages/integrations/cloudflare/src/index.ts b/packages/integrations/cloudflare/src/index.ts index a0f3d8ba1..6ded561dd 100644 --- a/packages/integrations/cloudflare/src/index.ts +++ b/packages/integrations/cloudflare/src/index.ts @@ -19,6 +19,7 @@ import { type CloudflareModulePluginExtra, cloudflareModuleLoader, } from './utils/cloudflare-module-loader.js'; +import { createGetEnv } from './utils/env.js'; import { createRoutesFile, getParts } from './utils/generate-routes-json.js'; import { setImageConfig } from './utils/image-config.js'; import { mutateDynamicPageImportsInPlace, mutatePageMapInPlace } from './utils/index.js'; @@ -191,6 +192,7 @@ export default function createIntegration(args?: Options): AstroIntegration { isSharpCompatible: false, isSquooshCompatible: false, }, + envGetSecret: 'experimental', }, }); }, @@ -202,6 +204,17 @@ export default function createIntegration(args?: Options): AstroIntegration { persist: args.platformProxy.persist ?? true, }); + const getEnv = createGetEnv(platformProxy.env); + + if (_config.experimental.env?.schema) { + for (const key of Object.keys(_config.experimental.env.schema)) { + const value = getEnv(key); + if (value !== undefined) { + process.env[key] = value; + } + } + } + const clientLocalsSymbol = Symbol.for('astro.locals'); server.middlewares.use(async function middleware(req, res, next) { diff --git a/packages/integrations/cloudflare/src/utils/env.ts b/packages/integrations/cloudflare/src/utils/env.ts new file mode 100644 index 000000000..e450038eb --- /dev/null +++ b/packages/integrations/cloudflare/src/utils/env.ts @@ -0,0 +1,15 @@ +import type { GetEnv } from 'astro/env/setup'; + +export const createGetEnv = + (env: Record<string, unknown>): GetEnv => + (key) => { + const v = env[key]; + if (typeof v === 'undefined' || typeof v === 'string') { + return v; + } + if (typeof v === 'boolean' || typeof v === 'number') { + // let astro:env handle the validation and transformation + return v.toString(); + } + return undefined; + }; |