@angular/router 2.0.0-rc.1 → 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.
Files changed (160) hide show
  1. package/{router.umd.js → bundles/router.umd.js} +727 -637
  2. package/bundles/router.umd.min.js +2 -0
  3. package/esm/index.d.ts +7 -25
  4. package/esm/index.js +10 -30
  5. package/esm/index.js.map +1 -1
  6. package/esm/src/constants.js +4 -4
  7. package/esm/src/constants.js.map +1 -1
  8. package/esm/src/constants.metadata.json +1 -1
  9. package/esm/src/core_private.d.ts +3 -2
  10. package/esm/src/core_private.js +3 -2
  11. package/esm/src/core_private.js.map +1 -1
  12. package/esm/src/core_private.metadata.json +1 -1
  13. package/esm/src/directives/router_directives.d.ts +21 -0
  14. package/esm/src/directives/router_directives.js +24 -0
  15. package/esm/src/directives/router_directives.js.map +1 -0
  16. package/esm/src/directives/router_directives.metadata.json +1 -0
  17. package/esm/src/directives/router_link.d.ts +4 -2
  18. package/esm/src/directives/router_link.js +21 -13
  19. package/esm/src/directives/router_link.js.map +1 -1
  20. package/esm/src/directives/router_link.metadata.json +1 -1
  21. package/esm/src/directives/router_outlet.d.ts +6 -6
  22. package/esm/src/directives/router_outlet.js +13 -11
  23. package/esm/src/directives/router_outlet.js.map +1 -1
  24. package/esm/src/directives/router_outlet.metadata.json +1 -1
  25. package/esm/src/facade/async.d.ts +11 -4
  26. package/esm/src/facade/async.js +25 -15
  27. package/esm/src/facade/async.js.map +1 -1
  28. package/esm/src/facade/base_wrapped_exception.js +4 -4
  29. package/esm/src/facade/base_wrapped_exception.js.map +1 -1
  30. package/esm/src/facade/collection.js +1 -1
  31. package/esm/src/facade/collection.js.map +1 -1
  32. package/esm/src/facade/collection.metadata.json +1 -1
  33. package/esm/src/facade/exception_handler.d.ts +2 -11
  34. package/esm/src/facade/exception_handler.js +8 -7
  35. package/esm/src/facade/exception_handler.js.map +1 -1
  36. package/esm/src/facade/exceptions.d.ts +4 -0
  37. package/esm/src/facade/exceptions.js +6 -2
  38. package/esm/src/facade/exceptions.js.map +1 -1
  39. package/esm/src/facade/exceptions.metadata.json +1 -0
  40. package/esm/src/facade/lang.d.ts +6 -4
  41. package/esm/src/facade/lang.js +12 -11
  42. package/esm/src/facade/lang.js.map +1 -1
  43. package/esm/src/facade/lang.metadata.json +1 -1
  44. package/esm/src/facade/promise.js.map +1 -1
  45. package/esm/src/interfaces.js.map +1 -1
  46. package/esm/src/lifecycle_reflector.js.map +1 -1
  47. package/esm/src/link.d.ts +1 -1
  48. package/esm/src/link.js +31 -18
  49. package/esm/src/link.js.map +1 -1
  50. package/esm/src/metadata/decorators.d.ts +1 -1
  51. package/esm/src/metadata/decorators.js +1 -1
  52. package/esm/src/metadata/decorators.js.map +1 -1
  53. package/esm/src/metadata/decorators.metadata.json +1 -1
  54. package/esm/src/metadata/metadata.d.ts +3 -3
  55. package/esm/src/metadata/metadata.js +1 -1
  56. package/esm/src/metadata/metadata.js.map +1 -1
  57. package/esm/src/recognize.d.ts +3 -3
  58. package/esm/src/recognize.js +57 -41
  59. package/esm/src/recognize.js.map +1 -1
  60. package/esm/src/router.d.ts +3 -23
  61. package/esm/src/router.js +54 -58
  62. package/esm/src/router.js.map +1 -1
  63. package/esm/src/router_providers.d.ts +1 -1
  64. package/esm/src/router_providers.js +3 -7
  65. package/esm/src/router_providers.js.map +1 -1
  66. package/esm/src/router_providers.metadata.json +1 -1
  67. package/esm/src/router_providers_common.d.ts +7 -0
  68. package/esm/src/router_providers_common.js +10 -7
  69. package/esm/src/router_providers_common.js.map +1 -1
  70. package/esm/src/router_providers_common.metadata.json +1 -1
  71. package/esm/src/router_url_serializer.js +9 -9
  72. package/esm/src/router_url_serializer.js.map +1 -1
  73. package/esm/src/segments.d.ts +7 -12
  74. package/esm/src/segments.js +27 -45
  75. package/esm/src/segments.js.map +1 -1
  76. package/esm/src/segments.metadata.json +1 -0
  77. package/esm/testing/router_testing_providers.js +10 -3
  78. package/esm/testing/router_testing_providers.js.map +1 -1
  79. package/esm/testing/router_testing_providers.metadata.json +1 -1
  80. package/esm/testing.js.map +1 -1
  81. package/index.d.ts +7 -25
  82. package/index.js +22 -39
  83. package/index.js.map +1 -1
  84. package/package.json +8 -4
  85. package/src/constants.js +4 -4
  86. package/src/constants.js.map +1 -1
  87. package/src/constants.metadata.json +1 -1
  88. package/src/core_private.d.ts +3 -2
  89. package/src/core_private.js +1 -0
  90. package/src/core_private.js.map +1 -1
  91. package/src/core_private.metadata.json +1 -1
  92. package/src/directives/router_directives.d.ts +21 -0
  93. package/src/directives/router_directives.js +25 -0
  94. package/src/directives/router_directives.js.map +1 -0
  95. package/src/directives/router_directives.metadata.json +1 -0
  96. package/src/directives/router_link.d.ts +4 -2
  97. package/src/directives/router_link.js +20 -12
  98. package/src/directives/router_link.js.map +1 -1
  99. package/src/directives/router_link.metadata.json +1 -1
  100. package/src/directives/router_outlet.d.ts +6 -6
  101. package/src/directives/router_outlet.js +13 -11
  102. package/src/directives/router_outlet.js.map +1 -1
  103. package/src/directives/router_outlet.metadata.json +1 -1
  104. package/src/facade/async.d.ts +11 -4
  105. package/src/facade/async.js +27 -17
  106. package/src/facade/async.js.map +1 -1
  107. package/src/facade/base_wrapped_exception.js +4 -4
  108. package/src/facade/base_wrapped_exception.js.map +1 -1
  109. package/src/facade/collection.js.map +1 -1
  110. package/src/facade/collection.metadata.json +1 -1
  111. package/src/facade/exception_handler.d.ts +2 -11
  112. package/src/facade/exception_handler.js +8 -7
  113. package/src/facade/exception_handler.js.map +1 -1
  114. package/src/facade/exceptions.d.ts +4 -0
  115. package/src/facade/exceptions.js +6 -2
  116. package/src/facade/exceptions.js.map +1 -1
  117. package/src/facade/exceptions.metadata.json +1 -0
  118. package/src/facade/lang.d.ts +6 -4
  119. package/src/facade/lang.js +12 -11
  120. package/src/facade/lang.js.map +1 -1
  121. package/src/facade/lang.metadata.json +1 -1
  122. package/src/facade/promise.js.map +1 -1
  123. package/src/interfaces.js.map +1 -1
  124. package/src/lifecycle_reflector.js.map +1 -1
  125. package/src/link.d.ts +1 -1
  126. package/src/link.js +33 -18
  127. package/src/link.js.map +1 -1
  128. package/src/metadata/decorators.d.ts +1 -1
  129. package/src/metadata/decorators.js +1 -1
  130. package/src/metadata/decorators.js.map +1 -1
  131. package/src/metadata/decorators.metadata.json +1 -1
  132. package/src/metadata/metadata.d.ts +3 -3
  133. package/src/metadata/metadata.js +1 -1
  134. package/src/metadata/metadata.js.map +1 -1
  135. package/src/recognize.d.ts +3 -3
  136. package/src/recognize.js +62 -42
  137. package/src/recognize.js.map +1 -1
  138. package/src/router.d.ts +3 -23
  139. package/src/router.js +64 -64
  140. package/src/router.js.map +1 -1
  141. package/src/router_providers.d.ts +1 -1
  142. package/src/router_providers.js +3 -7
  143. package/src/router_providers.js.map +1 -1
  144. package/src/router_providers.metadata.json +1 -1
  145. package/src/router_providers_common.d.ts +7 -0
  146. package/src/router_providers_common.js +10 -5
  147. package/src/router_providers_common.js.map +1 -1
  148. package/src/router_providers_common.metadata.json +1 -1
  149. package/src/router_url_serializer.js +8 -8
  150. package/src/router_url_serializer.js.map +1 -1
  151. package/src/segments.d.ts +7 -12
  152. package/src/segments.js +26 -44
  153. package/src/segments.js.map +1 -1
  154. package/src/segments.metadata.json +1 -0
  155. package/testing/router_testing_providers.js +9 -2
  156. package/testing/router_testing_providers.js.map +1 -1
  157. package/testing/router_testing_providers.metadata.json +1 -1
  158. package/testing.js.map +1 -1
  159. package/esm/index.metadata.json +0 -1
  160. package/index.metadata.json +0 -1
