router5-transition-path
Version:
Router5 transition path helper function
128 lines (119 loc) • 4.95 kB
JavaScript
;
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;