"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "applyRouterStatePatchToTree", { enumerable: true, get: function() { return applyRouterStatePatchToTree; } }); const _matchsegments = require("../match-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 we can ignore it and return the initial tree // this is because the __DEFAULT__ segment is used as a placeholder on navigation if (patchSegment === "__DEFAULT__" && initialSegment !== "__DEFAULT__") { 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 ]; 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) { const [segment, parallelRoutes, , , isRootLayout] = flightRouterState; // Root refresh if (flightSegmentPath.length === 1) { const tree = applyPatch(flightRouterState, treePatch); 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(flightSegmentPath.slice(2), parallelRoutes[parallelRouteKey], treePatch); if (parallelRoutePatch === null) { return null; } } const tree = [ flightSegmentPath[0], { ...parallelRoutes, [parallelRouteKey]: parallelRoutePatch } ]; // Current segment is the root layout if (isRootLayout) { tree[4] = true; } 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