package/src/recognize.js CHANGED
@@ -1,22 +1,22 @@
1
1
  "use strict";
2
- var segments_1 = require('./segments');
3
- var metadata_1 = require('./metadata/metadata');
4
- var lang_1 = require('./facade/lang');
5
- var collection_1 = require('./facade/collection');
6
- var promise_1 = require('./facade/promise');
7
2
  var core_1 = require('@angular/core');
8
3
  var constants_1 = require('./constants');
9
- var core_2 = require('@angular/core');
10
- // TODO: vsavkin: recognize should take the old tree and merge it
11
- function recognize(componentResolver, type, url) {
12
- var matched = new _MatchResult(type, [url.root], {}, segments_1.rootNode(url).children, []);
13
- return _constructSegment(componentResolver, matched).then(function (roots) { return new segments_1.RouteTree(roots[0]); });
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
14
  }
15
15
  exports.recognize = recognize;
16
- function _recognize(componentResolver, parentType, url) {
17
- var metadata = _readMetadata(parentType); // should read from the factory instead
16
+ function _recognize(componentResolver, parentComponent, url, existingSegments) {
17
+ var metadata = _readMetadata(parentComponent); // should read from the factory instead
18
18
  if (lang_1.isBlank(metadata)) {
19
- throw new core_1.BaseException("Component '" + lang_1.stringify(parentType) + "' does not have route configuration");
19
+ throw new core_1.BaseException("Component '" + lang_1.stringify(parentComponent) + "' does not have route configuration");
20
20
  }
21
21
  var match;
22
22
  try {
@@ -25,49 +25,60 @@ function _recognize(componentResolver, parentType, url) {
25
25
  catch (e) {
26
26
  return promise_1.PromiseWrapper.reject(e, null);
27
27
  }
28
- var main = _constructSegment(componentResolver, match);
29
- var aux = _recognizeMany(componentResolver, parentType, match.aux).then(_checkOutletNameUniqueness);
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);
30
33
  return promise_1.PromiseWrapper.all([main, aux]).then(collection_1.ListWrapper.flatten);
31
34
  }
32
- function _recognizeMany(componentResolver, parentType, urls) {
33
- var recognized = urls.map(function (u) { return _recognize(componentResolver, parentType, u); });
35
+ function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
36
+ var recognized = urls.map(function (u) { return _recognize(componentResolver, parentComponent, u, existingSegments); });
34
37
  return promise_1.PromiseWrapper.all(recognized).then(collection_1.ListWrapper.flatten);
35
38
  }
36
- function _constructSegment(componentResolver, matched) {
37
- return componentResolver.resolveComponent(matched.component)
38
- .then(function (factory) {
39
- var urlOutlet = matched.consumedUrlSegments.length === 0 ||
40
- lang_1.isBlank(matched.consumedUrlSegments[0].outlet) ?
41
- constants_1.DEFAULT_OUTLET_NAME :
42
- matched.consumedUrlSegments[0].outlet;
43
- var segment = new segments_1.RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet, matched.component, factory);
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 : [];
44
43
  if (matched.leftOverUrl.length > 0) {
45
- return _recognizeMany(componentResolver, matched.component, matched.leftOverUrl)
44
+ return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
46
45
  .then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
47
46
  }
48
47
  else {
49
- return _recognizeLeftOvers(componentResolver, matched.component)
48
+ return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
50
49
  .then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
51
50
  }
52
51
  });
53
52
  }
54
- function _recognizeLeftOvers(componentResolver, parentType) {
55
- return componentResolver.resolveComponent(parentType)
56
- .then(function (factory) {
57
- var metadata = _readMetadata(parentType);
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);
58
67
  if (lang_1.isBlank(metadata)) {
59
68
  return [];
60
69
  }
61
- var r = metadata.routes.filter(function (r) { return r.path == "" || r.path == "/"; });
70
+ var r = metadata.routes.filter(function (r) { return r.path == '' || r.path == '/'; });
62
71
  if (r.length === 0) {
63
72
  return promise_1.PromiseWrapper.resolve([]);
64
73
  }
65
74
  else {
66
- return _recognizeLeftOvers(componentResolver, r[0].component)
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)
67
79
  .then(function (children) {
68
- return componentResolver.resolveComponent(r[0].component)
69
- .then(function (factory) {
70
- var segment = new segments_1.RouteSegment([], {}, constants_1.DEFAULT_OUTLET_NAME, r[0].component, factory);
80
+ return componentResolver.resolveComponent(r[0].component).then(function (factory) {
81
+ var segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet_1);
71
82
  return [new segments_1.TreeNode(segment, children)];
72
83
  });
73
84
  });
@@ -82,15 +93,15 @@ function _match(metadata, url) {
82
93
  return matchingResult;
83
94
  }
84
95
  }
85
- var availableRoutes = metadata.routes.map(function (r) { return ("'" + r.path + "'"); }).join(", ");
96
+ var availableRoutes = metadata.routes.map(function (r) { return ("'" + r.path + "'"); }).join(', ');
86
97
  throw new core_1.BaseException("Cannot match any routes. Current segment: '" + url.value + "'. Available routes: [" + availableRoutes + "].");
87
98
  }
88
99
  function _matchWithParts(route, url) {
89
- var path = route.path.startsWith("/") ? route.path.substring(1) : route.path;
90
- if (path == "*") {
100
+ var path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
101
+ if (path == '*') {
91
102
  return new _MatchResult(route.component, [], null, [], []);
92
103
  }
93
- var parts = path.split("/");
104
+ var parts = path.split('/');
94
105
  var positionalParams = {};
95
106
  var consumedUrlSegments = [];
96
107
  var lastParent = null;
@@ -102,7 +113,7 @@ function _matchWithParts(route, url) {
102
113
  var p_1 = parts[i];
103
114
  var isLastSegment = i === parts.length - 1;
104
115
  var isLastParent = i === parts.length - 2;
105
- var isPosParam = p_1.startsWith(":");
116
+ var isPosParam = p_1.startsWith(':');
106
117
  if (!isPosParam && p_1 != current.value.segment)
107
118
  return null;
108
119
  if (isLastSegment) {
@@ -143,10 +154,19 @@ var _MatchResult = (function () {
143
154
  this.leftOverUrl = leftOverUrl;
144
155
  this.aux = aux;
145
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
+ });
146
166
  return _MatchResult;
147
167
  }());
148
168
  function _readMetadata(componentType) {
149
- var metadata = core_2.reflector.annotations(componentType).filter(function (f) { return f instanceof metadata_1.RoutesMetadata; });
169
+ var metadata = core_private_1.reflector.annotations(componentType).filter(function (f) { return f instanceof metadata_1.RoutesMetadata; });
150
170
  return collection_1.ListWrapper.first(metadata);
151
171
  }
152
172
  //# sourceMappingURL=recognize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/recognize.ts"],"names":[],"mappings":"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","sourcesContent":["interface DecoratorInvocation {\n type: Function;\n args?: any[];\n }\n import {RouteSegment, UrlSegment, Tree, TreeNode, rootNode, UrlTree, RouteTree} from './segments';\nimport {RoutesMetadata, RouteMetadata} from './metadata/metadata';\nimport {Type, isBlank, isPresent, stringify} from './facade/lang';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {PromiseWrapper} from './facade/promise';\nimport {BaseException} from '@angular/core';\nimport {ComponentResolver} from '@angular/core';\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {reflector} from '@angular/core';\n\n// TODO: vsavkin: recognize should take the old tree and merge it\nexport function recognize(componentResolver: ComponentResolver, type: Type,\n url: UrlTree): Promise<RouteTree> {\n let matched = new _MatchResult(type, [url.root], {}, rootNode(url).children, []);\n return _constructSegment(componentResolver, matched).then(roots => new RouteTree(roots[0]));\n}\n\nfunction _recognize(componentResolver: ComponentResolver, parentType: Type,\n url: TreeNode<UrlSegment>): Promise<TreeNode<RouteSegment>[]> {\n let metadata = _readMetadata(parentType); // should read from the factory instead\n if (isBlank(metadata)) {\n throw new BaseException(\n `Component '${stringify(parentType)}' does not have route configuration`);\n }\n\n let match;\n try {\n match = _match(metadata, url);\n } catch (e) {\n return PromiseWrapper.reject(e, null);\n }\n\n let main = _constructSegment(componentResolver, match);\n let aux =\n _recognizeMany(componentResolver, parentType, match.aux).then(_checkOutletNameUniqueness);\n return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);\n}\n\nfunction _recognizeMany(componentResolver: ComponentResolver, parentType: Type,\n urls: TreeNode<UrlSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let recognized = urls.map(u => _recognize(componentResolver, parentType, u));\n return PromiseWrapper.all(recognized).then(ListWrapper.flatten);\n}\n\nfunction _constructSegment(componentResolver: ComponentResolver,\n matched: _MatchResult): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(matched.component)\n .then(factory => {\n let urlOutlet = matched.consumedUrlSegments.length === 0 ||\n isBlank(matched.consumedUrlSegments[0].outlet) ?\n DEFAULT_OUTLET_NAME :\n matched.consumedUrlSegments[0].outlet;\n\n let segment = new RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet,\n matched.component, factory);\n\n if (matched.leftOverUrl.length > 0) {\n return _recognizeMany(componentResolver, matched.component, matched.leftOverUrl)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n } else {\n return _recognizeLeftOvers(componentResolver, matched.component)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n }\n });\n}\n\nfunction _recognizeLeftOvers(componentResolver: ComponentResolver,\n parentType: Type): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(parentType)\n .then(factory => {\n let metadata = _readMetadata(parentType);\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 return _recognizeLeftOvers(componentResolver, r[0].component)\n .then(children => {\n return componentResolver.resolveComponent(r[0].component)\n .then(factory => {\n let segment =\n new RouteSegment([], {}, DEFAULT_OUTLET_NAME, r[0].component, factory);\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 = [];\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[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 =\n <{[key: string]: string}>StringMapWrapper.merge(p, positionalParams);\n let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : [];\n\n return new _MatchResult(route.component, consumedUrlSegments, parameters, lastSegment.children,\n axuUrlSubtrees);\n}\n\nfunction _checkOutletNameUniqueness(nodes: TreeNode<RouteSegment>[]): TreeNode<RouteSegment>[] {\n let names = {};\n nodes.forEach(n => {\n let segmentWithSameOutletName = names[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[n.value.outlet] = n.value;\n });\n return nodes;\n}\n\nclass _MatchResult {\n constructor(public component: Type, public consumedUrlSegments: UrlSegment[],\n public parameters: {[key: string]: string},\n public leftOverUrl: TreeNode<UrlSegment>[], public aux: TreeNode<UrlSegment>[]) {}\n}\n\nfunction _readMetadata(componentType: Type) {\n let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);\n return ListWrapper.first(metadata);\n}\n"]}
1
+ {"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/recognize.ts"],"names":[],"mappings":";AAAA,qBAAiE,eAAe,CAAC,CAAA;AAEjF,0BAAkC,aAAa,CAAC,CAAA;AAChD,6BAAwB,gBAAgB,CAAC,CAAA;AACzC,2BAA4C,qBAAqB,CAAC,CAAA;AAClE,qBAAkD,eAAe,CAAC,CAAA;AAClE,wBAA6B,kBAAkB,CAAC,CAAA;AAChD,yBAA4C,qBAAqB,CAAC,CAAA;AAClE,yBAAuG,YAAY,CAAC,CAAA;AAEpH,mBACI,iBAAoC,EAAE,aAAmB,EAAE,GAAY,EACvE,YAAuB;IACzB,IAAI,OAAO,GAAG,IAAI,YAAY,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,mBAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,mBAAQ,CAAC,YAAY,CAAC,CAAC;SACvE,IAAI,CAAC,UAAA,KAAK,IAAI,OAAA,IAAI,oBAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAvB,CAAuB,CAAC,CAAC;AAC9C,CAAC;AANe,iBAAS,YAMxB,CAAA;AAED,oBACI,iBAAoC,EAAE,eAAqB,EAAE,GAAyB,EACtF,gBAA0C;IAC5C,IAAI,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC,CAAE,uCAAuC;IACvF,EAAE,CAAC,CAAC,cAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,oBAAa,CACnB,gBAAc,gBAAS,CAAC,eAAe,CAAC,wCAAqC,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,KAAU,CAAmB;IACjC,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChC,CAAE;IAAA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACX,MAAM,CAAC,wBAAc,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,uBAAuB,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAA9B,CAA8B,CAAC,CAAC;IAC3F,IAAI,sBAAsB,GACtB,uBAAuB,CAAC,MAAM,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE3E,IAAI,IAAI,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC;IAC/E,IAAI,GAAG,GAAG,cAAc,CAAC,iBAAiB,EAAE,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC;SAC1E,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAChD,MAAM,CAAC,wBAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAW,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,wBACI,iBAAoC,EAAE,eAAqB,EAAE,IAA4B,EACzF,gBAA0C;IAC5C,IAAI,UAAU,GACV,IAAI,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,UAAU,CAAC,iBAAiB,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,CAAC,EAAnE,CAAmE,CAAC,CAAC;IACvF,MAAM,CAAC,wBAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,wBAAW,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,2BACI,iBAAoC,EAAE,OAAqB,EAC3D,eAAuC;IACzC,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAA,OAAO;QACvE,IAAI,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACvE,IAAI,gBAAgB,GAAG,gBAAS,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC,QAAQ,GAAG,EAAE,CAAC;QAElF,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,cAAc,CACV,iBAAiB,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC;iBACtF,IAAI,CAAC,UAAA,QAAQ,IAAI,OAAA,CAAC,IAAI,mBAAQ,CAAe,OAAO,EAAE,QAAQ,CAAC,CAAC,EAA/C,CAA+C,CAAC,CAAC;QACzE,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC;iBACjF,IAAI,CAAC,UAAA,QAAQ,IAAI,OAAA,CAAC,IAAI,mBAAQ,CAAe,OAAO,EAAE,QAAQ,CAAC,CAAC,EAA/C,CAA+C,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+BACI,OAAqB,EAAE,OAA8B,EACrD,WAAmC;IACrC,IAAI,OAAO,GAAG,gBAAS,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;IAEhE,EAAE,CAAC,CAAC,gBAAS,CAAC,OAAO,CAAC,IAAI,2BAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB,CAAC;QACxF,6BAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;QAC/D,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC;IACjB,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,MAAM,CAAC,IAAI,uBAAY,CACnB,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,EACtF,OAAO,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED,6BACI,iBAAoC,EAAE,eAAqB,EAC3D,gBAA0C;IAC5C,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAA,OAAO;QACrE,IAAI,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACpD,EAAE,CAAC,CAAC,cAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,GAAW,QAAQ,CAAC,MAAO,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,EAA7B,CAA6B,CAAC,CAAC;QAC5E,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,wBAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,IAAI,0BAA0B,GAC1B,gBAAgB,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,+BAAmB,EAArC,CAAqC,CAAC,CAAC;YACxE,IAAI,2BAAyB,GACzB,0BAA0B,CAAC,MAAM,GAAG,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACjF,IAAI,gBAAgB,GAChB,gBAAS,CAAC,2BAAyB,CAAC,GAAG,2BAAyB,CAAC,QAAQ,GAAG,EAAE,CAAC;YAEnF,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,gBAAgB,CAAC;iBAC1E,IAAI,CAAC,UAAA,QAAQ;gBACZ,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAA,OAAO;oBACpE,IAAI,OAAO,GAAG,qBAAqB,CAC/B,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EACzD,2BAAyB,CAAC,CAAC;oBAC/B,MAAM,CAAC,CAAC,IAAI,mBAAQ,CAAe,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gBAAgB,QAAwB,EAAE,GAAyB;IACjE,GAAG,CAAC,CAAU,UAAe,EAAf,KAAA,QAAQ,CAAC,MAAM,EAAf,cAAe,EAAf,IAAe,CAAC;QAAzB,IAAI,CAAC,SAAA;QACR,IAAI,cAAc,GAAG,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7C,EAAE,CAAC,CAAC,gBAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,cAAc,CAAC;QACxB,CAAC;KACF;IACD,IAAI,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,OAAI,CAAC,CAAC,IAAI,OAAG,EAAb,CAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,IAAI,oBAAa,CACnB,gDAA8C,GAAG,CAAC,KAAK,8BAAyB,eAAe,OAAI,CAAC,CAAC;AAC3G,CAAC;AAED,yBAAyB,KAAoB,EAAE,GAAyB;IACtE,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IAE7E,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,mBAAmB,GAA4B,EAAE,CAAC;IAEtD,IAAI,UAAU,GAAyB,IAAI,CAAC;IAC5C,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,EAAE,CAAC,CAAC,cAAO,CAAC,OAAO,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC;QAElC,IAAI,GAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,aAAa,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,IAAI,YAAY,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,IAAI,UAAU,GAAG,GAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEnC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,GAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC;QAC3D,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YAClB,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC;QACD,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC;QAED,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACd,gBAA0C,CAAC,GAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QACtF,CAAC;QAED,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAExC,OAAO,GAAG,wBAAW,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;IACrC,IAAI,UAAU,GAA4B,6BAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACtF,IAAI,cAAc,GAAG,gBAAS,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAE/E,MAAM,CAAC,IAAI,YAAY,CACnB,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC9F,CAAC;AAED,oCAAoC,KAA+B;IACjE,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,CAAC,OAAO,CAAC,UAAA,CAAC;QACb,IAAI,yBAAyB,GAAI,KAA+B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjF,EAAE,CAAC,CAAC,gBAAS,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,yBAAyB,CAAC,sBAAsB,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;YACvC,MAAM,IAAI,oBAAa,CAAC,qDAAmD,CAAC,eAAU,CAAC,OAAI,CAAC,CAAC;QAC/F,CAAC;QACA,KAA+B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC;AACf,CAAC;AAED;IACE,sBACW,SAAsB,EAAS,mBAAiC,EAChE,UAAmC,EAAS,WAAmC,EAC/E,GAA2B;QAF3B,cAAS,GAAT,SAAS,CAAa;QAAS,wBAAmB,GAAnB,mBAAmB,CAAc;QAChE,eAAU,GAAV,UAAU,CAAyB;QAAS,gBAAW,GAAX,WAAW,CAAwB;QAC/E,QAAG,GAAH,GAAG,CAAwB;IAAG,CAAC;IAE1C,sBAAI,gCAAM;aAAV;YACE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,IAAI,cAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACvF,+BAAmB;gBACnB,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzC,CAAC;;;OAAA;IACH,mBAAC;AAAD,CAAC,AAXD,IAWC;AAED,uBAAuB,aAAmB;IACxC,IAAI,QAAQ,GAAG,wBAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,YAAY,yBAAc,EAA3B,CAA2B,CAAC,CAAC;IAC7F,MAAM,CAAC,wBAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC","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"]}
package/src/router.d.ts CHANGED
@@ -1,18 +1,7 @@
1
- import { ComponentResolver } from '@angular/core';
2
1
  import { RouterOutlet } from './directives/router_outlet';
3
- import { Type } from './facade/lang';
4
2
  import { Observable } from './facade/async';
5
- import { RouterUrlSerializer } from './router_url_serializer';
6
- import { Location } from '@angular/common';
7
- import { RouteSegment, UrlTree, RouteTree } from './segments';
8
- /**
9
- * @internal
10
- */
3
+ import { RouteSegment, RouteTree, UrlTree } from './segments';
11
4
  export declare class RouterOutletMap {
12
- /** @internal */
13
- _outlets: {
14
- [name: string]: RouterOutlet;
15
- };
16
5
  registerOutlet(name: string, outlet: RouterOutlet): void;
17
6
  }
18
7
  /**
@@ -28,14 +17,10 @@ export declare class Router {
28
17
  private _urlSerializer;
29
18
  private _routerOutletMap;
30
19
  private _location;
31
- private _prevTree;
20
+ private _routeTree;
32
21
  private _urlTree;
33
22
  private _locationSubscription;
34
23
  private _changes;
35
- /**
36
- * @internal
37
- */
38
- constructor(_rootComponent: Object, _rootComponentType: Type, _componentResolver: ComponentResolver, _urlSerializer: RouterUrlSerializer, _routerOutletMap: RouterOutletMap, _location: Location);
39
24
  /**
40
25
  * Returns the current url tree.
41
26
  */
@@ -69,10 +54,6 @@ export declare class Router {
69
54
  * ```
70
55
  */
71
56
  navigate(commands: any[], segment?: RouteSegment): Promise<void>;
72
- /**
73
- * @internal
74
- */
75
- dispose(): void;
76
57
  /**
77
58
  * Applies an array of commands to the current url tree and creates
78
59
  * a new url tree.
@@ -109,7 +90,6 @@ export declare class Router {
109
90
  * Serializes a {@link UrlTree} into a string.
110
91
  */
111
92
  serializeUrl(url: UrlTree): string;
112
- private _createInitialTree();
113
93
  private _setUpLocationChangeListener();
114
- private _navigate(url);
94
+ private _navigate(url, preventPushState?);
115
95
  }
package/src/router.js CHANGED
@@ -1,18 +1,13 @@
1
1
  "use strict";
2
2
  var core_1 = require('@angular/core');
3
- var lang_1 = require('./facade/lang');
4
- var collection_1 = require('./facade/collection');
3
+ var constants_1 = require('./constants');
5
4
  var async_1 = require('./facade/async');
6
- var collection_2 = require('./facade/collection');
7
- var core_2 = require('@angular/core');
8
- var recognize_1 = require('./recognize');
5
+ var collection_1 = require('./facade/collection');
6
+ var lang_1 = require('./facade/lang');
7
+ var lifecycle_reflector_1 = require('./lifecycle_reflector');
9
8
  var link_1 = require('./link');
9
+ var recognize_1 = require('./recognize');
10
10
  var segments_1 = require('./segments');
11
- var lifecycle_reflector_1 = require('./lifecycle_reflector');
12
- var constants_1 = require('./constants');
13
- /**
14
- * @internal
15
- */
16
11
  var RouterOutletMap = (function () {
17
12
  function RouterOutletMap() {
18
13
  /** @internal */
@@ -40,7 +35,7 @@ var Router = (function () {
40
35
  this._routerOutletMap = _routerOutletMap;
41
36
  this._location = _location;
42
37
  this._changes = new async_1.EventEmitter();
43
- this._prevTree = this._createInitialTree();
38
+ this._routeTree = segments_1.createEmptyRouteTree(this._rootComponentType);
44
39
  this._setUpLocationChangeListener();
45
40
  this.navigateByUrl(this._location.path());
46
41
  }
@@ -56,7 +51,7 @@ var Router = (function () {
56
51
  /**
57
52
  * Returns the current route tree.
58
53
  */
59
- get: function () { return this._prevTree; },
54
+ get: function () { return this._routeTree; },
60
55
  enumerable: true,
61
56
  configurable: true
62
57
  });
@@ -129,32 +124,36 @@ var Router = (function () {
129
124
  * ```
130
125
  */
131
126
  Router.prototype.createUrlTree = function (commands, segment) {
132
- var s = lang_1.isPresent(segment) ? segment : this._prevTree.root;
133
- return link_1.link(s, this._prevTree, this.urlTree, commands);
127
+ var s = lang_1.isPresent(segment) ? segment : this._routeTree.root;
128
+ return link_1.link(s, this._routeTree, this.urlTree, commands);
134
129
  };
135
130
  /**
136
131
  * Serializes a {@link UrlTree} into a string.
137
132
  */
138
133
  Router.prototype.serializeUrl = function (url) { return this._urlSerializer.serialize(url); };
139
- Router.prototype._createInitialTree = function () {
140
- var root = new segments_1.RouteSegment([new segments_1.UrlSegment("", {}, null)], {}, constants_1.DEFAULT_OUTLET_NAME, this._rootComponentType, null);
141
- return new segments_1.RouteTree(new segments_1.TreeNode(root, []));
142
- };
143
134
  Router.prototype._setUpLocationChangeListener = function () {
144
135
  var _this = this;
145
- this._locationSubscription = this._location.subscribe(function (change) { _this._navigate(_this._urlSerializer.parse(change['url'])); });
136
+ this._locationSubscription = this._location.subscribe(function (change) { _this._navigate(_this._urlSerializer.parse(change['url']), change['pop']); });
146
137
  };
147
- Router.prototype._navigate = function (url) {
138
+ Router.prototype._navigate = function (url, preventPushState) {
148
139
  var _this = this;
149
140
  this._urlTree = url;
150
- return recognize_1.recognize(this._componentResolver, this._rootComponentType, url)
141
+ return recognize_1.recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)
151
142
  .then(function (currTree) {
152
- return new _LoadSegments(currTree, _this._prevTree)
153
- .load(_this._routerOutletMap, _this._rootComponent)
143
+ return new _ActivateSegments(currTree, _this._routeTree)
144
+ .activate(_this._routerOutletMap, _this._rootComponent)
154
145
  .then(function (updated) {
155
146
  if (updated) {
156
- _this._prevTree = currTree;
157
- _this._location.go(_this._urlSerializer.serialize(_this._urlTree));
147
+ _this._routeTree = currTree;
148
+ if (lang_1.isBlank(preventPushState) || !preventPushState) {
149
+ var path = _this._urlSerializer.serialize(_this._urlTree);
150
+ if (_this._location.isCurrentPathEqualTo(path)) {
151
+ _this._location.replaceState(path);
152
+ }
153
+ else {
154
+ _this._location.go(path);
155
+ }
156
+ }
158
157
  _this._changes.emit(null);
159
158
  }
160
159
  });
@@ -163,39 +162,38 @@ var Router = (function () {
163
162
  return Router;
164
163
  }());
165
164
  exports.Router = Router;
166
- var _LoadSegments = (function () {
167
- function _LoadSegments(currTree, prevTree) {
165
+ var _ActivateSegments = (function () {
166
+ function _ActivateSegments(currTree, prevTree) {
168
167
  this.currTree = currTree;
169
168
  this.prevTree = prevTree;
170
169
  this.deactivations = [];
171
170
  this.performMutation = true;
172
171
  }
173
- _LoadSegments.prototype.load = function (parentOutletMap, rootComponent) {
172
+ _ActivateSegments.prototype.activate = function (parentOutletMap, rootComponent) {
174
173
  var _this = this;
175
174
  var prevRoot = lang_1.isPresent(this.prevTree) ? segments_1.rootNode(this.prevTree) : null;
176
175
  var currRoot = segments_1.rootNode(this.currTree);
177
- return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)
178
- .then(function (res) {
176
+ return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(function (res) {
179
177
  _this.performMutation = true;
180
178
  if (res) {
181
- _this.loadChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
179
+ _this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
182
180
  }
183
181
  return res;
184
182
  });
185
183
  };
186
- _LoadSegments.prototype.canDeactivate = function (currRoot, prevRoot, outletMap, rootComponent) {
184
+ _ActivateSegments.prototype.canDeactivate = function (currRoot, prevRoot, outletMap, rootComponent) {
187
185
  var _this = this;
188
186
  this.performMutation = false;
189
- this.loadChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
187
+ this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
190
188
  var allPaths = async_1.PromiseWrapper.all(this.deactivations.map(function (r) { return _this.checkCanDeactivatePath(r); }));
191
189
  return allPaths.then(function (values) { return values.filter(function (v) { return v; }).length === values.length; });
192
190
  };
193
- _LoadSegments.prototype.checkCanDeactivatePath = function (path) {
191
+ _ActivateSegments.prototype.checkCanDeactivatePath = function (path) {
194
192
  var _this = this;
195
193
  var curr = async_1.PromiseWrapper.resolve(true);
196
194
  var _loop_1 = function(p) {
197
195
  curr = curr.then(function (_) {
198
- if (lifecycle_reflector_1.hasLifecycleHook("routerCanDeactivate", p)) {
196
+ if (lifecycle_reflector_1.hasLifecycleHook('routerCanDeactivate', p)) {
199
197
  return p.routerCanDeactivate(_this.prevTree, _this.currTree);
200
198
  }
201
199
  else {
@@ -209,68 +207,70 @@ var _LoadSegments = (function () {
209
207
  }
210
208
  return curr;
211
209
  };
212
- _LoadSegments.prototype.loadChildSegments = function (currNode, prevNode, outletMap, components) {
210
+ _ActivateSegments.prototype.activateChildSegments = function (currNode, prevNode, outletMap, components) {
213
211
  var _this = this;
214
- var prevChildren = lang_1.isPresent(prevNode) ?
215
- prevNode.children.reduce(function (m, c) {
216
- m[c.value.outlet] = c;
217
- return m;
218
- }, {}) :
219
- {};
212
+ var prevChildren = lang_1.isPresent(prevNode) ? prevNode.children.reduce(function (m, c) {
213
+ m[c.value.outlet] = c;
214
+ return m;
215
+ }, {}) : {};
220
216
  currNode.children.forEach(function (c) {
221
- _this.loadSegments(c, prevChildren[c.value.outlet], outletMap, components);
222
- collection_2.StringMapWrapper.delete(prevChildren, c.value.outlet);
217
+ _this.activateSegments(c, prevChildren[c.value.outlet], outletMap, components);
218
+ collection_1.StringMapWrapper.delete(prevChildren, c.value.outlet);
219
+ });
220
+ collection_1.StringMapWrapper.forEach(prevChildren, function (v /** TODO #9100 */, k /** TODO #9100 */) {
221
+ return _this.deactivateOutlet(outletMap._outlets[k], components);
223
222
  });
224
- collection_2.StringMapWrapper.forEach(prevChildren, function (v, k) { return _this.unloadOutlet(outletMap._outlets[k], components); });
225
223
  };
226
- _LoadSegments.prototype.loadSegments = function (currNode, prevNode, parentOutletMap, components) {
224
+ _ActivateSegments.prototype.activateSegments = function (currNode, prevNode, parentOutletMap, components) {
227
225
  var curr = currNode.value;
228
226
  var prev = lang_1.isPresent(prevNode) ? prevNode.value : null;
229
227
  var outlet = this.getOutlet(parentOutletMap, currNode.value);
230
- if (segments_1.equalSegments(curr, prev)) {
231
- this.loadChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.loadedComponent]));
228
+ if (curr === prev) {
229
+ this.activateChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));
232
230
  }
233
231
  else {
234
- this.unloadOutlet(outlet, components);
232
+ this.deactivateOutlet(outlet, components);
235
233
  if (this.performMutation) {
236
234
  var outletMap = new RouterOutletMap();
237
- var loadedComponent = this.loadNewSegment(outletMap, curr, prev, outlet);
238
- this.loadChildSegments(currNode, prevNode, outletMap, components.concat([loadedComponent]));
235
+ var component = this.activateNewSegments(outletMap, curr, prev, outlet);
236
+ this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));
239
237
  }
240
238
  }
241
239
  };
242
- _LoadSegments.prototype.loadNewSegment = function (outletMap, curr, prev, outlet) {
243
- var resolved = core_1.ReflectiveInjector.resolve([core_1.provide(RouterOutletMap, { useValue: outletMap }), core_1.provide(segments_1.RouteSegment, { useValue: curr })]);
244
- var ref = outlet.load(segments_1.routeSegmentComponentFactory(curr), resolved, outletMap);
245
- if (lifecycle_reflector_1.hasLifecycleHook("routerOnActivate", ref.instance)) {
240
+ _ActivateSegments.prototype.activateNewSegments = function (outletMap, curr, prev, outlet) {
241
+ var resolved = core_1.ReflectiveInjector.resolve([{ provide: RouterOutletMap, useValue: outletMap }, { provide: segments_1.RouteSegment, useValue: curr }]);
242
+ var ref = outlet.activate(segments_1.routeSegmentComponentFactory(curr), resolved, outletMap);
243
+ if (lifecycle_reflector_1.hasLifecycleHook('routerOnActivate', ref.instance)) {
246
244
  ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);
247
245
  }
248
246
  return ref.instance;
249
247
  };
250
- _LoadSegments.prototype.getOutlet = function (outletMap, segment) {
248
+ _ActivateSegments.prototype.getOutlet = function (outletMap, segment) {
251
249
  var outlet = outletMap._outlets[segment.outlet];
252
250
  if (lang_1.isBlank(outlet)) {
253
251
  if (segment.outlet == constants_1.DEFAULT_OUTLET_NAME) {
254
- throw new core_2.BaseException("Cannot find default outlet");
252
+ throw new core_1.BaseException("Cannot find default outlet");
255
253
  }
256
254
  else {
257
- throw new core_2.BaseException("Cannot find the outlet " + segment.outlet);
255
+ throw new core_1.BaseException("Cannot find the outlet " + segment.outlet);
258
256
  }
259
257
  }
260
258
  return outlet;
261
259
  };
262
- _LoadSegments.prototype.unloadOutlet = function (outlet, components) {
260
+ _ActivateSegments.prototype.deactivateOutlet = function (outlet, components) {
263
261
  var _this = this;
264
- if (lang_1.isPresent(outlet) && outlet.isLoaded) {
265
- collection_2.StringMapWrapper.forEach(outlet.outletMap._outlets, function (v, k) { return _this.unloadOutlet(v, components); });
262
+ if (lang_1.isPresent(outlet) && outlet.isActivated) {
263
+ collection_1.StringMapWrapper.forEach(outlet.outletMap._outlets, function (v /** TODO #9100 */, k /** TODO #9100 */) {
264
+ return _this.deactivateOutlet(v, components);
265
+ });
266
266
  if (this.performMutation) {
267
- outlet.unload();
267
+ outlet.deactivate();
268
268
  }
269
269
  else {
270
- this.deactivations.push(components.concat([outlet.loadedComponent]));
270
+ this.deactivations.push(components.concat([outlet.component]));
271
271
  }
272
272
  }
273
273
  };
274
- return _LoadSegments;
274
+ return _ActivateSegments;
275
275
  }());
276
276
  //# sourceMappingURL=router.js.map