aboutsummaryrefslogtreecommitdiff
path: root/packages/integrations/cloudflare/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/cloudflare/src')
-rw-r--r--packages/integrations/cloudflare/src/entrypoints/server.ts5
-rw-r--r--packages/integrations/cloudflare/src/index.ts13
-rw-r--r--packages/integrations/cloudflare/src/utils/env.ts15
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;
+ };