@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
package/esm/src/link.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ListWrapper, StringMapWrapper } from './facade/collection';
|
|
2
|
+
import { BaseException } from './facade/exceptions';
|
|
3
|
+
import { isBlank, isPresent, isString, isStringMap } from './facade/lang';
|
|
4
|
+
import { TreeNode, UrlSegment, UrlTree, rootNode } from './segments';
|
|
5
|
+
export function link(segment, routeTree, urlTree, commands) {
|
|
6
|
+
if (commands.length === 0)
|
|
7
|
+
return urlTree;
|
|
8
|
+
let normalizedCommands = _normalizeCommands(commands);
|
|
9
|
+
if (_navigateToRoot(normalizedCommands)) {
|
|
10
|
+
return new UrlTree(new TreeNode(urlTree.root, []));
|
|
11
|
+
}
|
|
12
|
+
let startingNode = _findStartingNode(normalizedCommands, urlTree, segment, routeTree);
|
|
13
|
+
let updated = normalizedCommands.commands.length > 0 ?
|
|
14
|
+
_updateMany(ListWrapper.clone(startingNode.children), normalizedCommands.commands) :
|
|
15
|
+
[];
|
|
16
|
+
let newRoot = _constructNewTree(rootNode(urlTree), startingNode, updated);
|
|
17
|
+
return new UrlTree(newRoot);
|
|
18
|
+
}
|
|
19
|
+
function _navigateToRoot(normalizedChange) {
|
|
20
|
+
return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 &&
|
|
21
|
+
normalizedChange.commands[0] == '/';
|
|
22
|
+
}
|
|
23
|
+
class _NormalizedNavigationCommands {
|
|
24
|
+
constructor(isAbsolute, numberOfDoubleDots, commands) {
|
|
25
|
+
this.isAbsolute = isAbsolute;
|
|
26
|
+
this.numberOfDoubleDots = numberOfDoubleDots;
|
|
27
|
+
this.commands = commands;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function _normalizeCommands(commands) {
|
|
31
|
+
if (isString(commands[0]) && commands.length === 1 && commands[0] == '/') {
|
|
32
|
+
return new _NormalizedNavigationCommands(true, 0, commands);
|
|
33
|
+
}
|
|
34
|
+
let numberOfDoubleDots = 0;
|
|
35
|
+
let isAbsolute = false;
|
|
36
|
+
let res = [];
|
|
37
|
+
for (let i = 0; i < commands.length; ++i) {
|
|
38
|
+
let c = commands[i];
|
|
39
|
+
if (!isString(c)) {
|
|
40
|
+
res.push(c);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
let parts = c.split('/');
|
|
44
|
+
for (let j = 0; j < parts.length; ++j) {
|
|
45
|
+
let cc = parts[j];
|
|
46
|
+
// first exp is treated in a special way
|
|
47
|
+
if (i == 0) {
|
|
48
|
+
if (j == 0 && cc == '.') {
|
|
49
|
+
}
|
|
50
|
+
else if (j == 0 && cc == '') {
|
|
51
|
+
isAbsolute = true;
|
|
52
|
+
}
|
|
53
|
+
else if (cc == '..') {
|
|
54
|
+
numberOfDoubleDots++;
|
|
55
|
+
}
|
|
56
|
+
else if (cc != '') {
|
|
57
|
+
res.push(cc);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (cc != '') {
|
|
62
|
+
res.push(cc);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return new _NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res);
|
|
68
|
+
}
|
|
69
|
+
function _findUrlSegment(segment, routeTree, urlTree, numberOfDoubleDots) {
|
|
70
|
+
let s = segment;
|
|
71
|
+
while (s.urlSegments.length === 0) {
|
|
72
|
+
s = routeTree.parent(s);
|
|
73
|
+
}
|
|
74
|
+
let urlSegment = ListWrapper.last(s.urlSegments);
|
|
75
|
+
let path = urlTree.pathFromRoot(urlSegment);
|
|
76
|
+
if (path.length <= numberOfDoubleDots) {
|
|
77
|
+
throw new BaseException('Invalid number of \'../\'');
|
|
78
|
+
}
|
|
79
|
+
return path[path.length - 1 - numberOfDoubleDots];
|
|
80
|
+
}
|
|
81
|
+
function _findStartingNode(normalizedChange, urlTree, segment, routeTree) {
|
|
82
|
+
if (normalizedChange.isAbsolute) {
|
|
83
|
+
return rootNode(urlTree);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
let urlSegment = _findUrlSegment(segment, routeTree, urlTree, normalizedChange.numberOfDoubleDots);
|
|
87
|
+
return _findMatchingNode(urlSegment, rootNode(urlTree));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function _findMatchingNode(segment, node) {
|
|
91
|
+
if (node.value === segment)
|
|
92
|
+
return node;
|
|
93
|
+
for (var c of node.children) {
|
|
94
|
+
let r = _findMatchingNode(segment, c);
|
|
95
|
+
if (isPresent(r))
|
|
96
|
+
return r;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function _constructNewTree(node, original, updated) {
|
|
101
|
+
if (node === original) {
|
|
102
|
+
return new TreeNode(node.value, updated);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return new TreeNode(node.value, node.children.map(c => _constructNewTree(c, original, updated)));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function _update(node, commands) {
|
|
109
|
+
let rest = commands.slice(1);
|
|
110
|
+
let next = rest.length === 0 ? null : rest[0];
|
|
111
|
+
let outlet = _outlet(commands);
|
|
112
|
+
let segment = _segment(commands);
|
|
113
|
+
// reach the end of the tree => create new tree nodes.
|
|
114
|
+
if (isBlank(node) && !isStringMap(next)) {
|
|
115
|
+
let urlSegment = new UrlSegment(segment, {}, outlet);
|
|
116
|
+
let children = rest.length === 0 ? [] : [_update(null, rest)];
|
|
117
|
+
return new TreeNode(urlSegment, children);
|
|
118
|
+
}
|
|
119
|
+
else if (isBlank(node) && isStringMap(next)) {
|
|
120
|
+
let urlSegment = new UrlSegment(segment, _stringify(next), outlet);
|
|
121
|
+
return _recurse(urlSegment, node, rest.slice(1));
|
|
122
|
+
}
|
|
123
|
+
else if (outlet != node.value.outlet) {
|
|
124
|
+
return node;
|
|
125
|
+
}
|
|
126
|
+
else if (isStringMap(segment)) {
|
|
127
|
+
let newSegment = new UrlSegment(node.value.segment, _stringify(segment), node.value.outlet);
|
|
128
|
+
return _recurse(newSegment, node, rest);
|
|
129
|
+
}
|
|
130
|
+
else if (isStringMap(next) && _compare(segment, _stringify(next), node.value)) {
|
|
131
|
+
return _recurse(node.value, node, rest.slice(1));
|
|
132
|
+
}
|
|
133
|
+
else if (isStringMap(next)) {
|
|
134
|
+
let urlSegment = new UrlSegment(segment, _stringify(next), outlet);
|
|
135
|
+
return _recurse(urlSegment, node, rest.slice(1));
|
|
136
|
+
}
|
|
137
|
+
else if (_compare(segment, {}, node.value)) {
|
|
138
|
+
return _recurse(node.value, node, rest);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
let urlSegment = new UrlSegment(segment, {}, outlet);
|
|
142
|
+
return _recurse(urlSegment, node, rest);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function _stringify(params) {
|
|
146
|
+
let res = {};
|
|
147
|
+
StringMapWrapper.forEach(params, (v /** TODO #9100 */, k /** TODO #9100 */) => res[k] = v.toString());
|
|
148
|
+
return res;
|
|
149
|
+
}
|
|
150
|
+
function _compare(path, params, segment) {
|
|
151
|
+
return path == segment.segment && StringMapWrapper.equals(params, segment.parameters);
|
|
152
|
+
}
|
|
153
|
+
function _recurse(urlSegment, node, rest) {
|
|
154
|
+
if (rest.length === 0) {
|
|
155
|
+
return new TreeNode(urlSegment, []);
|
|
156
|
+
}
|
|
157
|
+
return new TreeNode(urlSegment, _updateMany(ListWrapper.clone(node.children), rest));
|
|
158
|
+
}
|
|
159
|
+
function _updateMany(nodes, commands) {
|
|
160
|
+
let outlet = _outlet(commands);
|
|
161
|
+
let nodesInRightOutlet = nodes.filter(c => c.value.outlet == outlet);
|
|
162
|
+
if (nodesInRightOutlet.length > 0) {
|
|
163
|
+
let nodeRightOutlet = nodesInRightOutlet[0]; // there can be only one
|
|
164
|
+
nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, commands);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
nodes.push(_update(null, commands));
|
|
168
|
+
}
|
|
169
|
+
return nodes;
|
|
170
|
+
}
|
|
171
|
+
function _segment(commands) {
|
|
172
|
+
if (!isString(commands[0]))
|
|
173
|
+
return commands[0];
|
|
174
|
+
let parts = commands[0].toString().split(':');
|
|
175
|
+
return parts.length > 1 ? parts[1] : commands[0];
|
|
176
|
+
}
|
|
177
|
+
function _outlet(commands) {
|
|
178
|
+
if (!isString(commands[0]))
|
|
179
|
+
return null;
|
|
180
|
+
let parts = commands[0].toString().split(':');
|
|
181
|
+
return parts.length > 1 ? parts[0] : null;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/link.ts"],"names":[],"mappings":"OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB;OAC1D,EAAC,aAAa,EAAC,MAAM,qBAAqB;OAC1C,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,eAAe;OAChE,EAAgC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,YAAY;AAEjG,qBACI,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,OAAO,CAAC,IAAI,QAAQ,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,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAClF,EAAE,CAAC;IACP,IAAI,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;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,YACW,UAAmB,EAAS,kBAA0B,EAAS,QAAe;QAA9E,eAAU,GAAV,UAAU,CAAS;QAAS,uBAAkB,GAAlB,kBAAkB,CAAQ;QAAS,aAAQ,GAAR,QAAQ,CAAO;IAAG,CAAC;AAC/F,CAAC;AAED,4BAA4B,QAAe;IACzC,EAAE,CAAC,CAAC,QAAQ,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,QAAQ,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,WAAW,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,aAAa,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,QAAQ,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,QAAQ,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,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;IAC7B,CAAC;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,QAAQ,CAAa,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,MAAM,CAAC,IAAI,QAAQ,CACf,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,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,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,IAAI,UAAU,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,QAAQ,CAAa,UAAU,EAAE,QAAQ,CAAC,CAAC;IAExD,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,UAAU,GAAG,IAAI,UAAU,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,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,UAAU,GAAG,IAAI,UAAU,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,WAAW,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,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,UAAU,GAAG,IAAI,UAAU,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,UAAU,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,gBAAgB,CAAC,OAAO,CACpB,MAAM,EAAE,CAAC,CAAM,CAAC,iBAAiB,EAAE,CAAM,CAAC,iBAAiB,KAC9C,GAA6B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,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,gBAAgB,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,QAAQ,CAAa,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,CAAC,IAAI,QAAQ,CAAa,UAAU,EAAE,WAAW,CAAC,WAAW,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,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,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,QAAQ,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,QAAQ,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,9 @@
|
|
|
1
|
+
import { makeDecorator } from '../core_private';
|
|
2
|
+
import { RoutesMetadata } from './metadata';
|
|
3
|
+
/**
|
|
4
|
+
* Defines routes for a given component.
|
|
5
|
+
*
|
|
6
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
7
|
+
*/
|
|
8
|
+
export var Routes = makeDecorator(RoutesMetadata);
|
|
9
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../../../../modules/@angular/router/src/metadata/decorators.ts"],"names":[],"mappings":"OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB;OAEtC,EAAgB,cAAc,EAAC,MAAM,YAAY;AAaxD;;;;GAIG;AACH,OAAO,IAAI,MAAM,GAAiC,aAAa,CAAC,cAAc,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
|
+
readonly abstract path: string;
|
|
23
|
+
readonly abstract 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,48 @@
|
|
|
1
|
+
import { stringify } from '../facade/lang';
|
|
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 class RouteMetadata {
|
|
22
|
+
get path() { }
|
|
23
|
+
get component() { }
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* See {@link RouteMetadata} for more information.
|
|
27
|
+
* @ts2dart_const
|
|
28
|
+
*/
|
|
29
|
+
export class Route {
|
|
30
|
+
constructor({ path, component } = {}) {
|
|
31
|
+
this.path = path;
|
|
32
|
+
this.component = component;
|
|
33
|
+
}
|
|
34
|
+
toString() { return `@Route(${this.path}, ${stringify(this.component)})`; }
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Defines routes for a given component.
|
|
38
|
+
*
|
|
39
|
+
* It takes an array of {@link RouteMetadata}s.
|
|
40
|
+
* @ts2dart_const
|
|
41
|
+
*/
|
|
42
|
+
export class RoutesMetadata {
|
|
43
|
+
constructor(routes) {
|
|
44
|
+
this.routes = routes;
|
|
45
|
+
}
|
|
46
|
+
toString() { return `@Routes(${this.routes})`; }
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../../../../modules/@angular/router/src/metadata/metadata.ts"],"names":[],"mappings":"OACO,EAAC,SAAS,EAAC,MAAM,gBAAgB;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH;IACE,IAAa,IAAI,MAAW;IAC5B,IAAa,SAAS,MAAgB;AACxC,CAAC;AAED;;;GAGG;AACH;IAGE,YAAY,EAAC,IAAI,EAAE,SAAS,EAAC,GAA6C,EAAE;QAC1E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,QAAQ,KAAa,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH;IACE,YAAmB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAC9C,QAAQ,KAAa,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAAA","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>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { BaseException } from '@angular/core';
|
|
2
|
+
import { DEFAULT_OUTLET_NAME } from './constants';
|
|
3
|
+
import { reflector } from './core_private';
|
|
4
|
+
import { ListWrapper, StringMapWrapper } from './facade/collection';
|
|
5
|
+
import { isBlank, isPresent, stringify } from './facade/lang';
|
|
6
|
+
import { PromiseWrapper } from './facade/promise';
|
|
7
|
+
import { RoutesMetadata } from './metadata/metadata';
|
|
8
|
+
import { RouteSegment, RouteTree, TreeNode, equalUrlSegments, rootNode } from './segments';
|
|
9
|
+
export function recognize(componentResolver, rootComponent, url, existingTree) {
|
|
10
|
+
let matched = new _MatchResult(rootComponent, [url.root], {}, rootNode(url).children, []);
|
|
11
|
+
return _constructSegment(componentResolver, matched, rootNode(existingTree))
|
|
12
|
+
.then(roots => new RouteTree(roots[0]));
|
|
13
|
+
}
|
|
14
|
+
function _recognize(componentResolver, parentComponent, url, existingSegments) {
|
|
15
|
+
let metadata = _readMetadata(parentComponent); // should read from the factory instead
|
|
16
|
+
if (isBlank(metadata)) {
|
|
17
|
+
throw new BaseException(`Component '${stringify(parentComponent)}' does not have route configuration`);
|
|
18
|
+
}
|
|
19
|
+
let match;
|
|
20
|
+
try {
|
|
21
|
+
match = _match(metadata, url);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
return PromiseWrapper.reject(e, null);
|
|
25
|
+
}
|
|
26
|
+
let segmentsWithRightOutlet = existingSegments.filter(r => r.value.outlet == match.outlet);
|
|
27
|
+
let segmentWithRightOutlet = segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;
|
|
28
|
+
let main = _constructSegment(componentResolver, match, segmentWithRightOutlet);
|
|
29
|
+
let aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)
|
|
30
|
+
.then(_checkOutletNameUniqueness);
|
|
31
|
+
return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);
|
|
32
|
+
}
|
|
33
|
+
function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
|
|
34
|
+
let recognized = urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments));
|
|
35
|
+
return PromiseWrapper.all(recognized).then(ListWrapper.flatten);
|
|
36
|
+
}
|
|
37
|
+
function _constructSegment(componentResolver, matched, existingSegment) {
|
|
38
|
+
return componentResolver.resolveComponent(matched.component).then(factory => {
|
|
39
|
+
let segment = _createOrReuseSegment(matched, factory, existingSegment);
|
|
40
|
+
let existingChildren = isPresent(existingSegment) ? existingSegment.children : [];
|
|
41
|
+
if (matched.leftOverUrl.length > 0) {
|
|
42
|
+
return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
|
|
43
|
+
.then(children => [new TreeNode(segment, children)]);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
|
|
47
|
+
.then(children => [new TreeNode(segment, children)]);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function _createOrReuseSegment(matched, factory, segmentNode) {
|
|
52
|
+
let segment = isPresent(segmentNode) ? segmentNode.value : null;
|
|
53
|
+
if (isPresent(segment) && equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&
|
|
54
|
+
StringMapWrapper.equals(segment.parameters, matched.parameters) &&
|
|
55
|
+
segment.outlet == matched.outlet && factory.componentType == segment.type) {
|
|
56
|
+
return segment;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return new RouteSegment(matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType, factory);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function _recognizeLeftOvers(componentResolver, parentComponent, existingSegments) {
|
|
63
|
+
return componentResolver.resolveComponent(parentComponent).then(factory => {
|
|
64
|
+
let metadata = _readMetadata(factory.componentType);
|
|
65
|
+
if (isBlank(metadata)) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
let r = metadata.routes.filter(r => r.path == '' || r.path == '/');
|
|
69
|
+
if (r.length === 0) {
|
|
70
|
+
return PromiseWrapper.resolve([]);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
let segmentsWithMatchingOutlet = existingSegments.filter(r => r.value.outlet == DEFAULT_OUTLET_NAME);
|
|
74
|
+
let segmentWithMatchingOutlet = segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;
|
|
75
|
+
let existingChildren = isPresent(segmentWithMatchingOutlet) ? segmentWithMatchingOutlet.children : [];
|
|
76
|
+
return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)
|
|
77
|
+
.then(children => {
|
|
78
|
+
return componentResolver.resolveComponent(r[0].component).then(factory => {
|
|
79
|
+
let segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet);
|
|
80
|
+
return [new TreeNode(segment, children)];
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function _match(metadata, url) {
|
|
87
|
+
for (let r of metadata.routes) {
|
|
88
|
+
let matchingResult = _matchWithParts(r, url);
|
|
89
|
+
if (isPresent(matchingResult)) {
|
|
90
|
+
return matchingResult;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', ');
|
|
94
|
+
throw new BaseException(`Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);
|
|
95
|
+
}
|
|
96
|
+
function _matchWithParts(route, url) {
|
|
97
|
+
let path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
|
|
98
|
+
if (path == '*') {
|
|
99
|
+
return new _MatchResult(route.component, [], null, [], []);
|
|
100
|
+
}
|
|
101
|
+
let parts = path.split('/');
|
|
102
|
+
let positionalParams = {};
|
|
103
|
+
let consumedUrlSegments = [];
|
|
104
|
+
let lastParent = null;
|
|
105
|
+
let lastSegment = null;
|
|
106
|
+
let current = url;
|
|
107
|
+
for (let i = 0; i < parts.length; ++i) {
|
|
108
|
+
if (isBlank(current))
|
|
109
|
+
return null;
|
|
110
|
+
let p = parts[i];
|
|
111
|
+
let isLastSegment = i === parts.length - 1;
|
|
112
|
+
let isLastParent = i === parts.length - 2;
|
|
113
|
+
let isPosParam = p.startsWith(':');
|
|
114
|
+
if (!isPosParam && p != current.value.segment)
|
|
115
|
+
return null;
|
|
116
|
+
if (isLastSegment) {
|
|
117
|
+
lastSegment = current;
|
|
118
|
+
}
|
|
119
|
+
if (isLastParent) {
|
|
120
|
+
lastParent = current;
|
|
121
|
+
}
|
|
122
|
+
if (isPosParam) {
|
|
123
|
+
positionalParams[p.substring(1)] = current.value.segment;
|
|
124
|
+
}
|
|
125
|
+
consumedUrlSegments.push(current.value);
|
|
126
|
+
current = ListWrapper.first(current.children);
|
|
127
|
+
}
|
|
128
|
+
let p = lastSegment.value.parameters;
|
|
129
|
+
let parameters = StringMapWrapper.merge(p, positionalParams);
|
|
130
|
+
let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : [];
|
|
131
|
+
return new _MatchResult(route.component, consumedUrlSegments, parameters, lastSegment.children, axuUrlSubtrees);
|
|
132
|
+
}
|
|
133
|
+
function _checkOutletNameUniqueness(nodes) {
|
|
134
|
+
let names = {};
|
|
135
|
+
nodes.forEach(n => {
|
|
136
|
+
let segmentWithSameOutletName = names[n.value.outlet];
|
|
137
|
+
if (isPresent(segmentWithSameOutletName)) {
|
|
138
|
+
let p = segmentWithSameOutletName.stringifiedUrlSegments;
|
|
139
|
+
let c = n.value.stringifiedUrlSegments;
|
|
140
|
+
throw new BaseException(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`);
|
|
141
|
+
}
|
|
142
|
+
names[n.value.outlet] = n.value;
|
|
143
|
+
});
|
|
144
|
+
return nodes;
|
|
145
|
+
}
|
|
146
|
+
class _MatchResult {
|
|
147
|
+
constructor(component, consumedUrlSegments, parameters, leftOverUrl, aux) {
|
|
148
|
+
this.component = component;
|
|
149
|
+
this.consumedUrlSegments = consumedUrlSegments;
|
|
150
|
+
this.parameters = parameters;
|
|
151
|
+
this.leftOverUrl = leftOverUrl;
|
|
152
|
+
this.aux = aux;
|
|
153
|
+
}
|
|
154
|
+
get outlet() {
|
|
155
|
+
return this.consumedUrlSegments.length === 0 || isBlank(this.consumedUrlSegments[0].outlet) ?
|
|
156
|
+
DEFAULT_OUTLET_NAME :
|
|
157
|
+
this.consumedUrlSegments[0].outlet;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function _readMetadata(componentType) {
|
|
161
|
+
let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);
|
|
162
|
+
return ListWrapper.first(metadata);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=recognize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/recognize.ts"],"names":[],"mappings":"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","sourcesContent":["import {BaseException, ComponentFactory, ComponentResolver} from '@angular/core';\n\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {reflector} from './core_private';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {Type, isBlank, isPresent, stringify} from './facade/lang';\nimport {PromiseWrapper} from './facade/promise';\nimport {RouteMetadata, RoutesMetadata} from './metadata/metadata';\nimport {RouteSegment, RouteTree, Tree, TreeNode, UrlSegment, UrlTree, equalUrlSegments, rootNode} from './segments';\n\nexport function recognize(\n componentResolver: ComponentResolver, rootComponent: Type, url: UrlTree,\n existingTree: RouteTree): Promise<RouteTree> {\n let matched = new _MatchResult(rootComponent, [url.root], {}, rootNode(url).children, []);\n return _constructSegment(componentResolver, matched, rootNode(existingTree))\n .then(roots => new RouteTree(roots[0]));\n}\n\nfunction _recognize(\n componentResolver: ComponentResolver, parentComponent: Type, url: TreeNode<UrlSegment>,\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let metadata = _readMetadata(parentComponent); // should read from the factory instead\n if (isBlank(metadata)) {\n throw new BaseException(\n `Component '${stringify(parentComponent)}' does not have route configuration`);\n }\n\n let match: any /** TODO #9100 */;\n try {\n match = _match(metadata, url);\n } catch (e) {\n return PromiseWrapper.reject(e, null);\n }\n\n let segmentsWithRightOutlet = existingSegments.filter(r => r.value.outlet == match.outlet);\n let segmentWithRightOutlet =\n segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;\n\n let main = _constructSegment(componentResolver, match, segmentWithRightOutlet);\n let aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)\n .then(_checkOutletNameUniqueness);\n return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);\n}\n\nfunction _recognizeMany(\n componentResolver: ComponentResolver, parentComponent: Type, urls: TreeNode<UrlSegment>[],\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let recognized =\n urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments));\n return PromiseWrapper.all(recognized).then(ListWrapper.flatten);\n}\n\nfunction _constructSegment(\n componentResolver: ComponentResolver, matched: _MatchResult,\n existingSegment: TreeNode<RouteSegment>): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(matched.component).then(factory => {\n let segment = _createOrReuseSegment(matched, factory, existingSegment);\n let existingChildren = isPresent(existingSegment) ? existingSegment.children : [];\n\n if (matched.leftOverUrl.length > 0) {\n return _recognizeMany(\n componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n } else {\n return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n }\n });\n}\n\nfunction _createOrReuseSegment(\n matched: _MatchResult, factory: ComponentFactory<any>,\n segmentNode: TreeNode<RouteSegment>): RouteSegment {\n let segment = isPresent(segmentNode) ? segmentNode.value : null;\n\n if (isPresent(segment) && equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&\n StringMapWrapper.equals(segment.parameters, matched.parameters) &&\n segment.outlet == matched.outlet && factory.componentType == segment.type) {\n return segment;\n } else {\n return new RouteSegment(\n matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType,\n factory);\n }\n}\n\nfunction _recognizeLeftOvers(\n componentResolver: ComponentResolver, parentComponent: Type,\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(parentComponent).then(factory => {\n let metadata = _readMetadata(factory.componentType);\n if (isBlank(metadata)) {\n return [];\n }\n\n let r = (<any[]>metadata.routes).filter(r => r.path == '' || r.path == '/');\n if (r.length === 0) {\n return PromiseWrapper.resolve([]);\n } else {\n let segmentsWithMatchingOutlet =\n existingSegments.filter(r => r.value.outlet == DEFAULT_OUTLET_NAME);\n let segmentWithMatchingOutlet =\n segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;\n let existingChildren =\n isPresent(segmentWithMatchingOutlet) ? segmentWithMatchingOutlet.children : [];\n\n return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)\n .then(children => {\n return componentResolver.resolveComponent(r[0].component).then(factory => {\n let segment = _createOrReuseSegment(\n new _MatchResult(r[0].component, [], {}, [], []), factory,\n segmentWithMatchingOutlet);\n return [new TreeNode<RouteSegment>(segment, children)];\n });\n });\n }\n });\n}\n\nfunction _match(metadata: RoutesMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n for (let r of metadata.routes) {\n let matchingResult = _matchWithParts(r, url);\n if (isPresent(matchingResult)) {\n return matchingResult;\n }\n }\n let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', ');\n throw new BaseException(\n `Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);\n}\n\nfunction _matchWithParts(route: RouteMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n let path = route.path.startsWith('/') ? route.path.substring(1) : route.path;\n\n if (path == '*') {\n return new _MatchResult(route.component, [], null, [], []);\n }\n\n let parts = path.split('/');\n let positionalParams = {};\n let consumedUrlSegments: any[] /** TODO #9100 */ = [];\n\n let lastParent: TreeNode<UrlSegment> = null;\n let lastSegment: TreeNode<UrlSegment> = null;\n\n let current = url;\n for (let i = 0; i < parts.length; ++i) {\n if (isBlank(current)) return null;\n\n let p = parts[i];\n let isLastSegment = i === parts.length - 1;\n let isLastParent = i === parts.length - 2;\n let isPosParam = p.startsWith(':');\n\n if (!isPosParam && p != current.value.segment) return null;\n if (isLastSegment) {\n lastSegment = current;\n }\n if (isLastParent) {\n lastParent = current;\n }\n\n if (isPosParam) {\n (positionalParams as any /** TODO #9100 */)[p.substring(1)] = current.value.segment;\n }\n\n consumedUrlSegments.push(current.value);\n\n current = ListWrapper.first(current.children);\n }\n\n let p = lastSegment.value.parameters;\n let parameters = <{[key: string]: string}>StringMapWrapper.merge(p, positionalParams);\n let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : [];\n\n return new _MatchResult(\n route.component, consumedUrlSegments, parameters, lastSegment.children, axuUrlSubtrees);\n}\n\nfunction _checkOutletNameUniqueness(nodes: TreeNode<RouteSegment>[]): TreeNode<RouteSegment>[] {\n let names = {};\n nodes.forEach(n => {\n let segmentWithSameOutletName = (names as any /** TODO #9100 */)[n.value.outlet];\n if (isPresent(segmentWithSameOutletName)) {\n let p = segmentWithSameOutletName.stringifiedUrlSegments;\n let c = n.value.stringifiedUrlSegments;\n throw new BaseException(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`);\n }\n (names as any /** TODO #9100 */)[n.value.outlet] = n.value;\n });\n return nodes;\n}\n\nclass _MatchResult {\n constructor(\n public component: Type|string, public consumedUrlSegments: UrlSegment[],\n public parameters: {[key: string]: string}, public leftOverUrl: TreeNode<UrlSegment>[],\n public aux: TreeNode<UrlSegment>[]) {}\n\n get outlet(): string {\n return this.consumedUrlSegments.length === 0 || isBlank(this.consumedUrlSegments[0].outlet) ?\n DEFAULT_OUTLET_NAME :\n this.consumedUrlSegments[0].outlet;\n }\n}\n\nfunction _readMetadata(componentType: Type) {\n let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);\n return ListWrapper.first(metadata);\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|