diff options
author | 2022-04-22 10:03:25 -0400 | |
---|---|---|
committer | 2022-04-22 10:03:25 -0400 | |
commit | 19667c45f318ec13cdc2b51016f3fa3487b2a32d (patch) | |
tree | 7092f20c31d95fd74c412d188cbc02eab67402de /packages/integrations | |
parent | e632c090494b70d563eebc9f961e76cd9c28551b (diff) | |
download | astro-19667c45f318ec13cdc2b51016f3fa3487b2a32d.tar.gz astro-19667c45f318ec13cdc2b51016f3fa3487b2a32d.tar.zst astro-19667c45f318ec13cdc2b51016f3fa3487b2a32d.zip |
Netlify Edge: forward requests for static assets (#3170)
* Netlify Edge: forward requests for static assets
* Adds a changeset
* Don't run edge tests, yet
Diffstat (limited to 'packages/integrations')
8 files changed, 62 insertions, 2 deletions
diff --git a/packages/integrations/netlify/package.json b/packages/integrations/netlify/package.json index 3d4bde0c3..d4a452f6a 100644 --- a/packages/integrations/netlify/package.json +++ b/packages/integrations/netlify/package.json @@ -33,6 +33,7 @@ "@astrojs/webapi": "^0.11.1" }, "devDependencies": { + "@netlify/edge-handler-types": "^0.34.1", "@netlify/functions": "^1.0.0", "astro": "workspace:*", "astro-scripts": "workspace:*" diff --git a/packages/integrations/netlify/src/netlify-edge-functions.ts b/packages/integrations/netlify/src/netlify-edge-functions.ts index 1bb8e2c3a..040228241 100644 --- a/packages/integrations/netlify/src/netlify-edge-functions.ts +++ b/packages/integrations/netlify/src/netlify-edge-functions.ts @@ -5,7 +5,14 @@ import { App } from 'astro/app'; export function createExports(manifest: SSRManifest) { const app = new App(manifest); - const handler = async (request: Request): Promise<Response> => { + const handler = async (request: Request): Promise<Response | void> => { + const url = new URL(request.url); + + // If this matches a static asset, just return and Netlify will forward it + // to its static asset handler. + if(manifest.assets.has(url.pathname)) { + return; + } if (app.match(request)) { return app.render(request); } diff --git a/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/astro.config.mjs b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/astro.config.mjs new file mode 100644 index 000000000..c55135e43 --- /dev/null +++ b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/astro.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig } from 'astro/config'; +import { netlifyEdgeFunctions } from '@astrojs/netlify'; + +export default defineConfig({ + adapter: netlifyEdgeFunctions({ + dist: new URL('./dist/', import.meta.url), + }), + experimental: { + ssr: true + } +}) diff --git a/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/package.json b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/package.json new file mode 100644 index 000000000..6e548c151 --- /dev/null +++ b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/netlify-edge-root-dynamic", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/netlify": "workspace:*" + } +} diff --git a/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/public/styles.css b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/public/styles.css new file mode 100644 index 000000000..eedeb9d0f --- /dev/null +++ b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/public/styles.css @@ -0,0 +1,3 @@ +body { + background: blue; +} diff --git a/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/src/pages/[...all].astro b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/src/pages/[...all].astro new file mode 100644 index 000000000..b61f6fc44 --- /dev/null +++ b/packages/integrations/netlify/test/edge-functions/fixtures/root-dynamic/src/pages/[...all].astro @@ -0,0 +1,9 @@ +<html> +<head> + <title>Testing</title> + <link rel="stylesheet" href="/styles.css"> +</head> +<body> + <h1>Testing</h1> +</body> +</html> diff --git a/packages/integrations/netlify/test/edge-functions/root-dynamic.test.ts b/packages/integrations/netlify/test/edge-functions/root-dynamic.test.ts new file mode 100644 index 000000000..c6504e188 --- /dev/null +++ b/packages/integrations/netlify/test/edge-functions/root-dynamic.test.ts @@ -0,0 +1,16 @@ +// @ts-ignore +import { runBuild } from './test-utils.ts'; +// @ts-ignore +import { assertEquals, assert, DOMParser } from './deps.ts'; + +// @ts-ignore +Deno.test({ + name: 'Assets are preferred over HTML routes', + async fn() { + let close = await runBuild('./fixtures/root-dynamic/'); + const { default: handler } = await import('./fixtures/root-dynamic/dist/edge-functions/entry.js'); + const response = await handler(new Request('http://example.com/styles.css')); + assertEquals(response, undefined, 'No response because this is an asset'); + await close(); + }, +}); diff --git a/packages/integrations/netlify/tsconfig.json b/packages/integrations/netlify/tsconfig.json index 44baf375c..b057b6880 100644 --- a/packages/integrations/netlify/tsconfig.json +++ b/packages/integrations/netlify/tsconfig.json @@ -5,6 +5,10 @@ "allowJs": true, "module": "ES2020", "outDir": "./dist", - "target": "ES2020" + "target": "ES2020", + "typeRoots": [ + "node_modules/@types", + "node_modules/@netlify" + ] } } |