diff options
author | 2025-01-13 16:23:26 +0100 | |
---|---|---|
committer | 2025-01-13 16:23:26 +0100 | |
commit | d508e905aad2b562b7cad64e5e20b1f424beb77d (patch) | |
tree | f6009d41d8be7a0fe98955a0db4c5801eeb7b627 /packages/integrations/netlify/src | |
parent | 20bb67e1e0c726b038845d5cdfdf8cead54d7e5c (diff) | |
download | astro-d508e905aad2b562b7cad64e5e20b1f424beb77d.tar.gz astro-d508e905aad2b562b7cad64e5e20b1f424beb77d.tar.zst astro-d508e905aad2b562b7cad64e5e20b1f424beb77d.zip |
feat: upgrade underscore-redirects (#501)
Diffstat (limited to 'packages/integrations/netlify/src')
-rw-r--r-- | packages/integrations/netlify/src/index.ts | 67 |
1 files changed, 23 insertions, 44 deletions
diff --git a/packages/integrations/netlify/src/index.ts b/packages/integrations/netlify/src/index.ts index 288ff207e..17d86e41f 100644 --- a/packages/integrations/netlify/src/index.ts +++ b/packages/integrations/netlify/src/index.ts @@ -11,7 +11,6 @@ import type { AstroIntegrationLogger, HookParameters, IntegrationResolvedRoute, - IntegrationRouteData, } from 'astro'; import { build } from 'esbuild'; import { copyDependenciesToFunction } from './lib/nft.js'; @@ -27,9 +26,6 @@ export interface NetlifyLocals { }; } -const isStaticRedirect = (route: IntegrationRouteData) => - route.type === 'redirect' && (route.redirect || route.redirectRoute); - type RemotePattern = AstroConfig['image']['remotePatterns'][number]; /** @@ -213,49 +209,36 @@ export default function netlifyIntegration( emptyDir(ssrBuildDir()), ]); - function resolvedRouteToRouteData( - assets: HookParameters<'astro:build:done'>['assets'], - route: IntegrationResolvedRoute - ): IntegrationRouteData { - return { - pattern: route.patternRegex, - component: route.entrypoint, - prerender: route.isPrerendered, - route: route.pattern, - generate: route.generate, - params: route.params, - segments: route.segments, - type: route.type, - pathname: route.pathname, - redirect: route.redirect, - distURL: assets.get(route.pattern), - redirectRoute: route.redirectRoute - ? resolvedRouteToRouteData(assets, route.redirectRoute) - : undefined, - }; - } - async function writeRedirects( - routes: IntegrationRouteData[], + routes: IntegrationResolvedRoute[], dir: URL, - buildOutput: HookParameters<'astro:config:done'>['buildOutput'] + buildOutput: HookParameters<'astro:config:done'>['buildOutput'], + assets: HookParameters<'astro:build:done'>['assets'] ) { + // all other routes are handled by SSR + const staticRedirects = routes.filter( + (route) => route.type === 'redirect' && (route.redirect || route.redirectRoute) + ); + + // this is needed to support redirects to dynamic routes + // on static. not sure why this is needed, but it works. + for (const { pattern, redirectRoute } of staticRedirects) { + const distURL = assets.get(pattern); + if (!distURL && redirectRoute) { + const redirectDistURL = assets.get(redirectRoute.pattern); + if (redirectDistURL) { + assets.set(pattern, redirectDistURL); + } + } + } + const fallback = finalBuildOutput === 'static' ? '/.netlify/static' : '/.netlify/functions/ssr'; const redirects = createRedirectsFromAstroRoutes({ config: _config, dir, - routeToDynamicTargetMap: new Map( - routes - .filter(isStaticRedirect) // all other routes are handled by SSR - .map((route) => { - // this is needed to support redirects to dynamic routes - // on static. not sure why this is needed, but it works. - route.distURL ??= route.redirectRoute?.distURL; - - return [route, fallback]; - }) - ), + routeToDynamicTargetMap: new Map(staticRedirects.map((route) => [route, fallback])), buildOutput, + assets, }); if (!redirects.empty()) { @@ -523,11 +506,7 @@ export default function netlifyIntegration( astroMiddlewareEntryPoint = middlewareEntryPoint; }, 'astro:build:done': async ({ assets, dir, logger }) => { - await writeRedirects( - routes.map((route) => resolvedRouteToRouteData(assets, route)), - dir, - finalBuildOutput - ); + await writeRedirects(routes, dir, finalBuildOutput, assets); logger.info('Emitted _redirects'); if (finalBuildOutput !== 'static') { |