@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.
- package/esm2022/lib/directives/rdt-any-route-active.directive.mjs +9 -4
- package/esm2022/lib/rdt-route/rdt-angular-route.mjs +4 -2
- package/esm2022/lib/rdt-route/rdt-route-builder.mjs +8 -2
- package/esm2022/lib/rdt-route/rdt-route.mjs +14 -6
- package/esm2022/lib/services/rdt-router.service.mjs +61 -29
- package/fesm2022/ngrdt-router.mjs +91 -38
- package/fesm2022/ngrdt-router.mjs.map +1 -1
- package/lib/directives/rdt-any-route-active.directive.d.ts +4 -1
- package/lib/rdt-route/rdt-route.d.ts +4 -3
- package/lib/services/rdt-router.service.d.ts +23 -4
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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:
|
|
47
|
-
state:
|
|
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,
|
|
76
|
+
const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, queryParams);
|
|
52
77
|
const win = window.open(pathWithParams, target);
|
|
53
78
|
if (win) {
|
|
54
|
-
win
|
|
79
|
+
win[RDT_STATE_PARAMS_KEY] = stateParams;
|
|
55
80
|
}
|
|
56
81
|
return Promise.resolve(true);
|
|
57
82
|
}
|
|
58
|
-
navigateHome(
|
|
59
|
-
return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/',
|
|
60
|
-
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
|
-
|
|
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(
|
|
98
|
+
return this.navigateHome(extras);
|
|
84
99
|
}
|
|
85
|
-
if (
|
|
86
|
-
if (
|
|
87
|
-
route = route.withQueryParams(
|
|
100
|
+
if (extras) {
|
|
101
|
+
if (extras.query) {
|
|
102
|
+
route = route.withQueryParams(extras.query);
|
|
88
103
|
}
|
|
89
|
-
if (
|
|
90
|
-
route = route.withStateParams(
|
|
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(
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3NlcnZpY2VzL3JkdC1yb3V0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQVV6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLFNBQVMsR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFFbEUsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFMUMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENB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R0FBRyxDQUFDLENBQzFFLENBQUM7SUFDSixDQUFDO3VHQXRKVSxnQkFBZ0I7MkdBQWhCLGdCQUFnQixjQUZmLE1BQU07OzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiwgUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBQYXJhbXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFJkdFN0cmluZ1V0aWxzIH0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuaW1wb3J0IHsgZmlsdGVyLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJkdFJvdXRlIH0gZnJvbSAnLi4vcmR0LXJvdXRlL3JkdC1yb3V0ZSc7XHJcbmltcG9ydCB7IFJkdFJlYWRvbmx5UGFyYW1ldGVycyB9IGZyb20gJy4uL3JkdC1yb3V0ZS91dGlscyc7XHJcbmltcG9ydCB7IFJEVF9ST1VURVNfUFJPVklERVIgfSBmcm9tICcuL3JkdC1yb3V0ZXMudG9rZW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZHROYXZpZ2F0ZVBhcmFtcyB7XHJcbiAgc3RhdGU/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
|
-
|
|
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:
|
|
81
|
-
state:
|
|
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,
|
|
110
|
+
const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, queryParams);
|
|
86
111
|
const win = window.open(pathWithParams, target);
|
|
87
112
|
if (win) {
|
|
88
|
-
win
|
|
113
|
+
win[RDT_STATE_PARAMS_KEY] = stateParams;
|
|
89
114
|
}
|
|
90
115
|
return Promise.resolve(true);
|
|
91
116
|
}
|
|
92
|
-
navigateHome(
|
|
93
|
-
return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/',
|
|
94
|
-
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
|
-
|
|
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(
|
|
132
|
+
return this.navigateHome(extras);
|
|
118
133
|
}
|
|
119
|
-
if (
|
|
120
|
-
if (
|
|
121
|
-
route = route.withQueryParams(
|
|
134
|
+
if (extras) {
|
|
135
|
+
if (extras.query) {
|
|
136
|
+
route = route.withQueryParams(extras.query);
|
|
122
137
|
}
|
|
123
|
-
if (
|
|
124
|
-
route = route.withStateParams(
|
|
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(
|
|
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 =
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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: [{
|