@angular/router 0.1.0 → 2.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/router.umd.js +1812 -0
- package/bundles/router.umd.min.js +2 -0
- package/esm/index.d.ts +15 -0
- package/esm/index.js +15 -0
- package/esm/index.js.map +1 -0
- package/esm/src/constants.d.ts +5 -0
- package/esm/src/constants.js +6 -0
- package/esm/src/constants.js.map +1 -0
- package/esm/src/constants.metadata.json +1 -0
- package/esm/src/core_private.d.ts +3 -0
- package/esm/src/core_private.js +4 -0
- package/esm/src/core_private.js.map +1 -0
- package/esm/src/core_private.metadata.json +1 -0
- package/esm/src/directives/router_directives.d.ts +21 -0
- package/esm/src/directives/router_directives.js +24 -0
- package/esm/src/directives/router_directives.js.map +1 -0
- package/esm/src/directives/router_directives.metadata.json +1 -0
- package/esm/src/directives/router_link.d.ts +49 -0
- package/esm/src/directives/router_link.js +68 -0
- package/esm/src/directives/router_link.js.map +1 -0
- package/esm/src/directives/router_link.metadata.json +1 -0
- package/esm/src/directives/router_outlet.d.ts +36 -0
- package/esm/src/directives/router_outlet.js +42 -0
- package/esm/src/directives/router_outlet.js.map +1 -0
- package/esm/src/directives/router_outlet.metadata.json +1 -0
- package/esm/src/facade/async.d.ts +90 -0
- package/esm/src/facade/async.js +137 -0
- package/esm/src/facade/async.js.map +1 -0
- package/esm/src/facade/base_wrapped_exception.d.ts +14 -0
- package/esm/src/facade/base_wrapped_exception.js +17 -0
- package/esm/src/facade/base_wrapped_exception.js.map +1 -0
- package/esm/src/facade/collection.d.ts +103 -0
- package/esm/src/facade/collection.js +343 -0
- package/esm/src/facade/collection.js.map +1 -0
- package/esm/src/facade/collection.metadata.json +1 -0
- package/esm/src/facade/exception_handler.d.ts +29 -0
- package/esm/src/facade/exception_handler.js +124 -0
- package/esm/src/facade/exception_handler.js.map +1 -0
- package/esm/src/facade/exceptions.d.ts +32 -0
- package/esm/src/facade/exceptions.js +42 -0
- package/esm/src/facade/exceptions.js.map +1 -0
- package/esm/src/facade/exceptions.metadata.json +1 -0
- package/esm/src/facade/lang.d.ts +158 -0
- package/esm/src/facade/lang.js +386 -0
- package/esm/src/facade/lang.js.map +1 -0
- package/esm/src/facade/lang.metadata.json +1 -0
- package/esm/src/facade/promise.d.ts +17 -0
- package/esm/src/facade/promise.js +41 -0
- package/esm/src/facade/promise.js.map +1 -0
- package/esm/src/interfaces.d.ts +23 -0
- package/esm/src/interfaces.js +1 -0
- package/esm/src/interfaces.js.map +1 -0
- package/esm/src/lifecycle_reflector.d.ts +1 -0
- package/esm/src/lifecycle_reflector.js +10 -0
- package/esm/src/lifecycle_reflector.js.map +1 -0
- package/esm/src/link.d.ts +2 -0
- package/esm/src/link.js +183 -0
- package/esm/src/link.js.map +1 -0
- package/esm/src/metadata/decorators.d.ts +16 -0
- package/esm/src/metadata/decorators.js +9 -0
- package/esm/src/metadata/decorators.js.map +1 -0
- package/esm/src/metadata/decorators.metadata.json +1 -0
- package/esm/src/metadata/metadata.d.ts +48 -0
- package/esm/src/metadata/metadata.js +48 -0
- package/esm/src/metadata/metadata.js.map +1 -0
- package/esm/src/recognize.d.ts +4 -0
- package/esm/src/recognize.js +164 -0
- package/esm/src/recognize.js.map +1 -0
- package/esm/src/router.d.ts +95 -0
- package/esm/src/router.js +243 -0
- package/esm/src/router.js.map +1 -0
- package/esm/src/router_providers.d.ts +23 -0
- package/esm/src/router_providers.js +26 -0
- package/esm/src/router_providers.js.map +1 -0
- package/esm/src/router_providers.metadata.json +1 -0
- package/esm/src/router_providers_common.d.ts +11 -0
- package/esm/src/router_providers_common.js +32 -0
- package/esm/src/router_providers_common.js.map +1 -0
- package/esm/src/router_providers_common.metadata.json +1 -0
- package/esm/src/router_url_serializer.d.ts +21 -0
- package/esm/src/router_url_serializer.js +164 -0
- package/esm/src/router_url_serializer.js.map +1 -0
- package/esm/src/segments.d.ts +51 -0
- package/esm/src/segments.js +137 -0
- package/esm/src/segments.js.map +1 -0
- package/esm/src/segments.metadata.json +1 -0
- package/esm/testing/router_testing_providers.d.ts +1 -0
- package/esm/testing/router_testing_providers.js +31 -0
- package/esm/testing/router_testing_providers.js.map +1 -0
- package/esm/testing/router_testing_providers.metadata.json +1 -0
- package/esm/testing.d.ts +1 -0
- package/esm/testing.js +2 -0
- package/esm/testing.js.map +1 -0
- package/index.d.ts +15 -0
- package/index.js +31 -0
- package/index.js.map +1 -0
- package/package.json +16 -1
- package/src/constants.d.ts +5 -0
- package/src/constants.js +7 -0
- package/src/constants.js.map +1 -0
- package/src/constants.metadata.json +1 -0
- package/src/core_private.d.ts +3 -0
- package/src/core_private.js +5 -0
- package/src/core_private.js.map +1 -0
- package/src/core_private.metadata.json +1 -0
- package/src/directives/router_directives.d.ts +21 -0
- package/src/directives/router_directives.js +25 -0
- package/src/directives/router_directives.js.map +1 -0
- package/src/directives/router_directives.metadata.json +1 -0
- package/src/directives/router_link.d.ts +49 -0
- package/src/directives/router_link.js +76 -0
- package/src/directives/router_link.js.map +1 -0
- package/src/directives/router_link.metadata.json +1 -0
- package/src/directives/router_outlet.d.ts +36 -0
- package/src/directives/router_outlet.js +53 -0
- package/src/directives/router_outlet.js.map +1 -0
- package/src/directives/router_outlet.metadata.json +1 -0
- package/src/facade/async.d.ts +90 -0
- package/src/facade/async.js +160 -0
- package/src/facade/async.js.map +1 -0
- package/src/facade/base_wrapped_exception.d.ts +14 -0
- package/src/facade/base_wrapped_exception.js +50 -0
- package/src/facade/base_wrapped_exception.js.map +1 -0
- package/src/facade/collection.d.ts +103 -0
- package/src/facade/collection.js +368 -0
- package/src/facade/collection.js.map +1 -0
- package/src/facade/collection.metadata.json +1 -0
- package/src/facade/exception_handler.d.ts +29 -0
- package/src/facade/exception_handler.js +133 -0
- package/src/facade/exception_handler.js.map +1 -0
- package/src/facade/exceptions.d.ts +32 -0
- package/src/facade/exceptions.js +82 -0
- package/src/facade/exceptions.js.map +1 -0
- package/src/facade/exceptions.metadata.json +1 -0
- package/src/facade/lang.d.ts +158 -0
- package/src/facade/lang.js +480 -0
- package/src/facade/lang.js.map +1 -0
- package/src/facade/lang.metadata.json +1 -0
- package/src/facade/promise.d.ts +17 -0
- package/src/facade/promise.js +49 -0
- package/src/facade/promise.js.map +1 -0
- package/src/interfaces.d.ts +23 -0
- package/src/interfaces.js +2 -0
- package/src/interfaces.js.map +1 -0
- package/src/lifecycle_reflector.d.ts +1 -0
- package/src/lifecycle_reflector.js +12 -0
- package/src/lifecycle_reflector.js.map +1 -0
- package/src/link.d.ts +2 -0
- package/src/link.js +189 -0
- package/src/link.js.map +1 -0
- package/src/metadata/decorators.d.ts +16 -0
- package/src/metadata/decorators.js +10 -0
- package/src/metadata/decorators.js.map +1 -0
- package/src/metadata/decorators.metadata.json +1 -0
- package/src/metadata/metadata.d.ts +48 -0
- package/src/metadata/metadata.js +66 -0
- package/src/metadata/metadata.js.map +1 -0
- package/src/recognize.d.ts +4 -0
- package/src/recognize.js +172 -0
- package/src/recognize.js.map +1 -0
- package/src/router.d.ts +95 -0
- package/src/router.js +276 -0
- package/src/router.js.map +1 -0
- package/src/router_providers.d.ts +23 -0
- package/src/router_providers.js +27 -0
- package/src/router_providers.js.map +1 -0
- package/src/router_providers.metadata.json +1 -0
- package/src/router_providers_common.d.ts +11 -0
- package/src/router_providers_common.js +35 -0
- package/src/router_providers_common.js.map +1 -0
- package/src/router_providers_common.metadata.json +1 -0
- package/src/router_url_serializer.d.ts +21 -0
- package/src/router_url_serializer.js +184 -0
- package/src/router_url_serializer.js.map +1 -0
- package/src/segments.d.ts +51 -0
- package/src/segments.js +181 -0
- package/src/segments.js.map +1 -0
- package/src/segments.metadata.json +1 -0
- package/testing/router_testing_providers.d.ts +1 -0
- package/testing/router_testing_providers.js +35 -0
- package/testing/router_testing_providers.js.map +1 -0
- package/testing/router_testing_providers.metadata.json +1 -0
- package/testing.d.ts +1 -0
- package/testing.js +6 -0
- package/testing.js.map +1 -0
- package/angular1/angular_1_router.js +0 -2922
- package/angular1/ng_route_shim.js +0 -349
- package/angular2/router.dev.js +0 -3107
- package/angular2/router.js +0 -3107
- package/angular2/router.min.js +0 -3
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RouteSegment, RouteTree } from './segments';
|
|
2
|
+
/**
|
|
3
|
+
* Defines route lifecycle method `routerOnActivate`, which is called by the router at the end of a
|
|
4
|
+
* successful route navigation.
|
|
5
|
+
*
|
|
6
|
+
* The `routerOnActivate` hook is called with the current and previous {@link RouteSegment}s of the
|
|
7
|
+
* component and with the corresponding route trees.
|
|
8
|
+
*/
|
|
9
|
+
export interface OnActivate {
|
|
10
|
+
routerOnActivate(curr: RouteSegment, prev?: RouteSegment, currTree?: RouteTree, prevTree?: RouteTree): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Defines route lifecycle method `routerOnDeactivate`, which is called by the router before
|
|
14
|
+
* destroying a component as part of a route change.
|
|
15
|
+
*
|
|
16
|
+
* The `routerOnDeactivate` hook is called with two {@link RouteTree}s, representing the current
|
|
17
|
+
* and the future state of the application.
|
|
18
|
+
*
|
|
19
|
+
* `routerOnDeactivate` must return a promise. The route change will wait until the promise settles.
|
|
20
|
+
*/
|
|
21
|
+
export interface CanDeactivate {
|
|
22
|
+
routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree): Promise<boolean>;
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import {RouteSegment, RouteTree, Tree} from './segments';\n\n\n/**\n * Defines route lifecycle method `routerOnActivate`, which is called by the router at the end of a\n * successful route navigation.\n *\n * The `routerOnActivate` hook is called with the current and previous {@link RouteSegment}s of the\n * component and with the corresponding route trees.\n */\nexport interface OnActivate {\n routerOnActivate(\n curr: RouteSegment, prev?: RouteSegment, currTree?: RouteTree, prevTree?: RouteTree): void;\n}\n\n/**\n * Defines route lifecycle method `routerOnDeactivate`, which is called by the router before\n * destroying a component as part of a route change.\n *\n * The `routerOnDeactivate` hook is called with two {@link RouteTree}s, representing the current\n * and the future state of the application.\n *\n * `routerOnDeactivate` must return a promise. The route change will wait until the promise settles.\n */\nexport interface CanDeactivate {\n routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree): Promise<boolean>;\n}\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function hasLifecycleHook(name: string, obj: Object): boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var lang_1 = require('./facade/lang');
|
|
3
|
+
function hasLifecycleHook(name, obj) {
|
|
4
|
+
if (lang_1.isBlank(obj))
|
|
5
|
+
return false;
|
|
6
|
+
var type = obj.constructor;
|
|
7
|
+
if (!(type instanceof lang_1.Type))
|
|
8
|
+
return false;
|
|
9
|
+
return name in type.prototype;
|
|
10
|
+
}
|
|
11
|
+
exports.hasLifecycleHook = hasLifecycleHook;
|
|
12
|
+
//# sourceMappingURL=lifecycle_reflector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle_reflector.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/lifecycle_reflector.ts"],"names":[],"mappings":";AAAA,qBAA4B,eAAe,CAAC,CAAA;AAE5C,0BAAiC,IAAY,EAAE,GAAW;IACxD,EAAE,CAAC,CAAC,cAAO,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC;IAC/B,IAAI,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC3B,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,WAAI,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC;IAC1C,MAAM,CAAC,IAAI,IAAU,IAAK,CAAC,SAAS,CAAC;AACvC,CAAC;AALe,wBAAgB,mBAK/B,CAAA","sourcesContent":["import {Type, isBlank} from './facade/lang';\n\nexport function hasLifecycleHook(name: string, obj: Object): boolean {\n if (isBlank(obj)) return false;\n let type = obj.constructor;\n if (!(type instanceof Type)) return false;\n return name in (<any>type).prototype;\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
package/src/link.d.ts
ADDED
package/src/link.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var collection_1 = require('./facade/collection');
|
|
3
|
+
var exceptions_1 = require('./facade/exceptions');
|
|
4
|
+
var lang_1 = require('./facade/lang');
|
|
5
|
+
var segments_1 = require('./segments');
|
|
6
|
+
function link(segment, routeTree, urlTree, commands) {
|
|
7
|
+
if (commands.length === 0)
|
|
8
|
+
return urlTree;
|
|
9
|
+
var normalizedCommands = _normalizeCommands(commands);
|
|
10
|
+
if (_navigateToRoot(normalizedCommands)) {
|
|
11
|
+
return new segments_1.UrlTree(new segments_1.TreeNode(urlTree.root, []));
|
|
12
|
+
}
|
|
13
|
+
var startingNode = _findStartingNode(normalizedCommands, urlTree, segment, routeTree);
|
|
14
|
+
var updated = normalizedCommands.commands.length > 0 ?
|
|
15
|
+
_updateMany(collection_1.ListWrapper.clone(startingNode.children), normalizedCommands.commands) :
|
|
16
|
+
[];
|
|
17
|
+
var newRoot = _constructNewTree(segments_1.rootNode(urlTree), startingNode, updated);
|
|
18
|
+
return new segments_1.UrlTree(newRoot);
|
|
19
|
+
}
|
|
20
|
+
exports.link = link;
|
|
21
|
+
function _navigateToRoot(normalizedChange) {
|
|
22
|
+
return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 &&
|
|
23
|
+
normalizedChange.commands[0] == '/';
|
|
24
|
+
}
|
|
25
|
+
var _NormalizedNavigationCommands = (function () {
|
|
26
|
+
function _NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, commands) {
|
|
27
|
+
this.isAbsolute = isAbsolute;
|
|
28
|
+
this.numberOfDoubleDots = numberOfDoubleDots;
|
|
29
|
+
this.commands = commands;
|
|
30
|
+
}
|
|
31
|
+
return _NormalizedNavigationCommands;
|
|
32
|
+
}());
|
|
33
|
+
function _normalizeCommands(commands) {
|
|
34
|
+
if (lang_1.isString(commands[0]) && commands.length === 1 && commands[0] == '/') {
|
|
35
|
+
return new _NormalizedNavigationCommands(true, 0, commands);
|
|
36
|
+
}
|
|
37
|
+
var numberOfDoubleDots = 0;
|
|
38
|
+
var isAbsolute = false;
|
|
39
|
+
var res = [];
|
|
40
|
+
for (var i = 0; i < commands.length; ++i) {
|
|
41
|
+
var c = commands[i];
|
|
42
|
+
if (!lang_1.isString(c)) {
|
|
43
|
+
res.push(c);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
var parts = c.split('/');
|
|
47
|
+
for (var j = 0; j < parts.length; ++j) {
|
|
48
|
+
var cc = parts[j];
|
|
49
|
+
// first exp is treated in a special way
|
|
50
|
+
if (i == 0) {
|
|
51
|
+
if (j == 0 && cc == '.') {
|
|
52
|
+
}
|
|
53
|
+
else if (j == 0 && cc == '') {
|
|
54
|
+
isAbsolute = true;
|
|
55
|
+
}
|
|
56
|
+
else if (cc == '..') {
|
|
57
|
+
numberOfDoubleDots++;
|
|
58
|
+
}
|
|
59
|
+
else if (cc != '') {
|
|
60
|
+
res.push(cc);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (cc != '') {
|
|
65
|
+
res.push(cc);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return new _NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res);
|
|
71
|
+
}
|
|
72
|
+
function _findUrlSegment(segment, routeTree, urlTree, numberOfDoubleDots) {
|
|
73
|
+
var s = segment;
|
|
74
|
+
while (s.urlSegments.length === 0) {
|
|
75
|
+
s = routeTree.parent(s);
|
|
76
|
+
}
|
|
77
|
+
var urlSegment = collection_1.ListWrapper.last(s.urlSegments);
|
|
78
|
+
var path = urlTree.pathFromRoot(urlSegment);
|
|
79
|
+
if (path.length <= numberOfDoubleDots) {
|
|
80
|
+
throw new exceptions_1.BaseException('Invalid number of \'../\'');
|
|
81
|
+
}
|
|
82
|
+
return path[path.length - 1 - numberOfDoubleDots];
|
|
83
|
+
}
|
|
84
|
+
function _findStartingNode(normalizedChange, urlTree, segment, routeTree) {
|
|
85
|
+
if (normalizedChange.isAbsolute) {
|
|
86
|
+
return segments_1.rootNode(urlTree);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
var urlSegment = _findUrlSegment(segment, routeTree, urlTree, normalizedChange.numberOfDoubleDots);
|
|
90
|
+
return _findMatchingNode(urlSegment, segments_1.rootNode(urlTree));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function _findMatchingNode(segment, node) {
|
|
94
|
+
if (node.value === segment)
|
|
95
|
+
return node;
|
|
96
|
+
for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
|
|
97
|
+
var c = _a[_i];
|
|
98
|
+
var r = _findMatchingNode(segment, c);
|
|
99
|
+
if (lang_1.isPresent(r))
|
|
100
|
+
return r;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
function _constructNewTree(node, original, updated) {
|
|
105
|
+
if (node === original) {
|
|
106
|
+
return new segments_1.TreeNode(node.value, updated);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return new segments_1.TreeNode(node.value, node.children.map(function (c) { return _constructNewTree(c, original, updated); }));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function _update(node, commands) {
|
|
113
|
+
var rest = commands.slice(1);
|
|
114
|
+
var next = rest.length === 0 ? null : rest[0];
|
|
115
|
+
var outlet = _outlet(commands);
|
|
116
|
+
var segment = _segment(commands);
|
|
117
|
+
// reach the end of the tree => create new tree nodes.
|
|
118
|
+
if (lang_1.isBlank(node) && !lang_1.isStringMap(next)) {
|
|
119
|
+
var urlSegment = new segments_1.UrlSegment(segment, {}, outlet);
|
|
120
|
+
var children = rest.length === 0 ? [] : [_update(null, rest)];
|
|
121
|
+
return new segments_1.TreeNode(urlSegment, children);
|
|
122
|
+
}
|
|
123
|
+
else if (lang_1.isBlank(node) && lang_1.isStringMap(next)) {
|
|
124
|
+
var urlSegment = new segments_1.UrlSegment(segment, _stringify(next), outlet);
|
|
125
|
+
return _recurse(urlSegment, node, rest.slice(1));
|
|
126
|
+
}
|
|
127
|
+
else if (outlet != node.value.outlet) {
|
|
128
|
+
return node;
|
|
129
|
+
}
|
|
130
|
+
else if (lang_1.isStringMap(segment)) {
|
|
131
|
+
var newSegment = new segments_1.UrlSegment(node.value.segment, _stringify(segment), node.value.outlet);
|
|
132
|
+
return _recurse(newSegment, node, rest);
|
|
133
|
+
}
|
|
134
|
+
else if (lang_1.isStringMap(next) && _compare(segment, _stringify(next), node.value)) {
|
|
135
|
+
return _recurse(node.value, node, rest.slice(1));
|
|
136
|
+
}
|
|
137
|
+
else if (lang_1.isStringMap(next)) {
|
|
138
|
+
var urlSegment = new segments_1.UrlSegment(segment, _stringify(next), outlet);
|
|
139
|
+
return _recurse(urlSegment, node, rest.slice(1));
|
|
140
|
+
}
|
|
141
|
+
else if (_compare(segment, {}, node.value)) {
|
|
142
|
+
return _recurse(node.value, node, rest);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
var urlSegment = new segments_1.UrlSegment(segment, {}, outlet);
|
|
146
|
+
return _recurse(urlSegment, node, rest);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function _stringify(params) {
|
|
150
|
+
var res = {};
|
|
151
|
+
collection_1.StringMapWrapper.forEach(params, function (v /** TODO #9100 */, k /** TODO #9100 */) {
|
|
152
|
+
return res[k] = v.toString();
|
|
153
|
+
});
|
|
154
|
+
return res;
|
|
155
|
+
}
|
|
156
|
+
function _compare(path, params, segment) {
|
|
157
|
+
return path == segment.segment && collection_1.StringMapWrapper.equals(params, segment.parameters);
|
|
158
|
+
}
|
|
159
|
+
function _recurse(urlSegment, node, rest) {
|
|
160
|
+
if (rest.length === 0) {
|
|
161
|
+
return new segments_1.TreeNode(urlSegment, []);
|
|
162
|
+
}
|
|
163
|
+
return new segments_1.TreeNode(urlSegment, _updateMany(collection_1.ListWrapper.clone(node.children), rest));
|
|
164
|
+
}
|
|
165
|
+
function _updateMany(nodes, commands) {
|
|
166
|
+
var outlet = _outlet(commands);
|
|
167
|
+
var nodesInRightOutlet = nodes.filter(function (c) { return c.value.outlet == outlet; });
|
|
168
|
+
if (nodesInRightOutlet.length > 0) {
|
|
169
|
+
var nodeRightOutlet = nodesInRightOutlet[0]; // there can be only one
|
|
170
|
+
nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, commands);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
nodes.push(_update(null, commands));
|
|
174
|
+
}
|
|
175
|
+
return nodes;
|
|
176
|
+
}
|
|
177
|
+
function _segment(commands) {
|
|
178
|
+
if (!lang_1.isString(commands[0]))
|
|
179
|
+
return commands[0];
|
|
180
|
+
var parts = commands[0].toString().split(':');
|
|
181
|
+
return parts.length > 1 ? parts[1] : commands[0];
|
|
182
|
+
}
|
|
183
|
+
function _outlet(commands) {
|
|
184
|
+
if (!lang_1.isString(commands[0]))
|
|
185
|
+
return null;
|
|
186
|
+
var parts = commands[0].toString().split(':');
|
|
187
|
+
return parts.length > 1 ? parts[0] : null;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=link.js.map
|
package/src/link.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/link.ts"],"names":[],"mappings":";AAAA,2BAA4C,qBAAqB,CAAC,CAAA;AAClE,2BAA4B,qBAAqB,CAAC,CAAA;AAClD,qBAAwD,eAAe,CAAC,CAAA;AACxE,yBAAqF,YAAY,CAAC,CAAA;AAElG,cACI,OAAqB,EAAE,SAAoB,EAAE,OAAgB,EAAE,QAAe;IAChF,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAAC,MAAM,CAAC,OAAO,CAAC;IAE1C,IAAI,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtD,EAAE,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,kBAAO,CAAC,IAAI,mBAAQ,CAAa,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,YAAY,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtF,IAAI,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChD,WAAW,CAAC,wBAAW,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAClF,EAAE,CAAC;IACP,IAAI,OAAO,GAAG,iBAAiB,CAAC,mBAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,CAAC,IAAI,kBAAO,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAhBe,YAAI,OAgBnB,CAAA;AAED,yBAAyB,gBAA+C;IACtE,MAAM,CAAC,gBAAgB,CAAC,UAAU,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACxE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC1C,CAAC;AAED;IACE,uCACW,UAAmB,EAAS,kBAA0B,EAAS,QAAe;QAA9E,eAAU,GAAV,UAAU,CAAS;QAAS,uBAAkB,GAAlB,kBAAkB,CAAQ;QAAS,aAAQ,GAAR,QAAQ,CAAO;IAAG,CAAC;IAC/F,oCAAC;AAAD,CAAC,AAHD,IAGC;AAED,4BAA4B,QAAe;IACzC,EAAE,CAAC,CAAC,eAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,6BAA6B,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,GAA4B,EAAE,CAAC;IAEtC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpB,EAAE,CAAC,CAAC,CAAC,eAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,QAAQ,CAAC;QACX,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAElB,wCAAwC;YACxC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACX,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;gBAE1B,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC9B,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBACtB,kBAAkB,EAAE,CAAC;gBACvB,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACpB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;YAEH,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,6BAA6B,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,yBACI,OAAqB,EAAE,SAAoB,EAAE,OAAgB,EAC7D,kBAA0B;IAC5B,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,UAAU,GAAG,wBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC5C,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,0BAAa,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;AACpD,CAAC;AAED,2BACI,gBAA+C,EAAE,OAAgB,EAAE,OAAqB,EACxF,SAAoB;IACtB,EAAE,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,mBAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,IAAI,UAAU,GACV,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;QACtF,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,mBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,2BAA2B,OAAmB,EAAE,IAA0B;IACxE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC;IACxC,GAAG,CAAC,CAAU,UAAa,EAAb,KAAA,IAAI,CAAC,QAAQ,EAAb,cAAa,EAAb,IAAa,CAAC;QAAvB,IAAI,CAAC,SAAA;QACR,IAAI,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtC,EAAE,CAAC,CAAC,gBAAS,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;KAC5B;IACD,MAAM,CAAC,IAAI,CAAC;AACd,CAAC;AAED,2BACI,IAA0B,EAAE,QAA8B,EAC1D,OAA+B;IACjC,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,mBAAQ,CAAa,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,MAAM,CAAC,IAAI,mBAAQ,CACf,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAvC,CAAuC,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,iBAAiB,IAA0B,EAAE,QAAe;IAC1D,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEjC,sDAAsD;IACtD,EAAE,CAAC,CAAC,cAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,IAAI,qBAAU,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,mBAAQ,CAAa,UAAU,EAAE,QAAQ,CAAC,CAAC;IAExD,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,cAAO,CAAC,IAAI,CAAC,IAAI,kBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,UAAU,GAAG,IAAI,qBAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAGnD,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;IAGd,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,UAAU,GAAG,IAAI,qBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5F,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAG1C,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAW,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAGnD,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,UAAU,GAAG,IAAI,qBAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAGnD,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAG1C,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,IAAI,UAAU,GAAG,IAAI,qBAAU,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,oBAAoB,MAA4B;IAC9C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,6BAAgB,CAAC,OAAO,CACpB,MAAM,EAAE,UAAC,CAAM,CAAC,iBAAiB,EAAE,CAAM,CAAC,iBAAiB;QAC/C,OAAC,GAA6B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAAhD,CAAgD,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,CAAC;AACb,CAAC;AAED,kBAAkB,IAAY,EAAE,MAA4B,EAAE,OAAmB;IAC/E,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,6BAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACxF,CAAC;AAED,kBACI,UAAsB,EAAE,IAA0B,EAAE,IAAW;IACjE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,mBAAQ,CAAa,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,CAAC,IAAI,mBAAQ,CAAa,UAAU,EAAE,WAAW,CAAC,wBAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,qBAAqB,KAA6B,EAAE,QAAe;IACjE,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,EAAxB,CAAwB,CAAC,CAAC;IACrE,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,eAAe,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAE,wBAAwB;QACtE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC;AACf,CAAC;AAED,kBAAkB,QAAe;IAC/B,EAAE,CAAC,CAAC,CAAC,eAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,iBAAiB,QAAe;IAC9B,EAAE,CAAC,CAAC,CAAC,eAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC;IACxC,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC","sourcesContent":["import {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {BaseException} from './facade/exceptions';\nimport {isBlank, isPresent, isString, isStringMap} from './facade/lang';\nimport {RouteSegment, RouteTree, Tree, TreeNode, UrlSegment, UrlTree, rootNode} from './segments';\n\nexport function link(\n segment: RouteSegment, routeTree: RouteTree, urlTree: UrlTree, commands: any[]): UrlTree {\n if (commands.length === 0) return urlTree;\n\n let normalizedCommands = _normalizeCommands(commands);\n if (_navigateToRoot(normalizedCommands)) {\n return new UrlTree(new TreeNode<UrlSegment>(urlTree.root, []));\n }\n\n let startingNode = _findStartingNode(normalizedCommands, urlTree, segment, routeTree);\n let updated = normalizedCommands.commands.length > 0 ?\n _updateMany(ListWrapper.clone(startingNode.children), normalizedCommands.commands) :\n [];\n let newRoot = _constructNewTree(rootNode(urlTree), startingNode, updated);\n\n return new UrlTree(newRoot);\n}\n\nfunction _navigateToRoot(normalizedChange: _NormalizedNavigationCommands): boolean {\n return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 &&\n normalizedChange.commands[0] == '/';\n}\n\nclass _NormalizedNavigationCommands {\n constructor(\n public isAbsolute: boolean, public numberOfDoubleDots: number, public commands: any[]) {}\n}\n\nfunction _normalizeCommands(commands: any[]): _NormalizedNavigationCommands {\n if (isString(commands[0]) && commands.length === 1 && commands[0] == '/') {\n return new _NormalizedNavigationCommands(true, 0, commands);\n }\n\n let numberOfDoubleDots = 0;\n let isAbsolute = false;\n let res: any[] /** TODO #9100 */ = [];\n\n for (let i = 0; i < commands.length; ++i) {\n let c = commands[i];\n\n if (!isString(c)) {\n res.push(c);\n continue;\n }\n\n let parts = c.split('/');\n for (let j = 0; j < parts.length; ++j) {\n let cc = parts[j];\n\n // first exp is treated in a special way\n if (i == 0) {\n if (j == 0 && cc == '.') { // './a'\n // skip it\n } else if (j == 0 && cc == '') { // '/a'\n isAbsolute = true;\n } else if (cc == '..') { // '../a'\n numberOfDoubleDots++;\n } else if (cc != '') {\n res.push(cc);\n }\n\n } else {\n if (cc != '') {\n res.push(cc);\n }\n }\n }\n }\n\n return new _NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res);\n}\n\nfunction _findUrlSegment(\n segment: RouteSegment, routeTree: RouteTree, urlTree: UrlTree,\n numberOfDoubleDots: number): UrlSegment {\n let s = segment;\n while (s.urlSegments.length === 0) {\n s = routeTree.parent(s);\n }\n let urlSegment = ListWrapper.last(s.urlSegments);\n let path = urlTree.pathFromRoot(urlSegment);\n if (path.length <= numberOfDoubleDots) {\n throw new BaseException('Invalid number of \\'../\\'');\n }\n return path[path.length - 1 - numberOfDoubleDots];\n}\n\nfunction _findStartingNode(\n normalizedChange: _NormalizedNavigationCommands, urlTree: UrlTree, segment: RouteSegment,\n routeTree: RouteTree): TreeNode<UrlSegment> {\n if (normalizedChange.isAbsolute) {\n return rootNode(urlTree);\n } else {\n let urlSegment =\n _findUrlSegment(segment, routeTree, urlTree, normalizedChange.numberOfDoubleDots);\n return _findMatchingNode(urlSegment, rootNode(urlTree));\n }\n}\n\nfunction _findMatchingNode(segment: UrlSegment, node: TreeNode<UrlSegment>): TreeNode<UrlSegment> {\n if (node.value === segment) return node;\n for (var c of node.children) {\n let r = _findMatchingNode(segment, c);\n if (isPresent(r)) return r;\n }\n return null;\n}\n\nfunction _constructNewTree(\n node: TreeNode<UrlSegment>, original: TreeNode<UrlSegment>,\n updated: TreeNode<UrlSegment>[]): TreeNode<UrlSegment> {\n if (node === original) {\n return new TreeNode<UrlSegment>(node.value, updated);\n } else {\n return new TreeNode<UrlSegment>(\n node.value, node.children.map(c => _constructNewTree(c, original, updated)));\n }\n}\n\nfunction _update(node: TreeNode<UrlSegment>, commands: any[]): TreeNode<UrlSegment> {\n let rest = commands.slice(1);\n let next = rest.length === 0 ? null : rest[0];\n let outlet = _outlet(commands);\n let segment = _segment(commands);\n\n // reach the end of the tree => create new tree nodes.\n if (isBlank(node) && !isStringMap(next)) {\n let urlSegment = new UrlSegment(segment, {}, outlet);\n let children = rest.length === 0 ? [] : [_update(null, rest)];\n return new TreeNode<UrlSegment>(urlSegment, children);\n\n } else if (isBlank(node) && isStringMap(next)) {\n let urlSegment = new UrlSegment(segment, _stringify(next), outlet);\n return _recurse(urlSegment, node, rest.slice(1));\n\n // different outlet => preserve the subtree\n } else if (outlet != node.value.outlet) {\n return node;\n\n // params command\n } else if (isStringMap(segment)) {\n let newSegment = new UrlSegment(node.value.segment, _stringify(segment), node.value.outlet);\n return _recurse(newSegment, node, rest);\n\n // next one is a params command && can reuse the node\n } else if (isStringMap(next) && _compare(segment, _stringify(next), node.value)) {\n return _recurse(node.value, node, rest.slice(1));\n\n // next one is a params command && cannot reuse the node\n } else if (isStringMap(next)) {\n let urlSegment = new UrlSegment(segment, _stringify(next), outlet);\n return _recurse(urlSegment, node, rest.slice(1));\n\n // next one is not a params command && can reuse the node\n } else if (_compare(segment, {}, node.value)) {\n return _recurse(node.value, node, rest);\n\n // next one is not a params command && cannot reuse the node\n } else {\n let urlSegment = new UrlSegment(segment, {}, outlet);\n return _recurse(urlSegment, node, rest);\n }\n}\n\nfunction _stringify(params: {[key: string]: any}): {[key: string]: string} {\n let res = {};\n StringMapWrapper.forEach(\n params, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) =>\n (res as any /** TODO #9100 */)[k] = v.toString());\n return res;\n}\n\nfunction _compare(path: string, params: {[key: string]: any}, segment: UrlSegment): boolean {\n return path == segment.segment && StringMapWrapper.equals(params, segment.parameters);\n}\n\nfunction _recurse(\n urlSegment: UrlSegment, node: TreeNode<UrlSegment>, rest: any[]): TreeNode<UrlSegment> {\n if (rest.length === 0) {\n return new TreeNode<UrlSegment>(urlSegment, []);\n }\n return new TreeNode<UrlSegment>(urlSegment, _updateMany(ListWrapper.clone(node.children), rest));\n}\n\nfunction _updateMany(nodes: TreeNode<UrlSegment>[], commands: any[]): TreeNode<UrlSegment>[] {\n let outlet = _outlet(commands);\n let nodesInRightOutlet = nodes.filter(c => c.value.outlet == outlet);\n if (nodesInRightOutlet.length > 0) {\n let nodeRightOutlet = nodesInRightOutlet[0]; // there can be only one\n nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, commands);\n } else {\n nodes.push(_update(null, commands));\n }\n\n return nodes;\n}\n\nfunction _segment(commands: any[]): any {\n if (!isString(commands[0])) return commands[0];\n let parts = commands[0].toString().split(':');\n return parts.length > 1 ? parts[1] : commands[0];\n}\n\nfunction _outlet(commands: any[]): string {\n if (!isString(commands[0])) return null;\n let parts = commands[0].toString().split(':');\n return parts.length > 1 ? parts[0] : null;\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RouteMetadata, RoutesMetadata } from './metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Defines routes for a given component.
|
|
4
|
+
*
|
|
5
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
6
|
+
*/
|
|
7
|
+
export interface RoutesFactory {
|
|
8
|
+
(routes: RouteMetadata[]): any;
|
|
9
|
+
new (routes: RouteMetadata[]): RoutesMetadata;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Defines routes for a given component.
|
|
13
|
+
*
|
|
14
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
15
|
+
*/
|
|
16
|
+
export declare var Routes: RoutesFactory;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var core_private_1 = require('../core_private');
|
|
3
|
+
var metadata_1 = require('./metadata');
|
|
4
|
+
/**
|
|
5
|
+
* Defines routes for a given component.
|
|
6
|
+
*
|
|
7
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
8
|
+
*/
|
|
9
|
+
exports.Routes = core_private_1.makeDecorator(metadata_1.RoutesMetadata);
|
|
10
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/metadata/decorators.ts"],"names":[],"mappings":";AAAA,6BAA4B,iBAAiB,CAAC,CAAA;AAE9C,yBAA4C,YAAY,CAAC,CAAA;AAazD;;;;GAIG;AACQ,cAAM,GAAiC,4BAAa,CAAC,yBAAc,CAAC,CAAC","sourcesContent":["import {makeDecorator} from '../core_private';\n\nimport {RouteMetadata, RoutesMetadata} from './metadata';\n\n\n/**\n * Defines routes for a given component.\n *\n * It takes an array of {@link RouteMetadata}s.\n */\nexport interface RoutesFactory {\n (routes: RouteMetadata[]): any;\n new (routes: RouteMetadata[]): RoutesMetadata;\n}\n\n/**\n * Defines routes for a given component.\n *\n * It takes an array of {@link RouteMetadata}s.\n */\nexport var Routes: RoutesFactory = <RoutesFactory>makeDecorator(RoutesMetadata);\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"__symbolic":"module","version":1,"metadata":{"Routes":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"../core_private","name":"makeDecorator"},"arguments":[{"__symbolic":"reference","module":"./metadata","name":"RoutesMetadata"}]}}}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Type } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Information about a route.
|
|
4
|
+
*
|
|
5
|
+
* It has the following properties:
|
|
6
|
+
* - `path` is a string that uses the route matcher DSL.
|
|
7
|
+
* - `component` a component type.
|
|
8
|
+
*
|
|
9
|
+
* ### Example
|
|
10
|
+
* ```
|
|
11
|
+
* import {Routes} from '@angular/router';
|
|
12
|
+
*
|
|
13
|
+
* @Routes([
|
|
14
|
+
* {path: '/home', component: HomeCmp}
|
|
15
|
+
* ])
|
|
16
|
+
* class MyApp {}
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @ts2dart_const
|
|
20
|
+
*/
|
|
21
|
+
export declare abstract class RouteMetadata {
|
|
22
|
+
path: string;
|
|
23
|
+
component: Type | string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* See {@link RouteMetadata} for more information.
|
|
27
|
+
* @ts2dart_const
|
|
28
|
+
*/
|
|
29
|
+
export declare class Route implements RouteMetadata {
|
|
30
|
+
path: string;
|
|
31
|
+
component: Type | string;
|
|
32
|
+
constructor({path, component}?: {
|
|
33
|
+
path?: string;
|
|
34
|
+
component?: Type | string;
|
|
35
|
+
});
|
|
36
|
+
toString(): string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Defines routes for a given component.
|
|
40
|
+
*
|
|
41
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
42
|
+
* @ts2dart_const
|
|
43
|
+
*/
|
|
44
|
+
export declare class RoutesMetadata {
|
|
45
|
+
routes: RouteMetadata[];
|
|
46
|
+
constructor(routes: RouteMetadata[]);
|
|
47
|
+
toString(): string;
|
|
48
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var lang_1 = require('../facade/lang');
|
|
3
|
+
/**
|
|
4
|
+
* Information about a route.
|
|
5
|
+
*
|
|
6
|
+
* It has the following properties:
|
|
7
|
+
* - `path` is a string that uses the route matcher DSL.
|
|
8
|
+
* - `component` a component type.
|
|
9
|
+
*
|
|
10
|
+
* ### Example
|
|
11
|
+
* ```
|
|
12
|
+
* import {Routes} from '@angular/router';
|
|
13
|
+
*
|
|
14
|
+
* @Routes([
|
|
15
|
+
* {path: '/home', component: HomeCmp}
|
|
16
|
+
* ])
|
|
17
|
+
* class MyApp {}
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @ts2dart_const
|
|
21
|
+
*/
|
|
22
|
+
var RouteMetadata = (function () {
|
|
23
|
+
function RouteMetadata() {
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(RouteMetadata.prototype, "path", {
|
|
26
|
+
get: function () { },
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(RouteMetadata.prototype, "component", {
|
|
31
|
+
get: function () { },
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true
|
|
34
|
+
});
|
|
35
|
+
return RouteMetadata;
|
|
36
|
+
}());
|
|
37
|
+
exports.RouteMetadata = RouteMetadata;
|
|
38
|
+
/**
|
|
39
|
+
* See {@link RouteMetadata} for more information.
|
|
40
|
+
* @ts2dart_const
|
|
41
|
+
*/
|
|
42
|
+
var Route = (function () {
|
|
43
|
+
function Route(_a) {
|
|
44
|
+
var _b = _a === void 0 ? {} : _a, path = _b.path, component = _b.component;
|
|
45
|
+
this.path = path;
|
|
46
|
+
this.component = component;
|
|
47
|
+
}
|
|
48
|
+
Route.prototype.toString = function () { return "@Route(" + this.path + ", " + lang_1.stringify(this.component) + ")"; };
|
|
49
|
+
return Route;
|
|
50
|
+
}());
|
|
51
|
+
exports.Route = Route;
|
|
52
|
+
/**
|
|
53
|
+
* Defines routes for a given component.
|
|
54
|
+
*
|
|
55
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
56
|
+
* @ts2dart_const
|
|
57
|
+
*/
|
|
58
|
+
var RoutesMetadata = (function () {
|
|
59
|
+
function RoutesMetadata(routes) {
|
|
60
|
+
this.routes = routes;
|
|
61
|
+
}
|
|
62
|
+
RoutesMetadata.prototype.toString = function () { return "@Routes(" + this.routes + ")"; };
|
|
63
|
+
return RoutesMetadata;
|
|
64
|
+
}());
|
|
65
|
+
exports.RoutesMetadata = RoutesMetadata;
|
|
66
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/metadata/metadata.ts"],"names":[],"mappings":";AACA,qBAAwB,gBAAgB,CAAC,CAAA;AAEzC;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAAA;IAGA,CAAC;IAFC,sBAAa,+BAAI;aAAjB,eAA4B;;;OAAA;IAC5B,sBAAa,oCAAS;aAAtB,eAAsC;;;OAAA;IACxC,oBAAC;AAAD,CAAC,AAHD,IAGC;AAHqB,qBAAa,gBAGlC,CAAA;AAED;;;GAGG;AACH;IAGE,eAAY,EAAgE;YAAhE,4BAAgE,EAA/D,cAAI,EAAE,wBAAS;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,wBAAQ,GAAR,cAAqB,MAAM,CAAC,YAAU,IAAI,CAAC,IAAI,UAAK,gBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAG,CAAC,CAAC,CAAC;IACrF,YAAC;AAAD,CAAC,AARD,IAQC;AARY,aAAK,QAQjB,CAAA;AAED;;;;;GAKG;AACH;IACE,wBAAmB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAC9C,iCAAQ,GAAR,cAAqB,MAAM,CAAC,aAAW,IAAI,CAAC,MAAM,MAAG,CAAC,CAAC,CAAC;IAC1D,qBAAC;AAAD,CAAC,AAHD,IAGC;AAHY,sBAAc,iBAG1B,CAAA","sourcesContent":["import {Type} from '@angular/core';\nimport {stringify} from '../facade/lang';\n\n/**\n * Information about a route.\n *\n * It has the following properties:\n * - `path` is a string that uses the route matcher DSL.\n * - `component` a component type.\n *\n * ### Example\n * ```\n * import {Routes} from '@angular/router';\n *\n * @Routes([\n * {path: '/home', component: HomeCmp}\n * ])\n * class MyApp {}\n * ```\n *\n * @ts2dart_const\n */\nexport abstract class RouteMetadata {\n abstract get path(): string;\n abstract get component(): Type|string;\n}\n\n/**\n * See {@link RouteMetadata} for more information.\n * @ts2dart_const\n */\nexport class Route implements RouteMetadata {\n path: string;\n component: Type|string;\n constructor({path, component}: {path?: string, component?: Type|string} = {}) {\n this.path = path;\n this.component = component;\n }\n toString(): string { return `@Route(${this.path}, ${stringify(this.component)})`; }\n}\n\n/**\n * Defines routes for a given component.\n *\n * It takes an array of {@link RouteMetadata}s.\n * @ts2dart_const\n */\nexport class RoutesMetadata {\n constructor(public routes: RouteMetadata[]) {}\n toString(): string { return `@Routes(${this.routes})`; }\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ComponentResolver } from '@angular/core';
|
|
2
|
+
import { Type } from './facade/lang';
|
|
3
|
+
import { RouteTree, UrlTree } from './segments';
|
|
4
|
+
export declare function recognize(componentResolver: ComponentResolver, rootComponent: Type, url: UrlTree, existingTree: RouteTree): Promise<RouteTree>;
|
package/src/recognize.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var core_1 = require('@angular/core');
|
|
3
|
+
var constants_1 = require('./constants');
|
|
4
|
+
var core_private_1 = require('./core_private');
|
|
5
|
+
var collection_1 = require('./facade/collection');
|
|
6
|
+
var lang_1 = require('./facade/lang');
|
|
7
|
+
var promise_1 = require('./facade/promise');
|
|
8
|
+
var metadata_1 = require('./metadata/metadata');
|
|
9
|
+
var segments_1 = require('./segments');
|
|
10
|
+
function recognize(componentResolver, rootComponent, url, existingTree) {
|
|
11
|
+
var matched = new _MatchResult(rootComponent, [url.root], {}, segments_1.rootNode(url).children, []);
|
|
12
|
+
return _constructSegment(componentResolver, matched, segments_1.rootNode(existingTree))
|
|
13
|
+
.then(function (roots) { return new segments_1.RouteTree(roots[0]); });
|
|
14
|
+
}
|
|
15
|
+
exports.recognize = recognize;
|
|
16
|
+
function _recognize(componentResolver, parentComponent, url, existingSegments) {
|
|
17
|
+
var metadata = _readMetadata(parentComponent); // should read from the factory instead
|
|
18
|
+
if (lang_1.isBlank(metadata)) {
|
|
19
|
+
throw new core_1.BaseException("Component '" + lang_1.stringify(parentComponent) + "' does not have route configuration");
|
|
20
|
+
}
|
|
21
|
+
var match;
|
|
22
|
+
try {
|
|
23
|
+
match = _match(metadata, url);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return promise_1.PromiseWrapper.reject(e, null);
|
|
27
|
+
}
|
|
28
|
+
var segmentsWithRightOutlet = existingSegments.filter(function (r) { return r.value.outlet == match.outlet; });
|
|
29
|
+
var segmentWithRightOutlet = segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;
|
|
30
|
+
var main = _constructSegment(componentResolver, match, segmentWithRightOutlet);
|
|
31
|
+
var aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)
|
|
32
|
+
.then(_checkOutletNameUniqueness);
|
|
33
|
+
return promise_1.PromiseWrapper.all([main, aux]).then(collection_1.ListWrapper.flatten);
|
|
34
|
+
}
|
|
35
|
+
function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
|
|
36
|
+
var recognized = urls.map(function (u) { return _recognize(componentResolver, parentComponent, u, existingSegments); });
|
|
37
|
+
return promise_1.PromiseWrapper.all(recognized).then(collection_1.ListWrapper.flatten);
|
|
38
|
+
}
|
|
39
|
+
function _constructSegment(componentResolver, matched, existingSegment) {
|
|
40
|
+
return componentResolver.resolveComponent(matched.component).then(function (factory) {
|
|
41
|
+
var segment = _createOrReuseSegment(matched, factory, existingSegment);
|
|
42
|
+
var existingChildren = lang_1.isPresent(existingSegment) ? existingSegment.children : [];
|
|
43
|
+
if (matched.leftOverUrl.length > 0) {
|
|
44
|
+
return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
|
|
45
|
+
.then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
|
|
49
|
+
.then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function _createOrReuseSegment(matched, factory, segmentNode) {
|
|
54
|
+
var segment = lang_1.isPresent(segmentNode) ? segmentNode.value : null;
|
|
55
|
+
if (lang_1.isPresent(segment) && segments_1.equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&
|
|
56
|
+
collection_1.StringMapWrapper.equals(segment.parameters, matched.parameters) &&
|
|
57
|
+
segment.outlet == matched.outlet && factory.componentType == segment.type) {
|
|
58
|
+
return segment;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return new segments_1.RouteSegment(matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType, factory);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function _recognizeLeftOvers(componentResolver, parentComponent, existingSegments) {
|
|
65
|
+
return componentResolver.resolveComponent(parentComponent).then(function (factory) {
|
|
66
|
+
var metadata = _readMetadata(factory.componentType);
|
|
67
|
+
if (lang_1.isBlank(metadata)) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
var r = metadata.routes.filter(function (r) { return r.path == '' || r.path == '/'; });
|
|
71
|
+
if (r.length === 0) {
|
|
72
|
+
return promise_1.PromiseWrapper.resolve([]);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
var segmentsWithMatchingOutlet = existingSegments.filter(function (r) { return r.value.outlet == constants_1.DEFAULT_OUTLET_NAME; });
|
|
76
|
+
var segmentWithMatchingOutlet_1 = segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;
|
|
77
|
+
var existingChildren = lang_1.isPresent(segmentWithMatchingOutlet_1) ? segmentWithMatchingOutlet_1.children : [];
|
|
78
|
+
return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)
|
|
79
|
+
.then(function (children) {
|
|
80
|
+
return componentResolver.resolveComponent(r[0].component).then(function (factory) {
|
|
81
|
+
var segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet_1);
|
|
82
|
+
return [new segments_1.TreeNode(segment, children)];
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function _match(metadata, url) {
|
|
89
|
+
for (var _i = 0, _a = metadata.routes; _i < _a.length; _i++) {
|
|
90
|
+
var r = _a[_i];
|
|
91
|
+
var matchingResult = _matchWithParts(r, url);
|
|
92
|
+
if (lang_1.isPresent(matchingResult)) {
|
|
93
|
+
return matchingResult;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
var availableRoutes = metadata.routes.map(function (r) { return ("'" + r.path + "'"); }).join(', ');
|
|
97
|
+
throw new core_1.BaseException("Cannot match any routes. Current segment: '" + url.value + "'. Available routes: [" + availableRoutes + "].");
|
|
98
|
+
}
|
|
99
|
+
function _matchWithParts(route, url) {
|
|
100
|
+
var path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
|
|
101
|
+
if (path == '*') {
|
|
102
|
+
return new _MatchResult(route.component, [], null, [], []);
|
|
103
|
+
}
|
|
104
|
+
var parts = path.split('/');
|
|
105
|
+
var positionalParams = {};
|
|
106
|
+
var consumedUrlSegments = [];
|
|
107
|
+
var lastParent = null;
|
|
108
|
+
var lastSegment = null;
|
|
109
|
+
var current = url;
|
|
110
|
+
for (var i = 0; i < parts.length; ++i) {
|
|
111
|
+
if (lang_1.isBlank(current))
|
|
112
|
+
return null;
|
|
113
|
+
var p_1 = parts[i];
|
|
114
|
+
var isLastSegment = i === parts.length - 1;
|
|
115
|
+
var isLastParent = i === parts.length - 2;
|
|
116
|
+
var isPosParam = p_1.startsWith(':');
|
|
117
|
+
if (!isPosParam && p_1 != current.value.segment)
|
|
118
|
+
return null;
|
|
119
|
+
if (isLastSegment) {
|
|
120
|
+
lastSegment = current;
|
|
121
|
+
}
|
|
122
|
+
if (isLastParent) {
|
|
123
|
+
lastParent = current;
|
|
124
|
+
}
|
|
125
|
+
if (isPosParam) {
|
|
126
|
+
positionalParams[p_1.substring(1)] = current.value.segment;
|
|
127
|
+
}
|
|
128
|
+
consumedUrlSegments.push(current.value);
|
|
129
|
+
current = collection_1.ListWrapper.first(current.children);
|
|
130
|
+
}
|
|
131
|
+
var p = lastSegment.value.parameters;
|
|
132
|
+
var parameters = collection_1.StringMapWrapper.merge(p, positionalParams);
|
|
133
|
+
var axuUrlSubtrees = lang_1.isPresent(lastParent) ? lastParent.children.slice(1) : [];
|
|
134
|
+
return new _MatchResult(route.component, consumedUrlSegments, parameters, lastSegment.children, axuUrlSubtrees);
|
|
135
|
+
}
|
|
136
|
+
function _checkOutletNameUniqueness(nodes) {
|
|
137
|
+
var names = {};
|
|
138
|
+
nodes.forEach(function (n) {
|
|
139
|
+
var segmentWithSameOutletName = names[n.value.outlet];
|
|
140
|
+
if (lang_1.isPresent(segmentWithSameOutletName)) {
|
|
141
|
+
var p = segmentWithSameOutletName.stringifiedUrlSegments;
|
|
142
|
+
var c = n.value.stringifiedUrlSegments;
|
|
143
|
+
throw new core_1.BaseException("Two segments cannot have the same outlet name: '" + p + "' and '" + c + "'.");
|
|
144
|
+
}
|
|
145
|
+
names[n.value.outlet] = n.value;
|
|
146
|
+
});
|
|
147
|
+
return nodes;
|
|
148
|
+
}
|
|
149
|
+
var _MatchResult = (function () {
|
|
150
|
+
function _MatchResult(component, consumedUrlSegments, parameters, leftOverUrl, aux) {
|
|
151
|
+
this.component = component;
|
|
152
|
+
this.consumedUrlSegments = consumedUrlSegments;
|
|
153
|
+
this.parameters = parameters;
|
|
154
|
+
this.leftOverUrl = leftOverUrl;
|
|
155
|
+
this.aux = aux;
|
|
156
|
+
}
|
|
157
|
+
Object.defineProperty(_MatchResult.prototype, "outlet", {
|
|
158
|
+
get: function () {
|
|
159
|
+
return this.consumedUrlSegments.length === 0 || lang_1.isBlank(this.consumedUrlSegments[0].outlet) ?
|
|
160
|
+
constants_1.DEFAULT_OUTLET_NAME :
|
|
161
|
+
this.consumedUrlSegments[0].outlet;
|
|
162
|
+
},
|
|
163
|
+
enumerable: true,
|
|
164
|
+
configurable: true
|
|
165
|
+
});
|
|
166
|
+
return _MatchResult;
|
|
167
|
+
}());
|
|
168
|
+
function _readMetadata(componentType) {
|
|
169
|
+
var metadata = core_private_1.reflector.annotations(componentType).filter(function (f) { return f instanceof metadata_1.RoutesMetadata; });
|
|
170
|
+
return collection_1.ListWrapper.first(metadata);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=recognize.js.map
|