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.
		
		
		
		
		
			
		
			
				
	
	
		
			171 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			171 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| Object.defineProperty(exports, "walkTreeWithFlightRouterState", {
 | |
|     enumerable: true,
 | |
|     get: function() {
 | |
|         return walkTreeWithFlightRouterState;
 | |
|     }
 | |
| });
 | |
| const _jsxruntime = require("react/jsx-runtime");
 | |
| const _react = /*#__PURE__*/ _interop_require_default(require("react"));
 | |
| const _matchsegments = require("../../client/components/match-segments");
 | |
| const _getcssinlinedlinktags = require("./get-css-inlined-link-tags");
 | |
| const _getpreloadablefonts = require("./get-preloadable-fonts");
 | |
| const _createflightrouterstatefromloadertree = require("./create-flight-router-state-from-loader-tree");
 | |
| const _parseloadertree = require("./parse-loader-tree");
 | |
| const _getlayerassets = require("./get-layer-assets");
 | |
| const _hasloadingcomponentintree = require("./has-loading-component-in-tree");
 | |
| const _createcomponenttree = require("./create-component-tree");
 | |
| const _segment = require("../../shared/lib/segment");
 | |
| function _interop_require_default(obj) {
 | |
|     return obj && obj.__esModule ? obj : {
 | |
|         default: obj
 | |
|     };
 | |
| }
 | |
| async function walkTreeWithFlightRouterState({ createSegmentPath, loaderTreeToFilter, parentParams, isFirst, flightRouterState, parentRendered, rscPayloadHead, injectedCSS, injectedJS, injectedFontPreloadTags, rootLayoutIncluded, asNotFound, metadataOutlet, ctx }) {
 | |
|     const { renderOpts: { nextFontManifest, experimental }, query, isPrefetch, getDynamicParamFromSegment, componentMod: { tree: loaderTree } } = ctx;
 | |
|     const [segment, parallelRoutes, components] = loaderTreeToFilter;
 | |
|     const parallelRoutesKeys = Object.keys(parallelRoutes);
 | |
|     const { layout } = components;
 | |
|     const isLayout = typeof layout !== "undefined";
 | |
|     /**
 | |
|    * Checks if the current segment is a root layout.
 | |
|    */ const rootLayoutAtThisLevel = isLayout && !rootLayoutIncluded;
 | |
|     /**
 | |
|    * Checks if the current segment or any level above it has a root layout.
 | |
|    */ const rootLayoutIncludedAtThisLevelOrAbove = rootLayoutIncluded || rootLayoutAtThisLevel;
 | |
|     // Because this function walks to a deeper point in the tree to start rendering we have to track the dynamic parameters up to the point where rendering starts
 | |
|     const segmentParam = getDynamicParamFromSegment(segment);
 | |
|     const currentParams = // Handle null case where dynamic param is optional
 | |
|     segmentParam && segmentParam.value !== null ? {
 | |
|         ...parentParams,
 | |
|         [segmentParam.param]: segmentParam.value
 | |
|     } : parentParams;
 | |
|     const actualSegment = (0, _createflightrouterstatefromloadertree.addSearchParamsIfPageSegment)(segmentParam ? segmentParam.treeSegment : segment, query);
 | |
|     /**
 | |
|    * Decide if the current segment is where rendering has to start.
 | |
|    */ const renderComponentsOnThisLevel = // No further router state available
 | |
|     !flightRouterState || // Segment in router state does not match current segment
 | |
|     !(0, _matchsegments.matchSegment)(actualSegment, flightRouterState[0]) || // Last item in the tree
 | |
|     parallelRoutesKeys.length === 0 || // Explicit refresh
 | |
|     flightRouterState[3] === "refetch";
 | |
|     const shouldSkipComponentTree = // loading.tsx has no effect on prefetching when PPR is enabled
 | |
|     !experimental.ppr && isPrefetch && !Boolean(components.loading) && (flightRouterState || // If there is no flightRouterState, we need to check the entire loader tree, as otherwise we'll be only checking the root
 | |
|     !(0, _hasloadingcomponentintree.hasLoadingComponentInTree)(loaderTree));
 | |
|     if (!parentRendered && renderComponentsOnThisLevel) {
 | |
|         const overriddenSegment = flightRouterState && (0, _matchsegments.canSegmentBeOverridden)(actualSegment, flightRouterState[0]) ? flightRouterState[0] : actualSegment;
 | |
|         const routerState = (0, _createflightrouterstatefromloadertree.createFlightRouterStateFromLoaderTree)(// Create router state using the slice of the loaderTree
 | |
|         loaderTreeToFilter, getDynamicParamFromSegment, query);
 | |
|         if (shouldSkipComponentTree) {
 | |
|             // Send only the router state
 | |
|             return [
 | |
|                 [
 | |
|                     overriddenSegment,
 | |
|                     routerState,
 | |
|                     null,
 | |
|                     null
 | |
|                 ]
 | |
|             ];
 | |
|         } else {
 | |
|             // Create component tree using the slice of the loaderTree
 | |
|             const { seedData } = await (0, _createcomponenttree.createComponentTree)(// This ensures flightRouterPath is valid and filters down the tree
 | |
|             {
 | |
|                 ctx,
 | |
|                 createSegmentPath,
 | |
|                 loaderTree: loaderTreeToFilter,
 | |
|                 parentParams: currentParams,
 | |
|                 firstItem: isFirst,
 | |
|                 injectedCSS,
 | |
|                 injectedJS,
 | |
|                 injectedFontPreloadTags,
 | |
|                 // This is intentionally not "rootLayoutIncludedAtThisLevelOrAbove" as createComponentTree starts at the current level and does a check for "rootLayoutAtThisLevel" too.
 | |
|                 rootLayoutIncluded,
 | |
|                 asNotFound,
 | |
|                 metadataOutlet
 | |
|             });
 | |
|             // Create head
 | |
|             const { layoutOrPagePath } = (0, _parseloadertree.parseLoaderTree)(loaderTreeToFilter);
 | |
|             const layerAssets = (0, _getlayerassets.getLayerAssets)({
 | |
|                 ctx,
 | |
|                 layoutOrPagePath,
 | |
|                 injectedCSS: new Set(injectedCSS),
 | |
|                 injectedJS: new Set(injectedJS),
 | |
|                 injectedFontPreloadTags: new Set(injectedFontPreloadTags)
 | |
|             });
 | |
|             const head = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
 | |
|                 children: [
 | |
|                     layerAssets,
 | |
|                     rscPayloadHead
 | |
|                 ]
 | |
|             });
 | |
|             return [
 | |
|                 [
 | |
|                     overriddenSegment,
 | |
|                     routerState,
 | |
|                     seedData,
 | |
|                     head
 | |
|                 ]
 | |
|             ];
 | |
|         }
 | |
