angular/modules/@angular/router/build/src/create_url_tree.js

188 lines
29 KiB
JavaScript
Raw Normal View History

"use strict";
var url_tree_1 = require('./url_tree');
var tree_1 = require('./utils/tree');
var collection_1 = require('./utils/collection');
var shared_1 = require('./shared');
function createUrlTree(route, urlTree, commands, queryParameters, fragment) {
if (commands.length === 0) {
2016-06-02 22:30:49 +00:00
return tree(urlTree._root, urlTree, queryParameters, fragment);
}
var normalizedCommands = normalizeCommands(commands);
if (navigateToRoot(normalizedCommands)) {
return tree(new tree_1.TreeNode(urlTree.root, []), urlTree, queryParameters, fragment);
}
var startingNode = findStartingNode(normalizedCommands, urlTree, route);
var updated = normalizedCommands.commands.length > 0 ?
updateMany(startingNode.children.slice(0), normalizedCommands.commands) :
[];
2016-06-02 22:30:49 +00:00
var newRoot = constructNewTree(urlTree._root, startingNode, updated);
return tree(newRoot, urlTree, queryParameters, fragment);
}
exports.createUrlTree = createUrlTree;
function tree(root, urlTree, queryParameters, fragment) {
var q = queryParameters ? stringify(queryParameters) : urlTree.queryParameters;
var f = fragment ? fragment : urlTree.fragment;
return new url_tree_1.UrlTree(root, q, f);
}
function navigateToRoot(normalizedChange) {
return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 &&
normalizedChange.commands[0] == "/";
}
var NormalizedNavigationCommands = (function () {
function NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, commands) {
this.isAbsolute = isAbsolute;
this.numberOfDoubleDots = numberOfDoubleDots;
this.commands = commands;
}
return NormalizedNavigationCommands;
}());
function normalizeCommands(commands) {
if ((typeof commands[0] === "string") && commands.length === 1 && commands[0] == "/") {
return new NormalizedNavigationCommands(true, 0, commands);
}
var numberOfDoubleDots = 0;
var isAbsolute = false;
var res = [];
for (var i = 0; i < commands.length; ++i) {
var c = commands[i];
if (!(typeof c === "string")) {
res.push(c);
continue;
}
var parts = c.split('/');
for (var j = 0; j < parts.length; ++j) {
var cc = parts[j];
if (i == 0) {
if (j == 0 && cc == ".") {
}
else if (j == 0 && cc == "") {
isAbsolute = true;
}
else if (cc == "..") {
numberOfDoubleDots++;
}
else if (cc != '') {
res.push(cc);
}
}
else {
if (cc != '') {
res.push(cc);
}
}
}
}
return new NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res);
}
function findStartingNode(normalizedChange, urlTree, route) {
if (normalizedChange.isAbsolute) {
2016-06-02 22:30:49 +00:00
return urlTree._root;
}
else {
var urlSegment = findUrlSegment(route, urlTree, normalizedChange.numberOfDoubleDots);
2016-06-02 22:30:49 +00:00
return findMatchingNode(urlSegment, urlTree._root);
}
}
function findUrlSegment(route, urlTree, numberOfDoubleDots) {
2016-06-02 22:30:49 +00:00
var urlSegment = route.snapshot._lastUrlSegment;
var path = urlTree.pathFromRoot(urlSegment);
if (path.length <= numberOfDoubleDots) {
throw new Error("Invalid number of '../'");
}
return path[path.length - 1 - numberOfDoubleDots];
}
function findMatchingNode(segment, node) {
if (node.value === segment)
return node;
for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
var c = _a[_i];
var r = findMatchingNode(segment, c);
if (r)
return r;
}
throw new Error("Cannot find url segment '" + segment + "'");
}
function constructNewTree(node, original, updated) {
if (node === original) {
return new tree_1.TreeNode(node.value, updated);
}
else {
return new tree_1.TreeNode(node.value, node.children.map(function (c) { return constructNewTree(c, original, updated); }));
}
}
function updateMany(nodes, commands) {
var outlet = getOutlet(commands);
var nodesInRightOutlet = nodes.filter(function (c) { return c.value.outlet === outlet; });
if (nodesInRightOutlet.length > 0) {
var nodeRightOutlet = nodesInRightOutlet[0];
nodes[nodes.indexOf(nodeRightOutlet)] = update(nodeRightOutlet, commands);
}
else {
nodes.push(update(null, commands));
}
return nodes;
}
function getPath(commands) {
if (!(typeof commands[0] === "string"))
return commands[0];
var parts = commands[0].toString().split(":");
return parts.length > 1 ? parts[1] : commands[0];
}
function getOutlet(commands) {
if (!(typeof commands[0] === "string"))
return shared_1.PRIMARY_OUTLET;
var parts = commands[0].toString().split(":");
return parts.length > 1 ? parts[0] : shared_1.PRIMARY_OUTLET;
}
function update(node, commands) {
var rest = commands.slice(1);
var next = rest.length === 0 ? null : rest[0];
var outlet = getOutlet(commands);
var path = getPath(commands);
if (!node && !(typeof next === 'object')) {
var urlSegment = new url_tree_1.UrlSegment(path, {}, outlet);
var children = rest.length === 0 ? [] : [update(null, rest)];
return new tree_1.TreeNode(urlSegment, children);
}
else if (!node && typeof next === 'object') {
var urlSegment = new url_tree_1.UrlSegment(path, stringify(next), outlet);
return recurse(urlSegment, node, rest.slice(1));
}
else if (node && outlet !== node.value.outlet) {
return node;
}
else if (node && typeof path === 'object') {
var newSegment = new url_tree_1.UrlSegment(node.value.path, stringify(path), node.value.outlet);
return recurse(newSegment, node, rest);
}
else if (node && typeof next === 'object' && compare(path, stringify(next), node.value)) {
return recurse(node.value, node, rest.slice(1));
}
else if (node && typeof next === 'object') {
var urlSegment = new url_tree_1.UrlSegment(path, stringify(next), outlet);
return recurse(urlSegment, node, rest.slice(1));
}
else if (node && compare(path, {}, node.value)) {
return recurse(node.value, node, rest);
}
else {
var urlSegment = new url_tree_1.UrlSegment(path, {}, outlet);
return recurse(urlSegment, node, rest);
}
}
function stringify(params) {
var res = {};
collection_1.forEach(params, function (v, k) { return res[k] = v.toString(); });
return res;
}
function compare(path, params, segment) {
return path == segment.path && collection_1.shallowEqual(params, segment.parameters);
}
function recurse(urlSegment, node, rest) {
if (rest.length === 0) {
return new tree_1.TreeNode(urlSegment, []);
}
var children = node ? node.children.slice(0) : [];
return new tree_1.TreeNode(urlSegment, updateMany(children, rest));
}
2016-06-02 22:30:49 +00:00
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3VybF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWF0ZV91cmxfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUJBQXNELFlBQVksQ0FBQyxDQUFBO0FBQ25FLHFCQUF5QixjQUFjLENBQUMsQ0FBQTtBQUN4QywyQkFBc0Msb0JBQW9CLENBQUMsQ0FBQTtBQUUzRCx1QkFBdUMsVUFBVSxDQUFDLENBQUE7QUFFbEQsdUJBQThCLEtBQXFCLEVBQUUsT0FBZ0IsRUFBRSxRQUFlLEVBQ3hELGVBQW1DLEVBQUUsUUFBNEI7SUFDN0YsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksZUFBUSxDQUFhLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLElBQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1FBQ3ZFLEVB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