diff options
Diffstat (limited to 'packages/integrations/netlify/src')
4 files changed, 51 insertions, 15 deletions
diff --git a/packages/integrations/netlify/src/integration-edge-functions.ts b/packages/integrations/netlify/src/integration-edge-functions.ts index 2f65bccda..72721bd59 100644 --- a/packages/integrations/netlify/src/integration-edge-functions.ts +++ b/packages/integrations/netlify/src/integration-edge-functions.ts @@ -166,7 +166,12 @@ 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, 'edge-functions'); + const dynamicTarget = `/.netlify/edge-functions/${entryFile}`; + const map: [RouteData, string][] = routes.map((route) => { + return [route, dynamicTarget]; + }); + const routeToDynamicTargetMap = new Map(Array.from(map)); + await createRedirects(_config, routeToDynamicTargetMap, dir); }, }, }; diff --git a/packages/integrations/netlify/src/integration-functions.ts b/packages/integrations/netlify/src/integration-functions.ts index 348b007f5..5442079d0 100644 --- a/packages/integrations/netlify/src/integration-functions.ts +++ b/packages/integrations/netlify/src/integration-functions.ts @@ -1,6 +1,8 @@ -import type { AstroAdapter, AstroConfig, AstroIntegration } from 'astro'; +import type { AstroAdapter, AstroConfig, AstroIntegration, RouteData } from 'astro'; import type { Args } from './netlify-functions.js'; import { createRedirects } from './shared.js'; +import { fileURLToPath } from 'node:url'; +import { extname } from 'node:path'; export function getAdapter(args: Args = {}): AstroAdapter { return { @@ -23,7 +25,8 @@ function netlifyFunctions({ binaryMediaTypes, }: NetlifyFunctionsOptions = {}): AstroIntegration { let _config: AstroConfig; - let entryFile: string; + let _entryPoints: Map<RouteData, URL>; + let ssrEntryFile: string; return { name: '@astrojs/netlify', hooks: { @@ -37,10 +40,13 @@ function netlifyFunctions({ }, }); }, + 'astro:build:ssr': ({ entryPoints }) => { + _entryPoints = entryPoints; + }, 'astro:config:done': ({ config, setAdapter }) => { setAdapter(getAdapter({ binaryMediaTypes, builders })); _config = config; - entryFile = config.build.serverEntry.replace(/\.m?js/, ''); + ssrEntryFile = config.build.serverEntry.replace(/\.m?js/, ''); if (config.output === 'static') { console.warn( @@ -53,7 +59,32 @@ function netlifyFunctions({ }, 'astro:build:done': async ({ routes, dir }) => { const type = builders ? 'builders' : 'functions'; - await createRedirects(_config, routes, dir, entryFile, type); + const kind = type ?? 'functions'; + + if (_entryPoints.size) { + const routeToDynamicTargetMap = new Map(); + for (const [route, entryFile] of _entryPoints) { + const wholeFileUrl = fileURLToPath(entryFile); + + const extension = extname(wholeFileUrl); + const relative = wholeFileUrl + .replace(fileURLToPath(_config.build.server), '') + .replace(extension, '') + .replaceAll('\\', '/'); + const dynamicTarget = `/.netlify/${kind}/${relative}`; + + routeToDynamicTargetMap.set(route, dynamicTarget); + } + await createRedirects(_config, routeToDynamicTargetMap, dir); + } else { + const dynamicTarget = `/.netlify/${kind}/${ssrEntryFile}`; + const map: [RouteData, string][] = routes.map((route) => { + return [route, dynamicTarget]; + }); + const routeToDynamicTargetMap = new Map(Array.from(map)); + + await createRedirects(_config, routeToDynamicTargetMap, dir); + } }, }, }; diff --git a/packages/integrations/netlify/src/integration-static.ts b/packages/integrations/netlify/src/integration-static.ts index 78d0bb4b0..af2849867 100644 --- a/packages/integrations/netlify/src/integration-static.ts +++ b/packages/integrations/netlify/src/integration-static.ts @@ -1,4 +1,4 @@ -import type { AstroIntegration } from 'astro'; +import type { AstroIntegration, RouteData } from 'astro'; import { createRedirects } from './shared.js'; export function netlifyStatic(): AstroIntegration { @@ -18,7 +18,12 @@ export function netlifyStatic(): AstroIntegration { _config = config; }, 'astro:build:done': async ({ dir, routes }) => { - await createRedirects(_config, routes, dir, '', 'static'); + const mappedRoutes: [RouteData, string][] = routes.map((route) => [ + route, + `/.netlify/static/`, + ]); + const routesToDynamicTargetMap = new Map(Array.from(mappedRoutes)); + await createRedirects(_config, routesToDynamicTargetMap, dir); }, }, }; diff --git a/packages/integrations/netlify/src/shared.ts b/packages/integrations/netlify/src/shared.ts index e4aabd824..ca45dc752 100644 --- a/packages/integrations/netlify/src/shared.ts +++ b/packages/integrations/netlify/src/shared.ts @@ -4,20 +4,15 @@ import fs from 'node:fs'; export async function createRedirects( config: AstroConfig, - routes: RouteData[], - dir: URL, - entryFile: string, - type: 'functions' | 'edge-functions' | 'builders' | 'static' + routeToDynamicTargetMap: Map<RouteData, string>, + dir: URL ) { - const kind = type ?? 'functions'; - const dynamicTarget = `/.netlify/${kind}/${entryFile}`; const _redirectsURL = new URL('./_redirects', dir); const _redirects = createRedirectsFromAstroRoutes({ config, - routes, + routeToDynamicTargetMap, dir, - dynamicTarget, }); const content = _redirects.print(); |