summaryrefslogtreecommitdiff
path: root/packages/integrations/netlify/src
diff options
context:
space:
mode:
authorGravatar Florian Lefebvre <contact@florian-lefebvre.dev> 2025-01-13 16:23:26 +0100
committerGravatar GitHub <noreply@github.com> 2025-01-13 16:23:26 +0100
commitd508e905aad2b562b7cad64e5e20b1f424beb77d (patch)
treef6009d41d8be7a0fe98955a0db4c5801eeb7b627 /packages/integrations/netlify/src
parent20bb67e1e0c726b038845d5cdfdf8cead54d7e5c (diff)
downloadastro-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.ts67
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') {