ngx-atomic-i18n 0.1.0 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-atomic-i18n.mjs +19 -19
- package/fesm2022/ngx-atomic-i18n.mjs.map +1 -1
- package/package.json +8 -10
- package/types/ngx-atomic-i18n.d.ts +347 -0
- package/esm2022/lib/FIFO.model.mjs +0 -64
- package/esm2022/lib/translate.pipe.mjs +0 -18
- package/esm2022/lib/translate.provider.mjs +0 -121
- package/esm2022/lib/translate.token.mjs +0 -15
- package/esm2022/lib/translate.type.mjs +0 -10
- package/esm2022/lib/translate.util.mjs +0 -245
- package/esm2022/lib/translation-core.service.mjs +0 -312
- package/esm2022/lib/translation.directive.mjs +0 -35
- package/esm2022/lib/translation.loader.csr.mjs +0 -44
- package/esm2022/lib/translation.loader.ssr.mjs +0 -89
- package/esm2022/lib/translation.service.mjs +0 -165
- package/esm2022/ngx-atomic-i18n.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/index.d.ts +0 -5
- package/lib/FIFO.model.d.ts +0 -21
- package/lib/translate.pipe.d.ts +0 -10
- package/lib/translate.provider.d.ts +0 -17
- package/lib/translate.token.d.ts +0 -15
- package/lib/translate.type.d.ts +0 -103
- package/lib/translate.util.d.ts +0 -28
- package/lib/translation-core.service.d.ts +0 -55
- package/lib/translation.directive.d.ts +0 -15
- package/lib/translation.loader.csr.d.ts +0 -10
- package/lib/translation.loader.ssr.d.ts +0 -17
- package/lib/translation.service.d.ts +0 -60
- package/public-api.d.ts +0 -11
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { computed, effect, Inject, inject, Injectable } from "@angular/core";
|
|
2
|
-
import { BUILD_VERSION, PAGE_TRANSLATION_ROOT, TRANSLATION_CONFIG, TRANSLATION_LOADER, TRANSLATION_NAMESPACE } from "./translate.token";
|
|
3
|
-
import { detectBuildVersion, toObservable } from "./translate.util";
|
|
4
|
-
import { TranslationCoreService } from "./translation-core.service";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class TranslationService {
|
|
7
|
-
namespaceInput;
|
|
8
|
-
/** Shared translation configuration resolved from the host application. */
|
|
9
|
-
config = inject(TRANSLATION_CONFIG);
|
|
10
|
-
parent = inject(TranslationService, { skipSelf: true, optional: true });
|
|
11
|
-
isPageRoot = inject(PAGE_TRANSLATION_ROOT, { self: true, optional: true }) ?? false;
|
|
12
|
-
/** Core translation engine that handles lookups and formatter lifecycle. */
|
|
13
|
-
core = inject(TranslationCoreService);
|
|
14
|
-
/** Loader implementation responsible for fetching translation payloads. */
|
|
15
|
-
loader = inject(TRANSLATION_LOADER);
|
|
16
|
-
/** Optional build fingerprint for cache busting injected at runtime. */
|
|
17
|
-
injectedVersion = inject(BUILD_VERSION, { optional: true });
|
|
18
|
-
/** Flag used to guard debug logging output. */
|
|
19
|
-
debugEnabled = !!this.config.debug;
|
|
20
|
-
/** Observable mirror of the language signal for consumers outside of signals. */
|
|
21
|
-
onLangChange = toObservable(this.lang);
|
|
22
|
-
/** Namespace currently owned by this service instance. */
|
|
23
|
-
namespace = '';
|
|
24
|
-
get lang() {
|
|
25
|
-
return computed(() => this.core.lang());
|
|
26
|
-
}
|
|
27
|
-
get currentLang() {
|
|
28
|
-
return this.core.currentLang;
|
|
29
|
-
}
|
|
30
|
-
get supportedLangs() {
|
|
31
|
-
return this.config.supportedLangs;
|
|
32
|
-
}
|
|
33
|
-
/** Build version identifier used to scope namespace caches. */
|
|
34
|
-
buildVersion = this.injectedVersion ?? detectBuildVersion();
|
|
35
|
-
/** Composes the unique key used to store namespace resources per lang and build. */
|
|
36
|
-
get getNskey() {
|
|
37
|
-
const version = this.buildVersion;
|
|
38
|
-
return version ? `${this.lang()}:${this.namespace}:${version}` : `${this.lang()}:${this.namespace}`;
|
|
39
|
-
}
|
|
40
|
-
/** Signal that flips to true when the namespace resources are available. */
|
|
41
|
-
get readySignal() {
|
|
42
|
-
return this.core.readySignal(this.namespace, this.buildVersion ?? undefined);
|
|
43
|
-
}
|
|
44
|
-
/** Convenience boolean wrapper around the readiness signal. */
|
|
45
|
-
get ready() {
|
|
46
|
-
return this.core.readySignal(this.namespace, this.buildVersion ?? undefined)();
|
|
47
|
-
}
|
|
48
|
-
constructor(namespaceInput) {
|
|
49
|
-
this.namespaceInput = namespaceInput;
|
|
50
|
-
this.namespace = namespaceInput;
|
|
51
|
-
effect(() => {
|
|
52
|
-
const nsKey = this.getNskey;
|
|
53
|
-
if (!this.ready) {
|
|
54
|
-
this.info(`Namespace "${this.namespace}" is not ready. Loading for "${this.lang()}" using key "${nsKey}".`);
|
|
55
|
-
this.core.load(nsKey, () => this.loader.load(this.config.i18nRoots, this.namespace, this.lang()));
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
/** Switches the active language and triggers downstream refresh logic. */
|
|
60
|
-
setLang(lang) {
|
|
61
|
-
this.info(`setLang called with "${lang}".`);
|
|
62
|
-
this.core.setLang(lang);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Resolves the translation for `key`, formatting with the provided params
|
|
66
|
-
* and falling back to configured behaviors when a translation is missing.
|
|
67
|
-
*/
|
|
68
|
-
t(key, params = {}) {
|
|
69
|
-
const nsKey = this.getNskey;
|
|
70
|
-
const missingResult = this.getMissingTranslation(key);
|
|
71
|
-
if (!this.ready) {
|
|
72
|
-
this.warn(`Namespace "${this.namespace}" is not ready.`);
|
|
73
|
-
return '';
|
|
74
|
-
}
|
|
75
|
-
const formatResult = this.core.getAndCreateFormatter(nsKey, key);
|
|
76
|
-
if (formatResult)
|
|
77
|
-
return formatResult.format(params);
|
|
78
|
-
if (this.config.enablePageFallback && !this.isPageRoot && this.parent) {
|
|
79
|
-
return this.parent.t(key, params);
|
|
80
|
-
}
|
|
81
|
-
const fallback = this.core.findFallbackFormatter(key, [], this.buildVersion ?? undefined);
|
|
82
|
-
if (fallback) {
|
|
83
|
-
this.info(`Resolved key "${key}" via fallback namespace while rendering "${this.namespace}".`);
|
|
84
|
-
return fallback.format(params);
|
|
85
|
-
}
|
|
86
|
-
this.warn(`Missing translation for key "${key}" in namespace "${this.namespace}". Returning fallback value.`);
|
|
87
|
-
return missingResult;
|
|
88
|
-
}
|
|
89
|
-
/** Determines the fallback string or error when a translation entry is missing. */
|
|
90
|
-
getMissingTranslation(key) {
|
|
91
|
-
const forceMode = this.config.missingTranslationBehavior ?? 'show-key';
|
|
92
|
-
switch (forceMode) {
|
|
93
|
-
case 'throw-error':
|
|
94
|
-
throw new Error(`[i18n] Missing translation: ${key} in ${this.namespace}`);
|
|
95
|
-
case 'empty':
|
|
96
|
-
this.warn(`Missing translation returned an empty string for key "${key}" in namespace "${this.namespace}".`);
|
|
97
|
-
return '';
|
|
98
|
-
case 'show-key':
|
|
99
|
-
if (key) {
|
|
100
|
-
this.warn(`Showing key "${key}" because no translation was found in namespace "${this.namespace}".`);
|
|
101
|
-
}
|
|
102
|
-
return key ?? '';
|
|
103
|
-
default: return forceMode;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/** Pass-through helpers that delegate resource management to the core service. */
|
|
107
|
-
addResourceBundle(...p) {
|
|
108
|
-
return this.core.addResourceBundle(...p);
|
|
109
|
-
}
|
|
110
|
-
addResources(...p) {
|
|
111
|
-
return this.core.addResources(...p);
|
|
112
|
-
}
|
|
113
|
-
addResource(...p) {
|
|
114
|
-
return this.core.addResource(...p);
|
|
115
|
-
}
|
|
116
|
-
hasResourceBundle(...p) {
|
|
117
|
-
return this.core.hasResourceBundle(...p);
|
|
118
|
-
}
|
|
119
|
-
getResource(...p) {
|
|
120
|
-
return this.core.getResource(...p);
|
|
121
|
-
}
|
|
122
|
-
getResourceBundle(...p) {
|
|
123
|
-
return this.core.getResourceBundle(...p);
|
|
124
|
-
}
|
|
125
|
-
getAllBundle() {
|
|
126
|
-
return this.core.getAllBundle();
|
|
127
|
-
}
|
|
128
|
-
removeResourceBundle(...p) {
|
|
129
|
-
return this.core.removeResourceBundle(...p);
|
|
130
|
-
}
|
|
131
|
-
preloadNamespaces(...p) {
|
|
132
|
-
return this.core.preloadNamespaces(...p);
|
|
133
|
-
}
|
|
134
|
-
/** Emits debug info when verbose logging is enabled. */
|
|
135
|
-
info(message, ...details) {
|
|
136
|
-
if (!this.debugEnabled)
|
|
137
|
-
return;
|
|
138
|
-
if (details.length) {
|
|
139
|
-
console.info(`[ngx-atomic-i18n] ${message}`, ...details);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
console.info(`[ngx-atomic-i18n] ${message}`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
/** Emits debug warnings when verbose logging is enabled. */
|
|
146
|
-
warn(message, ...details) {
|
|
147
|
-
if (!this.debugEnabled)
|
|
148
|
-
return;
|
|
149
|
-
if (details.length) {
|
|
150
|
-
console.warn(`[ngx-atomic-i18n] ${message}`, ...details);
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
console.warn(`[ngx-atomic-i18n] ${message}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationService, deps: [{ token: TRANSLATION_NAMESPACE }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
157
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationService });
|
|
158
|
-
}
|
|
159
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationService, decorators: [{
|
|
160
|
-
type: Injectable
|
|
161
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
162
|
-
type: Inject,
|
|
163
|
-
args: [TRANSLATION_NAMESPACE]
|
|
164
|
-
}] }] });
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdG9taWMtaTE4bi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhJLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFHcEUsTUFBTSxPQUFPLGtCQUFrQjtJQWtEb0I7SUFqRGpELDJFQUEyRTtJQUMxRCxNQUFNLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3JHLDRFQUE0RTtJQUMzRCxJQUFJLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDdkQsMkVBQTJFO0lBQzFELE1BQU0sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyRCx3RUFBd0U7SUFDdkQsZUFBZSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQThCLENBQUM7SUFDMUcsK0NBQStDO0lBQzlCLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFFcEQsaUZBQWlGO0lBQ3hFLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELDBEQUEwRDtJQUNsRCxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXZCLElBQUksSUFBSTtRQUNOLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVELCtEQUErRDtJQUM5QyxZQUFZLEdBQWtCLElBQUksQ0FBQyxlQUFlLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUU1RixvRkFBb0Y7SUFDcEYsSUFBSSxRQUFRO1FBQ1YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNsQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RHLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQ2pGLENBQUM7SUFFRCxZQUNpRCxjQUFzQjtRQUF0QixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUVyRSxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNoQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsZ0NBQWdDLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQzVHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEcsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxPQUFPLENBQUMsSUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxDQUFDLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQUU7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLFlBQVk7WUFBRSxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQzFGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDZDQUE2QyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUMvRixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsbUJBQW1CLElBQUksQ0FBQyxTQUFTLDhCQUE4QixDQUFDLENBQUM7UUFDOUcsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELG1GQUFtRjtJQUMzRSxxQkFBcUIsQ0FBQyxHQUFZO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLElBQUksVUFBVSxDQUFDO1FBQ3ZFLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxhQUFhO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixHQUFHLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0UsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxJQUFJLENBQUMseURBQXlELEdBQUcsbUJBQW1CLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO2dCQUM3RyxPQUFPLEVBQUUsQ0FBQztZQUNaLEtBQUssVUFBVTtnQkFDYixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsb0RBQW9ELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO2dCQUN2RyxDQUFDO2dCQUNELE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixpQkFBaUIsQ0FBQyxHQUFHLENBQTBEO1FBQzdFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxZQUFZLENBQUMsR0FBRyxDQUFxRDtRQUNuRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELFdBQVcsQ0FBQyxHQUFHLENBQW9EO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsR0FBRyxDQUEwRDtRQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQUcsQ0FBb0Q7UUFDakUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxHQUFHLENBQTBEO1FBQzdFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxHQUFHLENBQTZEO1FBQ25GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxHQUFHLENBQTBEO1FBQzdFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCx3REFBd0Q7SUFDaEQsSUFBSSxDQUFDLE9BQWUsRUFBRSxHQUFHLE9BQWtCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDL0IsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCw0REFBNEQ7SUFDcEQsSUFBSSxDQUFDLE9BQWUsRUFBRSxHQUFHLE9BQWtCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDL0IsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7d0dBL0pVLGtCQUFrQixrQkFrRG5CLHFCQUFxQjs0R0FsRHBCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVTs7MEJBbUROLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgSW5qZWN0LCBpbmplY3QsIEluamVjdGFibGUsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCVUlMRF9WRVJTSU9OLCBQQUdFX1RSQU5TTEFUSU9OX1JPT1QsIFRSQU5TTEFUSU9OX0NPTkZJRywgVFJBTlNMQVRJT05fTE9BREVSLCBUUkFOU0xBVElPTl9OQU1FU1BBQ0UgfSBmcm9tIFwiLi90cmFuc2xhdGUudG9rZW5cIjtcbmltcG9ydCB7IFBhcmFtcyB9IGZyb20gXCIuL3RyYW5zbGF0ZS50eXBlXCI7XG5pbXBvcnQgeyBkZXRlY3RCdWlsZFZlcnNpb24sIHRvT2JzZXJ2YWJsZSB9IGZyb20gXCIuL3RyYW5zbGF0ZS51dGlsXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbkNvcmVTZXJ2aWNlIH0gZnJvbSBcIi4vdHJhbnNsYXRpb24tY29yZS5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvblNlcnZpY2Uge1xuICAvKiogU2hhcmVkIHRyYW5zbGF0aW9uIGNvbmZpZ3VyYXRpb24gcmVzb2x2ZWQgZnJvbSB0aGUgaG9zdCBhcHBsaWNhdGlvbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoVFJBTlNMQVRJT05fQ09ORklHKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQgPSBpbmplY3QoVHJhbnNsYXRpb25TZXJ2aWNlLCB7IHNraXBTZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1BhZ2VSb290ID0gaW5qZWN0KFBBR0VfVFJBTlNMQVRJT05fUk9PVCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KSA/PyBmYWxzZTtcbiAgLyoqIENvcmUgdHJhbnNsYXRpb24gZW5naW5lIHRoYXQgaGFuZGxlcyBsb29rdXBzIGFuZCBmb3JtYXR0ZXIgbGlmZWN5Y2xlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcmUgPSBpbmplY3QoVHJhbnNsYXRpb25Db3JlU2VydmljZSk7XG4gIC8qKiBMb2FkZXIgaW1wbGVtZW50YXRpb24gcmVzcG9uc2libGUgZm9yIGZldGNoaW5nIHRyYW5zbGF0aW9uIHBheWxvYWRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IGluamVjdChUUkFOU0xBVElPTl9MT0FERVIpO1xuICAvKiogT3B0aW9uYWwgYnVpbGQgZmluZ2VycHJpbnQgZm9yIGNhY2hlIGJ1c3RpbmcgaW5qZWN0ZWQgYXQgcnVudGltZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RlZFZlcnNpb24gPSBpbmplY3QoQlVJTERfVkVSU0lPTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSBhcyBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAvKiogRmxhZyB1c2VkIHRvIGd1YXJkIGRlYnVnIGxvZ2dpbmcgb3V0cHV0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnRW5hYmxlZCA9ICEhdGhpcy5jb25maWcuZGVidWc7XG5cbiAgLyoqIE9ic2VydmFibGUgbWlycm9yIG9mIHRoZSBsYW5ndWFnZSBzaWduYWwgZm9yIGNvbnN1bWVycyBvdXRzaWRlIG9mIHNpZ25hbHMuICovXG4gIHJlYWRvbmx5IG9uTGFuZ0NoYW5nZSA9IHRvT2JzZXJ2YWJsZSh0aGlzLmxhbmcpO1xuICAvKiogTmFtZXNwYWNlIGN1cnJlbnRseSBvd25lZCBieSB0aGlzIHNlcnZpY2UgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgbmFtZXNwYWNlID0gJyc7XG5cbiAgZ2V0IGxhbmcoKTogU2lnbmFsPHN0cmluZz4ge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB0aGlzLmNvcmUubGFuZygpKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvcmUuY3VycmVudExhbmc7XG4gIH1cbiAgZ2V0IHN1cHBvcnRlZExhbmdzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc3VwcG9ydGVkTGFuZ3M7XG4gIH1cblxuICAvKiogQnVpbGQgdmVyc2lvbiBpZGVudGlmaWVyIHVzZWQgdG8gc2NvcGUgbmFtZXNwYWNlIGNhY2hlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBidWlsZFZlcnNpb246IHN0cmluZyB8IG51bGwgPSB0aGlzLmluamVjdGVkVmVyc2lvbiA/PyBkZXRlY3RCdWlsZFZlcnNpb24oKTtcblxuICAvKiogQ29tcG9zZXMgdGhlIHVuaXF1ZSBrZXkgdXNlZCB0byBzdG9yZSBuYW1lc3BhY2UgcmVzb3VyY2VzIHBlciBsYW5nIGFuZCBidWlsZC4gKi9cbiAgZ2V0IGdldE5za2V5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuYnVpbGRWZXJzaW9uO1xuICAgIHJldHVybiB2ZXJzaW9uID8gYCR7dGhpcy5sYW5nKCl9OiR7dGhpcy5uYW1lc3BhY2V9OiR7dmVyc2lvbn1gIDogYCR7dGhpcy5sYW5nKCl9OiR7dGhpcy5uYW1lc3BhY2V9YDtcbiAgfVxuXG4gIC8qKiBTaWduYWwgdGhhdCBmbGlwcyB0byB0cnVlIHdoZW4gdGhlIG5hbWVzcGFjZSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZS4gKi9cbiAgZ2V0IHJlYWR5U2lnbmFsKCk6IFNpZ25hbDxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5yZWFkeVNpZ25hbCh0aGlzLm5hbWVzcGFjZSwgdGhpcy5idWlsZFZlcnNpb24gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKiBDb252ZW5pZW5jZSBib29sZWFuIHdyYXBwZXIgYXJvdW5kIHRoZSByZWFkaW5lc3Mgc2lnbmFsLiAqL1xuICBnZXQgcmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5yZWFkeVNpZ25hbCh0aGlzLm5hbWVzcGFjZSwgdGhpcy5idWlsZFZlcnNpb24gPz8gdW5kZWZpbmVkKSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChUUkFOU0xBVElPTl9OQU1FU1BBQ0UpIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2VJbnB1dDogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZUlucHV0O1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBuc0tleSA9IHRoaXMuZ2V0TnNrZXk7XG4gICAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgICAgdGhpcy5pbmZvKGBOYW1lc3BhY2UgXCIke3RoaXMubmFtZXNwYWNlfVwiIGlzIG5vdCByZWFkeS4gTG9hZGluZyBmb3IgXCIke3RoaXMubGFuZygpfVwiIHVzaW5nIGtleSBcIiR7bnNLZXl9XCIuYCk7XG4gICAgICAgIHRoaXMuY29yZS5sb2FkKG5zS2V5LCAoKSA9PiB0aGlzLmxvYWRlci5sb2FkKHRoaXMuY29uZmlnLmkxOG5Sb290cywgdGhpcy5uYW1lc3BhY2UsIHRoaXMubGFuZygpKSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTd2l0Y2hlcyB0aGUgYWN0aXZlIGxhbmd1YWdlIGFuZCB0cmlnZ2VycyBkb3duc3RyZWFtIHJlZnJlc2ggbG9naWMuICovXG4gIHNldExhbmcobGFuZzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbmZvKGBzZXRMYW5nIGNhbGxlZCB3aXRoIFwiJHtsYW5nfVwiLmApO1xuICAgIHRoaXMuY29yZS5zZXRMYW5nKGxhbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB0cmFuc2xhdGlvbiBmb3IgYGtleWAsIGZvcm1hdHRpbmcgd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1zXG4gICAqIGFuZCBmYWxsaW5nIGJhY2sgdG8gY29uZmlndXJlZCBiZWhhdmlvcnMgd2hlbiBhIHRyYW5zbGF0aW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICB0KGtleTogc3RyaW5nLCBwYXJhbXM6IFBhcmFtcyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBuc0tleSA9IHRoaXMuZ2V0TnNrZXk7XG4gICAgY29uc3QgbWlzc2luZ1Jlc3VsdCA9IHRoaXMuZ2V0TWlzc2luZ1RyYW5zbGF0aW9uKGtleSk7XG4gICAgaWYgKCF0aGlzLnJlYWR5KSB7XG4gICAgICB0aGlzLndhcm4oYE5hbWVzcGFjZSBcIiR7dGhpcy5uYW1lc3BhY2V9XCIgaXMgbm90IHJlYWR5LmApO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXRSZXN1bHQgPSB0aGlzLmNvcmUuZ2V0QW5kQ3JlYXRlRm9ybWF0dGVyKG5zS2V5LCBrZXkpO1xuICAgIGlmIChmb3JtYXRSZXN1bHQpIHJldHVybiBmb3JtYXRSZXN1bHQuZm9ybWF0KHBhcmFtcyk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuZW5hYmxlUGFnZUZhbGxiYWNrICYmICF0aGlzLmlzUGFnZVJvb3QgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC50KGtleSwgcGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmNvcmUuZmluZEZhbGxiYWNrRm9ybWF0dGVyKGtleSwgW10sIHRoaXMuYnVpbGRWZXJzaW9uID8/IHVuZGVmaW5lZCk7XG4gICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICB0aGlzLmluZm8oYFJlc29sdmVkIGtleSBcIiR7a2V5fVwiIHZpYSBmYWxsYmFjayBuYW1lc3BhY2Ugd2hpbGUgcmVuZGVyaW5nIFwiJHt0aGlzLm5hbWVzcGFjZX1cIi5gKTtcbiAgICAgIHJldHVybiBmYWxsYmFjay5mb3JtYXQocGFyYW1zKTtcbiAgICB9XG4gICAgdGhpcy53YXJuKGBNaXNzaW5nIHRyYW5zbGF0aW9uIGZvciBrZXkgXCIke2tleX1cIiBpbiBuYW1lc3BhY2UgXCIke3RoaXMubmFtZXNwYWNlfVwiLiBSZXR1cm5pbmcgZmFsbGJhY2sgdmFsdWUuYCk7XG4gICAgcmV0dXJuIG1pc3NpbmdSZXN1bHQ7XG4gIH1cblxuICAvKiogRGV0ZXJtaW5lcyB0aGUgZmFsbGJhY2sgc3RyaW5nIG9yIGVycm9yIHdoZW4gYSB0cmFuc2xhdGlvbiBlbnRyeSBpcyBtaXNzaW5nLiAqL1xuICBwcml2YXRlIGdldE1pc3NpbmdUcmFuc2xhdGlvbihrZXk/OiBzdHJpbmcpOiBzdHJpbmcgfCBuZXZlciB7XG4gICAgY29uc3QgZm9yY2VNb2RlID0gdGhpcy5jb25maWcubWlzc2luZ1RyYW5zbGF0aW9uQmVoYXZpb3IgPz8gJ3Nob3cta2V5JztcbiAgICBzd2l0Y2ggKGZvcmNlTW9kZSkge1xuICAgICAgY2FzZSAndGhyb3ctZXJyb3InOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtpMThuXSBNaXNzaW5nIHRyYW5zbGF0aW9uOiAke2tleX0gaW4gJHt0aGlzLm5hbWVzcGFjZX1gKTtcbiAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgdGhpcy53YXJuKGBNaXNzaW5nIHRyYW5zbGF0aW9uIHJldHVybmVkIGFuIGVtcHR5IHN0cmluZyBmb3Iga2V5IFwiJHtrZXl9XCIgaW4gbmFtZXNwYWNlIFwiJHt0aGlzLm5hbWVzcGFjZX1cIi5gKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgY2FzZSAnc2hvdy1rZXknOlxuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgdGhpcy53YXJuKGBTaG93aW5nIGtleSBcIiR7a2V5fVwiIGJlY2F1c2Ugbm8gdHJhbnNsYXRpb24gd2FzIGZvdW5kIGluIG5hbWVzcGFjZSBcIiR7dGhpcy5uYW1lc3BhY2V9XCIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleSA/PyAnJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBmb3JjZU1vZGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBhc3MtdGhyb3VnaCBoZWxwZXJzIHRoYXQgZGVsZWdhdGUgcmVzb3VyY2UgbWFuYWdlbWVudCB0byB0aGUgY29yZSBzZXJ2aWNlLiAqL1xuICBhZGRSZXNvdXJjZUJ1bmRsZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ2FkZFJlc291cmNlQnVuZGxlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5hZGRSZXNvdXJjZUJ1bmRsZSguLi5wKTtcbiAgfVxuICBhZGRSZXNvdXJjZXMoLi4ucDogUGFyYW1ldGVyczxUcmFuc2xhdGlvbkNvcmVTZXJ2aWNlWydhZGRSZXNvdXJjZXMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmFkZFJlc291cmNlcyguLi5wKTtcbiAgfVxuICBhZGRSZXNvdXJjZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ2FkZFJlc291cmNlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5hZGRSZXNvdXJjZSguLi5wKTtcbiAgfVxuICBoYXNSZXNvdXJjZUJ1bmRsZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ2hhc1Jlc291cmNlQnVuZGxlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5oYXNSZXNvdXJjZUJ1bmRsZSguLi5wKTtcbiAgfVxuICBnZXRSZXNvdXJjZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ2dldFJlc291cmNlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRSZXNvdXJjZSguLi5wKTtcbiAgfVxuICBnZXRSZXNvdXJjZUJ1bmRsZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ2dldFJlc291cmNlQnVuZGxlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRSZXNvdXJjZUJ1bmRsZSguLi5wKTtcbiAgfVxuICBnZXRBbGxCdW5kbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRBbGxCdW5kbGUoKTtcbiAgfVxuICByZW1vdmVSZXNvdXJjZUJ1bmRsZSguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ3JlbW92ZVJlc291cmNlQnVuZGxlJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5yZW1vdmVSZXNvdXJjZUJ1bmRsZSguLi5wKTtcbiAgfVxuICBwcmVsb2FkTmFtZXNwYWNlcyguLi5wOiBQYXJhbWV0ZXJzPFRyYW5zbGF0aW9uQ29yZVNlcnZpY2VbJ3ByZWxvYWROYW1lc3BhY2VzJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5wcmVsb2FkTmFtZXNwYWNlcyguLi5wKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBkZWJ1ZyBpbmZvIHdoZW4gdmVyYm9zZSBsb2dnaW5nIGlzIGVuYWJsZWQuICovXG4gIHByaXZhdGUgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmRldGFpbHM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZWQpIHJldHVybjtcbiAgICBpZiAoZGV0YWlscy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW25neC1hdG9taWMtaTE4bl0gJHttZXNzYWdlfWAsIC4uLmRldGFpbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oYFtuZ3gtYXRvbWljLWkxOG5dICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKiogRW1pdHMgZGVidWcgd2FybmluZ3Mgd2hlbiB2ZXJib3NlIGxvZ2dpbmcgaXMgZW5hYmxlZC4gKi9cbiAgcHJpdmF0ZSB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uZGV0YWlsczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRlYnVnRW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChkZXRhaWxzLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKGBbbmd4LWF0b21pYy1pMThuXSAke21lc3NhZ2V9YCwgLi4uZGV0YWlscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgW25neC1hdG9taWMtaTE4bl0gJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF0b21pYy1pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF0b21pYy1pMThuL3NyYy9uZ3gtYXRvbWljLWkxOG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of ngx-atomic-i18n
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/translation.service';
|
|
5
|
-
export * from './lib/translation-core.service';
|
|
6
|
-
export * from './lib/translate.pipe';
|
|
7
|
-
export * from './lib/translation.directive';
|
|
8
|
-
export * from './lib/translate.provider';
|
|
9
|
-
export * from './lib/translation.loader.csr';
|
|
10
|
-
export * from './lib/translation.loader.ssr';
|
|
11
|
-
export * from './lib/translate.token';
|
|
12
|
-
export * from './lib/translate.type';
|
|
13
|
-
export * from './lib/translate.util';
|
|
14
|
-
export * from './lib/FIFO.model';
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1hdG9taWMtaTE4bi9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWF0b21pYy1pMThuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNsYXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90cmFuc2xhdGlvbi1jb3JlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNsYXRlLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNsYXRpb24uZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RyYW5zbGF0ZS5wcm92aWRlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90cmFuc2xhdGlvbi5sb2FkZXIuY3NyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RyYW5zbGF0aW9uLmxvYWRlci5zc3InO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNsYXRlLnRva2VuJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RyYW5zbGF0ZS50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RyYW5zbGF0ZS51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL0ZJRk8ubW9kZWwnO1xuIl19
|
package/index.d.ts
DELETED
package/lib/FIFO.model.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/** Combined FIFO/LRU cache used to store compiled formatters. */
|
|
2
|
-
export declare class FIFOCache<K, V> {
|
|
3
|
-
private max;
|
|
4
|
-
private map;
|
|
5
|
-
get size(): number;
|
|
6
|
-
constructor(max: number);
|
|
7
|
-
set(key: K, value: V): void;
|
|
8
|
-
get(key: K): V | undefined;
|
|
9
|
-
has(key: K): boolean;
|
|
10
|
-
delete(k: K): void;
|
|
11
|
-
clear(): void;
|
|
12
|
-
/** Utility helper for controlled external iteration/manipulation. */
|
|
13
|
-
keys(): IterableIterator<K>;
|
|
14
|
-
/** Iterates cached values without exposing the backing Map. */
|
|
15
|
-
forEach(cb: (value: V, key: K) => void): void;
|
|
16
|
-
/**
|
|
17
|
-
* Delete all entries that match the predicate.
|
|
18
|
-
* Returns the number of deleted entries.
|
|
19
|
-
*/
|
|
20
|
-
deleteWhere(predicate: (key: K, value: V) => boolean): number;
|
|
21
|
-
}
|
package/lib/translate.pipe.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { PipeTransform } from "@angular/core";
|
|
2
|
-
import { Params } from "./translate.type";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class TranslationPipe implements PipeTransform {
|
|
5
|
-
private readonly service;
|
|
6
|
-
/** Formats the translation identified by `key` using the optional params. */
|
|
7
|
-
transform(key: string, params?: Params): string;
|
|
8
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationPipe, never>;
|
|
9
|
-
static ɵpipe: i0.ɵɵPipeDeclaration<TranslationPipe, "t", true>;
|
|
10
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Provider } from "@angular/core";
|
|
2
|
-
import { TranslationConfig, TranslationLoaderOptions } from "./translate.type";
|
|
3
|
-
export type ProvideTranslationInitOptions = Partial<TranslationConfig> & {
|
|
4
|
-
loader?: TranslationLoaderOptions;
|
|
5
|
-
/** Optional global build version for SSR/CSR to align caches */
|
|
6
|
-
buildVersion?: string | null;
|
|
7
|
-
};
|
|
8
|
-
export declare const defaultConfig: TranslationConfig;
|
|
9
|
-
/** Bootstraps the entire translation infrastructure for an application. */
|
|
10
|
-
export declare function provideTranslationInit(userConfig?: ProvideTranslationInitOptions): Provider[];
|
|
11
|
-
/** Provides the component-scoped namespace injection for component-registered service.
|
|
12
|
-
* @param namespace The namespace owned by the component.
|
|
13
|
-
* @param isPage Whether the component is a top-level page (defaults to false).
|
|
14
|
-
*/
|
|
15
|
-
export declare function provideTranslation(namespace: string, isPage?: boolean): Provider[];
|
|
16
|
-
/** Configures the runtime translation loader for CSR or SSR environments. */
|
|
17
|
-
export declare function provideTranslationLoader(config: ProvideTranslationInitOptions): Provider[];
|
package/lib/translate.token.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from "@angular/core";
|
|
2
|
-
import { TranslationConfig, TranslationLoader } from "./translate.type";
|
|
3
|
-
/** Scoped namespace for translating a component tree (string or array). */
|
|
4
|
-
export declare const TRANSLATION_NAMESPACE: InjectionToken<string>;
|
|
5
|
-
/** Root configuration describing language support and loader behavior. */
|
|
6
|
-
export declare const TRANSLATION_CONFIG: InjectionToken<TranslationConfig>;
|
|
7
|
-
/** Factory used to retrieve translation JSON for a namespace/language tuple. */
|
|
8
|
-
export declare const TRANSLATION_LOADER: InjectionToken<TranslationLoader>;
|
|
9
|
-
/** Optional build fingerprint appended to namespace cache keys. */
|
|
10
|
-
export declare const BUILD_VERSION: InjectionToken<string>;
|
|
11
|
-
/** Custom ICU formatter constructor injected by the host app when available. */
|
|
12
|
-
export declare const ICU_FORMATTER_TOKEN: InjectionToken<any>;
|
|
13
|
-
export declare const PAGE_TRANSLATION_ROOT: InjectionToken<boolean>;
|
|
14
|
-
/** Per-request language captured during SSR and replayed on CSR. */
|
|
15
|
-
export declare const CLIENT_REQUEST_LANG: InjectionToken<string>;
|
package/lib/translate.type.d.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from "@angular/common/http";
|
|
2
|
-
import { Signal } from "@angular/core";
|
|
3
|
-
/** Global configuration contract used by the translation system. */
|
|
4
|
-
export interface TranslationConfig {
|
|
5
|
-
supportedLangs: string[];
|
|
6
|
-
fallbackLang: string;
|
|
7
|
-
i18nRoots: string[];
|
|
8
|
-
pathTemplates: string[] | string;
|
|
9
|
-
fallbackNamespace: string;
|
|
10
|
-
langDetectionOrder: ('localStorage' | 'url' | 'browser' | 'customLang' | 'fallback' | 'clientRequest')[];
|
|
11
|
-
/** Enable verbose logging. Defaults to true in dev mode. */
|
|
12
|
-
debug?: boolean;
|
|
13
|
-
/** Enable use */
|
|
14
|
-
enablePageFallback: boolean;
|
|
15
|
-
preloadNamespaces?: string[];
|
|
16
|
-
customLang?: (() => string) | string;
|
|
17
|
-
/** Language passed from SSR request and reused on the client. */
|
|
18
|
-
clientRequestLang?: string | null;
|
|
19
|
-
missingTranslationBehavior?: MissingTranslationBehavior;
|
|
20
|
-
}
|
|
21
|
-
/** Metadata passed into consumers to indicate namespace readiness. */
|
|
22
|
-
export interface TranslationContext {
|
|
23
|
-
namespace: string;
|
|
24
|
-
ready?: Signal<boolean>;
|
|
25
|
-
}
|
|
26
|
-
export type LazyLoader = Record<Lang, () => Promise<Translations>>;
|
|
27
|
-
export type Params = Record<string, any>;
|
|
28
|
-
export type Translations = Record<string, string>;
|
|
29
|
-
export type Lang = string;
|
|
30
|
-
/** lang:namespace:version */
|
|
31
|
-
export type nsKey = string;
|
|
32
|
-
/**
|
|
33
|
-
* How the translation system should behave when a translation key is missing.
|
|
34
|
-
*
|
|
35
|
-
* - 'show-key': Display the key itself (e.g., `'menu.about'`) as a fallback.
|
|
36
|
-
* - 'empty': Show an empty string. Use this if you prefer untranslated text to disappear silently.
|
|
37
|
-
* - 'throw': Throw a runtime error. Recommended only during development or testing; will break the UI if not handled.
|
|
38
|
-
* - string: Any custom string, e.g., '--', 'loading...', etc.
|
|
39
|
-
*/
|
|
40
|
-
export type MissingTranslationBehavior = 'show-key' | 'empty' | 'throw-error';
|
|
41
|
-
export interface TranslationLoader {
|
|
42
|
-
/**
|
|
43
|
-
* @param i18nRoot List of base folders to look for JSON (ordered by priority)
|
|
44
|
-
* @param ns Namespace, e.g. "home" or "auth-login"
|
|
45
|
-
* @param lang Language code, e.g. "en" or "zh-Hant"
|
|
46
|
-
*/
|
|
47
|
-
load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations>;
|
|
48
|
-
}
|
|
49
|
-
export type FormatResult = {
|
|
50
|
-
format(params: Record<string, any>): string;
|
|
51
|
-
};
|
|
52
|
-
export type DeepPartial<T> = {
|
|
53
|
-
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
54
|
-
};
|
|
55
|
-
export interface FsModuleLike {
|
|
56
|
-
/** Minimal subset of Node's fs API needed by the SSR loader. */
|
|
57
|
-
readFileSync(path: string, encoding: 'utf8'): string;
|
|
58
|
-
statSync(path: string): any;
|
|
59
|
-
}
|
|
60
|
-
/** Options used to customise the SSR file-system loader. */
|
|
61
|
-
export interface FsLoaderOptions {
|
|
62
|
-
/** only for SSR , e.g. process.cwd() */
|
|
63
|
-
baseDir?: string;
|
|
64
|
-
/** e.g. 'projects/app/src/assets' (dev) or 'dist/app/browser/assets' */
|
|
65
|
-
assetPath?: string;
|
|
66
|
-
/** Custom resolver that returns an ordered list of candidate absolute paths. */
|
|
67
|
-
resolvePaths?: (ctx: {
|
|
68
|
-
baseDir: string;
|
|
69
|
-
assetPath: string;
|
|
70
|
-
root: string;
|
|
71
|
-
lang: string;
|
|
72
|
-
namespace: string;
|
|
73
|
-
}) => string[];
|
|
74
|
-
/** Custom fs module instance (takes precedence over dynamic imports). */
|
|
75
|
-
fsModule?: FsModuleLike;
|
|
76
|
-
cacheMax?: number;
|
|
77
|
-
}
|
|
78
|
-
/** Options used to customise the HTTP loader in CSR environments. */
|
|
79
|
-
export interface HttpLoaderOptions {
|
|
80
|
-
/** default '/assets' */
|
|
81
|
-
baseUrl?: string;
|
|
82
|
-
}
|
|
83
|
-
/** Aggregate options exposed via `provideTranslationInit`. */
|
|
84
|
-
export interface TranslationLoaderOptions {
|
|
85
|
-
forceMode?: 'ssr' | 'csr';
|
|
86
|
-
ssrLoader?: () => TranslationLoader;
|
|
87
|
-
csrLoader?: (http: HttpClient) => TranslationLoader;
|
|
88
|
-
fsOptions?: FsLoaderOptions;
|
|
89
|
-
httpOptions?: HttpLoaderOptions;
|
|
90
|
-
}
|
|
91
|
-
export type CacheEntry = {
|
|
92
|
-
mtimeMs: number;
|
|
93
|
-
data: Translations;
|
|
94
|
-
};
|
|
95
|
-
export type PathTemplate = string | string[] | undefined;
|
|
96
|
-
export declare enum TempToken {
|
|
97
|
-
/** Placeholder for the language code inside loader path templates. */
|
|
98
|
-
Lang = "{{lang}}",
|
|
99
|
-
/** Placeholder for the namespace inside loader path templates. */
|
|
100
|
-
Namespace = "{{namespace}}",
|
|
101
|
-
/** Placeholder for the root folder inside loader path templates. */
|
|
102
|
-
Root = "{{root}}"
|
|
103
|
-
}
|
package/lib/translate.util.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Signal } from "@angular/core";
|
|
2
|
-
import { DeepPartial, PathTemplate, TranslationConfig } from "./translate.type";
|
|
3
|
-
import { Observable } from "rxjs";
|
|
4
|
-
/** Normalizes a language code against the configured supported languages. */
|
|
5
|
-
export declare function normalizeLangCode(lang: string | null | undefined, supportedLangs: string[]): string | null;
|
|
6
|
-
/** Determines the most appropriate language using the configured detection order. */
|
|
7
|
-
export declare function detectPreferredLang(config: TranslationConfig): string;
|
|
8
|
-
/** Lightweight ICU parser that supports nested select/plural structures. */
|
|
9
|
-
export declare function parseICU(templateText: string, params?: Record<string, string | number>): string;
|
|
10
|
-
/** Flattens a nested translation object using dot notation keys. */
|
|
11
|
-
export declare function flattenTranslations(obj: any, prefix?: string): Record<string, string>;
|
|
12
|
-
/** Converts a signal to an observable while preserving injection context. */
|
|
13
|
-
export declare function toObservable<T>(signal: Signal<T>): Observable<T>;
|
|
14
|
-
/** Deeply merges plain objects, replacing non-object values by assignment. */
|
|
15
|
-
export declare function deepMerge<T extends object, U extends object>(target: T, source: U): T & U;
|
|
16
|
-
/** Recursively retains only keys that are not already present in the existing object. */
|
|
17
|
-
export declare function filterNewKeysDeep<T extends object, U extends object>(bundle: T, existing: U): DeepPartial<T>;
|
|
18
|
-
/** Safely reads a dotted path from a nested object. */
|
|
19
|
-
export declare function getNested(obj: any, path: string): string | undefined;
|
|
20
|
-
/** Removes any leading slashes from path-like strings. */
|
|
21
|
-
export declare const stripLeadingSep: (s: string) => string;
|
|
22
|
-
/** Normalises the path template configuration to an array form. */
|
|
23
|
-
export declare const tempToArray: (template: PathTemplate) => string[];
|
|
24
|
-
/**
|
|
25
|
-
* Detect current build version from injected script names (CSR only).
|
|
26
|
-
* Matches filenames like: main.<hash>.js, runtime.<hash>.js, polyfills.<hash>.js
|
|
27
|
-
*/
|
|
28
|
-
export declare function detectBuildVersion(): string | null;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Signal } from '@angular/core';
|
|
2
|
-
import { FormatResult, Translations } from './translate.type';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class TranslationCoreService {
|
|
5
|
-
/** Immutable runtime configuration injected from the library bootstrap. */
|
|
6
|
-
private readonly _config;
|
|
7
|
-
/** Active loader used to fetch namespace JSON payloads. */
|
|
8
|
-
private readonly _loader;
|
|
9
|
-
/** Optional custom ICU formatter constructor supplied by the host application. */
|
|
10
|
-
private readonly _ICU;
|
|
11
|
-
private readonly debugEnabled;
|
|
12
|
-
/** Reactive language state tracking the current locale. */
|
|
13
|
-
private readonly _lang;
|
|
14
|
-
readonly lang: Signal<string>;
|
|
15
|
-
/** Translation documents keyed by language then namespace. */
|
|
16
|
-
private readonly _jsonCache;
|
|
17
|
-
/** Version fingerprints captured alongside each namespace entry. */
|
|
18
|
-
private readonly _versionMap;
|
|
19
|
-
/** Least-recently-used cache of compiled ICU formatters. */
|
|
20
|
-
private readonly _formatterCache;
|
|
21
|
-
private _missingKeyCache;
|
|
22
|
-
private _inflight;
|
|
23
|
-
/** Caches compiled ICU expressions (with or without custom formatters). */
|
|
24
|
-
private readonly _icuCompiledCache;
|
|
25
|
-
readonly onLangChange: import("rxjs").Observable<string>;
|
|
26
|
-
readonly fallbackLang: string;
|
|
27
|
-
get currentLang(): string;
|
|
28
|
-
readySignal(namespace: string, version?: string): Signal<boolean>;
|
|
29
|
-
setLang(lang?: string): void;
|
|
30
|
-
load(nsKey: string, fetchFn: () => Promise<Translations>): Promise<void>;
|
|
31
|
-
getAndCreateFormatter(nsKey: string, key: string): FormatResult | undefined;
|
|
32
|
-
findFallbackFormatter(key: string, exclude: string[], version?: string): FormatResult | undefined;
|
|
33
|
-
preloadNamespaces(namespaces: string[], lang: string): Promise<void>;
|
|
34
|
-
private handleNewTranslations;
|
|
35
|
-
private hasJsonCacheValue;
|
|
36
|
-
addResourceBundle(lang: string, namespace: string, bundle: Translations, deep?: boolean, overwrite?: boolean): void;
|
|
37
|
-
addResources(lang: string, namespace: string, obj: Translations, overwrite?: boolean): void;
|
|
38
|
-
addResource(lang: string, namespace: string, key: string, val: string, overwrite?: boolean): void;
|
|
39
|
-
getAllBundle(): Map<string, Map<string, Record<string, any>>>;
|
|
40
|
-
hasResourceBundle(lang: string, namespace: string): boolean;
|
|
41
|
-
getResourceBundle(lang: string, namespace: string): Translations | undefined;
|
|
42
|
-
removeResourceBundle(lang: string, namespace: string): void;
|
|
43
|
-
/** Clear everything: data, versions, formatters, missing keys, inflight */
|
|
44
|
-
clearAll(): void;
|
|
45
|
-
/** Clear all resources for a language */
|
|
46
|
-
clearLang(lang: string): void;
|
|
47
|
-
/** Clear a specific namespace for a language */
|
|
48
|
-
clearNamespace(lang: string, namespace: string): void;
|
|
49
|
-
getResource(lang: string, namespace: string, key: string): string | undefined;
|
|
50
|
-
private log;
|
|
51
|
-
private error;
|
|
52
|
-
private warn;
|
|
53
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationCoreService, never>;
|
|
54
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<TranslationCoreService>;
|
|
55
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Params } from './translate.type';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class TranslationDirective {
|
|
4
|
-
private selfElm;
|
|
5
|
-
private service;
|
|
6
|
-
/** Translation key resolved for the host element. */
|
|
7
|
-
readonly t: import("@angular/core").InputSignal<string>;
|
|
8
|
-
/** Optional interpolation parameters passed to the translation formatter. */
|
|
9
|
-
readonly tParams: import("@angular/core").InputSignal<Params>;
|
|
10
|
-
/** Attribute name to receive the translated value instead of textContent. */
|
|
11
|
-
readonly tAttr: import("@angular/core").InputSignal<string>;
|
|
12
|
-
constructor();
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationDirective, never>;
|
|
14
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<TranslationDirective, "[t]", never, { "t": { "alias": "t"; "required": false; "isSignal": true; }; "tParams": { "alias": "tParams"; "required": false; "isSignal": true; }; "tAttr": { "alias": "tAttr"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
15
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from "@angular/common/http";
|
|
2
|
-
import { HttpLoaderOptions, TranslationLoader, Translations } from "./translate.type";
|
|
3
|
-
export declare class HttpTranslationLoader implements TranslationLoader {
|
|
4
|
-
private readonly http;
|
|
5
|
-
private readonly option;
|
|
6
|
-
private readonly pathTemplates;
|
|
7
|
-
private pathTemplateCache?;
|
|
8
|
-
constructor(http: HttpClient, option: HttpLoaderOptions, pathTemplates: string[] | string);
|
|
9
|
-
load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations>;
|
|
10
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { FsModuleLike, type FsLoaderOptions, type TranslationLoader, type Translations } from './translate.type';
|
|
2
|
-
/** File-system backed loader used during SSR to read translation JSON from disk. */
|
|
3
|
-
export declare class FsTranslationLoader implements TranslationLoader {
|
|
4
|
-
private fsOptions;
|
|
5
|
-
private pathTemplates;
|
|
6
|
-
private customFs?;
|
|
7
|
-
private cache;
|
|
8
|
-
/**
|
|
9
|
-
* @param customFs Optional fs-like abstraction injected explicitly (tests or adapters).
|
|
10
|
-
*/
|
|
11
|
-
constructor(fsOptions: FsLoaderOptions, pathTemplates: string[] | string, customFs?: FsModuleLike);
|
|
12
|
-
load(i18nRoots: string[] | string, namespace: string, lang: string): Promise<Translations>;
|
|
13
|
-
/** Attempts to import a Node built-in without throwing when unavailable (e.g. CSR). */
|
|
14
|
-
private importSafely;
|
|
15
|
-
private pickFs;
|
|
16
|
-
private safeJoin;
|
|
17
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Signal } from "@angular/core";
|
|
2
|
-
import { Params } from "./translate.type";
|
|
3
|
-
import { TranslationCoreService } from "./translation-core.service";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class TranslationService {
|
|
6
|
-
readonly namespaceInput: string;
|
|
7
|
-
/** Shared translation configuration resolved from the host application. */
|
|
8
|
-
private readonly config;
|
|
9
|
-
private readonly parent;
|
|
10
|
-
private readonly isPageRoot;
|
|
11
|
-
/** Core translation engine that handles lookups and formatter lifecycle. */
|
|
12
|
-
private readonly core;
|
|
13
|
-
/** Loader implementation responsible for fetching translation payloads. */
|
|
14
|
-
private readonly loader;
|
|
15
|
-
/** Optional build fingerprint for cache busting injected at runtime. */
|
|
16
|
-
private readonly injectedVersion;
|
|
17
|
-
/** Flag used to guard debug logging output. */
|
|
18
|
-
private readonly debugEnabled;
|
|
19
|
-
/** Observable mirror of the language signal for consumers outside of signals. */
|
|
20
|
-
readonly onLangChange: import("rxjs").Observable<string>;
|
|
21
|
-
/** Namespace currently owned by this service instance. */
|
|
22
|
-
private namespace;
|
|
23
|
-
get lang(): Signal<string>;
|
|
24
|
-
get currentLang(): string;
|
|
25
|
-
get supportedLangs(): string[];
|
|
26
|
-
/** Build version identifier used to scope namespace caches. */
|
|
27
|
-
private readonly buildVersion;
|
|
28
|
-
/** Composes the unique key used to store namespace resources per lang and build. */
|
|
29
|
-
get getNskey(): string;
|
|
30
|
-
/** Signal that flips to true when the namespace resources are available. */
|
|
31
|
-
get readySignal(): Signal<boolean>;
|
|
32
|
-
/** Convenience boolean wrapper around the readiness signal. */
|
|
33
|
-
get ready(): boolean;
|
|
34
|
-
constructor(namespaceInput: string);
|
|
35
|
-
/** Switches the active language and triggers downstream refresh logic. */
|
|
36
|
-
setLang(lang: string): void;
|
|
37
|
-
/**
|
|
38
|
-
* Resolves the translation for `key`, formatting with the provided params
|
|
39
|
-
* and falling back to configured behaviors when a translation is missing.
|
|
40
|
-
*/
|
|
41
|
-
t(key: string, params?: Params): string;
|
|
42
|
-
/** Determines the fallback string or error when a translation entry is missing. */
|
|
43
|
-
private getMissingTranslation;
|
|
44
|
-
/** Pass-through helpers that delegate resource management to the core service. */
|
|
45
|
-
addResourceBundle(...p: Parameters<TranslationCoreService['addResourceBundle']>): void;
|
|
46
|
-
addResources(...p: Parameters<TranslationCoreService['addResources']>): void;
|
|
47
|
-
addResource(...p: Parameters<TranslationCoreService['addResource']>): void;
|
|
48
|
-
hasResourceBundle(...p: Parameters<TranslationCoreService['hasResourceBundle']>): boolean;
|
|
49
|
-
getResource(...p: Parameters<TranslationCoreService['getResource']>): string;
|
|
50
|
-
getResourceBundle(...p: Parameters<TranslationCoreService['getResourceBundle']>): import("./translate.type").Translations;
|
|
51
|
-
getAllBundle(): Map<string, Map<string, Record<string, any>>>;
|
|
52
|
-
removeResourceBundle(...p: Parameters<TranslationCoreService['removeResourceBundle']>): void;
|
|
53
|
-
preloadNamespaces(...p: Parameters<TranslationCoreService['preloadNamespaces']>): Promise<void>;
|
|
54
|
-
/** Emits debug info when verbose logging is enabled. */
|
|
55
|
-
private info;
|
|
56
|
-
/** Emits debug warnings when verbose logging is enabled. */
|
|
57
|
-
private warn;
|
|
58
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationService, never>;
|
|
59
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<TranslationService>;
|
|
60
|
-
}
|
package/public-api.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from './lib/translation.service';
|
|
2
|
-
export * from './lib/translation-core.service';
|
|
3
|
-
export * from './lib/translate.pipe';
|
|
4
|
-
export * from './lib/translation.directive';
|
|
5
|
-
export * from './lib/translate.provider';
|
|
6
|
-
export * from './lib/translation.loader.csr';
|
|
7
|
-
export * from './lib/translation.loader.ssr';
|
|
8
|
-
export * from './lib/translate.token';
|
|
9
|
-
export * from './lib/translate.type';
|
|
10
|
-
export * from './lib/translate.util';
|
|
11
|
-
export * from './lib/FIFO.model';
|