summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/twenty-pans-agree.md5
-rw-r--r--packages/integrations/netlify/README.md21
-rw-r--r--packages/integrations/netlify/src/integration-edge-functions.ts2
-rw-r--r--packages/integrations/netlify/src/integration-functions.ts7
-rw-r--r--packages/integrations/netlify/src/netlify-functions.ts8
-rw-r--r--packages/integrations/netlify/src/shared.ts4
6 files changed, 40 insertions, 7 deletions
diff --git a/.changeset/twenty-pans-agree.md b/.changeset/twenty-pans-agree.md
new file mode 100644
index 000000000..0a747c248
--- /dev/null
+++ b/.changeset/twenty-pans-agree.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/netlify': minor
+---
+
+Add `builders` config option for Netlify On-demand Builders.
diff --git a/packages/integrations/netlify/README.md b/packages/integrations/netlify/README.md
index 69f66ca73..ec72f2a2c 100644
--- a/packages/integrations/netlify/README.md
+++ b/packages/integrations/netlify/README.md
@@ -117,6 +117,27 @@ And then point to the dist in your `netlify.toml`:
directory = "dist/functions"
```
+### builders
+
+[Netlify On-demand Builders](https://docs.netlify.com/configure-builds/on-demand-builders/) are serverless functions used to build and cache page content on Netlify’s Edge CDN. You can enable these functions with the `builders` option:
+
+```js
+// astro.config.mjs
+import { defineConfig } from 'astro/config';
+import netlify from '@astrojs/netlify/functions';
+
+export default defineConfig({
+ output: 'server',
+ adapter: netlify({
+ builders: true
+ }),
+});
+```
+
+On-demand Builders are only available with the `@astrojs/netlify/functions` adapter and are not compatible with Edge Functions.
+
+
+
### binaryMediaTypes
> This option is only needed for the Functions adapter and is not needed for Edge Functions.
diff --git a/packages/integrations/netlify/src/integration-edge-functions.ts b/packages/integrations/netlify/src/integration-edge-functions.ts
index 0d036be93..9cb2d663d 100644
--- a/packages/integrations/netlify/src/integration-edge-functions.ts
+++ b/packages/integrations/netlify/src/integration-edge-functions.ts
@@ -163,7 +163,7 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {})
'astro:build:done': async ({ routes, dir }) => {
await bundleServerEntry(_buildConfig, _vite);
await createEdgeManifest(routes, entryFile, _config.root);
- await createRedirects(_config, routes, dir, entryFile, true);
+ await createRedirects(_config, routes, dir, entryFile, 'edge-functions');
},
},
};
diff --git a/packages/integrations/netlify/src/integration-functions.ts b/packages/integrations/netlify/src/integration-functions.ts
index f75b6d1f8..fcb3f3c70 100644
--- a/packages/integrations/netlify/src/integration-functions.ts
+++ b/packages/integrations/netlify/src/integration-functions.ts
@@ -13,11 +13,13 @@ export function getAdapter(args: Args = {}): AstroAdapter {
interface NetlifyFunctionsOptions {
dist?: URL;
+ builders?: boolean;
binaryMediaTypes?: string[];
}
function netlifyFunctions({
dist,
+ builders,
binaryMediaTypes,
}: NetlifyFunctionsOptions = {}): AstroIntegration {
let _config: AstroConfig;
@@ -36,7 +38,7 @@ function netlifyFunctions({
});
},
'astro:config:done': ({ config, setAdapter }) => {
- setAdapter(getAdapter({ binaryMediaTypes }));
+ setAdapter(getAdapter({ binaryMediaTypes, builders }));
_config = config;
entryFile = config.build.serverEntry.replace(/\.m?js/, '');
@@ -48,7 +50,8 @@ function netlifyFunctions({
}
},
'astro:build:done': async ({ routes, dir }) => {
- await createRedirects(_config, routes, dir, entryFile, false);
+ const type = builders ? 'builders' : 'functions'
+ await createRedirects(_config, routes, dir, entryFile, type);
},
},
};
diff --git a/packages/integrations/netlify/src/netlify-functions.ts b/packages/integrations/netlify/src/netlify-functions.ts
index 57b042af9..9c9a70848 100644
--- a/packages/integrations/netlify/src/netlify-functions.ts
+++ b/packages/integrations/netlify/src/netlify-functions.ts
@@ -1,5 +1,5 @@
import { polyfill } from '@astrojs/webapi';
-import type { Handler } from '@netlify/functions';
+import { builder, Handler } from '@netlify/functions';
import { SSRManifest } from 'astro';
import { App } from 'astro/app';
@@ -8,6 +8,7 @@ polyfill(globalThis, {
});
export interface Args {
+ builders?: boolean;
binaryMediaTypes?: string[];
}
@@ -20,6 +21,7 @@ const clientAddressSymbol = Symbol.for('astro.clientAddress');
export const createExports = (manifest: SSRManifest, args: Args) => {
const app = new App(manifest);
+ const builders = args.builders ?? false;
const binaryMediaTypes = args.binaryMediaTypes ?? [];
const knownBinaryMediaTypes = new Set([
'audio/3gpp',
@@ -53,7 +55,7 @@ export const createExports = (manifest: SSRManifest, args: Args) => {
...binaryMediaTypes,
]);
- const handler: Handler = async (event) => {
+ const myHandler: Handler = async (event) => {
const { httpMethod, headers, rawUrl, body: requestBody, isBase64Encoded } = event;
const init: RequestInit = {
method: httpMethod,
@@ -143,6 +145,8 @@ export const createExports = (manifest: SSRManifest, args: Args) => {
return fnResponse;
};
+ const handler = builders ? builder(myHandler) : myHandler
+
return { handler };
};
diff --git a/packages/integrations/netlify/src/shared.ts b/packages/integrations/netlify/src/shared.ts
index 59354b156..78a61a800 100644
--- a/packages/integrations/netlify/src/shared.ts
+++ b/packages/integrations/netlify/src/shared.ts
@@ -14,10 +14,10 @@ export async function createRedirects(
routes: RouteData[],
dir: URL,
entryFile: string,
- edge: boolean
+ type: 'functions' | 'edge-functions' | 'builders'
) {
const _redirectsURL = new URL('./_redirects', dir);
- const kind = edge ? 'edge-functions' : 'functions';
+ const kind = type ?? 'functions';
const definitions: RedirectDefinition[] = [];