diff options
author | 2025-01-13 16:23:26 +0100 | |
---|---|---|
committer | 2025-01-13 16:23:26 +0100 | |
commit | 77013fdbbb01da1abda5660d128a2a02d6181d7c (patch) | |
tree | 5f7afefb143a6c89143b2fe26d76bd2176fb0c37 /packages/integrations/vercel/src | |
parent | ff5d1f46c166c7189e620d891d7e7196bcf17203 (diff) | |
download | astro-77013fdbbb01da1abda5660d128a2a02d6181d7c.tar.gz astro-77013fdbbb01da1abda5660d128a2a02d6181d7c.tar.zst astro-77013fdbbb01da1abda5660d128a2a02d6181d7c.zip |
feat: upgrade underscore-redirects (#501)
Diffstat (limited to 'packages/integrations/vercel/src')
-rw-r--r-- | packages/integrations/vercel/src/index.ts | 50 | ||||
-rw-r--r-- | packages/integrations/vercel/src/lib/redirects.ts | 13 |
2 files changed, 24 insertions, 39 deletions
diff --git a/packages/integrations/vercel/src/index.ts b/packages/integrations/vercel/src/index.ts index 536cd84f4..2360de5e1 100644 --- a/packages/integrations/vercel/src/index.ts +++ b/packages/integrations/vercel/src/index.ts @@ -9,7 +9,6 @@ import type { AstroIntegrationLogger, HookParameters, IntegrationResolvedRoute, - IntegrationRouteData, } from 'astro'; import glob from 'fast-glob'; import { @@ -185,7 +184,7 @@ export default function vercelAdapter({ let _config: AstroConfig; let _buildTempFolder: URL; let _serverEntry: string; - let _entryPoints: Map<IntegrationRouteData, URL>; + let _entryPoints: Map<Pick<IntegrationResolvedRoute, 'entrypoint' | 'patternRegex'>, URL>; let _middlewareEntryPoint: URL | undefined; // Extra files to be merged with `includeFiles` during build const extraFilesToInclude: URL[] = []; @@ -291,11 +290,19 @@ export default function vercelAdapter({ }, 'astro:build:ssr': async ({ entryPoints, middlewareEntryPoint }) => { _entryPoints = new Map( - Array.from(entryPoints).filter(([routeData]) => !routeData.prerender) + Array.from(entryPoints) + .filter(([routeData]) => !routeData.prerender) + .map(([routeData, url]) => [ + { + entrypoint: routeData.component, + patternRegex: routeData.pattern, + }, + url, + ]) ); _middlewareEntryPoint = middlewareEntryPoint; }, - 'astro:build:done': async ({ assets, logger }: HookParameters<'astro:build:done'>) => { + 'astro:build:done': async ({ logger }: HookParameters<'astro:build:done'>) => { const outDir = new URL('./.vercel/output/', _config.root); if (staticDir) { if (existsSync(staticDir)) { @@ -356,8 +363,8 @@ export default function vercelAdapter({ // Multiple entrypoint support if (_entryPoints.size) { - const getRouteFuncName = (route: IntegrationRouteData) => - route.component.replace('src/pages/', ''); + const getRouteFuncName = (route: Pick<IntegrationResolvedRoute, 'entrypoint'>) => + route.entrypoint.replace('src/pages/', ''); const getFallbackFuncName = (entryFile: URL) => basename(entryFile.toString()) @@ -365,14 +372,14 @@ export default function vercelAdapter({ .replace(/\.mjs$/, ''); for (const [route, entryFile] of _entryPoints) { - const func = route.component.startsWith('src/pages/') + const func = route.entrypoint.startsWith('src/pages/') ? getRouteFuncName(route) : getFallbackFuncName(entryFile); await builder.buildServerlessFolder(entryFile, func, _config.root); routeDefinitions.push({ - src: route.pattern.source, + src: route.patternRegex.source, dest: func, }); } @@ -417,10 +424,7 @@ export default function vercelAdapter({ const fourOhFourRoute = routes.find((route) => route.pathname === '/404'); const destination = new URL('./.vercel/output/config.json', _config.root); const finalRoutes = [ - ...getRedirects( - routes.map((route) => resolvedRouteToRouteData(assets, route)), - _config - ), + ...getRedirects(routes, _config), { src: `^/${_config.build.assets}/(.*)$`, headers: { 'cache-control': 'public, max-age=31536000, immutable' }, @@ -488,28 +492,6 @@ export default function vercelAdapter({ }; } -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, - }; -} - function isAcceptedPattern(pattern: any): pattern is RemotePattern { if (pattern == null) { return false; diff --git a/packages/integrations/vercel/src/lib/redirects.ts b/packages/integrations/vercel/src/lib/redirects.ts index 7ef4d5045..a9a3a81b2 100644 --- a/packages/integrations/vercel/src/lib/redirects.ts +++ b/packages/integrations/vercel/src/lib/redirects.ts @@ -1,6 +1,6 @@ import nodePath from 'node:path'; import { appendForwardSlash, removeLeadingForwardSlash } from '@astrojs/internal-helpers/path'; -import type { AstroConfig, IntegrationRouteData, RoutePart } from 'astro'; +import type { AstroConfig, IntegrationResolvedRoute, RoutePart } from 'astro'; const pathJoin = nodePath.posix.join; @@ -91,7 +91,7 @@ function getReplacePattern(segments: RoutePart[][]) { return result; } -function getRedirectLocation(route: IntegrationRouteData, config: AstroConfig): string { +function getRedirectLocation(route: IntegrationResolvedRoute, config: AstroConfig): string { if (route.redirectRoute) { const pattern = getReplacePattern(route.redirectRoute.segments); const path = config.trailingSlash === 'always' ? appendForwardSlash(pattern) : pattern; @@ -105,7 +105,7 @@ function getRedirectLocation(route: IntegrationRouteData, config: AstroConfig): } } -function getRedirectStatus(route: IntegrationRouteData): number { +function getRedirectStatus(route: IntegrationResolvedRoute): number { if (typeof route.redirect === 'object') { return route.redirect.status; } @@ -122,7 +122,10 @@ export function escapeRegex(content: string) { return `^/${getMatchPattern(segments)}$`; } -export function getRedirects(routes: IntegrationRouteData[], config: AstroConfig): VercelRoute[] { +export function getRedirects( + routes: IntegrationResolvedRoute[], + config: AstroConfig +): VercelRoute[] { const redirects: VercelRoute[] = []; for (const route of routes) { @@ -132,7 +135,7 @@ export function getRedirects(routes: IntegrationRouteData[], config: AstroConfig headers: { Location: getRedirectLocation(route, config) }, status: getRedirectStatus(route), }); - } else if (route.type === 'page' && route.route !== '/') { + } else if (route.type === 'page' && route.pattern !== '/') { if (config.trailingSlash === 'always') { redirects.push({ src: config.base + getMatchPattern(route.segments), |