summaryrefslogtreecommitdiff
path: root/packages/integrations/vercel/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
commit77013fdbbb01da1abda5660d128a2a02d6181d7c (patch)
tree5f7afefb143a6c89143b2fe26d76bd2176fb0c37 /packages/integrations/vercel/src
parentff5d1f46c166c7189e620d891d7e7196bcf17203 (diff)
downloadastro-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.ts50
-rw-r--r--packages/integrations/vercel/src/lib/redirects.ts13
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),