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
		
	
| 
											9 months ago
										 | "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
 |