mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
189 lines
29 KiB
JavaScript
189 lines
29 KiB
JavaScript
|
|
"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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
|