Skip to content

Commit

Permalink
Fix/netlify edge redirects (#3342)
Browse files Browse the repository at this point in the history
* fix: create redirects file for netlify edge adapter

* chore: changeset

* chore: distinguish between edge/regular
  • Loading branch information
thepassle authored May 11, 2022
1 parent 9c98ba8 commit 352fc31
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 21 deletions.
5 changes: 5 additions & 0 deletions .changeset/eighty-keys-explode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@astrojs/netlify': patch
---

create redirects file for netlify edge adapter
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { AstroAdapter, AstroIntegration, AstroConfig, RouteData } from 'astro';
import { createRedirects } from './shared.js';
import * as fs from 'fs';

export function getAdapter(): AstroAdapter {
Expand Down Expand Up @@ -97,6 +98,7 @@ export function netlifyEdgeFunctions({ dist }: NetlifyEdgeFunctionsOptions = {})
},
'astro:build:done': async ({ routes, dir }) => {
await createEdgeManifest(routes, entryFile, _config.root);
await createRedirects(routes, dir, entryFile, true);
},
},
};
Expand Down
23 changes: 2 additions & 21 deletions packages/integrations/netlify/src/integration-functions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { AstroAdapter, AstroIntegration, AstroConfig } from 'astro';
import fs from 'fs';
import { createRedirects } from './shared.js';

export function getAdapter(): AstroAdapter {
return {
Expand Down Expand Up @@ -37,26 +37,7 @@ function netlifyFunctions({ dist }: NetlifyFunctionsOptions = {}): AstroIntegrat
buildConfig.server = new URL('./functions/', _config.outDir);
},
'astro:build:done': async ({ routes, dir }) => {
const _redirectsURL = new URL('./_redirects', dir);

// Create the redirects file that is used for routing.
let _redirects = '';
for (const route of routes) {
if (route.pathname) {
_redirects += `
${route.pathname} /.netlify/functions/${entryFile} 200`;
} else {
const pattern =
'/' + route.segments.map(([part]) => (part.dynamic ? '*' : part.content)).join('/');
_redirects += `
${pattern} /.netlify/functions/${entryFile} 200`;
}
}

// Always use appendFile() because the redirects file could already exist,
// e.g. due to a `/public/_redirects` file that got copied to the output dir.
// If the file does not exist yet, appendFile() automatically creates it.
await fs.promises.appendFile(_redirectsURL, _redirects, 'utf-8');
await createRedirects(routes, dir, entryFile, false);
},
},
};
Expand Down
31 changes: 31 additions & 0 deletions packages/integrations/netlify/src/shared.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import type { RouteData } from 'astro';
import fs from 'fs';

export async function createRedirects(
routes: RouteData[],
dir: URL,
entryFile: string,
edge: boolean
) {
const _redirectsURL = new URL('./_redirects', dir);
const kind = edge ? 'edge-functions' : 'functions'

// Create the redirects file that is used for routing.
let _redirects = '';
for (const route of routes) {
if (route.pathname) {
_redirects += `
${route.pathname} /.netlify/${kind}/${entryFile} 200`;
} else {
const pattern =
'/' + route.segments.map(([part]) => (part.dynamic ? '*' : part.content)).join('/');
_redirects += `
${pattern} /.netlify/${kind}/${entryFile} 200`;
}
}

// Always use appendFile() because the redirects file could already exist,
// e.g. due to a `/public/_redirects` file that got copied to the output dir.
// If the file does not exist yet, appendFile() automatically creates it.
await fs.promises.appendFile(_redirectsURL, _redirects, 'utf-8');
}

0 comments on commit 352fc31

Please sign in to comment.