Skip to content

Commit e7fdf83

Browse files
feat(@astrojs/netlify): Add on-demand builders Netlify functions (#5874)
* Add on-demand builders option * chore: add changeset * docs: add documentation in configuration section * Update packages/integrations/netlify/README.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Update packages/integrations/netlify/README.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Update packages/integrations/netlify/README.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Update .changeset/twenty-pans-agree.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> --------- Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
1 parent f091bff commit e7fdf83

5 files changed

Lines changed: 35 additions & 7 deletions

File tree

packages/integrations/netlify/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,27 @@ And then point to the dist in your `netlify.toml`:
117117
directory = "dist/functions"
118118
```
119119
120+
### builders
121+
122+
[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:
123+
124+
```js
125+
// astro.config.mjs
126+
import { defineConfig } from 'astro/config';
127+
import netlify from '@astrojs/netlify/functions';
128+
129+
export default defineConfig({
130+
output: 'server',
131+
adapter: netlify({
132+
builders: true
133+
}),
134+
});
135+
```
136+
137+
On-demand Builders are only available with the `@astrojs/netlify/functions` adapter and are not compatible with Edge Functions.
138+
139+
140+
120141
### binaryMediaTypes
121142
122143
> This option is only needed for the Functions adapter and is not needed for Edge Functions.

packages/integrations/netlify/src/integration-edge-functions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {})
163163
'astro:build:done': async ({ routes, dir }) => {
164164
await bundleServerEntry(_buildConfig, _vite);
165165
await createEdgeManifest(routes, entryFile, _config.root);
166-
await createRedirects(_config, routes, dir, entryFile, true);
166+
await createRedirects(_config, routes, dir, entryFile, 'edge-functions');
167167
},
168168
},
169169
};

packages/integrations/netlify/src/integration-functions.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ export function getAdapter(args: Args = {}): AstroAdapter {
1313

1414
interface NetlifyFunctionsOptions {
1515
dist?: URL;
16+
builders?: boolean;
1617
binaryMediaTypes?: string[];
1718
}
1819

1920
function netlifyFunctions({
2021
dist,
22+
builders,
2123
binaryMediaTypes,
2224
}: NetlifyFunctionsOptions = {}): AstroIntegration {
2325
let _config: AstroConfig;
@@ -36,7 +38,7 @@ function netlifyFunctions({
3638
});
3739
},
3840
'astro:config:done': ({ config, setAdapter }) => {
39-
setAdapter(getAdapter({ binaryMediaTypes }));
41+
setAdapter(getAdapter({ binaryMediaTypes, builders }));
4042
_config = config;
4143
entryFile = config.build.serverEntry.replace(/\.m?js/, '');
4244

@@ -48,7 +50,8 @@ function netlifyFunctions({
4850
}
4951
},
5052
'astro:build:done': async ({ routes, dir }) => {
51-
await createRedirects(_config, routes, dir, entryFile, false);
53+
const type = builders ? 'builders' : 'functions'
54+
await createRedirects(_config, routes, dir, entryFile, type);
5255
},
5356
},
5457
};

packages/integrations/netlify/src/netlify-functions.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { polyfill } from '@astrojs/webapi';
2-
import type { Handler } from '@netlify/functions';
2+
import { builder, Handler } from '@netlify/functions';
33
import { SSRManifest } from 'astro';
44
import { App } from 'astro/app';
55

@@ -8,6 +8,7 @@ polyfill(globalThis, {
88
});
99

1010
export interface Args {
11+
builders?: boolean;
1112
binaryMediaTypes?: string[];
1213
}
1314

@@ -20,6 +21,7 @@ const clientAddressSymbol = Symbol.for('astro.clientAddress');
2021
export const createExports = (manifest: SSRManifest, args: Args) => {
2122
const app = new App(manifest);
2223

24+
const builders = args.builders ?? false;
2325
const binaryMediaTypes = args.binaryMediaTypes ?? [];
2426
const knownBinaryMediaTypes = new Set([
2527
'audio/3gpp',
@@ -53,7 +55,7 @@ export const createExports = (manifest: SSRManifest, args: Args) => {
5355
...binaryMediaTypes,
5456
]);
5557

56-
const handler: Handler = async (event) => {
58+
const myHandler: Handler = async (event) => {
5759
const { httpMethod, headers, rawUrl, body: requestBody, isBase64Encoded } = event;
5860
const init: RequestInit = {
5961
method: httpMethod,
@@ -143,6 +145,8 @@ export const createExports = (manifest: SSRManifest, args: Args) => {
143145
return fnResponse;
144146
};
145147

148+
const handler = builders ? builder(myHandler) : myHandler
149+
146150
return { handler };
147151
};
148152

packages/integrations/netlify/src/shared.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ export async function createRedirects(
1414
routes: RouteData[],
1515
dir: URL,
1616
entryFile: string,
17-
edge: boolean
17+
type: 'functions' | 'edge-functions' | 'builders'
1818
) {
1919
const _redirectsURL = new URL('./_redirects', dir);
20-
const kind = edge ? 'edge-functions' : 'functions';
20+
const kind = type ?? 'functions';
2121

2222
const definitions: RedirectDefinition[] = [];
2323

0 commit comments

Comments
 (0)