@coolon/angular-ui-powerups 0.0.8 → 0.0.10

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 (53) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +592 -167
  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 +12 -11
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +12 -11
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/animations/slideDownAndUpAnimation.js +2 -1
  10. package/esm2015/lib/components/forms/abstract-input.component.js +22 -12
  11. package/esm2015/lib/directives/command.directive.js +48 -4
  12. package/esm2015/lib/directives/focus-binding.directive.js +30 -14
  13. package/esm2015/lib/interaction/services/dialog-interaction.service.js +3 -1
  14. package/esm2015/lib/place/components/busy-overlay/busy-overlay.component.js +4 -4
  15. package/esm2015/lib/place/components/nav/nav.component.js +31 -0
  16. package/esm2015/lib/place/guards/place-route.guard.js +3 -3
  17. package/esm2015/lib/place/index.js +4 -3
  18. package/esm2015/lib/place/place.module.js +16 -5
  19. package/esm2015/lib/place/route/parameter-decorators.js +98 -2
  20. package/esm2015/lib/place/route/parameter-definition.class.js +4 -2
  21. package/esm2015/lib/place/route/route-parameter-bindings.js +25 -13
  22. package/esm2015/lib/place/route/route-parameter-sanitiser.js +206 -74
  23. package/esm2015/public_api.js +2 -2
  24. package/esm5/coolon-angular-ui-powerups.js +12 -11
  25. package/esm5/index.js +2 -2
  26. package/esm5/lib/animations/slideDownAndUpAnimation.js +2 -1
  27. package/esm5/lib/components/forms/abstract-input.component.js +26 -12
  28. package/esm5/lib/directives/command.directive.js +52 -4
  29. package/esm5/lib/directives/focus-binding.directive.js +34 -14
  30. package/esm5/lib/interaction/services/dialog-interaction.service.js +3 -1
  31. package/esm5/lib/place/components/busy-overlay/busy-overlay.component.js +4 -4
  32. package/esm5/lib/place/components/nav/nav.component.js +36 -0
  33. package/esm5/lib/place/guards/place-route.guard.js +3 -3
  34. package/esm5/lib/place/index.js +4 -3
  35. package/esm5/lib/place/place.module.js +16 -5
  36. package/esm5/lib/place/route/parameter-decorators.js +98 -2
  37. package/esm5/lib/place/route/parameter-definition.class.js +4 -2
  38. package/esm5/lib/place/route/route-parameter-bindings.js +25 -13
  39. package/esm5/lib/place/route/route-parameter-sanitiser.js +284 -92
  40. package/esm5/public_api.js +2 -2
  41. package/fesm2015/coolon-angular-ui-powerups.js +473 -121
  42. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  43. package/fesm5/coolon-angular-ui-powerups.js +562 -139
  44. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  45. package/lib/components/forms/abstract-input.component.d.ts +9 -8
  46. package/lib/directives/command.directive.d.ts +6 -3
  47. package/lib/directives/focus-binding.directive.d.ts +1 -0
  48. package/lib/place/components/nav/nav.component.d.ts +7 -0
  49. package/lib/place/index.d.ts +1 -0
  50. package/lib/place/route/parameter-decorators.d.ts +17 -0
  51. package/lib/place/route/parameter-definition.class.d.ts +4 -3
  52. package/lib/place/route/route-parameter-sanitiser.d.ts +33 -6
  53. package/package.json +2 -2
