valtech-components 2.0.419 → 2.0.420
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/atoms/button/button.component.mjs +30 -102
- package/esm2022/lib/components/atoms/countdown/countdown.component.mjs +2 -7
- package/esm2022/lib/components/atoms/display/display.component.mjs +18 -101
- package/esm2022/lib/components/atoms/image/image.component.mjs +2 -5
- package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +2 -12
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +4 -29
- package/esm2022/lib/components/atoms/text/text.component.mjs +49 -171
- package/esm2022/lib/components/atoms/title/title.component.mjs +23 -65
- package/esm2022/lib/components/atoms/title/types.mjs +7 -19
- package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +7 -53
- package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +7 -26
- package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +7 -42
- package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +12 -41
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -28
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +2 -5
- package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -6
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +5 -31
- package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +2 -23
- package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +2 -29
- package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +4 -6
- package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +16 -40
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +25 -125
- package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +4 -6
- package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +2 -10
- package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +2 -4
- package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +2 -23
- package/esm2022/lib/components/molecules/plain-code-box/plain-code-box.component.mjs +3 -6
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +9 -12
- package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +3 -11
- package/esm2022/lib/components/molecules/range-input/range-input.component.mjs +4 -25
- package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -34
- package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +11 -20
- package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +4 -6
- package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +1 -6
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -28
- package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +7 -41
- package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +2 -27
- package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +2 -10
- package/esm2022/lib/components/molecules/toggle-input/toggle-input.component.mjs +7 -37
- package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +1 -12
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +8 -54
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +1 -3
- package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -5
- package/esm2022/lib/services/locale.service.mjs +75 -0
- package/esm2022/lib/services/types.mjs +5 -3
- package/esm2022/public-api.mjs +2 -7
- package/fesm2022/valtech-components.mjs +366 -2279
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/button/button.component.d.ts +12 -37
- package/lib/components/atoms/countdown/countdown.component.d.ts +0 -1
- package/lib/components/atoms/display/display.component.d.ts +8 -60
- package/lib/components/atoms/image/image.component.d.ts +0 -2
- package/lib/components/atoms/price-tag/price-tag.component.d.ts +0 -1
- package/lib/components/atoms/qr-code/qr-code.component.d.ts +2 -6
- package/lib/components/atoms/text/text.component.d.ts +20 -68
- package/lib/components/atoms/title/title.component.d.ts +7 -12
- package/lib/components/atoms/title/types.d.ts +11 -24
- package/lib/components/molecules/accordion/accordion.component.d.ts +2 -9
- package/lib/components/molecules/alert-box/alert-box.component.d.ts +3 -8
- package/lib/components/molecules/breadcrumb/breadcrumb.component.d.ts +2 -8
- package/lib/components/molecules/check-input/check-input.component.d.ts +2 -10
- package/lib/components/molecules/chip-group/chip-group.component.d.ts +2 -8
- package/lib/components/molecules/code-display/code-display.component.d.ts +0 -2
- package/lib/components/molecules/command-display/command-display.component.d.ts +0 -3
- package/lib/components/molecules/comment/comment.component.d.ts +2 -6
- package/lib/components/molecules/currency-input/currency-input.component.d.ts +0 -3
- package/lib/components/molecules/date-range-input/date-range-input.component.d.ts +0 -3
- package/lib/components/molecules/expandable-text/expandable-text.component.d.ts +0 -1
- package/lib/components/molecules/glow-card/glow-card.component.d.ts +5 -9
- package/lib/components/molecules/language-selector/language-selector.component.d.ts +7 -19
- package/lib/components/molecules/multi-select-search/multi-select-search.component.d.ts +0 -2
- package/lib/components/molecules/number-stepper/number-stepper.component.d.ts +0 -1
- package/lib/components/molecules/participant-card/participant-card.component.d.ts +0 -1
- package/lib/components/molecules/phone-input/phone-input.component.d.ts +0 -3
- package/lib/components/molecules/plain-code-box/plain-code-box.component.d.ts +0 -3
- package/lib/components/molecules/popover-selector/popover-selector.component.d.ts +3 -4
- package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +0 -1
- package/lib/components/molecules/range-input/range-input.component.d.ts +3 -8
- package/lib/components/molecules/segment-control/segment-control.component.d.ts +2 -8
- package/lib/components/molecules/select-input/select-input.component.d.ts +2 -3
- package/lib/components/molecules/select-search/select-search.component.d.ts +0 -2
- package/lib/components/molecules/share-buttons/share-buttons.component.d.ts +0 -1
- package/lib/components/molecules/stepper/stepper.component.d.ts +2 -8
- package/lib/components/molecules/tabs/tabs.component.d.ts +2 -8
- package/lib/components/molecules/textarea-input/textarea-input.component.d.ts +2 -6
- package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +0 -1
- package/lib/components/molecules/toggle-input/toggle-input.component.d.ts +2 -8
- package/lib/components/molecules/winner-display/winner-display.component.d.ts +0 -1
- package/lib/components/organisms/comment-section/comment-section.component.d.ts +2 -6
- package/lib/components/organisms/data-table/data-table.component.d.ts +0 -1
- package/lib/components/organisms/wizard/wizard.component.d.ts +0 -2
- package/lib/services/locale.service.d.ts +52 -0
- package/lib/services/types.d.ts +1 -6
- package/package.json +1 -1
- package/public-api.d.ts +1 -5
- package/esm2022/lib/services/lang-provider/components/lang-settings.mjs +0 -13
- package/esm2022/lib/services/lang-provider/content.mjs +0 -156
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +0 -530
- package/esm2022/lib/services/lang-provider/types.mjs +0 -23
- package/esm2022/lib/shared/utils/content.mjs +0 -186
- package/esm2022/lib/shared/utils/simple-content.mjs +0 -119
- package/lib/services/lang-provider/components/lang-settings.d.ts +0 -3
- package/lib/services/lang-provider/content.d.ts +0 -17
- package/lib/services/lang-provider/lang-provider.service.d.ts +0 -264
- package/lib/services/lang-provider/types.d.ts +0 -30
- package/lib/shared/utils/content.d.ts +0 -199
- package/lib/shared/utils/simple-content.d.ts +0 -120
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { map } from 'rxjs';
|
|
2
|
-
/**
|
|
3
|
-
* Create a reactive content observable from a content key.
|
|
4
|
-
* This is the primary utility for the `fromContent` pattern with unified support
|
|
5
|
-
* for both simple content and content with interpolation.
|
|
6
|
-
*
|
|
7
|
-
* @param langService - The language service instance
|
|
8
|
-
* @param config - Content configuration with optional interpolation
|
|
9
|
-
* @returns Observable that emits the content string and updates on language change
|
|
10
|
-
*
|
|
11
|
-
* @example Simple content:
|
|
12
|
-
* ```typescript
|
|
13
|
-
* // Component-specific content
|
|
14
|
-
* this.title$ = fromContent(this.langService, {
|
|
15
|
-
* className: 'HeaderComponent',
|
|
16
|
-
* key: 'title',
|
|
17
|
-
* fallback: 'Default Title'
|
|
18
|
-
* });
|
|
19
|
-
*
|
|
20
|
-
* // Global content (no className needed)
|
|
21
|
-
* this.saveButton$ = fromContent(this.langService, {
|
|
22
|
-
* key: 'save'
|
|
23
|
-
* });
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @example Content with interpolation:
|
|
27
|
-
* ```typescript
|
|
28
|
-
* // Content: "Hello {name}, you have {count} messages"
|
|
29
|
-
* this.greeting$ = fromContent(this.langService, {
|
|
30
|
-
* className: 'WelcomeComponent',
|
|
31
|
-
* key: 'greeting',
|
|
32
|
-
* interpolation: { name: 'John', count: 5 }
|
|
33
|
-
* });
|
|
34
|
-
* // Results in: "Hello John, you have 5 messages"
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
export function fromContent(langService, config) {
|
|
38
|
-
// Use _global as default className if not provided
|
|
39
|
-
const finalClassName = config.className || '_global';
|
|
40
|
-
const contentObservable = langService.getContent(finalClassName, config.key, config.fallback);
|
|
41
|
-
// If interpolation is provided, apply it
|
|
42
|
-
if (config.interpolation) {
|
|
43
|
-
return contentObservable.pipe(map(content => interpolateContent(content, config.interpolation)));
|
|
44
|
-
}
|
|
45
|
-
return contentObservable;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Create a reactive content observable with interpolation support.
|
|
49
|
-
*
|
|
50
|
-
* @deprecated Use fromContent() with interpolation property instead.
|
|
51
|
-
* This method is kept for backward compatibility.
|
|
52
|
-
*
|
|
53
|
-
* @param langService - The language service instance
|
|
54
|
-
* @param config - Interpolated content configuration
|
|
55
|
-
* @returns Observable that emits the interpolated content string
|
|
56
|
-
*
|
|
57
|
-
* @example Migration:
|
|
58
|
-
* ```typescript
|
|
59
|
-
* // OLD (deprecated):
|
|
60
|
-
* this.greeting$ = fromContentWithInterpolation(this.langService, {
|
|
61
|
-
* className: 'WelcomeComponent',
|
|
62
|
-
* key: 'greeting',
|
|
63
|
-
* interpolation: { name: 'John', count: 5 }
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* // NEW (recommended):
|
|
67
|
-
* this.greeting$ = fromContent(this.langService, {
|
|
68
|
-
* className: 'WelcomeComponent',
|
|
69
|
-
* key: 'greeting',
|
|
70
|
-
* interpolation: { name: 'John', count: 5 }
|
|
71
|
-
* });
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
export function fromContentWithInterpolation(langService, config) {
|
|
75
|
-
// Delegate to the unified fromContent method
|
|
76
|
-
return fromContent(langService, config);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Create multiple reactive content observables at once.
|
|
80
|
-
* Useful when a component needs several content strings.
|
|
81
|
-
*
|
|
82
|
-
* @param langService - The language service instance
|
|
83
|
-
* @param className - The component class name
|
|
84
|
-
* @param keys - Array of content keys to retrieve
|
|
85
|
-
* @returns Observable that emits an object with all requested content
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* ```typescript
|
|
89
|
-
* this.content$ = fromMultipleContent(this.langService, 'FormComponent', [
|
|
90
|
-
* 'title', 'submitButton', 'cancelButton'
|
|
91
|
-
* ]);
|
|
92
|
-
*
|
|
93
|
-
* // In template
|
|
94
|
-
* <ng-container *ngIf="content$ | async as content">
|
|
95
|
-
* <h2>{{ content.title }}</h2>
|
|
96
|
-
* <button>{{ content.submitButton }}</button>
|
|
97
|
-
* <button>{{ content.cancelButton }}</button>
|
|
98
|
-
* </ng-container>
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
|
-
export function fromMultipleContent(langService, className, keys) {
|
|
102
|
-
return langService.getMultipleContent(className, keys);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Helper function to interpolate values into a content string.
|
|
106
|
-
* Replaces placeholders in the format {key} with corresponding values.
|
|
107
|
-
*
|
|
108
|
-
* @param content - The content string with placeholders
|
|
109
|
-
* @param values - Object with values to interpolate
|
|
110
|
-
* @returns The interpolated string
|
|
111
|
-
*
|
|
112
|
-
* @example
|
|
113
|
-
* ```typescript
|
|
114
|
-
* const result = interpolateContent("Hello {name}!", { name: "World" });
|
|
115
|
-
* // Returns: "Hello World!"
|
|
116
|
-
* ```
|
|
117
|
-
*/
|
|
118
|
-
export function interpolateContent(content, values) {
|
|
119
|
-
if (!values)
|
|
120
|
-
return content;
|
|
121
|
-
return Object.entries(values).reduce((result, [key, value]) => {
|
|
122
|
-
return result.replace(new RegExp(`\\{${key}\\}`, 'g'), String(value));
|
|
123
|
-
}, content);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Factory function to create a content helper bound to a specific component class.
|
|
127
|
-
* This creates a more convenient API for components that need multiple content strings.
|
|
128
|
-
*
|
|
129
|
-
* @param langService - The language service instance
|
|
130
|
-
* @param className - The component class name
|
|
131
|
-
* @returns Object with convenient methods for content retrieval
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```typescript
|
|
135
|
-
* export class MyComponent {
|
|
136
|
-
* private content = createContentHelper(this.langService, 'MyComponent');
|
|
137
|
-
*
|
|
138
|
-
* constructor(private langService: LangService) {}
|
|
139
|
-
*
|
|
140
|
-
* ngOnInit() {
|
|
141
|
-
* this.title$ = this.content.get('title');
|
|
142
|
-
* this.allContent$ = this.content.getMultiple(['title', 'description']);
|
|
143
|
-
* }
|
|
144
|
-
* }
|
|
145
|
-
* ```
|
|
146
|
-
*/
|
|
147
|
-
export function createContentHelper(langService, className) {
|
|
148
|
-
return {
|
|
149
|
-
/**
|
|
150
|
-
* Get a single content string reactively.
|
|
151
|
-
*/
|
|
152
|
-
get(key, fallback) {
|
|
153
|
-
return fromContent(langService, { className, key, fallback });
|
|
154
|
-
},
|
|
155
|
-
/**
|
|
156
|
-
* Get multiple content strings reactively.
|
|
157
|
-
*/
|
|
158
|
-
getMultiple(keys) {
|
|
159
|
-
return fromMultipleContent(langService, className, keys);
|
|
160
|
-
},
|
|
161
|
-
/**
|
|
162
|
-
* Get content with interpolation.
|
|
163
|
-
*/
|
|
164
|
-
getWithInterpolation(key, interpolation, fallback) {
|
|
165
|
-
return fromContentWithInterpolation(langService, {
|
|
166
|
-
className,
|
|
167
|
-
key,
|
|
168
|
-
interpolation,
|
|
169
|
-
fallback,
|
|
170
|
-
});
|
|
171
|
-
},
|
|
172
|
-
/**
|
|
173
|
-
* Get a single content string synchronously (current language only).
|
|
174
|
-
*/
|
|
175
|
-
getText(key, fallback) {
|
|
176
|
-
return langService.getText(className, key, fallback);
|
|
177
|
-
},
|
|
178
|
-
/**
|
|
179
|
-
* Check if a content key exists.
|
|
180
|
-
*/
|
|
181
|
-
hasContent(key) {
|
|
182
|
-
return langService.hasContent(className, key);
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2hhcmVkL3V0aWxzL2NvbnRlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQXFDdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFdBQXdCLEVBQUUsTUFBcUI7SUFDekUsbURBQW1EO0lBQ25ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDO0lBRXJELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUYseUNBQXlDO0lBQ3pDLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUMzQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ2xFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxXQUF3QixFQUN4QixNQUFpQztJQUVqQyw2Q0FBNkM7SUFDN0MsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsV0FBd0IsRUFDeEIsU0FBaUIsRUFDakIsSUFBYztJQUVkLE9BQU8sV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsT0FBZSxFQUNmLE1BQXdDO0lBRXhDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFNUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQzVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNkLENBQUM7QUFzQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUF3QixFQUFFLFNBQWlCO0lBQzdFLE9BQU87UUFDTDs7V0FFRztRQUNILEdBQUcsQ0FBQyxHQUFXLEVBQUUsUUFBaUI7WUFDaEMsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRDs7V0FFRztRQUNILFdBQVcsQ0FBQyxJQUFjO1lBQ3hCLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxvQkFBb0IsQ0FDbEIsR0FBVyxFQUNYLGFBQThDLEVBQzlDLFFBQWlCO1lBRWpCLE9BQU8sNEJBQTRCLENBQUMsV0FBVyxFQUFFO2dCQUMvQyxTQUFTO2dCQUNULEdBQUc7Z0JBQ0gsYUFBYTtnQkFDYixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVEOztXQUVHO1FBQ0gsT0FBTyxDQUFDLEdBQVcsRUFBRSxRQUFpQjtZQUNwQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxVQUFVLENBQUMsR0FBVztZQUNwQixPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5cbi8qKlxuICogQ29udGVudCB1dGlsaXRpZXMgZm9yIHJlYWN0aXZlIHRleHQgYmluZGluZyBpbiBjb21wb25lbnRzLlxuICpcbiAqIFRoZXNlIHV0aWxpdGllcyBwcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gYmluZCBjb21wb25lbnQgcHJvcGVydGllc1xuICogdG8gbGFuZ3VhZ2UgY29udGVudCB0aGF0IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzLlxuICovXG5cbi8qKlxuICogVW5pZmllZCBjb25maWd1cmF0aW9uIGZvciBjb250ZW50IGJpbmRpbmcgd2l0aCBvcHRpb25hbCBpbnRlcnBvbGF0aW9uLlxuICogU3VwcG9ydHMgYm90aCBzaW1wbGUgY29udGVudCByZXRyaWV2YWwgYW5kIGNvbnRlbnQgd2l0aCBkeW5hbWljIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZSAodXNlZCBmb3IgY29udGVudCBsb29rdXApLlxuICAgKiBJZiBvbWl0dGVkLCBzZWFyY2hlcyBpbiBnbG9iYWwgY29udGVudCAoX2dsb2JhbCBuYW1lc3BhY2UpLlxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIGNvbnRlbnQga2V5IHRvIHJldHJpZXZlICovXG4gIGtleTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZCAqL1xuICBmYWxsYmFjaz86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIG9iamVjdCB3aXRoIHZhbHVlcyB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBjb250ZW50IHN0cmluZyAqL1xuICBpbnRlcnBvbGF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ29udGVudENvbmZpZyB3aXRoIGludGVycG9sYXRpb24gcHJvcGVydHkgaW5zdGVhZC5cbiAqIFRoaXMgaW50ZXJmYWNlIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJwb2xhdGVkQ29udGVudENvbmZpZyBleHRlbmRzIENvbnRlbnRDb25maWcge1xuICAvKiogT2JqZWN0IHdpdGggdmFsdWVzIHRvIGludGVycG9sYXRlIGludG8gdGhlIGNvbnRlbnQgc3RyaW5nICovXG4gIGludGVycG9sYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWN0aXZlIGNvbnRlbnQgb2JzZXJ2YWJsZSBmcm9tIGEgY29udGVudCBrZXkuXG4gKiBUaGlzIGlzIHRoZSBwcmltYXJ5IHV0aWxpdHkgZm9yIHRoZSBgZnJvbUNvbnRlbnRgIHBhdHRlcm4gd2l0aCB1bmlmaWVkIHN1cHBvcnRcbiAqIGZvciBib3RoIHNpbXBsZSBjb250ZW50IGFuZCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbGFuZ1NlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSBpbnN0YW5jZVxuICogQHBhcmFtIGNvbmZpZyAtIENvbnRlbnQgY29uZmlndXJhdGlvbiB3aXRoIG9wdGlvbmFsIGludGVycG9sYXRpb25cbiAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY29udGVudCBzdHJpbmcgYW5kIHVwZGF0ZXMgb24gbGFuZ3VhZ2UgY2hhbmdlXG4gKlxuICogQGV4YW1wbGUgU2ltcGxlIGNvbnRlbnQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDb21wb25lbnQtc3BlY2lmaWMgY29udGVudFxuICogdGhpcy50aXRsZSQgPSBmcm9tQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCB7XG4gKiAgIGNsYXNzTmFtZTogJ0hlYWRlckNvbXBvbmVudCcsXG4gKiAgIGtleTogJ3RpdGxlJyxcbiAqICAgZmFsbGJhY2s6ICdEZWZhdWx0IFRpdGxlJ1xuICogfSk7XG4gKlxuICogLy8gR2xvYmFsIGNvbnRlbnQgKG5vIGNsYXNzTmFtZSBuZWVkZWQpXG4gKiB0aGlzLnNhdmVCdXR0b24kID0gZnJvbUNvbnRlbnQodGhpcy5sYW5nU2VydmljZSwge1xuICogICBrZXk6ICdzYXZlJ1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBDb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvbnRlbnQ6IFwiSGVsbG8ge25hbWV9LCB5b3UgaGF2ZSB7Y291bnR9IG1lc3NhZ2VzXCJcbiAqIHRoaXMuZ3JlZXRpbmckID0gZnJvbUNvbnRlbnQodGhpcy5sYW5nU2VydmljZSwge1xuICogICBjbGFzc05hbWU6ICdXZWxjb21lQ29tcG9uZW50JyxcbiAqICAga2V5OiAnZ3JlZXRpbmcnLFxuICogICBpbnRlcnBvbGF0aW9uOiB7IG5hbWU6ICdKb2huJywgY291bnQ6IDUgfVxuICogfSk7XG4gKiAvLyBSZXN1bHRzIGluOiBcIkhlbGxvIEpvaG4sIHlvdSBoYXZlIDUgbWVzc2FnZXNcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29udGVudChsYW5nU2VydmljZTogTGFuZ1NlcnZpY2UsIGNvbmZpZzogQ29udGVudENvbmZpZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vIFVzZSBfZ2xvYmFsIGFzIGRlZmF1bHQgY2xhc3NOYW1lIGlmIG5vdCBwcm92aWRlZFxuICBjb25zdCBmaW5hbENsYXNzTmFtZSA9IGNvbmZpZy5jbGFzc05hbWUgfHwgJ19nbG9iYWwnO1xuXG4gIGNvbnN0IGNvbnRlbnRPYnNlcnZhYmxlID0gbGFuZ1NlcnZpY2UuZ2V0Q29udGVudChmaW5hbENsYXNzTmFtZSwgY29uZmlnLmtleSwgY29uZmlnLmZhbGxiYWNrKTtcblxuICAvLyBJZiBpbnRlcnBvbGF0aW9uIGlzIHByb3ZpZGVkLCBhcHBseSBpdFxuICBpZiAoY29uZmlnLmludGVycG9sYXRpb24pIHtcbiAgICByZXR1cm4gY29udGVudE9ic2VydmFibGUucGlwZShcbiAgICAgIG1hcChjb250ZW50ID0+IGludGVycG9sYXRlQ29udGVudChjb250ZW50LCBjb25maWcuaW50ZXJwb2xhdGlvbikpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50T2JzZXJ2YWJsZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZWFjdGl2ZSBjb250ZW50IG9ic2VydmFibGUgd2l0aCBpbnRlcnBvbGF0aW9uIHN1cHBvcnQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGZyb21Db250ZW50KCkgd2l0aCBpbnRlcnBvbGF0aW9uIHByb3BlcnR5IGluc3RlYWQuXG4gKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICpcbiAqIEBwYXJhbSBsYW5nU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gY29uZmlnIC0gSW50ZXJwb2xhdGVkIGNvbnRlbnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpbnRlcnBvbGF0ZWQgY29udGVudCBzdHJpbmdcbiAqXG4gKiBAZXhhbXBsZSBNaWdyYXRpb246XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBPTEQgKGRlcHJlY2F0ZWQpOlxuICogdGhpcy5ncmVldGluZyQgPSBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKHRoaXMubGFuZ1NlcnZpY2UsIHtcbiAqICAgY2xhc3NOYW1lOiAnV2VsY29tZUNvbXBvbmVudCcsXG4gKiAgIGtleTogJ2dyZWV0aW5nJyxcbiAqICAgaW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnSm9obicsIGNvdW50OiA1IH1cbiAqIH0pO1xuICpcbiAqIC8vIE5FVyAocmVjb21tZW5kZWQpOlxuICogdGhpcy5ncmVldGluZyQgPSBmcm9tQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCB7XG4gKiAgIGNsYXNzTmFtZTogJ1dlbGNvbWVDb21wb25lbnQnLFxuICogICBrZXk6ICdncmVldGluZycsXG4gKiAgIGludGVycG9sYXRpb246IHsgbmFtZTogJ0pvaG4nLCBjb3VudDogNSB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbihcbiAgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlLFxuICBjb25maWc6IEludGVycG9sYXRlZENvbnRlbnRDb25maWdcbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vIERlbGVnYXRlIHRvIHRoZSB1bmlmaWVkIGZyb21Db250ZW50IG1ldGhvZFxuICByZXR1cm4gZnJvbUNvbnRlbnQobGFuZ1NlcnZpY2UsIGNvbmZpZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG11bHRpcGxlIHJlYWN0aXZlIGNvbnRlbnQgb2JzZXJ2YWJsZXMgYXQgb25jZS5cbiAqIFVzZWZ1bCB3aGVuIGEgY29tcG9uZW50IG5lZWRzIHNldmVyYWwgY29udGVudCBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBsYW5nU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIGNvbnRlbnQga2V5cyB0byByZXRyaWV2ZVxuICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIG9iamVjdCB3aXRoIGFsbCByZXF1ZXN0ZWQgY29udGVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0aGlzLmNvbnRlbnQkID0gZnJvbU11bHRpcGxlQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCAnRm9ybUNvbXBvbmVudCcsIFtcbiAqICAgJ3RpdGxlJywgJ3N1Ym1pdEJ1dHRvbicsICdjYW5jZWxCdXR0b24nXG4gKiBdKTtcbiAqXG4gKiAvLyBJbiB0ZW1wbGF0ZVxuICogPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQkIHwgYXN5bmMgYXMgY29udGVudFwiPlxuICogICA8aDI+e3sgY29udGVudC50aXRsZSB9fTwvaDI+XG4gKiAgIDxidXR0b24+e3sgY29udGVudC5zdWJtaXRCdXR0b24gfX08L2J1dHRvbj5cbiAqICAgPGJ1dHRvbj57eyBjb250ZW50LmNhbmNlbEJ1dHRvbiB9fTwvYnV0dG9uPlxuICogPC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21NdWx0aXBsZUNvbnRlbnQoXG4gIGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSxcbiAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gIGtleXM6IHN0cmluZ1tdXG4pOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIGxhbmdTZXJ2aWNlLmdldE11bHRpcGxlQ29udGVudChjbGFzc05hbWUsIGtleXMpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBpbnRlcnBvbGF0ZSB2YWx1ZXMgaW50byBhIGNvbnRlbnQgc3RyaW5nLlxuICogUmVwbGFjZXMgcGxhY2Vob2xkZXJzIGluIHRoZSBmb3JtYXQge2tleX0gd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHN0cmluZyB3aXRoIHBsYWNlaG9sZGVyc1xuICogQHBhcmFtIHZhbHVlcyAtIE9iamVjdCB3aXRoIHZhbHVlcyB0byBpbnRlcnBvbGF0ZVxuICogQHJldHVybnMgVGhlIGludGVycG9sYXRlZCBzdHJpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gaW50ZXJwb2xhdGVDb250ZW50KFwiSGVsbG8ge25hbWV9IVwiLCB7IG5hbWU6IFwiV29ybGRcIiB9KTtcbiAqIC8vIFJldHVybnM6IFwiSGVsbG8gV29ybGQhXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVDb250ZW50KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbik6IHN0cmluZyB7XG4gIGlmICghdmFsdWVzKSByZXR1cm4gY29udGVudDtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWVzKS5yZWR1Y2UoKHJlc3VsdCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtrZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgfSwgY29udGVudCk7XG59XG5cbi8qKlxuICogVHlwZS1zYWZlIGNvbnRlbnQga2V5IGJ1aWxkZXIgZm9yIGJldHRlciBJREUgc3VwcG9ydC5cbiAqIFRoaXMgaXMgYSB1dGlsaXR5IHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBlbnN1cmUgY29udGVudCBrZXlzIGV4aXN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBEZWZpbmUgeW91ciBjb21wb25lbnQncyBjb250ZW50IGtleXNcbiAqIGludGVyZmFjZSBNeUNvbXBvbmVudENvbnRlbnQge1xuICogICB0aXRsZTogc3RyaW5nO1xuICogICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICogICBzdWJtaXRCdXR0b246IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBVc2Ugd2l0aCB0eXBlIHNhZmV0eVxuICogY29uc3QgdGl0bGVLZXk6IENvbnRlbnRLZXk8TXlDb21wb25lbnRDb250ZW50PiA9ICd0aXRsZSc7IC8vIOKckyBWYWxpZFxuICogY29uc3QgaW52YWxpZEtleTogQ29udGVudEtleTxNeUNvbXBvbmVudENvbnRlbnQ+ID0gJ2ludmFsaWQnOyAvLyDinJcgVHlwZSBlcnJvclxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRlbnRLZXk8VD4gPSBrZXlvZiBUICYgc3RyaW5nO1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29udGVudCBoZWxwZXIgYm91bmQgdG8gYSBzcGVjaWZpYyBjb21wb25lbnQgY2xhc3MuXG4gKiBUaGlzIGNyZWF0ZXMgYSBtb3JlIGNvbnZlbmllbnQgQVBJIGZvciBjb21wb25lbnRzIHRoYXQgbmVlZCBtdWx0aXBsZSBjb250ZW50IHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIGxhbmdTZXJ2aWNlIC0gVGhlIGxhbmd1YWdlIHNlcnZpY2UgaW5zdGFuY2VcbiAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNvbnZlbmllbnQgbWV0aG9kcyBmb3IgY29udGVudCByZXRyaWV2YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBjb250ZW50ID0gY3JlYXRlQ29udGVudEhlbHBlcih0aGlzLmxhbmdTZXJ2aWNlLCAnTXlDb21wb25lbnQnKTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlKSB7fVxuICpcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgdGhpcy50aXRsZSQgPSB0aGlzLmNvbnRlbnQuZ2V0KCd0aXRsZScpO1xuICogICAgIHRoaXMuYWxsQ29udGVudCQgPSB0aGlzLmNvbnRlbnQuZ2V0TXVsdGlwbGUoWyd0aXRsZScsICdkZXNjcmlwdGlvbiddKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZW50SGVscGVyKGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgcmVhY3RpdmVseS5cbiAgICAgKi9cbiAgICBnZXQoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgIHJldHVybiBmcm9tQ29udGVudChsYW5nU2VydmljZSwgeyBjbGFzc05hbWUsIGtleSwgZmFsbGJhY2sgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBtdWx0aXBsZSBjb250ZW50IHN0cmluZ3MgcmVhY3RpdmVseS5cbiAgICAgKi9cbiAgICBnZXRNdWx0aXBsZShrZXlzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgcmV0dXJuIGZyb21NdWx0aXBsZUNvbnRlbnQobGFuZ1NlcnZpY2UsIGNsYXNzTmFtZSwga2V5cyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRXaXRoSW50ZXJwb2xhdGlvbihcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgaW50ZXJwb2xhdGlvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICAgIGZhbGxiYWNrPzogc3RyaW5nXG4gICAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgIHJldHVybiBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKGxhbmdTZXJ2aWNlLCB7XG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgICBmYWxsYmFjayxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgc3luY2hyb25vdXNseSAoY3VycmVudCBsYW5ndWFnZSBvbmx5KS5cbiAgICAgKi9cbiAgICBnZXRUZXh0KGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbGFuZ1NlcnZpY2UuZ2V0VGV4dChjbGFzc05hbWUsIGtleSwgZmFsbGJhY2spO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbnRlbnQga2V5IGV4aXN0cy5cbiAgICAgKi9cbiAgICBoYXNDb250ZW50KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbGFuZ1NlcnZpY2UuaGFzQ29udGVudChjbGFzc05hbWUsIGtleSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simplified content utilities for the new LangService-only system.
|
|
3
|
-
* This replaces the old reactive-content.ts with a much simpler approach.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Helper function to determine if component should use reactive content.
|
|
7
|
-
* @param metadata Component metadata
|
|
8
|
-
* @returns True if component should use reactive content
|
|
9
|
-
*/
|
|
10
|
-
export function shouldUseReactiveContent(metadata) {
|
|
11
|
-
return !metadata.content && !!(metadata.contentKey && metadata.contentClass);
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Extract content configuration from metadata.
|
|
15
|
-
* @param metadata Component metadata
|
|
16
|
-
* @returns Content configuration for LangService
|
|
17
|
-
*/
|
|
18
|
-
export function extractContentConfig(metadata) {
|
|
19
|
-
return {
|
|
20
|
-
className: metadata.contentClass || '',
|
|
21
|
-
key: metadata.contentKey || '',
|
|
22
|
-
fallback: metadata.contentFallback,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Create reactive content metadata with defaults.
|
|
27
|
-
* @param config Partial content configuration
|
|
28
|
-
* @returns Complete reactive content metadata
|
|
29
|
-
*/
|
|
30
|
-
export function createReactiveContentMetadata(config) {
|
|
31
|
-
return {
|
|
32
|
-
content: config.content,
|
|
33
|
-
contentKey: config.contentKey,
|
|
34
|
-
contentClass: config.contentClass,
|
|
35
|
-
contentFallback: config.contentFallback,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Interpolate content string with values.
|
|
40
|
-
* Replaces placeholders like {{key}} or {key} with actual values.
|
|
41
|
-
*
|
|
42
|
-
* @param content - Content string with placeholders
|
|
43
|
-
* @param values - Values to interpolate
|
|
44
|
-
* @returns Interpolated string
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```typescript
|
|
48
|
-
* interpolateContent('Hello {{name}}!', { name: 'World' })
|
|
49
|
-
* // Returns: 'Hello World!'
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export function interpolateContent(content, values) {
|
|
53
|
-
if (!values || !content) {
|
|
54
|
-
return content;
|
|
55
|
-
}
|
|
56
|
-
return content.replace(/\{\{?(\w+)\}?\}/g, (match, key) => {
|
|
57
|
-
const value = values[key];
|
|
58
|
-
return value !== undefined ? String(value) : match;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Check if component should use reactive content with interpolation.
|
|
63
|
-
* @param metadata Component metadata with interpolation
|
|
64
|
-
* @returns True if component should use reactive content with interpolation
|
|
65
|
-
*/
|
|
66
|
-
export function shouldUseReactiveContentWithInterpolation(metadata) {
|
|
67
|
-
return shouldUseReactiveContent(metadata) && !!metadata.contentInterpolation;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Extract content configuration with interpolation from metadata.
|
|
71
|
-
* @param metadata Component metadata with interpolation
|
|
72
|
-
* @returns Content configuration for LangService with interpolation data
|
|
73
|
-
*/
|
|
74
|
-
export function extractContentConfigWithInterpolation(metadata) {
|
|
75
|
-
return {
|
|
76
|
-
className: metadata.contentClass || '',
|
|
77
|
-
key: metadata.contentKey || '',
|
|
78
|
-
fallback: metadata.contentFallback,
|
|
79
|
-
interpolation: metadata.contentInterpolation,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Helper function to get reactive content with interpolation using LangService.
|
|
84
|
-
* This provides a unified way to get reactive, interpolated content.
|
|
85
|
-
*
|
|
86
|
-
* @param langService - The LangService instance
|
|
87
|
-
* @param metadata - Component metadata with interpolation
|
|
88
|
-
* @returns Observable that emits interpolated content
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* const content$ = fromContentWithInterpolation(this.langService, {
|
|
93
|
-
* contentClass: 'MyComponent',
|
|
94
|
-
* contentKey: 'greeting',
|
|
95
|
-
* contentInterpolation: { name: 'World' }
|
|
96
|
-
* });
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
|
-
export function fromContentWithInterpolation(langService, // LangService type would cause circular dependency
|
|
100
|
-
metadata) {
|
|
101
|
-
// Observable<string> but avoiding import
|
|
102
|
-
const config = extractContentConfigWithInterpolation(metadata);
|
|
103
|
-
if (!config.className || !config.key) {
|
|
104
|
-
throw new Error('fromContentWithInterpolation requires both contentClass and contentKey');
|
|
105
|
-
}
|
|
106
|
-
return langService.getContentWithInterpolation(config.className, config.key, config.interpolation, config.fallback);
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Helper function to get static content with interpolation.
|
|
110
|
-
* This provides interpolation for static content strings.
|
|
111
|
-
*
|
|
112
|
-
* @param content - Static content string
|
|
113
|
-
* @param interpolationData - Values to interpolate
|
|
114
|
-
* @returns Interpolated string
|
|
115
|
-
*/
|
|
116
|
-
export function interpolateStaticContent(content, interpolationData) {
|
|
117
|
-
return interpolateContent(content, interpolationData);
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWNvbnRlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NoYXJlZC91dGlscy9zaW1wbGUtY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUF1Q0g7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxRQUFpQztJQUN4RSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFpQztJQUNwRSxPQUFPO1FBQ0wsU0FBUyxFQUFFLFFBQVEsQ0FBQyxZQUFZLElBQUksRUFBRTtRQUN0QyxHQUFHLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFO1FBQzlCLFFBQVEsRUFBRSxRQUFRLENBQUMsZUFBZTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE1BQXdDO0lBRXhDLE9BQU87UUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNqQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFlLEVBQ2YsTUFBd0M7SUFFeEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5Q0FBeUMsQ0FDdkQsUUFBMEM7SUFFMUMsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0FBQy9FLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFDQUFxQyxDQUFDLFFBQTBDO0lBQzlGLE9BQU87UUFDTCxTQUFTLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxFQUFFO1FBQ3RDLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7UUFDOUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxlQUFlO1FBQ2xDLGFBQWEsRUFBRSxRQUFRLENBQUMsb0JBQW9CO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLFdBQWdCLEVBQUUsbURBQW1EO0FBQ3JFLFFBQTBDO0lBRTFDLHlDQUF5QztJQUN6QyxNQUFNLE1BQU0sR0FBRyxxQ0FBcUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDLDJCQUEyQixDQUM1QyxNQUFNLENBQUMsU0FBUyxFQUNoQixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsT0FBZSxFQUNmLGlCQUFtRDtJQUVuRCxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNpbXBsaWZpZWQgY29udGVudCB1dGlsaXRpZXMgZm9yIHRoZSBuZXcgTGFuZ1NlcnZpY2Utb25seSBzeXN0ZW0uXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBvbGQgcmVhY3RpdmUtY29udGVudC50cyB3aXRoIGEgbXVjaCBzaW1wbGVyIGFwcHJvYWNoLlxuICovXG5cbi8qKlxuICogQmFzZSBtZXRhZGF0YSBmb3IgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgcmVhY3RpdmUgY29udGVudC5cbiAqIFNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IHdvcmtzIGRpcmVjdGx5IHdpdGggTGFuZ1NlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVDb250ZW50TWV0YWRhdGEge1xuICAvKiogU3RhdGljIGNvbnRlbnQgdGV4dCAodGFrZXMgcHJlY2VkZW5jZSBvdmVyIHJlYWN0aXZlIGNvbnRlbnQpICovXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIC8qKiBDb250ZW50IGtleSBmb3IgcmVhY3RpdmUgY29udGVudCBmcm9tIExhbmdTZXJ2aWNlICovXG4gIGNvbnRlbnRLZXk/OiBzdHJpbmc7XG4gIC8qKiBDb21wb25lbnQgY2xhc3MgbmFtZSBmb3IgY29udGVudCBsb29rdXAgKi9cbiAgY29udGVudENsYXNzPzogc3RyaW5nO1xuICAvKiogRmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZCAqL1xuICBjb250ZW50RmFsbGJhY2s/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgbWV0YWRhdGEgZm9yIHRleHQtYmFzZWQgY29tcG9uZW50cyB3aXRoIHJlYWN0aXZlIGNvbnRlbnQgc3VwcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRleHRNZXRhZGF0YSBleHRlbmRzIFJlYWN0aXZlQ29udGVudE1ldGFkYXRhIHtcbiAgLyoqIFN0YXRpYyBjb250ZW50IHRleHQgKi9cbiAgY29udGVudD86IHN0cmluZztcbiAgLyoqIENvbnRlbnQga2V5IGZvciByZWFjdGl2ZSBsb29rdXAgKi9cbiAgY29udGVudEtleT86IHN0cmluZztcbiAgLyoqIENvbXBvbmVudCBjbGFzcyBuYW1lICovXG4gIGNvbnRlbnRDbGFzcz86IHN0cmluZztcbiAgLyoqIEZhbGxiYWNrIHRleHQgKi9cbiAgY29udGVudEZhbGxiYWNrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIG1ldGFkYXRhIGZvciBjb21wb25lbnRzIHRoYXQgc3VwcG9ydCBjb250ZW50IGludGVycG9sYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24gZXh0ZW5kcyBSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YSB7XG4gIC8qKiBJbnRlcnBvbGF0aW9uIGRhdGEgZm9yIHBhcmFtZXRlcml6ZWQgY29udGVudCAqL1xuICBjb250ZW50SW50ZXJwb2xhdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj47XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50LlxuICogQHBhcmFtIG1ldGFkYXRhIENvbXBvbmVudCBtZXRhZGF0YVxuICogQHJldHVybnMgVHJ1ZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VSZWFjdGl2ZUNvbnRlbnQobWV0YWRhdGE6IFJlYWN0aXZlQ29udGVudE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiAhbWV0YWRhdGEuY29udGVudCAmJiAhIShtZXRhZGF0YS5jb250ZW50S2V5ICYmIG1ldGFkYXRhLmNvbnRlbnRDbGFzcyk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBjb250ZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBtZXRhZGF0YS5cbiAqIEBwYXJhbSBtZXRhZGF0YSBDb21wb25lbnQgbWV0YWRhdGFcbiAqIEByZXR1cm5zIENvbnRlbnQgY29uZmlndXJhdGlvbiBmb3IgTGFuZ1NlcnZpY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb250ZW50Q29uZmlnKG1ldGFkYXRhOiBSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YSkge1xuICByZXR1cm4ge1xuICAgIGNsYXNzTmFtZTogbWV0YWRhdGEuY29udGVudENsYXNzIHx8ICcnLFxuICAgIGtleTogbWV0YWRhdGEuY29udGVudEtleSB8fCAnJyxcbiAgICBmYWxsYmFjazogbWV0YWRhdGEuY29udGVudEZhbGxiYWNrLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSByZWFjdGl2ZSBjb250ZW50IG1ldGFkYXRhIHdpdGggZGVmYXVsdHMuXG4gKiBAcGFyYW0gY29uZmlnIFBhcnRpYWwgY29udGVudCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wbGV0ZSByZWFjdGl2ZSBjb250ZW50IG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YShcbiAgY29uZmlnOiBQYXJ0aWFsPFJlYWN0aXZlQ29udGVudE1ldGFkYXRhPlxuKTogUmVhY3RpdmVDb250ZW50TWV0YWRhdGEge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbmZpZy5jb250ZW50LFxuICAgIGNvbnRlbnRLZXk6IGNvbmZpZy5jb250ZW50S2V5LFxuICAgIGNvbnRlbnRDbGFzczogY29uZmlnLmNvbnRlbnRDbGFzcyxcbiAgICBjb250ZW50RmFsbGJhY2s6IGNvbmZpZy5jb250ZW50RmFsbGJhY2ssXG4gIH07XG59XG5cbi8qKlxuICogSW50ZXJwb2xhdGUgY29udGVudCBzdHJpbmcgd2l0aCB2YWx1ZXMuXG4gKiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgbGlrZSB7e2tleX19IG9yIHtrZXl9IHdpdGggYWN0dWFsIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIENvbnRlbnQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIHRvIGludGVycG9sYXRlXG4gKiBAcmV0dXJucyBJbnRlcnBvbGF0ZWQgc3RyaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGludGVycG9sYXRlQ29udGVudCgnSGVsbG8ge3tuYW1lfX0hJywgeyBuYW1lOiAnV29ybGQnIH0pXG4gKiAvLyBSZXR1cm5zOiAnSGVsbG8gV29ybGQhJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbnRlbnQoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgdmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZXMgfHwgIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoL1xce1xcez8oXFx3KylcXH0/XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh2YWx1ZSkgOiBtYXRjaDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY29tcG9uZW50IHNob3VsZCB1c2UgcmVhY3RpdmUgY29udGVudCB3aXRoIGludGVycG9sYXRpb24uXG4gKiBAcGFyYW0gbWV0YWRhdGEgQ29tcG9uZW50IG1ldGFkYXRhIHdpdGggaW50ZXJwb2xhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24oXG4gIG1ldGFkYXRhOiBSZWFjdGl2ZUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaG91bGRVc2VSZWFjdGl2ZUNvbnRlbnQobWV0YWRhdGEpICYmICEhbWV0YWRhdGEuY29udGVudEludGVycG9sYXRpb247XG59XG5cbi8qKlxuICogRXh0cmFjdCBjb250ZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBpbnRlcnBvbGF0aW9uIGZyb20gbWV0YWRhdGEuXG4gKiBAcGFyYW0gbWV0YWRhdGEgQ29tcG9uZW50IG1ldGFkYXRhIHdpdGggaW50ZXJwb2xhdGlvblxuICogQHJldHVybnMgQ29udGVudCBjb25maWd1cmF0aW9uIGZvciBMYW5nU2VydmljZSB3aXRoIGludGVycG9sYXRpb24gZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnRlbnRDb25maWdXaXRoSW50ZXJwb2xhdGlvbihtZXRhZGF0YTogUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24pIHtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc05hbWU6IG1ldGFkYXRhLmNvbnRlbnRDbGFzcyB8fCAnJyxcbiAgICBrZXk6IG1ldGFkYXRhLmNvbnRlbnRLZXkgfHwgJycsXG4gICAgZmFsbGJhY2s6IG1ldGFkYXRhLmNvbnRlbnRGYWxsYmFjayxcbiAgICBpbnRlcnBvbGF0aW9uOiBtZXRhZGF0YS5jb250ZW50SW50ZXJwb2xhdGlvbixcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHJlYWN0aXZlIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uIHVzaW5nIExhbmdTZXJ2aWNlLlxuICogVGhpcyBwcm92aWRlcyBhIHVuaWZpZWQgd2F5IHRvIGdldCByZWFjdGl2ZSwgaW50ZXJwb2xhdGVkIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGxhbmdTZXJ2aWNlIC0gVGhlIExhbmdTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBDb21wb25lbnQgbWV0YWRhdGEgd2l0aCBpbnRlcnBvbGF0aW9uXG4gKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaW50ZXJwb2xhdGVkIGNvbnRlbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29udGVudCQgPSBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKHRoaXMubGFuZ1NlcnZpY2UsIHtcbiAqICAgY29udGVudENsYXNzOiAnTXlDb21wb25lbnQnLFxuICogICBjb250ZW50S2V5OiAnZ3JlZXRpbmcnLFxuICogICBjb250ZW50SW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnV29ybGQnIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKFxuICBsYW5nU2VydmljZTogYW55LCAvLyBMYW5nU2VydmljZSB0eXBlIHdvdWxkIGNhdXNlIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgbWV0YWRhdGE6IFJlYWN0aXZlQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uXG4pOiBhbnkge1xuICAvLyBPYnNlcnZhYmxlPHN0cmluZz4gYnV0IGF2b2lkaW5nIGltcG9ydFxuICBjb25zdCBjb25maWcgPSBleHRyYWN0Q29udGVudENvbmZpZ1dpdGhJbnRlcnBvbGF0aW9uKG1ldGFkYXRhKTtcblxuICBpZiAoIWNvbmZpZy5jbGFzc05hbWUgfHwgIWNvbmZpZy5rZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zyb21Db250ZW50V2l0aEludGVycG9sYXRpb24gcmVxdWlyZXMgYm90aCBjb250ZW50Q2xhc3MgYW5kIGNvbnRlbnRLZXknKTtcbiAgfVxuXG4gIHJldHVybiBsYW5nU2VydmljZS5nZXRDb250ZW50V2l0aEludGVycG9sYXRpb24oXG4gICAgY29uZmlnLmNsYXNzTmFtZSxcbiAgICBjb25maWcua2V5LFxuICAgIGNvbmZpZy5pbnRlcnBvbGF0aW9uLFxuICAgIGNvbmZpZy5mYWxsYmFja1xuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgc3RhdGljIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uLlxuICogVGhpcyBwcm92aWRlcyBpbnRlcnBvbGF0aW9uIGZvciBzdGF0aWMgY29udGVudCBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gU3RhdGljIGNvbnRlbnQgc3RyaW5nXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbkRhdGEgLSBWYWx1ZXMgdG8gaW50ZXJwb2xhdGVcbiAqIEByZXR1cm5zIEludGVycG9sYXRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3RhdGljQ29udGVudChcbiAgY29udGVudDogc3RyaW5nLFxuICBpbnRlcnBvbGF0aW9uRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbik6IHN0cmluZyB7XG4gIHJldHVybiBpbnRlcnBvbGF0ZUNvbnRlbnQoY29udGVudCwgaW50ZXJwb2xhdGlvbkRhdGEpO1xufVxuIl19
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { LanguagesContent, TextContent } from './types';
|
|
2
|
-
export interface Provider {
|
|
3
|
-
[x: string]: TextContent;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Global content that can be used across all components.
|
|
7
|
-
* These are common texts like buttons, actions, states, etc.
|
|
8
|
-
* Structure: {es: {key1: 'value1', key2: 'value2'}, en: {key1: 'value1', key2: 'value2'}, fr: {...}}
|
|
9
|
-
*
|
|
10
|
-
* Note: You can add any language code. The system will automatically detect available languages
|
|
11
|
-
* and provide intelligent fallbacks with warnings for missing translations.
|
|
12
|
-
*/
|
|
13
|
-
declare const globalContentData: LanguagesContent;
|
|
14
|
-
declare const GlobalContent: TextContent;
|
|
15
|
-
declare const content: Provider;
|
|
16
|
-
export default content;
|
|
17
|
-
export { content, GlobalContent, globalContentData };
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { ValtechConfig } from '../types';
|
|
3
|
-
import { Provider } from './content';
|
|
4
|
-
import { LangOption, LanguageText, LanguagesContent } from './types';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* LangService - Reactive language and content management service.
|
|
8
|
-
*
|
|
9
|
-
* This service provides reactive content management with Observable-based language switching.
|
|
10
|
-
* Components can subscribe to content changes and automatically update when the language changes.
|
|
11
|
-
*
|
|
12
|
-
* The service automatically detects available languages from the content configuration
|
|
13
|
-
* and provides intelligent fallbacks with console warnings for missing translations.
|
|
14
|
-
*
|
|
15
|
-
* @example Basic usage:
|
|
16
|
-
* ```typescript
|
|
17
|
-
* constructor(private langService: LangService) {}
|
|
18
|
-
*
|
|
19
|
-
* // Get current language
|
|
20
|
-
* const currentLang = this.langService.currentLang;
|
|
21
|
-
*
|
|
22
|
-
* // Subscribe to language changes
|
|
23
|
-
* this.langService.currentLang$.subscribe(lang => console.log('Language changed:', lang));
|
|
24
|
-
*
|
|
25
|
-
* // Get static text
|
|
26
|
-
* const text = this.langService.getText('ComponentName', 'textKey');
|
|
27
|
-
*
|
|
28
|
-
* // Get reactive text
|
|
29
|
-
* const text$ = this.langService.getContent('ComponentName', 'textKey');
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export declare class LangService {
|
|
33
|
-
private content;
|
|
34
|
-
private defaultLang;
|
|
35
|
-
private availableLanguages;
|
|
36
|
-
private selectedLang;
|
|
37
|
-
private config;
|
|
38
|
-
private warnedMissingLanguages;
|
|
39
|
-
constructor(config: ValtechConfig);
|
|
40
|
-
/**
|
|
41
|
-
* Detect available languages from the content configuration.
|
|
42
|
-
* Scans all component content to find which languages are actually configured.
|
|
43
|
-
*/
|
|
44
|
-
private detectAvailableLanguages;
|
|
45
|
-
/**
|
|
46
|
-
* Determine the best default language based on available content.
|
|
47
|
-
*/
|
|
48
|
-
private determineDefaultLanguage;
|
|
49
|
-
/**
|
|
50
|
-
* Validate if a language is available in the content.
|
|
51
|
-
*/
|
|
52
|
-
private validateLanguage;
|
|
53
|
-
/**
|
|
54
|
-
* Get the best available language for a component and key.
|
|
55
|
-
* Provides intelligent fallback with warnings.
|
|
56
|
-
*/
|
|
57
|
-
private getBestAvailableContent;
|
|
58
|
-
/**
|
|
59
|
-
* Observable that emits the current language whenever it changes.
|
|
60
|
-
* Use this to subscribe to language changes in components.
|
|
61
|
-
*/
|
|
62
|
-
get currentLang$(): Observable<LangOption>;
|
|
63
|
-
/**
|
|
64
|
-
* Get the current language synchronously.
|
|
65
|
-
*/
|
|
66
|
-
get currentLang(): LangOption;
|
|
67
|
-
/**
|
|
68
|
-
* Get array of available languages detected from content.
|
|
69
|
-
*/
|
|
70
|
-
get availableLangs(): LangOption[];
|
|
71
|
-
/**
|
|
72
|
-
* Get the default language.
|
|
73
|
-
*/
|
|
74
|
-
get defaultLanguage(): LangOption;
|
|
75
|
-
/**
|
|
76
|
-
* Set the current language and persist it to localStorage.
|
|
77
|
-
* This will trigger updates in all reactive content subscriptions.
|
|
78
|
-
*
|
|
79
|
-
* Validates that the language is available and warns if not.
|
|
80
|
-
*
|
|
81
|
-
* @param lang - The language to set
|
|
82
|
-
*/
|
|
83
|
-
setLang(lang: LangOption): void;
|
|
84
|
-
/**
|
|
85
|
-
* Get content for a component class and key (legacy method).
|
|
86
|
-
*
|
|
87
|
-
* @deprecated Use getText() or getContent() for better type safety
|
|
88
|
-
*/
|
|
89
|
-
Text(className: string): LanguageText;
|
|
90
|
-
/**
|
|
91
|
-
* Get a single content string synchronously for the current language.
|
|
92
|
-
* Provides intelligent fallback with warnings for missing translations.
|
|
93
|
-
*
|
|
94
|
-
* @param className - The component class name
|
|
95
|
-
* @param key - The text key
|
|
96
|
-
* @param fallback - Optional fallback text if key is not found
|
|
97
|
-
* @returns The text string or fallback
|
|
98
|
-
*/
|
|
99
|
-
getText(className: string, key: string, fallback?: string): string;
|
|
100
|
-
/**
|
|
101
|
-
* Get a reactive Observable for a specific text key that updates when language changes.
|
|
102
|
-
* This is the recommended method for components that need reactive content.
|
|
103
|
-
* Provides intelligent fallback with warnings for missing translations.
|
|
104
|
-
*
|
|
105
|
-
* @param className - The component class name
|
|
106
|
-
* @param key - The text key
|
|
107
|
-
* @param fallback - Optional fallback text if key is not found
|
|
108
|
-
* @returns Observable that emits the text string whenever language changes
|
|
109
|
-
*/
|
|
110
|
-
getContent(className: string, key: string, fallback?: string): Observable<string>;
|
|
111
|
-
/**
|
|
112
|
-
* Get reactive content for multiple keys at once.
|
|
113
|
-
* Provides intelligent fallback with warnings for missing translations.
|
|
114
|
-
*
|
|
115
|
-
* @param className - The component class name
|
|
116
|
-
* @param keys - Array of text keys to retrieve
|
|
117
|
-
* @returns Observable that emits an object with all requested keys
|
|
118
|
-
*/
|
|
119
|
-
getMultipleContent(className: string, keys: string[]): Observable<Record<string, string>>;
|
|
120
|
-
/**
|
|
121
|
-
* Check if a content key exists for a component in any available language.
|
|
122
|
-
*
|
|
123
|
-
* @param className - The component class name
|
|
124
|
-
* @param key - The text key
|
|
125
|
-
* @returns True if the key exists in any language
|
|
126
|
-
*/
|
|
127
|
-
hasContent(className: string, key: string): boolean;
|
|
128
|
-
/**
|
|
129
|
-
* Check if a content key exists for a component in a specific language.
|
|
130
|
-
*
|
|
131
|
-
* @param className - The component class name
|
|
132
|
-
* @param key - The text key
|
|
133
|
-
* @param lang - The language to check (defaults to current language)
|
|
134
|
-
* @returns True if the key exists in the specified language
|
|
135
|
-
*/
|
|
136
|
-
hasContentInLanguage(className: string, key: string, lang?: LangOption): boolean;
|
|
137
|
-
/**
|
|
138
|
-
* Get available languages for a specific component.
|
|
139
|
-
*
|
|
140
|
-
* @param className - The component class name
|
|
141
|
-
* @returns Array of language codes available for the component
|
|
142
|
-
*/
|
|
143
|
-
getAvailableLanguagesForComponent(className: string): LangOption[];
|
|
144
|
-
/**
|
|
145
|
-
* Get missing content keys for a component in a specific language.
|
|
146
|
-
* Useful for identifying incomplete translations.
|
|
147
|
-
*
|
|
148
|
-
* @param className - The component class name
|
|
149
|
-
* @param lang - The language to check
|
|
150
|
-
* @param referenceLang - The reference language to compare against (defaults to default language)
|
|
151
|
-
* @returns Array of missing keys
|
|
152
|
-
*/
|
|
153
|
-
getMissingContentKeys(className: string, lang: LangOption, referenceLang?: LangOption): string[];
|
|
154
|
-
/**
|
|
155
|
-
* Register or update content for a component dynamically.
|
|
156
|
-
* This allows registering content at runtime without APP_INITIALIZER.
|
|
157
|
-
*
|
|
158
|
-
* @param className - The component class name
|
|
159
|
-
* @param content - The multilingual content object
|
|
160
|
-
* @param merge - Whether to merge with existing content (default: true)
|
|
161
|
-
*
|
|
162
|
-
* @example
|
|
163
|
-
* ```typescript
|
|
164
|
-
* this.langService.registerContent('MyComponent', {
|
|
165
|
-
* [LANGUAGES.ES]: { title: 'Título', description: 'Descripción' },
|
|
166
|
-
* [LANGUAGES.EN]: { title: 'Title', description: 'Description' }
|
|
167
|
-
* });
|
|
168
|
-
* ```
|
|
169
|
-
*/
|
|
170
|
-
registerContent(className: string, content: LanguagesContent, merge?: boolean): void;
|
|
171
|
-
/**
|
|
172
|
-
* Update multiple content registrations at once.
|
|
173
|
-
*
|
|
174
|
-
* @param contentMap - Map of className to content
|
|
175
|
-
* @param merge - Whether to merge with existing content (default: true)
|
|
176
|
-
*
|
|
177
|
-
* @example
|
|
178
|
-
* ```typescript
|
|
179
|
-
* this.langService.registerMultipleContent({
|
|
180
|
-
* 'Component1': { [LANGUAGES.ES]: { key1: 'valor1' } },
|
|
181
|
-
* 'Component2': { [LANGUAGES.EN]: { key2: 'value2' } }
|
|
182
|
-
* });
|
|
183
|
-
* ```
|
|
184
|
-
*/
|
|
185
|
-
registerMultipleContent(contentMap: Record<string, LanguagesContent>, merge?: boolean): void;
|
|
186
|
-
/**
|
|
187
|
-
* Remove content for a specific component.
|
|
188
|
-
*
|
|
189
|
-
* @param className - The component class name to remove
|
|
190
|
-
*/
|
|
191
|
-
removeContent(className: string): void;
|
|
192
|
-
/**
|
|
193
|
-
* Get a list of all registered component classes.
|
|
194
|
-
*
|
|
195
|
-
* @returns Array of registered class names
|
|
196
|
-
*/
|
|
197
|
-
getRegisteredClasses(): string[];
|
|
198
|
-
/**
|
|
199
|
-
* Get the complete content configuration (for debugging purposes).
|
|
200
|
-
* Returns a deep copy to prevent accidental mutations.
|
|
201
|
-
*
|
|
202
|
-
* @returns Complete content configuration
|
|
203
|
-
*/
|
|
204
|
-
getContentConfiguration(): Provider;
|
|
205
|
-
/**
|
|
206
|
-
* Clear all content and reset to initial state.
|
|
207
|
-
* Useful for testing or complete reinitialization.
|
|
208
|
-
*/
|
|
209
|
-
clearAllContent(): void;
|
|
210
|
-
/**
|
|
211
|
-
* Get content with interpolation support.
|
|
212
|
-
* Retrieves content and replaces placeholders with provided values.
|
|
213
|
-
*
|
|
214
|
-
* @param className - The component class name
|
|
215
|
-
* @param key - The text key
|
|
216
|
-
* @param interpolationData - Object with values to interpolate
|
|
217
|
-
* @param fallback - Optional fallback text if key is not found
|
|
218
|
-
* @returns Text with interpolated values
|
|
219
|
-
*/
|
|
220
|
-
getTextWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): string;
|
|
221
|
-
/**
|
|
222
|
-
* Get reactive content with interpolation support.
|
|
223
|
-
* Returns an Observable that emits interpolated content when language changes.
|
|
224
|
-
*
|
|
225
|
-
* @param className - The component class name
|
|
226
|
-
* @param key - The text key
|
|
227
|
-
* @param interpolationData - Object with values to interpolate
|
|
228
|
-
* @param fallback - Optional fallback text if key is not found
|
|
229
|
-
* @returns Observable that emits interpolated text
|
|
230
|
-
*/
|
|
231
|
-
getContentWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): Observable<string>;
|
|
232
|
-
/**
|
|
233
|
-
* Interpolate a string with provided values.
|
|
234
|
-
* Replaces placeholders like {{key}} or {key} with actual values.
|
|
235
|
-
*
|
|
236
|
-
* @param content - Content string with placeholders
|
|
237
|
-
* @param values - Values to interpolate
|
|
238
|
-
* @returns Interpolated string
|
|
239
|
-
*
|
|
240
|
-
* @example
|
|
241
|
-
* ```typescript
|
|
242
|
-
* interpolateString('Hello {{name}}!', { name: 'World' })
|
|
243
|
-
* // Returns: 'Hello World!'
|
|
244
|
-
* ```
|
|
245
|
-
*/
|
|
246
|
-
private interpolateString;
|
|
247
|
-
/**
|
|
248
|
-
* Legacy function equivalent to the old fromContentWithInterpolation.
|
|
249
|
-
* Provides reactive content with interpolation support for backward compatibility.
|
|
250
|
-
*
|
|
251
|
-
* @param className - The component class name
|
|
252
|
-
* @param key - The text key
|
|
253
|
-
* @param interpolationData - Object with values to interpolate
|
|
254
|
-
* @param fallback - Optional fallback text if key is not found
|
|
255
|
-
* @returns Observable that emits interpolated text
|
|
256
|
-
*
|
|
257
|
-
* @deprecated Use getContentWithInterpolation instead
|
|
258
|
-
*/
|
|
259
|
-
fromContentWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): Observable<string>;
|
|
260
|
-
get Lang(): LangOption;
|
|
261
|
-
set Lang(lang: LangOption);
|
|
262
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<LangService, never>;
|
|
263
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<LangService>;
|
|
264
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export type LanguageText = {
|
|
2
|
-
[key: string]: string;
|
|
3
|
-
};
|
|
4
|
-
export type LanguagesContent = {
|
|
5
|
-
[key: string]: LanguageText;
|
|
6
|
-
};
|
|
7
|
-
export declare class TextContent {
|
|
8
|
-
text: LanguagesContent;
|
|
9
|
-
constructor(text: LanguagesContent);
|
|
10
|
-
get Content(): LanguagesContent;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Language code type - supports any valid language code string.
|
|
14
|
-
* Common examples: 'es', 'en', 'fr', 'de', 'pt', 'it', 'zh', 'ja', etc.
|
|
15
|
-
*/
|
|
16
|
-
export type LangOption = string;
|
|
17
|
-
/**
|
|
18
|
-
* Common language constants for convenience.
|
|
19
|
-
* Users can still use any language code string directly.
|
|
20
|
-
*/
|
|
21
|
-
export declare const LANGUAGES: {
|
|
22
|
-
readonly ES: "es";
|
|
23
|
-
readonly EN: "en";
|
|
24
|
-
readonly FR: "fr";
|
|
25
|
-
readonly DE: "de";
|
|
26
|
-
readonly PT: "pt";
|
|
27
|
-
readonly IT: "it";
|
|
28
|
-
readonly ZH: "zh";
|
|
29
|
-
readonly JA: "ja";
|
|
30
|
-
};
|