@yaagoub/federation-tools 1.1.6 → 1.1.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.
@@ -1,8 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, makeEnvironmentProviders, provideAppInitializer, ElementRef, input, Directive } from '@angular/core';
3
- import { HttpClient } from '@angular/common/http';
4
- import { firstValueFrom, from } from 'rxjs';
5
- import { map } from 'rxjs/operators';
2
+ import { Injectable, inject, makeEnvironmentProviders, provideAppInitializer, ElementRef, input, Directive, signal, effect, APP_INITIALIZER, Pipe } from '@angular/core';
6
3
 
7
4
  class EnvStore {
8
5
  map = new Map();
@@ -46,39 +43,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
46
43
  args: [{ providedIn: 'root' }]
47
44
  }] });
48
45
 
49
- class Federation {
50
- getShellOrigin() {
51
- return window.location.origin;
52
- }
53
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Federation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
54
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Federation, providedIn: 'root' });
55
- }
56
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: Federation, decorators: [{
57
- type: Injectable,
58
- args: [{
59
- providedIn: 'root'
60
- }]
61
- }] });
62
-
63
46
  class EnvService {
64
- http = inject(HttpClient);
65
- federation = inject(Federation);
66
47
  store = inject(EnvStore);
67
48
  getManifestUrl() {
68
- return this.federation.getShellOrigin() + '/env.manifest.json';
49
+ return `${window.location.origin}/env.manifest.json`;
69
50
  }
70
51
  getRemoteEnvUrl(origin) {
71
52
  return origin.replace(/\/+$/, '') + '/env.json';
72
53
  }
73
54
  async load() {
74
- const manifest = await firstValueFrom(this.http.get(this.getManifestUrl()));
55
+ const manifest = await this.fetchJson(this.getManifestUrl());
75
56
  await Promise.all(Object.entries(manifest).map(async ([name, origin]) => {
76
57
  if (this.store.has(name))
77
58
  return;
78
- const env = await firstValueFrom(this.http.get(this.getRemoteEnvUrl(origin)));
59
+ const env = await this.fetchJson(this.getRemoteEnvUrl(origin));
79
60
  this.store.set(name, env);
80
61
  }));
81
62
  }
63
+ // ---------------------------
64
+ // helpers
65
+ // ---------------------------
66
+ async fetchJson(url) {
67
+ const res = await fetch(url, { credentials: 'same-origin' });
68
+ if (!res.ok) {
69
+ throw new Error(`[env] Failed to load ${url} (${res.status})`);
70
+ }
71
+ return res.json();
72
+ }
82
73
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EnvService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
83
74
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EnvService, providedIn: 'root' });
84
75
  }
@@ -89,7 +80,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
89
80
 
90
81
  function provideFederationEnv() {
91
82
  return makeEnvironmentProviders([
92
- Federation, EnvStore, EnvService, Env,
83
+ EnvStore, EnvService, Env,
93
84
  provideAppInitializer(() => inject(EnvService).load()),
94
85
  ]);
95
86
  }
@@ -117,22 +108,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
117
108
  }] });
118
109
 
