@ngrdt/router 0.0.12 → 0.0.14

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.
@@ -6,6 +6,8 @@ import { filter, take } from 'rxjs';
6
6
  import { RdtReadonlyParameters } from '../rdt-route/utils';
7
7
  import { RDT_ROUTES_PROVIDER } from './rdt-routes.token';
8
8
  import * as i0 from "@angular/core";
9
+ const DEFAULT_TARGET = '_self';
10
+ const RDT_STATE_PARAMS_KEY = 'RdtStateParams';
9
11
  export class RdtRouterService {
10
12
  allRoutes = inject(RDT_ROUTES_PROVIDER, { optional: true });
11
13
  location = inject(Location);
@@ -37,41 +39,54 @@ export class RdtRouterService {
37
39
  this._currentUrl = e.url;
38
40
  });
39
41
  }
40
- navigate(link, params, target = '_self') {
42
+ /**
43
+ * @returns window.history.state extended by state parameters passed from parent window.
44
+ */
45
+ getHistoryState() {
46
+ if ('RdtStateParams' in window &&
47
+ typeof window[RDT_STATE_PARAMS_KEY] === 'object') {
48
+ return { ...window[RDT_STATE_PARAMS_KEY], ...(history.state ?? {}) };
49
+ }
50
+ else {
51
+ return history.state ?? {};
52
+ }
53
+ }
54
+ /**
55
+ * Navigates to the specified route.
56
+ * @param link Route to navigate to.
57
+ * @param params Parameter of route passed as first argument.
58
+ * @param extras Allows you to specify additional parameters for navigation. These extras have higher priority than those defined in the route.
59
+ * @returns Promise that resolves when navigation is complete.
60
+ */
61
+ navigate(link, params, extras) {
41
62
  const url = params
42
63
  ? link.createAbsoluteUrl(params)
43
64
  : link.createAbsoluteUrl();
65
+ const target = extras?.target ?? DEFAULT_TARGET;
66
+ const queryParams = extras?.query ?? link.queryParams;
67
+ const stateParams = extras?.state ?? link.stateParams;
44
68
  if (target === '_self') {
45
69
  return this.router.navigate([url], {
46
- queryParams: link.queryParams,
47
- state: link.stateParams,
70
+ queryParams: queryParams,
71
+ state: stateParams,
72
+ replaceUrl: extras?.replaceUrl,
48
73
  });
49
74
  }
50
75
  const absolutePath = RdtStringUtils.createAbsoluteUrl(url, this.baseHref);
51
- const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, link.queryParams);
76
+ const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, queryParams);
52
77
  const win = window.open(pathWithParams, target);
53
78
  if (win) {
54
- win.RdtStateParams = link.stateParams;
79
+ win[RDT_STATE_PARAMS_KEY] = stateParams;
55
80
  }
56
81
  return Promise.resolve(true);
57
82
  }
58
- navigateHome(params) {
59
- return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/', params?.query ?? {}), {
60
- state: params?.state,
83
+ navigateHome(extras) {
84
+ return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/', extras?.query ?? {}), {
85
+ state: extras?.state,
86
+ replaceUrl: extras?.replaceUrl,
61
87
  });
62
88
  }
