@yaagoub/federation-tools 1.2.6 β 1.2.8
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 +190 -33
- package/fesm2022/yaagoub-federation-tools.mjs +49 -53
- package/fesm2022/yaagoub-federation-tools.mjs.map +1 -1
- package/index.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,63 +1,220 @@
|
|
|
1
1
|
# FederationTools
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**FederationTools** is a lightweight utility library designed to simplify **environment variables**, **assets**, and **internationalization (i18n)** management across **Angular micro-frontend architectures** (Module Federation / Native Federation).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
It provides a **single, consistent API** that works across the **shell** and all **remote MFEs**, without iframes and without leaking configuration to `window`.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## π¦ Installation
|
|
10
|
+
|
|
11
|
+
Add the library to your workspace:
|
|
8
12
|
|
|
9
13
|
```bash
|
|
10
|
-
|
|
14
|
+
npm install @yaagoub/federation-tools
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
---
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
## π Project Structure (Shell)
|
|
20
|
+
|
|
21
|
+
The shell application acts as the **single source of truth** for:
|
|
22
|
+
|
|
23
|
+
* environment variables
|
|
24
|
+
* translations
|
|
25
|
+
* asset origins
|
|
26
|
+
|
|
27
|
+
Recommended structure:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
βββ πsettings
|
|
31
|
+
βββ πenv
|
|
32
|
+
β βββ env.json # Shell environment variables
|
|
33
|
+
β
|
|
34
|
+
βββ πi18n
|
|
35
|
+
β βββ en.json # English translations
|
|
36
|
+
β βββ ar.json # Arabic translations
|
|
37
|
+
β
|
|
38
|
+
βββ πmanifest
|
|
39
|
+
βββ πassets
|
|
40
|
+
β βββ assets.manifest.json
|
|
41
|
+
β {
|
|
42
|
+
β "shell": "http://localhost:4200",
|
|
43
|
+
β "mfe1": "http://localhost:4201",
|
|
44
|
+
β "mfe2": "http://localhost:4202"
|
|
45
|
+
β }
|
|
46
|
+
β
|
|
47
|
+
βββ πenv
|
|
48
|
+
β βββ env.manifest.json
|
|
49
|
+
β {
|
|
50
|
+
β "shell": "http://localhost:4200",
|
|
51
|
+
β "mfe1": "http://localhost:4201",
|
|
52
|
+
β "mfe2": "http://localhost:4202"
|
|
53
|
+
β }
|
|
54
|
+
β
|
|
55
|
+
βββ πi18n
|
|
56
|
+
βββ i18n.manifest.json
|
|
57
|
+
{
|
|
58
|
+
"shell": "http://localhost:4200",
|
|
59
|
+
"mfe1": "http://localhost:4201",
|
|
60
|
+
"mfe2": "http://localhost:4202"
|
|
61
|
+
}
|
|
17
62
|
```
|
|
18
63
|
|
|
19
|
-
|
|
64
|
+
for remotes Recommended structure:
|
|
20
65
|
|
|
21
|
-
|
|
66
|
+
```
|
|
67
|
+
βββ πsettings
|
|
68
|
+
βββ πenv
|
|
69
|
+
β βββ env.json # mfe environment variables
|
|
70
|
+
β
|
|
71
|
+
βββ πi18n
|
|
72
|
+
β βββ en.json # English translations
|
|
73
|
+
β βββ ar.json # Arabic translations
|
|
74
|
+
```
|
|
22
75
|
|
|
23
|
-
|
|
24
|
-
|
|
76
|
+
Each manifest defines **where to fetch data from** for each micro frontend.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## βοΈ Development Configuration (Angular)
|
|
81
|
+
|
|
82
|
+
During development, expose the manifests and settings using the Angular assets configuration:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
"development": {
|
|
86
|
+
"assets": [
|
|
87
|
+
{
|
|
88
|
+
"glob": "**/*",
|
|
89
|
+
"input": "projects/lkhedma/public"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"glob": "env.manifest.json",
|
|
93
|
+
"input": "projects/../src/settings/manifest/env",
|
|
94
|
+
"output": "."
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"glob": "assets.manifest.json",
|
|
98
|
+
"input": "projects/../src/settings/manifest/assets",
|
|
99
|
+
"output": "."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"glob": "i18n.manifest.json",
|
|
103
|
+
"input": "projects/../src/settings/manifest/i18n",
|
|
104
|
+
"output": "."
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"glob": "**/*",
|
|
108
|
+
"input": "projects/../src/settings/i18n",
|
|
109
|
+
"output": "i18n"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"glob": "env.json",
|
|
113
|
+
"input": "projects/../src/settings/env",
|
|
114
|
+
"output": "."
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"optimization": false,
|
|
118
|
+
"extractLicenses": false,
|
|
119
|
+
"sourceMap": true
|
|
120
|
+
}
|
|
25
121
|
```
|
|
26
122
|
|
|
27
|
-
|
|
123
|
+
> π‘ In production, these files are typically served by the shell (CDN, Nginx, or gateway).
|
|
28
124
|
|
|
29
|
-
|
|
125
|
+
---
|
|
30
126
|
|
|
31
|
-
|
|
127
|
+
## π Shell Providers Setup
|
|
32
128
|
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
cd dist/federation-tools
|
|
36
|
-
```
|
|
129
|
+
Register the FederationTools providers **once** in the shell application:
|
|
37
130
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
131
|
+
```ts
|
|
132
|
+
provideFederationAsset(),
|
|
133
|
+
provideFederationEnv(),
|
|
134
|
+
provideFederationTranslation('en') // default language
|
|
135
|
+
```
|
|
42
136
|
|
|
43
|
-
|
|
137
|
+
These providers automatically:
|
|
44
138
|
|
|
45
|
-
|
|
139
|
+
* load manifests
|
|
140
|
+
* fetch remote data
|
|
141
|
+
* cache results
|
|
142
|
+
* expose a unified API to all MFEs
|
|
46
143
|
|
|
47
|
-
|
|
48
|
-
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## πΌοΈ Federated Assets
|
|
147
|
+
|
|
148
|
+
Use assets from **any MFE** by prefixing the asset name with the micro frontend key.
|
|
149
|
+
|
|
150
|
+
```html
|
|
151
|
+
<img [asset]="'mfe1:logo.png'" />
|
|
49
152
|
```
|
|
50
153
|
|
|
51
|
-
|
|
154
|
+
### Supported elements
|
|
52
155
|
|
|
53
|
-
|
|
156
|
+
The `asset` directive works with:
|
|
54
157
|
|
|
55
|
-
|
|
56
|
-
|
|
158
|
+
* `img`
|
|
159
|
+
* `video`
|
|
160
|
+
* `audio`
|
|
161
|
+
* `iframe`
|
|
162
|
+
* `source`
|
|
163
|
+
* `a`
|
|
164
|
+
* `object`
|
|
165
|
+
|
|
166
|
+
The prefix (`mfe1`) must exist in `assets.manifest.json`.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## π Internationalization (i18n)
|
|
171
|
+
|
|
172
|
+
FederationTools provides a federated translation system shared across all MFEs.
|
|
173
|
+
|
|
174
|
+
### Template usage
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
{{ 'home.title' | t }}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Programmatic usage
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { inject } from '@angular/core';
|
|
184
|
+
import { TranslationService } from '@yaagoub/federation-tools';
|
|
185
|
+
|
|
186
|
+
const translationService = inject(TranslationService);
|
|
187
|
+
|
|
188
|
+
translationService.t('home.title');
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Translations are:
|
|
192
|
+
|
|
193
|
+
* loaded lazily
|
|
194
|
+
* merged across shell + MFEs
|
|
195
|
+
* automatically updated when the language changes
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## π Environment Variables
|
|
200
|
+
|
|
201
|
+
Environment variables are **not exposed on `window`** and are only accessible through the FederationTools API.
|
|
202
|
+
|
|
203
|
+
### Waiting for environment initialization
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { from } from 'rxjs';
|
|
207
|
+
import { waitForFederationEnv } from '@yaagoub/federation-tools';
|
|
208
|
+
|
|
209
|
+
from(waitForFederationEnv('mfe1')).subscribe(env => {
|
|
210
|
+
// Safe access to federated environment variables
|
|
211
|
+
});
|
|
57
212
|
```
|
|
58
213
|
|
|
59
|
-
|
|
214
|
+
### Key guarantees
|
|
60
215
|
|
|
61
|
-
|
|
216
|
+
* βοΈ Shell loads the environment first
|
|
217
|
+
* βοΈ MFEs wait safely for availability
|
|
218
|
+
* βοΈ Immutable, frozen configuration
|
|
219
|
+
* βοΈ No global leaks
|
|
62
220
|
|
|
63
|
-
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -1,75 +1,71 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, makeEnvironmentProviders, APP_INITIALIZER, inject, ElementRef, input, Directive, provideAppInitializer, signal, effect, Pipe } from '@angular/core';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
let
|
|
7
|
-
|
|
4
|
+
const ENV_MAP = new Map();
|
|
5
|
+
const REMOTE_LOADERS = new Map();
|
|
6
|
+
let bootstrapResolved = false;
|
|
7
|
+
let resolveBootstrap;
|
|
8
|
+
const BOOTSTRAP_READY = new Promise((r) => {
|
|
9
|
+
resolveBootstrap = () => {
|
|
10
|
+
bootstrapResolved = true;
|
|
11
|
+
r();
|
|
12
|
+
};
|
|
13
|
+
});
|
|
8
14
|
/* =============================
|
|
9
|
-
|
|
15
|
+
BOOTSTRAP (shell only)
|
|
10
16
|
============================= */
|
|
11
17
|
function __setFederationEnv(env) {
|
|
12
|
-
if (
|
|
18
|
+
if (bootstrapResolved)
|
|
13
19
|
return;
|
|
14
|
-
const frozen = new Map();
|
|
15
20
|
for (const [k, v] of env.entries()) {
|
|
16
|
-
|
|
21
|
+
ENV_MAP.set(k, deepFreeze({ ...v }));
|
|
17
22
|
}
|
|
18
|
-
|
|
19
|
-
resolveReady();
|
|
23
|
+
resolveBootstrap();
|
|
20
24
|
}
|
|
21
25
|
/* =============================
|
|
22
|
-
|
|
26
|
+
PUBLIC API (ONLY EXPORT)
|
|
23
27
|
============================= */
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
async function waitForFederationEnv(remote, retries = 3, delayMs = 500) {
|
|
29
|
+
// wait bootstrap IF it exists
|
|
30
|
+
await BOOTSTRAP_READY.catch(() => void 0);
|
|
31
|
+
if (ENV_MAP.has(remote)) {
|
|
32
|
+
return ENV_MAP.get(remote);
|
|
33
|
+
}
|
|
34
|
+
// one loader per remote (deduplicated)
|
|
35
|
+
if (!REMOTE_LOADERS.has(remote)) {
|
|
36
|
+
REMOTE_LOADERS.set(remote, loadRemoteWithRetry(remote, retries, delayMs));
|
|
37
|
+
}
|
|
38
|
+
await REMOTE_LOADERS.get(remote);
|
|
39
|
+
const env = ENV_MAP.get(remote);
|
|
40
|
+
if (!env) {
|
|
41
|
+
throw new Error(`[env] "${remote}" not found after load`);
|
|
42
|
+
}
|
|
43
|
+
return env;
|
|
31
44
|
}
|
|
32
45
|
/* =============================
|
|
33
|
-
|
|
46
|
+
INTERNAL LOADER
|
|
34
47
|
============================= */
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// lazy reload loop
|
|
42
|
-
for (let i = 0; i < retries; i++) {
|
|
43
|
-
try {
|
|
44
|
-
await __reloadRemoteEnv(remote);
|
|
45
|
-
if (__hasEnv(remote)) {
|
|
46
|
-
return resolve(FEDERATION_ENV.get(remote));
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch { }
|
|
50
|
-
await sleep(delayMs);
|
|
48
|
+
async function loadRemoteWithRetry(remote, retries, delayMs) {
|
|
49
|
+
for (let i = 0; i < retries; i++) {
|
|
50
|
+
try {
|
|
51
|
+
await loadRemote(remote);
|
|
52
|
+
if (ENV_MAP.has(remote))
|
|
53
|
+
return;
|
|
51
54
|
}
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
catch { }
|
|
56
|
+
await sleep(delayMs);
|
|
57
|
+
}
|
|
54
58
|
}
|
|
55
59
|
/* =============================
|
|
56
|
-
|
|
60
|
+
FETCH
|
|
57
61
|
============================= */
|
|
58
|
-
async function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (!origin)
|
|
66
|
-
return;
|
|
67
|
-
const env = await fetch(`${origin}/env.json`).then((r) => r.json());
|
|
68
|
-
__setSingleEnv(remote, env);
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
loading = false;
|
|
72
|
-
}
|
|
62
|
+
async function loadRemote(remote) {
|
|
63
|
+
const manifest = await fetch('/env.manifest.json').then((r) => r.json());
|
|
64
|
+
const origin = manifest?.[remote];
|
|
65
|
+
if (!origin)
|
|
66
|
+
throw new Error(`[env] No manifest entry for "${remote}"`);
|
|
67
|
+
const env = await fetch(`${origin}/env.json`).then((r) => r.json());
|
|
68
|
+
ENV_MAP.set(remote, deepFreeze({ ...env }));
|
|
73
69
|
}
|
|
74
70
|
/* =============================
|
|
75
71
|
UTILS
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaagoub-federation-tools.mjs","sources":["../../../projects/federation-tools/src/env/federation-env.runtime.ts","../../../projects/federation-tools/src/env/env.service.ts","../../../projects/federation-tools/src/providers/provide-env.ts","../../../projects/federation-tools/src/asset/asset.store.ts","../../../projects/federation-tools/src/asset/asset.service.ts","../../../projects/federation-tools/src/asset/asset.ts","../../../projects/federation-tools/src/asset/asset.directive.ts","../../../projects/federation-tools/src/providers/provide-assets.ts","../../../projects/federation-tools/src/i18n/translation.store.ts","../../../projects/federation-tools/src/i18n/translation-registry.service.ts","../../../projects/federation-tools/src/i18n/translation.service.ts","../../../projects/federation-tools/src/providers/provide-trans.ts","../../../projects/federation-tools/src/i18n/translation.pipe.ts","../../../projects/federation-tools/src/yaagoub-federation-tools.ts"],"sourcesContent":["let FEDERATION_ENV:\r\n | Map<string, Readonly<Record<string, any>>>\r\n | null = null;\r\n\r\nlet loading = false;\r\n\r\nlet resolveReady!: () => void;\r\nconst READY = new Promise<void>((r) => (resolveReady = r));\r\n\r\n/* =============================\r\n INTERNAL SETTER (PRIVATE)\r\n============================= */\r\nexport function __setFederationEnv(\r\n env: Map<string, Record<string, any>>\r\n): void {\r\n if (FEDERATION_ENV) return;\r\n\r\n const frozen = new Map<string, Readonly<Record<string, any>>>();\r\n for (const [k, v] of env.entries()) {\r\n frozen.set(k, deepFreeze({ ...v }));\r\n }\r\n\r\n FEDERATION_ENV = frozen;\r\n resolveReady();\r\n}\r\n\r\n/* =============================\r\n INTERNAL HELPERS\r\n============================= */\r\nexport function __hasEnv(remote: string): boolean {\r\n return !!FEDERATION_ENV?.has(remote);\r\n}\r\n\r\nexport function __setSingleEnv(remote: string, env: Record<string, any>) {\r\n if (!FEDERATION_ENV) FEDERATION_ENV = new Map();\r\n FEDERATION_ENV.set(remote, deepFreeze({ ...env }));\r\n}\r\n\r\n/* =============================\r\n PUBLIC API (ONLY THIS)\r\n============================= */\r\nexport function waitForFederationEnv(\r\n remote: string,\r\n retries = 3,\r\n delayMs = 500\r\n): Promise<Readonly<Record<string, any>>> {\r\n return new Promise(async (resolve, reject) => {\r\n await READY;\r\n\r\n if (__hasEnv(remote)) {\r\n return resolve(FEDERATION_ENV!.get(remote)!);\r\n }\r\n\r\n // lazy reload loop\r\n for (let i = 0; i < retries; i++) {\r\n try {\r\n await __reloadRemoteEnv(remote);\r\n if (__hasEnv(remote)) {\r\n return resolve(FEDERATION_ENV!.get(remote)!);\r\n }\r\n } catch {}\r\n await sleep(delayMs);\r\n }\r\n\r\n reject(new Error(`[env] Failed to load \"${remote}\" after ${retries} retries`));\r\n });\r\n}\r\n\r\n/* =============================\r\n INTERNAL LAZY RELOAD\r\n============================= */\r\nasync function __reloadRemoteEnv(remote: string) {\r\n if (loading) return;\r\n loading = true;\r\n\r\n try {\r\n const manifest = await fetch('/env.manifest.json').then((r) => r.json());\r\n const origin = manifest[remote];\r\n if (!origin) return;\r\n\r\n const env = await fetch(`${origin}/env.json`).then((r) => r.json());\r\n __setSingleEnv(remote, env);\r\n } finally {\r\n loading = false;\r\n }\r\n}\r\n\r\n/* =============================\r\n UTILS\r\n============================= */\r\nfunction sleep(ms: number) {\r\n return new Promise((r) => setTimeout(r, ms));\r\n}\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n Object.freeze(obj);\r\n Object.getOwnPropertyNames(obj).forEach((p) => {\r\n const v: any = (obj as any)[p];\r\n if (v && typeof v === 'object' && !Object.isFrozen(v)) {\r\n deepFreeze(v);\r\n }\r\n });\r\n return obj;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { __setFederationEnv } from './federation-env.runtime';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvService {\r\n async load(): Promise<void> {\r\n const map = new Map<string, Record<string, any>>();\r\n const manifest = await fetch('/env.manifest.json').then((r) => r.json());\r\n\r\n for (const [name, origin] of Object.entries(manifest)) {\r\n try {\r\n const env = await fetch(`${origin}/env.json`).then((r) => r.json());\r\n map.set(name, env);\r\n } catch {\r\n }\r\n }\r\n\r\n __setFederationEnv(map);\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n EnvironmentProviders,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { EnvService } from '../env/env.service';\r\n\r\nexport function provideFederationEnv(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n EnvService,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [EnvService],\r\n useFactory: (env: EnvService) => () => env.load(),\r\n },\r\n ]);\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AssetStore {\r\n private readonly map = new Map<string, string>();\r\n\r\n set(name: string, asset: string) {\r\n this.map.set(name, asset);\r\n }\r\n\r\n get(name: string): string | undefined {\r\n return this.map.get(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.map.has(name);\r\n }\r\n\r\n entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { AssetStore } from './asset.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AssetService {\r\n private readonly assets = inject(AssetStore);\r\n\r\n private getAssetManifestUrl(): string {\r\n return `${window.location.origin}/assets.manifest.json`;\r\n }\r\n\r\n async load(): Promise<void> {\r\n try {\r\n const manifest = await this.fetchJson<Record<string, string>>(\r\n this.getAssetManifestUrl()\r\n );\r\n\r\n // Remotes\r\n Object.entries(manifest).forEach(([remote, origin]) => {\r\n this.assets.set(remote, origin.replace(/\\/+$/, ''));\r\n });\r\n } catch (error) {\r\n throw new Error(\r\n '[assets] Failed to load asset configuration. ' + String(error)\r\n );\r\n }\r\n }\r\n\r\n resolve(assetRef: string): string {\r\n /**\r\n * assetRef format:\r\n * shell:logo.svg\r\n * user:img/avatar.png\r\n * doc:video/intro.mp4\r\n */\r\n\r\n if (!assetRef.includes(':')) {\r\n throw new Error(`[assets] Invalid asset reference: ${assetRef}`);\r\n }\r\n\r\n const [scope, path] = assetRef.split(':');\r\n const origin = this.assets.get(scope);\r\n\r\n if (!origin) {\r\n throw new Error(`[assets] Unknown asset scope: ${scope}`);\r\n }\r\n\r\n return `${origin}/${path.replace(/^\\/+/, '')}`;\r\n }\r\n\r\n // ---------------------------\r\n // helpers\r\n // ---------------------------\r\n private async fetchJson<T>(url: string): Promise<T> {\r\n const res = await fetch(url, { credentials: 'same-origin' });\r\n\r\n if (!res.ok) {\r\n throw new Error(`${res.status} ${res.statusText}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AssetService } from \"./asset.service\";\r\n\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Assets {\r\n private readonly assetService = inject(AssetService);\r\n\r\n get(assetRef: string): string {\r\n return this.assetService.resolve(assetRef);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n OnChanges,\r\n inject,\r\n SimpleChanges,\r\n input,\r\n} from '@angular/core';\r\nimport { AssetService } from './asset.service';\r\n\r\n@Directive({\r\n selector: '[asset]',\r\n standalone: true,\r\n})\r\nexport class AssetDirective implements OnChanges {\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private readonly assetService = inject(AssetService);\r\n\r\n asset = input<string>('');\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this.asset()) return;\r\n\r\n const url = this.assetService.resolve(this.asset());\r\n const nativeEl = this.el.nativeElement;\r\n\r\n const attr = this.detectAttribute(nativeEl);\r\n\r\n nativeEl.setAttribute(attr, url);\r\n }\r\n\r\n private detectAttribute(el: HTMLElement): string {\r\n const tag = el.tagName.toLowerCase();\r\n\r\n switch (tag) {\r\n case 'img':\r\n case 'video':\r\n case 'audio':\r\n case 'iframe':\r\n case 'source':\r\n return 'src';\r\n\r\n case 'a':\r\n return 'href';\r\n\r\n case 'object':\r\n return 'data';\r\n\r\n default:\r\n return 'src';\r\n }\r\n }\r\n}\r\n","import { inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';\r\nimport { AssetService } from '../asset/asset.service';\r\nimport { Assets } from '../asset/asset';\r\nimport { AssetStore } from '../asset/asset.store';\r\nimport { AssetDirective } from '../asset/asset.directive';\r\n\r\nexport function provideFederationAsset() {\r\n return makeEnvironmentProviders([\r\n AssetService, Assets, AssetStore, AssetDirective,\r\n provideAppInitializer(() => inject(AssetService).load()),\r\n ]);\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationStore {\r\n private readonly map = new Map<string, Record<string, any>>();\r\n\r\n set(namespace: string, translations: Record<string, any>) {\r\n this.map.set(namespace, translations);\r\n }\r\n\r\n clear() {\r\n this.map.clear();\r\n }\r\n\r\n entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslationStore } from './translation.store';\r\n\r\ntype Manifest = Record<string, string>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationRegistry {\r\n private readonly store = inject(TranslationStore);\r\n\r\n private loading = new Map<string, Promise<void>>();\r\n private loaded = new Set<string>();\r\n private manifestCache?: Manifest;\r\n\r\n // ---------------------------\r\n // Manifest\r\n // ---------------------------\r\n private async getManifest(): Promise<Manifest> {\r\n if (this.manifestCache) return this.manifestCache;\r\n\r\n const url = `${window.location.origin}/i18n.manifest.json`;\r\n this.manifestCache = await this.fetchJson<Manifest>(url);\r\n\r\n return this.manifestCache;\r\n }\r\n\r\n // ---------------------------\r\n // Load language\r\n // ---------------------------\r\n async load(lang: string): Promise<void> {\r\n if (this.loaded.has(lang)) return;\r\n\r\n const existing = this.loading.get(lang);\r\n if (existing) return existing;\r\n\r\n const promise = (async () => {\r\n const manifest = await this.getManifest();\r\n\r\n const entries = await Promise.all(\r\n Object.entries(manifest).map(async ([namespace, origin]) => {\r\n const base = this.normalizeOrigin(origin);\r\n const url = `${base}/i18n/${lang}.json`;\r\n\r\n const raw = await this.fetchJson<Record<string, any>>(url);\r\n const flat = this.flatten(raw);\r\n const namespaced = this.namespaceKeys(namespace, flat);\r\n\r\n return [namespace, namespaced] as const;\r\n })\r\n );\r\n\r\n // β
atomic commit\r\n entries.forEach(([ns, translations]) => this.store.set(ns, translations));\r\n this.loaded.add(lang);\r\n })();\r\n\r\n this.loading.set(lang, promise);\r\n try {\r\n await promise;\r\n } finally {\r\n this.loading.delete(lang);\r\n }\r\n }\r\n\r\n // ---------------------------\r\n // Helpers\r\n // ---------------------------\r\n private async fetchJson<T>(url: string): Promise<T> {\r\n const res = await fetch(url, { credentials: 'same-origin' });\r\n\r\n if (!res.ok) {\r\n throw new Error(`[i18n] Failed to load ${url} (${res.status})`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n private normalizeOrigin(origin: string): string {\r\n return origin.replace(/\\/+$/, '');\r\n }\r\n\r\n private flatten(obj: any, prefix = ''): Record<string, any> {\r\n const out: Record<string, any> = {};\r\n\r\n if (obj == null || typeof obj !== 'object' || Array.isArray(obj)) {\r\n if (prefix) out[prefix] = obj;\r\n return out;\r\n }\r\n\r\n for (const key of Object.keys(obj)) {\r\n const value = obj[key];\r\n const next = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (value != null && typeof value === 'object' && !Array.isArray(value)) {\r\n Object.assign(out, this.flatten(value, next));\r\n } else {\r\n out[next] = value;\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n private namespaceKeys(namespace: string, flat: Record<string, any>): Record<string, any> {\r\n const out: Record<string, any> = {};\r\n for (const [k, v] of Object.entries(flat)) {\r\n out[`${namespace}.${k}`] = v;\r\n }\r\n return out;\r\n }\r\n\r\n // ---------------------------\r\n // Public API\r\n // ---------------------------\r\n getMergedTranslations(): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n for (const [, value] of this.store.entries()) {\r\n Object.assign(result, value);\r\n }\r\n return result;\r\n }\r\n\r\n resetLangCache() {\r\n this.loaded.clear();\r\n this.loading.clear();\r\n this.store.clear();\r\n }\r\n}\r\n","import { Injectable, effect, inject, signal } from '@angular/core';\r\nimport { TranslationRegistry } from './translation-registry.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationService {\r\n private readonly registry = inject(TranslationRegistry);\r\n\r\n private readonly _lang = signal<string>('en');\r\n readonly lang = this._lang.asReadonly();\r\n\r\n private readonly _translations = signal<Record<string, any>>({});\r\n readonly translations = this._translations.asReadonly();\r\n\r\n private readonly _ready = signal<boolean>(false);\r\n readonly ready = this._ready.asReadonly();\r\n\r\n constructor() {\r\n effect(() => {\r\n const l = this._lang();\r\n document.documentElement.dir = this.isRtl(l) ? 'rtl' : 'ltr';\r\n document.documentElement.lang = l;\r\n });\r\n }\r\n\r\n private isRtl(lang: string) {\r\n return ['ar'].includes(lang.toLowerCase());\r\n }\r\n\r\n\r\n async init(defaultLang = 'en'): Promise<void> {\r\n const stored = localStorage.getItem('lang');\r\n const lang = stored || defaultLang;\r\n await this.switchLang(lang, { persist: false });\r\n }\r\n\r\n async switchLang(lang: string, opts?: { persist?: boolean; resetCache?: boolean }): Promise<void> {\r\n if (!lang) return;\r\n\r\n const persist = opts?.persist ?? true;\r\n const resetCache = opts?.resetCache ?? false;\r\n\r\n if (resetCache) this.registry.resetLangCache();\r\n\r\n if (this._lang() === lang && this._ready()) return;\r\n\r\n this._ready.set(false);\r\n await this.registry.load(lang);\r\n this._translations.set(this.registry.getMergedTranslations());\r\n this._lang.set(lang);\r\n this._ready.set(true);\r\n\r\n if (persist) localStorage.setItem('lang', lang);\r\n }\r\n\r\n t(key: string, fallback = 'β'): string {\r\n const value = this._translations()[key];\r\n\r\n if (value === undefined && (globalThis as any).ngDevMode) {\r\n console.warn('[i18n missing]', key, 'lang:', this._lang());\r\n }\r\n\r\n return value ?? fallback;\r\n }\r\n}\r\n","import { APP_INITIALIZER, EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { TranslationStore } from '../i18n/translation.store';\r\nimport { TranslationRegistry } from '../i18n/translation-registry.service';\r\nimport { TranslationService } from '../i18n/translation.service';\r\n\r\n\r\nexport function provideFederationTranslation(defaultLang = 'en'): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n TranslationStore,\r\n TranslationRegistry,\r\n TranslationService,\r\n\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [TranslationService],\r\n useFactory: (i18n: TranslationService) => () => i18n.init(defaultLang),\r\n },\r\n ]);\r\n}\r\n","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { TranslationService } from './translation.service';\r\n\r\n@Pipe({\r\n name: 't',\r\n standalone: true,\r\n pure: false,\r\n})\r\nexport class TranslatePipe implements PipeTransform {\r\n private readonly i18n = inject(TranslationService);\r\n\r\n transform(key: string, fallback = 'β'): string {\r\n return this.i18n.t(key, fallback);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yaagoub-federation-tools.mjs","sources":["../../../projects/federation-tools/src/env/federation-env.runtime.ts","../../../projects/federation-tools/src/env/env.service.ts","../../../projects/federation-tools/src/providers/provide-env.ts","../../../projects/federation-tools/src/asset/asset.store.ts","../../../projects/federation-tools/src/asset/asset.service.ts","../../../projects/federation-tools/src/asset/asset.ts","../../../projects/federation-tools/src/asset/asset.directive.ts","../../../projects/federation-tools/src/providers/provide-assets.ts","../../../projects/federation-tools/src/i18n/translation.store.ts","../../../projects/federation-tools/src/i18n/translation-registry.service.ts","../../../projects/federation-tools/src/i18n/translation.service.ts","../../../projects/federation-tools/src/providers/provide-trans.ts","../../../projects/federation-tools/src/i18n/translation.pipe.ts","../../../projects/federation-tools/src/yaagoub-federation-tools.ts"],"sourcesContent":["type FrozenEnv = Readonly<Record<string, any>>;\r\n\r\nconst ENV_MAP = new Map<string, FrozenEnv>();\r\nconst REMOTE_LOADERS = new Map<string, Promise<void>>();\r\n\r\nlet bootstrapResolved = false;\r\nlet resolveBootstrap!: () => void;\r\n\r\nconst BOOTSTRAP_READY = new Promise<void>((r) => {\r\n resolveBootstrap = () => {\r\n bootstrapResolved = true;\r\n r();\r\n };\r\n});\r\n\r\n/* =============================\r\n BOOTSTRAP (shell only)\r\n============================= */\r\nexport function __setFederationEnv(\r\n env: Map<string, Record<string, any>>\r\n): void {\r\n if (bootstrapResolved) return;\r\n\r\n for (const [k, v] of env.entries()) {\r\n ENV_MAP.set(k, deepFreeze({ ...v }));\r\n }\r\n\r\n resolveBootstrap();\r\n}\r\n\r\n/* =============================\r\n PUBLIC API (ONLY EXPORT)\r\n============================= */\r\nexport async function waitForFederationEnv(\r\n remote: string,\r\n retries = 3,\r\n delayMs = 500\r\n): Promise<FrozenEnv> {\r\n // wait bootstrap IF it exists\r\n await BOOTSTRAP_READY.catch(() => void 0);\r\n\r\n if (ENV_MAP.has(remote)) {\r\n return ENV_MAP.get(remote)!;\r\n }\r\n\r\n // one loader per remote (deduplicated)\r\n if (!REMOTE_LOADERS.has(remote)) {\r\n REMOTE_LOADERS.set(\r\n remote,\r\n loadRemoteWithRetry(remote, retries, delayMs)\r\n );\r\n }\r\n\r\n await REMOTE_LOADERS.get(remote)!;\r\n\r\n const env = ENV_MAP.get(remote);\r\n if (!env) {\r\n throw new Error(`[env] \"${remote}\" not found after load`);\r\n }\r\n\r\n return env;\r\n}\r\n\r\n/* =============================\r\n INTERNAL LOADER\r\n============================= */\r\nasync function loadRemoteWithRetry(\r\n remote: string,\r\n retries: number,\r\n delayMs: number\r\n) {\r\n for (let i = 0; i < retries; i++) {\r\n try {\r\n await loadRemote(remote);\r\n if (ENV_MAP.has(remote)) return;\r\n } catch {}\r\n await sleep(delayMs);\r\n }\r\n}\r\n\r\n/* =============================\r\n FETCH\r\n============================= */\r\nasync function loadRemote(remote: string) {\r\n const manifest = await fetch('/env.manifest.json').then((r) => r.json());\r\n const origin = manifest?.[remote];\r\n if (!origin) throw new Error(`[env] No manifest entry for \"${remote}\"`);\r\n\r\n const env = await fetch(`${origin}/env.json`).then((r) => r.json());\r\n ENV_MAP.set(remote, deepFreeze({ ...env }));\r\n}\r\n\r\n/* =============================\r\n UTILS\r\n============================= */\r\nfunction sleep(ms: number) {\r\n return new Promise((r) => setTimeout(r, ms));\r\n}\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n Object.freeze(obj);\r\n Object.getOwnPropertyNames(obj).forEach((p) => {\r\n const v: any = (obj as any)[p];\r\n if (v && typeof v === 'object' && !Object.isFrozen(v)) {\r\n deepFreeze(v);\r\n }\r\n });\r\n return obj;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { __setFederationEnv } from './federation-env.runtime';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvService {\r\n async load(): Promise<void> {\r\n const map = new Map<string, Record<string, any>>();\r\n const manifest = await fetch('/env.manifest.json').then((r) => r.json());\r\n\r\n for (const [name, origin] of Object.entries(manifest)) {\r\n try {\r\n const env = await fetch(`${origin}/env.json`).then((r) => r.json());\r\n map.set(name, env);\r\n } catch {\r\n }\r\n }\r\n\r\n __setFederationEnv(map);\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n EnvironmentProviders,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { EnvService } from '../env/env.service';\r\n\r\nexport function provideFederationEnv(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n EnvService,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [EnvService],\r\n useFactory: (env: EnvService) => () => env.load(),\r\n },\r\n ]);\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AssetStore {\r\n private readonly map = new Map<string, string>();\r\n\r\n set(name: string, asset: string) {\r\n this.map.set(name, asset);\r\n }\r\n\r\n get(name: string): string | undefined {\r\n return this.map.get(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.map.has(name);\r\n }\r\n\r\n entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { AssetStore } from './asset.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AssetService {\r\n private readonly assets = inject(AssetStore);\r\n\r\n private getAssetManifestUrl(): string {\r\n return `${window.location.origin}/assets.manifest.json`;\r\n }\r\n\r\n async load(): Promise<void> {\r\n try {\r\n const manifest = await this.fetchJson<Record<string, string>>(\r\n this.getAssetManifestUrl()\r\n );\r\n\r\n // Remotes\r\n Object.entries(manifest).forEach(([remote, origin]) => {\r\n this.assets.set(remote, origin.replace(/\\/+$/, ''));\r\n });\r\n } catch (error) {\r\n throw new Error(\r\n '[assets] Failed to load asset configuration. ' + String(error)\r\n );\r\n }\r\n }\r\n\r\n resolve(assetRef: string): string {\r\n /**\r\n * assetRef format:\r\n * shell:logo.svg\r\n * user:img/avatar.png\r\n * doc:video/intro.mp4\r\n */\r\n\r\n if (!assetRef.includes(':')) {\r\n throw new Error(`[assets] Invalid asset reference: ${assetRef}`);\r\n }\r\n\r\n const [scope, path] = assetRef.split(':');\r\n const origin = this.assets.get(scope);\r\n\r\n if (!origin) {\r\n throw new Error(`[assets] Unknown asset scope: ${scope}`);\r\n }\r\n\r\n return `${origin}/${path.replace(/^\\/+/, '')}`;\r\n }\r\n\r\n // ---------------------------\r\n // helpers\r\n // ---------------------------\r\n private async fetchJson<T>(url: string): Promise<T> {\r\n const res = await fetch(url, { credentials: 'same-origin' });\r\n\r\n if (!res.ok) {\r\n throw new Error(`${res.status} ${res.statusText}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AssetService } from \"./asset.service\";\r\n\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Assets {\r\n private readonly assetService = inject(AssetService);\r\n\r\n get(assetRef: string): string {\r\n return this.assetService.resolve(assetRef);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n OnChanges,\r\n inject,\r\n SimpleChanges,\r\n input,\r\n} from '@angular/core';\r\nimport { AssetService } from './asset.service';\r\n\r\n@Directive({\r\n selector: '[asset]',\r\n standalone: true,\r\n})\r\nexport class AssetDirective implements OnChanges {\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private readonly assetService = inject(AssetService);\r\n\r\n asset = input<string>('');\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this.asset()) return;\r\n\r\n const url = this.assetService.resolve(this.asset());\r\n const nativeEl = this.el.nativeElement;\r\n\r\n const attr = this.detectAttribute(nativeEl);\r\n\r\n nativeEl.setAttribute(attr, url);\r\n }\r\n\r\n private detectAttribute(el: HTMLElement): string {\r\n const tag = el.tagName.toLowerCase();\r\n\r\n switch (tag) {\r\n case 'img':\r\n case 'video':\r\n case 'audio':\r\n case 'iframe':\r\n case 'source':\r\n return 'src';\r\n\r\n case 'a':\r\n return 'href';\r\n\r\n case 'object':\r\n return 'data';\r\n\r\n default:\r\n return 'src';\r\n }\r\n }\r\n}\r\n","import { inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';\r\nimport { AssetService } from '../asset/asset.service';\r\nimport { Assets } from '../asset/asset';\r\nimport { AssetStore } from '../asset/asset.store';\r\nimport { AssetDirective } from '../asset/asset.directive';\r\n\r\nexport function provideFederationAsset() {\r\n return makeEnvironmentProviders([\r\n AssetService, Assets, AssetStore, AssetDirective,\r\n provideAppInitializer(() => inject(AssetService).load()),\r\n ]);\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationStore {\r\n private readonly map = new Map<string, Record<string, any>>();\r\n\r\n set(namespace: string, translations: Record<string, any>) {\r\n this.map.set(namespace, translations);\r\n }\r\n\r\n clear() {\r\n this.map.clear();\r\n }\r\n\r\n entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslationStore } from './translation.store';\r\n\r\ntype Manifest = Record<string, string>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationRegistry {\r\n private readonly store = inject(TranslationStore);\r\n\r\n private loading = new Map<string, Promise<void>>();\r\n private loaded = new Set<string>();\r\n private manifestCache?: Manifest;\r\n\r\n // ---------------------------\r\n // Manifest\r\n // ---------------------------\r\n private async getManifest(): Promise<Manifest> {\r\n if (this.manifestCache) return this.manifestCache;\r\n\r\n const url = `${window.location.origin}/i18n.manifest.json`;\r\n this.manifestCache = await this.fetchJson<Manifest>(url);\r\n\r\n return this.manifestCache;\r\n }\r\n\r\n // ---------------------------\r\n // Load language\r\n // ---------------------------\r\n async load(lang: string): Promise<void> {\r\n if (this.loaded.has(lang)) return;\r\n\r\n const existing = this.loading.get(lang);\r\n if (existing) return existing;\r\n\r\n const promise = (async () => {\r\n const manifest = await this.getManifest();\r\n\r\n const entries = await Promise.all(\r\n Object.entries(manifest).map(async ([namespace, origin]) => {\r\n const base = this.normalizeOrigin(origin);\r\n const url = `${base}/i18n/${lang}.json`;\r\n\r\n const raw = await this.fetchJson<Record<string, any>>(url);\r\n const flat = this.flatten(raw);\r\n const namespaced = this.namespaceKeys(namespace, flat);\r\n\r\n return [namespace, namespaced] as const;\r\n })\r\n );\r\n\r\n // β
atomic commit\r\n entries.forEach(([ns, translations]) => this.store.set(ns, translations));\r\n this.loaded.add(lang);\r\n })();\r\n\r\n this.loading.set(lang, promise);\r\n try {\r\n await promise;\r\n } finally {\r\n this.loading.delete(lang);\r\n }\r\n }\r\n\r\n // ---------------------------\r\n // Helpers\r\n // ---------------------------\r\n private async fetchJson<T>(url: string): Promise<T> {\r\n const res = await fetch(url, { credentials: 'same-origin' });\r\n\r\n if (!res.ok) {\r\n throw new Error(`[i18n] Failed to load ${url} (${res.status})`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n private normalizeOrigin(origin: string): string {\r\n return origin.replace(/\\/+$/, '');\r\n }\r\n\r\n private flatten(obj: any, prefix = ''): Record<string, any> {\r\n const out: Record<string, any> = {};\r\n\r\n if (obj == null || typeof obj !== 'object' || Array.isArray(obj)) {\r\n if (prefix) out[prefix] = obj;\r\n return out;\r\n }\r\n\r\n for (const key of Object.keys(obj)) {\r\n const value = obj[key];\r\n const next = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (value != null && typeof value === 'object' && !Array.isArray(value)) {\r\n Object.assign(out, this.flatten(value, next));\r\n } else {\r\n out[next] = value;\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n private namespaceKeys(namespace: string, flat: Record<string, any>): Record<string, any> {\r\n const out: Record<string, any> = {};\r\n for (const [k, v] of Object.entries(flat)) {\r\n out[`${namespace}.${k}`] = v;\r\n }\r\n return out;\r\n }\r\n\r\n // ---------------------------\r\n // Public API\r\n // ---------------------------\r\n getMergedTranslations(): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n for (const [, value] of this.store.entries()) {\r\n Object.assign(result, value);\r\n }\r\n return result;\r\n }\r\n\r\n resetLangCache() {\r\n this.loaded.clear();\r\n this.loading.clear();\r\n this.store.clear();\r\n }\r\n}\r\n","import { Injectable, effect, inject, signal } from '@angular/core';\r\nimport { TranslationRegistry } from './translation-registry.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationService {\r\n private readonly registry = inject(TranslationRegistry);\r\n\r\n private readonly _lang = signal<string>('en');\r\n readonly lang = this._lang.asReadonly();\r\n\r\n private readonly _translations = signal<Record<string, any>>({});\r\n readonly translations = this._translations.asReadonly();\r\n\r\n private readonly _ready = signal<boolean>(false);\r\n readonly ready = this._ready.asReadonly();\r\n\r\n constructor() {\r\n effect(() => {\r\n const l = this._lang();\r\n document.documentElement.dir = this.isRtl(l) ? 'rtl' : 'ltr';\r\n document.documentElement.lang = l;\r\n });\r\n }\r\n\r\n private isRtl(lang: string) {\r\n return ['ar'].includes(lang.toLowerCase());\r\n }\r\n\r\n\r\n async init(defaultLang = 'en'): Promise<void> {\r\n const stored = localStorage.getItem('lang');\r\n const lang = stored || defaultLang;\r\n await this.switchLang(lang, { persist: false });\r\n }\r\n\r\n async switchLang(lang: string, opts?: { persist?: boolean; resetCache?: boolean }): Promise<void> {\r\n if (!lang) return;\r\n\r\n const persist = opts?.persist ?? true;\r\n const resetCache = opts?.resetCache ?? false;\r\n\r\n if (resetCache) this.registry.resetLangCache();\r\n\r\n if (this._lang() === lang && this._ready()) return;\r\n\r\n this._ready.set(false);\r\n await this.registry.load(lang);\r\n this._translations.set(this.registry.getMergedTranslations());\r\n this._lang.set(lang);\r\n this._ready.set(true);\r\n\r\n if (persist) localStorage.setItem('lang', lang);\r\n }\r\n\r\n t(key: string, fallback = 'β'): string {\r\n const value = this._translations()[key];\r\n\r\n if (value === undefined && (globalThis as any).ngDevMode) {\r\n console.warn('[i18n missing]', key, 'lang:', this._lang());\r\n }\r\n\r\n return value ?? fallback;\r\n }\r\n}\r\n","import { APP_INITIALIZER, EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { TranslationStore } from '../i18n/translation.store';\r\nimport { TranslationRegistry } from '../i18n/translation-registry.service';\r\nimport { TranslationService } from '../i18n/translation.service';\r\n\r\n\r\nexport function provideFederationTranslation(defaultLang = 'en'): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n TranslationStore,\r\n TranslationRegistry,\r\n TranslationService,\r\n\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [TranslationService],\r\n useFactory: (i18n: TranslationService) => () => i18n.init(defaultLang),\r\n },\r\n ]);\r\n}\r\n","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { TranslationService } from './translation.service';\r\n\r\n@Pipe({\r\n name: 't',\r\n standalone: true,\r\n pure: false,\r\n})\r\nexport class TranslatePipe implements PipeTransform {\r\n private readonly i18n = inject(TranslationService);\r\n\r\n transform(key: string, fallback = 'β'): string {\r\n return this.i18n.t(key, fallback);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ import { EnvironmentProviders, OnChanges, SimpleChanges, PipeTransform } from '@
|
|
|
3
3
|
|
|
4
4
|
declare function provideFederationEnv(): EnvironmentProviders;
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type FrozenEnv = Readonly<Record<string, any>>;
|
|
7
|
+
declare function waitForFederationEnv(remote: string, retries?: number, delayMs?: number): Promise<FrozenEnv>;
|
|
7
8
|
|
|
8
9
|
declare class Assets {
|
|
9
10
|
private readonly assetService;
|