119
110
  class AssetService {
120
- http = inject(HttpClient);
121
- federation = inject(Federation);
122
111
  assets = inject(AssetStore);
123
- getAssetManifest() {
124
- return this.http.get(this.federation.getShellOrigin() + '/assets.manifest.json');
112
+ getAssetManifestUrl() {
113
+ return `${window.location.origin}/assets.manifest.json`;
125
114
  }
126
115
  async load() {
127
116
  try {
128
- const manifest = await firstValueFrom(this.getAssetManifest());
117
+ const manifest = await this.fetchJson(this.getAssetManifestUrl());
129
118
  // Remotes
130
119
  Object.entries(manifest).forEach(([remote, origin]) => {
131
- this.assets.set(remote, origin);
120
+ this.assets.set(remote, origin.replace(/\/+$/, ''));
132
121
  });
133
122
  }
134
123
  catch (error) {
135
- throw new Error('Failed to load asset configuration, cannot continue. ' + error);
124
+ throw new Error('[assets] Failed to load asset configuration. ' + String(error));
136
125
  }
137
126
  }
138
127
  resolve(assetRef) {
@@ -143,14 +132,24 @@ class AssetService {
143
132
  * doc:video/intro.mp4
144
133
  */
145
134
  if (!assetRef.includes(':')) {
146
- throw new Error(`Invalid asset reference: ${assetRef}`);
135
+ throw new Error(`[assets] Invalid asset reference: ${assetRef}`);
147
136
  }
148
137
  const [scope, path] = assetRef.split(':');
149
138
  const origin = this.assets.get(scope);
150
139
  if (!origin) {
151
- throw new Error(`Unknown asset scope: ${scope}`);
140
+ throw new Error(`[assets] Unknown asset scope: ${scope}`);
152
141
  }
153
- return `${origin}/${path}`;
142
+ return `${origin}/${path.replace(/^\/+/, '')}`;
143
+ }
144
+ // ---------------------------
145
+ // helpers
146
+ // ---------------------------
147
+ async fetchJson(url) {
148
+ const res = await fetch(url, { credentials: 'same-origin' });
149
+ if (!res.ok) {
150
+ throw new Error(`${res.status} ${res.statusText}`);
151
+ }
152
+ return res.json();
154
153
  }
155
154
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AssetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
156
155
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AssetService, providedIn: 'root' });
@@ -222,14 +221,11 @@ function provideFederationAsset() {
222
221
 
223
222
  class TranslationStore {
224
223
  map = new Map();
225
- set(name, translations) {
226
- this.map.set(name, translations);
224
+ set(namespace, translations) {
225
+ this.map.set(namespace, translations);
227
226
  }
228
- get(name) {
229
- return this.map.get(name);
230
- }
231
- has(name) {
232
- return this.map.has(name);
227
+ clear() {
228
+ this.map.clear();
233
229
  }
234
230
  entries() {
235
231
  return this.map.entries();
@@ -243,38 +239,105 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
243
239
  }] });
244
240
 
245
241
  class TranslationRegistry {
246
- http = inject(HttpClient);
247
- federation = inject(Federation);
248
242
  store = inject(TranslationStore);
249
243
  loading = new Map();
250
244
  loaded = new Set();
245
+ manifestCache;
246
+ // ---------------------------
247
+ // Manifest
248
+ // ---------------------------
249
+ async getManifest() {
250
+ if (this.manifestCache)
251
+ return this.manifestCache;
252
+ const url = `${window.location.origin}/i18n.manifest.json`;
253
+ this.manifestCache = await this.fetchJson(url);
254
+ return this.manifestCache;
255
+ }
256
+ // ---------------------------
257
+ // Load language
258
+ // ---------------------------
251
259
  async load(lang) {
252
260
  if (this.loaded.has(lang))
253
261
  return;
254
- if (this.loading.has(lang)) {
255
- return this.loading.get(lang);
256
- }
262
+ const existing = this.loading.get(lang);
263
+ if (existing)
264
+ return existing;
257
265
  const promise = (async () => {
258
- const manifest = await firstValueFrom(this.http.get(this.federation.getShellOrigin() + '/i18n.manifest.json'));
259
- const entries = await Promise.all(Object.entries(manifest).map(async ([name, origin]) => {
260
- const translations = await firstValueFrom(this.http.get(`${origin}/i18n/${lang}.json`));
261
- return [name, translations];
266
+ const manifest = await this.getManifest();
267
+ const entries = await Promise.all(Object.entries(manifest).map(async ([namespace, origin]) => {
268
+ const base = this.normalizeOrigin(origin);
269
+ const url = `${base}/i18n/${lang}.json`;
270
+ const raw = await this.fetchJson(url);
271
+ const flat = this.flatten(raw);
272
+ const namespaced = this.namespaceKeys(namespace, flat);
273
+ return [namespace, namespaced];
262
274
  }));
263
- // atomic commit (important)
264
- entries.forEach(([name, translations]) => this.store.set(name, translations));
275
+ // atomic commit
276
+ entries.forEach(([ns, translations]) => this.store.set(ns, translations));
265
277
  this.loaded.add(lang);
266
278
  })();
267
279
  this.loading.set(lang, promise);
268
- await promise;
269
- this.loading.delete(lang);
280
+ try {
281
+ await promise;
282
+ }
283
+ finally {
284
+ this.loading.delete(lang);
285
+ }
286
+ }
287
+ // ---------------------------
288
+ // Helpers
289
+ // ---------------------------
290
+ async fetchJson(url) {
291
+ const res = await fetch(url, { credentials: 'same-origin' });
292
+ if (!res.ok) {
293
+ throw new Error(`[i18n] Failed to load ${url} (${res.status})`);
294
+ }
295
+ return res.json();
270
296
  }
297
+ normalizeOrigin(origin) {
298
+ return origin.replace(/\/+$/, '');
299
+ }
300
+ flatten(obj, prefix = '') {
301
+ const out = {};
302
+ if (obj == null || typeof obj !== 'object' || Array.isArray(obj)) {
303
+ if (prefix)
304
+ out[prefix] = obj;
305
+ return out;
306
+ }
307
+ for (const key of Object.keys(obj)) {
308
+ const value = obj[key];
309
+ const next = prefix ? `${prefix}.${key}` : key;
310
+ if (value != null && typeof value === 'object' && !Array.isArray(value)) {
311
+ Object.assign(out, this.flatten(value, next));
312
+ }
313
+ else {
314
+ out[next] = value;
315
+ }
316
+ }
317
+ return out;
318
+ }
319
+ namespaceKeys(namespace, flat) {
320
+ const out = {};
321
+ for (const [k, v] of Object.entries(flat)) {
322
+ out[`${namespace}.${k}`] = v;
323
+ }
324
+ return out;
325
+ }
326
+ // ---------------------------
327
+ // Public API
328
+ // ---------------------------
271
329
  getMergedTranslations() {
272
330
  const result = {};
273
- for (const [key, value] of this.store.entries()) {
331
+ for (const [, value] of this.store.entries()) {
274
332
  Object.assign(result, value);
275
333
  }
276
334
  return result;
277
335
  }
336
+ resetLangCache() {
337
+ this.loaded.clear();
338
+ this.loading.clear();
339
+ this.store.clear();
340
+ }
278
341
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslationRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
279
342
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslationRegistry, providedIn: 'root' });
280
343
  }
@@ -283,28 +346,95 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
283
346
  args: [{ providedIn: 'root' }]
284
347
  }] });
