next
Version:
The React Framework
92 lines (91 loc) • 3.41 kB
JavaScript
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