UNPKG

router5-transition-path

Version:
128 lines (119 loc) 4.95 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var nameToIDs = function (name) { return name .split('.') .reduce(function (ids, name) { return ids.concat(ids.length ? ids[ids.length - 1] + '.' + name : name); }, []); }; var exists = function (val) { return val !== undefined && val !== null; }; var hasMetaParams = function (state) { return state && state.meta && state.meta.params; }; var extractSegmentParams = function (name, state) { if (!hasMetaParams(state) || !exists(state.meta.params[name])) return {}; return Object.keys(state.meta.params[name]).reduce(function (params, p) { params[p] = state.params[p]; return params; }, {}); }; function transitionPath(toState, fromState) { var toStateOptions = (toState.meta && toState.meta && toState.meta.options) || {}; var fromStateIds = fromState ? nameToIDs(fromState.name) : []; var toStateIds = nameToIDs(toState.name); var maxI = Math.min(fromStateIds.length, toStateIds.length); function pointOfDifference() { var i; var _loop_1 = function () { var left = fromStateIds[i]; var right = toStateIds[i]; if (left !== right) return { value: i }; var leftParams = extractSegmentParams(left, toState); var rightParams = extractSegmentParams(right, fromState); if (Object.keys(leftParams).length !== Object.keys(rightParams).length) return { value: i }; if (Object.keys(leftParams).length === 0) return "continue"; var different = Object.keys(leftParams).some(function (p) { return rightParams[p] !== leftParams[p]; }); if (different) { return { value: i }; } }; for (i = 0; i < maxI; i += 1) { var state_1 = _loop_1(); if (typeof state_1 === "object") return state_1.value; } return i; } var i; if (!fromState || toStateOptions.reload) { i = 0; } else if (!hasMetaParams(fromState) && !hasMetaParams(toState)) { i = 0; } else { i = pointOfDifference(); } var toDeactivate = fromStateIds.slice(i).reverse(); var toActivate = toStateIds.slice(i); var intersection = fromState && i > 0 ? fromStateIds[i - 1] : ''; return { intersection: intersection, toDeactivate: toDeactivate, toActivate: toActivate }; } /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ function __spreadArrays() { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; } function shouldUpdateNode(nodeName) { return function (toState, fromSate) { var _a = transitionPath(toState, fromSate), intersection = _a.intersection, toActivate = _a.toActivate, toDeactivateReversed = _a.toDeactivate; var toDeactivate = __spreadArrays(toDeactivateReversed).reverse(); if (toState.meta.options && toState.meta.options.reload) { return true; } if (nodeName === intersection) { return true; } if (toActivate.indexOf(nodeName) === -1) { return false; } var matching = true; for (var i = 0; i < toActivate.length; i += 1) { var activatedSegment = toActivate[i]; var sameLevelDeactivatedSegment = toDeactivate[i]; matching = activatedSegment === sameLevelDeactivatedSegment; if (matching && activatedSegment === nodeName) { return true; } if (!matching) { return false; } } return false; }; } exports.default = transitionPath; exports.nameToIDs = nameToIDs; exports.shouldUpdateNode = shouldUpdateNode;