diff options
Diffstat (limited to 'packages/integrations/cloudflare/src')
-rw-r--r-- | packages/integrations/cloudflare/src/index.ts | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/packages/integrations/cloudflare/src/index.ts b/packages/integrations/cloudflare/src/index.ts index a0201008f..718b1efa8 100644 --- a/packages/integrations/cloudflare/src/index.ts +++ b/packages/integrations/cloudflare/src/index.ts @@ -12,6 +12,7 @@ export type { DirectoryRuntime } from './server.directory'; type Options = { mode: 'directory' | 'advanced'; + functionPerRoute?: boolean; }; interface BuildConfig { @@ -21,17 +22,47 @@ interface BuildConfig { split?: boolean; } -export function getAdapter(isModeDirectory: boolean): AstroAdapter { +export function getAdapter({ + isModeDirectory, + functionPerRoute, +}: { + isModeDirectory: boolean; + functionPerRoute: boolean; +}): AstroAdapter { return isModeDirectory ? { name: '@astrojs/cloudflare', serverEntrypoint: '@astrojs/cloudflare/server.directory.js', exports: ['onRequest', 'manifest'], + adapterFeatures: { + functionPerRoute, + edgeMiddleware: false, + }, + supportedAstroFeatures: { + hybridOutput: 'stable', + staticOutput: 'unsupported', + serverOutput: 'stable', + assets: { + supportKind: 'stable', + isSharpCompatible: false, + isSquooshCompatible: false, + }, + }, } : { name: '@astrojs/cloudflare', serverEntrypoint: '@astrojs/cloudflare/server.advanced.js', exports: ['default'], + supportedAstroFeatures: { + hybridOutput: 'stable', + staticOutput: 'unsupported', + serverOutput: 'stable', + assets: { + supportKind: 'stable', + isSharpCompatible: false, + isSquooshCompatible: false, + }, + }, }; } @@ -50,9 +81,11 @@ const potentialFunctionRouteTypes = ['endpoint', 'page']; export default function createIntegration(args?: Options): AstroIntegration { let _config: AstroConfig; let _buildConfig: BuildConfig; - const isModeDirectory = args?.mode === 'directory'; let _entryPoints = new Map<RouteData, URL>(); + const isModeDirectory = args?.mode === 'directory'; + const functionPerRoute = args?.functionPerRoute ?? false; + return { name: '@astrojs/cloudflare', hooks: { @@ -67,7 +100,7 @@ export default function createIntegration(args?: Options): AstroIntegration { }); }, 'astro:config:done': ({ setAdapter, config }) => { - setAdapter(getAdapter(isModeDirectory)); + setAdapter(getAdapter({ isModeDirectory, functionPerRoute })); _config = config; _buildConfig = config.build; @@ -119,7 +152,8 @@ export default function createIntegration(args?: Options): AstroIntegration { await fs.promises.mkdir(functionsUrl, { recursive: true }); } - if (isModeDirectory && _buildConfig.split) { + // TODO: remove _buildConfig.split in Astro 4.0 + if (isModeDirectory && (_buildConfig.split || functionPerRoute)) { const entryPointsURL = [..._entryPoints.values()]; const entryPaths = entryPointsURL.map((entry) => fileURLToPath(entry)); const outputUrl = new URL('$astro', _buildConfig.server); |