285
348
 
286
- class FederatedTranslateLoader {
349
+ class TranslationService {
287
350
  registry = inject(TranslationRegistry);
288
- getTranslation(lang) {
289
- return from(this.registry.load(lang)).pipe(map(() => this.registry.getMergedTranslations()));
351
+ _lang = signal('en', ...(ngDevMode ? [{ debugName: "_lang" }] : []));
352
+ lang = this._lang.asReadonly();
353
+ _translations = signal({}, ...(ngDevMode ? [{ debugName: "_translations" }] : []));
354
+ translations = this._translations.asReadonly();
355
+ _ready = signal(false, ...(ngDevMode ? [{ debugName: "_ready" }] : []));
356
+ ready = this._ready.asReadonly();
357
+ constructor() {
358
+ effect(() => {
359
+ const l = this._lang();
360
+ document.documentElement.dir = this.isRtl(l) ? 'rtl' : 'ltr';
361
+ document.documentElement.lang = l;
362
+ });
363
+ }
364
+ isRtl(lang) {
365
+ return ['ar'].includes(lang.toLowerCase());
366
+ }
367
+ async init(defaultLang = 'en') {
368
+ const stored = localStorage.getItem('lang');
369
+ const lang = stored || defaultLang;
370
+ await this.switchLang(lang, { persist: false });
371
+ }
372
+ async switchLang(lang, opts) {
373
+ if (!lang)
374
+ return;
375
+ const persist = opts?.persist ?? true;
376
+ const resetCache = opts?.resetCache ?? false;
377
+ if (resetCache)
378
+ this.registry.resetLangCache();
379
+ if (this._lang() === lang && this._ready())
380
+ return;
381
+ this._ready.set(false);
382
+ await this.registry.load(lang);
383
+ this._translations.set(this.registry.getMergedTranslations());
384
+ this._lang.set(lang);
385
+ this._ready.set(true);
386
+ if (persist)
387
+ localStorage.setItem('lang', lang);
388
+ }
389
+ t(key, fallback = '—') {
390
+ const value = this._translations()[key];
391
+ if (value === undefined && globalThis.ngDevMode) {
392
+ console.warn('[i18n missing]', key, 'lang:', this._lang());
393
+ }
394
+ return value ?? fallback;
290
395
  }
291
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FederatedTranslateLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
292
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FederatedTranslateLoader, providedIn: 'root' });
396
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
397
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslationService, providedIn: 'root' });
293
398
  }
