@tolgee/ngx 2.3.2 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/esm2020/lib/ngx-tolgee.module.mjs +4 -4
- package/esm2020/lib/stranslate.pipe.mjs +3 -3
- package/esm2020/lib/t.component.mjs +15 -27
- package/esm2020/lib/translate.pipe.mjs +25 -21
- package/esm2020/lib/translate.service.mjs +101 -18
- package/esm2020/lib/translations-provider.mjs +3 -3
- package/fesm2015/tolgee-ngx.mjs +147 -76
- package/fesm2015/tolgee-ngx.mjs.map +1 -1
- package/fesm2020/tolgee-ngx.mjs +148 -73
- package/fesm2020/tolgee-ngx.mjs.map +1 -1
- package/lib/t.component.d.ts +2 -6
- package/lib/translate.pipe.d.ts +9 -6
- package/lib/translate.service.d.ts +66 -4
- package/package.json +6 -5
package/fesm2015/tolgee-ngx.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { EventEmitter, Injectable, Pipe, Component, Input, APP_INITIALIZER, NgModule } from '@angular/core';
|
|
4
|
-
import {
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
5
|
import { Tolgee, TolgeeConfig, TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE } from '@tolgee/core';
|
|
6
6
|
export { TolgeeConfig } from '@tolgee/core';
|
|
7
7
|
|
|
@@ -14,11 +14,15 @@ class TranslateService {
|
|
|
14
14
|
get tolgee() {
|
|
15
15
|
return this._tolgee;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Starts Tolgee if not started and subscribes for languageChange and translationChange events
|
|
19
|
+
*/
|
|
17
20
|
start(config) {
|
|
18
21
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19
22
|
if (!this.runPromise) {
|
|
20
23
|
this._tolgee = new Tolgee(config);
|
|
21
24
|
this.runPromise = this.tolgee.run();
|
|
25
|
+
// unsubscribe first, if it is subscribed for some reason
|
|
22
26
|
this.unsubscribeCoreListeners();
|
|
23
27
|
this.onTranslationChangeCoreSubscription =
|
|
24
28
|
this._tolgee.onTranslationChange.subscribe((data) => {
|
|
@@ -32,43 +36,120 @@ class TranslateService {
|
|
|
32
36
|
});
|
|
33
37
|
}
|
|
34
38
|
ngOnDestroy() {
|
|
39
|
+
// stop it!
|
|
35
40
|
this.tolgee.stop();
|
|
41
|
+
// unsubscribe listeners
|
|
36
42
|
this.unsubscribeCoreListeners();
|
|
37
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Changes the current language
|
|
46
|
+
* @param lang The new current language (e.g. en, en-US)
|
|
47
|
+
*/
|
|
38
48
|
setLang(lang) {
|
|
39
49
|
this.tolgee.lang = lang;
|
|
40
50
|
}
|
|
41
|
-
|
|
42
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Returns the current language
|
|
53
|
+
*/
|
|
54
|
+
getCurrentLang() {
|
|
55
|
+
return this.tolgee.lang;
|
|
43
56
|
}
|
|
44
|
-
|
|
45
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Returns Observable providing current translated value
|
|
59
|
+
* Tne observable is subscribed to translation change and language change events of Tolgee
|
|
60
|
+
*
|
|
61
|
+
* In development mode, it returns string wrapped with configured
|
|
62
|
+
* prefix and suffix to be handled in browser by MutationObserver.
|
|
63
|
+
*
|
|
64
|
+
* You should use unsubscribe method when you are done!
|
|
65
|
+
*
|
|
66
|
+
* in onInit: this.subscription = translateService.get('aa')
|
|
67
|
+
* in onDestroy: this.subscription.unsubscribe()
|
|
68
|
+
*
|
|
69
|
+
* @param key The key to translate (e.g. what-a-key)
|
|
70
|
+
* @param params The parameters to interpolate (e.g. {name: "John"})
|
|
71
|
+
* @param defaultValue Value, which will be rendered, when no translated value is provided
|
|
72
|
+
*/
|
|
73
|
+
get(key, params = {}, defaultValue) {
|
|
74
|
+
return this.translate(key, params, false, defaultValue);
|
|
46
75
|
}
|
|
47
|
-
|
|
48
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Returns Observable providing current translated value
|
|
78
|
+
* Tne observable is subscribed to translation change and language change events of Tolgee
|
|
79
|
+
*
|
|
80
|
+
* In development mode, it returns the translated string,
|
|
81
|
+
* so in-context localization is not going to work.
|
|
82
|
+
*
|
|
83
|
+
* You should use unsubscribe method when you are done!
|
|
84
|
+
*
|
|
85
|
+
* in onInit: this.subscription = translateService.get('aa')
|
|
86
|
+
* in onDestroy: this.subscription.unsubscribe()
|
|
87
|
+
*
|
|
88
|
+
* @param key The key to translate (e.g. what-a-key)
|
|
89
|
+
* @param params The parameters to interpolate (e.g. {name: "John"})
|
|
90
|
+
* @param defaultValue Value, which will be rendered, when no translated value is provided
|
|
91
|
+
*/
|
|
92
|
+
getSafe(key, params = {}, defaultValue) {
|
|
93
|
+
return this.translate(key, params, true, defaultValue);
|
|
49
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Returns the translation value synchronously
|
|
97
|
+
*
|
|
98
|
+
* In development mode, it returns string wrapped with configured
|
|
99
|
+
* prefix and suffix to be handled in browser by MutationObserver.
|
|
100
|
+
*
|
|
101
|
+
* @param key The key to translate (e.g. what-a-key)
|
|
102
|
+
* @param params The parameters to interpolate (e.g. {name: "John"})
|
|
103
|
+
* @param defaultValue Value, which will be rendered, when no translated value is provided
|
|
104
|
+
*/
|
|
105
|
+
instant(key, params = {}, defaultValue) {
|
|
106
|
+
return this.tolgee.instant(key, params, undefined, undefined, defaultValue);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns the translation value synchronously
|
|
110
|
+
*
|
|
111
|
+
* In development mode, it returns the translated string,
|
|
112
|
+
* so in-context localization is not going to work.
|
|
113
|
+
*
|
|
114
|
+
* @param key The key to translate (e.g. what-a-key)
|
|
115
|
+
* @param params The parameters to interpolate (e.g. {name: "John"})
|
|
116
|
+
* @param defaultValue Value, which will be rendered, when no translated value is provided
|
|
117
|
+
*/
|
|
50
118
|
instantSafe(input, params = {}, defaultValue) {
|
|
51
119
|
return this.tolgee.instant(input, params, true, undefined, defaultValue);
|
|
52
120
|
}
|
|
53
|
-
getCurrentLang() {
|
|
54
|
-
return this.tolgee.lang;
|
|
55
|
-
}
|
|
56
121
|
unsubscribeCoreListeners() {
|
|
57
122
|
var _a, _b;
|
|
58
123
|
(_a = this.onTranslationChangeCoreSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
59
124
|
(_b = this.onLangChangeCoreSubscription) === null || _b === void 0 ? void 0 : _b.unsubscribe();
|
|
60
125
|
}
|
|
61
|
-
translate(
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
126
|
+
translate(key, params = {}, noWrap = false, defaultValue) {
|
|
127
|
+
return new Observable((subscriber) => {
|
|
128
|
+
const translate = () => __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
// start if not started
|
|
130
|
+
yield this.start(this.config);
|
|
131
|
+
const translated = yield this.tolgee.translate(key, params, noWrap, defaultValue);
|
|
132
|
+
subscriber.next(translated);
|
|
133
|
+
});
|
|
134
|
+
translate();
|
|
135
|
+
const onTranslationChangeSubscription = this.tolgee.onTranslationChange.subscribe((data) => {
|
|
136
|
+
if (data.key === key) {
|
|
137
|
+
translate();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
const onLanguageChangeSubscription = this.tolgee.onLangChange.subscribe(() => {
|
|
141
|
+
translate();
|
|
142
|
+
});
|
|
143
|
+
return () => {
|
|
144
|
+
onTranslationChangeSubscription.unsubscribe();
|
|
145
|
+
onLanguageChangeSubscription.unsubscribe();
|
|
146
|
+
};
|
|
66
147
|
});
|
|
67
148
|
}
|
|
68
149
|
}
|
|
69
|
-
TranslateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
70
|
-
TranslateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.
|
|
71
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
150
|
+
TranslateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslateService, deps: [{ token: TolgeeConfig }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
151
|
+
TranslateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslateService });
|
|
152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslateService, decorators: [{
|
|
72
153
|
type: Injectable
|
|
73
154
|
}], ctorParameters: function () { return [{ type: TolgeeConfig }]; } });
|
|
74
155
|
|
|
@@ -78,15 +159,14 @@ class TranslatePipe {
|
|
|
78
159
|
this.value = '';
|
|
79
160
|
}
|
|
80
161
|
get resultProvider() {
|
|
81
|
-
return (
|
|
162
|
+
return (key, params, defaultValue) => this.translateService.get(key, params, defaultValue);
|
|
82
163
|
}
|
|
83
164
|
ngOnDestroy() {
|
|
84
|
-
this.
|
|
165
|
+
this.unsubscribe();
|
|
85
166
|
}
|
|
86
|
-
transform(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return input;
|
|
167
|
+
transform(key, paramsOrDefaultValue, params) {
|
|
168
|
+
if (!key || key.length === 0) {
|
|
169
|
+
return key;
|
|
90
170
|
}
|
|
91
171
|
const defaultValue = typeof paramsOrDefaultValue !== 'object'
|
|
92
172
|
? paramsOrDefaultValue
|
|
@@ -94,30 +174,34 @@ class TranslatePipe {
|
|
|
94
174
|
if (typeof paramsOrDefaultValue === 'object') {
|
|
95
175
|
params = paramsOrDefaultValue;
|
|
96
176
|
}
|
|
97
|
-
|
|
98
|
-
|
|
177
|
+
if (this.key === key &&
|
|
178
|
+
JSON.stringify(this.params) === JSON.stringify(params) &&
|
|
179
|
+
this.defaultValue === defaultValue) {
|
|
99
180
|
return this.value;
|
|
100
181
|
}
|
|
101
|
-
|
|
102
|
-
this.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.
|
|
106
|
-
|
|
182
|
+
this.key = key;
|
|
183
|
+
this.params = params;
|
|
184
|
+
this.defaultValue = defaultValue;
|
|
185
|
+
// unsubscribe first
|
|
186
|
+
this.unsubscribe();
|
|
187
|
+
// asynchronously translate and assign subscription
|
|
188
|
+
this.subscription = this.translate(key, params, defaultValue);
|
|
107
189
|
return this.value;
|
|
108
190
|
}
|
|
109
|
-
|
|
110
|
-
|
|
191
|
+
unsubscribe() {
|
|
192
|
+
if (this.subscription) {
|
|
193
|
+
this.subscription.unsubscribe();
|
|
194
|
+
}
|
|
111
195
|
}
|
|
112
|
-
|
|
113
|
-
this.resultProvider(
|
|
196
|
+
translate(key, params, defaultValue) {
|
|
197
|
+
return this.resultProvider(key, params, defaultValue).subscribe((r) => {
|
|
114
198
|
this.value = r;
|
|
115
199
|
});
|
|
116
200
|
}
|
|
117
201
|
}
|
|
118
|
-
TranslatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
119
|
-
TranslatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.
|
|
120
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
202
|
+
TranslatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslatePipe, deps: [{ token: TranslateService }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
203
|
+
TranslatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslatePipe, name: "translate", pure: false });
|
|
204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslatePipe, decorators: [{
|
|
121
205
|
type: Pipe,
|
|
122
206
|
args: [{
|
|
123
207
|
name: 'translate',
|
|
@@ -133,9 +217,9 @@ class STranslatePipe extends TranslatePipe {
|
|
|
133
217
|
return (input, params, defaultValue) => this.translateService.getSafe(input, params, defaultValue);
|
|
134
218
|
}
|
|
135
219
|
}
|
|
136
|
-
STranslatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
137
|
-
STranslatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.
|
|
138
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
220
|
+
STranslatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: STranslatePipe, deps: [{ token: TranslateService }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
221
|
+
STranslatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: STranslatePipe, name: "stranslate", pure: false });
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: STranslatePipe, decorators: [{
|
|
139
223
|
type: Pipe,
|
|
140
224
|
args: [{
|
|
141
225
|
name: 'stranslate',
|
|
@@ -148,40 +232,27 @@ class TComponent {
|
|
|
148
232
|
this.ref = ref;
|
|
149
233
|
this.translateService = translateService;
|
|
150
234
|
}
|
|
151
|
-
get resultProvider() {
|
|
152
|
-
return (key, params, defaultValue) => this.translateService.getSafe(key, params, defaultValue);
|
|
153
|
-
}
|
|
154
235
|
ngOnInit() {
|
|
155
236
|
const element = this.ref.nativeElement;
|
|
156
237
|
element.setAttribute(TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE, this.key);
|
|
157
|
-
//
|
|
158
|
-
this.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (data.key == this.key) {
|
|
166
|
-
this.translate(this.key, this.params, this.default);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
this.translate(this.key, this.params, this.default);
|
|
238
|
+
// set safe at first
|
|
239
|
+
element.textContent = this.translateService.instantSafe(this.key, this.params, this.default);
|
|
240
|
+
// then do the async translation
|
|
241
|
+
this.subscription = this.translateService
|
|
242
|
+
.getSafe(this.key, this.params, this.default)
|
|
243
|
+
.subscribe((translated) => {
|
|
244
|
+
return (element.textContent = translated);
|
|
245
|
+
});
|
|
170
246
|
}
|
|
171
247
|
ngOnDestroy() {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
translate(key, params, defaultValue) {
|
|
177
|
-
this.resultProvider(key, params, defaultValue).subscribe((r) => {
|
|
178
|
-
this.ref.nativeElement.textContent = r;
|
|
179
|
-
});
|
|
248
|
+
if (this.subscription) {
|
|
249
|
+
this.subscription.unsubscribe();
|
|
250
|
+
}
|
|
180
251
|
}
|
|
181
252
|
}
|
|
182
|
-
TComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
183
|
-
TComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.
|
|
184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
253
|
+
TComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TComponent, deps: [{ token: i0.ElementRef }, { token: TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
+
TComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: TComponent, selector: "[t]", inputs: { params: "params", key: "key", default: "default" }, ngImport: i0, template: ``, isInline: true });
|
|
255
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TComponent, decorators: [{
|
|
185
256
|
type: Component,
|
|
186
257
|
args: [{
|
|
187
258
|
selector: '[t]',
|
|
@@ -205,9 +276,9 @@ class TranslationsProvider {
|
|
|
205
276
|
});
|
|
206
277
|
}
|
|
207
278
|
}
|
|
208
|
-
TranslationsProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
209
|
-
TranslationsProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.
|
|
210
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
279
|
+
TranslationsProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslationsProvider, deps: [{ token: TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
280
|
+
TranslationsProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslationsProvider });
|
|
281
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: TranslationsProvider, decorators: [{
|
|
211
282
|
type: Injectable
|
|
212
283
|
}], ctorParameters: function () { return [{ type: TranslateService }]; } });
|
|
213
284
|
|
|
@@ -233,10 +304,10 @@ class NgxTolgeeModule {
|
|
|
233
304
|
};
|
|
234
305
|
}
|
|
235
306
|
}
|
|
236
|
-
NgxTolgeeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
237
|
-
NgxTolgeeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.
|
|
238
|
-
NgxTolgeeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.
|
|
239
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
307
|
+
NgxTolgeeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgxTolgeeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
308
|
+
NgxTolgeeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgxTolgeeModule, declarations: [TranslatePipe, STranslatePipe, TComponent], exports: [TranslatePipe, STranslatePipe, TComponent] });
|
|
309
|
+
NgxTolgeeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgxTolgeeModule, providers: [] });
|
|
310
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgxTolgeeModule, decorators: [{
|
|
240
311
|
type: NgModule,
|
|
241
312
|
args: [{
|
|
242
313
|
declarations: [TranslatePipe, STranslatePipe, TComponent],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tolgee-ngx.mjs","sources":["../../../projects/ngx-tolgee/src/lib/translate.service.ts","../../../projects/ngx-tolgee/src/lib/translate.pipe.ts","../../../projects/ngx-tolgee/src/lib/stranslate.pipe.ts","../../../projects/ngx-tolgee/src/lib/t.component.ts","../../../projects/ngx-tolgee/src/lib/translations-provider.ts","../../../projects/ngx-tolgee/src/lib/ngx-tolgee.module.ts","../../../projects/ngx-tolgee/src/public-api.ts","../../../projects/ngx-tolgee/src/tolgee-ngx.ts"],"sourcesContent":["import { EventEmitter, Injectable, OnDestroy } from '@angular/core';\nimport { from, Observable } from 'rxjs';\nimport { Tolgee, TranslationData } from '@tolgee/core';\nimport { TolgeeConfig } from './tolgeeConfig';\n\n@Injectable()\nexport class TranslateService implements OnDestroy {\n public readonly onLangChange: EventEmitter<never> = new EventEmitter<never>();\n public readonly onTranslationChange: EventEmitter<TranslationData> =\n new EventEmitter<TranslationData>();\n\n private runPromise: Promise<void>;\n private onTranslationChangeCoreSubscription: any;\n private onLangChangeCoreSubscription: any;\n\n constructor(private config: TolgeeConfig) {}\n\n private _tolgee: Tolgee;\n\n public get tolgee(): Tolgee {\n return this._tolgee;\n }\n\n public async start(config: TolgeeConfig): Promise<void> {\n if (!this.runPromise) {\n this._tolgee = new Tolgee(config);\n this.runPromise = this.tolgee.run();\n this.unsubscribeCoreListeners();\n this.onTranslationChangeCoreSubscription =\n this._tolgee.onTranslationChange.subscribe((data) => {\n this.onTranslationChange.emit(data);\n });\n this.onLangChangeCoreSubscription = this._tolgee.onLangChange.subscribe(\n () => {\n this.onLangChange.emit();\n }\n );\n }\n await this.runPromise;\n }\n\n ngOnDestroy(): void {\n this.tolgee.stop();\n this.unsubscribeCoreListeners();\n }\n\n public setLang(lang: string) {\n this.tolgee.lang = lang;\n }\n\n public get(\n input: string,\n params = {},\n defaultValue?: string\n ): Observable<string> {\n return from(this.translate(input, params, false, defaultValue));\n }\n\n public getSafe(\n input: string,\n params = {},\n defaultValue?: string\n ): Observable<string> {\n return from(this.translate(input, params, true, defaultValue));\n }\n\n public instant(input: string, params = {}, defaultValue?: string): string {\n return this.tolgee.instant(\n input,\n params,\n undefined,\n undefined,\n defaultValue\n );\n }\n\n public instantSafe(\n input: string,\n params = {},\n defaultValue?: string\n ): string {\n return this.tolgee.instant(input, params, true, undefined, defaultValue);\n }\n\n public getCurrentLang(): string {\n return this.tolgee.lang;\n }\n\n private unsubscribeCoreListeners() {\n this.onTranslationChangeCoreSubscription?.unsubscribe();\n this.onLangChangeCoreSubscription?.unsubscribe();\n }\n\n private async translate(\n input: string,\n params = {},\n noWrap = false,\n defaultValue: string\n ): Promise<string> {\n //wait for start before translating\n await this.start(this.config);\n return await this.tolgee.translate(input, params, noWrap, defaultValue);\n }\n}\n","import { OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { Observable, Subscription } from 'rxjs';\n\n@Pipe({\n name: 'translate',\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n value = '';\n lastHash: string;\n private langChangeSubscription: Subscription;\n\n constructor(protected translateService: TranslateService) {}\n\n protected get resultProvider(): (\n key,\n params,\n defaultValue: string\n ) => Observable<string> {\n return (input, params, defaultValue) =>\n this.translateService.get(input, params, defaultValue);\n }\n\n ngOnDestroy(): void {\n this.langChangeSubscription.unsubscribe();\n }\n\n transform(input: any, params?: Record<string, any>): string;\n transform(\n input: any,\n defaultValue?: string,\n params?: Record<string, any>\n ): string;\n\n transform(\n input: any,\n paramsOrDefaultValue?: Record<string, any> | string,\n params?: Record<string, any>\n ): string {\n if (!input || input.length === 0) {\n return input;\n }\n\n const defaultValue =\n typeof paramsOrDefaultValue !== 'object'\n ? paramsOrDefaultValue\n : undefined;\n\n if (typeof paramsOrDefaultValue === 'object') {\n params = paramsOrDefaultValue;\n }\n\n const newHash = this.getHash(\n input,\n params,\n this.translateService.getCurrentLang()\n );\n\n if (newHash === this.lastHash) {\n return this.value;\n }\n\n this.langChangeSubscription?.unsubscribe();\n this.langChangeSubscription = this.translateService.onLangChange.subscribe(\n () => {\n this.onLangChange(input, params, defaultValue);\n }\n );\n\n this.onLangChange(input, params, defaultValue);\n\n this.lastHash = newHash;\n\n return this.value;\n }\n\n private getHash(input: string, params: object, language: string): string {\n return JSON.stringify({ input, params, language });\n }\n\n private onLangChange(input, params, defaultValue) {\n this.resultProvider(input, params, defaultValue).subscribe((r) => {\n this.value = r;\n });\n }\n}\n","import { Pipe } from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { TranslatePipe } from './translate.pipe';\nimport { Observable } from 'rxjs';\n\n@Pipe({\n name: 'stranslate',\n pure: false,\n})\nexport class STranslatePipe extends TranslatePipe {\n constructor(translateService: TranslateService) {\n super(translateService);\n }\n\n protected get resultProvider(): (\n input,\n params,\n defaultValue\n ) => Observable<string> {\n return (input, params, defaultValue) =>\n this.translateService.getSafe(input, params, defaultValue);\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { TranslateService } from './translate.service';\nimport { TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE } from '@tolgee/core';\n\n@Component({\n selector: '[t]',\n template: ``,\n})\nexport class TComponent implements OnInit, OnDestroy {\n value: string;\n @Input() params?: Record<string, any>;\n @Input() key: string;\n @Input() default?: string;\n onLangChangeSubscription: Subscription;\n onTranslationChangeSubscription: Subscription;\n\n constructor(\n private ref: ElementRef,\n private translateService: TranslateService\n ) {}\n\n protected get resultProvider(): (\n key,\n params,\n defaultValue: string\n ) => Observable<string> {\n return (key, params, defaultValue) =>\n this.translateService.getSafe(key, params, defaultValue);\n }\n\n ngOnInit(): void {\n const element = this.ref.nativeElement as HTMLElement;\n\n element.setAttribute(TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE, this.key);\n\n //update value when language changed\n this.onLangChangeSubscription =\n this.translateService.onLangChange.subscribe(() => {\n this.translate(this.key, this.params, this.default);\n });\n\n //update value when translation changed\n this.onTranslationChangeSubscription =\n this.translateService.onTranslationChange.subscribe((data) => {\n if (data.key == this.key) {\n this.translate(this.key, this.params, this.default);\n }\n });\n this.translate(this.key, this.params, this.default);\n }\n\n ngOnDestroy(): void {\n this.onLangChangeSubscription?.unsubscribe();\n this.onTranslationChangeSubscription?.unsubscribe();\n }\n\n private translate(key, params, defaultValue: string) {\n this.resultProvider(key, params, defaultValue).subscribe((r) => {\n this.ref.nativeElement.textContent = r;\n });\n }\n}\n","import {Injectable} from '@angular/core';\nimport {TranslateService} from \"./translate.service\";\nimport {TolgeeConfig} from \"@tolgee/core\";\n\n@Injectable()\nexport class TranslationsProvider {\n\n constructor(private translateService: TranslateService) {\n }\n\n async load(options: TolgeeConfig) {\n return await this.translateService.start(options);\n }\n}\n\n\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\nimport { TranslatePipe } from './translate.pipe';\nimport { TranslationsProvider } from './translations-provider';\nimport { TranslateService } from './translate.service';\nimport { STranslatePipe } from './stranslate.pipe';\nimport { TolgeeConfig } from './tolgeeConfig';\nimport { TComponent } from './t.component';\n\n@NgModule({\n declarations: [TranslatePipe, STranslatePipe, TComponent],\n exports: [TranslatePipe, STranslatePipe, TComponent],\n providers: [],\n})\nexport class NgxTolgeeModule {\n // @dynamic\n static forRoot(options: TolgeeConfig): ModuleWithProviders<NgxTolgeeModule> {\n options = { filesUrlPrefix: '/assets/i18n/', ...options };\n return {\n ngModule: NgxTolgeeModule,\n providers: [\n TranslateService,\n TranslationsProvider,\n {\n provide: APP_INITIALIZER,\n useFactory: (provider: TranslationsProvider) => {\n return async () => await provider.load(options);\n },\n deps: [TranslationsProvider, TranslateService],\n multi: true,\n },\n { provide: TolgeeConfig, useValue: options },\n ],\n };\n }\n}\n","/*\n * Public API Surface of ngx-tolgee\n */\nimport { TranslateService } from './lib/translate.service';\nimport { TranslatePipe } from './lib/translate.pipe';\nimport { STranslatePipe } from './lib/stranslate.pipe';\nimport { TolgeeConfig } from './lib/tolgeeConfig';\nimport { TComponent } from './lib/t.component';\n\nexport * from './lib/ngx-tolgee.module';\nexport { TolgeeConfig };\nexport { TranslateService };\nexport { TranslatePipe };\nexport { STranslatePipe };\nexport { TComponent };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tolgee-ngx.mjs","sources":["../../../projects/ngx-tolgee/src/lib/translate.service.ts","../../../projects/ngx-tolgee/src/lib/translate.pipe.ts","../../../projects/ngx-tolgee/src/lib/stranslate.pipe.ts","../../../projects/ngx-tolgee/src/lib/t.component.ts","../../../projects/ngx-tolgee/src/lib/translations-provider.ts","../../../projects/ngx-tolgee/src/lib/ngx-tolgee.module.ts","../../../projects/ngx-tolgee/src/public-api.ts","../../../projects/ngx-tolgee/src/tolgee-ngx.ts"],"sourcesContent":["import { EventEmitter, Injectable, OnDestroy } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Tolgee, TranslationData } from '@tolgee/core';\nimport { TolgeeConfig } from './tolgeeConfig';\n\n@Injectable()\nexport class TranslateService implements OnDestroy {\n public readonly onLangChange: EventEmitter<never> = new EventEmitter<never>();\n public readonly onTranslationChange: EventEmitter<TranslationData> =\n new EventEmitter<TranslationData>();\n\n private runPromise: Promise<void>;\n private onTranslationChangeCoreSubscription: any;\n private onLangChangeCoreSubscription: any;\n\n constructor(private config: TolgeeConfig) {}\n\n private _tolgee: Tolgee;\n\n public get tolgee(): Tolgee {\n return this._tolgee;\n }\n\n /**\n * Starts Tolgee if not started and subscribes for languageChange and translationChange events\n */\n public async start(config: TolgeeConfig): Promise<void> {\n if (!this.runPromise) {\n this._tolgee = new Tolgee(config);\n this.runPromise = this.tolgee.run();\n // unsubscribe first, if it is subscribed for some reason\n this.unsubscribeCoreListeners();\n this.onTranslationChangeCoreSubscription =\n this._tolgee.onTranslationChange.subscribe((data) => {\n this.onTranslationChange.emit(data);\n });\n this.onLangChangeCoreSubscription = this._tolgee.onLangChange.subscribe(\n () => {\n this.onLangChange.emit();\n }\n );\n }\n await this.runPromise;\n }\n\n ngOnDestroy(): void {\n // stop it!\n this.tolgee.stop();\n // unsubscribe listeners\n this.unsubscribeCoreListeners();\n }\n\n /**\n * Changes the current language\n * @param lang The new current language (e.g. en, en-US)\n */\n public setLang(lang: string) {\n this.tolgee.lang = lang;\n }\n\n /**\n * Returns the current language\n */\n public getCurrentLang(): string {\n return this.tolgee.lang;\n }\n\n /**\n * Returns Observable providing current translated value\n * Tne observable is subscribed to translation change and language change events of Tolgee\n *\n * In development mode, it returns string wrapped with configured\n * prefix and suffix to be handled in browser by MutationObserver.\n *\n * You should use unsubscribe method when you are done!\n *\n * in onInit: this.subscription = translateService.get('aa')\n * in onDestroy: this.subscription.unsubscribe()\n *\n * @param key The key to translate (e.g. what-a-key)\n * @param params The parameters to interpolate (e.g. {name: \"John\"})\n * @param defaultValue Value, which will be rendered, when no translated value is provided\n */\n public get(\n key: string,\n params = {},\n defaultValue?: string\n ): Observable<string> {\n return this.translate(key, params, false, defaultValue);\n }\n\n /**\n * Returns Observable providing current translated value\n * Tne observable is subscribed to translation change and language change events of Tolgee\n *\n * In development mode, it returns the translated string,\n * so in-context localization is not going to work.\n *\n * You should use unsubscribe method when you are done!\n *\n * in onInit: this.subscription = translateService.get('aa')\n * in onDestroy: this.subscription.unsubscribe()\n *\n * @param key The key to translate (e.g. what-a-key)\n * @param params The parameters to interpolate (e.g. {name: \"John\"})\n * @param defaultValue Value, which will be rendered, when no translated value is provided\n */\n public getSafe(\n key: string,\n params = {},\n defaultValue?: string\n ): Observable<string> {\n return this.translate(key, params, true, defaultValue);\n }\n\n /**\n * Returns the translation value synchronously\n *\n * In development mode, it returns string wrapped with configured\n * prefix and suffix to be handled in browser by MutationObserver.\n *\n * @param key The key to translate (e.g. what-a-key)\n * @param params The parameters to interpolate (e.g. {name: \"John\"})\n * @param defaultValue Value, which will be rendered, when no translated value is provided\n */\n public instant(key: string, params = {}, defaultValue?: string): string {\n return this.tolgee.instant(key, params, undefined, undefined, defaultValue);\n }\n\n /**\n * Returns the translation value synchronously\n *\n * In development mode, it returns the translated string,\n * so in-context localization is not going to work.\n *\n * @param key The key to translate (e.g. what-a-key)\n * @param params The parameters to interpolate (e.g. {name: \"John\"})\n * @param defaultValue Value, which will be rendered, when no translated value is provided\n */\n public instantSafe(\n input: string,\n params = {},\n defaultValue?: string\n ): string {\n return this.tolgee.instant(input, params, true, undefined, defaultValue);\n }\n\n private unsubscribeCoreListeners() {\n this.onTranslationChangeCoreSubscription?.unsubscribe();\n this.onLangChangeCoreSubscription?.unsubscribe();\n }\n\n private translate(\n key: string,\n params = {},\n noWrap = false,\n defaultValue: string\n ): Observable<string> {\n return new Observable((subscriber) => {\n const translate = async () => {\n // start if not started\n await this.start(this.config);\n const translated = await this.tolgee.translate(\n key,\n params,\n noWrap,\n defaultValue\n );\n\n subscriber.next(translated);\n };\n\n translate();\n\n const onTranslationChangeSubscription =\n this.tolgee.onTranslationChange.subscribe((data) => {\n if (data.key === key) {\n translate();\n }\n });\n\n const onLanguageChangeSubscription = this.tolgee.onLangChange.subscribe(\n () => {\n translate();\n }\n );\n\n return () => {\n onTranslationChangeSubscription.unsubscribe();\n onLanguageChangeSubscription.unsubscribe();\n };\n });\n }\n}\n","import { OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { Observable, Subscription } from 'rxjs';\n\n@Pipe({\n name: 'translate',\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n value = '';\n key: string;\n params: Record<string, any>;\n defaultValue: string;\n private;\n private subscription: Subscription;\n\n constructor(protected translateService: TranslateService) {}\n\n protected get resultProvider(): (\n key,\n params,\n defaultValue: string\n ) => Observable<string> {\n return (key, params, defaultValue) =>\n this.translateService.get(key, params, defaultValue);\n }\n\n ngOnDestroy(): void {\n this.unsubscribe();\n }\n\n transform(key: any, params?: Record<string, any>): string;\n\n transform(\n key: any,\n defaultValue?: string,\n params?: Record<string, any>\n ): string;\n\n transform(\n key: any,\n paramsOrDefaultValue?: Record<string, any> | string,\n params?: Record<string, any>\n ): string {\n if (!key || key.length === 0) {\n return key;\n }\n\n const defaultValue =\n typeof paramsOrDefaultValue !== 'object'\n ? paramsOrDefaultValue\n : undefined;\n\n if (typeof paramsOrDefaultValue === 'object') {\n params = paramsOrDefaultValue;\n }\n\n if (\n this.key === key &&\n JSON.stringify(this.params) === JSON.stringify(params) &&\n this.defaultValue === defaultValue\n ) {\n return this.value;\n }\n\n this.key = key;\n this.params = params;\n this.defaultValue = defaultValue;\n\n // unsubscribe first\n this.unsubscribe();\n\n // asynchronously translate and assign subscription\n this.subscription = this.translate(key, params, defaultValue);\n\n return this.value;\n }\n\n private unsubscribe() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n private translate(key, params, defaultValue) {\n return this.resultProvider(key, params, defaultValue).subscribe((r) => {\n this.value = r;\n });\n }\n}\n","import { Pipe } from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { TranslatePipe } from './translate.pipe';\nimport { Observable } from 'rxjs';\n\n@Pipe({\n name: 'stranslate',\n pure: false,\n})\nexport class STranslatePipe extends TranslatePipe {\n constructor(translateService: TranslateService) {\n super(translateService);\n }\n\n protected get resultProvider(): (\n input,\n params,\n defaultValue\n ) => Observable<string> {\n return (input, params, defaultValue) =>\n this.translateService.getSafe(input, params, defaultValue);\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TranslateService } from './translate.service';\nimport { TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE } from '@tolgee/core';\n\n@Component({\n selector: '[t]',\n template: ``,\n})\nexport class TComponent implements OnInit, OnDestroy {\n @Input() params?: Record<string, any>;\n @Input() key: string;\n @Input() default?: string;\n subscription: Subscription;\n\n constructor(\n private ref: ElementRef,\n private translateService: TranslateService\n ) {}\n\n ngOnInit(): void {\n const element = this.ref.nativeElement as HTMLElement;\n element.setAttribute(TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE, this.key);\n\n // set safe at first\n element.textContent = this.translateService.instantSafe(\n this.key,\n this.params,\n this.default\n );\n\n // then do the async translation\n this.subscription = this.translateService\n .getSafe(this.key, this.params, this.default)\n .subscribe((translated) => {\n return (element.textContent = translated);\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {TranslateService} from \"./translate.service\";\nimport {TolgeeConfig} from \"@tolgee/core\";\n\n@Injectable()\nexport class TranslationsProvider {\n\n constructor(private translateService: TranslateService) {\n }\n\n async load(options: TolgeeConfig) {\n return await this.translateService.start(options);\n }\n}\n\n\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\nimport { TranslatePipe } from './translate.pipe';\nimport { TranslationsProvider } from './translations-provider';\nimport { TranslateService } from './translate.service';\nimport { STranslatePipe } from './stranslate.pipe';\nimport { TolgeeConfig } from './tolgeeConfig';\nimport { TComponent } from './t.component';\n\n@NgModule({\n declarations: [TranslatePipe, STranslatePipe, TComponent],\n exports: [TranslatePipe, STranslatePipe, TComponent],\n providers: [],\n})\nexport class NgxTolgeeModule {\n // @dynamic\n static forRoot(options: TolgeeConfig): ModuleWithProviders<NgxTolgeeModule> {\n options = { filesUrlPrefix: '/assets/i18n/', ...options };\n return {\n ngModule: NgxTolgeeModule,\n providers: [\n TranslateService,\n TranslationsProvider,\n {\n provide: APP_INITIALIZER,\n useFactory: (provider: TranslationsProvider) => {\n return async () => await provider.load(options);\n },\n deps: [TranslationsProvider, TranslateService],\n multi: true,\n },\n { provide: TolgeeConfig, useValue: options },\n ],\n };\n }\n}\n","/*\n * Public API Surface of ngx-tolgee\n */\nimport { TranslateService } from './lib/translate.service';\nimport { TranslatePipe } from './lib/translate.pipe';\nimport { STranslatePipe } from './lib/stranslate.pipe';\nimport { TolgeeConfig } from './lib/tolgeeConfig';\nimport { TComponent } from './lib/t.component';\n\nexport * from './lib/ngx-tolgee.module';\nexport { TolgeeConfig };\nexport { TranslateService };\nexport { TranslatePipe };\nexport { STranslatePipe };\nexport { TComponent };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAMa,gBAAgB;IAS3B,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QARxB,iBAAY,GAAwB,IAAI,YAAY,EAAS,CAAC;QAC9D,wBAAmB,GACjC,IAAI,YAAY,EAAmB,CAAC;KAMM;IAI5C,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;;;;IAKY,KAAK,CAAC,MAAoB;;YACrC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;;gBAEpC,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,IAAI,CAAC,mCAAmC;oBACtC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI;wBAC9C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACrC,CAAC,CAAC;gBACL,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CACrE;oBACE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;iBAC1B,CACF,CAAC;aACH;YACD,MAAM,IAAI,CAAC,UAAU,CAAC;SACvB;KAAA;IAED,WAAW;;QAET,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;;QAEnB,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;;;;;IAMM,OAAO,CAAC,IAAY;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;KACzB;;;;IAKM,cAAc;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KACzB;;;;;;;;;;;;;;;;;IAkBM,GAAG,CACR,GAAW,EACX,MAAM,GAAG,EAAE,EACX,YAAqB;QAErB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;KACzD;;;;;;;;;;;;;;;;;IAkBM,OAAO,CACZ,GAAW,EACX,MAAM,GAAG,EAAE,EACX,YAAqB;QAErB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;KACxD;;;;;;;;;;;IAYM,OAAO,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE,EAAE,YAAqB;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;KAC7E;;;;;;;;;;;IAYM,WAAW,CAChB,KAAa,EACb,MAAM,GAAG,EAAE,EACX,YAAqB;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;KAC1E;IAEO,wBAAwB;;QAC9B,MAAA,IAAI,CAAC,mCAAmC,0CAAE,WAAW,EAAE,CAAC;QACxD,MAAA,IAAI,CAAC,4BAA4B,0CAAE,WAAW,EAAE,CAAC;KAClD;IAEO,SAAS,CACf,GAAW,EACX,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,KAAK,EACd,YAAoB;QAEpB,OAAO,IAAI,UAAU,CAAC,CAAC,UAAU;YAC/B,MAAM,SAAS,GAAG;;gBAEhB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAC5C,GAAG,EACH,MAAM,EACN,MAAM,EACN,YAAY,CACb,CAAC;gBAEF,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC7B,CAAA,CAAC;YAEF,SAAS,EAAE,CAAC;YAEZ,MAAM,+BAA+B,GACnC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI;gBAC7C,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;oBACpB,SAAS,EAAE,CAAC;iBACb;aACF,CAAC,CAAC;YAEL,MAAM,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CACrE;gBACE,SAAS,EAAE,CAAC;aACb,CACF,CAAC;YAEF,OAAO;gBACL,+BAA+B,CAAC,WAAW,EAAE,CAAC;gBAC9C,4BAA4B,CAAC,WAAW,EAAE,CAAC;aAC5C,CAAC;SACH,CAAC,CAAC;KACJ;;6GA1LU,gBAAgB;iHAAhB,gBAAgB;2FAAhB,gBAAgB;kBAD5B,UAAU;;;MCGE,aAAa;IAQxB,YAAsB,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAPxD,UAAK,GAAG,EAAE,CAAC;KAOiD;IAE5D,IAAc,cAAc;QAK1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,KAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;KACxD;IAED,WAAW;QACT,IAAI,CAAC,WAAW,EAAE,CAAC;KACpB;IAUD,SAAS,CACP,GAAQ,EACR,oBAAmD,EACnD,MAA4B;QAE5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,YAAY,GAChB,OAAO,oBAAoB,KAAK,QAAQ;cACpC,oBAAoB;cACpB,SAAS,CAAC;QAEhB,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;YAC5C,MAAM,GAAG,oBAAoB,CAAC;SAC/B;QAED,IACE,IAAI,CAAC,GAAG,KAAK,GAAG;YAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACtD,IAAI,CAAC,YAAY,KAAK,YAAY,EAClC;YACA,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;QAED,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;;QAGjC,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAE9D,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;SACjC;KACF;IAEO,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY;QACzC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAChB,CAAC,CAAC;KACJ;;0GAhFU,aAAa;wGAAb,aAAa;2FAAb,aAAa;kBAJzB,IAAI;mBAAC;oBACJ,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,KAAK;iBACZ;;;MCEY,uBAAuB,aAAa;IAC/C,YAAY,gBAAkC;QAC5C,KAAK,CAAC,gBAAgB,CAAC,CAAC;KACzB;IAED,IAAc,cAAc;QAK1B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,KACjC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;KAC9D;;2GAZU,cAAc;yGAAd,cAAc;2FAAd,cAAc;kBAJ1B,IAAI;mBAAC;oBACJ,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,KAAK;iBACZ;;;MCCY,UAAU;IAMrB,YACU,GAAe,EACf,gBAAkC;QADlC,QAAG,GAAH,GAAG,CAAY;QACf,qBAAgB,GAAhB,gBAAgB,CAAkB;KACxC;IAEJ,QAAQ;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAA4B,CAAC;QACtD,OAAO,CAAC,YAAY,CAAC,kCAAkC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;;QAGnE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CACrD,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CACb,CAAC;;QAGF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB;aACtC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;aAC5C,SAAS,CAAC,CAAC,UAAU;YACpB,QAAQ,OAAO,CAAC,WAAW,GAAG,UAAU,EAAE;SAC3C,CAAC,CAAC;KACN;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;SACjC;KACF;;uGAlCU,UAAU;2FAAV,UAAU,yGAFX,EAAE;2FAED,UAAU;kBAJtB,SAAS;mBAAC;oBACT,QAAQ,EAAE,KAAK;oBACf,QAAQ,EAAE,EAAE;iBACb;6HAEU,MAAM;sBAAd,KAAK;gBACG,GAAG;sBAAX,KAAK;gBACG,OAAO;sBAAf,KAAK;;;MCPK,oBAAoB;IAE/B,YAAoB,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;KACrD;IAEK,IAAI,CAAC,OAAqB;;YAC9B,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SACnD;KAAA;;iHAPU,oBAAoB;qHAApB,oBAAoB;2FAApB,oBAAoB;kBADhC,UAAU;;;MCSE,eAAe;;IAE1B,OAAO,OAAO,CAAC,OAAqB;QAClC,OAAO,mBAAK,cAAc,EAAE,eAAe,IAAK,OAAO,CAAE,CAAC;QAC1D,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE;gBACT,gBAAgB;gBAChB,oBAAoB;gBACpB;oBACE,OAAO,EAAE,eAAe;oBACxB,UAAU,EAAE,CAAC,QAA8B;wBACzC,OAAO,qDAAY,OAAA,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,GAAA,CAAC;qBACjD;oBACD,IAAI,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;oBAC9C,KAAK,EAAE,IAAI;iBACZ;gBACD,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC7C;SACF,CAAC;KACH;;4GApBU,eAAe;6GAAf,eAAe,iBAJX,aAAa,EAAE,cAAc,EAAE,UAAU,aAC9C,aAAa,EAAE,cAAc,EAAE,UAAU;6GAGxC,eAAe,aAFf,EAAE;2FAEF,eAAe;kBAL3B,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC;oBACzD,OAAO,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC;oBACpD,SAAS,EAAE,EAAE;iBACd;;;ACZD;;;;ACAA;;;;;;"}
|