UNPKG

next

Version:

The React Framework

105 lines (103 loc) 4.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "applyRouterStatePatchToTree", { enumerable: true, get: function() { return applyRouterStatePatchToTree; } }); const _segment = require("../../../shared/lib/segment"); const _flightdatahelpers = require("../../flight-data-helpers"); const _matchsegments = require("../match-segments"); const _refetchinactiveparallelsegments = require("./refetch-inactive-parallel-segments"); /** * Deep merge of the two router states. Parallel route keys are preserved if the patch doesn't have them. */ function applyPatch(initialTree, patchTree) { const [initialSegment, initialParallelRoutes] = initialTree; const [patchSegment, patchParallelRoutes] = patchTree; // if the applied patch segment is __DEFAULT__ then it can be ignored in favor of the initial tree // this is because the __DEFAULT__ segment is used as a placeholder on navigation if (patchSegment === _segment.DEFAULT_SEGMENT_KEY && initialSegment !== _segment.DEFAULT_SEGMENT_KEY) { return initialTree; } if ((0, _matchsegments.matchSegment)(initialSegment, patchSegment)) { const newParallelRoutes = {}; for(const key in initialParallelRoutes){ const isInPatchTreeParallelRoutes = typeof patchParallelRoutes[key] !== 'undefined'; if (isInPatchTreeParallelRoutes) { newParallelRoutes[key] = applyPatch(initialParallelRoutes[key], patchParallelRoutes[key]); } else { newParallelRoutes[key] = initialParallelRoutes[key]; } } for(const key in patchParallelRoutes){ if (newParallelRoutes[key]) { continue; } newParallelRoutes[key] = patchParallelRoutes[key]; } const tree = [ initialSegment, newParallelRoutes ]; // Copy over the existing tree if (initialTree[2]) { tree[2] = initialTree[2]; } if (initialTree[3]) { tree[3] = initialTree[3]; } if (initialTree[4]) { tree[4] = initialTree[4]; } return tree; } return patchTree; } function applyRouterStatePatchToTree(flightSegmentPath, flightRouterState, treePatch, path) { const [segment, parallelRoutes, url, refetch, isRootLayout] = flightRouterState; // Root refresh if (flightSegmentPath.length === 1) { const tree = applyPatch(flightRouterState, treePatch); (0, _refetchinactiveparallelsegments.addRefreshMarkerToActiveParallelSegments)(tree, path); return tree; } const [currentSegment, parallelRouteKey] = flightSegmentPath; // Tree path returned from the server should always match up with the current tree in the browser if (!(0, _matchsegments.matchSegment)(currentSegment, segment)) { return null; } const lastSegment = flightSegmentPath.length === 2; let parallelRoutePatch; if (lastSegment) { parallelRoutePatch = applyPatch(parallelRoutes[parallelRouteKey], treePatch); } else { parallelRoutePatch = applyRouterStatePatchToTree((0, _flightdatahelpers.getNextFlightSegmentPath)(flightSegmentPath), parallelRoutes[parallelRouteKey], treePatch, path); if (parallelRoutePatch === null) { return null; } } const tree = [ flightSegmentPath[0], { ...parallelRoutes, [parallelRouteKey]: parallelRoutePatch }, url, refetch ]; // Current segment is the root layout if (isRootLayout) { tree[4] = true; } (0, _refetchinactiveparallelsegments.addRefreshMarkerToActiveParallelSegments)(tree, path); return tree; } if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') { Object.defineProperty(exports.default, '__esModule', { value: true }); Object.assign(exports.default, exports); module.exports = exports.default; } //# sourceMappingURL=apply-router-state-patch-to-tree.js.map