294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FederatedTranslateLoader, decorators: [{
399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslationService, decorators: [{
295
400
  type: Injectable,
296
401
  args: [{ providedIn: 'root' }]
297
- }] });
402
+ }], ctorParameters: () => [] });
298
403
 
299
- function provideFederationTranslation() {
404
+ function provideFederationTranslation(defaultLang = 'en') {
300
405
  return makeEnvironmentProviders([
301
- TranslationStore, TranslationRegistry, FederatedTranslateLoader
406
+ TranslationStore,
407
+ TranslationRegistry,
408
+ TranslationService,
409
+ {
410
+ provide: APP_INITIALIZER,
411
+ multi: true,
412
+ deps: [TranslationService],
413
+ useFactory: (i18n) => () => i18n.init(defaultLang),
414
+ },
302
415
  ]);
303
416
  }
304
417
 
418
+ class TranslatePipe {
419
+ i18n = inject(TranslationService);
420
+ transform(key, fallback = '—') {
421
+ return this.i18n.t(key, fallback);
422
+ }
423
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
424
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: TranslatePipe, isStandalone: true, name: "t", pure: false });
425
+ }
426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TranslatePipe, decorators: [{
427
+ type: Pipe,
428
+ args: [{
429
+ name: 't',
430
+ standalone: true,
431
+ pure: false,
432
+ }]
433
+ }] });
434
+
305
435
  /**
306
436
  * Generated bundle index. Do not edit.
307
437
  */
308
438
 
