167 lines
6.0 KiB
JavaScript
167 lines
6.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
0 && (module.exports = {
|
|
PARAMETER_PATTERN: null,
|
|
getDynamicParam: null,
|
|
interpolateParallelRouteParams: null,
|
|
parseMatchedParameter: null,
|
|
parseParameter: null
|
|
});
|
|
function _export(target, all) {
|
|
for(var name in all)Object.defineProperty(target, name, {
|
|
enumerable: true,
|
|
get: all[name]
|
|
});
|
|
}
|
|
_export(exports, {
|
|
PARAMETER_PATTERN: function() {
|
|
return PARAMETER_PATTERN;
|
|
},
|
|
getDynamicParam: function() {
|
|
return getDynamicParam;
|
|
},
|
|
interpolateParallelRouteParams: function() {
|
|
return interpolateParallelRouteParams;
|
|
},
|
|
parseMatchedParameter: function() {
|
|
return parseMatchedParameter;
|
|
},
|
|
parseParameter: function() {
|
|
return parseParameter;
|
|
}
|
|
});
|
|
const _invarianterror = require("../../invariant-error");
|
|
const _parseloadertree = require("./parse-loader-tree");
|
|
const _app = require("../routes/app");
|
|
const _resolveparamvalue = require("./resolve-param-value");
|
|
/**
|
|
* Gets the value of a param from the params object. This correctly handles the
|
|
* case where the param is a fallback route param and encodes the resulting
|
|
* value.
|
|
*
|
|
* @param interpolatedParams - The params object.
|
|
* @param segmentKey - The key of the segment.
|
|
* @param fallbackRouteParams - The fallback route params.
|
|
* @returns The value of the param.
|
|
*/ function getParamValue(interpolatedParams, segmentKey, fallbackRouteParams) {
|
|
let value = interpolatedParams[segmentKey];
|
|
if (fallbackRouteParams?.has(segmentKey)) {
|
|
// We know that the fallback route params has the segment key because we
|
|
// checked that above.
|
|
const [searchValue] = fallbackRouteParams.get(segmentKey);
|
|
value = searchValue;
|
|
} else if (Array.isArray(value)) {
|
|
value = value.map((i)=>encodeURIComponent(i));
|
|
} else if (typeof value === 'string') {
|
|
value = encodeURIComponent(value);
|
|
}
|
|
return value;
|
|
}
|
|
function interpolateParallelRouteParams(loaderTree, params, pagePath, fallbackRouteParams) {
|
|
const interpolated = structuredClone(params);
|
|
// Stack-based traversal with depth tracking
|
|
const stack = [
|
|
{
|
|
tree: loaderTree,
|
|
depth: 0
|
|
}
|
|
];
|
|
// Parse the route from the provided page path.
|
|
const route = (0, _app.parseAppRoute)(pagePath, true);
|
|
while(stack.length > 0){
|
|
const { tree, depth } = stack.pop();
|
|
const { segment, parallelRoutes } = (0, _parseloadertree.parseLoaderTree)(tree);
|
|
const appSegment = (0, _app.parseAppRouteSegment)(segment);
|
|
if (appSegment?.type === 'dynamic' && !interpolated.hasOwnProperty(appSegment.param.paramName) && // If the param is in the fallback route params, we don't need to
|
|
// interpolate it because it's already marked as being unknown.
|
|
!fallbackRouteParams?.has(appSegment.param.paramName)) {
|
|
const { paramName, paramType } = appSegment.param;
|
|
const paramValue = (0, _resolveparamvalue.resolveParamValue)(paramName, paramType, depth, route, interpolated);
|
|
if (paramValue !== undefined) {
|
|
interpolated[paramName] = paramValue;
|
|
} else if (paramType !== 'optional-catchall') {
|
|
throw Object.defineProperty(new _invarianterror.InvariantError(`Could not resolve param value for segment: ${paramName}`), "__NEXT_ERROR_CODE", {
|
|
value: "E932",
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
}
|
|
}
|
|
// Calculate next depth - increment if this is not a route group and not empty
|
|
let nextDepth = depth;
|
|
if (appSegment && appSegment.type !== 'route-group' && appSegment.type !== 'parallel-route') {
|
|
nextDepth++;
|
|
}
|
|
// Add all parallel routes to the stack for processing
|
|
for (const parallelRoute of Object.values(parallelRoutes)){
|
|
stack.push({
|
|
tree: parallelRoute,
|
|
depth: nextDepth
|
|
});
|
|
}
|
|
}
|
|
return interpolated;
|
|
}
|
|
function getDynamicParam(interpolatedParams, segmentKey, dynamicParamType, fallbackRouteParams) {
|
|
let value = getParamValue(interpolatedParams, segmentKey, fallbackRouteParams);
|
|
// handle the case where an optional catchall does not have a value,
|
|
// e.g. `/dashboard/[[...slug]]` when requesting `/dashboard`
|
|
if (!value || value.length === 0) {
|
|
if (dynamicParamType === 'oc') {
|
|
return {
|
|
param: segmentKey,
|
|
value: null,
|
|
type: dynamicParamType,
|
|
treeSegment: [
|
|
segmentKey,
|
|
'',
|
|
dynamicParamType
|
|
]
|
|
};
|
|
}
|
|
throw Object.defineProperty(new _invarianterror.InvariantError(`Missing value for segment key: "${segmentKey}" with dynamic param type: ${dynamicParamType}`), "__NEXT_ERROR_CODE", {
|
|
value: "E864",
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
}
|
|
return {
|
|
param: segmentKey,
|
|
// The value that is passed to user code.
|
|
value,
|
|
// The value that is rendered in the router tree.
|
|
treeSegment: [
|
|
segmentKey,
|
|
Array.isArray(value) ? value.join('/') : value,
|
|
dynamicParamType
|
|
],
|
|
type: dynamicParamType
|
|
};
|
|
}
|
|
const PARAMETER_PATTERN = /^([^[]*)\[((?:\[[^\]]*\])|[^\]]+)\](.*)$/;
|
|
function parseParameter(param) {
|
|
const match = param.match(PARAMETER_PATTERN);
|
|
if (!match) {
|
|
return parseMatchedParameter(param);
|
|
}
|
|
return parseMatchedParameter(match[2]);
|
|
}
|
|
function parseMatchedParameter(param) {
|
|
const optional = param.startsWith('[') && param.endsWith(']');
|
|
if (optional) {
|
|
param = param.slice(1, -1);
|
|
}
|
|
const repeat = param.startsWith('...');
|
|
if (repeat) {
|
|
param = param.slice(3);
|
|
}
|
|
return {
|
|
key: param,
|
|
repeat,
|
|
optional
|
|
};
|
|
}
|
|
|
|
//# sourceMappingURL=get-dynamic-param.js.map
|