UNPKG

next

Version:

The React Framework

167 lines (166 loc) 6.17 kB
"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