63
- parseAbsoluteUrl(url = this.location.path()) {
64
- if (this.allRoutes) {
65
- for (const route of this.allRoutes) {
66
- const params = route.parseAbsoluteUrl(url);
67
- if (params) {
68
- return { route, params };
69
- }
70
- }
71
- }
72
- return null;
73
- }
74
- navigateBack(params) {
89
+ navigateBack(extras) {
75
90
  const parsed = this.parseAbsoluteUrl();
76
91
  if (parsed) {
77
92
  let route = parsed.route.withStaticParams(parsed.params);
@@ -80,23 +95,40 @@ export class RdtRouterService {
80
95
  } while (route && route.entryDisabled);
81
96
  // In case route has no ancestor with allowed entry,
82
97
  if (!route) {
83
- return this.navigateHome(params);
98
+ return this.navigateHome(extras);
84
99
  }
85
- if (params) {
86
- if (params.query) {
87
- route = route.withQueryParams(params.query);
100
+ if (extras) {
101
+ if (extras.query) {
102
+ route = route.withQueryParams(extras.query);
88
103
  }
89
- if (params.state) {
90
- route = route.withStateParams(params.state);
104
+ if (extras.state) {
105
+ route = route.withStateParams(extras.state);
91
106
  }
92
107
  }
93
- return this.navigate(route);
108
+ return this.navigate(route, extras);
94
109
  }
95
110
  else {
96
111
  console.warn(`Cannot go back from ${this.location.path()} because no route matches current url`);
97
112
  return null;
98
113
  }
99
114
  }
115
+ /**
116
+ * This method will try to find matching route for given absolute URL, extract its parameters and return them.
117
+ * If no route matches the URL, it returns null. Parameters are extracted only for the last matching route, not ancestors.
118
+ * @param url Absolute URL to parse (e.g. '/home/details/123?query=abc').
119
+ * @returns Object containing the matching route and its parameters, or null if no route is matching.
120
+ */
121
+ parseAbsoluteUrl(url = this.location.path()) {
122
+ if (this.allRoutes) {
123
+ for (const route of this.allRoutes) {
124
+ const params = route.parseAbsoluteUrl(url);
125
+ if (params) {
126
+ return { route, params };
127
+ }
128
+ }
129
+ }
130
+ return null;
131
+ }
100
132
  extractAllParams(currentRoute) {
101
133
  if (!currentRoute) {
102
134
  const parsed = this.parseAbsoluteUrl();
@@ -115,7 +147,7 @@ export class RdtRouterService {
115
147
  }
116
148
  removeQueryParams(...paramNames) {
117
149
  const regex = new RegExp(`[?&](${paramNames.join('|')})=[^&]*`, 'g');
118
- return history.replaceState(null, '', location.pathname + location.search.replace(regex, '').replace(/^&/, '?'));
150
+ return history.replaceState(history.state, '', location.pathname + location.search.replace(regex, '').replace(/^&/, '?'));
119
151
  }
120
152
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
121
153
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, providedIn: 'root' });
@@ -126,4 +158,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
126
158
  providedIn: 'root',
127
159
  }]
128
160
  }], ctorParameters: () => [] });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3NlcnZpY2VzL3JkdC1yb3V0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQVV6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLFNBQVMsR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFFbEUsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFMUMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVRLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQy9DLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLGFBQWEsQ0FBQyxDQUNiLENBQUM7SUFFdEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEU7UUFDRSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixvRkFBb0YsQ0FDckYsQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUNOLElBQWlCLEVBQ2pCLE1BQW1CLEVBQ25CLFNBQWtELE9BQU87UUFFekQsTUFBTSxHQUFHLEdBQUcsTUFBTTtZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFN0IsSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVzthQUN4QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUUsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUNyRCxZQUFZLEVBQ1osSUFBSSxDQUFDLFdBQVcsQ0FDakIsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUCxHQUFXLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQTBCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQzlCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsRUFDMUQ7WUFDRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUs7U0FDckIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtRQUN6QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUEwQjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxLQUFLLEdBQW9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFFLEdBQUcsQ0FBQztnQkFDRixLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN2QixDQUFDLFFBQVEsS0FBSyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFFdkMsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2pCLEtBQUssR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDakIsS0FBSyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUJBQXVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVDQUF1QyxDQUNuRixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFlBQXVCO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQWU7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQUcsVUFBb0I7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFckUsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUN6QixJQUFJLEVBQ0osRUFBRSxFQUNGLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQzFFLENBQUM7SUFDSixDQUFDO3VHQXRKVSxnQkFBZ0I7MkdBQWhCLGdCQUFnQixjQUZmLE1BQU07OzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiwgUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBQYXJhbXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFJkdFN0cmluZ1V0aWxzIH0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuaW1wb3J0IHsgZmlsdGVyLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJkdFJvdXRlIH0gZnJvbSAnLi4vcmR0LXJvdXRlL3JkdC1yb3V0ZSc7XHJcbmltcG9ydCB7IFJkdFJlYWRvbmx5UGFyYW1ldGVycyB9IGZyb20gJy4uL3JkdC1yb3V0ZS91dGlscyc7XHJcbmltcG9ydCB7IFJEVF9ST1VURVNfUFJPVklERVIgfSBmcm9tICcuL3JkdC1yb3V0ZXMudG9rZW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZHROYXZpZ2F0ZVBhcmFtcyB7XHJcbiAgc3RhdGU/OiBQYXJhbXM7XHJcbiAgcXVlcnk/OiBQYXJhbXM7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZHRSb3V0ZXJTZXJ2aWNlIHtcclxuICByZWFkb25seSBhbGxSb3V0ZXMgPSBpbmplY3QoUkRUX1JPVVRFU19QUk9WSURFUiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvbiA9IGluamVjdChMb2NhdGlvbik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VIcmVmID0gaW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pLmdldEJhc2VIcmVmRnJvbURPTSgpO1xyXG5cclxuICBwcml2YXRlIF9wcmV2aW91c1VybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGdldCBwcmV2aW91c1VybCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2aW91c1VybDtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRVcmw7XHJcbiAgfVxyXG5cclxuICBwYXJzZVByZXZpb3VzVXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzVXJsID8gdGhpcy5wYXJzZUFic29sdXRlVXJsKHRoaXMuX3ByZXZpb3VzVXJsKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwYXJzZUN1cnJlbnRVcmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFVybCA/IHRoaXMucGFyc2VBYnNvbHV0ZVVybCh0aGlzLl9jdXJyZW50VXJsKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWFkb25seSBuYXZpZ2F0aW9uRW5kJCA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgZmlsdGVyKChlKSA9PiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICApIGFzIE9ic2VydmFibGU8TmF2aWdhdGlvbkVuZD47XHJcblxyXG4gIHJlYWRvbmx5IG5leHROYXZpZ2F0aW9uRW5kJCA9IHRoaXMubmF2aWdhdGlvbkVuZCQucGlwZSh0YWtlKDEpKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAodGhpcy5hbGxSb3V0ZXMgPT09IG51bGwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICdBbGwgcm91dGVzIG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgUkRUX1JPVVRFU19QUk9WSURFUiB3aXRoIFJkdFJvdXRlW10uJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmFsbFJvdXRlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmF2aWdhdGlvbkVuZCQuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIHRoaXMuX3ByZXZpb3VzVXJsID0gdGhpcy5fY3VycmVudFVybDtcclxuICAgICAgdGhpcy5fY3VycmVudFVybCA9IGUudXJsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZTxUIGV4dGVuZHMgb2JqZWN0PihcclxuICAgIGxpbms6IFJkdFJvdXRlPFQ+LFxyXG4gICAgcGFyYW1zPzogUGFydGlhbDxUPixcclxuICAgIHRhcmdldDogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnID0gJ19zZWxmJ1xyXG4gICkge1xyXG4gICAgY29uc3QgdXJsID0gcGFyYW1zXHJcbiAgICAgID8gbGluay5jcmVhdGVBYnNvbHV0ZVVybChwYXJhbXMpXHJcbiAgICAgIDogbGluay5jcmVhdGVBYnNvbHV0ZVVybCgpO1xyXG5cclxuICAgIGlmICh0YXJnZXQgPT09ICdfc2VsZicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IGxpbmsucXVlcnlQYXJhbXMsXHJcbiAgICAgICAgc3RhdGU6IGxpbmsuc3RhdGVQYXJhbXMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IFJkdFN0cmluZ1V0aWxzLmNyZWF0ZUFic29sdXRlVXJsKHVybCwgdGhpcy5iYXNlSHJlZik7XHJcbiAgICBjb25zdCBwYXRoV2l0aFBhcmFtcyA9IFJkdFN0cmluZ1V0aWxzLmFwcGVuZFF1ZXJ5UGFyYW1zKFxyXG4gICAgICBhYnNvbHV0ZVBhdGgsXHJcbiAgICAgIGxpbmsucXVlcnlQYXJhbXNcclxuICAgICk7XHJcbiAgICBjb25zdCB3aW4gPSB3aW5kb3cub3BlbihwYXRoV2l0aFBhcmFtcywgdGFyZ2V0KTtcclxuICAgIGlmICh3aW4pIHtcclxuICAgICAgKHdpbiBhcyBhbnkpLlJkdFN0YXRlUGFyYW1zID0gbGluay5zdGF0ZVBhcmFtcztcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZUhvbWUocGFyYW1zPzogUmR0TmF2aWdhdGVQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICBSZHRTdHJpbmdVdGlscy5hcHBlbmRRdWVyeVBhcmFtcygnLycsIHBhcmFtcz8ucXVlcnkgPz8ge30pLFxyXG4gICAgICB7XHJcbiAgICAgICAgc3RhdGU6IHBhcmFtcz8uc3RhdGUsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwYXJzZUFic29sdXRlVXJsKHVybCA9IHRoaXMubG9jYXRpb24ucGF0aCgpKSB7XHJcbiAgICBpZiAodGhpcy5hbGxSb3V0ZXMpIHtcclxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLmFsbFJvdXRlcykge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHJvdXRlLnBhcnNlQWJzb2x1dGVVcmwodXJsKTtcclxuICAgICAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgICAgICByZXR1cm4geyByb3V0ZSwgcGFyYW1zIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlQmFjayhwYXJhbXM/OiBSZHROYXZpZ2F0ZVBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZUFic29sdXRlVXJsKCk7XHJcbiAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgIGxldCByb3V0ZTogUmR0Um91dGUgfCBudWxsID0gcGFyc2VkLnJvdXRlLndpdGhTdGF0aWNQYXJhbXMocGFyc2VkLnBhcmFtcyk7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICByb3V0ZSA9IHJvdXRlLnBhcmVudDtcclxuICAgICAgfSB3aGlsZSAocm91dGUgJiYgcm91dGUuZW50cnlEaXNhYmxlZCk7XHJcblxyXG4gICAgICAvLyBJbiBjYXNlIHJvdXRlIGhhcyBubyBhbmNlc3RvciB3aXRoIGFsbG93ZWQgZW50cnksXHJcbiAgICAgIGlmICghcm91dGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZUhvbWUocGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKHBhcmFtcy5xdWVyeSkge1xyXG4gICAgICAgICAgcm91dGUgPSByb3V0ZS53aXRoUXVlcnlQYXJhbXMocGFyYW1zLnF1ZXJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmFtcy5zdGF0ZSkge1xyXG4gICAgICAgICAgcm91dGUgPSByb3V0ZS53aXRoU3RhdGVQYXJhbXMocGFyYW1zLnN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUocm91dGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBDYW5ub3QgZ28gYmFjayBmcm9tICR7dGhpcy5sb2NhdGlvbi5wYXRoKCl9IGJlY2F1c2Ugbm8gcm91dGUgbWF0Y2hlcyBjdXJyZW50IHVybGBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsUGFyYW1zKGN1cnJlbnRSb3V0ZT86IFJkdFJvdXRlKTogUmR0UmVhZG9ubHlQYXJhbWV0ZXJzIHwgbnVsbCB7XHJcbiAgICBpZiAoIWN1cnJlbnRSb3V0ZSkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlQWJzb2x1dGVVcmwoKTtcclxuICAgICAgaWYgKCFwYXJzZWQpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdXRlIG1hdGNoZXMgY3VycmVudCB1cmwuJyk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZHRSZWFkb25seVBhcmFtZXRlcnMoKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Um91dGUgPSBwYXJzZWQucm91dGU7XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcclxuICAgIHJldHVybiBjdXJyZW50Um91dGUucGFyc2VBYnNvbHV0ZVVybCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgaXNQYXJlbnRPZkN1cnJlbnRMb2NhdGlvbihyb3V0ZTogUmR0Um91dGUpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMucGFyc2VBYnNvbHV0ZVVybCgpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUXVlcnlQYXJhbXMoLi4ucGFyYW1OYW1lczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgWz8mXSgke3BhcmFtTmFtZXMuam9pbignfCcpfSk9W14mXSpgLCAnZycpO1xyXG5cclxuICAgIHJldHVybiBoaXN0b3J5LnJlcGxhY2VTdGF0ZShcclxuICAgICAgbnVsbCxcclxuICAgICAgJycsXHJcbiAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UocmVnZXgsICcnKS5yZXBsYWNlKC9eJi8sICc/JylcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3NlcnZpY2VzL3JkdC1yb3V0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQVN6RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFDL0IsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUs5QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLFNBQVMsR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFFbEUsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFMUMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENB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OUMsT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pDLE9BQU8sWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxLQUFlO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFHLFVBQW9CO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FDekIsT0FBTyxDQUFDLEtBQUssRUFDYixFQUFFLEVBQ0YsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FDMUUsQ0FBQztJQUNKLENBQUM7dUdBdkxVLGdCQUFnQjsyR0FBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uLCBQbGF0Zm9ybUxvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFBhcmFtcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0U3RyaW5nVXRpbHMgfSBmcm9tICdAbmdyZHQvdXRpbHMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIE9ic2VydmFibGUsIHRha2UgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmR0Um91dGUgfSBmcm9tICcuLi9yZHQtcm91dGUvcmR0LXJvdXRlJztcclxuaW1wb3J0IHsgUmR0UmVhZG9ubHlQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vcmR0LXJvdXRlL3V0aWxzJztcclxuaW1wb3J0IHsgUkRUX1JPVVRFU19QUk9WSURFUiB9IGZyb20gJy4vcmR0LXJvdXRlcy50b2tlbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJkdE5hdmlnYXRlRXh0cmFzIHtcclxuICBzdGF0ZT86IFBhcmFtcztcclxuICBxdWVyeT86IFBhcmFtcztcclxuICB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCc7XHJcbiAgcmVwbGFjZVVybD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfVEFSR0VUID0gJ19zZWxmJztcclxuY29uc3QgUkRUX1NUQVRFX1BBUkFNU19LRVkgPSAnUmR0U3RhdGVQYXJhbXMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJkdFJvdXRlclNlcnZpY2Uge1xyXG4gIHJlYWRvbmx5IGFsbFJvdXRlcyA9IGluamVjdChSRFRfUk9VVEVTX1BST1ZJREVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uID0gaW5qZWN0KExvY2F0aW9uKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhyZWYgPSBpbmplY3QoUGxhdGZvcm1Mb2NhdGlvbikuZ2V0QmFzZUhyZWZGcm9tRE9NKCk7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZpb3VzVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jdXJyZW50VXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgZ2V0IHByZXZpb3VzVXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzVXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRVcmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFVybDtcclxuICB9XHJcblxyXG4gIHBhcnNlUHJldmlvdXNVcmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNVcmwgPyB0aGlzLnBhcnNlQWJzb2x1dGVVcmwodGhpcy5fcHJldmlvdXNVcmwpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHBhcnNlQ3VycmVudFVybCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VXJsID8gdGhpcy5wYXJzZUFic29sdXRlVXJsKHRoaXMuX2N1cnJlbnRVcmwpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IG5hdmlnYXRpb25FbmQkID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXHJcbiAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICkgYXMgT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uRW5kPjtcclxuXHJcbiAgcmVhZG9ubHkgbmV4dE5hdmlnYXRpb25FbmQkID0gdGhpcy5uYXZpZ2F0aW9uRW5kJC5waXBlKHRha2UoMSkpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGlmICh0aGlzLmFsbFJvdXRlcyA9PT0gbnVsbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgJ0FsbCByb3V0ZXMgbm90IHByb3ZpZGVkLiBNYWtlIHN1cmUgdG8gcHJvdmlkZSBSRFRfUk9VVEVTX1BST1ZJREVSIHdpdGggUmR0Um91dGVbXS4nXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuYWxsUm91dGVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRW5kJC5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgdGhpcy5fcHJldmlvdXNVcmwgPSB0aGlzLl9jdXJyZW50VXJsO1xyXG4gICAgICB0aGlzLl9jdXJyZW50VXJsID0gZS51cmw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEByZXR1cm5zIHdpbmRvdy5oaXN0b3J5LnN0YXRlIGV4dGVuZGVkIGJ5IHN0YXRlIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gcGFyZW50IHdpbmRvdy5cclxuICAgKi9cclxuICBnZXRIaXN0b3J5U3RhdGUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICdSZHRTdGF0ZVBhcmFtcycgaW4gd2luZG93ICYmXHJcbiAgICAgIHR5cGVvZiB3aW5kb3dbUkRUX1NUQVRFX1BBUkFNU19LRVldID09PSAnb2JqZWN0J1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB7IC4uLndpbmRvd1tSRFRfU1RBVEVfUEFSQU1TX0tFWV0sIC4uLihoaXN0b3J5LnN0YXRlID8/IHt9KSB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGhpc3Rvcnkuc3RhdGUgPz8ge307XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCByb3V0ZS5cclxuICAgKiBAcGFyYW0gbGluayBSb3V0ZSB0byBuYXZpZ2F0ZSB0by5cclxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlciBvZiByb3V0ZSBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQuXHJcbiAgICogQHBhcmFtIGV4dHJhcyBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBuYXZpZ2F0aW9uLiBUaGVzZSBleHRyYXMgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aG9zZSBkZWZpbmVkIGluIHRoZSByb3V0ZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBuYXZpZ2F0aW9uIGlzIGNvbXBsZXRlLlxyXG4gICAqL1xyXG4gIG5hdmlnYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gICAgbGluazogUmR0Um91dGU8VD4sXHJcbiAgICBwYXJhbXM/OiBQYXJ0aWFsPFQ+LFxyXG4gICAgZXh0cmFzPzogUmR0TmF2aWdhdGVFeHRyYXNcclxuICApIHtcclxuICAgIGNvbnN0IHVybCA9IHBhcmFtc1xyXG4gICAgICA/IGxpbmsuY3JlYXRlQWJzb2x1dGVVcmwocGFyYW1zKVxyXG4gICAgICA6IGxpbmsuY3JlYXRlQWJzb2x1dGVVcmwoKTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSBleHRyYXM/LnRhcmdldCA/PyBERUZBVUxUX1RBUkdFVDtcclxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gZXh0cmFzPy5xdWVyeSA/PyBsaW5rLnF1ZXJ5UGFyYW1zO1xyXG4gICAgY29uc3Qgc3RhdGVQYXJhbXMgPSBleHRyYXM/LnN0YXRlID8/IGxpbmsuc3RhdGVQYXJhbXM7XHJcblxyXG4gICAgaWYgKHRhcmdldCA9PT0gJ19zZWxmJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0sIHtcclxuICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgc3RhdGU6IHN0YXRlUGFyYW1zLFxyXG4gICAgICAgIHJlcGxhY2VVcmw6IGV4dHJhcz8ucmVwbGFjZVVybCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gUmR0U3RyaW5nVXRpbHMuY3JlYXRlQWJzb2x1dGVVcmwodXJsLCB0aGlzLmJhc2VIcmVmKTtcclxuICAgIGNvbnN0IHBhdGhXaXRoUGFyYW1zID0gUmR0U3RyaW5nVXRpbHMuYXBwZW5kUXVlcnlQYXJhbXMoXHJcbiAgICAgIGFic29sdXRlUGF0aCxcclxuICAgICAgcXVlcnlQYXJhbXNcclxuICAgICk7XHJcbiAgICBjb25zdCB3aW4gPSB3aW5kb3cub3BlbihwYXRoV2l0aFBhcmFtcywgdGFyZ2V0KTtcclxuICAgIGlmICh3aW4pIHtcclxuICAgICAgKHdpbiBhcyBhbnkpW1JEVF9TVEFURV9QQVJBTVNfS0VZXSA9IHN0YXRlUGFyYW1zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlSG9tZShleHRyYXM/OiBSZHROYXZpZ2F0ZUV4dHJhcykge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXHJcbiAgICAgIFJkdFN0cmluZ1V0aWxzLmFwcGVuZFF1ZXJ5UGFyYW1zKCcvJywgZXh0cmFzPy5xdWVyeSA/PyB7fSksXHJcbiAgICAgIHtcclxuICAgICAgICBzdGF0ZTogZXh0cmFzPy5zdGF0ZSxcclxuICAgICAgICByZXBsYWNlVXJsOiBleHRyYXM/LnJlcGxhY2VVcmwsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZUJhY2soZXh0cmFzPzogUmR0TmF2aWdhdGVFeHRyYXMpIHtcclxuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBYnNvbHV0ZVVybCgpO1xyXG4gICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICBsZXQgcm91dGU6IFJkdFJvdXRlIHwgbnVsbCA9IHBhcnNlZC5yb3V0ZS53aXRoU3RhdGljUGFyYW1zKHBhcnNlZC5wYXJhbXMpO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgcm91dGUgPSByb3V0ZS5wYXJlbnQ7XHJcbiAgICAgIH0gd2hpbGUgKHJvdXRlICYmIHJvdXRlLmVudHJ5RGlzYWJsZWQpO1xyXG5cclxuICAgICAgLy8gSW4gY2FzZSByb3V0ZSBoYXMgbm8gYW5jZXN0b3Igd2l0aCBhbGxvd2VkIGVudHJ5LFxyXG4gICAgICBpZiAoIXJvdXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGVIb21lKGV4dHJhcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4dHJhcykge1xyXG4gICAgICAgIGlmIChleHRyYXMucXVlcnkpIHtcclxuICAgICAgICAgIHJvdXRlID0gcm91dGUud2l0aFF1ZXJ5UGFyYW1zKGV4dHJhcy5xdWVyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHRyYXMuc3RhdGUpIHtcclxuICAgICAgICAgIHJvdXRlID0gcm91dGUud2l0aFN0YXRlUGFyYW1zKGV4dHJhcy5zdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKHJvdXRlLCBleHRyYXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBDYW5ub3QgZ28gYmFjayBmcm9tICR7dGhpcy5sb2NhdGlvbi5wYXRoKCl9IGJlY2F1c2Ugbm8gcm91dGUgbWF0Y2hlcyBjdXJyZW50IHVybGBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRyeSB0byBmaW5kIG1hdGNoaW5nIHJvdXRlIGZvciBnaXZlbiBhYnNvbHV0ZSBVUkwsIGV4dHJhY3QgaXRzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0aGVtLlxyXG4gICAqIElmIG5vIHJvdXRlIG1hdGNoZXMgdGhlIFVSTCwgaXQgcmV0dXJucyBudWxsLiBQYXJhbWV0ZXJzIGFyZSBleHRyYWN0ZWQgb25seSBmb3IgdGhlIGxhc3QgbWF0Y2hpbmcgcm91dGUsIG5vdCBhbmNlc3RvcnMuXHJcbiAgICogQHBhcmFtIHVybCBBYnNvbHV0ZSBVUkwgdG8gcGFyc2UgKGUuZy4gJy9ob21lL2RldGFpbHMvMTIzP3F1ZXJ5PWFiYycpLlxyXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSBtYXRjaGluZyByb3V0ZSBhbmQgaXRzIHBhcmFtZXRlcnMsIG9yIG51bGwgaWYgbm8gcm91dGUgaXMgbWF0Y2hpbmcuXHJcbiAgICovXHJcbiAgcGFyc2VBYnNvbHV0ZVVybCh1cmwgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKSkge1xyXG4gICAgaWYgKHRoaXMuYWxsUm91dGVzKSB7XHJcbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5hbGxSb3V0ZXMpIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSByb3V0ZS5wYXJzZUFic29sdXRlVXJsKHVybCk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgcmV0dXJuIHsgcm91dGUsIHBhcmFtcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsUGFyYW1zKGN1cnJlbnRSb3V0ZT86IFJkdFJvdXRlKTogUmR0UmVhZG9ubHlQYXJhbWV0ZXJzIHwgbnVsbCB7XHJcbiAgICBpZiAoIWN1cnJlbnRSb3V0ZSkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlQWJzb2x1dGVVcmwoKTtcclxuICAgICAgaWYgKCFwYXJzZWQpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdXRlIG1hdGNoZXMgY3VycmVudCB1cmwuJyk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZHRSZWFkb25seVBhcmFtZXRlcnMoKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Um91dGUgPSBwYXJzZWQucm91dGU7XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcclxuICAgIHJldHVybiBjdXJyZW50Um91dGUucGFyc2VBYnNvbHV0ZVVybCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgaXNQYXJlbnRPZkN1cnJlbnRMb2NhdGlvbihyb3V0ZTogUmR0Um91dGUpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMucGFyc2VBYnNvbHV0ZVVybCgpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUXVlcnlQYXJhbXMoLi4ucGFyYW1OYW1lczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgWz8mXSgke3BhcmFtTmFtZXMuam9pbignfCcpfSk9W14mXSpgLCAnZycpO1xyXG5cclxuICAgIHJldHVybiBoaXN0b3J5LnJlcGxhY2VTdGF0ZShcclxuICAgICAgaGlzdG9yeS5zdGF0ZSxcclxuICAgICAgJycsXHJcbiAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UocmVnZXgsICcnKS5yZXBsYWNlKC9eJi8sICc/JylcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -40,6 +40,8 @@ class RdtParameters extends RdtReadonlyParameters {
40
40
 
41
41
  const RDT_ROUTES_PROVIDER = new InjectionToken('RDT_ROUTES_PROVIDER');
42
42
 
43
+ const DEFAULT_TARGET = '_self';
44
+ const RDT_STATE_PARAMS_KEY = 'RdtStateParams';
43
45
  class RdtRouterService {
44
46
  allRoutes = inject(RDT_ROUTES_PROVIDER, { optional: true });
45
47
  location = inject(Location);
@@ -71,41 +73,54 @@ class RdtRouterService {
71
73
  this._currentUrl = e.url;
72
74
  });
73
75
  }
