@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
@@ -1,20 +1,20 @@
1
- import { RouteSegment, TreeNode, rootNode, RouteTree } from './segments';
2
- import { RoutesMetadata } from './metadata/metadata';
3
- import { isBlank, isPresent, stringify } from './facade/lang';
4
- import { ListWrapper, StringMapWrapper } from './facade/collection';
5
- import { PromiseWrapper } from './facade/promise';
6
1
  import { BaseException } from '@angular/core';
7
2
  import { DEFAULT_OUTLET_NAME } from './constants';
8
- import { reflector } from '@angular/core';
9
- // TODO: vsavkin: recognize should take the old tree and merge it
10
- export function recognize(componentResolver, type, url) {
11
- let matched = new _MatchResult(type, [url.root], {}, rootNode(url).children, []);
12
- return _constructSegment(componentResolver, matched).then(roots => new RouteTree(roots[0]));
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
13
  }
14
- function _recognize(componentResolver, parentType, url) {
15
- let metadata = _readMetadata(parentType); // should read from the factory instead
14
+ function _recognize(componentResolver, parentComponent, url, existingSegments) {
15
+ let metadata = _readMetadata(parentComponent); // should read from the factory instead
16
16
  if (isBlank(metadata)) {
17
- throw new BaseException(`Component '${stringify(parentType)}' does not have route configuration`);
17
+ throw new BaseException(`Component '${stringify(parentComponent)}' does not have route configuration`);
18
18
  }
19
19
  let match;
20
20
  try {
@@ -23,49 +23,60 @@ function _recognize(componentResolver, parentType, url) {
23
23
  catch (e) {
24
24
  return PromiseWrapper.reject(e, null);
25
25
  }
26
- let main = _constructSegment(componentResolver, match);
27
- let aux = _recognizeMany(componentResolver, parentType, match.aux).then(_checkOutletNameUniqueness);
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);
28
31
  return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);
29
32
  }
30
- function _recognizeMany(componentResolver, parentType, urls) {
31
- let recognized = urls.map(u => _recognize(componentResolver, parentType, u));
33
+ function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
34
+ let recognized = urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments));
32
35
  return PromiseWrapper.all(recognized).then(ListWrapper.flatten);
33
36
  }
34
- function _constructSegment(componentResolver, matched) {
35
- return componentResolver.resolveComponent(matched.component)
36
- .then(factory => {
37
- let urlOutlet = matched.consumedUrlSegments.length === 0 ||
38
- isBlank(matched.consumedUrlSegments[0].outlet) ?
39
- DEFAULT_OUTLET_NAME :
40
- matched.consumedUrlSegments[0].outlet;
41
- let segment = new RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet, matched.component, factory);
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 : [];
42
41
  if (matched.leftOverUrl.length > 0) {
43
- return _recognizeMany(componentResolver, matched.component, matched.leftOverUrl)
42
+ return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
44
43
  .then(children => [new TreeNode(segment, children)]);
45
44
  }
46
45
  else {
47
- return _recognizeLeftOvers(componentResolver, matched.component)
46
+ return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
48
47
  .then(children => [new TreeNode(segment, children)]);
49
48
  }
50
49
  });
51
50
  }