@@ -5,17 +5,20 @@ import { MatDialog, MatButtonModule, MatDialogModule, MatTabsModule, MatProgress
5
5
  import { BrowserModule } from '@angular/platform-browser';
6
6
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
7
7
  import { __extends, __decorate, __metadata, __assign, __awaiter, __generator, __values } from 'tslib';
8
- import { GarbageCollector, MutableListModel, Constant, UseDelegate, MutableValueModel, assert, Dsl, Logger, ListModel, StoreInListModel, EventListenerList, DelegatingValueModel, lang, UseDelegatingValueModel, ValueModel, StoreInValueModel, Trace, OptionsHelper, ValueHolder, TransactionObserver, Binding } from '@coolon/pectin';
8
+ import { GarbageCollector, DelegatingFormValueModel, UseDelegate, ValueModel, assert, UnaryCommand, lang, Dsl, Logger, ListModel, StoreInListModel, EventListenerList, DelegatingValueModel, MutableListModel, StoreInValueModel, Trace, OptionsHelper, ValueHolder, MutableValueModel, TransactionObserver, Binding } from '@coolon/pectin';
9
9
  import { PortalModule } from '@angular/cdk/portal';
10
10
  import { Deferred } from '@coolon/pectin/lib/promise/deferred.class';
11
+ import { assert as assert$1, Klass, Opts } from '@coolon/typescript-utilities';
11
12
  import { MatDialog as MatDialog$1 } from '@angular/material/dialog';
13
+ import { MatListModule } from '@angular/material/list';
14
+ import { MatTabsModule as MatTabsModule$1 } from '@angular/material/tabs';
15
+ import { MatTooltipModule } from '@angular/material/tooltip';
12
16
  import { RouterModule, Router, ActivatedRoute, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
13
17
  import { style, trigger, transition, animate } from '@angular/animations';
14
18
  import ResizeObserver from 'resize-observer-polyfill';
15
19
  import { Memoize } from '@typescript-plus/fast-memoize-decorator';
16
20
  import { isNil } from 'lodash';
17
21
  import 'reflect-metadata';
18
- import { Klass, Opts } from '@coolon/typescript-utilities';
19
22
  import { Memoize as Memoize$1 } from '@typescript-plus/fast-memoize-decorator/dist/src';
20
23
 
21
24
  /**
@@ -43,8 +46,6 @@ var DisposableComponent = /** @class */ (function (_super) {
43
46
  * @fileoverview added by tsickle
44
47
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
45
48
  */
46
- /** @type {?} */
47
- var EMPTY_ERRORS = new MutableListModel().readonly;
48
49
  /**
49
50
  * @abstract
50
51
  * @template T
@@ -53,9 +54,15 @@ var AbstractInputComponent = /** @class */ (function (_super) {
53
54
  __extends(AbstractInputComponent, _super);
54
55
  function AbstractInputComponent() {
55
56
  var _this = _super.call(this) || this;
57
+ _this.valueModel = new DelegatingFormValueModel();
58
+ // TODO: fix this.
59
+ // tslint:disable-next-line:no-output-native
56
60
  _this.focus = new EventEmitter();
61
+ // tslint:disable-next-line:no-output-native
57
62
  _this.blur = new EventEmitter();
63
+ // tslint:disable-next-line:no-output-native
58
64
  _this.enterKey = new EventEmitter();
65
+ // tslint:disable-next-line:no-output-native
59
66
  _this.escapeKey = new EventEmitter();
60
67
  /** @type {?} */
61
68
  var self = _this;
@@ -71,6 +78,17 @@ var AbstractInputComponent = /** @class */ (function (_super) {
71
78
  };
72
79
  return _this;
73
80
  }
81
+ Object.defineProperty(AbstractInputComponent.prototype, "userValueModel", {
82
+ set: /**
83
+ * @param {?} model
84
+ * @return {?}
85
+ */
86
+ function (model) {
87
+ this.valueModel.setDelegate(model);
88
+ },
89
+ enumerable: true,
90
+ configurable: true
91
+ });
74
92
  /**
75
93
  * @return {?}
76
94
  */
@@ -131,7 +149,7 @@ var AbstractInputComponent = /** @class */ (function (_super) {
131
149
  * @return {?}
132
150
  */
133
151
  function (command) {
134
- if (command && command.isEnabled()) {
152
+ if (command && command.enabled.value) {
135
153
  command.execute();
136
154
  }
137
155
  };
@@ -142,7 +160,6 @@ var AbstractInputComponent = /** @class */ (function (_super) {
142
160
  * @return {?}
143
161
  */
144
162
  function () {
145
- // this._focused = this.valueModel['focused'] || new ValueHolder();
146
163
  };
147
164
  /**
148
165
  * @return {?}
@@ -158,8 +175,7 @@ var AbstractInputComponent = /** @class */ (function (_super) {
158
175
  * @return {?}
159
176
  */
160
177
  function () {
161
- // @ts-ignore
162
- return ((/** @type {?} */ (this.valueModel))).enabled || Constant.TRUE;
178
+ return this.valueModel.enabled;
163
179
  },
164
180
  enumerable: true,
165
181
  configurable: true
@@ -178,7 +194,7 @@ var AbstractInputComponent = /** @class */ (function (_super) {
178
194
  * @return {?}
179
195
  */
180
196
  function () {
181
- return ((/** @type {?} */ (this.valueModel))).errorList || EMPTY_ERRORS;
197
+ return this.valueModel.errorList;
182
198
  },
183
199
  enumerable: true,
184
200
  configurable: true
@@ -194,7 +210,7 @@ var AbstractInputComponent = /** @class */ (function (_super) {
194
210
  configurable: true
195
211
  });
196
212
  AbstractInputComponent.propDecorators = {
197
- valueModel: [{ type: Input }],
213
+ userValueModel: [{ type: Input, args: ['valueModel',] }],
198
214
  label: [{ type: Input }],
199
215
  floatLabel: [{ type: Input }],
200
216
  hint: [{ type: Input }],
@@ -214,8 +230,9 @@ var AbstractInputComponent = /** @class */ (function (_super) {
214
230
  };
215
231
  __decorate([
216
232
  UseDelegate(),
217
- __metadata("design:type", MutableValueModel)
218
- ], AbstractInputComponent.prototype, "valueModel", void 0);
233
+ __metadata("design:type", ValueModel),
234
+ __metadata("design:paramtypes", [ValueModel])
235
+ ], AbstractInputComponent.prototype, "userValueModel", null);
219
236
  return AbstractInputComponent;
220
237
  }(DisposableComponent));
221
238
  if (false) {
@@ -284,13 +301,35 @@ var NumberInputComponent = /** @class */ (function (_super) {
284
301
  * @fileoverview added by tsickle
285
302
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
286
303
  */
304
+ /**
305
+ * @template P
306
+ */
287
307
  var CommandDirective = /** @class */ (function (_super) {
288
308
  __extends(CommandDirective, _super);
289
309
  function CommandDirective(elementRef) {
290
310
  var _this = _super.call(this) || this;
291
311
  _this.elementRef = elementRef;
312
+ _this._commandParameterProvided = false;
292
313
  return _this;
293
314
  }
315
+ Object.defineProperty(CommandDirective.prototype, "commandParameter", {
316
+ get: /**
317
+ * @return {?}
318
+ */
319
+ function () {
320
+ return this._commandParameter;
321
+ },
322
+ set: /**
323
+ * @param {?} value
324
+ * @return {?}
325
+ */
326
+ function (value) {
327
+ this._commandParameterProvided = true;
328
+ this._commandParameter = value;
329
+ },
330
+ enumerable: true,
331
+ configurable: true
332
+ });
294
333
  /**
295
334
  * @return {?}
296
335
  */
@@ -299,6 +338,16 @@ var CommandDirective = /** @class */ (function (_super) {
299
338
  */
300
339
  function () {
301
340
  assert.notNil(this.pectinCommand);
341
+ if (this.pectinCommand instanceof UnaryCommand) {
342
+ if (!this._commandParameterProvided) {
343
+ lang.illegalState('UnaryCommands required the command parameter to be specified.');
344
+ }
345
+ }
346
+ else {
347
+ if (this._commandParameterProvided) {
348
+ lang.illegalState('command parameters are only supported by UnaryCommands');
349
+ }
350
+ }
302
351
  };
303
352
  /**
304
353
  * @return {?}
@@ -350,8 +399,13 @@ var CommandDirective = /** @class */ (function (_super) {
350
399
  function ($event) {
351
400
  $event.preventDefault();
352
401
  $event.stopPropagation();
353
- if (this.pectinCommand.isEnabled()) {
354
- this.pectinCommand.execute({ event: $event });
402
+ if (this.pectinCommand.enabled.value) {
403
+ if (this.pectinCommand instanceof UnaryCommand) {
404
+ this.pectinCommand.withContext({ event: $event }).execute(this.commandParameter);
405
+ }
406
+ else {
407
+ this.pectinCommand.withContext({ event: $event }).execute();
408
+ }
355
409
  }
356
410
  else {
357
411
  console.warn('disabled command clicked, ignoring.');
@@ -369,6 +423,7 @@ var CommandDirective = /** @class */ (function (_super) {
369
423
  ]; };
370
424
  CommandDirective.propDecorators = {
371
425
  pectinCommand: [{ type: Input }],
426
+ commandParameter: [{ type: Input }],
372
427
  notifyClick: [{ type: HostListener, args: ['click', ['$event'],] }]
373
428
  };
374
429
  return CommandDirective;
@@ -376,6 +431,16 @@ var CommandDirective = /** @class */ (function (_super) {
376
431
  if (false) {
377
432
  /** @type {?} */
378
433
  CommandDirective.prototype.pectinCommand;
434
+ /**
435
+ * @type {?}
436
+ * @private
437
+ */
438
+ CommandDirective.prototype._commandParameter;
439
+ /**
440
+ * @type {?}
441
+ * @private
442
+ */
443
+ CommandDirective.prototype._commandParameterProvided;
379
444
  /**
380
445
  * @type {?}
381
446
  * @private
@@ -404,7 +469,9 @@ var FocusBindingDirective = /** @class */ (function (_super) {
404
469
  * @return {?}
405
470
  */
406
471
  function () {
407
- this.pectinFocusBinding.focusCallbacks.notifyFocusIn();
472
+ if (this.hasBinding()) {
473
+ this.pectinFocusBinding.focusContext.notifyFocusIn();
474
+ }
408
475
  };
409
476
  /**
410
477
  * @return {?}
@@ -413,7 +480,9 @@ var FocusBindingDirective = /** @class */ (function (_super) {
413
480
  * @return {?}
414
481
  */
415
482
  function () {
416
- this.pectinFocusBinding.focusCallbacks.notifyFocusOut();
483
+ if (this.hasBinding()) {
484
+ this.pectinFocusBinding.focusContext.notifyFocusOut();
485
+ }
417
486
  };
418
487
  /**
419
488
  * @return {?}
@@ -432,16 +501,32 @@ var FocusBindingDirective = /** @class */ (function (_super) {
432
501
  function () {
433
502
  var _this = this;
434
503
  // TODO: Make this also track the current enabled/disabled state.
435
- var chain = Dsl.disposeWith(this).chain;
436
- chain.value(this.pectinFocusBinding.focused).subscribe((/**
437
- * @param {?} focused
438
- * @return {?}
439
- */
440
- function (focused) {
441
- if (focused && !_this.alreadyHasFocus()) {
442
- _this.tryAndFocus();
443
- }
444
- }));
504
+ if (this.hasBinding()) {
505
+ var chain = Dsl.disposeWith(this).chain;
506
+ chain.value(this.pectinFocusBinding.focusContext.focused).subscribe((/**
507
+ * @param {?} focused
508
+ * @return {?}
509
+ */
510
+ function (focused) {
511
+ if (focused && !_this.alreadyHasFocus()) {
512
+ _this.tryAndFocus();
513
+ }
514
+ }));
515
+ }
516
+ else {
517
+ Logger.get(this).warn("pectinFocusBinding was nil");
518
+ }
519
+ };
520
+ /**
521
+ * @private
522
+ * @return {?}
523
+ */
524
+ FocusBindingDirective.prototype.hasBinding = /**
525
+ * @private
526
+ * @return {?}
527
+ */
528
+ function () {
529
+ return !!this.pectinFocusBinding && !!this.pectinFocusBinding.focusContext;
445
530
  };
446
531
  // Hook method for debugging via tracing.
447
532
  // Hook method for debugging via tracing.
@@ -526,7 +611,7 @@ var FocusBindingDirective = /** @class */ (function (_super) {
526
611
  * @return {?}
527
612
  */
528
613
  function () {
529
- return this.pectinFocusBinding.focused.value;
614
+ return this.hasBinding() && this.pectinFocusBinding.focusContext.focused.value;
530
615
  };
531
616
  // Hook method for debugging via tracing.
532
617
  // Hook method for debugging via tracing.
@@ -1406,6 +1491,7 @@ var DialogInteractionService = /** @class */ (function (_super) {
1406
1491
  function DialogInteractionService(dialogService) {
1407
1492
  var _this = _super.call(this) || this;
1408
1493
  _this.dialogService = dialogService;
1494
+ assert$1.notNil(dialogService);
1409
1495
  return _this;
1410
1496
  }
1411
1497
  /**
@@ -1577,7 +1663,7 @@ var BusyOverlayComponent = /** @class */ (function () {
1577
1663
  };
1578
1664
  BusyOverlayComponent.decorators = [
1579
1665
  { type: Component, args: [{
1580
- selector: 'aup-busy-overlay',
1666
+ selector: 'angular-ui-powerups-busy-overlay',
1581
1667
  template: "<ng-content></ng-content>\n<div class=\"busy-overlay-backdrop\" *ngIf=\"busyModel.value\">\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"52\"></mat-progress-spinner>\n</div>\n",
1582
1668
  styles: [":host{position:relative}div.busy-overlay-backdrop{position:absolute;background-color:rgba(0,0,0,.2);top:0;left:0;bottom:0;right:0;display:-ms-grid;display:grid;-ms-grid-columns:auto;grid-template-columns:auto;-ms-grid-rows:auto;grid-template-rows:auto;place-content:center}"]
1583
1669
  }] }
@@ -1589,7 +1675,7 @@ var BusyOverlayComponent = /** @class */ (function () {
1589
1675
  busy: [{ type: Input }]
1590
1676
  };
1591
1677
  __decorate([
1592
- UseDelegatingValueModel(),
1678
+ UseDelegate(),
1593
1679
  __metadata("design:type", ValueModel)
1594
1680
  ], BusyOverlayComponent.prototype, "busyModel", void 0);
1595
1681
  __decorate([
@@ -1632,6 +1718,40 @@ var EmptyStateComponent = /** @class */ (function () {
1632
1718
  return EmptyStateComponent;
1633
1719
  }());
1634
1720
 
1721
+ /**
1722
+ * @fileoverview added by tsickle
1723
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1724
+ */
1725
+ var NavComponent = /** @class */ (function () {
1726
+ function NavComponent() {
1727
+ }
1728
+ /**
1729
+ * @return {?}
1730
+ */
1731
+ NavComponent.prototype.ngOnInit = /**
1732
+ * @return {?}
1733
+ */
1734
+ function () {
1735
+ };
1736
+ NavComponent.decorators = [
1737
+ { type: Component, args: [{
1738
+ selector: 'angular-ui-powerups-nav',
1739
+ template: "<nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let place of places\" [routerLink]='place.path'\n routerLinkActive #rla=\"routerLinkActive\"\n [active]=\"rla.isActive\"\n [matTooltip]=\"place.title\">{{place.title}}</a>\n</nav>\n\n",
1740
+ styles: [""]
1741
+ }] }
1742
+ ];
1743
+ /** @nocollapse */
1744
+ NavComponent.ctorParameters = function () { return []; };
1745
+ NavComponent.propDecorators = {
1746
+ places: [{ type: Input }]
1747
+ };
1748
+ return NavComponent;
1749
+ }());
1750
+ if (false) {
1751
+ /** @type {?} */
1752
+ NavComponent.prototype.places;
1753
+ }
1754
+
1635
1755
  /**
1636
1756
  * @fileoverview added by tsickle
1637
1757
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -1772,19 +1892,25 @@ var PlaceModule = /** @class */ (function () {
1772
1892
  { type: NgModule, args: [{
1773
1893
  imports: [
1774
1894
  CommonModule,
1895
+ BrowserAnimationsModule,
1775
1896
  MatProgressSpinnerModule,
1776
- RouterModule
1897
+ RouterModule,
1898
+ MatTabsModule$1,
1899
+ MatListModule,
1900
+ MatTooltipModule
1777
1901
  ],
1778
1902
  declarations: [
1779
1903
  EmptyStateComponent,
1780
1904
  BusyOverlayComponent,
1781
- PlaceOutletComponent
1905
+ PlaceOutletComponent,
1906
+ NavComponent
1782
1907
  ],
1783
1908
  entryComponents: [BusyOverlayComponent],
1784
1909
  exports: [
1785
1910
  BusyOverlayComponent,
1786
1911
  PlaceOutletComponent,
1787
- EmptyStateComponent
1912
+ EmptyStateComponent,
1913
+ NavComponent
1788
1914
  ],
1789
1915
  providers: [
1790
1916
  PlaceService
@@ -1854,6 +1980,7 @@ var defaultHiddenStyleDef = style({
1854
1980
  * @return {?}
1855
1981
  */
1856
1982
  function slideDownAndUpAnimation(triggerName, options) {
1983
+ // SEE to fix this: https://github.com/angular/angular/issues/15587#issuecomment-351510501
1857
1984
  /** @type {?} */
1858
1985
  var duration = OptionsHelper.get(options).getOptional('duration', '100ms');
1859
1986
  /** @type {?} */
@@ -2275,7 +2402,7 @@ function Place(options) {
2275
2402
  function ResolvedParameter() { }
2276
2403
  if (false) {
2277
2404
  /** @type {?} */
2278
- ResolvedParameter.prototype.parameter;
2405
+ ResolvedParameter.prototype.parameterDef;
2279
2406
  /** @type {?} */
2280
2407
  ResolvedParameter.prototype.resolvedValue;
2281
2408
  }
@@ -2299,7 +2426,7 @@ var ResolvedParameters = /** @class */ (function () {
2299
2426
  * @param {?} p
2300
2427
  * @return {?}
2301
2428
  */
2302
- function (p) { return p.parameter === parameter; }));
2429
+ function (p) { return p.parameterDef === parameter; }));
2303
2430
  return resolved ? resolved.resolvedValue : null;
2304
2431
  };
2305
2432
  /**
@@ -2319,8 +2446,8 @@ var ResolvedParameters = /** @class */ (function () {
2319
2446
  * @param {?} p
2320
2447
  * @return {?}
2321
2448
  */
2322
- function (p) { return p.parameter !== parameter; })).concat({
2323
- parameter: parameter,
2449
+ function (p) { return p.parameterDef !== parameter; })).concat({
2450
+ parameterDef: parameter,
2324
2451
  resolvedValue: value
2325
2452
  }));
2326
2453
  };
@@ -2335,7 +2462,7 @@ var ResolvedParameters = /** @class */ (function () {
2335
2462
  function () {
2336
2463
  /** @type {?} */
2337
2464
  var routeIdParam = this.getRouteIdParam();
2338
- return routeIdParam ? routeIdParam.parameter.type.format(routeIdParam.resolvedValue) : null;
2465
+ return routeIdParam ? routeIdParam.parameterDef.type.format(routeIdParam.resolvedValue) : null;
2339
2466
  };
2340
2467
  /**
2341
2468
  * @private
@@ -2350,7 +2477,7 @@ var ResolvedParameters = /** @class */ (function () {
2350
2477
  * @param {?} p
2351
2478
  * @return {?}
2352
2479
  */
2353
- function (p) { return p.parameter.isRouteId; }));
2480
+ function (p) { return p.parameterDef.isRouteId; }));
2354
2481
  };
2355
2482
  /**
2356
2483
  * @protected
@@ -2368,12 +2495,12 @@ var ResolvedParameters = /** @class */ (function () {
2368
2495
  * @param {?} p
2369
2496
  * @return {?}
2370
2497
  */
2371
- function (p) { return !p.parameter.isRouteId; })).forEach((/**
2498
+ function (p) { return !p.parameterDef.isRouteId; })).forEach((/**
2372
2499
  * @param {?} p
2373
2500
  * @return {?}
2374
2501
  */
2375
2502
  function (p) {
2376
- params[p.parameter.name] = p.parameter.type.format(p.resolvedValue);
2503
+ params[p.parameterDef.name] = p.parameterDef.type.format(p.resolvedValue);
2377
2504
  }));
2378
2505
  return params;
2379
2506
  };
@@ -2406,7 +2533,7 @@ var ResolvedParameters = /** @class */ (function () {
2406
2533
  /** @type {?} */
2407
2534
  var path = routeId ? [relativePath, routeId, this.getFormattedParameters()] : [relativePath, this.getFormattedParameters()];
2408
2535
  router.navigate(path, {
2409
- relativeTo: activatedRoute,
2536
+ relativeTo: activatedRoute
2410
2537
  });
2411
2538
  };
2412
2539
  __decorate([
@@ -2463,11 +2590,23 @@ var RouteParameterBindings = /** @class */ (function (_super) {
2463
2590
  /** @type {?} */
2464
2591
  var result = [];
2465
2592
  routeParameterDefs.forEach((/**
2466
- * @param {?} parameter
2593
+ * @param {?} parameterDef
2467
2594
  * @return {?}
2468
2595
  */
2469
- function (parameter) {
2470
- result.push({ parameter: parameter, resolvedValue: parameter.type.parse(params.get(parameter.name)) });
2596
+ function (parameterDef) {
2597
+ /** @type {?} */
2598
+ var resolvedValue;
2599
+ if (parameterDef.isArray) {
2600
+ resolvedValue = params.getAll(parameterDef.name).map((/**
2601
+ * @param {?} v
2602
+ * @return {?}
2603
+ */
2604
+ function (v) { return parameterDef.type.parse(v); }));
2605
+ }
2606
+ else {
2607
+ resolvedValue = parameterDef.type.parse(params.get(parameterDef.name));
2608
+ }
2609
+ result.push({ parameterDef: parameterDef, resolvedValue: resolvedValue });
2471
2610
  }));
2472
2611
  return new ResolvedParameters(result);
2473
2612
  }));
@@ -2718,41 +2857,162 @@ if (false) {
2718
2857
  * @fileoverview added by tsickle
2719
2858
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2720
2859
  */
2860
+ /**
2861
+ * @abstract
2862
+ * @template T, S
2863
+ */
2864
+ var /**
2865
+ * @abstract
2866
+ * @template T, S
2867
+ */
2868
+ Sanitiser = /** @class */ (function () {
2869
+ function Sanitiser(parameterDef, snapshot, sanitiser) {
2870
+ this.parameterDef = parameterDef;
2871
+ this.snapshot = snapshot;
2872
+ this.sanitiser = sanitiser;
2873
+ }
2874
+ /**
2875
+ * @return {?}
2876
+ */
2877
+ Sanitiser.prototype.isRouteId = /**
2878
+ * @return {?}
2879
+ */
2880
+ function () {
2881
+ return this.parameterDef.isRouteId;
2882
+ };
2883
+ Object.defineProperty(Sanitiser.prototype, "valueChanged", {
2884
+ get: /**
2885
+ * @return {?}
2886
+ */
2887
+ function () {
2888
+ return !isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
2889
+ },
2890
+ enumerable: true,
2891
+ configurable: true
2892
+ });
2893
+ Object.defineProperty(Sanitiser.prototype, "sanitisedValue", {
2894
+ get: /**
2895
+ * @return {?}
2896
+ */
2897
+ function () {
2898
+ return this._sanitisedValue;
2899
+ },
2900
+ enumerable: true,
2901
+ configurable: true
2902
+ });
2903
+ /**
2904
+ * @return {?}
2905
+ */
2906
+ Sanitiser.prototype.sanitize = /**
2907
+ * @return {?}
2908
+ */
2909
+ function () {
2910
+ return __awaiter(this, void 0, void 0, function () {
2911
+ var _a;
2912
+ return __generator(this, function (_b) {
2913
+ switch (_b.label) {
2914
+ case 0:
2915
+ if (!this.sanitiser) return [3 /*break*/, 2];
2916
+ this.initialValue = this.readFrom(this.snapshot);
2917
+ _a = this;
2918
+ return [4 /*yield*/, this.sanitiser.sanitise(this.initialValue)];
2919
+ case 1:
2920
+ _a._sanitisedValue = _b.sent();
2921
+ if (this.initialValue !== this._sanitisedValue) {
2922
+ return [2 /*return*/, false];
2923
+ }
2924
+ _b.label = 2;
2925
+ case 2: return [2 /*return*/, true];
2926
+ }
2927
+ });
2928
+ });
2929
+ };
2930
+ return Sanitiser;
2931
+ }());
2932
+ if (false) {
2933
+ /**
2934
+ * @type {?}
2935
+ * @private
2936
+ */
2937
+ Sanitiser.prototype.initialValue;
2938
+ /**
2939
+ * @type {?}
2940
+ * @private
2941
+ */
2942
+ Sanitiser.prototype._sanitisedValue;
2943
+ /** @type {?} */
2944
+ Sanitiser.prototype.parameterDef;
2945
+ /** @type {?} */
2946
+ Sanitiser.prototype.snapshot;
2947
+ /** @type {?} */
2948
+ Sanitiser.prototype.sanitiser;
2949
+ /**
2950
+ * @abstract
2951
+ * @protected
2952
+ * @param {?} snapshot
2953
+ * @return {?}
2954
+ */
2955
+ Sanitiser.prototype.readFrom = function (snapshot) { };
2956
+ /**
2957
+ * @abstract
2958
+ * @protected
2959
+ * @param {?} initialValue
2960
+ * @param {?} sanitisedValue
2961
+ * @return {?}
2962
+ */
2963
+ Sanitiser.prototype.hasChanged = function (initialValue, sanitisedValue) { };
2964
+ /**
2965
+ * @abstract
2966
+ * @param {?} dest
2967
+ * @return {?}
2968
+ */
2969
+ Sanitiser.prototype.injectRouteParam = function (dest) { };
2970
+ }
2721
2971
  var RouteParameterSanitiser = /** @class */ (function () {
2722
- function RouteParameterSanitiser(parameterDefs, injector) {
2972
+ function RouteParameterSanitiser(parameterDefs, snapshot, injector) {
2973
+ var _this = this;
2723
2974
  this.parameterDefs = parameterDefs;
2975
+ this.snapshot = snapshot;
2724
2976
  this.injector = injector;
2725
- this.sanitisedParameters = [];
2726
- this.routeParameter = parameterDefs.find((/**
2977
+ this.parameterSanitisers = [];
2978
+ /** @type {?} */
2979
+ var sanitisers = parameterDefs.map((/**
2980
+ * @param {?} def
2981
+ * @return {?}
2982
+ */
2983
+ function (def) {
2984
+ return def.isArray ?
2985
+ new Sanitiser.Array(def, snapshot, _this.getSanitiser(def)) :
2986
+ new Sanitiser.Value(def, snapshot, _this.getSanitiser(def));
2987
+ }));
2988
+ this.routeIdSanitiser = sanitisers.find((/**
2727
2989
  * @param {?} p
2728
2990
  * @return {?}
2729
2991
  */
2730
- function (p) { return p.isRouteId; }));
2731
- this.queryParameters = parameterDefs.filter((/**
2992
+ function (p) { return p.isRouteId(); }));
2993
+ this.parameterSanitisers = sanitisers.filter((/**
2732
2994
  * @param {?} p
2733
2995
  * @return {?}
2734
2996
  */
2735
- function (p) { return !p.isRouteId; }));
2997
+ function (p) { return !p.isRouteId(); }));
2736
2998
  }
2737
2999
  /**
2738
- * @param {?} snapshot
2739
3000
  * @return {?}
2740
3001
  */
2741
3002
  RouteParameterSanitiser.prototype.sanitise = /**
2742
- * @param {?} snapshot
2743
3003
  * @return {?}
2744
3004
  */
2745
- function (snapshot) {
3005
+ function () {
2746
3006
  return __awaiter(this, void 0, void 0, function () {
2747
- var e_1, _a, routeOk, _b, _c, param, e_1_1;
3007
+ var e_1, _a, _b, _c, sanitiser, e_1_1;
2748
3008
  return __generator(this, function (_d) {
2749
3009
  switch (_d.label) {
2750
3010
  case 0:
2751
- if (!this.routeParameter) return [3 /*break*/, 2];
2752
- return [4 /*yield*/, this.sanitiseParameter(this.routeParameter, snapshot.paramMap.get(this.routeParameter.name))];
3011
+ if (!this.routeIdSanitiser) return [3 /*break*/, 2];
3012
+ return [4 /*yield*/, this.routeIdSanitiser.sanitize()];
2753
3013
  case 1:
2754
- routeOk = _d.sent();
2755
- if (!routeOk) {
3014
+ _d.sent();
3015
+ if (this.routeIdSanitiser.valueChanged) {
2756
3016
  // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
2757
3017
  // context of the route id.
2758
3018
  return [2 /*return*/, false];
@@ -2760,12 +3020,12 @@ var RouteParameterSanitiser = /** @class */ (function () {
2760
3020
  _d.label = 2;
2761
3021
  case 2:
2762
3022
  _d.trys.push([2, 7, 8, 9]);
2763
- _b = __values(this.queryParameters), _c = _b.next();
3023
+ _b = __values(this.parameterSanitisers), _c = _b.next();
2764
3024
  _d.label = 3;
2765
3025
  case 3:
2766
3026
  if (!!_c.done) return [3 /*break*/, 6];
2767
- param = _c.value;
2768
- return [4 /*yield*/, this.sanitiseParameter(param, snapshot.queryParamMap.get(param.name))];
3027
+ sanitiser = _c.value;
3028
+ return [4 /*yield*/, sanitiser.sanitize()];
2769
3029
  case 4:
2770
3030
  _d.sent();
2771
3031
  _d.label = 5;
@@ -2783,42 +3043,11 @@ var RouteParameterSanitiser = /** @class */ (function () {
2783
3043
  }
2784
3044
  finally { if (e_1) throw e_1.error; }
2785
3045
  return [7 /*endfinally*/];
2786
- case 9: return [2 /*return*/, this.sanitisedParameters.length === 0];
2787
- }
2788
- });
2789
- });
2790
- };
2791
- /**
2792
- * @template T
2793
- * @param {?} def
2794
- * @param {?} formattedInitialValue
2795
- * @return {?}
2796
- */
2797
- RouteParameterSanitiser.prototype.sanitiseParameter = /**
2798
- * @template T
2799
- * @param {?} def
2800
- * @param {?} formattedInitialValue
2801
- * @return {?}
2802
- */
2803
- function (def, formattedInitialValue) {
2804
- return __awaiter(this, void 0, void 0, function () {
2805
- var sanitiser, initialValue, sanitisedValue;
2806
- return __generator(this, function (_a) {
2807
- switch (_a.label) {
2808
- case 0:
2809
- if (!def) return [3 /*break*/, 2];
2810
- sanitiser = this.getSanitiser(def);
2811
- if (!sanitiser) return [3 /*break*/, 2];
2812
- initialValue = def.type.parse(formattedInitialValue);
2813
- return [4 /*yield*/, sanitiser.sanitise(initialValue)];
2814
- case 1:
2815
- sanitisedValue = _a.sent();
2816
- if (initialValue !== sanitisedValue) {
2817
- this.sanitisedParameters.push({ def: def, value: def.type.format(sanitisedValue) });
2818
- return [2 /*return*/, false];
2819
- }
2820
- _a.label = 2;
2821
- case 2: return [2 /*return*/, true];
3046
+ case 9: return [2 /*return*/, !this.parameterSanitisers.find((/**
3047
+ * @param {?} s
3048
+ * @return {?}
3049
+ */
3050
+ function (s) { return s.valueChanged; }))];
2822
3051
  }
2823
3052
  });
2824
3053
  });
@@ -2832,57 +3061,36 @@ var RouteParameterSanitiser = /** @class */ (function () {
2832
3061
  * @return {?}
2833
3062
  */
2834
3063
  function (router) {
2835
- var _this = this;
2836
- assert.isTruthy(this.sanitisedParameters.length !== 0);
2837
- /** @type {?} */
2838
- var sanitisedRouteId = this.sanitisedParameters.find((/**
2839
- * @param {?} s
2840
- * @return {?}
2841
- */
2842
- function (s) { return s.def === _this.routeParameter; }));
2843
- if (sanitisedRouteId) {
2844
- return router.navigate(['..', sanitisedRouteId.value]);
3064
+ assert.isTruthy(this.parameterSanitisers.length !== 0);
3065
+ if (this.routeIdSanitiser.valueChanged) {
3066
+ return router.navigate(['..', this.routeIdSanitiser.sanitisedValue]);
2845
3067
  }
2846
3068
  else {
2847
3069
  /** @type {?} */
2848
- var queryParams = this.sanitisedParameters.filter((/**
3070
+ var routeParams_1 = {};
3071
+ this.parameterSanitisers.forEach((/**
2849
3072
  * @param {?} s
2850
3073
  * @return {?}
2851
3074
  */
2852
- function (s) { return s.def !== _this.routeParameter; }))
2853
- .reduce((/**
2854
- * @param {?} params
2855
- * @param {?} item
2856
- * @return {?}
2857
- */
2858
- function (params, item) {
2859
- var _a;
2860
- return (__assign({}, params, (_a = {}, _a[item.def.name] = item.value, _a)));
2861
- }), {});
2862
- return router.navigate(['.', queryParams]);
3075
+ function (s) { return s.injectRouteParam(routeParams_1); }));
3076
+ return router.navigate(['.', routeParams_1]);
2863
3077
  }
2864
3078
  };
2865
3079
  /**
2866
3080
  * @private
2867
- * @template T
3081
+ * @template T, S
2868
3082
  * @param {?} def
2869
3083
  * @return {?}
2870
3084
  */
2871
3085
  RouteParameterSanitiser.prototype.getSanitiser = /**
2872
3086
  * @private
2873
- * @template T
3087
+ * @template T, S
2874
3088
  * @param {?} def
2875
3089
  * @return {?}
2876
3090
  */
2877
3091
  function (def) {
2878
3092
  return def.sanitiser ? this.injector.get(def.sanitiser, new def.sanitiser()) : null;
2879
3093
  };
2880
- __decorate([
2881
- Trace(),
2882
- __metadata("design:type", Function),
2883
- __metadata("design:paramtypes", [Object, String]),
2884
- __metadata("design:returntype", Promise)
2885
- ], RouteParameterSanitiser.prototype, "sanitiseParameter", null);
2886
3094
  __decorate([
2887
3095
  Memoize$1(),
2888
3096
  __metadata("design:type", Function),
@@ -2896,22 +3104,139 @@ if (false) {
2896
3104
  * @type {?}
2897
3105
  * @private
2898
3106
  */
2899
- RouteParameterSanitiser.prototype.routeParameter;
2900
- /**
2901
- * @type {?}
2902
- * @private
2903
- */
2904
- RouteParameterSanitiser.prototype.queryParameters;
3107
+ RouteParameterSanitiser.prototype.routeIdSanitiser;
2905
3108
  /**
2906
3109
  * @type {?}
2907
3110
  * @private
2908
3111
  */
2909
- RouteParameterSanitiser.prototype.sanitisedParameters;
3112
+ RouteParameterSanitiser.prototype.parameterSanitisers;
2910
3113
  /** @type {?} */
2911
3114
  RouteParameterSanitiser.prototype.parameterDefs;
2912
3115
  /** @type {?} */
3116
+ RouteParameterSanitiser.prototype.snapshot;
3117
+ /** @type {?} */
2913
3118
  RouteParameterSanitiser.prototype.injector;
2914
3119
  }
3120
+ (function (Sanitiser) {
3121
+ /**
3122
+ * @template T
3123
+ */
3124
+ var /**
3125
+ * @template T
3126
+ */
3127
+ Value = /** @class */ (function (_super) {
3128
+ __extends(Value, _super);
3129
+ function Value() {
3130
+ return _super !== null && _super.apply(this, arguments) || this;
3131
+ }
3132
+ /**
3133
+ * @param {?} snapshot
3134
+ * @return {?}
3135
+ */
3136
+ Value.prototype.readFrom = /**
3137
+ * @param {?} snapshot
3138
+ * @return {?}
3139
+ */
3140
+ function (snapshot) {
3141
+ /** @type {?} */
3142
+ var rawValue = this.parameterDef.isRouteId ?
3143
+ snapshot.paramMap.get(this.parameterDef.name) :
3144
+ snapshot.queryParamMap.get(this.parameterDef.name);
3145
+ return this.parameterDef.type.parse(rawValue);
3146
+ };
3147
+ /**
3148
+ * @protected
3149
+ * @param {?} initialValue
3150
+ * @param {?} sanitisedValue
3151
+ * @return {?}
3152
+ */
3153
+ Value.prototype.hasChanged = /**
3154
+ * @protected
3155
+ * @param {?} initialValue
3156
+ * @param {?} sanitisedValue
3157
+ * @return {?}
3158
+ */
3159
+ function (initialValue, sanitisedValue) {
3160
+ return initialValue !== sanitisedValue;
3161
+ };
3162
+ /**
3163
+ * @param {?} dest
3164
+ * @return {?}
3165
+ */
3166
+ Value.prototype.injectRouteParam = /**
3167
+ * @param {?} dest
3168
+ * @return {?}
3169
+ */
3170
+ function (dest) {
3171
+ dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
3172
+ };
3173
+ return Value;
3174
+ }(Sanitiser));
3175
+ Sanitiser.Value = Value;
3176
+ /**
3177
+ * @template T
3178
+ */
3179
+ var /**
3180
+ * @template T
3181
+ */
3182
+ Array = /** @class */ (function (_super) {
3183
+ __extends(Array, _super);
3184
+ function Array() {
3185
+ return _super !== null && _super.apply(this, arguments) || this;
3186
+ }
3187
+ /**
3188
+ * @param {?} snapshot
3189
+ * @return {?}
3190
+ */
3191
+ Array.prototype.readFrom = /**
3192
+ * @param {?} snapshot
3193
+ * @return {?}
3194
+ */
3195
+ function (snapshot) {
3196
+ var _this = this;
3197
+ /** @type {?} */
3198
+ var rawValues = snapshot.queryParamMap.getAll(this.parameterDef.name);
3199
+ return rawValues.map((/**
3200
+ * @param {?} value
3201
+ * @return {?}
3202
+ */
3203
+ function (value) { return _this.parameterDef.type.parse(value); }));
3204
+ };
3205
+ /**
3206
+ * @protected
3207
+ * @param {?} initialValue
3208
+ * @param {?} sanitisedValue
3209
+ * @return {?}
3210
+ */
3211
+ Array.prototype.hasChanged = /**
3212
+ * @protected
3213
+ * @param {?} initialValue
3214
+ * @param {?} sanitisedValue
3215
+ * @return {?}
3216
+ */
3217
+ function (initialValue, sanitisedValue) {
3218
+ return initialValue !== sanitisedValue;
3219
+ };
3220
+ /**
3221
+ * @param {?} dest
3222
+ * @return {?}
3223
+ */
3224
+ Array.prototype.injectRouteParam = /**
3225
+ * @param {?} dest
3226
+ * @return {?}
3227
+ */
3228
+ function (dest) {
3229
+ var _this = this;
3230
+ dest[this.parameterDef.name] = this.sanitisedValue.map((/**
3231
+ * @param {?} v
3232
+ * @return {?}
3233
+ */
3234
+ function (v) { return _this.parameterDef.type.format(v); }));
3235
+ };
3236
+ return Array;
3237
+ }(Sanitiser));
3238
+ Sanitiser.Array = Array;
3239
+ })(Sanitiser || (Sanitiser = {}));
2915
3240
 
2916
3241
  /**
2917
3242
  * @fileoverview added by tsickle
@@ -2937,8 +3262,8 @@ var PlaceRouteGuard = /** @class */ (function () {
2937
3262
  /** @type {?} */
2938
3263
  var routeParameters = Klass.get(route.component).getMetadataList(RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY);
2939
3264
  /** @type {?} */
2940
- var sanitiser = new RouteParameterSanitiser(routeParameters, this.injector);
2941
- return sanitiser.sanitise(route).then((/**
3265
+ var sanitiser = new RouteParameterSanitiser(routeParameters, route, this.injector);
3266
+ return sanitiser.sanitise().then((/**
2942
3267
  * @param {?} proceed
2943
3268
  * @return {?}
2944
3269
  */
@@ -3009,6 +3334,17 @@ if (false) {
3009
3334
  /** @type {?|undefined} */
3010
3335
  ParameterOptions.prototype.sanitiser;
3011
3336
  }
3337
+ /**
3338
+ * @record
3339
+ * @template T
3340
+ */
3341
+ function ListParameterOptions() { }
3342
+ if (false) {
3343
+ /** @type {?|undefined} */
3344
+ ListParameterOptions.prototype.as;
3345
+ /** @type {?|undefined} */
3346
+ ListParameterOptions.prototype.listSanitiser;
3347
+ }
3012
3348
  /**
3013
3349
  * @template T
3014
3350
  * @param {?} type
@@ -3030,12 +3366,32 @@ function RouteId(type, options) {
3030
3366
  });
3031
3367
  }
3032
3368
  /**
3369
+ * @deprecated use RouteParameter instead.
3033
3370
  * @template T
3034
3371
  * @param {?} type
3035
3372
  * @param {?=} options
3036
3373
  * @return {?}
3037
3374
  */
3038
3375
  function QueryParameter(type, options) {
3376
+ return (/**
3377
+ * @param {?} prototype
3378
+ * @param {?} propertyKey
3379
+ * @return {?}
3380
+ */
3381
+ function (prototype, propertyKey) {
3382
+ /** @type {?} */
3383
+ var param = createDefinition(propertyKey, type, options, false);
3384
+ Klass.get(prototype).addToOwnMetadataList(RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3385
+ UseDelegate()(prototype, propertyKey);
3386
+ });
3387
+ }
3388
+ /**
3389
+ * @template T
3390
+ * @param {?} type
3391
+ * @param {?=} options
3392
+ * @return {?}
3393
+ */
3394
+ function RouteParameter(type, options) {
3039
3395
  // assert.isTruthy(type.isValid());
3040
3396
  return (/**
3041
3397
  * @param {?} prototype
@@ -3049,6 +3405,47 @@ function QueryParameter(type, options) {
3049
3405
  UseDelegate()(prototype, propertyKey);
3050
3406
  });
3051
3407
  }
3408
+ /**
3409
+ * @deprecated use RouteParameterList instead
3410
+ * @template E
3411
+ * @param {?} elementType
3412
+ * @param {?=} options
3413
+ * @return {?}
3414
+ */
3415
+ function QueryParameterList(elementType, options) {
3416
+ // assert.isTruthy(type.isValid());
3417
+ return (/**
3418
+ * @param {?} prototype
3419
+ * @param {?} propertyKey
3420
+ * @return {?}
3421
+ */
3422
+ function (prototype, propertyKey) {
3423
+ /** @type {?} */
3424
+ var param = createArrayDefinition(propertyKey, elementType, options);
3425
+ Klass.get(prototype).addToOwnMetadataList(RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3426
+ UseDelegate()(prototype, propertyKey);
3427
+ });
3428
+ }
3429
+ /**
3430
+ * @template E
3431
+ * @param {?} elementType
3432
+ * @param {?=} options
3433
+ * @return {?}
3434
+ */
3435
+ function RouteParameterList(elementType, options) {
3436
+ // assert.isTruthy(type.isValid());
3437
+ return (/**
3438
+ * @param {?} prototype
3439
+ * @param {?} propertyKey
3440
+ * @return {?}
3441
+ */
3442
+ function (prototype, propertyKey) {
3443
+ /** @type {?} */
3444
+ var param = createArrayDefinition(propertyKey, elementType, options);
3445
+ Klass.get(prototype).addToOwnMetadataList(RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3446
+ UseDelegate()(prototype, propertyKey);
3447
+ });
3448
+ }
3052
3449
  /**
3053
3450
  * @template T
3054
3451
  * @param {?} propertyName
@@ -3068,7 +3465,31 @@ function createDefinition(propertyName, type, options, routeId) {
3068
3465
  propertyName: propertyNameAsString,
3069
3466
  type: assert.notNil(type),
3070
3467
  sanitiser: opts.getOptional('sanitiser', null),
3071
- isRouteId: routeId
3468
+ isRouteId: routeId,
3469
+ isArray: false
3470
+ };
3471
+ return def;
3472
+ }
3473
+ /**
3474
+ * @template T
3475
+ * @param {?} propertyName
3476
+ * @param {?} type
3477
+ * @param {?} options
3478
+ * @return {?}
3479
+ */
3480
+ function createArrayDefinition(propertyName, type, options) {
3481
+ /** @type {?} */
3482
+ var opts = Opts.get(options);
3483
+ /** @type {?} */
3484
+ var propertyNameAsString = assert.notNil(propertyName).toString();
3485
+ /** @type {?} */
3486
+ var def = {
3487
+ name: opts.getOptional('as', propertyNameAsString),
3488
+ propertyName: propertyNameAsString,
3489
+ type: assert.notNil(type),
3490
+ sanitiser: opts.getOptional('listSanitiser', null),
3491
+ isRouteId: false,
3492
+ isArray: true
3072
3493
  };
3073
3494
  return def;
3074
3495
  }
@@ -3079,7 +3500,7 @@ function createDefinition(propertyName, type, options, routeId) {
3079
3500
  */
3080
3501
  /**
3081
3502
  * @record
3082
- * @template T
3503
+ * @template E, S
3083
3504
  */
3084
3505
  function ParameterDefinition() { }
3085
3506
  if (false) {
@@ -3093,6 +3514,8 @@ if (false) {
3093
3514
  ParameterDefinition.prototype.sanitiser;
3094
3515
  /** @type {?} */
3095
3516
  ParameterDefinition.prototype.isRouteId;
3517
+ /** @type {?} */
3518
+ ParameterDefinition.prototype.isArray;
3096
3519
  }
3097
3520
 
3098
3521
  /**
@@ -3197,5 +3620,5 @@ var ParameterType;
3197
3620
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3198
3621
  */
3199
3622
 
3200
- export { ACTIVITY_DATA, AbstractActivity, AbstractInputComponent, AbstractPlaceComponent, ActivityContainerComponent, ActivityOutletComponent, AlertDialogComponent, AngularUiPowerupsModule, Bounds, BusyOverlayComponent, CommandDirective, ConfirmationDialogComponent, DialogInteractionService, Dimension, DisposableComponent, EmptyStateComponent, FocusBindingDirective, INTERACTION_CONTEXT, InteractionContext, InteractionModule, LeavePlaceGuard, NumberInputComponent, ParameterType, PasswordInputComponent, Place, PlaceModule, PlaceOutletComponent, PlaceRouteGuard, PlaceService, Point, QueryParameter, ResizeAwareComponent, RouteId, RouteParameterBindings, RouteParameterSanitiser, SelectInputComponent, StringInputComponent, slideDownAndUpAnimation, CommandDirective as ɵa, FocusBindingDirective as ɵb, DisposableComponent as ɵc, NumberInputComponent as ɵd, AbstractInputComponent as ɵe, StringInputComponent as ɵf, PasswordInputComponent as ɵg, SelectInputComponent as ɵh, PlaceModule as ɵi, EmptyStateComponent as ɵj, BusyOverlayComponent as ɵk, PlaceOutletComponent as ɵl, PlaceService as ɵm, InteractionModule as ɵn, ActivityContainerComponent as ɵo, ConfirmationDialogComponent as ɵp, AbstractActivity as ɵq, ACTIVITY_DATA as ɵr, AlertDialogComponent as ɵt, ActivityOutletComponent as ɵv, DialogInteractionService as ɵw, InteractionContext as ɵx };
3623
+ export { ACTIVITY_DATA, AbstractActivity, AbstractInputComponent, AbstractPlaceComponent, ActivityContainerComponent, ActivityOutletComponent, AlertDialogComponent, AngularUiPowerupsModule, Bounds, BusyOverlayComponent, CommandDirective, ConfirmationDialogComponent, DialogInteractionService, Dimension, DisposableComponent, EmptyStateComponent, FocusBindingDirective, INTERACTION_CONTEXT, InteractionContext, InteractionModule, LeavePlaceGuard, NavComponent, NumberInputComponent, ParameterType, PasswordInputComponent, Place, PlaceModule, PlaceOutletComponent, PlaceRouteGuard, PlaceService, Point, QueryParameter, QueryParameterList, ResizeAwareComponent, RouteId, RouteParameter, RouteParameterBindings, RouteParameterList, RouteParameterSanitiser, Sanitiser, SelectInputComponent, StringInputComponent, slideDownAndUpAnimation, CommandDirective as ɵa, FocusBindingDirective as ɵb, DisposableComponent as ɵc, NumberInputComponent as ɵd, AbstractInputComponent as ɵe, StringInputComponent as ɵf, PasswordInputComponent as ɵg, SelectInputComponent as ɵh, PlaceModule as ɵi, EmptyStateComponent as ɵj, BusyOverlayComponent as ɵk, PlaceOutletComponent as ɵl, PlaceService as ɵm, NavComponent as ɵn, InteractionModule as ɵo, ActivityContainerComponent as ɵp, ConfirmationDialogComponent as ɵq, AbstractActivity as ɵr, ACTIVITY_DATA as ɵs, AlertDialogComponent as ɵu, ActivityOutletComponent as ɵw, DialogInteractionService as ɵx, InteractionContext as ɵy };
3201
3624
  //# sourceMappingURL=coolon-angular-ui-powerups.js.map