summaryrefslogtreecommitdiff
path: root/packages/integrations/vercel/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/vercel/src')
-rw-r--r--packages/integrations/vercel/src/lib/redirects.ts58
-rw-r--r--packages/integrations/vercel/src/static/adapter.ts1
2 files changed, 44 insertions, 15 deletions
diff --git a/packages/integrations/vercel/src/lib/redirects.ts b/packages/integrations/vercel/src/lib/redirects.ts
index c11d74802..1ec19bfac 100644
--- a/packages/integrations/vercel/src/lib/redirects.ts
+++ b/packages/integrations/vercel/src/lib/redirects.ts
@@ -1,4 +1,9 @@
import type { AstroConfig, RouteData, RoutePart } from 'astro';
+import { appendForwardSlash } from '@astrojs/internal-helpers/path';
+import nodePath from 'node:path';
+
+const pathJoin = nodePath.posix.join;
+
// https://vercel.com/docs/project-configuration#legacy/routes
interface VercelRoute {
@@ -54,28 +59,51 @@ function getReplacePattern(segments: RoutePart[][]) {
return result;
}
+function getRedirectLocation(route: RouteData, config: AstroConfig): string {
+ if(route.redirectRoute) {
+ const pattern = getReplacePattern(route.redirectRoute.segments);
+ const path = (config.trailingSlash === 'always' ? appendForwardSlash(pattern) : pattern);
+ return pathJoin(config.base, path);
+ } else if(typeof route.redirect === 'object') {
+ return pathJoin(config.base, route.redirect.destination);
+ } else {
+ return pathJoin(config.base, route.redirect || '');
+ }
+}
+
+function getRedirectStatus(route: RouteData): number {
+ if(typeof route.redirect === 'object') {
+ return route.redirect.status;
+ }
+ return 301;
+}
+
export function getRedirects(routes: RouteData[], config: AstroConfig): VercelRoute[] {
let redirects: VercelRoute[] = [];
- if (config.trailingSlash === 'always') {
- for (const route of routes) {
- if (route.type !== 'page' || route.segments.length === 0) continue;
- redirects.push({
- src: config.base + getMatchPattern(route.segments),
- headers: { Location: config.base + getReplacePattern(route.segments) + '/' },
- status: 308,
- });
- }
- } else if (config.trailingSlash === 'never') {
- for (const route of routes) {
- if (route.type !== 'page' || route.segments.length === 0) continue;
+ for(const route of routes) {
+ if(route.type === 'redirect') {
redirects.push({
- src: config.base + getMatchPattern(route.segments) + '/',
- headers: { Location: config.base + getReplacePattern(route.segments) },
- status: 308,
+ src: config.base + getMatchPattern(route.segments),
+ headers: { Location: getRedirectLocation(route, config) },
+ status: getRedirectStatus(route)
});
+ } else if (route.type === 'page') {
+ if (config.trailingSlash === 'always') {
+ redirects.push({
+ src: config.base + getMatchPattern(route.segments),
+ headers: { Location: config.base + getReplacePattern(route.segments) + '/' },
+ status: 308,
+ });
+ } else if (config.trailingSlash === 'never') {
+ redirects.push({
+ src: config.base + getMatchPattern(route.segments) + '/',
+ headers: { Location: config.base + getReplacePattern(route.segments) },
+ status: 308,
+ });
+ }
}
}
diff --git a/packages/integrations/vercel/src/static/adapter.ts b/packages/integrations/vercel/src/static/adapter.ts
index 0b3579cdd..e0cc14322 100644
--- a/packages/integrations/vercel/src/static/adapter.ts
+++ b/packages/integrations/vercel/src/static/adapter.ts
@@ -43,6 +43,7 @@ export default function vercelStatic({
outDir,
build: {
format: 'directory',
+ redirects: false,
},
vite: {
define: viteDefine,