2016-05-27 18:36:17 +00:00
|
|
|
"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);
|
2016-05-27 18:36:17 +00:00
|
|
|
}
|
|
|
|
|
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);
|
2016-05-27 18:36:17 +00:00
|
|
|
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;
|
2016-05-27 18:36:17 +00:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
var urlSegment = findUrlSegment(route, urlTree, normalizedChange.numberOfDoubleDots);
|
2016-06-02 22:30:49 +00:00
|
|
|
return findMatchingNode(urlSegment, urlTree._root);
|
2016-05-27 18:36:17 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function findUrlSegment(route, urlTree, numberOfDoubleDots) {
|
2016-06-02 22:30:49 +00:00
|
|
|
var urlSegment = route.snapshot._lastUrlSegment;
|
2016-05-27 18:36:17 +00:00
|
|
|
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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
|