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

189 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) {
return tree(tree_1.rootNode(urlTree), 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) :
[];
var newRoot = constructNewTree(tree_1.rootNode(urlTree), 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) {
return tree_1.rootNode(urlTree);
}
else {
var urlSegment = findUrlSegment(route, urlTree, normalizedChange.numberOfDoubleDots);
return findMatchingNode(urlSegment, tree_1.rootNode(urlTree));
}
}
function findUrlSegment(route, urlTree, numberOfDoubleDots) {
var segments = route.urlSegments.value;
var urlSegment = segments[segments.length - 1];
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));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3VybF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWF0ZV91cmxfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUJBQXNELFlBQVksQ0FBQyxDQUFBO0FBQ25FLHFCQUFtQyxjQUFjLENBQUMsQ0FBQTtBQUNsRCwyQkFBc0Msb0JBQW9CLENBQUMsQ0FBQTtBQUUzRCx1QkFBdUMsVUFBVSxDQUFDLENBQUE7QUFFbEQsdUJBQThCLEtBQXFCLEVBQUUsT0FBZ0IsRUFBRSxRQUFlLEVBQ3hELGVBQW1DLEVBQUUsUUFBNEI7SUFDN0YsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELElBQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFRLENBQWEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxJQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsSUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2xELFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUFD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