You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			64 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			64 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| Object.defineProperty(exports, "normalizeCatchAllRoutes", {
 | |
|     enumerable: true,
 | |
|     get: function() {
 | |
|         return normalizeCatchAllRoutes;
 | |
|     }
 | |
| });
 | |
| const _interceptionroutes = require("../server/future/helpers/interception-routes");
 | |
| const _apppathnamenormalizer = require("../server/future/normalizers/built/app/app-pathname-normalizer");
 | |
| function normalizeCatchAllRoutes(appPaths, normalizer = new _apppathnamenormalizer.AppPathnameNormalizer()) {
 | |
|     const catchAllRoutes = [
 | |
|         ...new Set(Object.values(appPaths).flat().filter(isCatchAllRoute)// Sorting is important because we want to match the most specific path.
 | |
|         .sort((a, b)=>b.split("/").length - a.split("/").length))
 | |
|     ];
 | |
|     // interception routes should only be matched by a single entrypoint
 | |
|     // we don't want to push a catch-all route to an interception route
 | |
|     // because it would mean the interception would be handled by the wrong page component
 | |
|     const filteredAppPaths = Object.keys(appPaths).filter((route)=>!(0, _interceptionroutes.isInterceptionRouteAppPath)(route));
 | |
|     for (const appPath of filteredAppPaths){
 | |
|         for (const catchAllRoute of catchAllRoutes){
 | |
|             const normalizedCatchAllRoute = normalizer.normalize(catchAllRoute);
 | |
|             const normalizedCatchAllRouteBasePath = normalizedCatchAllRoute.slice(0, normalizedCatchAllRoute.search(catchAllRouteRegex));
 | |
|             if (// check if the appPath could match the catch-all
 | |
|             appPath.startsWith(normalizedCatchAllRouteBasePath) && // check if there's not already a slot value that could match the catch-all
 | |
|             !appPaths[appPath].some((path)=>hasMatchedSlots(path, catchAllRoute)) && // check if appPath is a catch-all OR is not more specific than the catch-all
 | |
|             (isCatchAllRoute(appPath) || !isMoreSpecific(appPath, catchAllRoute))) {
 | |
|                 appPaths[appPath].push(catchAllRoute);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| function hasMatchedSlots(path1, path2) {
 | |
|     const slots1 = path1.split("/").filter(isMatchableSlot);
 | |
|     const slots2 = path2.split("/").filter(isMatchableSlot);
 | |
|     // if the catch-all route does not have the same number of slots as the app path, it can't match
 | |
|     if (slots1.length !== slots2.length) return false;
 | |
|     // compare the slots in both paths. For there to be a match, each slot must be the same
 | |
|     for(let i = 0; i < slots1.length; i++){
 | |
|         if (slots1[i] !== slots2[i]) return false;
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| /**
 | |
|  * Returns true for slots that should be considered when checking for match compatability.
 | |
|  * Excludes children slots because these are similar to having a segment-level `page`
 | |
|  * which would cause a slot length mismatch when comparing it to a catch-all route.
 | |
|  */ function isMatchableSlot(segment) {
 | |
|     return segment.startsWith("@") && segment !== "@children";
 | |
| }
 | |
| const catchAllRouteRegex = /\[?\[\.\.\./;
 | |
| function isCatchAllRoute(pathname) {
 | |
|     return pathname.includes("[...") || pathname.includes("[[...");
 | |
| }
 | |
| // test to see if a path is more specific than a catch-all route
 | |
| function isMoreSpecific(pathname, catchAllRoute) {
 | |
|     const pathnameDepth = pathname.split("/").length;
 | |
|     const catchAllRouteDepth = catchAllRoute.split("/").length - 1;
 | |
|     return pathnameDepth > catchAllRouteDepth;
 | |
| }
 | |
| 
 | |
| //# sourceMappingURL=normalize-catchall-routes.js.map
 |