74
- navigate(link, params, target = '_self') {
76
+ /**
77
+ * @returns window.history.state extended by state parameters passed from parent window.
78
+ */
79
+ getHistoryState() {
80
+ if ('RdtStateParams' in window &&
81
+ typeof window[RDT_STATE_PARAMS_KEY] === 'object') {
82
+ return { ...window[RDT_STATE_PARAMS_KEY], ...(history.state ?? {}) };
83
+ }
84
+ else {
85
+ return history.state ?? {};
86
+ }
87
+ }
88
+ /**
89
+ * Navigates to the specified route.
90
+ * @param link Route to navigate to.
91
+ * @param params Parameter of route passed as first argument.
92
+ * @param extras Allows you to specify additional parameters for navigation. These extras have higher priority than those defined in the route.
93
+ * @returns Promise that resolves when navigation is complete.
94
+ */
95
+ navigate(link, params, extras) {
75
96
  const url = params
76
97
  ? link.createAbsoluteUrl(params)
77
98
  : link.createAbsoluteUrl();
99
+ const target = extras?.target ?? DEFAULT_TARGET;
100
+ const queryParams = extras?.query ?? link.queryParams;
101
+ const stateParams = extras?.state ?? link.stateParams;
78
102
  if (target === '_self') {
79
103
  return this.router.navigate([url], {
80
- queryParams: link.queryParams,
81
- state: link.stateParams,
104
+ queryParams: queryParams,
105
+ state: stateParams,
106
+ replaceUrl: extras?.replaceUrl,
82
107
  });
83
108
  }
84
109
  const absolutePath = RdtStringUtils.createAbsoluteUrl(url, this.baseHref);
85
- const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, link.queryParams);
110
+ const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, queryParams);
86
111
  const win = window.open(pathWithParams, target);
