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
		
	
| 
											9 months ago
										 | "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
 |