@ngrdt/router 0.0.17 → 0.0.18
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/README.md +254 -254
- package/fesm2022/ngrdt-router.mjs +90 -23
- package/fesm2022/ngrdt-router.mjs.map +1 -1
- package/index.d.ts +416 -12
- package/package.json +1 -3
- package/esm2022/index.mjs +0 -13
- package/esm2022/lib/directives/rdt-any-route-active.directive.mjs +0 -126
- package/esm2022/lib/directives/rdt-router-link.directive.mjs +0 -69
- package/esm2022/lib/guards/global-route-guard.service.mjs +0 -51
- package/esm2022/lib/guards/prevent-data-loss.guard.mjs +0 -7
- package/esm2022/lib/rdt-route/constants.mjs +0 -5
- package/esm2022/lib/rdt-route/rdt-angular-route.mjs +0 -196
- package/esm2022/lib/rdt-route/rdt-route-builder.mjs +0 -112
- package/esm2022/lib/rdt-route/rdt-route.mjs +0 -308
- package/esm2022/lib/rdt-route/utils.mjs +0 -15
- package/esm2022/lib/services/rdt-cannot-be-entered.token.mjs +0 -7
- package/esm2022/lib/services/rdt-confirm-data-loss.service.mjs +0 -11
- package/esm2022/lib/services/rdt-router.service.mjs +0 -161
- package/esm2022/lib/services/rdt-routes.token.mjs +0 -3
- package/esm2022/ngrdt-router.mjs +0 -5
- package/lib/directives/rdt-any-route-active.directive.d.ts +0 -34
- package/lib/directives/rdt-router-link.directive.d.ts +0 -23
- package/lib/guards/global-route-guard.service.d.ts +0 -10
- package/lib/guards/prevent-data-loss.guard.d.ts +0 -2
- package/lib/rdt-route/constants.d.ts +0 -3
- package/lib/rdt-route/rdt-angular-route.d.ts +0 -29
- package/lib/rdt-route/rdt-route-builder.d.ts +0 -46
- package/lib/rdt-route/rdt-route.d.ts +0 -138
- package/lib/rdt-route/utils.d.ts +0 -21
- package/lib/services/rdt-cannot-be-entered.token.d.ts +0 -7
- package/lib/services/rdt-confirm-data-loss.service.d.ts +0 -9
- package/lib/services/rdt-router.service.d.ts +0 -61
- package/lib/services/rdt-routes.token.d.ts +0 -3
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import { runInInjectionContext } from '@angular/core';
|
|
2
|
-
import { RdtStringUtils } from '@ngrdt/utils';
|
|
3
|
-
import { RdtAngularRoute } from './rdt-angular-route';
|
|
4
|
-
import { RdtReadonlyParameters } from './utils';
|
|
5
|
-
export function ALWAYS_TRUE() {
|
|
6
|
-
return true;
|
|
7
|
-
}
|
|
8
|
-
export class RdtRoute {
|
|
9
|
-
orderedParams = [];
|
|
10
|
-
_paramMap = {};
|
|
11
|
-
_regex = null;
|
|
12
|
-
paramMappings = [];
|
|
13
|
-
_staticParams = {};
|
|
14
|
-
_queryParams = {};
|
|
15
|
-
_stateParams = {};
|
|
16
|
-
_data = {};
|
|
17
|
-
_name;
|
|
18
|
-
_path;
|
|
19
|
-
_parent = null;
|
|
20
|
-
_children = [];
|
|
21
|
-
_entryDisabled = false;
|
|
22
|
-
_canBeEntered = ALWAYS_TRUE;
|
|
23
|
-
_built = false;
|
|
24
|
-
_absoluteRegex;
|
|
25
|
-
/**
|
|
26
|
-
* Map of parameters and their types.
|
|
27
|
-
*/
|
|
28
|
-
get paramMap() {
|
|
29
|
-
return this._paramMap;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Human readable name for display in breadcrumbs, title, etc.
|
|
33
|
-
*/
|
|
34
|
-
get name() {
|
|
35
|
-
return this._name;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Path of the route relative to parent route.
|
|
39
|
-
*/
|
|
40
|
-
get path() {
|
|
41
|
-
return this._path;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Parent route.
|
|
45
|
-
*/
|
|
46
|
-
get parent() {
|
|
47
|
-
return this._parent;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Child routes.
|
|
51
|
-
*/
|
|
52
|
-
get children() {
|
|
53
|
-
return this._children;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Absolute path of parent route or '/' if there is no parent.
|
|
57
|
-
* Hostname excluded.
|
|
58
|
-
*/
|
|
59
|
-
get basePath() {
|
|
60
|
-
return this._parent ? this._parent.absolutePath : '/';
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Absolute path of the route. Hostname excluded.
|
|
64
|
-
*/
|
|
65
|
-
get absolutePath() {
|
|
66
|
-
return RdtStringUtils.joinPaths(this.basePath, this._path);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Regular expression route path relative to parent route.
|
|
70
|
-
* Hostname excluded.
|
|
71
|
-
*/
|
|
72
|
-
get regex() {
|
|
73
|
-
return this._regex;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Regular expression to match only this route (not children
|
|
77
|
-
* or parent routes). Hostname excluded.
|
|
78
|
-
*/
|
|
79
|
-
get absoluteRegex() {
|
|
80
|
-
if (this._absoluteRegex) {
|
|
81
|
-
return this._absoluteRegex;
|
|
82
|
-
}
|
|
83
|
-
if (!this._regex) {
|
|
84
|
-
this._absoluteRegex = new RegExp('^/$');
|
|
85
|
-
if (this._parent) {
|
|
86
|
-
throw new Error('Nested route with empty path is not allowed.');
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else if (this._parent) {
|
|
90
|
-
// Remove initial ^ and ending $
|
|
91
|
-
const parent = this._parent.absoluteRegex.source.slice(1, -1);
|
|
92
|
-
this._absoluteRegex = new RegExp('^' + RdtStringUtils.joinPaths(parent, this._regex.source) + '$');
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this._absoluteRegex = new RegExp('^' + RdtStringUtils.joinPaths('/', this._regex.source) + '$');
|
|
96
|
-
}
|
|
97
|
-
return this._absoluteRegex;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Denotes disabled route entry.
|
|
101
|
-
* If true, route should have no NgModule
|
|
102
|
-
* or component and only serves as virtual module
|
|
103
|
-
* for breadcrumb.
|
|
104
|
-
*/
|
|
105
|
-
get entryDisabled() {
|
|
106
|
-
return this._entryDisabled;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Statically set state params used when navigating to this instance.
|
|
110
|
-
*/
|
|
111
|
-
get stateParams() {
|
|
112
|
-
return this._stateParams;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Statically set query params used when navigating to this instance.
|
|
116
|
-
*/
|
|
117
|
-
get queryParams() {
|
|
118
|
-
return this._queryParams;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* @param url Absolute path to test.
|
|
122
|
-
* @returns True if url matches this route.
|
|
123
|
-
*/
|
|
124
|
-
testUrl(url) {
|
|
125
|
-
return this.absoluteRegex.test(url);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Statically set parameters used when navigating to this instance.
|
|
129
|
-
*/
|
|
130
|
-
get staticParams() {
|
|
131
|
-
return { ...this._staticParams };
|
|
132
|
-
}
|
|
133
|
-
get hasCanBeEnteredGuard() {
|
|
134
|
-
return this._canBeEntered !== ALWAYS_TRUE;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Data that is passed to Angular route definition.
|
|
138
|
-
*/
|
|
139
|
-
get data() {
|
|
140
|
-
return this._data;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Meta guard that is used by [rdtRouterLink] and RdtMenu
|
|
144
|
-
* to determine if route can be entered.
|
|
145
|
-
* @param injector Environment or custom injector.
|
|
146
|
-
* @returns True if route can be entered.
|
|
147
|
-
*/
|
|
148
|
-
canBeEntered(injector) {
|
|
149
|
-
return injector
|
|
150
|
-
? runInInjectionContext(injector, this._canBeEntered)
|
|
151
|
-
: this._canBeEntered();
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Extracts url parameters from absolute path for this path and each parent.
|
|
155
|
-
*/
|
|
156
|
-
parseAbsoluteUrl(url) {
|
|
157
|
-
const reg = this.absoluteRegex;
|
|
158
|
-
if (!reg.test(url)) {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
const matches = reg.exec(url);
|
|
162
|
-
if (matches) {
|
|
163
|
-
const values = matches.slice(1).reverse();
|
|
164
|
-
const obj = this.fill(values);
|
|
165
|
-
if (obj) {
|
|
166
|
-
return new RdtReadonlyParameters(obj);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
fill(values, res = {}) {
|
|
177
|
-
const params = {};
|
|
178
|
-
const reversedParams = this.orderedParams.slice().reverse();
|
|
179
|
-
for (let i = 0; i < reversedParams.length && i < values.length; i++) {
|
|
180
|
-
const key = reversedParams[i];
|
|
181
|
-
const mappedKey = this.paramMappings.find((m) => m.urlName === key)?.tableName ?? key;
|
|
182
|
-
let val = values[i];
|
|
183
|
-
if (this._paramMap[key] === 'number') {
|
|
184
|
-
val = parseInt(val);
|
|
185
|
-
}
|
|
186
|
-
params[mappedKey] = val;
|
|
187
|
-
}
|
|
188
|
-
res[this.absolutePath] = params;
|
|
189
|
-
if (values.length > reversedParams.length && this._parent) {
|
|
190
|
-
this._parent.fill(values.slice(reversedParams.length), res);
|
|
191
|
-
}
|
|
192
|
-
return res;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Fills parameters in path with values from paramMap.
|
|
196
|
-
* Use withStaticParams() beforehand in case parent paths contain parameters.
|
|
197
|
-
* @param paramMap Must contain all parameters for this route.
|
|
198
|
-
* @returns Absolute path.
|
|
199
|
-
*/
|
|
200
|
-
createAbsoluteUrl(paramMap = this._staticParams) {
|
|
201
|
-
if (!this._parent) {
|
|
202
|
-
return this.createUrl(this.absolutePath, paramMap);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
return RdtStringUtils.joinPaths(this._parent.createAbsoluteUrl(), this.createRelativeUrl(paramMap));
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
createRelativeUrl(paramMap = this._staticParams) {
|
|
209
|
-
return this.createUrl(this.path, paramMap);
|
|
210
|
-
}
|
|
211
|
-
createUrl(path, paramMap) {
|
|
212
|
-
const paramNames = Object.keys(this._paramMap);
|
|
213
|
-
paramNames.sort((a, b) => b.length - a.length);
|
|
214
|
-
const extendedParamMap = { ...paramMap };
|
|
215
|
-
this.paramMappings.forEach((mapping) => {
|
|
216
|
-
if (mapping.tableName in paramMap) {
|
|
217
|
-
extendedParamMap[mapping.urlName] = paramMap[mapping.tableName];
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
paramNames.forEach((param) => {
|
|
221
|
-
path = path.replace(`:${param}`, `${extendedParamMap[param]}`);
|
|
222
|
-
});
|
|
223
|
-
return path;
|
|
224
|
-
}
|
|
225
|
-
toAngularRoute() {
|
|
226
|
-
if (!this._built) {
|
|
227
|
-
throw new Error('You have to first call .build() on route!');
|
|
228
|
-
}
|
|
229
|
-
return new RdtAngularRoute(this);
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Provides static mapping for parameter names tableName -> urlName.
|
|
233
|
-
* Returns new instance of RdtRoute<T> that is clone of
|
|
234
|
-
* this route and its parents (NOT children).
|
|
235
|
-
* @returns Clone of this route with mapped parameter names.
|
|
236
|
-
*/
|
|
237
|
-
withParamMappings(mappings) {
|
|
238
|
-
const clone = this.clone();
|
|
239
|
-
clone.paramMappings = mappings;
|
|
240
|
-
return clone;
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Sets parameters for itself or parents.
|
|
244
|
-
* Returns new instance of RdtRoute<T> that is clone of
|
|
245
|
-
* this route and its parents (NOT children).
|
|
246
|
-
* @returns Clone of this route with static parameters set.
|
|
247
|
-
*/
|
|
248
|
-
withStaticParams(param1, param2) {
|
|
249
|
-
const clone = this.clone();
|
|
250
|
-
if (param2) {
|
|
251
|
-
const routeAbsPath = param1.absolutePath;
|
|
252
|
-
let current = clone;
|
|
253
|
-
while (current) {
|
|
254
|
-
if (current.absolutePath === routeAbsPath) {
|
|
255
|
-
current._staticParams = param2;
|
|
256
|
-
}
|
|
257
|
-
current = current._parent;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
clone._staticParams = param1;
|
|
262
|
-
}
|
|
263
|
-
return clone;
|
|
264
|
-
}
|
|
265
|
-
withQueryParams(queryParams) {
|
|
266
|
-
const clone = this.clone();
|
|
267
|
-
clone._queryParams = { ...queryParams };
|
|
268
|
-
return clone;
|
|
269
|
-
}
|
|
270
|
-
withStateParams(stateParams) {
|
|
271
|
-
const clone = this.clone();
|
|
272
|
-
clone._stateParams = { ...stateParams };
|
|
273
|
-
return clone;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* @returns Partial of object that only contains properties necessary to create this route.
|
|
277
|
-
*/
|
|
278
|
-
extractRouteParams(row) {
|
|
279
|
-
const res = {};
|
|
280
|
-
this.orderedParams.forEach((param) => {
|
|
281
|
-
const mapping = this.paramMappings.find((m) => m.urlName === param);
|
|
282
|
-
const mappedParam = (mapping?.tableName ?? param);
|
|
283
|
-
if (mappedParam in row) {
|
|
284
|
-
res[mappedParam] = row[mappedParam];
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
return res;
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* @returns New instance of RdtRoute<T> that is clone of
|
|
291
|
-
* this route and its parents (NOT children).
|
|
292
|
-
*/
|
|
293
|
-
clone() {
|
|
294
|
-
const clone = new RdtRoute();
|
|
295
|
-
clone._name = this._name;
|
|
296
|
-
clone._parent = this._parent?.clone() ?? null;
|
|
297
|
-
clone._path = this.path;
|
|
298
|
-
clone._entryDisabled = this._entryDisabled;
|
|
299
|
-
clone.orderedParams = [...this.orderedParams];
|
|
300
|
-
clone._paramMap = { ...this._paramMap };
|
|
301
|
-
clone._regex = this._regex ? new RegExp(this._regex) : null;
|
|
302
|
-
clone.paramMappings = this.paramMappings;
|
|
303
|
-
clone._staticParams = { ...this._staticParams };
|
|
304
|
-
clone._stateParams = { ...this._stateParams };
|
|
305
|
-
return clone;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3JkdC1yb3V0ZS9yZHQtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBOEIscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFNUUsTUFBTSxVQUFVLFdBQVc7SUFDekIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDVCxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQzdCLFNBQVMsR0FBb0IsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sR0FBa0IsSUFBSSxDQUFDO0lBQzdCLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBQ25DLGFBQWEsR0FBZSxFQUFFLENBQUM7SUFDL0IsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixZQUFZLEdBQVcsRUFBRSxDQUFDO0lBQzFCLEtBQUssR0FBUyxFQUFFLENBQUM7SUFFakIsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFVO0lBQ2YsT0FBTyxHQUFvQixJQUFJLENBQUM7SUFDaEMsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGFBQWEsR0FBa0IsV0FBVyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFakIsY0FBYyxDQUFVO0lBRWhDOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUss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Q0FBQyxjQUFjLENBQUM7UUFDM0MsS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxLQUFLLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEQsS0FBSyxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhLCBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBSZHRTdHJpbmdVdGlscyB9IGZyb20gJ0BuZ3JkdC91dGlscyc7XHJcbmltcG9ydCB7IFJkdEFuZ3VsYXJSb3V0ZSB9IGZyb20gJy4vcmR0LWFuZ3VsYXItcm91dGUnO1xyXG5pbXBvcnQgeyBQYXJhbU1hcHBpbmcsIFBhcmFtVHlwZU1hcCwgUmR0UmVhZG9ubHlQYXJhbWV0ZXJzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQUxXQVlTX1RSVUUoKSB7XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZHRSb3V0ZTxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PiB7XHJcbiAgcHJvdGVjdGVkIG9yZGVyZWRQYXJhbXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJvdGVjdGVkIF9wYXJhbU1hcDogUGFyYW1UeXBlTWFwPFQ+ID0ge307XHJcbiAgcHJvdGVjdGVkIF9yZWdleDogUmVnRXhwIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIHBhcmFtTWFwcGluZ3M6IFBhcmFtTWFwcGluZ1tdID0gW107XHJcbiAgcHJvdGVjdGVkIF9zdGF0aWNQYXJhbXM6IFBhcnRpYWw8VD4gPSB7fTtcclxuICBwcm90ZWN0ZWQgX3F1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7fTtcclxuICBwcm90ZWN0ZWQgX3N0YXRlUGFyYW1zOiBQYXJhbXMgPSB7fTtcclxuICBwcm90ZWN0ZWQgX2RhdGE6IERhdGEgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIF9uYW1lITogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfcGF0aCE6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX3BhcmVudDogUmR0Um91dGUgfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX2NoaWxkcmVuOiBSZHRSb3V0ZVtdID0gW107XHJcbiAgcHJvdGVjdGVkIF9lbnRyeURpc2FibGVkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9jYW5CZUVudGVyZWQ6ICgpID0+IGJvb2xlYW4gPSBBTFdBWVNfVFJVRTtcclxuICBwcm90ZWN0ZWQgX2J1aWx0ID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2Fic29sdXRlUmVnZXg/OiBSZWdFeHA7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcCBvZiBwYXJhbWV0ZXJzIGFuZCB0aGVpciB0eXBlcy5cclxuICAgKi9cclxuICBnZXQgcGFyYW1NYXAoKTogUmVhZG9ubHk8UGFyYW1UeXBlTWFwPFQ+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1NYXA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIdW1hbiByZWFkYWJsZSBuYW1lIGZvciBkaXNwbGF5IGluIGJyZWFkY3J1bWJzLCB0aXRsZSwgZXRjLlxyXG4gICAqL1xyXG4gIGdldCBuYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIG9mIHRoZSByb3V0ZSByZWxhdGl2ZSB0byBwYXJlbnQgcm91dGUuXHJcbiAgICovXHJcbiAgZ2V0IHBhdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcmVudCByb3V0ZS5cclxuICAgKi9cclxuICBnZXQgcGFyZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoaWxkIHJvdXRlcy5cclxuICAgKi9cclxuICBnZXQgY2hpbGRyZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBYnNvbHV0ZSBwYXRoIG9mIHBhcmVudCByb3V0ZSBvciAnLycgaWYgdGhlcmUgaXMgbm8gcGFyZW50LlxyXG4gICAqIEhvc3RuYW1lIGV4Y2x1ZGVkLlxyXG4gICAqL1xyXG4gIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5hYnNvbHV0ZVBhdGggOiAnLyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSByb3V0ZS4gSG9zdG5hbWUgZXhjbHVkZWQuXHJcbiAgICovXHJcbiAgZ2V0IGFic29sdXRlUGF0aCgpIHtcclxuICAgIHJldHVybiBSZHRTdHJpbmdVdGlscy5qb2luUGF0aHModGhpcy5iYXNlUGF0aCwgdGhpcy5fcGF0aCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gcm91dGUgcGF0aCByZWxhdGl2ZSB0byBwYXJlbnQgcm91dGUuXHJcbiAgICogSG9zdG5hbWUgZXhjbHVkZWQuXHJcbiAgICovXHJcbiAgZ2V0IHJlZ2V4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2V4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIG9ubHkgdGhpcyByb3V0ZSAobm90IGNoaWxkcmVuXHJcbiAgICogb3IgcGFyZW50IHJvdXRlcykuIEhvc3RuYW1lIGV4Y2x1ZGVkLlxyXG4gICAqL1xyXG4gIGdldCBhYnNvbHV0ZVJlZ2V4KCk6IFJlZ0V4cCB7XHJcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVSZWdleCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYWJzb2x1dGVSZWdleDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX3JlZ2V4KSB7XHJcbiAgICAgIHRoaXMuX2Fic29sdXRlUmVnZXggPSBuZXcgUmVnRXhwKCdeLyQnKTtcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIHJvdXRlIHdpdGggZW1wdHkgcGF0aCBpcyBub3QgYWxsb3dlZC4nKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgLy8gUmVtb3ZlIGluaXRpYWwgXiBhbmQgZW5kaW5nICRcclxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50LmFic29sdXRlUmVnZXguc291cmNlLnNsaWNlKDEsIC0xKTtcclxuICAgICAgdGhpcy5fYWJzb2x1dGVSZWdleCA9IG5ldyBSZWdFeHAoXHJcbiAgICAgICAgJ14nICsgUmR0U3RyaW5nVXRpbHMuam9pblBhdGhzKHBhcmVudCwgdGhpcy5fcmVnZXguc291cmNlKSArICckJ1xyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYWJzb2x1dGVSZWdleCA9IG5ldyBSZWdFeHAoXHJcbiAgICAgICAgJ14nICsgUmR0U3RyaW5nVXRpbHMuam9pblBhdGhzKCcvJywgdGhpcy5fcmVnZXguc291cmNlKSArICckJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlUmVnZXg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZW5vdGVzIGRpc2FibGVkIHJvdXRlIGVudHJ5LlxyXG4gICAqIElmIHRydWUsIHJvdXRlIHNob3VsZCBoYXZlIG5vIE5nTW9kdWxlXHJcbiAgICogb3IgY29tcG9uZW50IGFuZCBvbmx5IHNlcnZlcyBhcyB2aXJ0dWFsIG1vZHVsZVxyXG4gICAqIGZvciBicmVhZGNydW1iLlxyXG4gICAqL1xyXG4gIGdldCBlbnRyeURpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VudHJ5RGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWNhbGx5IHNldCBzdGF0ZSBwYXJhbXMgdXNlZCB3aGVuIG5hdmlnYXRpbmcgdG8gdGhpcyBpbnN0YW5jZS5cclxuICAgKi9cclxuICBnZXQgc3RhdGVQYXJhbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWNhbGx5IHNldCBxdWVyeSBwYXJhbXMgdXNlZCB3aGVuIG5hdmlnYXRpbmcgdG8gdGhpcyBpbnN0YW5jZS5cclxuICAgKi9cclxuICBnZXQgcXVlcnlQYXJhbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gdXJsIEFic29sdXRlIHBhdGggdG8gdGVzdC5cclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHVybCBtYXRjaGVzIHRoaXMgcm91dGUuXHJcbiAgICovXHJcbiAgdGVzdFVybCh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVSZWdleC50ZXN0KHVybCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWNhbGx5IHNldCBwYXJhbWV0ZXJzIHVzZWQgd2hlbiBuYXZpZ2F0aW5nIHRvIHRoaXMgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgZ2V0IHN0YXRpY1BhcmFtcygpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuX3N0YXRpY1BhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0NhbkJlRW50ZXJlZEd1YXJkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhbkJlRW50ZXJlZCAhPT0gQUxXQVlTX1RSVUU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHRoYXQgaXMgcGFzc2VkIHRvIEFuZ3VsYXIgcm91dGUgZGVmaW5pdGlvbi5cclxuICAgKi9cclxuICBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0YSBndWFyZCB0aGF0IGlzIHVzZWQgYnkgW3JkdFJvdXRlckxpbmtdIGFuZCBSZHRNZW51XHJcbiAgICogdG8gZGV0ZXJtaW5lIGlmIHJvdXRlIGNhbiBiZSBlbnRlcmVkLlxyXG4gICAqIEBwYXJhbSBpbmplY3RvciBFbnZpcm9ubWVudCBvciBjdXN0b20gaW5qZWN0b3IuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiByb3V0ZSBjYW4gYmUgZW50ZXJlZC5cclxuICAgKi9cclxuICBjYW5CZUVudGVyZWQoaW5qZWN0b3I/OiBJbmplY3Rvcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGluamVjdG9yXHJcbiAgICAgID8gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCB0aGlzLl9jYW5CZUVudGVyZWQpXHJcbiAgICAgIDogdGhpcy5fY2FuQmVFbnRlcmVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWN0cyB1cmwgcGFyYW1ldGVycyBmcm9tIGFic29sdXRlIHBhdGggZm9yIHRoaXMgcGF0aCBhbmQgZWFjaCBwYXJlbnQuXHJcbiAgICovXHJcbiAgcGFyc2VBYnNvbHV0ZVVybCh1cmw6IHN0cmluZyk6IFJkdFJlYWRvbmx5UGFyYW1ldGVycyB8IG51bGwge1xyXG4gICAgY29uc3QgcmVnID0gdGhpcy5hYnNvbHV0ZVJlZ2V4O1xyXG4gICAgaWYgKCFyZWcudGVzdCh1cmwpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hlcyA9IHJlZy5leGVjKHVybCk7XHJcbiAgICBpZiAobWF0Y2hlcykge1xyXG4gICAgICBjb25zdCB2YWx1ZXMgPSBtYXRjaGVzLnNsaWNlKDEpLnJldmVyc2UoKTtcclxuICAgICAgY29uc3Qgb2JqID0gdGhpcy5maWxsKHZhbHVlcyk7XHJcbiAgICAgIGlmIChvYmopIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJkdFJlYWRvbmx5UGFyYW1ldGVycyhvYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsbCh2YWx1ZXM6IHN0cmluZ1tdLCByZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSkge1xyXG4gICAgY29uc3QgcGFyYW1zOiB7IFtrZXkgaW4ga2V5b2YgVF0/OiBzdHJpbmcgfCBudW1iZXIgfSA9IHt9O1xyXG4gICAgY29uc3QgcmV2ZXJzZWRQYXJhbXMgPSB0aGlzLm9yZGVyZWRQYXJhbXMuc2xpY2UoKS5yZXZlcnNlKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldmVyc2VkUGFyYW1zLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IHJldmVyc2VkUGFyYW1zW2ldIGFzIGtleW9mIFQ7XHJcbiAgICAgIGNvbnN0IG1hcHBlZEtleSA9XHJcbiAgICAgICAgdGhpcy5wYXJhbU1hcHBpbmdzLmZpbmQoKG0pID0+IG0udXJsTmFtZSA9PT0ga2V5KT8udGFibGVOYW1lID8/IGtleTtcclxuICAgICAgbGV0IHZhbDogc3RyaW5nIHwgbnVtYmVyID0gdmFsdWVzW2ldO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhcmFtTWFwW2tleV0gPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgdmFsID0gcGFyc2VJbnQodmFsKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXNbbWFwcGVkS2V5IGFzIGtleW9mIFRdID0gdmFsO1xyXG4gICAgfVxyXG4gICAgcmVzW3RoaXMuYWJzb2x1dGVQYXRoXSA9IHBhcmFtcztcclxuXHJcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IHJldmVyc2VkUGFyYW1zLmxlbmd0aCAmJiB0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgdGhpcy5fcGFyZW50LmZpbGwodmFsdWVzLnNsaWNlKHJldmVyc2VkUGFyYW1zLmxlbmd0aCksIHJlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsbHMgcGFyYW1ldGVycyBpbiBwYXRoIHdpdGggdmFsdWVzIGZyb20gcGFyYW1NYXAuXHJcbiAgICogVXNlIHdpdGhTdGF0aWNQYXJhbXMoKSBiZWZvcmVoYW5kIGluIGNhc2UgcGFyZW50IHBhdGhzIGNvbnRhaW4gcGFyYW1ldGVycy5cclxuICAgKiBAcGFyYW0gcGFyYW1NYXAgTXVzdCBjb250YWluIGFsbCBwYXJhbWV0ZXJzIGZvciB0aGlzIHJvdXRlLlxyXG4gICAqIEByZXR1cm5zIEFic29sdXRlIHBhdGguXHJcbiAgICovXHJcbiAgY3JlYXRlQWJzb2x1dGVVcmwocGFyYW1NYXA6IFBhcnRpYWw8VD4gPSB0aGlzLl9zdGF0aWNQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVXJsKHRoaXMuYWJzb2x1dGVQYXRoLCBwYXJhbU1hcCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUmR0U3RyaW5nVXRpbHMuam9pblBhdGhzKFxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5jcmVhdGVBYnNvbHV0ZVVybCgpLFxyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVsYXRpdmVVcmwocGFyYW1NYXApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVSZWxhdGl2ZVVybChwYXJhbU1hcDogUGFydGlhbDxUPiA9IHRoaXMuX3N0YXRpY1BhcmFtcykge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVXJsKHRoaXMucGF0aCwgcGFyYW1NYXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcmwocGF0aDogc3RyaW5nLCBwYXJhbU1hcDogUGFydGlhbDxUPikge1xyXG4gICAgY29uc3QgcGFyYW1OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuX3BhcmFtTWFwKTtcclxuICAgIHBhcmFtTmFtZXMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XHJcbiAgICBjb25zdCBleHRlbmRlZFBhcmFtTWFwOiBhbnkgPSB7IC4uLnBhcmFtTWFwIH07XHJcblxyXG4gICAgdGhpcy5wYXJhbU1hcHBpbmdzLmZvckVhY2goKG1hcHBpbmcpID0+IHtcclxuICAgICAgaWYgKG1hcHBpbmcudGFibGVOYW1lIGluIHBhcmFtTWFwKSB7XHJcbiAgICAgICAgZXh0ZW5kZWRQYXJhbU1hcFttYXBwaW5nLnVybE5hbWVdID0gKHBhcmFtTWFwIGFzIGFueSlbXHJcbiAgICAgICAgICBtYXBwaW5nLnRhYmxlTmFtZVxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHBhcmFtTmFtZXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShgOiR7cGFyYW19YCwgYCR7ZXh0ZW5kZWRQYXJhbU1hcFtwYXJhbSBhcyBrZXlvZiBUXX1gKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuXHJcbiAgdG9Bbmd1bGFyUm91dGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2J1aWx0KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gZmlyc3QgY2FsbCAuYnVpbGQoKSBvbiByb3V0ZSEnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmR0QW5ndWxhclJvdXRlPFQ+KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvdmlkZXMgc3RhdGljIG1hcHBpbmcgZm9yIHBhcmFtZXRlciBuYW1lcyB0YWJsZU5hbWUgLT4gdXJsTmFtZS5cclxuICAgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBSZHRSb3V0ZTxUPiB0aGF0IGlzIGNsb25lIG9mXHJcbiAgICogdGhpcyByb3V0ZSBhbmQgaXRzIHBhcmVudHMgKE5PVCBjaGlsZHJlbikuXHJcbiAgICogQHJldHVybnMgQ2xvbmUgb2YgdGhpcyByb3V0ZSB3aXRoIG1hcHBlZCBwYXJhbWV0ZXIgbmFtZXMuXHJcbiAgICovXHJcbiAgd2l0aFBhcmFtTWFwcGluZ3MobWFwcGluZ3M6IFBhcmFtTWFwcGluZ1tdKSB7XHJcbiAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcclxuICAgIGNsb25lLnBhcmFtTWFwcGluZ3MgPSBtYXBwaW5ncztcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoaXMgcm91dGUuXHJcbiAgICogQHBhcmFtIHBhcmFtcyBTdGF0aWMgcGFyYW1ldGVycyBmb3IgdGhpcyByb3V0ZS5cclxuICAgKiBAcmV0dXJucyBDbG9uZSBvZiB0aGlzIHdpdGggc3RhdGljIHBhcmFtZXRlcnMgc2V0LlxyXG4gICAqL1xyXG4gIHdpdGhTdGF0aWNQYXJhbXMocGFyYW1zOiBUKTogUmR0Um91dGU8VD47XHJcbiAgd2l0aFN0YXRpY1BhcmFtczxUMiBleHRlbmRzIG9iamVjdD4oXHJcbiAgICByb3V0ZTogUmR0Um91dGU8VDI+LFxyXG4gICAgcGFyYW1zOiBUMlxyXG4gICk6IFJkdFJvdXRlPFQ+O1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHBhcmFtZXRlcnMgZm9yIGl0c2VsZiBvciBwYXJlbnRzLlxyXG4gICAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIFJkdFJvdXRlPFQ+IHRoYXQgaXMgY2xvbmUgb2ZcclxuICAgKiB0aGlzIHJvdXRlIGFuZCBpdHMgcGFyZW50cyAoTk9UIGNoaWxkcmVuKS5cclxuICAgKiBAcmV0dXJucyBDbG9uZSBvZiB0aGlzIHJvdXRlIHdpdGggc3RhdGljIHBhcmFtZXRlcnMgc2V0LlxyXG4gICAqL1xyXG4gIHdpdGhTdGF0aWNQYXJhbXM8VDIgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtMTogUmR0Um91dGU8VDI+IHwgVCwgcGFyYW0yPzogVDIpIHtcclxuICAgIGNvbnN0IGNsb25lID0gdGhpcy5jbG9uZSgpO1xyXG5cclxuICAgIGlmIChwYXJhbTIpIHtcclxuICAgICAgY29uc3Qgcm91dGVBYnNQYXRoID0gKHBhcmFtMSBhcyBSZHRSb3V0ZTxUMj4pLmFic29sdXRlUGF0aDtcclxuICAgICAgbGV0IGN1cnJlbnQ6IFJkdFJvdXRlIHwgbnVsbCA9IGNsb25lO1xyXG5cclxuICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICBpZiAoY3VycmVudC5hYnNvbHV0ZVBhdGggPT09IHJvdXRlQWJzUGF0aCkge1xyXG4gICAgICAgICAgY3VycmVudC5fc3RhdGljUGFyYW1zID0gcGFyYW0yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbG9uZS5fc3RhdGljUGFyYW1zID0gcGFyYW0xIGFzIFQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICB3aXRoUXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcykge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5fcXVlcnlQYXJhbXMgPSB7IC4uLnF1ZXJ5UGFyYW1zIH07XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICB3aXRoU3RhdGVQYXJhbXMoc3RhdGVQYXJhbXM6IFBhcmFtcykge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5fc3RhdGVQYXJhbXMgPSB7IC4uLnN0YXRlUGFyYW1zIH07XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcmV0dXJucyBQYXJ0aWFsIG9mIG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMgcHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoaXMgcm91dGUuXHJcbiAgICovXHJcbiAgZXh0cmFjdFJvdXRlUGFyYW1zKHJvdzogVCk6IFBhcnRpYWw8VD4ge1xyXG4gICAgY29uc3QgcmVzOiBQYXJ0aWFsPFQ+ID0ge307XHJcblxyXG4gICAgdGhpcy5vcmRlcmVkUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLnBhcmFtTWFwcGluZ3MuZmluZCgobSkgPT4gbS51cmxOYW1lID09PSBwYXJhbSk7XHJcbiAgICAgIGNvbnN0IG1hcHBlZFBhcmFtID0gKG1hcHBpbmc/LnRhYmxlTmFtZSA/PyBwYXJhbSkgYXMga2V5b2YgVDtcclxuICAgICAgaWYgKG1hcHBlZFBhcmFtIGluIHJvdykge1xyXG4gICAgICAgIHJlc1ttYXBwZWRQYXJhbV0gPSByb3dbbWFwcGVkUGFyYW1dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgTmV3IGluc3RhbmNlIG9mIFJkdFJvdXRlPFQ+IHRoYXQgaXMgY2xvbmUgb2ZcclxuICAgKiB0aGlzIHJvdXRlIGFuZCBpdHMgcGFyZW50cyAoTk9UIGNoaWxkcmVuKS5cclxuICAgKi9cclxuICBjbG9uZSgpIHtcclxuICAgIGNvbnN0IGNsb25lID0gbmV3IFJkdFJvdXRlPFQ+KCk7XHJcbiAgICBjbG9uZS5fbmFtZSA9IHRoaXMuX25hbWU7XHJcbiAgICBjbG9uZS5fcGFyZW50ID0gdGhpcy5fcGFyZW50Py5jbG9uZSgpID8/IG51bGw7XHJcbiAgICBjbG9uZS5fcGF0aCA9IHRoaXMucGF0aDtcclxuICAgIGNsb25lLl9lbnRyeURpc2FibGVkID0gdGhpcy5fZW50cnlEaXNhYmxlZDtcclxuICAgIGNsb25lLm9yZGVyZWRQYXJhbXMgPSBbLi4udGhpcy5vcmRlcmVkUGFyYW1zXTtcclxuICAgIGNsb25lLl9wYXJhbU1hcCA9IHsgLi4udGhpcy5fcGFyYW1NYXAgfTtcclxuICAgIGNsb25lLl9yZWdleCA9IHRoaXMuX3JlZ2V4ID8gbmV3IFJlZ0V4cCh0aGlzLl9yZWdleCkgOiBudWxsO1xyXG4gICAgY2xvbmUucGFyYW1NYXBwaW5ncyA9IHRoaXMucGFyYW1NYXBwaW5ncztcclxuICAgIGNsb25lLl9zdGF0aWNQYXJhbXMgPSB7IC4uLnRoaXMuX3N0YXRpY1BhcmFtcyB9O1xyXG4gICAgY2xvbmUuX3N0YXRlUGFyYW1zID0geyAuLi50aGlzLl9zdGF0ZVBhcmFtcyB9O1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export class RdtReadonlyParameters {
|
|
2
|
-
params;
|
|
3
|
-
constructor(params = {}) {
|
|
4
|
-
this.params = params;
|
|
5
|
-
}
|
|
6
|
-
get(route) {
|
|
7
|
-
return this.params[route.absolutePath] ?? null;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export class RdtParameters extends RdtReadonlyParameters {
|
|
11
|
-
set(route, params) {
|
|
12
|
-
this.params[route.absolutePath] = params;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvcm91dGVyL3NyYy9saWIvcmR0LXJvdXRlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCQSxNQUFNLE9BQU8scUJBQXFCO0lBQ0Q7SUFBL0IsWUFBK0IsU0FBNEIsRUFBRTtRQUE5QixXQUFNLEdBQU4sTUFBTSxDQUF3QjtJQUFHLENBQUM7SUFFakUsR0FBRyxDQUFtQixLQUFrQjtRQUN0QyxPQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBZ0IsSUFBSSxJQUFJLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxxQkFBcUI7SUFDdEQsR0FBRyxDQUFtQixLQUFrQixFQUFFLE1BQWtCO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZHRSb3V0ZSB9IGZyb20gJy4vcmR0LXJvdXRlJztcclxuXHJcbmV4cG9ydCB0eXBlIFBhcmFtVHlwZU1hcDxUPiA9IHtcclxuICBba2V5IGluIGtleW9mIFRdPzogJ3N0cmluZycgfCAnbnVtYmVyJztcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1NYXBwaW5nIHtcclxuICB1cmxOYW1lOiBzdHJpbmc7XHJcbiAgdGFibGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljUm91dGVQYXJhbXMge1xyXG4gIFthYnNvbHV0ZVBhdGg6IHN0cmluZ106IG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmR0UmVkaXJlY3RSZXR1cm5UeXBlID0gc3RyaW5nIHwgdm9pZCB8IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB0eXBlIFJkdFJlZGlyZWN0Rm4gPSAoXHJcbiAgY3VycmVudFBhdGg6IHN0cmluZyxcclxuICB0YXJnZXRQYXRoOiBzdHJpbmcsXHJcbiAgdGFyZ2V0Um91dGU6IFJkdFJvdXRlXHJcbikgPT4gUmR0UmVkaXJlY3RSZXR1cm5UeXBlO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJkdFJlYWRvbmx5UGFyYW1ldGVycyB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogU3RhdGljUm91dGVQYXJhbXMgPSB7fSkge31cclxuXHJcbiAgZ2V0PFQgZXh0ZW5kcyBvYmplY3Q+KHJvdXRlOiBSZHRSb3V0ZTxUPik6IFBhcnRpYWw8VD4gfCBudWxsIHtcclxuICAgIHJldHVybiAodGhpcy5wYXJhbXNbcm91dGUuYWJzb2x1dGVQYXRoXSBhcyBQYXJ0aWFsPFQ+KSA/PyBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJkdFBhcmFtZXRlcnMgZXh0ZW5kcyBSZHRSZWFkb25seVBhcmFtZXRlcnMge1xyXG4gIHNldDxUIGV4dGVuZHMgb2JqZWN0Pihyb3V0ZTogUmR0Um91dGU8VD4sIHBhcmFtczogUGFydGlhbDxUPikge1xyXG4gICAgdGhpcy5wYXJhbXNbcm91dGUuYWJzb2x1dGVQYXRoXSA9IHBhcmFtcztcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
/**
|
|
3
|
-
* Injection token that defines behavior when route cannot be entered (canBeEntered returns false).
|
|
4
|
-
* If value is undefined, route will be redirected to ''.
|
|
5
|
-
*/
|
|
6
|
-
export const RDT_CANNOT_BE_ENTERED_PROVIDER = new InjectionToken('RDT_CANNOT_BE_ENTERED', { factory: () => undefined, providedIn: 'root' });
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LWNhbm5vdC1iZS1lbnRlcmVkLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3NlcnZpY2VzL3JkdC1jYW5ub3QtYmUtZW50ZXJlZC50b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLElBQUksY0FBYyxDQUU5RCx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZHRSZWRpcmVjdEZuLCBSZHRSZWRpcmVjdFJldHVyblR5cGUgfSBmcm9tICcuLi9yZHQtcm91dGUvdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRlZmluZXMgYmVoYXZpb3Igd2hlbiByb3V0ZSBjYW5ub3QgYmUgZW50ZXJlZCAoY2FuQmVFbnRlcmVkIHJldHVybnMgZmFsc2UpLlxyXG4gKiBJZiB2YWx1ZSBpcyB1bmRlZmluZWQsIHJvdXRlIHdpbGwgYmUgcmVkaXJlY3RlZCB0byAnJy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBSRFRfQ0FOTk9UX0JFX0VOVEVSRURfUFJPVklERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48XHJcbiAgUmR0UmVkaXJlY3RGbiB8IFJkdFJlZGlyZWN0UmV0dXJuVHlwZVxyXG4+KCdSRFRfQ0FOTk9UX0JFX0VOVEVSRUQnLCB7IGZhY3Rvcnk6ICgpID0+IHVuZGVmaW5lZCwgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pO1xyXG4iXX0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
import { defer, of } from 'rxjs';
|
|
3
|
-
export const RDT_CONFIRM_DATA_LOSS_SERVICE = new InjectionToken('RDT_CONFIRM_DATA_LOSS_SERVICE', { factory: () => new RdtConfirmDataLossServiceAlert() });
|
|
4
|
-
export class RdtConfirmDataLossService {
|
|
5
|
-
}
|
|
6
|
-
export class RdtConfirmDataLossServiceAlert extends RdtConfirmDataLossService {
|
|
7
|
-
confirmDataLoss() {
|
|
8
|
-
return defer(() => of(confirm('Are you sure you want to leave this page?')));
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LWNvbmZpcm0tZGF0YS1sb3NzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvcm91dGVyL3NyYy9saWIvc2VydmljZXMvcmR0LWNvbmZpcm0tZGF0YS1sb3NzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FDeEMsSUFBSSxjQUFjLENBQ2hCLCtCQUErQixFQUMvQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLDhCQUE4QixFQUFFLEVBQUUsQ0FDeEQsQ0FBQztBQUVKLE1BQU0sT0FBZ0IseUJBQXlCO0NBRTlDO0FBRUQsTUFBTSxPQUFPLDhCQUErQixTQUFRLHlCQUF5QjtJQUNsRSxlQUFlO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUNoQixFQUFFLENBQUMsT0FBTyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FDekQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlZmVyLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFJEVF9DT05GSVJNX0RBVEFfTE9TU19TRVJWSUNFID1cclxuICBuZXcgSW5qZWN0aW9uVG9rZW48UmR0Q29uZmlybURhdGFMb3NzU2VydmljZT4oXHJcbiAgICAnUkRUX0NPTkZJUk1fREFUQV9MT1NTX1NFUlZJQ0UnLFxyXG4gICAgeyBmYWN0b3J5OiAoKSA9PiBuZXcgUmR0Q29uZmlybURhdGFMb3NzU2VydmljZUFsZXJ0KCkgfVxyXG4gICk7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmR0Q29uZmlybURhdGFMb3NzU2VydmljZSB7XHJcbiAgYWJzdHJhY3QgY29uZmlybURhdGFMb3NzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZHRDb25maXJtRGF0YUxvc3NTZXJ2aWNlQWxlcnQgZXh0ZW5kcyBSZHRDb25maXJtRGF0YUxvc3NTZXJ2aWNlIHtcclxuICBvdmVycmlkZSBjb25maXJtRGF0YUxvc3MoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gZGVmZXIoKCkgPT5cclxuICAgICAgb2YoY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZT8nKSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { Location, PlatformLocation } from '@angular/common';
|
|
2
|
-
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { NavigationEnd, Router } from '@angular/router';
|
|
4
|
-
import { RdtStringUtils } from '@ngrdt/utils';
|
|
5
|
-
import { filter, take } from 'rxjs';
|
|
6
|
-
import { RdtReadonlyParameters } from '../rdt-route/utils';
|
|
7
|
-
import { RDT_ROUTES_PROVIDER } from './rdt-routes.token';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
const DEFAULT_TARGET = '_self';
|
|
10
|
-
const RDT_STATE_PARAMS_KEY = 'RdtStateParams';
|
|
11
|
-
export class RdtRouterService {
|
|
12
|
-
allRoutes = inject(RDT_ROUTES_PROVIDER, { optional: true });
|
|
13
|
-
location = inject(Location);
|
|
14
|
-
router = inject(Router);
|
|
15
|
-
baseHref = inject(PlatformLocation).getBaseHrefFromDOM();
|
|
16
|
-
_previousUrl = null;
|
|
17
|
-
_currentUrl = null;
|
|
18
|
-
get previousUrl() {
|
|
19
|
-
return this._previousUrl;
|
|
20
|
-
}
|
|
21
|
-
get currentUrl() {
|
|
22
|
-
return this._currentUrl;
|
|
23
|
-
}
|
|
24
|
-
parsePreviousUrl() {
|
|
25
|
-
return this._previousUrl ? this.parseAbsoluteUrl(this._previousUrl) : null;
|
|
26
|
-
}
|
|
27
|
-
parseCurrentUrl() {
|
|
28
|
-
return this._currentUrl ? this.parseAbsoluteUrl(this._currentUrl) : null;
|
|
29
|
-
}
|
|
30
|
-
navigationEnd$ = this.router.events.pipe(filter((e) => e instanceof NavigationEnd));
|
|
31
|
-
nextNavigationEnd$ = this.navigationEnd$.pipe(take(1));
|
|
32
|
-
constructor() {
|
|
33
|
-
if (this.allRoutes === null) {
|
|
34
|
-
console.warn('All routes not provided. Make sure to provide RDT_ROUTES_PROVIDER with RdtRoute[].');
|
|
35
|
-
this.allRoutes = [];
|
|
36
|
-
}
|
|
37
|
-
this.navigationEnd$.subscribe((e) => {
|
|
38
|
-
this._previousUrl = this._currentUrl;
|
|
39
|
-
this._currentUrl = e.url;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
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) {
|
|
62
|
-
const url = params
|
|
63
|
-
? link.createAbsoluteUrl(params)
|
|
64
|
-
: link.createAbsoluteUrl();
|
|
65
|
-
const target = extras?.target ?? DEFAULT_TARGET;
|
|
66
|
-
const queryParams = extras?.query ?? link.queryParams;
|
|
67
|
-
const stateParams = extras?.state ?? link.stateParams;
|
|
68
|
-
if (target === '_self') {
|
|
69
|
-
return this.router.navigate([url], {
|
|
70
|
-
queryParams: queryParams,
|
|
71
|
-
state: stateParams,
|
|
72
|
-
replaceUrl: extras?.replaceUrl,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
const absolutePath = RdtStringUtils.createAbsoluteUrl(url, this.baseHref);
|
|
76
|
-
const pathWithParams = RdtStringUtils.appendQueryParams(absolutePath, queryParams);
|
|
77
|
-
const win = window.open(pathWithParams, target);
|
|
78
|
-
if (win) {
|
|
79
|
-
win[RDT_STATE_PARAMS_KEY] = stateParams;
|
|
80
|
-
}
|
|
81
|
-
return Promise.resolve(true);
|
|
82
|
-
}
|
|
83
|
-
navigateHome(extras) {
|
|
84
|
-
return this.router.navigateByUrl(RdtStringUtils.appendQueryParams('/', extras?.query ?? {}), {
|
|
85
|
-
state: extras?.state,
|
|
86
|
-
replaceUrl: extras?.replaceUrl,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
navigateBack(extras) {
|
|
90
|
-
const parsed = this.parseAbsoluteUrl();
|
|
91
|
-
if (parsed) {
|
|
92
|
-
let route = parsed.route.withStaticParams(parsed.params);
|
|
93
|
-
do {
|
|
94
|
-
route = route.parent;
|
|
95
|
-
} while (route && route.entryDisabled);
|
|
96
|
-
// In case route has no ancestor with allowed entry,
|
|
97
|
-
if (!route) {
|
|
98
|
-
return this.navigateHome(extras);
|
|
99
|
-
}
|
|
100
|
-
if (extras) {
|
|
101
|
-
if (extras.query) {
|
|
102
|
-
route = route.withQueryParams(extras.query);
|
|
103
|
-
}
|
|
104
|
-
if (extras.state) {
|
|
105
|
-
route = route.withStateParams(extras.state);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return this.navigate(route, extras);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
console.warn(`Cannot go back from ${this.location.path()} because no route matches current url`);
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
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
|
-
}
|
|
132
|
-
extractAllParams(currentRoute) {
|
|
133
|
-
if (!currentRoute) {
|
|
134
|
-
const parsed = this.parseAbsoluteUrl();
|
|
135
|
-
if (!parsed) {
|
|
136
|
-
console.warn('No route matches current url.');
|
|
137
|
-
return new RdtReadonlyParameters();
|
|
138
|
-
}
|
|
139
|
-
currentRoute = parsed.route;
|
|
140
|
-
}
|
|
141
|
-
const url = this.location.path();
|
|
142
|
-
return currentRoute.parseAbsoluteUrl(url);
|
|
143
|
-
}
|
|
144
|
-
isParentOfCurrentLocation(route) {
|
|
145
|
-
console.log(this.parseAbsoluteUrl());
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
removeQueryParams(...paramNames) {
|
|
149
|
-
const regex = new RegExp(`[?&](${paramNames.join('|')})=[^&]*`, 'g');
|
|
150
|
-
return history.replaceState(history.state, '', location.pathname + location.search.replace(regex, '').replace(/^&/, '?'));
|
|
151
|
-
}
|
|
152
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
153
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, providedIn: 'root' });
|
|
154
|
-
}
|
|
155
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtRouterService, decorators: [{
|
|
156
|
-
type: Injectable,
|
|
157
|
-
args: [{
|
|
158
|
-
providedIn: 'root',
|
|
159
|
-
}]
|
|
160
|
-
}], ctorParameters: () => [] });
|
|
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==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
export const RDT_ROUTES_PROVIDER = new InjectionToken('RDT_ROUTES_PROVIDER');
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlcy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9yb3V0ZXIvc3JjL2xpYi9zZXJ2aWNlcy9yZHQtcm91dGVzLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQ25ELHFCQUFxQixDQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmR0Um91dGUgfSBmcm9tICcuLi9yZHQtcm91dGUvcmR0LXJvdXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBSRFRfUk9VVEVTX1BST1ZJREVSID0gbmV3IEluamVjdGlvblRva2VuPFJkdFJvdXRlW10+KFxyXG4gICdSRFRfUk9VVEVTX1BST1ZJREVSJ1xyXG4pO1xyXG4iXX0=
|
package/esm2022/ngrdt-router.mjs
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyZHQtcm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbmdyZHQtcm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
|
2
|
-
import { IsActiveMatchOptions } from '@angular/router';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Directive that appends class to host if any of the watched routes is active.
|
|
6
|
-
*/
|
|
7
|
-
export declare class RdtAnyRouteActiveDirective implements OnInit, OnChanges {
|
|
8
|
-
private readonly destroyRef;
|
|
9
|
-
private readonly router;
|
|
10
|
-
private readonly renderer;
|
|
11
|
-
private readonly elRef;
|
|
12
|
-
set anyRouteActive(data: string[] | string);
|
|
13
|
-
watchedRoutes: (string | string[])[];
|
|
14
|
-
set anyRouteActiveOptions(value: {
|
|
15
|
-
exact: boolean;
|
|
16
|
-
} | IsActiveMatchOptions);
|
|
17
|
-
private _anyRouteActiveOptions;
|
|
18
|
-
ariaCurrentWhenActive?: 'page' | 'step' | 'location' | 'date' | 'time' | true | false;
|
|
19
|
-
get isActive(): boolean;
|
|
20
|
-
private _isActive;
|
|
21
|
-
private classes;
|
|
22
|
-
ngOnInit(): void;
|
|
23
|
-
ngOnChanges(changes: SimpleChanges): void;
|
|
24
|
-
update(): void;
|
|
25
|
-
private setAriaCurrent;
|
|
26
|
-
private setClasses;
|
|
27
|
-
private addClass;
|
|
28
|
-
private removeClass;
|
|
29
|
-
private listenRouterEvents;
|
|
30
|
-
private parseClasses;
|
|
31
|
-
private parseOptions;
|
|
32
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RdtAnyRouteActiveDirective, never>;
|
|
33
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<RdtAnyRouteActiveDirective, "[rdtAnyRouteActive]", never, { "anyRouteActive": { "alias": "rdtAnyRouteActive"; "required": true; }; "watchedRoutes": { "alias": "watchedRoutes"; "required": true; }; "anyRouteActiveOptions": { "alias": "anyRouteActiveOptions"; "required": false; }; "ariaCurrentWhenActive": { "alias": "ariaCurrentWhenActive"; "required": false; }; }, {}, never, never, true, never>;
|
|
34
|
-
}
|