UNPKG

next

Version:

The React Framework

92 lines (91 loc) 3.41 kB
import { InvariantError } from '../../invariant-error'; import { getSegmentParam } from '../utils/get-segment-param'; import { INTERCEPTION_ROUTE_MARKERS } from '../utils/interception-routes'; export function parseAppRouteSegment(segment) { if (segment === '') { return null; } // Check if the segment starts with an interception marker const interceptionMarker = INTERCEPTION_ROUTE_MARKERS.find((m)=>segment.startsWith(m)); const param = getSegmentParam(segment); if (param) { return { type: 'dynamic', name: segment, param, interceptionMarker }; } else if (segment.startsWith('(') && segment.endsWith(')')) { return { type: 'route-group', name: segment, interceptionMarker }; } else if (segment.startsWith('@')) { return { type: 'parallel-route', name: segment, interceptionMarker }; } else { return { type: 'static', name: segment, interceptionMarker }; } } export function isNormalizedAppRoute(route) { return route.normalized; } export function isInterceptionAppRoute(route) { return route.interceptionMarker !== undefined && route.interceptingRoute !== undefined && route.interceptedRoute !== undefined; } export function parseAppRoute(pathname, normalized) { const pathnameSegments = pathname.split('/').filter(Boolean); // Build segments array with static and dynamic segments const segments = []; // Parse if this is an interception route. let interceptionMarker; let interceptingRoute; let interceptedRoute; for (const segment of pathnameSegments){ // Parse the segment into an AppSegment. const appSegment = parseAppRouteSegment(segment); if (!appSegment) { continue; } if (normalized && (appSegment.type === 'route-group' || appSegment.type === 'parallel-route')) { throw Object.defineProperty(new InvariantError(`${pathname} is being parsed as a normalized route, but it has a route group or parallel route segment.`), "__NEXT_ERROR_CODE", { value: "E923", enumerable: false, configurable: true }); } segments.push(appSegment); if (appSegment.interceptionMarker) { const parts = pathname.split(appSegment.interceptionMarker); if (parts.length !== 2) { throw Object.defineProperty(new Error(`Invalid interception route: ${pathname}`), "__NEXT_ERROR_CODE", { value: "E924", enumerable: false, configurable: true }); } interceptingRoute = normalized ? parseAppRoute(parts[0], true) : parseAppRoute(parts[0], false); interceptedRoute = normalized ? parseAppRoute(parts[1], true) : parseAppRoute(parts[1], false); interceptionMarker = appSegment.interceptionMarker; } } const dynamicSegments = segments.filter((segment)=>segment.type === 'dynamic'); return { normalized, pathname, segments, dynamicSegments, interceptionMarker, interceptingRoute, interceptedRoute }; } //# sourceMappingURL=app.js.map