@coolon/angular-ui-powerups 0.0.67 → 0.0.68

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 (121) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +2712 -2285
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.d.ts +24 -22
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +24 -22
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/angular-ui-powerups.module.js +6 -3
  10. package/esm2015/lib/components/index.js +2 -1
  11. package/esm2015/lib/components/noop/noop.component.js +19 -0
  12. package/esm2015/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
  13. package/esm2015/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
  14. package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
  15. package/esm2015/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +19 -0
  16. package/esm2015/lib/interaction/guards/interaction-guard.service.js +85 -0
  17. package/esm2015/lib/interaction/index.js +3 -2
  18. package/esm2015/lib/interaction/interaction.module.js +8 -3
  19. package/esm2015/lib/interaction/services/dialog-interaction.service.js +30 -5
  20. package/esm2015/lib/place/components/abstract-place-navigation.component.js +5 -5
  21. package/esm2015/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
  22. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +60 -66
  23. package/esm2015/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
  24. package/esm2015/lib/place/index.js +9 -8
  25. package/esm2015/lib/place/navigation-session.js +147 -0
  26. package/esm2015/lib/place/place-component.js +18 -14
  27. package/esm2015/lib/place/place-definition.js +197 -5
  28. package/esm2015/lib/place/place-history.js +3 -2
  29. package/esm2015/lib/place/place-router.js +183 -89
  30. package/esm2015/lib/place/route/formatter.js +63 -0
  31. package/esm2015/lib/place/route/guards/leave-place.guard.js +193 -0
  32. package/esm2015/lib/place/route/guards/place-route.guard.js +243 -0
  33. package/esm2015/lib/place/route/parameter-decorators.js +35 -18
  34. package/esm2015/lib/place/route/parameter-definition.class.js +123 -67
  35. package/esm2015/lib/place/route/parameter-sanitiser.js +4 -3
  36. package/esm2015/lib/place/route/parameter-snapshot.js +11 -388
  37. package/esm2015/lib/place/route/visit-sanitiser.js +88 -0
  38. package/esm2015/lib/place/visit.js +107 -8
  39. package/esm2015/public_api.js +4 -4
  40. package/esm5/coolon-angular-ui-powerups.js +24 -22
  41. package/esm5/index.js +2 -2
  42. package/esm5/lib/angular-ui-powerups.module.js +6 -3
  43. package/esm5/lib/components/index.js +2 -1
  44. package/esm5/lib/components/noop/noop.component.js +21 -0
  45. package/esm5/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
  46. package/esm5/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
  47. package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
  48. package/esm5/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +21 -0
  49. package/esm5/lib/interaction/guards/interaction-guard.service.js +94 -0
  50. package/esm5/lib/interaction/index.js +3 -2
  51. package/esm5/lib/interaction/interaction.module.js +8 -3
  52. package/esm5/lib/interaction/services/dialog-interaction.service.js +28 -5
  53. package/esm5/lib/place/components/abstract-place-navigation.component.js +5 -5
  54. package/esm5/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
  55. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +70 -82
  56. package/esm5/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
  57. package/esm5/lib/place/index.js +9 -8
  58. package/esm5/lib/place/navigation-session.js +193 -0
  59. package/esm5/lib/place/place-component.js +19 -15
  60. package/esm5/lib/place/place-definition.js +253 -5
  61. package/esm5/lib/place/place-history.js +7 -3
  62. package/esm5/lib/place/place-router.js +240 -108
  63. package/esm5/lib/place/route/formatter.js +96 -0
  64. package/esm5/lib/place/route/guards/leave-place.guard.js +152 -0
  65. package/esm5/lib/place/route/guards/place-route.guard.js +273 -0
  66. package/esm5/lib/place/route/parameter-decorators.js +35 -18
  67. package/esm5/lib/place/route/parameter-definition.class.js +179 -76
  68. package/esm5/lib/place/route/parameter-sanitiser.js +4 -3
  69. package/esm5/lib/place/route/parameter-snapshot.js +11 -480
  70. package/esm5/lib/place/route/visit-sanitiser.js +99 -0
  71. package/esm5/lib/place/visit.js +160 -8
  72. package/esm5/public_api.js +4 -4
  73. package/fesm2015/coolon-angular-ui-powerups.js +1441 -1108
  74. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  75. package/fesm5/coolon-angular-ui-powerups.js +2705 -2282
  76. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  77. package/lib/components/index.d.ts +1 -0
  78. package/lib/components/noop/noop.component.d.ts +3 -0
  79. package/lib/interaction/components/interaction-outlet/interaction-outlet.component.d.ts +3 -0
  80. package/lib/interaction/guards/interaction-guard.service.d.ts +13 -0
  81. package/lib/interaction/index.d.ts +2 -1
  82. package/lib/interaction/services/dialog-interaction.service.d.ts +5 -1
  83. package/lib/place/components/place-outlet/place-outlet.component.d.ts +12 -12
  84. package/lib/place/index.d.ts +5 -4
  85. package/lib/place/navigation-session.d.ts +26 -0
  86. package/lib/place/place-component.d.ts +3 -3
  87. package/lib/place/place-definition.d.ts +30 -3
  88. package/lib/place/place-history.d.ts +3 -3
  89. package/lib/place/place-router.d.ts +25 -19
  90. package/lib/place/route/{parameter-type.d.ts → formatter.d.ts} +5 -5
  91. package/lib/place/{guards → route/guards}/leave-place.guard.d.ts +3 -3
  92. package/lib/place/route/guards/place-route.guard.d.ts +27 -0
  93. package/lib/place/route/parameter-decorators.d.ts +14 -6
  94. package/lib/place/route/parameter-definition.class.d.ts +21 -17
  95. package/lib/place/route/parameter-sanitiser.d.ts +3 -2
  96. package/lib/place/route/parameter-snapshot.d.ts +4 -26
  97. package/lib/place/route/visit-sanitiser.d.ts +12 -0
  98. package/lib/place/visit.d.ts +24 -3
  99. package/package.json +1 -1
  100. package/schematics/place-routes/place-class-scanner.d.ts +2 -2
  101. package/schematics/place-routes/place-class-scanner.js +7 -7
  102. package/schematics/place-routes/place-class-scanner.js.map +1 -1
  103. package/schematics/place-routes/place-def.d.ts +3 -2
  104. package/schematics/place-routes/place-def.js +21 -12
  105. package/schematics/place-routes/place-def.js.map +1 -1
  106. package/schematics/place-routes/templates/place-destinations.ts.template +5 -3
  107. package/schematics/place-routes/templates/place-routes.ts.template +10 -1
  108. package/schematics/place-routes/templates/place-visits.ts.template +21 -0
  109. package/esm2015/lib/interaction/guards/close-interaction.guard.js +0 -62
  110. package/esm2015/lib/place/guards/leave-place.guard.js +0 -194
  111. package/esm2015/lib/place/guards/place-route.guard.js +0 -74
  112. package/esm2015/lib/place/route/parameter-type.js +0 -61
  113. package/esm2015/lib/place/route/route-parameter-value.js +0 -230
  114. package/esm5/lib/interaction/guards/close-interaction.guard.js +0 -66
  115. package/esm5/lib/place/guards/leave-place.guard.js +0 -159
  116. package/esm5/lib/place/guards/place-route.guard.js +0 -78
  117. package/esm5/lib/place/route/parameter-type.js +0 -94
  118. package/esm5/lib/place/route/route-parameter-value.js +0 -316
  119. package/lib/interaction/guards/close-interaction.guard.d.ts +0 -12
  120. package/lib/place/guards/place-route.guard.d.ts +0 -10
  121. package/lib/place/route/route-parameter-value.d.ts +0 -42