|     }
 | |
|     // If we are not rendering on this level we need to check if the current
 | |
|     // segment has a layout. If so, we need to track all the used CSS to make
 | |
|     // the result consistent.
 | |
|     const layoutPath = layout == null ? void 0 : layout[1];
 | |
|     const injectedCSSWithCurrentLayout = new Set(injectedCSS);
 | |
|     const injectedJSWithCurrentLayout = new Set(injectedJS);
 | |
|     const injectedFontPreloadTagsWithCurrentLayout = new Set(injectedFontPreloadTags);
 | |
|     if (layoutPath) {
 | |
|         (0, _getcssinlinedlinktags.getLinkAndScriptTags)(ctx.clientReferenceManifest, layoutPath, injectedCSSWithCurrentLayout, injectedJSWithCurrentLayout, true);
 | |
|         (0, _getpreloadablefonts.getPreloadableFonts)(nextFontManifest, layoutPath, injectedFontPreloadTagsWithCurrentLayout);
 | |
|     }
 | |
|     // Walk through all parallel routes.
 | |
|     const paths = (await Promise.all(parallelRoutesKeys.map(async (parallelRouteKey)=>{
 | |
|         // for (const parallelRouteKey of parallelRoutesKeys) {
 | |
|         const parallelRoute = parallelRoutes[parallelRouteKey];
 | |
|         const currentSegmentPath = isFirst ? [
 | |
|             parallelRouteKey
 | |
|         ] : [
 | |
|             actualSegment,
 | |
|             parallelRouteKey
 | |
|         ];
 | |
|         const path = await walkTreeWithFlightRouterState({
 | |
|             ctx,
 | |
|             createSegmentPath: (child)=>{
 | |
|                 return createSegmentPath([
 | |
|                     ...currentSegmentPath,
 | |
|                     ...child
 | |
|                 ]);
 | |
|             },
 | |
|             loaderTreeToFilter: parallelRoute,
 | |
|             parentParams: currentParams,
 | |
|             flightRouterState: flightRouterState && flightRouterState[1][parallelRouteKey],
 | |
|             parentRendered: parentRendered || renderComponentsOnThisLevel,
 | |
|             isFirst: false,
 | |
|             rscPayloadHead,
 | |
|             injectedCSS: injectedCSSWithCurrentLayout,
 | |
|             injectedJS: injectedJSWithCurrentLayout,
 | |
|             injectedFontPreloadTags: injectedFontPreloadTagsWithCurrentLayout,
 | |
|             rootLayoutIncluded: rootLayoutIncludedAtThisLevelOrAbove,
 | |
|             asNotFound,
 | |
|             metadataOutlet
 | |
|         });
 | |
|         return path.map((item)=>{
 | |
|             // we don't need to send over default routes in the flight data
 | |
|             // because they are always ignored by the client, unless it's a refetch
 | |
|             if (item[0] === _segment.DEFAULT_SEGMENT_KEY && flightRouterState && !!flightRouterState[1][parallelRouteKey][0] && flightRouterState[1][parallelRouteKey][3] !== "refetch") {
 | |
|                 return null;
 | |
|             }
 | |
|             return [
 | |
|                 actualSegment,
 | |
|                 parallelRouteKey,
 | |
|                 ...item
 | |
|             ];
 | |
|         }).filter(Boolean);
 | |
|     }))).flat();
 | |
|     return paths;
 | |
| }
 | |
| 
 | |
| //# sourceMappingURL=walk-tree-with-flight-router-state.js.map
 |