summaryrefslogtreecommitdiff
path: root/packages/integrations/cloudflare/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/cloudflare/src/index.ts')
-rw-r--r--packages/integrations/cloudflare/src/index.ts42
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);