309
- export { AssetDirective, Assets, Env, FederatedTranslateLoader, TranslationRegistry, provideFederationAsset, provideFederationEnv, provideFederationTranslation };
439
+ export { AssetDirective, Assets, Env, TranslatePipe, TranslationService, provideFederationAsset, provideFederationEnv, provideFederationTranslation };
310
440
  //# sourceMappingURL=yaagoub-federation-tools.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaagoub-federation-tools.mjs","sources":["../../../projects/federation-tools/src/env/env.store.ts","../../../projects/federation-tools/src/env/env.ts","../../../projects/federation-tools/src/federation/federation.service.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/federated-translate.loader.ts","../../../projects/federation-tools/src/providers/provide-trans.ts","../../../projects/federation-tools/src/yaagoub-federation-tools.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvStore {\r\n private readonly map = new Map<string, Record<string, any>>();\r\n\r\n set(name: string, env: Record<string, any>) {\r\n this.map.set(name, env);\r\n }\r\n\r\n get(name: string): Record<string, any> | 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 { inject, Injectable } from '@angular/core';\r\nimport { EnvStore } from './env.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Env {\r\n private readonly store = inject(EnvStore);\r\n\r\n get(remoteName: string): Record<string, any> {\r\n const env = this.store.get(remoteName);\r\n if (!env) {\r\n throw new Error(`Env \"${remoteName}\" not loaded`);\r\n }\r\n return env;\r\n }\r\n\r\n has(remoteName: string): boolean {\r\n return this.store.has(remoteName);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class Federation {\r\n getShellOrigin(): string {\r\n return window.location.origin;\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { InjectionToken } from '@angular/core';\r\nimport { Federation } from '../federation/federation.service';\r\nimport { EnvStore } from './env.store';\r\n\r\nexport type EnvMap = Map<string, Record<string, any>>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvService {\r\n private readonly http = inject(HttpClient);\r\n private readonly federation = inject(Federation);\r\n private readonly store = inject(EnvStore);\r\n\r\n private getManifestUrl(): string {\r\n return this.federation.getShellOrigin() + '/env.manifest.json';\r\n }\r\n\r\n private getRemoteEnvUrl(origin: string): string {\r\n return origin.replace(/\\/+$/, '') + '/env.json';\r\n }\r\n\r\n async load(): Promise<void> {\r\n const manifest = await firstValueFrom(\r\n this.http.get<Record<string, string>>(this.getManifestUrl())\r\n );\r\n\r\n await Promise.all(\r\n Object.entries(manifest).map(async ([name, origin]) => {\r\n if (this.store.has(name)) return;\r\n\r\n const env = await firstValueFrom(\r\n this.http.get<Record<string, any>>(this.getRemoteEnvUrl(origin))\r\n );\r\n\r\n this.store.set(name, env);\r\n })\r\n );\r\n }\r\n}\r\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\r\nimport { EnvService } from '../env/env.service';\r\nimport { Federation } from '../federation/federation.service';\r\nimport { Env } from '../env/env';\r\nimport { EnvStore } from '../env/env.store';\r\nimport { provideAppInitializer } from '@angular/core';\r\n\r\nexport function provideFederationEnv(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n Federation, EnvStore, EnvService, Env,\r\n provideAppInitializer(() => inject(EnvService).load()),\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 { inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\nimport { Federation } from '../federation/federation.service';\r\nimport { AssetStore } from \"./asset.store\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AssetService {\r\n\r\n private readonly http = inject(HttpClient);\r\n private readonly federation = inject(Federation);\r\n private readonly assets = inject(AssetStore);\r\n\r\n private getAssetManifest() {\r\n return this.http.get<Record<string, string>>(\r\n this.federation.getShellOrigin() + '/assets.manifest.json'\r\n );\r\n }\r\n\r\n async load(): Promise<void> {\r\n try {\r\n const manifest = await firstValueFrom(this.getAssetManifest());\r\n\r\n // Remotes\r\n Object.entries(manifest).forEach(([remote, origin]) => {\r\n this.assets.set(remote, origin);\r\n });\r\n\r\n } catch (error) {\r\n throw new Error(\r\n 'Failed to load asset configuration, cannot continue. ' + 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(`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(`Unknown asset scope: ${scope}`);\r\n }\r\n\r\n return `${origin}/${path}`;\r\n }\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, any>();\r\n\r\n set(name: string, translations: any) {\r\n this.map.set(name, translations);\r\n }\r\n\r\n get(name: string): any | 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 { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\nimport { Federation } from '../federation/federation.service';\r\nimport { TranslationStore } from './translation.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TranslationRegistry {\r\n private readonly http = inject(HttpClient);\r\n private readonly federation = inject(Federation);\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\r\n async load(lang: string): Promise<void> {\r\n if (this.loaded.has(lang)) return;\r\n\r\n if (this.loading.has(lang)) {\r\n return this.loading.get(lang)!;\r\n }\r\n\r\n const promise = (async () => {\r\n const manifest = await firstValueFrom(\r\n this.http.get<Record<string, string>>(\r\n this.federation.getShellOrigin() + '/i18n.manifest.json'\r\n )\r\n );\r\n\r\n const entries = await Promise.all(\r\n Object.entries(manifest).map(async ([name, origin]) => {\r\n const translations = await firstValueFrom(\r\n this.http.get(`${origin}/i18n/${lang}.json`)\r\n );\r\n return [name, translations] as const;\r\n })\r\n );\r\n\r\n // ⚠ atomic commit (important)\r\n entries.forEach(([name, translations]) =>\r\n this.store.set(name, translations)\r\n );\r\n\r\n this.loaded.add(lang);\r\n })();\r\n\r\n this.loading.set(lang, promise);\r\n await promise;\r\n this.loading.delete(lang);\r\n }\r\n\r\n getMergedTranslations(): any {\r\n const result: any = {};\r\n for (const [key, value] of this.store.entries()) {\r\n Object.assign(result, value);\r\n }\r\n return result;\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslateLoader } from '@ngx-translate/core';\r\nimport { Observable, from } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { TranslationRegistry } from './translation-registry.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FederatedTranslateLoader implements TranslateLoader {\r\n private readonly registry = inject(TranslationRegistry);\r\n\r\n getTranslation(lang: string): Observable<any> {\r\n return from(this.registry.load(lang)).pipe(\r\n map(() => this.registry.getMergedTranslations())\r\n );\r\n }\r\n}\r\n","import { makeEnvironmentProviders } from '@angular/core';\r\nimport { TranslationRegistry } from '../i18n/translation-registry.service';\r\nimport { FederatedTranslateLoader } from '../i18n/federated-translate.loader';\r\nimport { TranslationStore } from '../i18n/translation.store';\r\n\r\n\r\nexport function provideFederationTranslation() {\r\n return makeEnvironmentProviders([\r\n TranslationStore, TranslationRegistry, FederatedTranslateLoader \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/env.store.ts","../../../projects/federation-tools/src/env/env.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":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvStore {\r\n private readonly map = new Map<string, Record<string, any>>();\r\n\r\n set(name: string, env: Record<string, any>) {\r\n this.map.set(name, env);\r\n }\r\n\r\n get(name: string): Record<string, any> | 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 { inject, Injectable } from '@angular/core';\r\nimport { EnvStore } from './env.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Env {\r\n private readonly store = inject(EnvStore);\r\n\r\n get(remoteName: string): Record<string, any> {\r\n const env = this.store.get(remoteName);\r\n if (!env) {\r\n throw new Error(`Env \"${remoteName}\" not loaded`);\r\n }\r\n return env;\r\n }\r\n\r\n has(remoteName: string): boolean {\r\n return this.store.has(remoteName);\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { EnvStore } from './env.store';\r\n\r\nexport type EnvMap = Map<string, Record<string, any>>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EnvService {\r\n private readonly store = inject(EnvStore);\r\n\r\n private getManifestUrl(): string {\r\n return `${window.location.origin}/env.manifest.json`;\r\n }\r\n\r\n private getRemoteEnvUrl(origin: string): string {\r\n return origin.replace(/\\/+$/, '') + '/env.json';\r\n }\r\n\r\n async load(): Promise<void> {\r\n const manifest = await this.fetchJson<Record<string, string>>(\r\n this.getManifestUrl()\r\n );\r\n\r\n await Promise.all(\r\n Object.entries(manifest).map(async ([name, origin]) => {\r\n if (this.store.has(name)) return;\r\n\r\n const env = await this.fetchJson<Record<string, any>>(\r\n this.getRemoteEnvUrl(origin)\r\n );\r\n\r\n this.store.set(name, env);\r\n })\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(`[env] Failed to load ${url} (${res.status})`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n}\r\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\r\nimport { EnvService } from '../env/env.service';\r\nimport { Env } from '../env/env';\r\nimport { EnvStore } from '../env/env.store';\r\nimport { provideAppInitializer } from '@angular/core';\r\n\r\nexport function provideFederationEnv(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n EnvStore, EnvService, Env,\r\n provideAppInitializer(() => inject(EnvService).load()),\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