@@ -1,397 +1,20 @@
1
- import * as tslib_1 from "tslib";
2
- var _a;
3
1
  /**
4
2
  * @fileoverview added by tsickle
5
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
6
4
  */
7
- import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
8
- import { ParameterDefinition } from './parameter-definition.class';
9
- import { RouteParameterValue } from './route-parameter-value';
10
- export class ParameterSnapshot {
11
- /**
12
- * @param {?} placeDefinition
13
- * @param {?} parameters
14
- */
15
- constructor(placeDefinition, parameters) {
16
- this.placeDefinition = placeDefinition;
17
- this.parameters = parameters;
18
- }
19
- /**
20
- * @param {?} other
21
- * @param {?=} debug
22
- * @return {?}
23
- */
24
- hasChanged(other, debug = false) {
25
- /** @type {?} */
26
- const changed = this.parameters.find((/**
27
- * @param {?} r
28
- * @return {?}
29
- */
30
- (r) => {
31
- return r.hasChanged(other.getValueOf(r.definition));
32
- }));
33
- if (changed && debug) {
34
- console.log({
35
- name: changed.definition.name,
36
- mine: changed.value,
37
- theirs: other.getValueOf(changed.definition)
38
- });
39
- }
40
- return !!changed;
41
- }
42
- /**
43
- * @template T, S
44
- * @param {?} parameterDef
45
- * @return {?}
46
- */
47
- getParameter(parameterDef) {
48
- return this.parameters.find((/**
49
- * @param {?} r
50
- * @return {?}
51
- */
52
- r => r.definition === parameterDef));
53
- }
54
- /**
55
- * @template T, S
56
- * @param {?} parameterDef
57
- * @return {?}
58
- */
59
- getValueOf(parameterDef) {
60
- /** @type {?} */
61
- const resolvedParameter = this.getParameter(parameterDef);
62
- return resolvedParameter ? resolvedParameter.value : null;
63
- }
64
- /**
65
- * @return {?}
66
- */
67
- getRouteIdValue() {
68
- return this.getRouteIdParameter() ? this.getRouteIdParameter().value : null;
69
- }
70
- /**
71
- * @param {?} name
72
- * @return {?}
73
- */
74
- getParameterValue(name) {
75
- /** @type {?} */
76
- const resolvedParameter = this.parameters.find((/**
77
- * @param {?} r
78
- * @return {?}
79
- */
80
- r => r.definition.name === name));
81
- return resolvedParameter ? resolvedParameter.value : null;
82
- }
83
- /**
84
- * @private
85
- * @return {?}
86
- */
87
- getRouteIdParameter() {
88
- // RouteId's are never arrays: see parameter-decorators.ts createDefinition methods. It would be nice to
89
- // capture this in the type system though
90
- return (/** @type {?} */ (this.parameters.find((/**
91
- * @param {?} p
92
- * @return {?}
93
- */
94
- p => p.definition.isRouteId))));
95
- }
96
- /**
97
- * @private
98
- * @return {?}
99
- */
100
- getRouteParameters() {
101
- return this.parameters.filter((/**
102
- * @param {?} r
103
- * @return {?}
104
- */
105
- r => !r.definition.isRouteId));
106
- }
107
- /**
108
- * @return {?}
109
- */
110
- hasRouteId() {
111
- return !!this.getRouteIdParameter();
112
- }
113
- /**
114
- * @return {?}
115
- */
116
- getFormattedRouteId() {
117
- /** @type {?} */
118
- const routeIdParam = this.getRouteIdParameter();
119
- return routeIdParam ? routeIdParam.formattedValue() : null;
120
- }
121
- /**
122
- * @return {?}
123
- */
124
- getNonEmptyParameters() {
125
- return this.parameters.filter((/**
126
- * @param {?} p
127
- * @return {?}
128
- */
129
- p => !p.isEmpty()));
130
- }
131
- /**
132
- * @return {?}
133
- */
134
- getFormattedParameters() {
135
- /** @type {?} */
136
- const params = {};
137
- /** @type {?} */
138
- const routeIdParam = this.getNonEmptyParameters()
139
- .filter((/**
140
- * @param {?} p
141
- * @return {?}
142
- */
143
- p => !p.definition.isRouteId))
144
- .forEach((/**
145
- * @param {?} p
146
- * @return {?}
147
- */
148
- p => params[p.definition.name] = p.formattedValue()));
149
- return params;
150
- }
151
- /**
152
- * @return {?}
153
- */
154
- getAllParameters() {
155
- /** @type {?} */
156
- const params = {};
157
- /** @type {?} */
158
- const routeIdParam = this.parameters.forEach((/**
159
- * @param {?} p
160
- * @return {?}
161
- */
162
- p => {
163
- params[p.definition.name] = p.value;
164
- }));
165
- return params;
166
- }
167
- /**
168
- * @template T, S
169
- * @param {?} parameter
170
- * @param {?} value
171
- * @return {?}
172
- */
173
- replace(parameter, value) {
174
- return new ParameterSnapshot(this.placeDefinition, this.parameters.map((/**
175
- * @param {?} p
176
- * @return {?}
177
- */
178
- p => {
179
- return p.definition === parameter ? p.replace(value) : p;
180
- })));
181
- }
182
- /**
183
- * @param {?} injector
184
- * @return {?}
185
- */
186
- sanitise(injector) {
187
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
188
- if (this.hasRouteId()) {
189
- /** @type {?} */
190
- const routeId = this.getRouteIdParameter();
191
- /** @type {?} */
192
- const sanitisedValue = yield routeId.sanitise(this, injector);
193
- if (routeId.hasChanged(sanitisedValue)) {
194
- // if the route id has changed we redirect immediately as other
195
- // parameter sanitisers might use it.
196
- return this.replace(routeId.definition, sanitisedValue);
197
- }
198
- }
199
- /** @type {?} */
200
- let result = this;
201
- /** @type {?} */
202
- const routeParameters = this.getRouteParameters();
203
- for (let i = 0; i < routeParameters.length; i++) {
204
- /** @type {?} */
205
- const routeParameter = routeParameters[i];
206
- /** @type {?} */
207
- const sanitisedValue = yield routeParameter.sanitise(this, injector);
208
- if (routeParameter.hasChanged(sanitisedValue)) {
209
- result = result.replace(routeParameter.definition, sanitisedValue);
210
- }
211
- }
212
- return result;
213
- });
214
- }
215
- }
216
- tslib_1.__decorate([
217
- Memoize(),
218
- tslib_1.__metadata("design:type", Function),
219
- tslib_1.__metadata("design:paramtypes", [ParameterDefinition]),
220
- tslib_1.__metadata("design:returntype", RouteParameterValue)
221
- ], ParameterSnapshot.prototype, "getParameter", null);
222
- tslib_1.__decorate([
223
- Memoize(),
224
- tslib_1.__metadata("design:type", Function),
225
- tslib_1.__metadata("design:paramtypes", [ParameterDefinition]),
226
- tslib_1.__metadata("design:returntype", typeof (_a = typeof S !== "undefined" && S) === "function" ? _a : Object)
227
- ], ParameterSnapshot.prototype, "getValueOf", null);
228
- tslib_1.__decorate([
229
- Memoize(),
230
- tslib_1.__metadata("design:type", Function),
231
- tslib_1.__metadata("design:paramtypes", [String]),
232
- tslib_1.__metadata("design:returntype", Object)
233
- ], ParameterSnapshot.prototype, "getParameterValue", null);
234
- tslib_1.__decorate([
235
- Memoize(),
236
- tslib_1.__metadata("design:type", Function),
237
- tslib_1.__metadata("design:paramtypes", []),
238
- tslib_1.__metadata("design:returntype", RouteParameterValue.Scalar)
239
- ], ParameterSnapshot.prototype, "getRouteIdParameter", null);
240
- tslib_1.__decorate([
241
- Memoize(),
242
- tslib_1.__metadata("design:type", Function),
243
- tslib_1.__metadata("design:paramtypes", []),
244
- tslib_1.__metadata("design:returntype", Array)
245
- ], ParameterSnapshot.prototype, "getRouteParameters", null);
5
+ /**
6
+ * @record
7
+ * @template T
8
+ */
9
+ export function ParameterSnapshot() { }
246
10
  if (false) {
247
11
  /** @type {?} */
248
- ParameterSnapshot.prototype.placeDefinition;
249
- /**
250
- * @type {?}
251
- * @private
252
- */
253
- ParameterSnapshot.prototype.parameters;
254
- }
255
- (function (ParameterSnapshot) {
12
+ ParameterSnapshot.prototype.definition;
13
+ /** @type {?} */
14
+ ParameterSnapshot.prototype.value;
256
15
  /**
257
- * @param {?} placeDef
258
- * @param {?} params
259
- * @param {?} urlSegments
260
16
  * @return {?}
261
17
  */
262
- function create(placeDef, params, urlSegments) {
263
- /** @type {?} */
264
- const paramMap = new ConsolidatedParameterMap(params, urlSegments);
265
- /** @type {?} */
266
- const resolvedParameters = placeDef.getRouteParameters().map((/**
267
- * @param {?} def
268
- * @return {?}
269
- */
270
- def => RouteParameterValue.create(def, paramMap)));
271
- return new ParameterSnapshot(placeDef, resolvedParameters);
272
- }
273
- ParameterSnapshot.create = create;
274
- /**
275
- * This a work around for the fact that an activated route with multiple segments doesn't
276
- * include the segment params in the paramMap as well as each segment returns an empty
277
- * param map even when `parameter`s has content.
278
- */
279
- class ConsolidatedParameterMap {
280
- /**
281
- * @param {?} paramMap
282
- * @param {?} urlSegments
283
- */
284
- constructor(paramMap, urlSegments) {
285
- this.paramMaps = [paramMap].concat((urlSegments || []).map((/**
286
- * @param {?} s
287
- * @return {?}
288
- */
289
- s => new ParamMapAdapter(s.parameters)))).filter((/**
290
- * @param {?} m
291
- * @return {?}
292
- */
293
- m => !!m)); // the activated route param map can be null
294
- }
295
- /**
296
- * @param {?} name
297
- * @return {?}
298
- */
299
- get(name) {
300
- return this.paramMaps.find((/**
301
- * @param {?} m
302
- * @return {?}
303
- */
304
- m => m.has(name))).get(name);
305
- }
306
- /**
307
- * @param {?} name
308
- * @return {?}
309
- */
310
- getAll(name) {
311
- return this.paramMaps.find((/**
312
- * @param {?} m
313
- * @return {?}
314
- */
315
- m => m.has(name))).getAll(name);
316
- }
317
- /**
318
- * @param {?} name
319
- * @return {?}
320
- */
321
- has(name) {
322
- return !!this.paramMaps.find((/**
323
- * @param {?} m
324
- * @return {?}
325
- */
326
- m => m.has(name)));
327
- }
328
- /**
329
- * @return {?}
330
- */
331
- get keys() {
332
- return this.paramMaps.reduce((/**
333
- * @param {?} result
334
- * @param {?} params
335
- * @return {?}
336
- */
337
- (result, params) => result.concat(params.keys)), []);
338
- }
339
- }
340
- tslib_1.__decorate([
341
- Memoize(),
342
- tslib_1.__metadata("design:type", Array),
343
- tslib_1.__metadata("design:paramtypes", [])
344
- ], ConsolidatedParameterMap.prototype, "keys", null);
345
- if (false) {
346
- /**
347
- * @type {?}
348
- * @private
349
- */
350
- ConsolidatedParameterMap.prototype.paramMaps;
351
- }
352
- class ParamMapAdapter {
353
- /**
354
- * @param {?} params
355
- */
356
- constructor(params) {
357
- this.params = params;
358
- }
359
- /**
360
- * @param {?} name
361
- * @return {?}
362
- */
363
- get(name) {
364
- return this.params[name];
365
- }
366
- /**
367
- * @param {?} name
368
- * @return {?}
369
- */
370
- getAll(name) {
371
- /** @type {?} */
372
- const value = this.get(name);
373
- return Array.isArray(value) ? value : [value];
374
- }
375
- /**
376
- * @param {?} name
377
- * @return {?}
378
- */
379
- has(name) {
380
- return this.keys.includes(name);
381
- }
382
- /**
383
- * @return {?}
384
- */
385
- get keys() {
386
- return Object.keys(this.params);
387
- }
388
- }
389
- if (false) {
390
- /**
391
- * @type {?}
392
- * @private
393
- */
394
- ParamMapAdapter.prototype.params;
395
- }
396
- })(ParameterSnapshot || (ParameterSnapshot = {}));
397
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7SUFFNUIsWUFBcUIsZUFBZ0MsRUFBbUIsVUFBZ0Q7UUFBbkcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQW1CLGVBQVUsR0FBVixVQUFVLENBQXNDO0lBQ3hILENBQUM7Ozs7OztJQUVELFVBQVUsQ0FBQyxLQUF3QixFQUFFLEtBQUssR0FBRyxLQUFLOztjQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDLEVBQUM7UUFDRixJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDVixJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJO2dCQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7YUFDN0MsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7Ozs7O0lBR0Qs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T0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7Ozs7O1FBRUQsTUFBTSxDQUFDLElBQVk7O2tCQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUM1QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDOzs7OztRQUVELEdBQUcsQ0FBQyxJQUFZO1lBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDOzs7O1FBRUQsSUFBSSxJQUFJO1lBQ04sT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO0tBRUY7Ozs7OztRQXBCYSxpQ0FBZ0Q7O0FBdUJoRSxDQUFDLEVBakVnQixpQkFBaUIsS0FBakIsaUJBQWlCLFFBaUVqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXJhbU1hcCwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IE1lbW9pemUgfSBmcm9tICdAdHlwZXNjcmlwdC1wbHVzL2Zhc3QtbWVtb2l6ZS1kZWNvcmF0b3IvZGlzdC9zcmMnO1xuaW1wb3J0IHsgUGxhY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4uL3Zpc2l0JztcbmltcG9ydCB7IFBhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3BhcmFtZXRlci1kZWZpbml0aW9uLmNsYXNzJztcbmltcG9ydCB7IFJvdXRlUGFyYW1ldGVyVmFsdWUgfSBmcm9tICcuL3JvdXRlLXBhcmFtZXRlci12YWx1ZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJTbmFwc2hvdCBpbXBsZW1lbnRzIFZpc2l0IHtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwbGFjZURlZmluaXRpb246IFBsYWNlRGVmaW5pdGlvbiwgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJzOiBSb3V0ZVBhcmFtZXRlclZhbHVlPGFueSwgYW55LCBhbnk+W10pIHtcbiAgfVxuXG4gIGhhc0NoYW5nZWQob3RoZXI6IFBhcmFtZXRlclNuYXBzaG90LCBkZWJ1ZyA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhbmdlZCA9IHRoaXMucGFyYW1ldGVycy5maW5kKChyKSA9PiB7XG4gICAgICByZXR1cm4gci5oYXNDaGFuZ2VkKG90aGVyLmdldFZhbHVlT2Yoci5kZWZpbml0aW9uKSk7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQgJiYgZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgbmFtZTogY2hhbmdlZC5kZWZpbml0aW9uLm5hbWUsXG4gICAgICAgIG1pbmU6IGNoYW5nZWQudmFsdWUsXG4gICAgICAgIHRoZWlyczogb3RoZXIuZ2V0VmFsdWVPZihjaGFuZ2VkLmRlZmluaXRpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hhbmdlZDtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0UGFyYW1ldGVyPFQsIFM+KHBhcmFtZXRlckRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPik6IFJvdXRlUGFyYW1ldGVyVmFsdWU8UywgVCwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKHIgPT4gci5kZWZpbml0aW9uID09PSBwYXJhbWV0ZXJEZWYpO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRWYWx1ZU9mPFQsIFM+KHBhcmFtZXRlckRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPik6IFMge1xuICAgIGNvbnN0IHJlc29sdmVkUGFyYW1ldGVyID0gdGhpcy5nZXRQYXJhbWV0ZXIocGFyYW1ldGVyRGVmKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbWV0ZXIgPyByZXNvbHZlZFBhcmFtZXRlci52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBnZXRSb3V0ZUlkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCkgPyB0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXIoKS52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIGdldFBhcmFtZXRlclZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuZmluZChyID0+IHIuZGVmaW5pdGlvbi5uYW1lID09PSBuYW1lKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbWV0ZXIgPyByZXNvbHZlZFBhcmFtZXRlci52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIHByaXZhdGUgZ2V0Um91dGVJZFBhcmFtZXRlcigpOiBSb3V0ZVBhcmFtZXRlclZhbHVlLlNjYWxhcjxhbnk+IHtcbiAgICAvLyBSb3V0ZUlkJ3MgYXJlIG5ldmVyIGFycmF5czogc2VlIHBhcmFtZXRlci1kZWNvcmF0b3JzLnRzIGNyZWF0ZURlZmluaXRpb24gbWV0aG9kcy4gSXQgd291bGQgYmUgbmljZSB0b1xuICAgIC8vIGNhcHR1cmUgdGhpcyBpbiB0aGUgdHlwZSBzeXN0ZW0gdGhvdWdoXG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKHAgPT4gcC5kZWZpbml0aW9uLmlzUm91dGVJZCkgYXMgUm91dGVQYXJhbWV0ZXJWYWx1ZS5TY2FsYXI8YW55PjtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgcHJpdmF0ZSBnZXRSb3V0ZVBhcmFtZXRlcnMoKTogUm91dGVQYXJhbWV0ZXJWYWx1ZTxhbnksIGFueSwgYW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbHRlcihyID0+ICFyLmRlZmluaXRpb24uaXNSb3V0ZUlkKTtcbiAgfVxuXG4gIGhhc1JvdXRlSWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZWRSb3V0ZUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgcmV0dXJuIHJvdXRlSWRQYXJhbSA/IHJvdXRlSWRQYXJhbS5mb3JtYXR0ZWRWYWx1ZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldE5vbkVtcHR5UGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbHRlcihwID0+ICFwLmlzRW1wdHkoKSk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZWRQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMuZ2V0Tm9uRW1wdHlQYXJhbWV0ZXJzKClcbiAgICAgIC5maWx0ZXIocCA9PiAhcC5kZWZpbml0aW9uLmlzUm91dGVJZClcbiAgICAgIC5mb3JFYWNoKHAgPT4gcGFyYW1zW3AuZGVmaW5pdGlvbi5uYW1lXSA9IHAuZm9ybWF0dGVkVmFsdWUoKSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGdldEFsbFBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZvckVhY2gocCA9PiB7XG4gICAgICBwYXJhbXNbcC5kZWZpbml0aW9uLm5hbWVdID0gcC52YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcmVwbGFjZTxULCBTPihwYXJhbWV0ZXI6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4sIHZhbHVlOiBTKTogUGFyYW1ldGVyU25hcHNob3Qge1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU25hcHNob3QodGhpcy5wbGFjZURlZmluaXRpb24sIHRoaXMucGFyYW1ldGVycy5tYXAocCA9PiB7XG4gICAgICByZXR1cm4gcC5kZWZpbml0aW9uID09PSBwYXJhbWV0ZXIgPyBwLnJlcGxhY2UodmFsdWUpIDogcDtcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBzYW5pdGlzZShpbmplY3RvcjogSW5qZWN0b3IpOiBQcm9taXNlPFBhcmFtZXRlclNuYXBzaG90PiB7XG4gICAgaWYgKHRoaXMuaGFzUm91dGVJZCgpKSB7XG4gICAgICBjb25zdCByb3V0ZUlkID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHJvdXRlSWQuc2FuaXRpc2UodGhpcywgaW5qZWN0b3IpO1xuICAgICAgaWYgKHJvdXRlSWQuaGFzQ2hhbmdlZChzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIHJvdXRlIGlkIGhhcyBjaGFuZ2VkIHdlIHJlZGlyZWN0IGltbWVkaWF0ZWx5IGFzIG90aGVyXG4gICAgICAgIC8vIHBhcmFtZXRlciBzYW5pdGlzZXJzIG1pZ2h0IHVzZSBpdC5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShyb3V0ZUlkLmRlZmluaXRpb24sIHNhbml0aXNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdDogUGFyYW1ldGVyU25hcHNob3QgPSB0aGlzO1xuICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVycyA9IHRoaXMuZ2V0Um91dGVQYXJhbWV0ZXJzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVyID0gcm91dGVQYXJhbWV0ZXJzW2ldO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBhd2FpdCByb3V0ZVBhcmFtZXRlci5zYW5pdGlzZSh0aGlzLCBpbmplY3Rvcik7XG4gICAgICBpZiAocm91dGVQYXJhbWV0ZXIuaGFzQ2hhbmdlZChzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2Uocm91dGVQYXJhbWV0ZXIuZGVmaW5pdGlvbiwgc2FuaXRpc2VkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQYXJhbWV0ZXJTbmFwc2hvdCB7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwbGFjZURlZjogUGxhY2VEZWZpbml0aW9uLCBwYXJhbXM6IFBhcmFtTWFwLCB1cmxTZWdtZW50czogVXJsU2VnbWVudFtdKTogUGFyYW1ldGVyU25hcHNob3Qge1xuICAgIGNvbnN0IHBhcmFtTWFwID0gbmV3IENvbnNvbGlkYXRlZFBhcmFtZXRlck1hcChwYXJhbXMsIHVybFNlZ21lbnRzKTtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtZXRlcnMgPSBwbGFjZURlZi5nZXRSb3V0ZVBhcmFtZXRlcnMoKS5tYXAoZGVmID0+IFJvdXRlUGFyYW1ldGVyVmFsdWUuY3JlYXRlKGRlZiwgcGFyYW1NYXApKTtcbiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclNuYXBzaG90KHBsYWNlRGVmLCByZXNvbHZlZFBhcmFtZXRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYSB3b3JrIGFyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCBhbiBhY3RpdmF0ZWQgcm91dGUgd2l0aCBtdWx0aXBsZSBzZWdtZW50cyBkb2Vzbid0XG4gICAqIGluY2x1ZGUgdGhlIHNlZ21lbnQgcGFyYW1zIGluIHRoZSBwYXJhbU1hcCBhcyB3ZWxsIGFzIGVhY2ggc2VnbWVudCByZXR1cm5zIGFuIGVtcHR5XG4gICAqIHBhcmFtIG1hcCBldmVuIHdoZW4gYHBhcmFtZXRlcmBzIGhhcyBjb250ZW50LlxuICAgKi9cbiAgY2xhc3MgQ29uc29saWRhdGVkUGFyYW1ldGVyTWFwIGltcGxlbWVudHMgUGFyYW1NYXAge1xuXG4gICAgcHJpdmF0ZSBwYXJhbU1hcHM6IFBhcmFtTWFwW107XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbU1hcDogUGFyYW1NYXAsIHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10pIHtcbiAgICAgIHRoaXMucGFyYW1NYXBzID0gW3BhcmFtTWFwXS5jb25jYXQoXG4gICAgICAgICh1cmxTZWdtZW50cyB8fCBbXSkubWFwKHMgPT4gbmV3IFBhcmFtTWFwQWRhcHRlcihzLnBhcmFtZXRlcnMpKVxuICAgICAgKS5maWx0ZXIobSA9PiAhIW0pOyAvLyB0aGUgYWN0aXZhdGVkIHJvdXRlIHBhcmFtIG1hcCBjYW4gYmUgbnVsbFxuICAgIH1cblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpLmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBnZXRBbGwobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1NYXBzLmZpbmQobSA9PiBtLmhhcyhuYW1lKSkuZ2V0QWxsKG5hbWUpO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhIXRoaXMucGFyYW1NYXBzLmZpbmQobSA9PiBtLmhhcyhuYW1lKSk7XG4gICAgfVxuXG4gICAgQE1lbW9pemUoKVxuICAgIGdldCBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5yZWR1Y2UoKHJlc3VsdCwgcGFyYW1zKSA9PiByZXN1bHQuY29uY2F0KHBhcmFtcy5rZXlzKSwgW10pO1xuICAgIH1cbiAgfVxuXG4gIGNsYXNzIFBhcmFtTWFwQWRhcHRlciBpbXBsZW1lbnRzIFBhcmFtTWFwIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbXNbbmFtZV07XG4gICAgfVxuXG4gICAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQobmFtZSk7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMua2V5cy5pbmNsdWRlcyhuYW1lKTtcbiAgICB9XG5cbiAgICBnZXQga2V5cygpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIH1cblxuICB9XG5cblxufVxuIl19
18
+ ParameterSnapshot.prototype.isMissing = function () { };
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUVBLHVDQUlDOzs7SUFIQyx1Q0FBdUM7O0lBQ3ZDLGtDQUFrQjs7OztJQUNsQix3REFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJhbWV0ZXJEZWZpbml0aW9uIH0gZnJvbSAnLi9wYXJhbWV0ZXItZGVmaW5pdGlvbi5jbGFzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyU25hcHNob3Q8VD4ge1xuICBkZWZpbml0aW9uOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIGFueT5cbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gIGlzTWlzc2luZygpOiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ export class VisitSanitiser {
7
+ /**
8
+ * @param {?} activatedRoute
9
+ * @param {?} router
10
+ * @param {?} placeHistory
11
+ * @param {?} injector
12
+ */
13
+ constructor(activatedRoute, router, placeHistory, injector) {
14
+ this.activatedRoute = activatedRoute;
15
+ this.router = router;
16
+ this.placeHistory = placeHistory;
17
+ this.injector = injector;
18
+ }
19
+ // @Trace()
20
+ /**
21
+ * @param {?} visit
22
+ * @return {?}
23
+ */
24
+ sanitise(visit) {
25
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
26
+ /** @type {?} */
27
+ const placeDef = visit.placeDefinition;
28
+ if (placeDef.hasRouteId()) {
29
+ /** @type {?} */
30
+ const routeIdDef = placeDef.getRouteIdParameterDef();
31
+ /** @type {?} */
32
+ const routeId = visit.getRouteId();
33
+ /** @type {?} */
34
+ const sanitisedValue = yield routeIdDef.sanitise(routeId, visit, this.placeHistory, this.injector);
35
+ console.log({ routeId, sanitisedValue });
36
+ // ###------- EARLY EXIT --------###
37
+ if (routeIdDef.hasChanged(routeId, sanitisedValue)) {
38
+ // if the route id has changed we redirect immediately as other
39
+ // parameter sanitisers might use it.
40
+ return visit.replace(routeIdDef, sanitisedValue);
41
+ }
42
+ }
43
+ // if we didn't replace the routeId we continue the url present parameters.
44
+ /** @type {?} */
45
+ const parameterDefs = placeDef.getVisitParameterDefs({
46
+ includeRouteParameters: true,
47
+ includeNonRouteParameters: true
48
+ });
49
+ /** @type {?} */
50
+ let sanitisedVisit = visit;
51
+ for (let i = 0; i < parameterDefs.length; i++) {
52
+ /** @type {?} */
53
+ const def = parameterDefs[i];
54
+ /** @type {?} */
55
+ const value = visit.getParameter(def.name);
56
+ /** @type {?} */
57
+ const sanitisedValue = yield def.sanitise(value, sanitisedVisit, this.placeHistory, this.injector);
58
+ if (def.hasChanged(value, sanitisedValue)) {
59
+ sanitisedVisit = sanitisedVisit.replace(def, sanitisedValue);
60
+ }
61
+ }
62
+ return sanitisedVisit.hasChangedFrom(visit) ? sanitisedVisit : visit;
63
+ });
64
+ }
65
+ }
66
+ if (false) {
67
+ /**
68
+ * @type {?}
69
+ * @private
70
+ */
71
+ VisitSanitiser.prototype.activatedRoute;
72
+ /**
73
+ * @type {?}
74
+ * @private
75
+ */
76
+ VisitSanitiser.prototype.router;
77
+ /**
78
+ * @type {?}
79
+ * @private
80
+ */
81
+ VisitSanitiser.prototype.placeHistory;
82
+ /**
83
+ * @type {?}
84
+ * @private
85
+ */
86
+ VisitSanitiser.prototype.injector;
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXQtc2FuaXRpc2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3Zpc2l0LXNhbml0aXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU1BLE1BQU0sT0FBTyxjQUFjOzs7Ozs7O0lBQ3pCLFlBQW9CLGNBQXNDLEVBQVUsTUFBYyxFQUFVLFlBQTBCLEVBQVUsUUFBa0I7UUFBOUgsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUVsSixDQUFDOzs7Ozs7SUFHSyxRQUFRLENBQUMsS0FBWTs7O2tCQUNuQixRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWU7WUFDdEMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUU7O3NCQUNuQixVQUFVLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFOztzQkFDOUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUU7O3NCQUM1QixjQUFjLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNsRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUM7Z0JBQ3ZDLG9DQUFvQztnQkFDcEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFBRTtvQkFDbEQsK0RBQStEO29CQUMvRCxxQ0FBcUM7b0JBQ3JDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQ2xEO2FBQ0Y7OztrQkFHSyxhQUFhLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO2dCQUNuRCxzQkFBc0IsRUFBRSxJQUFJO2dCQUM1Qix5QkFBeUIsRUFBRSxJQUFJO2FBQ2hDLENBQUM7O2dCQUNFLGNBQWMsR0FBVSxLQUFLO1lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztzQkFDdkMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7O3NCQUN0QixLQUFLLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDOztzQkFDcEMsY0FBYyxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsRUFBRTtvQkFDekMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2lCQUM5RDthQUNGO1lBRUQsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN2RSxDQUFDO0tBQUE7Q0FFRjs7Ozs7O0lBdENhLHdDQUE4Qzs7Ozs7SUFBRSxnQ0FBc0I7Ozs7O0lBQUUsc0NBQWtDOzs7OztJQUFFLGtDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgeyBQbGFjZUhpc3RvcnkgfSBmcm9tICcuLi9wbGFjZS1oaXN0b3J5JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi4vdmlzaXQnO1xuXG5leHBvcnQgY2xhc3MgVmlzaXRTYW5pdGlzZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHBsYWNlSGlzdG9yeTogUGxhY2VIaXN0b3J5LCBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuXG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhc3luYyBzYW5pdGlzZSh2aXNpdDogVmlzaXQpOiBQcm9taXNlPFZpc2l0PiB7XG4gICAgY29uc3QgcGxhY2VEZWYgPSB2aXNpdC5wbGFjZURlZmluaXRpb247XG4gICAgaWYgKHBsYWNlRGVmLmhhc1JvdXRlSWQoKSkge1xuICAgICAgY29uc3Qgcm91dGVJZERlZiA9IHBsYWNlRGVmLmdldFJvdXRlSWRQYXJhbWV0ZXJEZWYoKTtcbiAgICAgIGNvbnN0IHJvdXRlSWQgPSB2aXNpdC5nZXRSb3V0ZUlkKCk7XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHJvdXRlSWREZWYuc2FuaXRpc2Uocm91dGVJZCwgdmlzaXQsIHRoaXMucGxhY2VIaXN0b3J5LCB0aGlzLmluamVjdG9yKTtcbiAgICAgIGNvbnNvbGUubG9nKHtyb3V0ZUlkLCBzYW5pdGlzZWRWYWx1ZX0pO1xuICAgICAgLy8gIyMjLS0tLS0tLSBFQVJMWSBFWElUIC0tLS0tLS0tIyMjXG4gICAgICBpZiAocm91dGVJZERlZi5oYXNDaGFuZ2VkKHJvdXRlSWQsIHNhbml0aXNlZFZhbHVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgcm91dGUgaWQgaGFzIGNoYW5nZWQgd2UgcmVkaXJlY3QgaW1tZWRpYXRlbHkgYXMgb3RoZXJcbiAgICAgICAgLy8gcGFyYW1ldGVyIHNhbml0aXNlcnMgbWlnaHQgdXNlIGl0LlxuICAgICAgICByZXR1cm4gdmlzaXQucmVwbGFjZShyb3V0ZUlkRGVmLCBzYW5pdGlzZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZGlkbid0IHJlcGxhY2UgdGhlIHJvdXRlSWQgd2UgY29udGludWUgdGhlIHVybCBwcmVzZW50IHBhcmFtZXRlcnMuXG4gICAgY29uc3QgcGFyYW1ldGVyRGVmcyA9IHBsYWNlRGVmLmdldFZpc2l0UGFyYW1ldGVyRGVmcyh7XG4gICAgICBpbmNsdWRlUm91dGVQYXJhbWV0ZXJzOiB0cnVlLFxuICAgICAgaW5jbHVkZU5vblJvdXRlUGFyYW1ldGVyczogdHJ1ZVxuICAgIH0pO1xuICAgIGxldCBzYW5pdGlzZWRWaXNpdDogVmlzaXQgPSB2aXNpdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlckRlZnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRlZiA9IHBhcmFtZXRlckRlZnNbaV07XG4gICAgICBjb25zdCB2YWx1ZSA9IHZpc2l0LmdldFBhcmFtZXRlcihkZWYubmFtZSk7XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IGRlZi5zYW5pdGlzZSh2YWx1ZSwgc2FuaXRpc2VkVmlzaXQsIHRoaXMucGxhY2VIaXN0b3J5LCB0aGlzLmluamVjdG9yKTtcbiAgICAgIGlmIChkZWYuaGFzQ2hhbmdlZCh2YWx1ZSwgc2FuaXRpc2VkVmFsdWUpKSB7XG4gICAgICAgIHNhbml0aXNlZFZpc2l0ID0gc2FuaXRpc2VkVmlzaXQucmVwbGFjZShkZWYsIHNhbml0aXNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpc2VkVmlzaXQuaGFzQ2hhbmdlZEZyb20odmlzaXQpID8gc2FuaXRpc2VkVmlzaXQgOiB2aXNpdDtcbiAgfVxuXG59XG4iXX0=
@@ -2,21 +2,120 @@
2
2
  * @fileoverview added by tsickle
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
+ import * as _ from 'lodash';
5
6
  /**
6
7
  * @record
7
8
  */
8
- export function Visit() { }
9
- if (false) {
10
- /** @type {?} */
11
- Visit.prototype.placeDefinition;
9
+ function Params() { }
10
+ export class Visit {
11
+ /**
12
+ * @param {?} placeDefinition
13
+ * @param {?=} visitParameters
14
+ */
15
+ constructor(placeDefinition, visitParameters = {}) {
16
+ this.placeDefinition = placeDefinition;
17
+ this.visitParameters = visitParameters;
18
+ }
19
+ // @Trace()
20
+ /**
21
+ * @return {?}
22
+ */
23
+ getRouteId() {
24
+ return this.placeDefinition.getRouteIdFrom(this);
25
+ }
26
+ // @Trace()
12
27
  /**
13
28
  * @return {?}
14
29
  */
15
- Visit.prototype.getRouteIdValue = function () { };
30
+ hasRouteId() {
31
+ return !_.isNil(this.getRouteId());
32
+ }
16
33
  /**
17
- * @param {?} name
34
+ * Returns the value of the place parameter with the specified name. The parameter
35
+ * name is taken from the `as` option, e.g. {as: 'aCustomName'} otherwise it is the
36
+ * same as the the ValueModel property name.
37
+ * @param {?} parameterName the field name of the property model or the `as` option if specified.
18
38
  * @return {?}
19
39
  */
20
- Visit.prototype.getParameterValue = function (name) { };
40
+ getParameter(parameterName) {
41
+ return this.visitParameters[parameterName];
42
+ }
43
+ // @Trace()
44
+ /**
45
+ * @param {?} parameterName
46
+ * @return {?}
47
+ */
48
+ hasParameter(parameterName) {
49
+ return Object.keys(this.visitParameters).includes(parameterName);
50
+ }
51
+ /**
52
+ * @template S
53
+ * @param {?} parameter
54
+ * @param {?} value
55
+ * @return {?}
56
+ */
57
+ replace(parameter, value) {
58
+ return new Visit(this.placeDefinition, Object.assign({}, this.visitParameters, { [parameter.name]: value }));
59
+ }
60
+ /**
61
+ * @template S
62
+ * @param {?} routeParams
63
+ * @return {?}
64
+ */
65
+ mergeRouteParameters(routeParams) {
66
+ // todo: whitelist parameters.
67
+ /** @type {?} */
68
+ const routeParameterKeys = Object.keys(routeParams);
69
+ /** @type {?} */
70
+ const params = {};
71
+ this.placeDefinition.getVisitParameterDefs().forEach((/**
72
+ * @param {?} def
73
+ * @return {?}
74
+ */
75
+ def => {
76
+ if (def.isRouteId || def.isRouteParameter) {
77
+ if (routeParameterKeys.includes(def.name)) {
78
+ params[def.name] = routeParams[def.name];
79
+ }
80
+ }
81
+ else {
82
+ // copy non route params as is, but only if they already exist otherwise we'll inject nil values and break the
83
+ // defaults and remember sanitisation process.
84
+ if (this.hasParameter(def.name)) {
85
+ params[def.name] = this.getParameter(def.name);
86
+ }
87
+ }
88
+ }));
89
+ return new Visit(this.placeDefinition, params);
90
+ }
91
+ /**
92
+ * @param {?} other
93
+ * @return {?}
94
+ */
95
+ hasRoutingChangedFrom(other) {
96
+ /** @type {?} */
97
+ const samePlace = other.placeDefinition === this.placeDefinition;
98
+ /** @type {?} */
99
+ const sameRouteParameters = _.isEqual(this.placeDefinition.getFormattedRouteParameters(this, true), this.placeDefinition.getFormattedRouteParameters(other, true));
100
+ return !samePlace || !sameRouteParameters;
101
+ }
102
+ /**
103
+ * @param {?} other
104
+ * @return {?}
105
+ */
106
+ hasChangedFrom(other) {
107
+ /** @type {?} */
108
+ const sameNonRouteParameters = _.isEqual(this.placeDefinition.getNonRouteParameters(this), this.placeDefinition.getNonRouteParameters(other));
109
+ return !sameNonRouteParameters || this.hasRoutingChangedFrom(other);
110
+ }
111
+ }
112
+ if (false) {
113
+ /** @type {?} */
114
+ Visit.prototype.placeDefinition;
115
+ /**
116
+ * @type {?}
117
+ * @private
118
+ */
119
+ Visit.prototype.visitParameters;
21
120
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29vbG9uL2FuZ3VsYXItdWktcG93ZXJ1cHMvIiwic291cmNlcyI6WyJsaWIvcGxhY2UvdmlzaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBLDJCQU1DOzs7SUFMQyxnQ0FBMEM7Ozs7SUFFMUMsa0RBQXVCOzs7OztJQUV2Qix3REFBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuL3BsYWNlLWRlZmluaXRpb24nO1xuXG4vLyBUT0RPOiBJdCdkIGJlIG5pY2UgaWYgd2UgZ2VuZXJhdGVkIGEgdHlwZSBmb3IgdGhpcy4uLlxuZXhwb3J0IGludGVyZmFjZSBWaXNpdCB7XG4gIHJlYWRvbmx5IHBsYWNlRGVmaW5pdGlvbjogUGxhY2VEZWZpbml0aW9uO1xuXG4gIGdldFJvdXRlSWRWYWx1ZSgpOiBhbnk7XG5cbiAgZ2V0UGFyYW1ldGVyVmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xufVxuIl19
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29vbG9uL2FuZ3VsYXItdWktcG93ZXJ1cHMvIiwic291cmNlcyI6WyJsaWIvcGxhY2UvdmlzaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDOzs7O0FBSTVCLHFCQUVDO0FBR0QsTUFBTSxPQUFPLEtBQUs7Ozs7O0lBRWhCLFlBQXFCLGVBQWdDLEVBQW1CLGtCQUEwQixFQUFFO1FBQS9FLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFtQixvQkFBZSxHQUFmLGVBQWUsQ0FBYTtJQUNwRyxDQUFDOzs7OztJQUdELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7Ozs7O0lBR0QsVUFBVTtRQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7Ozs7O0lBUUQsWUFBWSxDQUFDLGFBQXFCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxDQUFDOzs7Ozs7SUFHRCxZQUFZLENBQUMsYUFBcUI7UUFDaEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkUsQ0FBQzs7Ozs7OztJQUVELE9BQU8sQ0FBSSxTQUFzQyxFQUFFLEtBQVE7UUFDekQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxvQkFBTyxJQUFJLENBQUMsZUFBZSxJQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBRyxDQUFDO0lBQy9GLENBQUM7Ozs7OztJQUVELG9CQUFvQixDQUFJLFdBQWlDOzs7Y0FFakQsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7O2NBQzdDLE1BQU0sR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxPQUFPOzs7O1FBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekQsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekMsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFDO2FBQ0Y7aUJBQU07Z0JBQ0wsOEdBQThHO2dCQUM5Ryw4Q0FBOEM7Z0JBQzlDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDOzs7OztJQUVELHFCQUFxQixDQUFDLEtBQVk7O2NBQzFCLFNBQVMsR0FBRyxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlOztjQUMxRCxtQkFBbUIsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQzlEO1FBQ0QsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRUQsY0FBYyxDQUFDLEtBQVk7O2NBQ25CLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQ2xEO1FBQ0QsT0FBTyxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBQ0Y7OztJQXBFYSxnQ0FBeUM7Ozs7O0lBQUUsZ0NBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhY2UgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuL3BsYWNlLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgUGFyYW1ldGVyRGVmaW5pdGlvbiB9IGZyb20gJy4vcm91dGUvcGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MnO1xuXG5pbnRlcmZhY2UgUGFyYW1zIHtcbiAgW3A6IHN0cmluZ106IGFueVxufVxuXG5cbmV4cG9ydCBjbGFzcyBWaXNpdCB7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcGxhY2VEZWZpbml0aW9uOiBQbGFjZURlZmluaXRpb24sIHByaXZhdGUgcmVhZG9ubHkgdmlzaXRQYXJhbWV0ZXJzOiBQYXJhbXMgPSB7fSkge1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgZ2V0Um91dGVJZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnBsYWNlRGVmaW5pdGlvbi5nZXRSb3V0ZUlkRnJvbSh0aGlzKTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGhhc1JvdXRlSWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFfLmlzTmlsKHRoaXMuZ2V0Um91dGVJZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGxhY2UgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhlIHBhcmFtZXRlclxuICAgKiBuYW1lIGlzIHRha2VuIGZyb20gdGhlIGBhc2Agb3B0aW9uLCBlLmcuIHthczogJ2FDdXN0b21OYW1lJ30gb3RoZXJ3aXNlIGl0IGlzIHRoZVxuICAgKiBzYW1lIGFzIHRoZSB0aGUgVmFsdWVNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSB0aGUgZmllbGQgbmFtZSBvZiB0aGUgcHJvcGVydHkgbW9kZWwgb3IgdGhlIGBhc2Agb3B0aW9uIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZpc2l0UGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGhhc1BhcmFtZXRlcihwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy52aXNpdFBhcmFtZXRlcnMpLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpO1xuICB9XG5cbiAgcmVwbGFjZTxTPihwYXJhbWV0ZXI6IFBhcmFtZXRlckRlZmluaXRpb248YW55LCBTPiwgdmFsdWU6IFMpOiBWaXNpdCB7XG4gICAgcmV0dXJuIG5ldyBWaXNpdCh0aGlzLnBsYWNlRGVmaW5pdGlvbiwgeyAuLi50aGlzLnZpc2l0UGFyYW1ldGVycywgW3BhcmFtZXRlci5uYW1lXTogdmFsdWUgfSk7XG4gIH1cblxuICBtZXJnZVJvdXRlUGFyYW1ldGVyczxTPihyb3V0ZVBhcmFtczogeyBbcDogc3RyaW5nXTogYW55IH0pOiBWaXNpdCB7XG4gICAgLy8gdG9kbzogd2hpdGVsaXN0IHBhcmFtZXRlcnMuXG4gICAgY29uc3Qgcm91dGVQYXJhbWV0ZXJLZXlzID0gT2JqZWN0LmtleXMocm91dGVQYXJhbXMpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIHRoaXMucGxhY2VEZWZpbml0aW9uLmdldFZpc2l0UGFyYW1ldGVyRGVmcygpLmZvckVhY2goZGVmID0+IHtcbiAgICAgIGlmIChkZWYuaXNSb3V0ZUlkIHx8IGRlZi5pc1JvdXRlUGFyYW1ldGVyKSB7XG4gICAgICAgIGlmIChyb3V0ZVBhcmFtZXRlcktleXMuaW5jbHVkZXMoZGVmLm5hbWUpKSB7XG4gICAgICAgICAgcGFyYW1zW2RlZi5uYW1lXSA9IHJvdXRlUGFyYW1zW2RlZi5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29weSBub24gcm91dGUgcGFyYW1zIGFzIGlzLCBidXQgb25seSBpZiB0aGV5IGFscmVhZHkgZXhpc3Qgb3RoZXJ3aXNlIHdlJ2xsIGluamVjdCBuaWwgdmFsdWVzIGFuZCBicmVhayB0aGVcbiAgICAgICAgLy8gZGVmYXVsdHMgYW5kIHJlbWVtYmVyIHNhbml0aXNhdGlvbiBwcm9jZXNzLlxuICAgICAgICBpZiAodGhpcy5oYXNQYXJhbWV0ZXIoZGVmLm5hbWUpKSB7XG4gICAgICAgICAgcGFyYW1zW2RlZi5uYW1lXSA9IHRoaXMuZ2V0UGFyYW1ldGVyKGRlZi5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgVmlzaXQodGhpcy5wbGFjZURlZmluaXRpb24sIHBhcmFtcyk7XG4gIH1cblxuICBoYXNSb3V0aW5nQ2hhbmdlZEZyb20ob3RoZXI6IFZpc2l0KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2FtZVBsYWNlID0gb3RoZXIucGxhY2VEZWZpbml0aW9uID09PSB0aGlzLnBsYWNlRGVmaW5pdGlvbjtcbiAgICBjb25zdCBzYW1lUm91dGVQYXJhbWV0ZXJzID0gXy5pc0VxdWFsKFxuICAgICAgdGhpcy5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHRoaXMsIHRydWUpLFxuICAgICAgdGhpcy5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKG90aGVyLCB0cnVlKVxuICAgICk7XG4gICAgcmV0dXJuICFzYW1lUGxhY2UgfHwgIXNhbWVSb3V0ZVBhcmFtZXRlcnM7XG4gIH1cblxuICBoYXNDaGFuZ2VkRnJvbShvdGhlcjogVmlzaXQpIHtcbiAgICBjb25zdCBzYW1lTm9uUm91dGVQYXJhbWV0ZXJzID0gXy5pc0VxdWFsKFxuICAgICAgdGhpcy5wbGFjZURlZmluaXRpb24uZ2V0Tm9uUm91dGVQYXJhbWV0ZXJzKHRoaXMpLFxuICAgICAgdGhpcy5wbGFjZURlZmluaXRpb24uZ2V0Tm9uUm91dGVQYXJhbWV0ZXJzKG90aGVyKVxuICAgICk7XG4gICAgcmV0dXJuICFzYW1lTm9uUm91dGVQYXJhbWV0ZXJzIHx8IHRoaXMuaGFzUm91dGluZ0NoYW5nZWRGcm9tKG90aGVyKTtcbiAgfVxufVxuIl19