87
112
  if (win) {
88
- win.RdtStateParams = link.stateParams;
113
+ win[RDT_STATE_PARAMS_KEY] = stateParams;
89
114
  }
90
115
  return Promise.resolve(true);
91
116
  }
92
- navigateHome(params) {
93
- return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/', params?.query ?? {}), {
94
- state: params?.state,
117
+ navigateHome(extras) {
118
+ return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/', extras?.query ?? {}), {
119
+ state: extras?.state,
120
+ replaceUrl: extras?.replaceUrl,
95
121
  });
96
122
  }
97
- parseAbsoluteUrl(url = this.location.path()) {
98
- if (this.allRoutes) {
99
- for (const route of this.allRoutes) {
100
- const params = route.parseAbsoluteUrl(url);
101
- if (params) {
102
- return { route, params };
103
- }
104
- }
105
- }
106
- return null;
107
- }
108
- navigateBack(params) {
123
+ navigateBack(extras) {
109
124
  const parsed = this.parseAbsoluteUrl();
110
125
  if (parsed) {
111
126
  let route = parsed.route.withStaticParams(parsed.params);
@@ -114,23 +129,40 @@ class RdtRouterService {
114
129
  } while (route && route.entryDisabled);
115
130
  // In case route has no ancestor with allowed entry,
116
131
  if (!route) {
117
- return this.navigateHome(params);
132
+ return this.navigateHome(extras);
118
133
  }
119
- if (params) {
120
- if (params.query) {
121
- route = route.withQueryParams(params.query);
134
+ if (extras) {
135
+ if (extras.query) {
136
+ route = route.withQueryParams(extras.query);
122
137
  }
123
- if (params.state) {
124
- route = route.withStateParams(params.state);
138
+ if (extras.state) {
139
+ route = route.withStateParams(extras.state);
125
140
  }
126
141
  }
127
- return this.navigate(route);
142
+ return this.navigate(route, extras);
128
143
  }
129
144
  else {
130
145
  console.warn(`Cannot go back from ${this.location.path()} because no route matches current url`);
131
146
  return null;
132
147
  }
133
148
  }
149
+ /**
150
+ * This method will try to find matching route for given absolute URL, extract its parameters and return them.
151
+ * If no route matches the URL, it returns null. Parameters are extracted only for the last matching route, not ancestors.
152
+ * @param url Absolute URL to parse (e.g. '/home/details/123?query=abc').
153
+ * @returns Object containing the matching route and its parameters, or null if no route is matching.
154
+ */
155
+ parseAbsoluteUrl(url = this.location.path()) {
156
+ if (this.allRoutes) {
157
+ for (const route of this.allRoutes) {
158
+ const params = route.parseAbsoluteUrl(url);
159
+ if (params) {
160
+ return { route, params };
161
+ }
162
+ }
163
+ }
164
+ return null;
165
+ }
134
166
  extractAllParams(currentRoute) {
135
167
  if (!currentRoute) {
136
168
  const parsed = this.parseAbsoluteUrl();
@@ -149,7 +181,7 @@ class RdtRouterService {
149
181
  }
150
182
  removeQueryParams(...paramNames) {
151
183
  const regex = new RegExp(`[?&](${paramNames.join('|')})=[^&]*`, 'g');
152
- return history.replaceState(null, '', location.pathname + location.search.replace(regex, '').replace(/^&/, '?'));
184
+ return history.replaceState(history.state, '', location.pathname + location.search.replace(regex, '').replace(/^&/, '?'));
153
185
  }
154
186
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
155
187
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, providedIn: 'root' });
@@ -315,7 +347,9 @@ class RdtAngularRoute {
315
347
  return undefined;
316
348
  }
317
349
  const routeSegmentLength = this.route.path.split('/').length;
318
- const regex = new RegExp(`^${this.route.regex.source}$`);
350
+ const regex = this.route.regex
351
+ ? new RegExp(`^${this.route.regex.source}$`)
352
+ : this.route.absoluteRegex;
319
353
  return [
320
354
  (route, segments) => {
321
355
  const path = segments
@@ -361,7 +395,7 @@ function ALWAYS_TRUE() {
361
395
  class RdtRoute {
362
396
  orderedParams = [];
363
397
  _paramMap = {};
364
- _regex;
398
+ _regex = null;
365
399
  paramMappings = [];
366
400
  _staticParams = {};
367
401
  _queryParams = {};
@@ -373,6 +407,7 @@ class RdtRoute {
373
407
  _children = [];
374
408
  _entryDisabled = false;
375
409
  _canBeEntered = ALWAYS_TRUE;
410
+ _built = false;
376
411
  _absoluteRegex;
377
412
  /**
378
413
  * Map of parameters and their types.
@@ -432,7 +467,13 @@ class RdtRoute {
432
467
  if (this._absoluteRegex) {
433
468
  return this._absoluteRegex;
434
469
  }
435
- if (this._parent) {
470
+ if (!this._regex) {
471
+ this._absoluteRegex = new RegExp('^/$');
472
+ if (this._parent) {
473
+ throw new Error('Nested route with empty path is not allowed.');
474
+ }
475
+ }
476
+ else if (this._parent) {
436
477
  // Remove initial ^ and ending $
437
478
  const parent = this._parent.absoluteRegex.source.slice(1, -1);
438
479
  this._absoluteRegex = new RegExp('^' + RdtStringUtils.joinPaths(parent, this._regex.source) + '$');
@@ -569,7 +610,7 @@ class RdtRoute {
569
610
  return path;
570
611
  }
571
612
  toAngularRoute() {
572
- if (!this._regex) {
613
+ if (!this._built) {
573
614
  throw new Error('You have to first call .build() on route!');
574
615
  }
575
616
  return new RdtAngularRoute(this);
@@ -644,9 +685,10 @@ class RdtRoute {
644
685
  clone._entryDisabled = this._entryDisabled;
645
686
  clone.orderedParams = [...this.orderedParams];
646
687
  clone._paramMap = { ...this._paramMap };
647
- clone._regex = new RegExp(this._regex);
688
+ clone._regex = this._regex ? new RegExp(this._regex) : null;
648
689
  clone.paramMappings = this.paramMappings;
649
- clone._staticParams = this._staticParams;
690
+ clone._staticParams = { ...this._staticParams };
691
+ clone._stateParams = { ...this._stateParams };
650
692
  return clone;
651
693
  }
652
694
  }
@@ -734,6 +776,7 @@ class RdtRouteBuilder extends RdtRoute {
734
776
  if (typeof this._path !== 'string') {
735
777
  throw new Error('Please provide path for route. Empty string is acceptable.');
736
778
  }
779
+ this._built = true;
737
780
  this.setRegex();
738
781
  return this;
739
782
  }
@@ -748,7 +791,12 @@ class RdtRouteBuilder extends RdtRoute {
748
791
  }
749
792
  substituted = substituted.replace(`:${p}`, RdtRouteBuilder.groups[type]);
750
793
  });
751
- this._regex = new RegExp(substituted);
794
+ if (substituted === '') {
795
+ this._regex = null;
796
+ }
797
+ else {
798
+ this._regex = new RegExp(substituted);
799
+ }
752
800
  }
753
801
  static groups = {
754
802
  string: '(.+)',
@@ -768,6 +816,9 @@ const EXACT_FALSE_OPTS = {
768
816
  fragment: 'ignored',
769
817
  matrixParams: 'ignored',
770
818
  };
819
+ /**
820
+ * Directive that appends class to host if any of the watched routes is active.
821
+ */
771
822
  class RdtAnyRouteActiveDirective {
772
823
  destroyRef = inject(DestroyRef);
773
824
  router = inject(Router);
@@ -853,7 +904,7 @@ class RdtAnyRouteActiveDirective {
853
904
  }
854
905
  }
855
906
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtAnyRouteActiveDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
856
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtAnyRouteActiveDirective, isStandalone: true, selector: "[rdtAnyRouteActive]", inputs: { anyRouteActive: "anyRouteActive", watchedRoutes: "watchedRoutes", anyRouteActiveOptions: "anyRouteActiveOptions", ariaCurrentWhenActive: "ariaCurrentWhenActive" }, providers: [RouterModule], usesOnChanges: true, ngImport: i0 });
907
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtAnyRouteActiveDirective, isStandalone: true, selector: "[rdtAnyRouteActive]", inputs: { anyRouteActive: ["rdtAnyRouteActive", "anyRouteActive"], watchedRoutes: "watchedRoutes", anyRouteActiveOptions: "anyRouteActiveOptions", ariaCurrentWhenActive: "ariaCurrentWhenActive" }, providers: [RouterModule], usesOnChanges: true, ngImport: i0 });
857
908
  }
858
909
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtAnyRouteActiveDirective, decorators: [{
859
910
  type: Directive,
@@ -863,9 +914,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
863
914
  providers: [RouterModule],
864
915
  }]
865
916
  }], propDecorators: { anyRouteActive: [{
866
- type: Input
917
+ type: Input,
918
+ args: [{ required: true, alias: 'rdtAnyRouteActive' }]
867
919
  }], watchedRoutes: [{
868
- type: Input
920
+ type: Input,
921
+ args: [{ required: true }]
869
922
  }], anyRouteActiveOptions: [{
870
923
  type: Input
871
924
  }], ariaCurrentWhenActive: [{