@@ -1,7 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EnvironmentProviders, OnChanges, SimpleChanges } from '@angular/core';
3
- import { TranslateLoader } from '@ngx-translate/core';
4
- import { Observable } from 'rxjs';
2
+ import { EnvironmentProviders, OnChanges, SimpleChanges, PipeTransform } from '@angular/core';
5
3
 
6
4
  declare class Env {
7
5
  private readonly store;
@@ -32,25 +30,33 @@ declare class AssetDirective implements OnChanges {
32
30
 
33
31
  declare function provideFederationAsset(): i0.EnvironmentProviders;
34
32
 
35
- declare function provideFederationTranslation(): i0.EnvironmentProviders;
33
+ declare function provideFederationTranslation(defaultLang?: string): EnvironmentProviders;
36
34
 
37
- declare class FederatedTranslateLoader implements TranslateLoader {
38
- private readonly registry;
39
- getTranslation(lang: string): Observable<any>;
40
- static ɵfac: i0.ɵɵFactoryDeclaration<FederatedTranslateLoader, never>;
41
- static ɵprov: i0.ɵɵInjectableDeclaration<FederatedTranslateLoader>;
35
+ declare class TranslatePipe implements PipeTransform {
36
+ private readonly i18n;
37
+ transform(key: string, fallback?: string): string;
38
+ static ɵfac: i0.ɵɵFactoryDeclaration<TranslatePipe, never>;
39
+ static ɵpipe: i0.ɵɵPipeDeclaration<TranslatePipe, "t", true>;
42
40
  }
43
41
 
44
- declare class TranslationRegistry {
45
- private readonly http;
46
- private readonly federation;
47
- private readonly store;
48
- private loading;
49
- private loaded;
50
- load(lang: string): Promise<void>;
51
- getMergedTranslations(): any;
52
- static ɵfac: i0.ɵɵFactoryDeclaration<TranslationRegistry, never>;
53
- static ɵprov: i0.ɵɵInjectableDeclaration<TranslationRegistry>;
42
+ declare class TranslationService {
43
+ private readonly registry;
44
+ private readonly _lang;
45
+ readonly lang: i0.Signal<string>;
46
+ private readonly _translations;
47
+ readonly translations: i0.Signal<Record<string, any>>;
48
+ private readonly _ready;
49
+ readonly ready: i0.Signal<boolean>;
50
+ constructor();
51
+ private isRtl;
52
+ init(defaultLang?: string): Promise<void>;
53
+ switchLang(lang: string, opts?: {
54
+ persist?: boolean;
55
+ resetCache?: boolean;
56
+ }): Promise<void>;
57
+ t(key: string, fallback?: string): string;
58
+ static ɵfac: i0.ɵɵFactoryDeclaration<TranslationService, never>;
59
+ static ɵprov: i0.ɵɵInjectableDeclaration<TranslationService>;
54
60
  }
55
61
 
56
- export { AssetDirective, Assets, Env, FederatedTranslateLoader, TranslationRegistry, provideFederationAsset, provideFederationEnv, provideFederationTranslation };
62
+ export { AssetDirective, Assets, Env, TranslatePipe, TranslationService, provideFederationAsset, provideFederationEnv, provideFederationTranslation };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yaagoub/federation-tools",
3
- "version": "1.1.6",
3
+ "version": "1.1.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=15.0.0",
6
6
  "@angular/core": ">=15.0.0"