Skip to content
This repository was archived by the owner on May 10, 2021. It is now read-only.

Commit f83cb31

Browse files
FinnWoelmlindsaylevine
authored andcommitted
Force redirects with conditions before plain redirects
1 parent a765bdf commit f83cb31

File tree

3 files changed

+36
-37
lines changed

3 files changed

+36
-37
lines changed

lib/helpers/getSortedRedirects.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const {
2+
getSortedRoutes: getSortedRoutesFromNext,
3+
} = require("next/dist/next-server/lib/router/utils/sorted-routes");
4+
5+
// Remove the file extension form the route
6+
const removeFileExtension = (route) => route.replace(/\.[a-zA-Z]+$/, "");
7+
8+
// Return an array of redirects sorted in order of specificity, i.e., more generic
9+
// routes precede more specific ones
10+
const getSortedRedirects = (redirects) => {
11+
// The @sls-next getSortedRoutes does not correctly sort routes with file
12+
// endings (e.g., json), so we remove them before sorting and add them back
13+
// after sorting
14+
const routesWithoutExtensions = redirects.map(({ route }) =>
15+
removeFileExtension(route)
16+
);
17+
18+
// Sort the "naked" routes
19+
const sortedRoutes = getSortedRoutesFromNext(routesWithoutExtensions);
20+
21+
// Return original routes in the sorted order
22+
return redirects.sort((a, b) => {
23+
// If routes are different, sort according to Next.js' getSortedRoutes
24+
if (a.route !== b.route) {
25+
return (
26+
sortedRoutes.indexOf(removeFileExtension(a.route)) -
27+
sortedRoutes.indexOf(removeFileExtension(b.route))
28+
);
29+
}
30+
// Otherwise, put the route with more conditions first
31+
return (b.conditions || []).length - (a.conditions || []).length;
32+
});
33+
};
34+
35+
module.exports = getSortedRedirects;

lib/helpers/getSortedRoutes.js

Lines changed: 0 additions & 29 deletions
This file was deleted.

lib/steps/setupRedirects.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const {
55
CUSTOM_REDIRECTS_PATH,
66
NEXT_IMAGE_FUNCTION_NAME,
77
} = require("../config");
8-
const getSortedRoutes = require("../helpers/getSortedRoutes");
8+
const getSortedRedirects = require("../helpers/getSortedRedirects");
99
const getNetlifyRoutes = require("../helpers/getNetlifyRoutes");
1010
const isRootCatchAllRedirect = require("../helpers/isRootCatchAllRedirect");
1111
const isDynamicRoute = require("../helpers/isDynamicRoute");
@@ -49,13 +49,6 @@ const setupRedirects = (publishPath) => {
4949
target: `/.netlify/functions/${NEXT_IMAGE_FUNCTION_NAME}?url=:url&w=:width&q=:quality`,
5050
});
5151

52-
// Sort routes: More-specific routes precede less-specific routes (e.g., catch-all)
53-
const getSortedRedirects = (redirects) => {
54-
const sortedRoutes = getSortedRoutes(redirects.map(({ route }) => route));
55-
return redirects.sort(
56-
(a, b) => sortedRoutes.indexOf(a.route) - sortedRoutes.indexOf(b.route)
57-
);
58-
};
5952
const sortedStaticRedirects = getSortedRedirects(staticRedirects);
6053
const sortedDynamicRedirects = getSortedRedirects(dynamicRedirects);
6154

0 commit comments

Comments
 (0)