@ecodev/natural 62.1.2 → 63.0.0
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/fesm2022/ecodev-natural-vanilla.mjs +1193 -0
- package/fesm2022/ecodev-natural-vanilla.mjs.map +1 -0
- package/fesm2022/ecodev-natural.mjs +436 -425
- package/fesm2022/ecodev-natural.mjs.map +1 -1
- package/lib/classes/network-activity.service.d.ts +54 -0
- package/lib/classes/validators.d.ts +1 -1
- package/lib/modules/columns-picker/columns-picker.component.d.ts +2 -2
- package/lib/modules/common/services/seo.provider.d.ts +2 -2
- package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +1 -1
- package/lib/modules/file/abstract-file.d.ts +6 -3
- package/lib/modules/file/component/file.component.d.ts +2 -2
- package/lib/modules/file/file-drop.directive.d.ts +2 -3
- package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +2 -3
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -3
- package/lib/modules/icon/icon.module.d.ts +2 -2
- package/lib/modules/panels/panels.service.d.ts +1 -2
- package/lib/modules/relations/relations.component.d.ts +3 -3
- package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -3
- package/lib/modules/search/group/group.component.d.ts +2 -3
- package/lib/modules/search/input/input.component.d.ts +5 -5
- package/lib/modules/search/search/search.component.d.ts +2 -2
- package/lib/modules/select/abstract-select.component.d.ts +3 -3
- package/lib/modules/select/select/select.component.d.ts +1 -1
- package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +1 -1
- package/lib/modules/table-button/table-button.component.d.ts +4 -2
- package/package.json +16 -14
- package/public-api.d.ts +1 -0
- package/src/lib/_natural.theme.scss +1 -2
- package/vanilla/index.d.ts +5 -0
- package/vanilla/package.json +3 -0
- package/vanilla/public-api.d.ts +11 -0
- package/vanilla/src/lib/classes/crypto.d.ts +8 -0
- package/vanilla/src/lib/classes/data-source.d.ts +32 -0
- package/vanilla/src/lib/classes/query-variable-manager-utils.d.ts +2 -0
- package/vanilla/src/lib/classes/query-variable-manager.d.ts +91 -0
- package/vanilla/src/lib/classes/signing.d.ts +7 -0
- package/vanilla/src/lib/classes/utility.d.ts +77 -0
- package/vanilla/src/lib/modules/search/classes/graphql-doctrine.types.d.ts +83 -0
- package/vanilla/src/lib/modules/search/classes/utils.d.ts +17 -0
- package/vanilla/src/lib/modules/search/types/dropdown-component.d.ts +20 -0
- package/vanilla/src/lib/modules/search/types/facet.d.ts +75 -0
- package/vanilla/src/lib/modules/search/types/values.d.ts +32 -0
- package/vanilla/src/lib/services/abstract-model.service.d.ts +244 -0
- package/vanilla/src/lib/services/debounce.service.d.ts +52 -0
- package/vanilla/src/lib/types/types.d.ts +100 -0
- package/esm2022/ecodev-natural.mjs +0 -5
- package/esm2022/lib/classes/abstract-detail.mjs +0 -229
- package/esm2022/lib/classes/abstract-editable-list.mjs +0 -99
- package/esm2022/lib/classes/abstract-list.mjs +0 -461
- package/esm2022/lib/classes/abstract-navigable-list.mjs +0 -133
- package/esm2022/lib/classes/apollo-utils.mjs +0 -59
- package/esm2022/lib/classes/crypto.mjs +0 -23
- package/esm2022/lib/classes/cumulative-changes.mjs +0 -50
- package/esm2022/lib/classes/data-source.mjs +0 -71
- package/esm2022/lib/classes/providers.mjs +0 -13
- package/esm2022/lib/classes/query-variable-manager-utils.mjs +0 -14
- package/esm2022/lib/classes/query-variable-manager.mjs +0 -172
- package/esm2022/lib/classes/rxjs.mjs +0 -54
- package/esm2022/lib/classes/signing.mjs +0 -38
- package/esm2022/lib/classes/tld.mjs +0 -1476
- package/esm2022/lib/classes/utility.mjs +0 -234
- package/esm2022/lib/classes/validators.mjs +0 -179
- package/esm2022/lib/directives/http-prefix.directive.mjs +0 -47
- package/esm2022/lib/modules/alert/alert.service.mjs +0 -53
- package/esm2022/lib/modules/alert/confirm.component.mjs +0 -16
- package/esm2022/lib/modules/alert/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/component/avatar.component.mjs +0 -203
- package/esm2022/lib/modules/avatar/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/service/avatar.service.mjs +0 -63
- package/esm2022/lib/modules/avatar/sources/gravatar.mjs +0 -29
- package/esm2022/lib/modules/avatar/sources/image.mjs +0 -13
- package/esm2022/lib/modules/avatar/sources/initials.mjs +0 -39
- package/esm2022/lib/modules/avatar/sources/source.mjs +0 -16
- package/esm2022/lib/modules/columns-picker/columns-picker.component.mjs +0 -145
- package/esm2022/lib/modules/columns-picker/public-api.mjs +0 -5
- package/esm2022/lib/modules/columns-picker/types.mjs +0 -2
- package/esm2022/lib/modules/common/directives/background-density.directive.mjs +0 -63
- package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +0 -93
- package/esm2022/lib/modules/common/directives/src-density.directive.mjs +0 -72
- package/esm2022/lib/modules/common/pipes/capitalize.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/ellipsis.pipe.mjs +0 -17
- package/esm2022/lib/modules/common/pipes/enum.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/time-ago.pipe.mjs +0 -140
- package/esm2022/lib/modules/common/public-api.mjs +0 -14
- package/esm2022/lib/modules/common/services/memory-storage.mjs +0 -110
- package/esm2022/lib/modules/common/services/seo.provider.mjs +0 -23
- package/esm2022/lib/modules/common/services/seo.service.mjs +0 -235
- package/esm2022/lib/modules/detail-header/detail-header.component.mjs +0 -84
- package/esm2022/lib/modules/detail-header/public-api.mjs +0 -5
- package/esm2022/lib/modules/dialog-trigger/dialog-trigger.component.mjs +0 -72
- package/esm2022/lib/modules/dialog-trigger/public-api.mjs +0 -5
- package/esm2022/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +0 -100
- package/esm2022/lib/modules/dropdown-components/public-api.mjs +0 -14
- package/esm2022/lib/modules/dropdown-components/type-boolean/type-boolean.component.mjs +0 -39
- package/esm2022/lib/modules/dropdown-components/type-date/type-date.component.mjs +0 -173
- package/esm2022/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +0 -134
- package/esm2022/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +0 -80
- package/esm2022/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +0 -48
- package/esm2022/lib/modules/dropdown-components/type-number/type-number.component.mjs +0 -110
- package/esm2022/lib/modules/dropdown-components/type-options/type-options.component.mjs +0 -64
- package/esm2022/lib/modules/dropdown-components/type-select/type-select.component.mjs +0 -175
- package/esm2022/lib/modules/dropdown-components/type-text/type-text.component.mjs +0 -62
- package/esm2022/lib/modules/dropdown-components/types.mjs +0 -41
- package/esm2022/lib/modules/dropdown-components/utils.mjs +0 -35
- package/esm2022/lib/modules/file/abstract-file.mjs +0 -230
- package/esm2022/lib/modules/file/component/file.component.mjs +0 -172
- package/esm2022/lib/modules/file/file-drop.directive.mjs +0 -111
- package/esm2022/lib/modules/file/file-select.directive.mjs +0 -26
- package/esm2022/lib/modules/file/file.service.mjs +0 -43
- package/esm2022/lib/modules/file/public-api.mjs +0 -9
- package/esm2022/lib/modules/file/types.mjs +0 -2
- package/esm2022/lib/modules/file/utils.mjs +0 -129
- package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +0 -30
- package/esm2022/lib/modules/fixed-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +0 -56
- package/esm2022/lib/modules/fixed-button-detail/public-api.mjs +0 -5
- package/esm2022/lib/modules/hierarchic-selector/classes/flat-node.mjs +0 -18
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/model-node.mjs +0 -14
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +0 -398
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +0 -243
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +0 -38
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +0 -22
- package/esm2022/lib/modules/hierarchic-selector/public-api.mjs +0 -10
- package/esm2022/lib/modules/icon/icon.directive.mjs +0 -96
- package/esm2022/lib/modules/icon/icon.module.mjs +0 -33
- package/esm2022/lib/modules/icon/public-api.mjs +0 -6
- package/esm2022/lib/modules/logger/error-handler.mjs +0 -87
- package/esm2022/lib/modules/logger/error.module.mjs +0 -22
- package/esm2022/lib/modules/logger/public-api.mjs +0 -6
- package/esm2022/lib/modules/matomo/matomo.service.mjs +0 -96
- package/esm2022/lib/modules/matomo/public-api.mjs +0 -5
- package/esm2022/lib/modules/panels/abstract-panel.mjs +0 -76
- package/esm2022/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs +0 -12
- package/esm2022/lib/modules/panels/panels.component.mjs +0 -27
- package/esm2022/lib/modules/panels/panels.module.mjs +0 -10
- package/esm2022/lib/modules/panels/panels.service.mjs +0 -329
- package/esm2022/lib/modules/panels/panels.urlmatcher.mjs +0 -75
- package/esm2022/lib/modules/panels/public-api.mjs +0 -11
- package/esm2022/lib/modules/panels/types.mjs +0 -3
- package/esm2022/lib/modules/relations/public-api.mjs +0 -5
- package/esm2022/lib/modules/relations/relations.component.mjs +0 -254
- package/esm2022/lib/modules/search/classes/graphql-doctrine.mjs +0 -111
- package/esm2022/lib/modules/search/classes/graphql-doctrine.types.mjs +0 -14
- package/esm2022/lib/modules/search/classes/transformers.mjs +0 -142
- package/esm2022/lib/modules/search/classes/url.mjs +0 -53
- package/esm2022/lib/modules/search/classes/utils.mjs +0 -25
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container-animations.mjs +0 -44
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +0 -87
- package/esm2022/lib/modules/search/dropdown-container/dropdown-ref.mjs +0 -24
- package/esm2022/lib/modules/search/dropdown-container/dropdown.service.mjs +0 -90
- package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +0 -45
- package/esm2022/lib/modules/search/group/group.component.mjs +0 -53
- package/esm2022/lib/modules/search/input/input.component.mjs +0 -365
- package/esm2022/lib/modules/search/public-api.mjs +0 -7
- package/esm2022/lib/modules/search/search/search.component.mjs +0 -102
- package/esm2022/lib/modules/search/types/dropdown-component.mjs +0 -2
- package/esm2022/lib/modules/search/types/facet.mjs +0 -2
- package/esm2022/lib/modules/search/types/values.mjs +0 -2
- package/esm2022/lib/modules/select/abstract-select.component.mjs +0 -232
- package/esm2022/lib/modules/select/public-api.mjs +0 -7
- package/esm2022/lib/modules/select/select/select.component.mjs +0 -310
- package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +0 -57
- package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +0 -155
- package/esm2022/lib/modules/sidenav/public-api.mjs +0 -9
- package/esm2022/lib/modules/sidenav/sidenav/sidenav.component.mjs +0 -15
- package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +0 -90
- package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +0 -11
- package/esm2022/lib/modules/sidenav/sidenav-stack.service.mjs +0 -50
- package/esm2022/lib/modules/sidenav/sidenav.service.mjs +0 -196
- package/esm2022/lib/modules/stamp/public-api.mjs +0 -5
- package/esm2022/lib/modules/stamp/stamp.component.mjs +0 -23
- package/esm2022/lib/modules/table-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/table-button/table-button.component.mjs +0 -78
- package/esm2022/lib/services/abstract-model.service.mjs +0 -526
- package/esm2022/lib/services/debounce.service.mjs +0 -149
- package/esm2022/lib/services/enum.service.mjs +0 -64
- package/esm2022/lib/services/link-mutation.service.mjs +0 -154
- package/esm2022/lib/services/persistence.service.mjs +0 -115
- package/esm2022/lib/services/swiss-parsing-date-adapter.service.mjs +0 -63
- package/esm2022/lib/types/types.mjs +0 -2
- package/esm2022/public-api.mjs +0 -46
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { Inject, Optional, Pipe } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
function isDate(value) {
|
|
4
|
-
return value instanceof Date && !isNaN(value.valueOf());
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Returns a string to approximately describe the date.
|
|
8
|
-
*
|
|
9
|
-
* Eg:
|
|
10
|
-
*
|
|
11
|
-
* - "il y a quelques minutes"
|
|
12
|
-
* - "dans 3 jours"
|
|
13
|
-
* - "dans 3 ans"
|
|
14
|
-
*/
|
|
15
|
-
export class NaturalTimeAgoPipe {
|
|
16
|
-
fakedNow;
|
|
17
|
-
constructor(fakedNow = null) {
|
|
18
|
-
this.fakedNow = fakedNow;
|
|
19
|
-
}
|
|
20
|
-
getNow() {
|
|
21
|
-
return this.fakedNow ?? Date.now();
|
|
22
|
-
}
|
|
23
|
-
transform(date) {
|
|
24
|
-
if (!date) {
|
|
25
|
-
return '';
|
|
26
|
-
}
|
|
27
|
-
const stamp = isDate(date) ? date.getTime() : Date.parse(date);
|
|
28
|
-
const now = this.getNow();
|
|
29
|
-
const $seconds = (stamp - now) / 1000;
|
|
30
|
-
const minutes = $seconds / 60;
|
|
31
|
-
const hours = minutes / 60;
|
|
32
|
-
const days = hours / 24;
|
|
33
|
-
const weeks = days / 7;
|
|
34
|
-
const months = days / 31;
|
|
35
|
-
const years = days / 365;
|
|
36
|
-
// Find out the best unit to use for display
|
|
37
|
-
if (years <= -2) {
|
|
38
|
-
const value = Math.round(Math.abs(years));
|
|
39
|
-
return $localize `il y a ${value} ans`;
|
|
40
|
-
}
|
|
41
|
-
else if (years <= -1) {
|
|
42
|
-
return $localize `il y a un an`;
|
|
43
|
-
}
|
|
44
|
-
else if (months <= -2) {
|
|
45
|
-
const value = Math.round(Math.abs(months));
|
|
46
|
-
return $localize `il y a ${value} mois`;
|
|
47
|
-
}
|
|
48
|
-
else if (months <= -1) {
|
|
49
|
-
return $localize `il y a un mois`;
|
|
50
|
-
}
|
|
51
|
-
else if (weeks <= -2) {
|
|
52
|
-
const value = Math.round(Math.abs(weeks));
|
|
53
|
-
return $localize `il y a ${value} semaines`;
|
|
54
|
-
}
|
|
55
|
-
else if (weeks <= -1) {
|
|
56
|
-
return $localize `il y a une semaine`;
|
|
57
|
-
}
|
|
58
|
-
else if (days <= -2) {
|
|
59
|
-
const value = Math.round(Math.abs(days));
|
|
60
|
-
return $localize `il y a ${value} jours`;
|
|
61
|
-
}
|
|
62
|
-
else if (days <= -1) {
|
|
63
|
-
return $localize `il y a un jour`;
|
|
64
|
-
}
|
|
65
|
-
else if (hours <= -2) {
|
|
66
|
-
const value = Math.round(Math.abs(hours));
|
|
67
|
-
return $localize `il y a ${value} heures`;
|
|
68
|
-
}
|
|
69
|
-
else if (hours <= -1) {
|
|
70
|
-
return $localize `il y a une heure`;
|
|
71
|
-
}
|
|
72
|
-
else if (minutes <= -5) {
|
|
73
|
-
const value = Math.round(Math.abs(minutes));
|
|
74
|
-
return $localize `il y a ${value} minutes`;
|
|
75
|
-
}
|
|
76
|
-
else if (minutes <= 0) {
|
|
77
|
-
return $localize `il y a quelques minutes`;
|
|
78
|
-
}
|
|
79
|
-
else if (years > 2) {
|
|
80
|
-
const value = Math.round(years);
|
|
81
|
-
return $localize `dans ${value} ans`;
|
|
82
|
-
}
|
|
83
|
-
else if (years > 1) {
|
|
84
|
-
return $localize `dans un an`;
|
|
85
|
-
}
|
|
86
|
-
else if (months > 2) {
|
|
87
|
-
const value = Math.round(months);
|
|
88
|
-
return $localize `dans ${value} mois`;
|
|
89
|
-
}
|
|
90
|
-
else if (months > 1) {
|
|
91
|
-
return $localize `dans un mois`;
|
|
92
|
-
}
|
|
93
|
-
else if (weeks > 2) {
|
|
94
|
-
const value = Math.round(weeks);
|
|
95
|
-
return $localize `dans ${value} semaines`;
|
|
96
|
-
}
|
|
97
|
-
else if (weeks > 1) {
|
|
98
|
-
return $localize `dans une semaine`;
|
|
99
|
-
}
|
|
100
|
-
else if (days > 2) {
|
|
101
|
-
const value = Math.round(days);
|
|
102
|
-
return $localize `dans ${value} jours`;
|
|
103
|
-
}
|
|
104
|
-
else if (days > 1) {
|
|
105
|
-
return $localize `dans un jour`;
|
|
106
|
-
}
|
|
107
|
-
else if (hours > 2) {
|
|
108
|
-
const value = Math.round(hours);
|
|
109
|
-
return $localize `dans ${value} heures`;
|
|
110
|
-
}
|
|
111
|
-
else if (hours > 1) {
|
|
112
|
-
return $localize `dans une heure`;
|
|
113
|
-
}
|
|
114
|
-
else if (minutes > 5) {
|
|
115
|
-
const value = Math.round(minutes);
|
|
116
|
-
return $localize `dans ${value} minutes`;
|
|
117
|
-
}
|
|
118
|
-
else if (minutes > 0) {
|
|
119
|
-
return $localize `dans quelques minutes`;
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
throw new Error('Time travelling just happened');
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, deps: [{ token: 'SHOULD_NEVER_BE_INJECTED', optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
126
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, isStandalone: true, name: "timeAgo" });
|
|
127
|
-
}
|
|
128
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalTimeAgoPipe, decorators: [{
|
|
129
|
-
type: Pipe,
|
|
130
|
-
args: [{
|
|
131
|
-
name: 'timeAgo',
|
|
132
|
-
standalone: true,
|
|
133
|
-
}]
|
|
134
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
135
|
-
type: Optional
|
|
136
|
-
}, {
|
|
137
|
-
type: Inject,
|
|
138
|
-
args: ['SHOULD_NEVER_BE_INJECTED']
|
|
139
|
-
}] }] });
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1hZ28ucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2NvbW1vbi9waXBlcy90aW1lLWFnby5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7O0FBRXBFLFNBQVMsTUFBTSxDQUFDLEtBQVU7SUFDdEIsT0FBTyxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUtILE1BQU0sT0FBTyxrQkFBa0I7SUFFMEM7SUFEckUsWUFDcUUsV0FBMEIsSUFBSTtRQUE5QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtJQUNoRyxDQUFDO0lBRUksTUFBTTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFzQztRQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFMUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDOUIsTUFBTSxL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QUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLFNBQVMsQ0FBQSxRQUFRLEtBQUssU0FBUyxDQUFDO1FBQzNDLENBQUM7YUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQSxnQkFBZ0IsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQSxRQUFRLEtBQUssVUFBVSxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLFNBQVMsQ0FBQSx1QkFBdUIsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQzt1R0F6RlEsa0JBQWtCLGtCQUVILDBCQUEwQjtxR0FGekMsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUo5QixJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs7MEJBR1EsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgT3B0aW9uYWwsIFBpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5mdW5jdGlvbiBpc0RhdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIERhdGUge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyB0byBhcHByb3hpbWF0ZWx5IGRlc2NyaWJlIHRoZSBkYXRlLlxuICpcbiAqIEVnOlxuICpcbiAqIC0gXCJpbCB5IGEgcXVlbHF1ZXMgbWludXRlc1wiXG4gKiAtIFwiZGFucyAzIGpvdXJzXCJcbiAqIC0gXCJkYW5zIDMgYW5zXCJcbiAqL1xuQFBpcGUoe1xuICAgIG5hbWU6ICd0aW1lQWdvJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsVGltZUFnb1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ1NIT1VMRF9ORVZFUl9CRV9JTkpFQ1RFRCcpIHByaXZhdGUgcmVhZG9ubHkgZmFrZWROb3c6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHByaXZhdGUgZ2V0Tm93KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZha2VkTm93ID8/IERhdGUubm93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybShkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhbXAgPSBpc0RhdGUoZGF0ZSkgPyBkYXRlLmdldFRpbWUoKSA6IERhdGUucGFyc2UoZGF0ZSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuZ2V0Tm93KCk7XG5cbiAgICAgICAgY29uc3QgJHNlY29uZHMgPSAoc3RhbXAgLSBub3cpIC8gMTAwMDtcbiAgICAgICAgY29uc3QgbWludXRlcyA9ICRzZWNvbmRzIC8gNjA7XG4gICAgICAgIGNvbnN0IGhvdXJzID0gbWludXRlcyAvIDYwO1xuICAgICAgICBjb25zdCBkYXlzID0gaG91cnMgLyAyNDtcbiAgICAgICAgY29uc3Qgd2Vla3MgPSBkYXlzIC8gNztcbiAgICAgICAgY29uc3QgbW9udGhzID0gZGF5cyAvIDMxO1xuICAgICAgICBjb25zdCB5ZWFycyA9IGRheXMgLyAzNjU7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgdGhlIGJlc3QgdW5pdCB0byB1c2UgZm9yIGRpc3BsYXlcbiAgICAgICAgaWYgKHllYXJzIDw9IC0yKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoTWF0aC5hYnMoeWVhcnMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IGFuc2A7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhcnMgPD0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhIHVuIGFuYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPD0gLTIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyhtb250aHMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IG1vaXNgO1xuICAgICAgICB9IGVsc2UgaWYgKG1vbnRocyA8PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBpbCB5IGEgdW4gbW9pc2A7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla3MgPD0gLTIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyh3ZWVrcykpO1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBpbCB5IGEgJHt2YWx1ZX0gc2VtYWluZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1bmUgc2VtYWluZWA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA8PSAtMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKGRheXMpKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhICR7dmFsdWV9IGpvdXJzYDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1biBqb3VyYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA8PSAtMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKGhvdXJzKSk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSAke3ZhbHVlfSBoZXVyZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSB1bmUgaGV1cmVgO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPD0gLTUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLmFicyhtaW51dGVzKSk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGlsIHkgYSAke3ZhbHVlfSBtaW51dGVzYDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgaWwgeSBhIHF1ZWxxdWVzIG1pbnV0ZXNgO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXJzID4gMikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKHllYXJzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBhbnNgO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXJzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBkYW5zIHVuIGFuYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPiAyKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQobW9udGhzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBtb2lzYDtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aHMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgdW4gbW9pc2A7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla3MgPiAyKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQod2Vla3MpO1xuICAgICAgICAgICAgcmV0dXJuICRsb2NhbGl6ZWBkYW5zICR7dmFsdWV9IHNlbWFpbmVzYDtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrcyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1bmUgc2VtYWluZWA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChkYXlzKTtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyAke3ZhbHVlfSBqb3Vyc2A7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1biBqb3VyYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChob3Vycyk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgJHt2YWx1ZX0gaGV1cmVzYDtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyB1bmUgaGV1cmVgO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPiA1KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQobWludXRlcyk7XG4gICAgICAgICAgICByZXR1cm4gJGxvY2FsaXplYGRhbnMgJHt2YWx1ZX0gbWludXRlc2A7XG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlcyA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkbG9jYWxpemVgZGFucyBxdWVscXVlcyBtaW51dGVzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGltZSB0cmF2ZWxsaW5nIGp1c3QgaGFwcGVuZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of natural
|
|
3
|
-
*/
|
|
4
|
-
export * from './directives/linkable-tab.directive';
|
|
5
|
-
export * from './pipes/capitalize.pipe';
|
|
6
|
-
export * from './pipes/ellipsis.pipe';
|
|
7
|
-
export * from './pipes/enum.pipe';
|
|
8
|
-
export { NaturalTimeAgoPipe } from './pipes/time-ago.pipe';
|
|
9
|
-
export * from './services/memory-storage';
|
|
10
|
-
export { NaturalSrcDensityDirective } from './directives/src-density.directive';
|
|
11
|
-
export { NaturalBackgroundDensityDirective } from './directives/background-density.directive';
|
|
12
|
-
export { NATURAL_SEO_CONFIG, NaturalSeoService } from './services/seo.service';
|
|
13
|
-
export { provideSeo } from './services/seo.provider';
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2NvbW1vbi9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQzVGLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBUzdFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmF0dXJhbFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aXZlcy9saW5rYWJsZS10YWIuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZXMvY2FwaXRhbGl6ZS5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZXMvZWxsaXBzaXMucGlwZSc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVzL2VudW0ucGlwZSc7XG5leHBvcnQge05hdHVyYWxUaW1lQWdvUGlwZX0gZnJvbSAnLi9waXBlcy90aW1lLWFnby5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvbWVtb3J5LXN0b3JhZ2UnO1xuZXhwb3J0IHtOYXR1cmFsU3JjRGVuc2l0eURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL3NyYy1kZW5zaXR5LmRpcmVjdGl2ZSc7XG5leHBvcnQge05hdHVyYWxCYWNrZ3JvdW5kRGVuc2l0eURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL2JhY2tncm91bmQtZGVuc2l0eS5kaXJlY3RpdmUnO1xuZXhwb3J0IHtOQVRVUkFMX1NFT19DT05GSUcsIE5hdHVyYWxTZW9TZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL3Nlby5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgICBOYXR1cmFsU2VvQ29uZmlnLFxuICAgIE5hdHVyYWxTZW8sXG4gICAgTmF0dXJhbFNlb0Jhc2ljLFxuICAgIE5hdHVyYWxTZW9SZXNvbHZlLFxuICAgIE5hdHVyYWxTZW9DYWxsYmFjayxcbiAgICBOYXR1cmFsU2VvUmVzb2x2ZURhdGEsXG59IGZyb20gJy4vc2VydmljZXMvc2VvLnNlcnZpY2UnO1xuZXhwb3J0IHtwcm92aWRlU2VvfSBmcm9tICcuL3NlcnZpY2VzL3Nlby5wcm92aWRlcic7XG4iXX0=
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Injectable, InjectionToken } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export const SESSION_STORAGE = new InjectionToken('Session storage that can be shimed when running on server or in tests');
|
|
4
|
-
export const LOCAL_STORAGE = new InjectionToken('Local storage that can be shimed when running on server or in tests');
|
|
5
|
-
/**
|
|
6
|
-
* Memory storage to keep store volatile things in memory
|
|
7
|
-
*
|
|
8
|
-
* Should be used to shim sessionStorage when running on server or in our tests
|
|
9
|
-
*/
|
|
10
|
-
export class NaturalMemoryStorage {
|
|
11
|
-
data = new Map();
|
|
12
|
-
get length() {
|
|
13
|
-
return this.data.size;
|
|
14
|
-
}
|
|
15
|
-
clear() {
|
|
16
|
-
this.data.clear();
|
|
17
|
-
}
|
|
18
|
-
getItem(key) {
|
|
19
|
-
const value = this.data.get(key);
|
|
20
|
-
return value === undefined ? null : value;
|
|
21
|
-
}
|
|
22
|
-
key(index) {
|
|
23
|
-
let i = 0;
|
|
24
|
-
for (const key of this.data.keys()) {
|
|
25
|
-
if (i++ === index) {
|
|
26
|
-
return key;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
removeItem(key) {
|
|
32
|
-
this.data.delete(key);
|
|
33
|
-
}
|
|
34
|
-
setItem(key, value) {
|
|
35
|
-
this.data.set(key, value);
|
|
36
|
-
}
|
|
37
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
38
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, providedIn: 'root' });
|
|
39
|
-
}
|
|
40
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalMemoryStorage, decorators: [{
|
|
41
|
-
type: Injectable,
|
|
42
|
-
args: [{
|
|
43
|
-
providedIn: 'root',
|
|
44
|
-
}]
|
|
45
|
-
}] });
|
|
46
|
-
export function sessionStorageFactory() {
|
|
47
|
-
try {
|
|
48
|
-
// eslint-disable-next-line no-restricted-globals
|
|
49
|
-
if (typeof sessionStorage !== 'undefined') {
|
|
50
|
-
// eslint-disable-next-line no-restricted-globals
|
|
51
|
-
return sessionStorage;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch (e) {
|
|
55
|
-
// nothing do to
|
|
56
|
-
}
|
|
57
|
-
return new NaturalMemoryStorage();
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Standard `sessionStorage` provider that is compatible with SSR.
|
|
61
|
-
*
|
|
62
|
-
* In SSR environment, or when `sessionStorage` is not available, will return a `NaturalMemoryStorage`
|
|
63
|
-
*/
|
|
64
|
-
export const sessionStorageProvider = {
|
|
65
|
-
// Here we must use a factory that return directly the value, otherwise it will
|
|
66
|
-
// crash when running on server because the value does not exist (but the factory will
|
|
67
|
-
// never actually be called on server, so the server will not see the missing value)
|
|
68
|
-
provide: SESSION_STORAGE,
|
|
69
|
-
useFactory: sessionStorageFactory,
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Provide in-memory session storage to be used only in tests or SSR
|
|
73
|
-
*/
|
|
74
|
-
export const memorySessionStorageProvider = {
|
|
75
|
-
provide: SESSION_STORAGE,
|
|
76
|
-
useClass: NaturalMemoryStorage,
|
|
77
|
-
};
|
|
78
|
-
export function localStorageFactory() {
|
|
79
|
-
try {
|
|
80
|
-
// eslint-disable-next-line no-restricted-globals
|
|
81
|
-
if (typeof localStorage !== 'undefined') {
|
|
82
|
-
// eslint-disable-next-line no-restricted-globals
|
|
83
|
-
return localStorage;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
// Do nothing
|
|
88
|
-
}
|
|
89
|
-
return new NaturalMemoryStorage();
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Standard `localStorage` provider that is compatible with SSR.
|
|
93
|
-
*
|
|
94
|
-
* In SSR environment, or when `localStorage` is not available, will return a `NaturalMemoryStorage`
|
|
95
|
-
*/
|
|
96
|
-
export const localStorageProvider = {
|
|
97
|
-
// Here we must use a factory that return directly the value, otherwise it will
|
|
98
|
-
// crash when running on server because the value does not exist (but the factory will
|
|
99
|
-
// never actually be called on server, so the server will not see the missing value)
|
|
100
|
-
provide: LOCAL_STORAGE,
|
|
101
|
-
useFactory: localStorageFactory,
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* Provide in-memory local storage to be used only in tests or SSR
|
|
105
|
-
*/
|
|
106
|
-
export const memoryLocalStorageProvider = {
|
|
107
|
-
provide: LOCAL_STORAGE,
|
|
108
|
-
useClass: NaturalMemoryStorage,
|
|
109
|
-
};
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvbWVtb3J5LXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQVcsTUFBTSxlQUFlLENBQUM7O0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FDN0MsdUVBQXVFLENBQzFFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQzNDLHFFQUFxRSxDQUN4RSxDQUFDO0FBT0Y7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFDWixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFbEQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU0sS0FBSztRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxLQUFhO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVSxDQUFDLEdBQVc7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzt1R0FqQ1Esb0JBQW9COzJHQUFwQixvQkFBb0IsY0FGakIsTUFBTTs7MkZBRVQsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7QUFxQ0QsTUFBTSxVQUFVLHFCQUFxQjtJQUNqQyxJQUFJLENBQUM7UUFDRCxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxpREFBaUQ7WUFDakQsT0FBTyxjQUFjLENBQUM7UUFDMUIsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsZ0JBQWdCO0lBQ3BCLENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFhO0lBQzVDLCtFQUErRTtJQUMvRSxzRkFBc0Y7SUFDdEYsb0ZBQW9GO0lBQ3BGLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFVBQVUsRUFBRSxxQkFBcUI7Q0FDcEMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWE7SUFDbEQsT0FBTyxFQUFFLGVBQWU7SUFDeEIsUUFBUSxFQUFFLG9CQUFvQjtDQUNqQyxDQUFDO0FBRUYsTUFBTSxVQUFVLG1CQUFtQjtJQUMvQixJQUFJLENBQUM7UUFDRCxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxpREFBaUQ7WUFDakQsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsYUFBYTtJQUNqQixDQUFDO0lBRUQsT0FBTyxJQUFJLG9CQUFvQixFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBYTtJQUMxQywrRUFBK0U7SUFDL0Usc0ZBQXNGO0lBQ3RGLG9GQUFvRjtJQUNwRixPQUFPLEVBQUUsYUFBYTtJQUN0QixVQUFVLEVBQUUsbUJBQW1CO0NBQ2xDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFhO0lBQ2hELE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFFBQVEsRUFBRSxvQkFBb0I7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IFNFU1NJT05fU1RPUkFHRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU3RvcmFnZT4oXG4gICAgJ1Nlc3Npb24gc3RvcmFnZSB0aGF0IGNhbiBiZSBzaGltZWQgd2hlbiBydW5uaW5nIG9uIHNlcnZlciBvciBpbiB0ZXN0cycsXG4pO1xuXG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU3RvcmFnZT4oXG4gICAgJ0xvY2FsIHN0b3JhZ2UgdGhhdCBjYW4gYmUgc2hpbWVkIHdoZW4gcnVubmluZyBvbiBzZXJ2ZXIgb3IgaW4gdGVzdHMnLFxuKTtcblxuLyoqXG4gKiBOb3JtYWwgYFN0b3JhZ2VgIHR5cGUsIGJ1dCB3aXRob3V0IGFycmF5IGFjY2Vzc1xuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU3RvcmFnZSA9IFBpY2s8U3RvcmFnZSwgJ2xlbmd0aCcgfCAnY2xlYXInIHwgJ2dldEl0ZW0nIHwgJ2tleScgfCAncmVtb3ZlSXRlbScgfCAnc2V0SXRlbSc+O1xuXG4vKipcbiAqIE1lbW9yeSBzdG9yYWdlIHRvIGtlZXAgc3RvcmUgdm9sYXRpbGUgdGhpbmdzIGluIG1lbW9yeVxuICpcbiAqIFNob3VsZCBiZSB1c2VkIHRvIHNoaW0gc2Vzc2lvblN0b3JhZ2Ugd2hlbiBydW5uaW5nIG9uIHNlcnZlciBvciBpbiBvdXIgdGVzdHNcbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBOYXR1cmFsU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmRhdGEua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoaSsrID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uU3RvcmFnZUZhY3RvcnkoKTogTmF0dXJhbFN0b3JhZ2Uge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90aGluZyBkbyB0b1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmF0dXJhbE1lbW9yeVN0b3JhZ2UoKTtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBgc2Vzc2lvblN0b3JhZ2VgIHByb3ZpZGVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIFNTUi5cbiAqXG4gKiBJbiBTU1IgZW52aXJvbm1lbnQsIG9yIHdoZW4gYHNlc3Npb25TdG9yYWdlYCBpcyBub3QgYXZhaWxhYmxlLCB3aWxsIHJldHVybiBhIGBOYXR1cmFsTWVtb3J5U3RvcmFnZWBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlc3Npb25TdG9yYWdlUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIC8vIEhlcmUgd2UgbXVzdCB1c2UgYSBmYWN0b3J5IHRoYXQgcmV0dXJuIGRpcmVjdGx5IHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHdpbGxcbiAgICAvLyBjcmFzaCB3aGVuIHJ1bm5pbmcgb24gc2VydmVyIGJlY2F1c2UgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0IChidXQgdGhlIGZhY3Rvcnkgd2lsbFxuICAgIC8vIG5ldmVyIGFjdHVhbGx5IGJlIGNhbGxlZCBvbiBzZXJ2ZXIsIHNvIHRoZSBzZXJ2ZXIgd2lsbCBub3Qgc2VlIHRoZSBtaXNzaW5nIHZhbHVlKVxuICAgIHByb3ZpZGU6IFNFU1NJT05fU1RPUkFHRSxcbiAgICB1c2VGYWN0b3J5OiBzZXNzaW9uU3RvcmFnZUZhY3RvcnksXG59O1xuXG4vKipcbiAqIFByb3ZpZGUgaW4tbWVtb3J5IHNlc3Npb24gc3RvcmFnZSB0byBiZSB1c2VkIG9ubHkgaW4gdGVzdHMgb3IgU1NSXG4gKi9cbmV4cG9ydCBjb25zdCBtZW1vcnlTZXNzaW9uU3RvcmFnZVByb3ZpZGVyOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBTRVNTSU9OX1NUT1JBR0UsXG4gICAgdXNlQ2xhc3M6IE5hdHVyYWxNZW1vcnlTdG9yYWdlLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZUZhY3RvcnkoKTogTmF0dXJhbFN0b3JhZ2Uge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOYXR1cmFsTWVtb3J5U3RvcmFnZSgpO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIGBsb2NhbFN0b3JhZ2VgIHByb3ZpZGVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIFNTUi5cbiAqXG4gKiBJbiBTU1IgZW52aXJvbm1lbnQsIG9yIHdoZW4gYGxvY2FsU3RvcmFnZWAgaXMgbm90IGF2YWlsYWJsZSwgd2lsbCByZXR1cm4gYSBgTmF0dXJhbE1lbW9yeVN0b3JhZ2VgXG4gKi9cbmV4cG9ydCBjb25zdCBsb2NhbFN0b3JhZ2VQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gICAgLy8gSGVyZSB3ZSBtdXN0IHVzZSBhIGZhY3RvcnkgdGhhdCByZXR1cm4gZGlyZWN0bHkgdGhlIHZhbHVlLCBvdGhlcndpc2UgaXQgd2lsbFxuICAgIC8vIGNyYXNoIHdoZW4gcnVubmluZyBvbiBzZXJ2ZXIgYmVjYXVzZSB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QgKGJ1dCB0aGUgZmFjdG9yeSB3aWxsXG4gICAgLy8gbmV2ZXIgYWN0dWFsbHkgYmUgY2FsbGVkIG9uIHNlcnZlciwgc28gdGhlIHNlcnZlciB3aWxsIG5vdCBzZWUgdGhlIG1pc3NpbmcgdmFsdWUpXG4gICAgcHJvdmlkZTogTE9DQUxfU1RPUkFHRSxcbiAgICB1c2VGYWN0b3J5OiBsb2NhbFN0b3JhZ2VGYWN0b3J5LFxufTtcblxuLyoqXG4gKiBQcm92aWRlIGluLW1lbW9yeSBsb2NhbCBzdG9yYWdlIHRvIGJlIHVzZWQgb25seSBpbiB0ZXN0cyBvciBTU1JcbiAqL1xuZXhwb3J0IGNvbnN0IG1lbW9yeUxvY2FsU3RvcmFnZVByb3ZpZGVyOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBMT0NBTF9TVE9SQUdFLFxuICAgIHVzZUNsYXNzOiBOYXR1cmFsTWVtb3J5U3RvcmFnZSxcbn07XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { APP_INITIALIZER, inject } from '@angular/core';
|
|
2
|
-
import { NATURAL_SEO_CONFIG, NaturalSeoService } from './seo.service';
|
|
3
|
-
/**
|
|
4
|
-
* Configure and starts `NaturalSeoService`
|
|
5
|
-
*/
|
|
6
|
-
export function provideSeo(config) {
|
|
7
|
-
return [
|
|
8
|
-
{
|
|
9
|
-
provide: NATURAL_SEO_CONFIG,
|
|
10
|
-
useValue: config,
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
provide: APP_INITIALIZER,
|
|
14
|
-
multi: true,
|
|
15
|
-
useFactory: () => {
|
|
16
|
-
// injection required, but works without doing anything else
|
|
17
|
-
inject(NaturalSeoService);
|
|
18
|
-
return () => undefined;
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
];
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvY29tbW9uL3NlcnZpY2VzL3Nlby5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUF3QjtJQUMvQyxPQUFPO1FBQ0g7WUFDSSxPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLFFBQVEsRUFBRSxNQUFNO1NBQ25CO1FBQ0Q7WUFDSSxPQUFPLEVBQUUsZUFBZTtZQUN4QixLQUFLLEVBQUUsSUFBSTtZQUNYLFVBQVUsRUFBRSxHQUFpQixFQUFFO2dCQUMzQiw0REFBNEQ7Z0JBQzVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUUxQixPQUFPLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUMzQixDQUFDO1NBQ0o7S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QVBQX0lOSVRJQUxJWkVSLCBpbmplY3QsIFByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TkFUVVJBTF9TRU9fQ09ORklHLCBOYXR1cmFsU2VvQ29uZmlnLCBOYXR1cmFsU2VvU2VydmljZX0gZnJvbSAnLi9zZW8uc2VydmljZSc7XG5cbi8qKlxuICogQ29uZmlndXJlIGFuZCBzdGFydHMgYE5hdHVyYWxTZW9TZXJ2aWNlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVNlbyhjb25maWc6IE5hdHVyYWxTZW9Db25maWcpOiBQcm92aWRlcltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOQVRVUkFMX1NFT19DT05GSUcsXG4gICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluamVjdGlvbiByZXF1aXJlZCwgYnV0IHdvcmtzIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIGluamVjdChOYXR1cmFsU2VvU2VydmljZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICBdO1xufVxuIl19
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { inject, Injectable, InjectionToken, LOCALE_ID } from '@angular/core';
|
|
3
|
-
import { Meta, Title } from '@angular/platform-browser';
|
|
4
|
-
import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';
|
|
5
|
-
import { NaturalDialogTriggerComponent } from '../../dialog-trigger/dialog-trigger.component';
|
|
6
|
-
import { combineLatest, filter, map, Observable, of, startWith, switchMap } from 'rxjs';
|
|
7
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
export const NATURAL_SEO_CONFIG = new InjectionToken('Configuration for SEO service');
|
|
10
|
-
export function stripTags(str) {
|
|
11
|
-
return str.replace(/<\/?[^>]*>/g, '');
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* This service is responsible to keep up to date the page title and page description according
|
|
15
|
-
* to what is configured in routing or default values.
|
|
16
|
-
*
|
|
17
|
-
* It **must** be injected in the root module of the application to have effects in all modules. And it
|
|
18
|
-
* must be provided a configuration.
|
|
19
|
-
*
|
|
20
|
-
* The full title has the following structure:
|
|
21
|
-
*
|
|
22
|
-
* dialog title - page title - extra part - app name
|
|
23
|
-
*
|
|
24
|
-
* `dialog title` only exists if a `NaturalDialogTriggerComponent` is currently open, and that some SEO is
|
|
25
|
-
* configured for it in the routing.
|
|
26
|
-
*/
|
|
27
|
-
export class NaturalSeoService {
|
|
28
|
-
router = inject(Router);
|
|
29
|
-
titleService = inject(Title);
|
|
30
|
-
metaTagService = inject(Meta);
|
|
31
|
-
document = inject(DOCUMENT);
|
|
32
|
-
locale = inject(LOCALE_ID);
|
|
33
|
-
routeData;
|
|
34
|
-
config = {
|
|
35
|
-
applicationName: '',
|
|
36
|
-
};
|
|
37
|
-
constructor() {
|
|
38
|
-
const configToken = inject(NATURAL_SEO_CONFIG);
|
|
39
|
-
combineLatest({
|
|
40
|
-
config: configToken instanceof Observable ? configToken.pipe(startWith(this.config)) : of(configToken),
|
|
41
|
-
navigationEnd: this.router.events.pipe(filter(event => event instanceof NavigationEnd)),
|
|
42
|
-
})
|
|
43
|
-
.pipe(takeUntilDestroyed(), switchMap(({ config }) => {
|
|
44
|
-
this.config = config;
|
|
45
|
-
const root = this.router.routerState.root.snapshot;
|
|
46
|
-
this.routeData = this.getRouteData(root);
|
|
47
|
-
const seo = this.routeData.seo ?? { title: '' };
|
|
48
|
-
const dialogRouteData = this.getDialogRouteData(root);
|
|
49
|
-
const dialogSeo = dialogRouteData?.seo;
|
|
50
|
-
const basic = this.toBasic(seo, this.routeData);
|
|
51
|
-
const dialogBasic = dialogRouteData && dialogSeo ? this.toBasic(dialogSeo, dialogRouteData) : of(null);
|
|
52
|
-
return combineLatest({ basic, dialogBasic });
|
|
53
|
-
}))
|
|
54
|
-
.subscribe(({ basic, dialogBasic }) => {
|
|
55
|
-
if (dialogBasic) {
|
|
56
|
-
basic = {
|
|
57
|
-
...dialogBasic,
|
|
58
|
-
title: this.join([dialogBasic.title, basic.title]),
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
this.update(basic);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Update the SEO with given info. The extra part and app name will be appended automatically.
|
|
66
|
-
*
|
|
67
|
-
* In most cases, this should not be used. And instead, the SEO should be configured in the routing,
|
|
68
|
-
* possibly with the callback variant for some dynamism.
|
|
69
|
-
*
|
|
70
|
-
* But in rare cases, only the Component is able to build a proper page title, after it gathered everything it
|
|
71
|
-
* needed. For those cases, the Component can inject this service and update the SEO directly.
|
|
72
|
-
*/
|
|
73
|
-
update(seo) {
|
|
74
|
-
// Title
|
|
75
|
-
const parts = [
|
|
76
|
-
seo.title,
|
|
77
|
-
this.config.extraPart && this.routeData ? this.config.extraPart(this.routeData) : '',
|
|
78
|
-
this.config.applicationName,
|
|
79
|
-
];
|
|
80
|
-
const title = this.join(parts);
|
|
81
|
-
this.titleService.setTitle(title);
|
|
82
|
-
// Description
|
|
83
|
-
const description = seo?.description ?? this.config.defaultDescription;
|
|
84
|
-
this.updateTag('description', description);
|
|
85
|
-
// Robots
|
|
86
|
-
const robots = seo?.robots ?? this.config.defaultRobots;
|
|
87
|
-
this.updateTag('robots', robots);
|
|
88
|
-
// Canonical
|
|
89
|
-
// Add language in url (after domain) if some languages are provided only
|
|
90
|
-
const language = this.config.languages?.length && this.locale ? this.locale.split('-')[0] : '';
|
|
91
|
-
const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist ?? []);
|
|
92
|
-
this.updateLinkTag({ rel: 'canonical', href: this.getUrl(urlParts, language) });
|
|
93
|
-
this.updateAlternates(urlParts);
|
|
94
|
-
}
|
|
95
|
-
updateAlternates(urlParts) {
|
|
96
|
-
this.config.languages?.forEach(language => {
|
|
97
|
-
this.updateLinkTag({ rel: 'alternate', href: this.getUrl(urlParts, language), hreflang: language });
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
getUrlParts(whiteListedParams) {
|
|
101
|
-
let url = 'https://' + this.document.defaultView?.window.location.hostname;
|
|
102
|
-
const urlTree = this.router.parseUrl(this.router.url);
|
|
103
|
-
// need better like something recursive ?
|
|
104
|
-
if (urlTree.root.hasChildren()) {
|
|
105
|
-
const segments = urlTree.root.children.primary?.segments;
|
|
106
|
-
if (segments && segments.length > 0) {
|
|
107
|
-
url += '/' + segments.map(segment => segment.path).join('/');
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Query Params
|
|
111
|
-
let params = '';
|
|
112
|
-
for (const whiteListedParam of whiteListedParams) {
|
|
113
|
-
if (whiteListedParam in urlTree.queryParams) {
|
|
114
|
-
const key = encodeURIComponent(whiteListedParam);
|
|
115
|
-
const value = encodeURIComponent(urlTree.queryParams[whiteListedParam]);
|
|
116
|
-
if (params.length) {
|
|
117
|
-
params += '&';
|
|
118
|
-
}
|
|
119
|
-
params += `${key}=${value}`;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (params.length) {
|
|
123
|
-
params = '?' + params;
|
|
124
|
-
}
|
|
125
|
-
return { url, params };
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add language between domain and uri https://example.com/fr/folder/page
|
|
129
|
-
*/
|
|
130
|
-
getUrl(urlParts, language) {
|
|
131
|
-
let url = urlParts.url;
|
|
132
|
-
if (language) {
|
|
133
|
-
url = this.addLanguageSegment(url, language);
|
|
134
|
-
}
|
|
135
|
-
if (urlParts.params) {
|
|
136
|
-
url += urlParts.params;
|
|
137
|
-
}
|
|
138
|
-
return url;
|
|
139
|
-
}
|
|
140
|
-
addLanguageSegment(url, language) {
|
|
141
|
-
const urlObj = new URL(url);
|
|
142
|
-
const newPath = urlObj.pathname === '/' ? `/${language}` : `/${language}${urlObj.pathname}`;
|
|
143
|
-
return urlObj.origin + newPath + urlObj.search + urlObj.hash;
|
|
144
|
-
}
|
|
145
|
-
join(parts) {
|
|
146
|
-
return parts.filter(s => !!s).join(' - ');
|
|
147
|
-
}
|
|
148
|
-
updateTag(name, value) {
|
|
149
|
-
if (value) {
|
|
150
|
-
this.metaTagService.updateTag({
|
|
151
|
-
name: name,
|
|
152
|
-
value: stripTags(value),
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
this.metaTagService.removeTag(`name="${name}"`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
updateLinkTag(definition) {
|
|
160
|
-
const linkElement = this.document.head.querySelector(this.parseSelector(definition)) ??
|
|
161
|
-
this.document.head.appendChild(this.document.createElement('link'));
|
|
162
|
-
if (linkElement) {
|
|
163
|
-
Object.keys(definition).forEach((attribute) => {
|
|
164
|
-
linkElement.setAttribute(attribute, definition[attribute]);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Returns selector to use in querySelector to get the given link
|
|
170
|
-
*/
|
|
171
|
-
parseSelector(definition) {
|
|
172
|
-
let attributes = 'link';
|
|
173
|
-
Object.keys(definition).forEach(attr => {
|
|
174
|
-
if (attr !== 'href') {
|
|
175
|
-
attributes += `[${attr}="${definition[attr]}"]`;
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
return attributes;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Returns the data from the most deep/specific activated route
|
|
182
|
-
*/
|
|
183
|
-
getRouteData(route) {
|
|
184
|
-
if (route.firstChild) {
|
|
185
|
-
return this.getRouteData(route.firstChild);
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
return route.data;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Returns the data from the `NaturalDialogTriggerComponent` if one is open
|
|
193
|
-
*/
|
|
194
|
-
getDialogRouteData(route) {
|
|
195
|
-
if (route.component === NaturalDialogTriggerComponent && route.outlet !== PRIMARY_OUTLET) {
|
|
196
|
-
return route.data;
|
|
197
|
-
}
|
|
198
|
-
for (const child of route.children) {
|
|
199
|
-
const data = this.getDialogRouteData(child);
|
|
200
|
-
if (data) {
|
|
201
|
-
return data;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
toBasic(seo, routeData) {
|
|
207
|
-
if (typeof seo === 'function') {
|
|
208
|
-
const result = seo(routeData);
|
|
209
|
-
return result instanceof Observable ? result : of(result);
|
|
210
|
-
}
|
|
211
|
-
else if ('resolve' in seo) {
|
|
212
|
-
if (!('model' in routeData)) {
|
|
213
|
-
throw new Error('Could not find resolved data `model` for SEO service');
|
|
214
|
-
}
|
|
215
|
-
const model = routeData.model;
|
|
216
|
-
return (model instanceof Observable ? model : of(model)).pipe(map(value => {
|
|
217
|
-
return {
|
|
218
|
-
title: value?.fullName ?? value?.name ?? '',
|
|
219
|
-
description: value?.description,
|
|
220
|
-
robots: seo.robots,
|
|
221
|
-
};
|
|
222
|
-
}));
|
|
223
|
-
}
|
|
224
|
-
return of(seo);
|
|
225
|
-
}
|
|
226
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
227
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, providedIn: 'root' });
|
|
228
|
-
}
|
|
229
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSeoService, decorators: [{
|
|
230
|
-
type: Injectable,
|
|
231
|
-
args: [{
|
|
232
|
-
providedIn: 'root',
|
|
233
|
-
}]
|
|
234
|
-
}], ctorParameters: () => [] });
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvc2VvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQStCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDNUYsT0FBTyxFQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUE2RzlELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFtQiwrQkFBK0IsQ0FBQyxDQUFDO0FBRXhHLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBVztJQUNqQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFZRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUNULE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixjQUFjLEdB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LENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7YUFBTSxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzVFLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBRTlCLE9BQU8sQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDekQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNSLE9BQU87b0JBQ0gsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFO29CQUMzQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVc7b0JBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtpQkFDckIsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDTixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQzt1R0EvT1EsaUJBQWlCOzJHQUFqQixpQkFBaUIsY0FGZCxNQUFNOzsyRkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgTE9DQUxFX0lEfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWV0YSwgVGl0bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBEYXRhLCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudH0gZnJvbSAnLi4vLi4vZGlhbG9nLXRyaWdnZXIvZGlhbG9nLXRyaWdnZXIuY29tcG9uZW50JztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzdGFydFdpdGgsIHN3aXRjaE1hcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvID0gTmF0dXJhbFNlb0Jhc2ljIHwgTmF0dXJhbFNlb0NhbGxiYWNrIHwgTmF0dXJhbFNlb1Jlc29sdmU7XG5cbi8qKlxuICogVHlwaWNhbGx5IHVzZWQgZm9yIFwic3RhdGljXCIgcGFnZXMgd2hlcmUgdGhlcmUgaXMgbm90IGEgc2luZ2xlIHJlc29sdmVkIG9iamVjdC4gU29cbiAqIGFsbCBwYWdlcyBzdWNoIGFzIFwiQWJvdXRcIiwgb3IgbGlzdCBvZiBvYmplY3RzIChsaXN0IG9mIHJpc2tzLCBldGMuKS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gdXNlZCB2YXJpYW50LlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQmFzaWMgPSBSb2JvdHMgJiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhZ2UgdGl0bGUsIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aCBhcHBsaWNhdGlvbiBuYW1lXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElmIGdpdmVuIHdpbGwgYmUgdXNlZCBhcyBwYWdlIGRlc2NyaXB0aW9uLCBvdGhlcndpc2UgZmFsbGJhY2sgb24gZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwYXJhbWV0ZXJzIGluY2x1ZGVkIGluIHRoZSBjYW5vbmljYWwgdGFnJ3MgdXJsXG4gICAgICovXG4gICAgY2Fub25pY2FsUXVlcnlQYXJhbXNXaGl0ZWxpc3Q/OiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgTmF0dXJhbExpbmtEZWZpbml0aW9uID0ge1xuICAgIGNoYXJzZXQ/OiBzdHJpbmc7XG4gICAgY3Jvc3NvcmlnaW4/OiBzdHJpbmc7XG4gICAgaHJlZj86IHN0cmluZztcbiAgICBocmVmbGFuZz86IHN0cmluZztcbiAgICBtZWRpYT86IHN0cmluZztcbiAgICByZWw/OiBzdHJpbmc7XG4gICAgcmV2Pzogc3RyaW5nO1xuICAgIHNpemVzPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xufSAmIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4vKipcbiAqIFR5cGljYWxseSB1c2VkIGZvciBhIFwiZHluYW1pY1wiIHBhZ2Ugd2hlcmUgYSBzaW5nbGUgb2JqZWN0IGlzIHJlc29sdmVkLiBTbyBhIGRldGFpbCBwYWdlLCBzdWNoXG4gKiBhcyB0aGUgZGV0YWlsIG9mIGEgcmlzayBhbmQgc28gb24uXG4gKi9cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW9SZXNvbHZlID0gUm9ib3RzICYge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgYG1vZGVsYCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdmVkIGRhdGEgdG8gZmluZCB0aGUgcmVzb2x2ZWQgb2JqZWN0LiBUaGUgZnVsbE5hbWVcbiAgICAgKiBvciBuYW1lIG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGZvciBwYWdlIHRpdGxlLCBhbmQgdGhlIG9iamVjdCBkZXNjcmlwdGlvbiwgaWYgYW55LFxuICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgcGFnZSBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICByZXNvbHZlOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSYXJlbHkgdXNlZCBmb3IgYSBwYWdlIHRoYXQgaGFzIHZlcnkgc3BlY2lmaWMgbmVlZHMgYW5kIG5lZWQgdG8gYnVpbGQgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGluIGEgY3VzdG9tIHdheS5cbiAqIFRoZSBjYWxsYmFjayBiYWNrIHdpbGwgYmUgZ2l2ZW4gdGhlIHJlc29sdmVkIGRhdGEsIGFuZCBpdCBpcyB1cCB0byB0aGUgY2FsbGJhY2sgdG8gZmluZCB3aGF0ZXZlciBpdCBuZWVkcy5cbiAqL1xuZXhwb3J0IHR5cGUgTmF0dXJhbFNlb0NhbGxiYWNrID0gKHJvdXRlRGF0YTogRGF0YSkgPT4gTmF0dXJhbFNlb0Jhc2ljIHwgT2JzZXJ2YWJsZTxOYXR1cmFsU2VvQmFzaWM+O1xuXG4vKipcbiAqIFR5cGljYWxseSB1c2VkIHRvIHR5cGUgdGhlIHJvdXRpbmcgZGF0YSByZWNlaXZlZCBpbiB0aGUgY29tcG9uZW50LCBlZzpcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3REZXRhaWw8TXlTZXJ2aWNlLCBOYXR1cmFsU2VvUmVzb2x2ZURhdGE+IHt9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTmF0dXJhbFNlb1Jlc29sdmVEYXRhID0ge1xuICAgIHNlbzogTmF0dXJhbFNlb0Jhc2ljO1xufTtcblxudHlwZSBSb2JvdHMgPSB7XG4gICAgLyoqXG4gICAgICogSWYgZ2l2ZW4gd2lsbCBiZSB1c2VkIGFzIHJvYm90cyBtZXRhIHRhZywgb3RoZXJ3aXNlIGZhbGxiYWNrIG9uIGRlZmF1bHQgdmFsdWVcbiAgICAgKi9cbiAgICByb2JvdHM/OiBzdHJpbmc7XG59O1xuXG50eXBlIE5hdHVyYWxTZW9Db25maWdQbGFpbiA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB3aWxsIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHBhZ2UgdGl0bGVcbiAgICAgKi9cbiAgICByZWFkb25seSBhcHBsaWNhdGlvbk5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIGRlc2NyaXB0aW9uIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZSBmb3Igcm9ib3RzIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdFJvYm90cz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElmIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcm91dGUgYW5kIG11c3QgcmV0dXJuIGEgc3RyaW5nIHRoYXQgd2lsbFxuICAgICAqIGJlIGluc2VydGVkIGJldHdlZW4gdGhlIHBhZ2UgdGl0bGUgYW5kIHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgICAqXG4gICAgICogSXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlIHRpdGxlIHdpdGggaW5mbyB0aGF0IGFyZSBvZnRlbiwgYnV0IG5vdCBuZWNlc3NhcmlseSBhbHdheXMsXG4gICAgICogYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5IHVzZWQgZm9yIHRoZSBzaXRlL3N0YXRlIGluIE9LcGlsb3QuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXh0cmFQYXJ0PzogKHJvdXRlRGF0YTogRGF0YSkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSB0YWdzXG4gICAgICogPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgaHJlZmxhbmc9XCJlblwiIGhyZWY9XCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9lbi9wYWdlXCI+XG4gICAgICovXG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VzPzogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQ29uZmlnID0gTmF0dXJhbFNlb0NvbmZpZ1BsYWluIHwgT2JzZXJ2YWJsZTxOYXR1cmFsU2VvQ29uZmlnUGxhaW4+O1xuZXhwb3J0IGNvbnN0IE5BVFVSQUxfU0VPX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXR1cmFsU2VvQ29uZmlnPignQ29uZmlndXJhdGlvbiBmb3IgU0VPIHNlcnZpY2UnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVGFncyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC88XFwvP1tePl0qPi9nLCAnJyk7XG59XG5cbnR5cGUgTW9kZWwgPSB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBmdWxsTmFtZT86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5cbnR5cGUgUmVzb2x2ZWREYXRhID0ge1xuICAgIG1vZGVsPzogTW9kZWwgfCBPYnNlcnZhYmxlPE1vZGVsPjtcbn07XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIGlzIHJlc3BvbnNpYmxlIHRvIGtlZXAgdXAgdG8gZGF0ZSB0aGUgcGFnZSB0aXRsZSBhbmQgcGFnZSBkZXNjcmlwdGlvbiBhY2NvcmRpbmdcbiAqIHRvIHdoYXQgaXMgY29uZmlndXJlZCBpbiByb3V0aW5nIG9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEl0ICoqbXVzdCoqIGJlIGluamVjdGVkIGluIHRoZSByb290IG1vZHVsZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSBlZmZlY3RzIGluIGFsbCBtb2R1bGVzLiBBbmQgaXRcbiAqIG11c3QgYmUgcHJvdmlkZWQgYSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoZSBmdWxsIHRpdGxlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAgICAgZGlhbG9nIHRpdGxlIC0gcGFnZSB0aXRsZSAtIGV4dHJhIHBhcnQgLSBhcHAgbmFtZVxuICpcbiAqIGBkaWFsb2cgdGl0bGVgIG9ubHkgZXhpc3RzIGlmIGEgYE5hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50YCBpcyBjdXJyZW50bHkgb3BlbiwgYW5kIHRoYXQgc29tZSBTRU8gaXNcbiAqIGNvbmZpZ3VyZWQgZm9yIGl0IGluIHRoZSByb3V0aW5nLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsU2VvU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZSA9IGluamVjdChUaXRsZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhVGFnU2VydmljZSA9IGluamVjdChNZXRhKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIGxvY2FsZSA9IGluamVjdChMT0NBTEVfSUQpO1xuXG4gICAgcHJpdmF0ZSByb3V0ZURhdGE/OiBEYXRhO1xuICAgIHByaXZhdGUgY29uZmlnOiBOYXR1cmFsU2VvQ29uZmlnUGxhaW4gPSB7XG4gICAgICAgIGFwcGxpY2F0aW9uTmFtZTogJycsXG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgY29uZmlnVG9rZW4gPSBpbmplY3QoTkFUVVJBTF9TRU9fQ09ORklHKTtcblxuICAgICAgICBjb21iaW5lTGF0ZXN0KHtcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnVG9rZW4gaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gY29uZmlnVG9rZW4ucGlwZShzdGFydFdpdGgodGhpcy5jb25maWcpKSA6IG9mKGNvbmZpZ1Rva2VuKSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25FbmQ6IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoe2NvbmZpZ30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290LnNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlRGF0YSA9IHRoaXMuZ2V0Um91dGVEYXRhKHJvb3QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbzogTmF0dXJhbFNlbyA9IHRoaXMucm91dGVEYXRhLnNlbyA/PyB7dGl0bGU6ICcnfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUm91dGVEYXRhID0gdGhpcy5nZXREaWFsb2dSb3V0ZURhdGEocm9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1NlbzogTmF0dXJhbFNlbyA9IGRpYWxvZ1JvdXRlRGF0YT8uc2VvO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljID0gdGhpcy50b0Jhc2ljKHNlbywgdGhpcy5yb3V0ZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2dCYXNpYyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dSb3V0ZURhdGEgJiYgZGlhbG9nU2VvID8gdGhpcy50b0Jhc2ljKGRpYWxvZ1NlbywgZGlhbG9nUm91dGVEYXRhKSA6IG9mKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtiYXNpYywgZGlhbG9nQmFzaWN9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHtiYXNpYywgZGlhbG9nQmFzaWN9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxvZ0Jhc2ljKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2ljID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGlhbG9nQmFzaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5qb2luKFtkaWFsb2dCYXNpYy50aXRsZSwgYmFzaWMudGl0bGVdKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShiYXNpYyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIFNFTyB3aXRoIGdpdmVuIGluZm8uIFRoZSBleHRyYSBwYXJ0IGFuZCBhcHAgbmFtZSB3aWxsIGJlIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZC4gQW5kIGluc3RlYWQsIHRoZSBTRU8gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHJvdXRpbmcsXG4gICAgICogcG9zc2libHkgd2l0aCB0aGUgY2FsbGJhY2sgdmFyaWFudCBmb3Igc29tZSBkeW5hbWlzbS5cbiAgICAgKlxuICAgICAqIEJ1dCBpbiByYXJlIGNhc2VzLCBvbmx5IHRoZSBDb21wb25lbnQgaXMgYWJsZSB0byBidWlsZCBhIHByb3BlciBwYWdlIHRpdGxlLCBhZnRlciBpdCBnYXRoZXJlZCBldmVyeXRoaW5nIGl0XG4gICAgICogbmVlZGVkLiBGb3IgdGhvc2UgY2FzZXMsIHRoZSBDb21wb25lbnQgY2FuIGluamVjdCB0aGlzIHNlcnZpY2UgYW5kIHVwZGF0ZSB0aGUgU0VPIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUoc2VvOiBOYXR1cmFsU2VvQmFzaWMpOiB2b2lkIHtcbiAgICAgICAgLy8gVGl0bGVcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgICBzZW8udGl0bGUsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRyYVBhcnQgJiYgdGhpcy5yb3V0ZURhdGEgPyB0aGlzLmNvbmZpZy5leHRyYVBhcnQodGhpcy5yb3V0ZURhdGEpIDogJycsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbk5hbWUsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmpvaW4ocGFydHMpO1xuICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aXRsZSk7XG5cbiAgICAgICAgLy8gRGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZW8/LmRlc2NyaXB0aW9uID8/IHRoaXMuY29uZmlnLmRlZmF1bHREZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy51cGRhdGVUYWcoJ2Rlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24pO1xuXG4gICAgICAgIC8vIFJvYm90c1xuICAgICAgICBjb25zdCByb2JvdHMgPSBzZW8/LnJvYm90cyA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0Um9ib3RzO1xuICAgICAgICB0aGlzLnVwZGF0ZVRhZygncm9ib3RzJywgcm9ib3RzKTtcblxuICAgICAgICAvLyBDYW5vbmljYWxcbiAgICAgICAgLy8gQWRkIGxhbmd1YWdlIGluIHVybCAoYWZ0ZXIgZG9tYWluKSBpZiBzb21lIGxhbmd1YWdlcyBhcmUgcHJvdmlkZWQgb25seVxuICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29uZmlnLmxhbmd1YWdlcz8ubGVuZ3RoICYmIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuc3BsaXQoJy0nKVswXSA6ICcnO1xuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0VXJsUGFydHMoc2VvLmNhbm9uaWNhbFF1ZXJ5UGFyYW1zV2hpdGVsaXN0ID8/IFtdKTtcbiAgICAgICAgdGhpcy51cGRhdGVMaW5rVGFnKHtyZWw6ICdjYW5vbmljYWwnLCBocmVmOiB0aGlzLmdldFVybCh1cmxQYXJ0cywgbGFuZ3VhZ2UpfSk7XG4gICAgICAgIHRoaXMudXBkYXRlQWx0ZXJuYXRlcyh1cmxQYXJ0cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBbHRlcm5hdGVzKHVybFBhcnRzOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZy5sYW5ndWFnZXM/LmZvckVhY2gobGFuZ3VhZ2UgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMaW5rVGFnKHtyZWw6ICdhbHRlcm5hdGUnLCBocmVmOiB0aGlzLmdldFVybCh1cmxQYXJ0cywgbGFuZ3VhZ2UpLCBocmVmbGFuZzogbGFuZ3VhZ2V9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmxQYXJ0cyh3aGl0ZUxpc3RlZFBhcmFtczogc3RyaW5nW10pOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSB7XG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly8nICsgdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5yb3V0ZXIudXJsKTtcblxuICAgICAgICAvLyBuZWVkIGJldHRlciBsaWtlIHNvbWV0aGluZyByZWN1cnNpdmUgP1xuICAgICAgICBpZiAodXJsVHJlZS5yb290Lmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdXJsVHJlZS5yb290LmNoaWxkcmVuLnByaW1hcnk/LnNlZ21lbnRzO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnRzICYmIHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gJy8nICsgc2VnbWVudHMubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKS5qb2luKCcvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWVyeSBQYXJhbXNcbiAgICAgICAgbGV0IHBhcmFtcyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHdoaXRlTGlzdGVkUGFyYW0gb2Ygd2hpdGVMaXN0ZWRQYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh3aGl0ZUxpc3RlZFBhcmFtIGluIHVybFRyZWUucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQod2hpdGVMaXN0ZWRQYXJhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodXJsVHJlZS5xdWVyeVBhcmFtc1t3aGl0ZUxpc3RlZFBhcmFtXSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zICs9IGAke2tleX09JHt2YWx1ZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9ICc/JyArIHBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7dXJsLCBwYXJhbXN9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBsYW5ndWFnZSBiZXR3ZWVuIGRvbWFpbiBhbmQgdXJpIGh0dHBzOi8vZXhhbXBsZS5jb20vZnIvZm9sZGVyL3BhZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFVybCh1cmxQYXJ0czoge3VybDogc3RyaW5nOyBwYXJhbXM6IHN0cmluZ30sIGxhbmd1YWdlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IHVybFBhcnRzLnVybDtcblxuICAgICAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHVybCA9IHRoaXMuYWRkTGFuZ3VhZ2VTZWdtZW50KHVybCwgbGFuZ3VhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybFBhcnRzLnBhcmFtcykge1xuICAgICAgICAgICAgdXJsICs9IHVybFBhcnRzLnBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRMYW5ndWFnZVNlZ21lbnQodXJsOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSB1cmxPYmoucGF0aG5hbWUgPT09ICcvJyA/IGAvJHtsYW5ndWFnZX1gIDogYC8ke2xhbmd1YWdlfSR7dXJsT2JqLnBhdGhuYW1lfWA7XG4gICAgICAgIHJldHVybiB1cmxPYmoub3JpZ2luICsgbmV3UGF0aCArIHVybE9iai5zZWFyY2ggKyB1cmxPYmouaGFzaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGpvaW4ocGFydHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmZpbHRlcihzID0+ICEhcykuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUYWcobmFtZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdHJpcFRhZ3ModmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT1cIiR7bmFtZX1cImApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVMaW5rVGFnKGRlZmluaXRpb246IE5hdHVyYWxMaW5rRGVmaW5pdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcjxIVE1MTGlua0VsZW1lbnQ+KHRoaXMucGFyc2VTZWxlY3RvcihkZWZpbml0aW9uKSkgPz9cbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7XG5cbiAgICAgICAgaWYgKGxpbmtFbGVtZW50KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZpbml0aW9uKS5mb3JFYWNoKChhdHRyaWJ1dGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRlZmluaXRpb25bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgc2VsZWN0b3IgdG8gdXNlIGluIHF1ZXJ5U2VsZWN0b3IgdG8gZ2V0IHRoZSBnaXZlbiBsaW5rXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVNlbGVjdG9yKGRlZmluaXRpb246IE5hdHVyYWxMaW5rRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGxldCBhdHRyaWJ1dGVzID0gJ2xpbmsnO1xuICAgICAgICBPYmplY3Qua2V5cyhkZWZpbml0aW9uKS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgICAgICAgaWYgKGF0dHIgIT09ICdocmVmJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgKz0gYFske2F0dHJ9PVwiJHtkZWZpbml0aW9uW2F0dHJdfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgZnJvbSB0aGUgbW9zdCBkZWVwL3NwZWNpZmljIGFjdGl2YXRlZCByb3V0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Um91dGVEYXRhKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGF0YSB7XG4gICAgICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSb3V0ZURhdGEocm91dGUuZmlyc3RDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcm91dGUuZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgZnJvbSB0aGUgYE5hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50YCBpZiBvbmUgaXMgb3BlblxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGlhbG9nUm91dGVEYXRhKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGF0YSB8IG51bGwge1xuICAgICAgICBpZiAocm91dGUuY29tcG9uZW50ID09PSBOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudCAmJiByb3V0ZS5vdXRsZXQgIT09IFBSSU1BUllfT1VUTEVUKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91dGUuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERpYWxvZ1JvdXRlRGF0YShjaGlsZCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b0Jhc2ljKHNlbzogTmF0dXJhbFNlbywgcm91dGVEYXRhOiBSZXNvbHZlZERhdGEpOiBPYnNlcnZhYmxlPE5hdHVyYWxTZW9CYXNpYz4ge1xuICAgICAgICBpZiAodHlwZW9mIHNlbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VvKHJvdXRlRGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHJlc3VsdCA6IG9mKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3Jlc29sdmUnIGluIHNlbykge1xuICAgICAgICAgICAgaWYgKCEoJ21vZGVsJyBpbiByb3V0ZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCByZXNvbHZlZCBkYXRhIGBtb2RlbGAgZm9yIFNFTyBzZXJ2aWNlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gcm91dGVEYXRhLm1vZGVsO1xuXG4gICAgICAgICAgICByZXR1cm4gKG1vZGVsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IG1vZGVsIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdmFsdWU/LmZ1bGxOYW1lID8/IHZhbHVlPy5uYW1lID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlPy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvYm90czogc2VvLnJvYm90cyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Yoc2VvKTtcbiAgICB9XG59XG4iXX0=
|