52
- function _recognizeLeftOvers(componentResolver, parentType) {
53
- return componentResolver.resolveComponent(parentType)
54
- .then(factory => {
55
- let metadata = _readMetadata(parentType);
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);
56
65
  if (isBlank(metadata)) {
57
66
  return [];
58
67
  }
59
- let r = metadata.routes.filter(r => r.path == "" || r.path == "/");
68
+ let r = metadata.routes.filter(r => r.path == '' || r.path == '/');
60
69
  if (r.length === 0) {
61
70
  return PromiseWrapper.resolve([]);
62
71
  }
63
72
  else {
64
- return _recognizeLeftOvers(componentResolver, r[0].component)
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)
65
77
  .then(children => {
66
- return componentResolver.resolveComponent(r[0].component)
67
- .then(factory => {
68
- let segment = new RouteSegment([], {}, DEFAULT_OUTLET_NAME, r[0].component, factory);
78
+ return componentResolver.resolveComponent(r[0].component).then(factory => {
79
+ let segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet);
69
80
  return [new TreeNode(segment, children)];
70
81
  });
71
82
  });
@@ -79,15 +90,15 @@ function _match(metadata, url) {
79
90
  return matchingResult;
80
91
  }
81
92
  }
82
- let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(", ");
93
+ let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', ');
83
94
  throw new BaseException(`Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);
84
95
  }
85
96
  function _matchWithParts(route, url) {
86
- let path = route.path.startsWith("/") ? route.path.substring(1) : route.path;
87
- if (path == "*") {
97
+ let path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
98
+ if (path == '*') {
88
99
  return new _MatchResult(route.component, [], null, [], []);
89
100
  }
90
- let parts = path.split("/");
101
+ let parts = path.split('/');
91
102
  let positionalParams = {};
92
103
  let consumedUrlSegments = [];
93
104
  let lastParent = null;
@@ -99,7 +110,7 @@ function _matchWithParts(route, url) {
99
110
  let p = parts[i];
100
111
  let isLastSegment = i === parts.length - 1;
101
112
  let isLastParent = i === parts.length - 2;
102
- let isPosParam = p.startsWith(":");
113
+ let isPosParam = p.startsWith(':');
103
114
  if (!isPosParam && p != current.value.segment)
104
115
  return null;
105
116
  if (isLastSegment) {
@@ -140,6 +151,11 @@ class _MatchResult {
140
151
  this.leftOverUrl = leftOverUrl;
141
152
  this.aux = aux;
142
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
+ }
143
159
  }
144
160
  function _readMetadata(componentType) {
145
161
  let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);
@@ -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":"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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"]}
@@ -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/esm/src/router.js CHANGED
@@ -1,17 +1,12 @@
1
- import { provide, ReflectiveInjector } from '@angular/core';
1
+ import { BaseException, ReflectiveInjector } from '@angular/core';
2
+ import { DEFAULT_OUTLET_NAME } from './constants';
3
+ import { EventEmitter, ObservableWrapper, PromiseWrapper } from './facade/async';
4
+ import { ListWrapper, StringMapWrapper } from './facade/collection';
2
5
  import { isBlank, isPresent } from './facade/lang';
3
- import { ListWrapper } from './facade/collection';
4
- import { EventEmitter, PromiseWrapper, ObservableWrapper } from './facade/async';
5
- import { StringMapWrapper } from './facade/collection';
6
- import { BaseException } from '@angular/core';
7
- import { recognize } from './recognize';
8
- import { link } from './link';
9
- import { equalSegments, routeSegmentComponentFactory, RouteSegment, RouteTree, rootNode, TreeNode, UrlSegment } from './segments';
10
6
  import { hasLifecycleHook } from './lifecycle_reflector';
11
- import { DEFAULT_OUTLET_NAME } from './constants';
12
- /**
13
- * @internal
14
- */
7
+ import { link } from './link';
8
+ import { recognize } from './recognize';
9
+ import { RouteSegment, createEmptyRouteTree, rootNode, routeSegmentComponentFactory } from './segments';
15
10
  export class RouterOutletMap {
16
11
  constructor() {
17
12
  /** @internal */
@@ -37,7 +32,7 @@ export class Router {
37
32
  this._routerOutletMap = _routerOutletMap;
38
33
  this._location = _location;
39
34
  this._changes = new EventEmitter();
40
- this._prevTree = this._createInitialTree();
35
+ this._routeTree = createEmptyRouteTree(this._rootComponentType);
41
36
  this._setUpLocationChangeListener();
42
37
  this.navigateByUrl(this._location.path());
43
38
  }
@@ -48,7 +43,7 @@ export class Router {
48
43
  /**
49
44
  * Returns the current route tree.
50
45
  */
51
- get routeTree() { return this._prevTree; }
46
+ get routeTree() { return this._routeTree; }
52
47
  /**
53
48
  * An observable or url changes from the router.
54
49
  */
@@ -114,58 +109,61 @@ export class Router {
114
109
  * ```
115
110
  */
116
111
  createUrlTree(commands, segment) {
117
- let s = isPresent(segment) ? segment : this._prevTree.root;
118
- return link(s, this._prevTree, this.urlTree, commands);
112
+ let s = isPresent(segment) ? segment : this._routeTree.root;
113
+ return link(s, this._routeTree, this.urlTree, commands);
119
114
  }
120
115
  /**
121
116
  * Serializes a {@link UrlTree} into a string.
122
117
  */
123
118
  serializeUrl(url) { return this._urlSerializer.serialize(url); }
124
- _createInitialTree() {
125
- let root = new RouteSegment([new UrlSegment("", {}, null)], {}, DEFAULT_OUTLET_NAME, this._rootComponentType, null);
126
- return new RouteTree(new TreeNode(root, []));
127
- }
128
119
  _setUpLocationChangeListener() {
129
- this._locationSubscription = this._location.subscribe((change) => { this._navigate(this._urlSerializer.parse(change['url'])); });
120
+ this._locationSubscription = this._location.subscribe((change) => { this._navigate(this._urlSerializer.parse(change['url']), change['pop']); });
130
121
  }
131
- _navigate(url) {
122
+ _navigate(url, preventPushState) {
132
123
  this._urlTree = url;
133
- return recognize(this._componentResolver, this._rootComponentType, url)
124
+ return recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)
134
125
  .then(currTree => {
135
- return new _LoadSegments(currTree, this._prevTree)
136
- .load(this._routerOutletMap, this._rootComponent)
126
+ return new _ActivateSegments(currTree, this._routeTree)
127
+ .activate(this._routerOutletMap, this._rootComponent)
137
128
  .then(updated => {
138
129
  if (updated) {
139
- this._prevTree = currTree;
140
- this._location.go(this._urlSerializer.serialize(this._urlTree));
130
+ this._routeTree = currTree;
131
+ if (isBlank(preventPushState) || !preventPushState) {
132
+ let path = this._urlSerializer.serialize(this._urlTree);
133
+ if (this._location.isCurrentPathEqualTo(path)) {
134
+ this._location.replaceState(path);
135
+ }
136
+ else {
137
+ this._location.go(path);
138
+ }
139
+ }
141
140
  this._changes.emit(null);
142
141
  }
143
142
  });
144
143
  });
145
144
  }
146
145
  }
147
- class _LoadSegments {
146
+ class _ActivateSegments {
148
147
  constructor(currTree, prevTree) {
149
148
  this.currTree = currTree;
150
149
  this.prevTree = prevTree;
151
150
  this.deactivations = [];
152
151
  this.performMutation = true;
153
152
  }
154
- load(parentOutletMap, rootComponent) {
153
+ activate(parentOutletMap, rootComponent) {
155
154
  let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;
156
155
  let currRoot = rootNode(this.currTree);
157
- return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)
158
- .then(res => {
156
+ return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(res => {
159
157
  this.performMutation = true;
160
158
  if (res) {
161
- this.loadChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
159
+ this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
162
160
  }
163
161
  return res;
164
162
  });
165
163
  }
166
164
  canDeactivate(currRoot, prevRoot, outletMap, rootComponent) {
167
165
  this.performMutation = false;
168
- this.loadChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
166
+ this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
169
167
  let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));
170
168
  return allPaths.then((values) => values.filter(v => v).length === values.length);
171
169
  }
@@ -173,7 +171,7 @@ class _LoadSegments {
173
171
  let curr = PromiseWrapper.resolve(true);
174
172
  for (let p of ListWrapper.reversed(path)) {
175
173
  curr = curr.then(_ => {
176
- if (hasLifecycleHook("routerCanDeactivate", p)) {
174
+ if (hasLifecycleHook('routerCanDeactivate', p)) {
177
175
  return p.routerCanDeactivate(this.prevTree, this.currTree);
178
176
  }
179
177
  else {
@@ -183,39 +181,37 @@ class _LoadSegments {
183
181
  }
184
182
  return curr;
185
183
  }
186
- loadChildSegments(currNode, prevNode, outletMap, components) {
187
- let prevChildren = isPresent(prevNode) ?
188
- prevNode.children.reduce((m, c) => {
189
- m[c.value.outlet] = c;
190
- return m;
191
- }, {}) :
192
- {};
184
+ activateChildSegments(currNode, prevNode, outletMap, components) {
185
+ let prevChildren = isPresent(prevNode) ? prevNode.children.reduce((m, c) => {
186
+ m[c.value.outlet] = c;
187
+ return m;
188
+ }, {}) : {};
193
189
  currNode.children.forEach(c => {
194
- this.loadSegments(c, prevChildren[c.value.outlet], outletMap, components);
190
+ this.activateSegments(c, prevChildren[c.value.outlet], outletMap, components);
195
191
  StringMapWrapper.delete(prevChildren, c.value.outlet);
196
192
  });
197
- StringMapWrapper.forEach(prevChildren, (v, k) => this.unloadOutlet(outletMap._outlets[k], components));
193
+ StringMapWrapper.forEach(prevChildren, (v /** TODO #9100 */, k /** TODO #9100 */) => this.deactivateOutlet(outletMap._outlets[k], components));
198
194
  }
199
- loadSegments(currNode, prevNode, parentOutletMap, components) {
195
+ activateSegments(currNode, prevNode, parentOutletMap, components) {
200
196
  let curr = currNode.value;
201
197
  let prev = isPresent(prevNode) ? prevNode.value : null;
202
198
  let outlet = this.getOutlet(parentOutletMap, currNode.value);
203
- if (equalSegments(curr, prev)) {
204
- this.loadChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.loadedComponent]));
199
+ if (curr === prev) {
200
+ this.activateChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));
205
201
  }
206
202
  else {
207
- this.unloadOutlet(outlet, components);
203
+ this.deactivateOutlet(outlet, components);
208
204
  if (this.performMutation) {
209
205
  let outletMap = new RouterOutletMap();
210
- let loadedComponent = this.loadNewSegment(outletMap, curr, prev, outlet);
211
- this.loadChildSegments(currNode, prevNode, outletMap, components.concat([loadedComponent]));
206
+ let component = this.activateNewSegments(outletMap, curr, prev, outlet);
207
+ this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));
212
208
  }
213
209
  }
214
210
  }
215
- loadNewSegment(outletMap, curr, prev, outlet) {
216
- let resolved = ReflectiveInjector.resolve([provide(RouterOutletMap, { useValue: outletMap }), provide(RouteSegment, { useValue: curr })]);
217
- let ref = outlet.load(routeSegmentComponentFactory(curr), resolved, outletMap);
218
- if (hasLifecycleHook("routerOnActivate", ref.instance)) {
211
+ activateNewSegments(outletMap, curr, prev, outlet) {
212
+ let resolved = ReflectiveInjector.resolve([{ provide: RouterOutletMap, useValue: outletMap }, { provide: RouteSegment, useValue: curr }]);
213
+ let ref = outlet.activate(routeSegmentComponentFactory(curr), resolved, outletMap);
214
+ if (hasLifecycleHook('routerOnActivate', ref.instance)) {
219
215
  ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);
220
216
  }
221
217
  return ref.instance;
@@ -232,14 +228,14 @@ class _LoadSegments {
232
228
  }
233
229
  return outlet;
234
230
  }
235
- unloadOutlet(outlet, components) {
236
- if (isPresent(outlet) && outlet.isLoaded) {
237
- StringMapWrapper.forEach(outlet.outletMap._outlets, (v, k) => this.unloadOutlet(v, components));
231
+ deactivateOutlet(outlet, components) {
232
+ if (isPresent(outlet) && outlet.isActivated) {
233
+ StringMapWrapper.forEach(outlet.outletMap._outlets, (v /** TODO #9100 */, k /** TODO #9100 */) => this.deactivateOutlet(v, components));
238
234
  if (this.performMutation) {
239
- outlet.unload();
235
+ outlet.deactivate();
240
236
  }
241
237
  else {
242
- this.deactivations.push(components.concat([outlet.loadedComponent]));
238
+ this.deactivations.push(components.concat([outlet.component]));
243
239
  }
244
240
  }
245
241
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/router.ts"],"names":[],"mappings":"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","sourcesContent":["interface DecoratorInvocation {\n type: Function;\n args?: any[];\n }\n import {OnInit, provide, ReflectiveInjector, ComponentResolver} from '@angular/core';\nimport {RouterOutlet} from './directives/router_outlet';\nimport {Type, isBlank, isPresent} from './facade/lang';\nimport {ListWrapper} from './facade/collection';\nimport {EventEmitter, Observable, PromiseWrapper, ObservableWrapper} from './facade/async';\nimport {StringMapWrapper} from './facade/collection';\nimport {BaseException} from '@angular/core';\nimport {RouterUrlSerializer} from './router_url_serializer';\nimport {CanDeactivate} from './interfaces';\nimport {recognize} from './recognize';\nimport {Location} from '@angular/common';\nimport {link} from './link';\n\nimport {\n equalSegments,\n routeSegmentComponentFactory,\n RouteSegment,\n UrlTree,\n RouteTree,\n rootNode,\n TreeNode,\n UrlSegment,\n serializeRouteSegmentTree\n} from './segments';\nimport {hasLifecycleHook} from './lifecycle_reflector';\nimport {DEFAULT_OUTLET_NAME} from './constants';\n\n/**\n * @internal\n */\nexport class RouterOutletMap {\n /** @internal */\n _outlets: {[name: string]: RouterOutlet} = {};\n registerOutlet(name: string, outlet: RouterOutlet): void { this._outlets[name] = outlet; }\n}\n\n/**\n * The `Router` is responsible for mapping URLs to components.\n *\n * You can see the state of the router by inspecting the read-only fields `router.urlTree`\n * and `router.routeTree`.\n */\nexport class Router {\n private _prevTree: RouteTree;\n private _urlTree: UrlTree;\n private _locationSubscription: any;\n private _changes: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * @internal\n */\n constructor(private _rootComponent: Object, private _rootComponentType: Type,\n private _componentResolver: ComponentResolver,\n private _urlSerializer: RouterUrlSerializer,\n private _routerOutletMap: RouterOutletMap, private _location: Location) {\n this._prevTree = this._createInitialTree();\n this._setUpLocationChangeListener();\n this.navigateByUrl(this._location.path());\n }\n\n /**\n * Returns the current url tree.\n */\n get urlTree(): UrlTree { return this._urlTree; }\n\n /**\n * Returns the current route tree.\n */\n get routeTree(): RouteTree { return this._prevTree; }\n\n /**\n * An observable or url changes from the router.\n */\n get changes(): Observable<void> { return this._changes; }\n\n /**\n * Navigate based on the provided url. This navigation is always absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigateByUrl(\"/team/33/user/11\");\n * ```\n */\n navigateByUrl(url: string): Promise<void> {\n return this._navigate(this._urlSerializer.parse(url));\n }\n\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no segment is provided, the navigation is absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigate(['team', 33, 'team', '11], segment);\n * ```\n */\n navigate(commands: any[], segment?: RouteSegment): Promise<void> {\n return this._navigate(this.createUrlTree(commands, segment));\n }\n\n /**\n * @internal\n */\n dispose(): void { ObservableWrapper.dispose(this._locationSubscription); }\n\n /**\n * Applies an array of commands to the current url tree and creates\n * a new url tree.\n *\n * When given a segment, applies the given commands starting from the segment.\n * When not given a segment, applies the given command starting from the root.\n *\n * ### Usage\n *\n * ```\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static fragments like this\n * router.createUrlTree(['/team/33/user', userId]);\n *\n * // assuming the current url is `/team/33/user/11` and the segment points to `user/11`\n *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], segment);\n *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], segment);\n *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], segment);\n * ```\n */\n createUrlTree(commands: any[], segment?: RouteSegment): UrlTree {\n let s = isPresent(segment) ? segment : this._prevTree.root;\n return link(s, this._prevTree, this.urlTree, commands);\n }\n\n /**\n * Serializes a {@link UrlTree} into a string.\n */\n serializeUrl(url: UrlTree): string { return this._urlSerializer.serialize(url); }\n\n private _createInitialTree(): RouteTree {\n let root = new RouteSegment([new UrlSegment(\"\", {}, null)], {}, DEFAULT_OUTLET_NAME,\n this._rootComponentType, null);\n return new RouteTree(new TreeNode<RouteSegment>(root, []));\n }\n\n private _setUpLocationChangeListener(): void {\n this._locationSubscription = this._location.subscribe(\n (change) => { this._navigate(this._urlSerializer.parse(change['url'])); });\n }\n\n private _navigate(url: UrlTree): Promise<void> {\n this._urlTree = url;\n return recognize(this._componentResolver, this._rootComponentType, url)\n .then(currTree => {\n return new _LoadSegments(currTree, this._prevTree)\n .load(this._routerOutletMap, this._rootComponent)\n .then(updated => {\n if (updated) {\n this._prevTree = currTree;\n this._location.go(this._urlSerializer.serialize(this._urlTree));\n this._changes.emit(null);\n }\n });\n });\n }\n}\n\n\nclass _LoadSegments {\n private deactivations: Object[][] = [];\n private performMutation: boolean = true;\n\n constructor(private currTree: RouteTree, private prevTree: RouteTree) {}\n\n load(parentOutletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;\n let currRoot = rootNode(this.currTree);\n\n return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)\n .then(res => {\n this.performMutation = true;\n if (res) {\n this.loadChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);\n }\n return res;\n });\n }\n\n private canDeactivate(currRoot: TreeNode<RouteSegment>, prevRoot: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n this.performMutation = false;\n this.loadChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);\n\n let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));\n return allPaths.then((values: boolean[]) => values.filter(v => v).length === values.length);\n }\n\n private checkCanDeactivatePath(path: Object[]): Promise<boolean> {\n let curr = PromiseWrapper.resolve(true);\n for (let p of ListWrapper.reversed(path)) {\n curr = curr.then(_ => {\n if (hasLifecycleHook(\"routerCanDeactivate\", p)) {\n return (<CanDeactivate>p).routerCanDeactivate(this.prevTree, this.currTree);\n } else {\n return _;\n }\n });\n }\n return curr;\n }\n\n private loadChildSegments(currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, components: Object[]): void {\n let prevChildren = isPresent(prevNode) ?\n prevNode.children.reduce(\n (m, c) => {\n m[c.value.outlet] = c;\n return m;\n },\n {}) :\n {};\n\n currNode.children.forEach(c => {\n this.loadSegments(c, prevChildren[c.value.outlet], outletMap, components);\n StringMapWrapper.delete(prevChildren, c.value.outlet);\n });\n\n StringMapWrapper.forEach(prevChildren,\n (v, k) => this.unloadOutlet(outletMap._outlets[k], components));\n }\n\n loadSegments(currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n parentOutletMap: RouterOutletMap, components: Object[]): void {\n let curr = currNode.value;\n let prev = isPresent(prevNode) ? prevNode.value : null;\n let outlet = this.getOutlet(parentOutletMap, currNode.value);\n\n if (equalSegments(curr, prev)) {\n this.loadChildSegments(currNode, prevNode, outlet.outletMap,\n components.concat([outlet.loadedComponent]));\n } else {\n this.unloadOutlet(outlet, components);\n if (this.performMutation) {\n let outletMap = new RouterOutletMap();\n let loadedComponent = this.loadNewSegment(outletMap, curr, prev, outlet);\n this.loadChildSegments(currNode, prevNode, outletMap, components.concat([loadedComponent]));\n }\n }\n }\n\n private loadNewSegment(outletMap: RouterOutletMap, curr: RouteSegment, prev: RouteSegment,\n outlet: RouterOutlet): Object {\n let resolved = ReflectiveInjector.resolve(\n [provide(RouterOutletMap, {useValue: outletMap}), provide(RouteSegment, {useValue: curr})]);\n let ref = outlet.load(routeSegmentComponentFactory(curr), resolved, outletMap);\n if (hasLifecycleHook(\"routerOnActivate\", ref.instance)) {\n ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);\n }\n return ref.instance;\n }\n\n private getOutlet(outletMap: RouterOutletMap, segment: RouteSegment): RouterOutlet {\n let outlet = outletMap._outlets[segment.outlet];\n if (isBlank(outlet)) {\n if (segment.outlet == DEFAULT_OUTLET_NAME) {\n throw new BaseException(`Cannot find default outlet`);\n } else {\n throw new BaseException(`Cannot find the outlet ${segment.outlet}`);\n }\n }\n return outlet;\n }\n\n private unloadOutlet(outlet: RouterOutlet, components: Object[]): void {\n if (isPresent(outlet) && outlet.isLoaded) {\n StringMapWrapper.forEach(outlet.outletMap._outlets,\n (v, k) => this.unloadOutlet(v, components));\n if (this.performMutation) {\n outlet.unload();\n } else {\n this.deactivations.push(components.concat([outlet.loadedComponent]));\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/router.ts"],"names":[],"mappings":"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","sourcesContent":["import {Location} from '@angular/common';\nimport {BaseException, ComponentResolver, ReflectiveInjector, provide} from '@angular/core';\n\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {RouterOutlet} from './directives/router_outlet';\nimport {EventEmitter, Observable, ObservableWrapper, PromiseWrapper} from './facade/async';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {Type, isBlank, isPresent} from './facade/lang';\nimport {CanDeactivate} from './interfaces';\nimport {hasLifecycleHook} from './lifecycle_reflector';\nimport {link} from './link';\nimport {recognize} from './recognize';\nimport {RouterUrlSerializer} from './router_url_serializer';\nimport {RouteSegment, RouteTree, TreeNode, UrlSegment, UrlTree, createEmptyRouteTree, rootNode, routeSegmentComponentFactory, serializeRouteSegmentTree} from './segments';\n\nexport class RouterOutletMap {\n /** @internal */\n _outlets: {[name: string]: RouterOutlet} = {};\n registerOutlet(name: string, outlet: RouterOutlet): void { this._outlets[name] = outlet; }\n}\n\n/**\n * The `Router` is responsible for mapping URLs to components.\n *\n * You can see the state of the router by inspecting the read-only fields `router.urlTree`\n * and `router.routeTree`.\n */\nexport class Router {\n private _routeTree: RouteTree;\n private _urlTree: UrlTree;\n private _locationSubscription: any;\n private _changes: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * @internal\n */\n constructor(\n private _rootComponent: Object, private _rootComponentType: Type,\n private _componentResolver: ComponentResolver, private _urlSerializer: RouterUrlSerializer,\n private _routerOutletMap: RouterOutletMap, private _location: Location) {\n this._routeTree = createEmptyRouteTree(this._rootComponentType);\n this._setUpLocationChangeListener();\n this.navigateByUrl(this._location.path());\n }\n\n /**\n * Returns the current url tree.\n */\n get urlTree(): UrlTree { return this._urlTree; }\n\n /**\n * Returns the current route tree.\n */\n get routeTree(): RouteTree { return this._routeTree; }\n\n /**\n * An observable or url changes from the router.\n */\n get changes(): Observable<void> { return this._changes; }\n\n /**\n * Navigate based on the provided url. This navigation is always absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigateByUrl(\"/team/33/user/11\");\n * ```\n */\n navigateByUrl(url: string): Promise<void> {\n return this._navigate(this._urlSerializer.parse(url));\n }\n\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no segment is provided, the navigation is absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigate(['team', 33, 'team', '11], segment);\n * ```\n */\n navigate(commands: any[], segment?: RouteSegment): Promise<void> {\n return this._navigate(this.createUrlTree(commands, segment));\n }\n\n /**\n * @internal\n */\n dispose(): void { ObservableWrapper.dispose(this._locationSubscription); }\n\n /**\n * Applies an array of commands to the current url tree and creates\n * a new url tree.\n *\n * When given a segment, applies the given commands starting from the segment.\n * When not given a segment, applies the given command starting from the root.\n *\n * ### Usage\n *\n * ```\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static fragments like this\n * router.createUrlTree(['/team/33/user', userId]);\n *\n * // assuming the current url is `/team/33/user/11` and the segment points to `user/11`\n *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], segment);\n *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], segment);\n *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], segment);\n * ```\n */\n createUrlTree(commands: any[], segment?: RouteSegment): UrlTree {\n let s = isPresent(segment) ? segment : this._routeTree.root;\n return link(s, this._routeTree, this.urlTree, commands);\n }\n\n /**\n * Serializes a {@link UrlTree} into a string.\n */\n serializeUrl(url: UrlTree): string { return this._urlSerializer.serialize(url); }\n\n private _setUpLocationChangeListener(): void {\n this._locationSubscription = this._location.subscribe(\n (change) => { this._navigate(this._urlSerializer.parse(change['url']), change['pop']); });\n }\n\n private _navigate(url: UrlTree, preventPushState?: boolean): Promise<void> {\n this._urlTree = url;\n return recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)\n .then(currTree => {\n return new _ActivateSegments(currTree, this._routeTree)\n .activate(this._routerOutletMap, this._rootComponent)\n .then(updated => {\n if (updated) {\n this._routeTree = currTree;\n if (isBlank(preventPushState) || !preventPushState) {\n let path = this._urlSerializer.serialize(this._urlTree);\n if (this._location.isCurrentPathEqualTo(path)) {\n this._location.replaceState(path);\n } else {\n this._location.go(path);\n }\n }\n this._changes.emit(null);\n }\n });\n });\n }\n}\n\n\nclass _ActivateSegments {\n private deactivations: Object[][] = [];\n private performMutation: boolean = true;\n\n constructor(private currTree: RouteTree, private prevTree: RouteTree) {}\n\n activate(parentOutletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;\n let currRoot = rootNode(this.currTree);\n\n return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(res => {\n this.performMutation = true;\n if (res) {\n this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);\n }\n return res;\n });\n }\n\n private canDeactivate(\n currRoot: TreeNode<RouteSegment>, prevRoot: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n this.performMutation = false;\n this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);\n\n let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));\n return allPaths.then((values: boolean[]) => values.filter(v => v).length === values.length);\n }\n\n private checkCanDeactivatePath(path: Object[]): Promise<boolean> {\n let curr = PromiseWrapper.resolve(true);\n for (let p of ListWrapper.reversed(path)) {\n curr = curr.then(_ => {\n if (hasLifecycleHook('routerCanDeactivate', p)) {\n return (<CanDeactivate>p).routerCanDeactivate(this.prevTree, this.currTree);\n } else {\n return _;\n }\n });\n }\n return curr;\n }\n\n private activateChildSegments(\n currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, components: Object[]): void {\n let prevChildren = isPresent(prevNode) ? prevNode.children.reduce((m, c) => {\n (m as any /** TODO #9100 */)[c.value.outlet] = c;\n return m;\n }, {}) : {};\n\n currNode.children.forEach(c => {\n this.activateSegments(\n c, (prevChildren as any /** TODO #9100 */)[c.value.outlet], outletMap, components);\n StringMapWrapper.delete(prevChildren, c.value.outlet);\n });\n\n StringMapWrapper.forEach(\n prevChildren, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) =>\n this.deactivateOutlet(outletMap._outlets[k], components));\n }\n\n activateSegments(\n currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n parentOutletMap: RouterOutletMap, components: Object[]): void {\n let curr = currNode.value;\n let prev = isPresent(prevNode) ? prevNode.value : null;\n let outlet = this.getOutlet(parentOutletMap, currNode.value);\n\n if (curr === prev) {\n this.activateChildSegments(\n currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));\n } else {\n this.deactivateOutlet(outlet, components);\n if (this.performMutation) {\n let outletMap = new RouterOutletMap();\n let component = this.activateNewSegments(outletMap, curr, prev, outlet);\n this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));\n }\n }\n }\n\n private activateNewSegments(\n outletMap: RouterOutletMap, curr: RouteSegment, prev: RouteSegment,\n outlet: RouterOutlet): Object {\n let resolved = ReflectiveInjector.resolve(\n [{provide: RouterOutletMap, useValue: outletMap}, {provide: RouteSegment, useValue: curr}]);\n let ref = outlet.activate(routeSegmentComponentFactory(curr), resolved, outletMap);\n if (hasLifecycleHook('routerOnActivate', ref.instance)) {\n ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);\n }\n return ref.instance;\n }\n\n private getOutlet(outletMap: RouterOutletMap, segment: RouteSegment): RouterOutlet {\n let outlet = outletMap._outlets[segment.outlet];\n if (isBlank(outlet)) {\n if (segment.outlet == DEFAULT_OUTLET_NAME) {\n throw new BaseException(`Cannot find default outlet`);\n } else {\n throw new BaseException(`Cannot find the outlet ${segment.outlet}`);\n }\n }\n return outlet;\n }\n\n private deactivateOutlet(outlet: RouterOutlet, components: Object[]): void {\n if (isPresent(outlet) && outlet.isActivated) {\n StringMapWrapper.forEach(\n outlet.outletMap._outlets, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) =>\n this.deactivateOutlet(v, components));\n if (this.performMutation) {\n outlet.deactivate();\n } else {\n this.deactivations.push(components.concat([outlet.component]));\n }\n }\n }\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * A list of {@link Provider}s. To use the router, you must add this to your application.
2
+ * A list of providers. To use the router, you must add this to your application.
3
3
  *
4
4
  * ```
5
5
  * import {Component} from '@angular/core';
@@ -1,8 +1,6 @@
1
1
  import { ROUTER_PROVIDERS_COMMON } from './router_providers_common';
2
- import { BrowserPlatformLocation } from '@angular/platform-browser';
3
- import { PlatformLocation } from '@angular/common';
4
2
  /**
5
- * A list of {@link Provider}s. To use the router, you must add this to your application.
3
+ * A list of providers. To use the router, you must add this to your application.
6
4
  *
7
5
  * ```
8
6
  * import {Component} from '@angular/core';
@@ -23,8 +21,6 @@ import { PlatformLocation } from '@angular/common';
23
21
  * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
24
22
  * ```
25
23
  */
26
- export const ROUTER_PROVIDERS = [
27
- ROUTER_PROVIDERS_COMMON,
28
- /*@ts2dart_Provider*/ { provide: PlatformLocation, useClass: BrowserPlatformLocation },
29
- ];
24
+ // TODO: merge with router_providers_common.ts
25
+ export const ROUTER_PROVIDERS = [ROUTER_PROVIDERS_COMMON];
30
26
  //# sourceMappingURL=router_providers.js.map