@ama-mfe/ng-utils 12.4.0-prerelease.4 → 12.4.0-prerelease.40
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 +7 -2
- package/connect/connect.providers.d.ts.map +1 -1
- package/fesm2022/ama-mfe-ng-utils.mjs +113 -66
- package/fesm2022/ama-mfe-ng-utils.mjs.map +1 -1
- package/history/history.providers.d.ts +13 -0
- package/history/history.providers.d.ts.map +1 -0
- package/history/index.d.ts +2 -0
- package/history/index.d.ts.map +1 -0
- package/managers/interfaces.d.ts +1 -1
- package/managers/interfaces.d.ts.map +1 -1
- package/managers/utils.d.ts +7 -1
- package/managers/utils.d.ts.map +1 -1
- package/navigation/index.d.ts +1 -1
- package/navigation/index.d.ts.map +1 -1
- package/navigation/navigation.consumer.service.d.ts +1 -2
- package/navigation/navigation.consumer.service.d.ts.map +1 -1
- package/navigation/{navigation.producer.service.d.ts → routing.service.d.ts} +26 -6
- package/navigation/routing.service.d.ts.map +1 -0
- package/package.json +6 -6
- package/resize/resize.producer.service.d.ts +0 -7
- package/resize/resize.producer.service.d.ts.map +1 -1
- package/navigation/navigation.producer.service.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -7,8 +7,7 @@ interaction between host and embedded applications.
|
|
|
7
7
|
|
|
8
8
|
Key features include:
|
|
9
9
|
- [Connect](https://github.com/AmadeusITGroup/otter/blob/main/packages/%40ama-mfe/ng-utils/src/connect/): Connect to the communication protocol and send messages to registered applications.
|
|
10
|
-
- [Navigation](https://github.com/AmadeusITGroup/otter/blob/main/packages/%40ama-mfe/ng-utils/src/navigation/):
|
|
11
|
-
maintaining consistency even after a page refresh.
|
|
10
|
+
- [Navigation](https://github.com/AmadeusITGroup/otter/blob/main/packages/%40ama-mfe/ng-utils/src/navigation/): Handles navigation messages between the host and embedded applications. Embedded applications can use `RoutingService` to sync their internal routing with the host application. The host application can use `NavigationConsumerService` to get notifications about navigation events in the embedded applications.
|
|
12
11
|
- [Theme](https://github.com/AmadeusITGroup/otter/blob/main/packages/%40ama-mfe/ng-utils/src/theme/): Allows the application of unified CSS variables and styles across embedded modules, ensuring a cohesive
|
|
13
12
|
look and feel.
|
|
14
13
|
- [Resize](https://github.com/AmadeusITGroup/otter/blob/main/packages/%40ama-mfe/ng-utils/src/resize/): Dynamically adjusts the iframe dimensions to fit the content of the embedded application, enhancing the
|
|
@@ -290,3 +289,9 @@ export class SomeClass {
|
|
|
290
289
|
```
|
|
291
290
|
|
|
292
291
|
The host information is stored in session storage so it won't be lost when navigating inside the iframe.
|
|
292
|
+
|
|
293
|
+
### Browser history handling
|
|
294
|
+
|
|
295
|
+
When using iframes to embed applications, the browser history might be shared by the main page and the embedded iframe. For example `<iframe src="https://example.com" sandbox="allow-same-origin">` will share the same history as the main page. This can lead to unexpected behavior when using browser 'back' and 'forward' buttons.
|
|
296
|
+
|
|
297
|
+
To avoid this, the `@ama-mfe/ng-utils` will forbid the application running in the iframe to alter the browser history. It will happen when connection is configured using `provideConection()` function. This will prevent the iframe to be able to use the `history.pushState` and `history.replaceState` methods.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.providers.d.ts","sourceRoot":"","sources":["../../src/connect/connect.providers.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.providers.d.ts","sourceRoot":"","sources":["../../src/connect/connect.providers.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAarB,OAAO,EACL,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAE7B,4EAA4E;AAC5E,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;IAC3E,kBAAkB;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,uBAAuB,gDA0BlF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MessagePeerService, MESSAGE_PEER_CONFIG, MESSAGE_PEER_CONNECT_OPTIONS } from '@amadeus-it-group/microfrontends-angular';
|
|
2
2
|
export { MessagePeerService as ConnectionService } from '@amadeus-it-group/microfrontends-angular';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Injectable, inject, signal, effect, DestroyRef, afterNextRender, input, computed, ElementRef, Renderer2, Directive, SecurityContext, Pipe, untracked, HostBinding, makeEnvironmentProviders } from '@angular/core';
|
|
4
|
+
import { Injectable, inject, signal, effect, DestroyRef, afterNextRender, input, computed, ElementRef, Renderer2, Directive, SecurityContext, Pipe, untracked, HostBinding, provideAppInitializer, makeEnvironmentProviders } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { LoggerService } from '@o3r/logger';
|
|
7
7
|
import { RESIZE_MESSAGE_TYPE, NAVIGATION_MESSAGE_TYPE, THEME_MESSAGE_TYPE } from '@ama-mfe/messages';
|
|
@@ -78,10 +78,10 @@ class ProducerManagerService {
|
|
|
78
78
|
}
|
|
79
79
|
return handlersPresent;
|
|
80
80
|
}
|
|
81
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
82
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
81
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ProducerManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
82
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ProducerManagerService, providedIn: 'root' }); }
|
|
83
83
|
}
|
|
84
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
84
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ProducerManagerService, decorators: [{
|
|
85
85
|
type: Injectable,
|
|
86
86
|
args: [{
|
|
87
87
|
providedIn: 'root'
|
|
@@ -173,10 +173,10 @@ class ConsumerManagerService {
|
|
|
173
173
|
return consumers.filter((c) => c !== consumer);
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
177
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
176
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ConsumerManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
177
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ConsumerManagerService, providedIn: 'root' }); }
|
|
178
178
|
}
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ConsumerManagerService, decorators: [{
|
|
180
180
|
type: Injectable,
|
|
181
181
|
args: [{
|
|
182
182
|
providedIn: 'root'
|
|
@@ -195,6 +195,18 @@ const registerProducer = (producer) => {
|
|
|
195
195
|
producerManagerService.unregister(producer);
|
|
196
196
|
});
|
|
197
197
|
};
|
|
198
|
+
/**
|
|
199
|
+
* Method to call in the constructor of a consumer
|
|
200
|
+
* @note should be used in injection context
|
|
201
|
+
* @param consumer
|
|
202
|
+
*/
|
|
203
|
+
const registerConsumer = (consumer) => {
|
|
204
|
+
const consumerManagerService = inject(ConsumerManagerService);
|
|
205
|
+
consumerManagerService.register(consumer);
|
|
206
|
+
inject(DestroyRef).onDestroy(() => {
|
|
207
|
+
consumerManagerService.unregister(consumer);
|
|
208
|
+
});
|
|
209
|
+
};
|
|
198
210
|
|
|
199
211
|
/** the error message type */
|
|
200
212
|
const ERROR_MESSAGE_TYPE = 'error';
|
|
@@ -239,23 +251,16 @@ class ResizeConsumerService {
|
|
|
239
251
|
stop() {
|
|
240
252
|
this.consumerManagerService.unregister(this);
|
|
241
253
|
}
|
|
242
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
243
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
254
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeConsumerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
255
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeConsumerService, providedIn: 'root' }); }
|
|
244
256
|
}
|
|
245
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeConsumerService, decorators: [{
|
|
246
258
|
type: Injectable,
|
|
247
259
|
args: [{
|
|
248
260
|
providedIn: 'root'
|
|
249
261
|
}]
|
|
250
262
|
}], ctorParameters: () => [] });
|
|
251
263
|
|
|
252
|
-
/**
|
|
253
|
-
* `scrollHeight` is a rounded number (cf https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight)
|
|
254
|
-
*
|
|
255
|
-
* So we have to add a delta to ensure no scrollbar will appear on the host,
|
|
256
|
-
* in case the `scrollHeight` is rounded down
|
|
257
|
-
*/
|
|
258
|
-
const DELTA_RESIZE = 1;
|
|
259
264
|
/**
|
|
260
265
|
* This service observe changes in the document's body height.
|
|
261
266
|
* When the height changes, it sends a resize message with the new height, to the connected peers
|
|
@@ -282,12 +287,13 @@ class ResizeService {
|
|
|
282
287
|
*/
|
|
283
288
|
startResizeObserver() {
|
|
284
289
|
this.resizeObserver = new ResizeObserver(() => {
|
|
285
|
-
|
|
286
|
-
|
|
290
|
+
const newHeight = document.body.getBoundingClientRect().height;
|
|
291
|
+
if (!this.actualHeight || newHeight !== this.actualHeight) {
|
|
292
|
+
this.actualHeight = newHeight;
|
|
287
293
|
const messageV10 = {
|
|
288
294
|
type: 'resize',
|
|
289
295
|
version: '1.0',
|
|
290
|
-
height:
|
|
296
|
+
height: this.actualHeight
|
|
291
297
|
};
|
|
292
298
|
// TODO: sendBest() is not implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11
|
|
293
299
|
this.messageService.send(messageV10);
|
|
@@ -295,10 +301,10 @@ class ResizeService {
|
|
|
295
301
|
});
|
|
296
302
|
afterNextRender(() => this.resizeObserver?.observe(document.body));
|
|
297
303
|
}
|
|
298
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
299
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
304
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
305
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeService, providedIn: 'root' }); }
|
|
300
306
|
}
|
|
301
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ResizeService, decorators: [{
|
|
302
308
|
type: Injectable,
|
|
303
309
|
args: [{
|
|
304
310
|
providedIn: 'root'
|
|
@@ -342,10 +348,10 @@ class ScalableDirective {
|
|
|
342
348
|
}
|
|
343
349
|
});
|
|
344
350
|
}
|
|
345
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
346
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.
|
|
351
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ScalableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
352
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.13", type: ScalableDirective, isStandalone: true, selector: "[scalable]", inputs: { connect: { classPropertyName: "connect", publicName: "connect", isSignal: true, isRequired: false, transformFunction: null }, scalable: { classPropertyName: "scalable", publicName: "scalable", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
347
353
|
}
|
|
348
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ScalableDirective, decorators: [{
|
|
349
355
|
type: Directive,
|
|
350
356
|
args: [{
|
|
351
357
|
selector: '[scalable]',
|
|
@@ -421,10 +427,10 @@ class HostInfoPipe {
|
|
|
421
427
|
return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);
|
|
422
428
|
}
|
|
423
429
|
}
|
|
424
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
425
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
430
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: HostInfoPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
431
|
+
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.13", ngImport: i0, type: HostInfoPipe, isStandalone: true, name: "hostInfo" }); }
|
|
426
432
|
}
|
|
427
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
433
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: HostInfoPipe, decorators: [{
|
|
428
434
|
type: Pipe,
|
|
429
435
|
args: [{
|
|
430
436
|
name: 'hostInfo'
|
|
@@ -461,7 +467,7 @@ class NavigationConsumerService {
|
|
|
461
467
|
'1.0': (message) => {
|
|
462
468
|
const channelId = message.from || undefined;
|
|
463
469
|
this.requestedUrl.next({ url: message.payload.url, channelId });
|
|
464
|
-
this.navigate(message.payload.url
|
|
470
|
+
this.navigate(message.payload.url);
|
|
465
471
|
}
|
|
466
472
|
};
|
|
467
473
|
this.consumerManagerService = inject(ConsumerManagerService);
|
|
@@ -480,15 +486,14 @@ class NavigationConsumerService {
|
|
|
480
486
|
return { paths, queryParams };
|
|
481
487
|
}
|
|
482
488
|
/**
|
|
483
|
-
* Navigates to the specified URL
|
|
489
|
+
* Navigates to the specified URL.
|
|
484
490
|
* @param url - The URL to navigate to.
|
|
485
|
-
* @param channelId - The optional channel ID for the navigation state. This is the endpoint from where the message is received
|
|
486
491
|
*/
|
|
487
|
-
navigate(url
|
|
492
|
+
navigate(url) {
|
|
488
493
|
const { paths, queryParams } = this.parseUrl(url);
|
|
489
494
|
// No need to keep these in the URL
|
|
490
495
|
hostQueryParams.forEach((key) => delete queryParams[key]);
|
|
491
|
-
void this.router.navigate(paths, { relativeTo: this.activeRoute.children.at(-1), queryParams
|
|
496
|
+
void this.router.navigate(paths, { relativeTo: this.activeRoute.children.at(-1), queryParams });
|
|
492
497
|
}
|
|
493
498
|
/**
|
|
494
499
|
* @inheritdoc
|
|
@@ -502,10 +507,10 @@ class NavigationConsumerService {
|
|
|
502
507
|
stop() {
|
|
503
508
|
this.consumerManagerService.unregister(this);
|
|
504
509
|
}
|
|
505
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
506
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
510
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: NavigationConsumerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
511
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: NavigationConsumerService, providedIn: 'root' }); }
|
|
507
512
|
}
|
|
508
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
513
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: NavigationConsumerService, decorators: [{
|
|
509
514
|
type: Injectable,
|
|
510
515
|
args: [{
|
|
511
516
|
providedIn: 'root'
|
|
@@ -548,10 +553,10 @@ class RouteMemorizeService {
|
|
|
548
553
|
getRoute(channelId) {
|
|
549
554
|
return this.routeStack[channelId];
|
|
550
555
|
}
|
|
551
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
552
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
556
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RouteMemorizeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
557
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RouteMemorizeService, providedIn: 'root' }); }
|
|
553
558
|
}
|
|
554
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
559
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RouteMemorizeService, decorators: [{
|
|
555
560
|
type: Injectable,
|
|
556
561
|
args: [{
|
|
557
562
|
providedIn: 'root'
|
|
@@ -604,10 +609,10 @@ class RouteMemorizeDirective {
|
|
|
604
609
|
}
|
|
605
610
|
});
|
|
606
611
|
}
|
|
607
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
608
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.
|
|
612
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RouteMemorizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
613
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.13", type: RouteMemorizeDirective, isStandalone: true, selector: "iframe[memorizeRoute]", inputs: { memorizeRoute: { classPropertyName: "memorizeRoute", publicName: "memorizeRoute", isSignal: true, isRequired: false, transformFunction: null }, memorizeRouteId: { classPropertyName: "memorizeRouteId", publicName: "memorizeRouteId", isSignal: true, isRequired: false, transformFunction: null }, memorizeMaxAge: { classPropertyName: "memorizeMaxAge", publicName: "memorizeMaxAge", isSignal: true, isRequired: false, transformFunction: null }, memorizeRouteMaxAge: { classPropertyName: "memorizeRouteMaxAge", publicName: "memorizeRouteMaxAge", isSignal: true, isRequired: false, transformFunction: null }, connect: { classPropertyName: "connect", publicName: "connect", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
609
614
|
}
|
|
610
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
615
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RouteMemorizeDirective, decorators: [{
|
|
611
616
|
type: Directive,
|
|
612
617
|
args: [{
|
|
613
618
|
selector: 'iframe[memorizeRoute]',
|
|
@@ -646,10 +651,10 @@ function isEmbedded() {
|
|
|
646
651
|
}
|
|
647
652
|
|
|
648
653
|
/**
|
|
649
|
-
* A service that
|
|
654
|
+
* A service that keeps in sync Router navigation and navigation messages.
|
|
650
655
|
*
|
|
651
|
-
*
|
|
652
|
-
*
|
|
656
|
+
* - listens to Router events and sends navigation messages
|
|
657
|
+
* - handles incoming navigation messages and triggers Router navigation
|
|
653
658
|
*/
|
|
654
659
|
class RoutingService {
|
|
655
660
|
constructor() {
|
|
@@ -661,8 +666,30 @@ class RoutingService {
|
|
|
661
666
|
* @inheritdoc
|
|
662
667
|
*/
|
|
663
668
|
this.types = NAVIGATION_MESSAGE_TYPE;
|
|
669
|
+
/**
|
|
670
|
+
* @inheritdoc
|
|
671
|
+
*/
|
|
672
|
+
this.type = 'navigation';
|
|
673
|
+
/**
|
|
674
|
+
* Use the message payload to navigate to the specified URL.
|
|
675
|
+
* @param message message to consume
|
|
676
|
+
*/
|
|
677
|
+
this.supportedVersions = {
|
|
678
|
+
'1.0': async (message) => {
|
|
679
|
+
await this.router.navigateByUrl(message.payload.url);
|
|
680
|
+
}
|
|
681
|
+
};
|
|
664
682
|
registerProducer(this);
|
|
683
|
+
registerConsumer(this);
|
|
665
684
|
}
|
|
685
|
+
/**
|
|
686
|
+
* @inheritdoc
|
|
687
|
+
*/
|
|
688
|
+
start() { }
|
|
689
|
+
/**
|
|
690
|
+
* @inheritdoc
|
|
691
|
+
*/
|
|
692
|
+
stop() { }
|
|
666
693
|
/**
|
|
667
694
|
* @inheritdoc
|
|
668
695
|
*/
|
|
@@ -706,10 +733,10 @@ class RoutingService {
|
|
|
706
733
|
}
|
|
707
734
|
});
|
|
708
735
|
}
|
|
709
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
710
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
736
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RoutingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
737
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RoutingService, providedIn: 'root' }); }
|
|
711
738
|
}
|
|
712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
739
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RoutingService, decorators: [{
|
|
713
740
|
type: Injectable,
|
|
714
741
|
args: [{
|
|
715
742
|
providedIn: 'root'
|
|
@@ -756,10 +783,10 @@ class RestoreRoute {
|
|
|
756
783
|
return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);
|
|
757
784
|
}
|
|
758
785
|
}
|
|
759
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
760
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
786
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RestoreRoute, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
787
|
+
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.13", ngImport: i0, type: RestoreRoute, isStandalone: true, name: "restoreRoute" }); }
|
|
761
788
|
}
|
|
762
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
789
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: RestoreRoute, decorators: [{
|
|
763
790
|
type: Pipe,
|
|
764
791
|
args: [{
|
|
765
792
|
name: 'restoreRoute'
|
|
@@ -914,10 +941,10 @@ class ThemeProducerService {
|
|
|
914
941
|
this.logger.error('Error in theme service message', message);
|
|
915
942
|
this.revertToPreviousTheme();
|
|
916
943
|
}
|
|
917
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
918
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
944
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeProducerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
945
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeProducerService, providedIn: 'root' }); }
|
|
919
946
|
}
|
|
920
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
947
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeProducerService, decorators: [{
|
|
921
948
|
type: Injectable,
|
|
922
949
|
args: [{
|
|
923
950
|
providedIn: 'root'
|
|
@@ -950,10 +977,10 @@ class ApplyTheme {
|
|
|
950
977
|
}
|
|
951
978
|
return undefined;
|
|
952
979
|
}
|
|
953
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
954
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
980
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ApplyTheme, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
981
|
+
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.13", ngImport: i0, type: ApplyTheme, isStandalone: true, name: "applyTheme" }); }
|
|
955
982
|
}
|
|
956
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
983
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ApplyTheme, decorators: [{
|
|
957
984
|
type: Pipe,
|
|
958
985
|
args: [{
|
|
959
986
|
name: 'applyTheme'
|
|
@@ -1009,10 +1036,10 @@ class ThemeConsumerService {
|
|
|
1009
1036
|
stop() {
|
|
1010
1037
|
this.consumerManagerService.unregister(this);
|
|
1011
1038
|
}
|
|
1012
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
1013
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
1039
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeConsumerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1040
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeConsumerService, providedIn: 'root' }); }
|
|
1014
1041
|
}
|
|
1015
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1042
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ThemeConsumerService, decorators: [{
|
|
1016
1043
|
type: Injectable,
|
|
1017
1044
|
args: [{
|
|
1018
1045
|
providedIn: 'root'
|
|
@@ -1065,10 +1092,10 @@ class ConnectDirective {
|
|
|
1065
1092
|
// When the directive is destroyed clean up the connection too.
|
|
1066
1093
|
inject(DestroyRef).onDestroy(() => this.messageService.disconnect());
|
|
1067
1094
|
}
|
|
1068
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
1069
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.
|
|
1095
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ConnectDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1096
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.13", type: ConnectDirective, isStandalone: true, selector: "iframe[connect]", inputs: { connect: { classPropertyName: "connect", publicName: "connect", isSignal: true, isRequired: true, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "src": "this.srcAttr" } }, ngImport: i0 }); }
|
|
1070
1097
|
}
|
|
1071
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1098
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ConnectDirective, decorators: [{
|
|
1072
1099
|
type: Directive,
|
|
1073
1100
|
args: [{
|
|
1074
1101
|
selector: 'iframe[connect]',
|
|
@@ -1079,6 +1106,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImpo
|
|
|
1079
1106
|
args: ['src']
|
|
1080
1107
|
}] } });
|
|
1081
1108
|
|
|
1109
|
+
/**
|
|
1110
|
+
* No operation function used to override the history API methods.
|
|
1111
|
+
*/
|
|
1112
|
+
function noop() { }
|
|
1113
|
+
/**
|
|
1114
|
+
* If an iframe is not sandboxed or is of the same origin, navigation inside it will mess up the main window history.
|
|
1115
|
+
* This disables writing to and overriding history API from inside the iframe to prevent this.
|
|
1116
|
+
* Theoretically, this might break applications that rely on reading history API from inside the iframe.
|
|
1117
|
+
*
|
|
1118
|
+
* This should also allow having `CustomPathLocationStrategy` in the iframe if necessary.
|
|
1119
|
+
*/
|
|
1120
|
+
function provideDisableHistoryWrites() {
|
|
1121
|
+
return provideAppInitializer(() => {
|
|
1122
|
+
Object.defineProperty(history, 'pushState', { value: noop, writable: false, configurable: false });
|
|
1123
|
+
Object.defineProperty(history, 'replaceState', { value: noop, writable: false, configurable: false });
|
|
1124
|
+
});
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1082
1127
|
/**
|
|
1083
1128
|
* Provide the communication protocol connection configuration
|
|
1084
1129
|
* @param connectionConfigOptions The identifier of the application in the communication protocol ecosystem plus the types of messages able to exchange and a logger object
|
|
@@ -1105,7 +1150,9 @@ function provideConnection(connectionConfigOptions) {
|
|
|
1105
1150
|
{
|
|
1106
1151
|
// in the case of the ConnectionService will extend the base service 'useExisting' should be used
|
|
1107
1152
|
provide: MessagePeerService, useClass: MessagePeerService, deps: [MESSAGE_PEER_CONFIG]
|
|
1108
|
-
}
|
|
1153
|
+
},
|
|
1154
|
+
// deactivate history writes to avoid embedded app writing to the host history
|
|
1155
|
+
...isEmbedded() ? [provideDisableHistoryWrites()] : []
|
|
1109
1156
|
]);
|
|
1110
1157
|
}
|
|
1111
1158
|
|
|
@@ -1113,5 +1160,5 @@ function provideConnection(connectionConfigOptions) {
|
|
|
1113
1160
|
* Generated bundle index. Do not edit.
|
|
1114
1161
|
*/
|
|
1115
1162
|
|
|
1116
|
-
export { ApplyTheme, ConnectDirective, ConsumerManagerService,
|
|
1163
|
+
export { ApplyTheme, ConnectDirective, ConsumerManagerService, ERROR_MESSAGE_TYPE, HostInfoPipe, KNOWN_MESSAGES, MFE_HOST_APPLICATION_ID_PARAM, MFE_HOST_URL_PARAM, MFE_MODULE_APPLICATION_ID_PARAM, NavigationConsumerService, ProducerManagerService, ResizeConsumerService, ResizeService, RestoreRoute, RouteMemorizeDirective, RouteMemorizeService, RoutingService, ScalableDirective, THEME_QUERY_PARAM_NAME, THEME_URL_SUFFIX, ThemeConsumerService, ThemeProducerService, applyInitialTheme, applyTheme, downloadApplicationThemeCss, getAvailableConsumers, getDefaultClientEndpointStartOptions, getHostInfo, getStyle, hostQueryParams, isEmbedded, isErrorMessage, persistHostInfo, provideConnection, registerConsumer, registerProducer, sendError };
|
|
1117
1164
|
//# sourceMappingURL=ama-mfe-ng-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ama-mfe-ng-utils.mjs","sources":["../../src/messages/available.sender.ts","../../src/messages/error.sender.ts","../../src/managers/producer.manager.service.ts","../../src/managers/consumer.manager.service.ts","../../src/managers/utils.ts","../../src/messages/error/base.ts","../../src/resize/resize.consumer.service.ts","../../src/resize/resize.producer.service.ts","../../src/resize/resize.directive.ts","../../src/host-info/host-info.ts","../../src/host-info/host-info.pipe.ts","../../src/navigation/navigation.consumer.service.ts","../../src/navigation/route-memorize/route-memorize.service.ts","../../src/navigation/route-memorize/route-memorize.directive.ts","../../src/utils.ts","../../src/navigation/navigation.producer.service.ts","../../src/navigation/restore-route.pipe.ts","../../src/theme/theme.helpers.ts","../../src/theme/theme.producer.service.ts","../../src/theme/apply-theme.pipe.ts","../../src/theme/theme.consumer.service.ts","../../src/connect/connect.directive.ts","../../src/connect/connect.providers.ts","../../src/ama-mfe-ng-utils.ts"],"sourcesContent":["import type {\n DeclareMessages,\n} from '@amadeus-it-group/microfrontends';\nimport type {\n BasicMessageConsumer,\n} from '../managers/interfaces';\n\n/**\n * Gets the available consumers and formats them into a {@see DeclareMessages} object.\n * @param consumers - The list of registered message consumers.\n * @returns The formatted DeclareMessages object.\n */\nexport const getAvailableConsumers = (consumers: BasicMessageConsumer[]) => {\n return {\n type: 'declare_messages',\n version: '1.0',\n messages: consumers.flatMap(({ type, supportedVersions }) => Object.keys(supportedVersions).map((version) => ({ type, version })))\n } satisfies DeclareMessages;\n};\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport type {\n MessagePeerServiceType,\n} from '@amadeus-it-group/microfrontends-angular';\nimport type {\n ERROR_MESSAGE_TYPE,\n ErrorContent,\n ErrorMessageV1_0,\n} from './error/index';\n\n/**\n * Helper function to send an error message by the given endpoint (peer)\n * @param peer The endpoint sending the message\n * @param content the content of the error message to be sent\n */\nexport const sendError = (peer: MessagePeerServiceType<any>, content: ErrorContent) => {\n return peer.send({\n type: 'error',\n version: '1.0',\n ...content\n } satisfies ErrorMessageV1_0);\n};\n\n/**\n * Check if the given message is of type error and the error reson is present too\n * @param message the message to be checked\n */\n// eslint-disable-next-line @stylistic/max-len -- constant definition\nexport const isErrorMessage = (message: any): message is VersionedMessage & { type: typeof ERROR_MESSAGE_TYPE } & ErrorContent => (message && typeof message === 'object' && message.type === 'error' && !!message.reason);\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n Injectable,\n} from '@angular/core';\nimport type {\n ErrorContent,\n} from '../messages/index';\nimport type {\n MessageProducer,\n} from './interfaces';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ProducerManagerService {\n private readonly registeredProducers = new Set<MessageProducer>();\n\n /** Get the list of registered producers of messages. The list will contain unique elements */\n public get producers() {\n return [...this.registeredProducers];\n }\n\n /**\n * Register a producer of a message\n * @param producer The instance of the message producer\n */\n public register(producer: MessageProducer) {\n this.registeredProducers.add((producer));\n }\n\n /**\n * Unregister a producer of a message\n * @param producer The instance of the message producer\n */\n public unregister(producer: MessageProducer) {\n this.registeredProducers.delete((producer));\n }\n\n /**\n * Handles the received error message for the given message type by invoking the appropriate producer handlers.\n * @template T - The type of the message, extending from Message.\n * @param message - The error message to handle.\n * @returns - A promise that resolves to true if the error was handled by at least one handler, false otherwise.\n */\n public async dispatchError<T extends VersionedMessage = VersionedMessage>(message: ErrorContent<T>) {\n const handlers = this.producers\n .filter(({ types }) => (Array.isArray(types) ? types : [types]).includes(message.source.type));\n\n const handlersPresent = handlers.length > 0;\n if (handlersPresent) {\n await Promise.all(\n handlers.map((handler) => handler.handleError(message))\n );\n }\n return handlersPresent;\n }\n}\n","import {\n RoutedMessage,\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n getAvailableConsumers,\n} from '../messages/available.sender';\nimport {\n isErrorMessage,\n sendError,\n} from '../messages/error.sender';\nimport type {\n BasicMessageConsumer,\n} from './interfaces';\nimport {\n ProducerManagerService,\n} from './producer.manager.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConsumerManagerService {\n private readonly messageService = inject(MessagePeerService);\n private readonly producerManagerService = inject(ProducerManagerService);\n private readonly registeredConsumers = signal<BasicMessageConsumer[]>([]);\n private readonly logger = inject(LoggerService);\n\n /** The list of registered consumers */\n public readonly consumers = this.registeredConsumers.asReadonly();\n\n constructor() {\n this.messageService.messages$.pipe(takeUntilDestroyed()).subscribe((message) => this.consumeMessage(message));\n\n // Each time a consumer is registered/unregistered update the list of registered messages\n effect(() => {\n const declareMessages = getAvailableConsumers(this.consumers());\n\n // registering consumed messages locally for validation\n for (const message of declareMessages.messages) {\n this.messageService.registerMessage(message);\n }\n });\n }\n\n /**\n * Consume a received message\n * @param message the received message body\n */\n private async consumeMessage(message: RoutedMessage<VersionedMessage>) {\n if (isErrorMessage(message.payload)) {\n const isHandled = await this.producerManagerService.dispatchError(message.payload);\n if (!isHandled) {\n this.logger.warn('Error message not handled', message);\n }\n return;\n }\n\n return this.consumeAdditionalMessage(message);\n }\n\n /**\n * Call the registered message callback(s) to consume the given message\n * Handle error messages of internal communication protocol messages\n * @param message message to consume\n */\n private async consumeAdditionalMessage(message: RoutedMessage<VersionedMessage>) {\n if (!message.payload) {\n this.logger.warn('Cannot consume a messages with undefined payload.');\n return;\n }\n\n const consumers = this.consumers();\n const typeMatchingConsumers = consumers\n .filter((consumer) => consumer.type === message.payload.type);\n\n if (typeMatchingConsumers.length === 0) {\n this.logger.warn(`No consumer found for message type: ${message.payload.type}`);\n return sendError(this.messageService, { reason: 'unknown_type', source: message.payload });\n }\n\n const versionMatchingConsumers = typeMatchingConsumers\n .filter((consumer) => consumer.supportedVersions[message.payload.version])\n .flat();\n\n if (versionMatchingConsumers.length === 0) {\n this.logger.warn(`No consumer found for message version: ${message.payload.version}`);\n return sendError(this.messageService, { reason: 'version_mismatch', source: message.payload });\n }\n\n await Promise.all(\n versionMatchingConsumers\n .map(async (consumer) => {\n try {\n await consumer.supportedVersions[message.payload.version](message);\n } catch (error) {\n this.logger.error('Error while consuming message', error);\n sendError(this.messageService, { reason: 'internal_error', source: message.payload });\n }\n })\n );\n }\n\n /**\n * Register a message consumer\n * @param consumer an instance of message consumer\n */\n public register(consumer: BasicMessageConsumer) {\n this.registeredConsumers.update((consumers) => {\n return [...new Set(consumers).add(consumer)];\n });\n }\n\n /**\n * Unregister a message consumer\n * @param consumer an instance of message consumer\n */\n public unregister(consumer: BasicMessageConsumer) {\n this.registeredConsumers.update((consumers) => {\n return consumers.filter((c) => c !== consumer);\n });\n }\n}\n","import {\n DestroyRef,\n inject,\n} from '@angular/core';\nimport type {\n MessageProducer,\n} from './interfaces';\nimport {\n ProducerManagerService,\n} from './producer.manager.service';\n\n/**\n * Method to call in the constructor of a producer\n * @note should be used in injection context\n * @param producer\n */\nexport const registerProducer = (producer: MessageProducer) => {\n const producerManagerService = inject(ProducerManagerService);\n producerManagerService.register(producer);\n\n inject(DestroyRef).onDestroy(() => {\n producerManagerService.unregister(producer);\n });\n};\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\n\n/** the error message type */\nexport const ERROR_MESSAGE_TYPE = 'error';\n\n/**\n * The possible reasons for an error.\n */\nexport type ErrorReason = 'unknown_type' | 'version_mismatch' | 'internal_error';\n\n/**\n * The content of an error message.\n * @template S - The type of the source message.\n */\nexport interface ErrorContent<S extends VersionedMessage = VersionedMessage> {\n /** The reason for the error */\n reason: ErrorReason;\n /** The source message that caused the error */\n source: S;\n}\n","import type {\n ResizeMessage,\n ResizeV1_0,\n} from '@ama-mfe/messages';\nimport {\n RESIZE_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n ConsumerManagerService,\n MessageConsumer,\n} from '../managers/index';\n\n/**\n * This service listens for resize messages and updates the height of elements based on the received messages.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ResizeConsumerService implements MessageConsumer<ResizeMessage> {\n private readonly newHeight = signal<{ height: number; channelId: string } | undefined>(undefined);\n\n /**\n * A readonly signal that provides the new height information from the channel.\n */\n public readonly newHeightFromChannel = this.newHeight.asReadonly();\n\n /**\n * The type of messages this service handles ('resize').\n */\n public readonly type = RESIZE_MESSAGE_TYPE;\n\n /**\n * The supported versions of resize messages and their handlers.\n */\n public supportedVersions = {\n /**\n * Use the message paylod to compute a new height and emit it via the public signal\n * @param message message to consume\n */\n '1.0': (message: RoutedMessage<ResizeV1_0>) => this.newHeight.set({ height: message.payload.height, channelId: message.from })\n };\n\n private readonly consumerManagerService = inject(ConsumerManagerService);\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Starts the resize handler service by registering it into the consumer manager service.\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * Stops the resize handler service by unregistering it from the consumer manager service.\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import type {\n ResizeMessage,\n ResizeV1_0,\n} from '@ama-mfe/messages';\nimport {\n RESIZE_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n afterNextRender,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n type MessageProducer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/index';\n\n/**\n * `scrollHeight` is a rounded number (cf https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight)\n *\n * So we have to add a delta to ensure no scrollbar will appear on the host,\n * in case the `scrollHeight` is rounded down\n */\nexport const DELTA_RESIZE = 1;\n\n/**\n * This service observe changes in the document's body height.\n * When the height changes, it sends a resize message with the new height, to the connected peers\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ResizeService implements MessageProducer<ResizeMessage> {\n private actualHeight?: number;\n private readonly messageService = inject(MessagePeerService<ResizeMessage>);\n private resizeObserver?: ResizeObserver;\n\n /**\n * @inheritdoc\n */\n public readonly types = RESIZE_MESSAGE_TYPE;\n\n constructor() {\n registerProducer(this);\n }\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<ResizeMessage>): void {\n // eslint-disable-next-line no-console -- error handling placeholder\n console.error('Error in resize service message', message);\n }\n\n /**\n * This method sets up a `ResizeObserver` to observe changes in the document's body height.\n * When the height changes, it sends a resize message with the new height, to the connected peers\n */\n public startResizeObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n if (!this.actualHeight || Math.abs(document.body.scrollHeight - this.actualHeight) > DELTA_RESIZE) {\n this.actualHeight = document.body.scrollHeight;\n const messageV10 = {\n type: 'resize',\n version: '1.0',\n height: document.body.scrollHeight + DELTA_RESIZE\n } satisfies ResizeV1_0;\n // TODO: sendBest() is not implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n this.messageService.send(messageV10);\n }\n });\n\n afterNextRender(() => this.resizeObserver?.observe(document.body));\n }\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2,\n} from '@angular/core';\nimport {\n ResizeConsumerService,\n} from './resize.consumer.service';\n\n/**\n * A directive that adjusts the height of an element based on resize messages from a specified channel.\n */\n@Directive({\n selector: '[scalable]',\n standalone: true\n})\nexport class ScalableDirective {\n /**\n * The connection ID for the element, used as channel id backup\n */\n public connect = input<string>();\n\n /**\n * The channel id\n */\n public scalable = input<string>();\n\n private readonly resizeHandler = inject(ResizeConsumerService);\n\n /**\n * This signal checks if the current channel requesting the resize matches the channel ID from the resize handler.\n * If they match, it returns the new height information; otherwise, it returns undefined.\n */\n private readonly newHeightFromChannel = computed(() => {\n const channelAskingResize = this.scalable() || this.connect();\n const newHeightFromChannel = this.resizeHandler.newHeightFromChannel();\n if (channelAskingResize && newHeightFromChannel?.channelId === channelAskingResize) {\n return newHeightFromChannel;\n }\n return undefined;\n });\n\n constructor() {\n const elem = inject(ElementRef);\n const renderer = inject(Renderer2);\n\n this.resizeHandler.start();\n\n /** When a new height value is received set the height of the host element (in pixels) */\n effect(() => {\n const newHeightFromChannel = this.newHeightFromChannel();\n if (newHeightFromChannel) {\n renderer.setStyle(elem.nativeElement, 'height', `${newHeightFromChannel.height}px`);\n }\n });\n }\n}\n","const SESSION_STORAGE_KEY = 'ama-mfe-host-info';\n\n/**\n * Search parameter to add to the URL when embedding an iframe containing the URL of the host.\n * This is needed to support Firefox (on which {@link https://developer.mozilla.org/docs/Web/API/Location/ancestorOrigins | location.ancestorOrigins} is not currently supported)\n * in case of redirection inside the iframe.\n */\nexport const MFE_HOST_URL_PARAM = 'ama-mfe-host-url';\n\n/**\n * Search parameter to add to the URL to let a module know on which application it's embedded\n */\nexport const MFE_HOST_APPLICATION_ID_PARAM = 'ama-mfe-host-app-id';\n\n/**\n * Search parameter to add to the URL to identify the application in the network of peers in the communication protocol\n */\nexport const MFE_MODULE_APPLICATION_ID_PARAM = 'ama-mfe-module-app-id';\n\n/** The list of query parameters which can be set by the host */\nexport const hostQueryParams = [MFE_HOST_URL_PARAM, MFE_HOST_APPLICATION_ID_PARAM, MFE_MODULE_APPLICATION_ID_PARAM];\n\n/**\n * Information set up at host level to use in embedded context\n */\nexport interface MFEHostInformation {\n /**\n * URL of the host application\n */\n hostURL?: string;\n /**\n * ID of the host application\n */\n hostApplicationId?: string;\n\n /**\n * ID of the module to embed defined at host level\n */\n moduleApplicationId?: string;\n}\n\n/**\n * Gather the host information from the url parameters\n * The host url will use the first found among:\n * - look for the search parameter {@link MFE_HOST_URL_PARAM} in the URL of the iframe\n * - use the first item in `location.ancestorOrigins` (currently not supported on Firefox)\n * - use `document.referrer` (will only work if called before any redirection in the iframe)\n * The host application ID is taken from the search parameter {@link MFE_HOST_APPLICATION_ID_PARAM} in the URL of the iframe\n * The module application ID is taken from the search parameter {@link MFE_APPLICATION_ID_PARAM} in the URL of the iframe\n */\nexport function getHostInfo(): MFEHostInformation {\n const searchParams = new URLSearchParams(location.search);\n const storedHostInfo = JSON.parse(sessionStorage.getItem(SESSION_STORAGE_KEY) || '{}') as MFEHostInformation;\n return {\n hostURL: searchParams.get(MFE_HOST_URL_PARAM) || storedHostInfo.hostURL || location.ancestorOrigins?.[0] || document.referrer,\n hostApplicationId: searchParams.get(MFE_HOST_APPLICATION_ID_PARAM) || storedHostInfo.hostApplicationId,\n moduleApplicationId: searchParams.get(MFE_MODULE_APPLICATION_ID_PARAM) || storedHostInfo.moduleApplicationId\n };\n}\n\n/**\n * Gather the host information from the url parameters and handle the persistence in session storage.\n */\nexport function persistHostInfo() {\n const hostInfo = getHostInfo();\n sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(hostInfo));\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n MFE_HOST_APPLICATION_ID_PARAM,\n MFE_HOST_URL_PARAM,\n MFE_MODULE_APPLICATION_ID_PARAM,\n} from './host-info';\n\n/**\n * A pipe that adds the host information in the URL of an iframe,\n */\n@Pipe({\n name: 'hostInfo'\n})\nexport class HostInfoPipe implements PipeTransform {\n private readonly domSanitizer = inject(DomSanitizer);\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending query parameters.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @param options - hostId and moduleId\n * @returns - The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string, options: { hostId: string; moduleId?: string }): string;\n public transform(url: SafeResourceUrl, options: { hostId: string; moduleId?: string }): SafeResourceUrl;\n public transform(url: undefined, options: { hostId: string; moduleId?: string }): undefined;\n public transform(url: string | SafeResourceUrl | undefined, options: { hostId: string; moduleId?: string }): string | SafeResourceUrl | undefined {\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url || null);\n\n if (!url) {\n return undefined;\n }\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n moduleUrl.searchParams.set(MFE_HOST_URL_PARAM, window.location.origin);\n moduleUrl.searchParams.set(MFE_HOST_APPLICATION_ID_PARAM, options.hostId);\n if (options.moduleId) {\n moduleUrl.searchParams.set(MFE_MODULE_APPLICATION_ID_PARAM, options.moduleId);\n }\n\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n }\n}\n","import {\n NAVIGATION_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n NavigationMessage,\n NavigationV1_0,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n Router,\n} from '@angular/router';\nimport {\n Subject,\n} from 'rxjs';\nimport {\n hostQueryParams,\n} from '../host-info';\nimport {\n ConsumerManagerService,\n type MessageConsumer,\n} from '../managers/index';\n\n/**\n * A service that handles navigation messages and routing.\n *\n * This service listens for navigation messages and updates the router state accordingly.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NavigationConsumerService implements MessageConsumer<NavigationMessage> {\n private readonly router = inject(Router);\n private readonly activeRoute = inject(ActivatedRoute);\n private readonly requestedUrl = new Subject<{ url: string; channelId?: string }>();\n\n /**\n * An observable that emits the requested URL and optional channel ID.\n */\n public readonly requestedUrl$ = this.requestedUrl.asObservable();\n\n /**\n * The type of messages this service handles.\n */\n public readonly type = NAVIGATION_MESSAGE_TYPE;\n\n /**\n * @inheritdoc\n */\n public readonly supportedVersions = {\n /**\n * Use the message paylod to compute a new url and emit it via the public subject\n * Additionally navigate to the new url\n * @param message message to consume\n */\n '1.0': (message: RoutedMessage<NavigationV1_0>) => {\n const channelId = message.from || undefined;\n this.requestedUrl.next({ url: message.payload.url, channelId });\n this.navigate(message.payload.url, channelId);\n }\n };\n\n private readonly consumerManagerService = inject(ConsumerManagerService);\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Parses a URL and returns an object containing the paths and query parameters.\n * @param url - The URL to parse.\n * @returns An object containing the paths and query parameters.\n */\n private parseUrl(url: string): { paths: string[]; queryParams: { [key: string]: string } } {\n const urlObject = new URL(window.origin + url);\n const paths = urlObject.pathname.split('/').filter((segment) => !!segment);\n const queryParams = Object.fromEntries(urlObject.searchParams.entries());\n return { paths, queryParams };\n }\n\n /**\n * Navigates to the specified URL with optional channel ID.\n * @param url - The URL to navigate to.\n * @param channelId - The optional channel ID for the navigation state. This is the endpoint from where the message is received\n */\n private navigate(url: string, channelId?: string) {\n const { paths, queryParams } = this.parseUrl(url);\n // No need to keep these in the URL\n hostQueryParams.forEach((key) => delete queryParams[key]);\n void this.router.navigate(paths, { relativeTo: this.activeRoute.children.at(-1), queryParams, state: { channelId }, replaceUrl: true });\n }\n\n /**\n * @inheritdoc\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * @inheritdoc\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import {\n Injectable,\n} from '@angular/core';\n\n/**\n * This service allows routes to be memorized with an optional lifetime and provides methods to retrieve and manage these routes.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RouteMemorizeService {\n private readonly routeTimers: { [x: string]: ReturnType<typeof setTimeout> } = {};\n /** All memorized routes */\n public readonly routeStack: { [x: string]: string } = {};\n\n /**\n * Memorizes a route for a given channel ID with an optional lifetime.\n * @param channelId - The ID of the channel to memorize the route for.\n * @param url - The URL of the route to memorize.\n * @param liveTime - The optional lifetime of the memorized route in milliseconds. If provided, the route will be removed after this time.\n */\n public memorizeRoute(channelId: string, url: string, liveTime?: number): void {\n this.routeStack[channelId] = url;\n\n const timerRef = this.routeTimers[channelId];\n if (timerRef) {\n clearTimeout(timerRef);\n }\n if (liveTime && liveTime > 0) {\n this.routeTimers[channelId] = setTimeout(() => {\n delete this.routeStack[channelId];\n delete this.routeTimers[channelId];\n }, liveTime);\n }\n }\n\n /**\n * Retrieves the memorized route for a given channel ID.\n * @param channelId - The ID of the channel to retrieve the memorized route for.\n * @returns The memorized route URL or undefined if no route is memorized for the given channel ID.\n */\n public getRoute(channelId: string): string | undefined {\n return this.routeStack[channelId];\n }\n}\n","import {\n computed,\n Directive,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport {\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport {\n NavigationConsumerService,\n} from '../navigation.consumer.service';\nimport {\n RouteMemorizeService,\n} from './route-memorize.service';\n\n@Directive({\n selector: 'iframe[memorizeRoute]',\n standalone: true\n})\nexport class RouteMemorizeDirective {\n /**\n * Whether to memorize the route.\n * Default is true.\n */\n public memorizeRoute = input<boolean | undefined | ''>(true);\n\n /**\n * The ID used to memorize the route.\n */\n public memorizeRouteId = input<string>();\n\n /**\n * The maximum age for memorizing the route.\n * Default is 0.\n */\n public memorizeMaxAge = input<number>(0);\n\n /**\n * The maximum age for memorizing the route, used as a fallback.\n * Default is 0.\n */\n public memorizeRouteMaxAge = input<number>(0);\n\n /**\n * The connection ID for the iframe where the actual directive is applied.\n */\n public connect = input<string>();\n\n private readonly maxAge = computed(() => {\n return this.memorizeMaxAge() || this.memorizeRouteMaxAge();\n });\n\n constructor() {\n const memory = inject(RouteMemorizeService);\n const requestedUrlSignal = toSignal(inject(NavigationConsumerService).requestedUrl$);\n\n /**\n * This effect listens for changes in the `memorizeRoute`, `requestedUrlSignal`, and `memorizeRouteId` or `connect` inputs.\n * If `memorizeRoute` is not false and a requested URL with a matching channel ID is found, it memorizes the route using the route memory service.\n */\n effect(() => {\n const memorizeRoute = this.memorizeRoute();\n if (memorizeRoute === false) {\n return;\n }\n const requested = requestedUrlSignal();\n const id = this.memorizeRouteId() || this.connect();\n if (requested && id && requested.channelId === id) {\n memory.memorizeRoute(id, requested.url, untracked(this.maxAge));\n }\n });\n }\n}\n","import type {\n Message,\n PeerConnectionOptions,\n} from '@amadeus-it-group/microfrontends';\nimport {\n getHostInfo,\n} from './host-info';\nimport {\n ERROR_MESSAGE_TYPE,\n} from './messages';\n\n/**\n * A constant array of known message types and their versions.\n */\nexport const KNOWN_MESSAGES = [\n {\n type: ERROR_MESSAGE_TYPE,\n version: '1.0'\n }\n] as const satisfies Message[];\n\n/**\n * Returns the default options for starting a client endpoint peer connection.\n * As `origin`, it will take the hostURL from {@link getHostInfo} and the `window` will be the parent window.\n */\nexport function getDefaultClientEndpointStartOptions(): PeerConnectionOptions {\n const hostInfo = getHostInfo();\n if (hostInfo.hostURL) {\n return {\n origin: new URL(hostInfo.hostURL).origin,\n window: window.parent\n };\n }\n return {};\n}\n\n/**\n * Return `true` if embedded inside an iframe, `false` otherwise\n */\nexport function isEmbedded() {\n return window.top !== window.self;\n}\n","import type {\n NavigationMessage,\n NavigationV1_0,\n} from '@ama-mfe/messages';\nimport {\n NAVIGATION_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n} from '@angular/router';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n filter,\n map,\n} from 'rxjs';\nimport {\n type MessageProducer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/error';\nimport {\n isEmbedded,\n} from '../utils';\n\n/** Options for the routing handling in case of navigation producer message */\nexport interface RoutingServiceOptions {\n /**\n * Whether to handle only sub-routes.\n * If true, the routing service will handle only sub-routes.\n * Default is false.\n */\n subRouteOnly?: boolean;\n}\n\n/**\n * A service that handles routing and message production for navigation events.\n *\n * This service listens to Angular router events and sends navigation messages\n * to a message peer service. It also handles errors related to navigation messages.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RoutingService implements MessageProducer<NavigationMessage> {\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly messageService = inject(MessagePeerService<NavigationMessage>);\n private readonly logger = inject(LoggerService);\n\n /**\n * @inheritdoc\n */\n public readonly types = NAVIGATION_MESSAGE_TYPE;\n\n constructor() {\n registerProducer(this);\n }\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<NavigationV1_0>): void {\n this.logger.error('Error in navigation service message', message);\n }\n\n /**\n * Handles embedded routing by listening to router events and sending navigation messages to the connected endpoints.\n * It can be a parent window or another iframe\n * @note - This method has to be called in an injection context\n * @param options - Optional parameters to control the routing behavior {@see RoutingServiceOptions}.\n */\n public handleEmbeddedRouting(options?: RoutingServiceOptions): void {\n const subRouteOnly = options?.subRouteOnly ?? false;\n this.router.events.pipe(\n takeUntilDestroyed(),\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(({ urlAfterRedirects }) => {\n const channelId = this.router.getCurrentNavigation()?.extras?.state?.channelId;\n const currentRouteRegExp = subRouteOnly && this.activatedRoute.routeConfig?.path && new RegExp('^' + this.activatedRoute.routeConfig.path.replace(/(?=\\W)/g, '\\\\'), 'i');\n return ({ url: currentRouteRegExp ? urlAfterRedirects.replace(currentRouteRegExp, '') : urlAfterRedirects, channelId });\n })\n ).subscribe(({ url, channelId }) => {\n const messageV10 = {\n type: 'navigation',\n version: '1.0',\n url\n } satisfies NavigationV1_0;\n // TODO: sendBest() is not implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n if (isEmbedded()) {\n this.messageService.send(messageV10);\n } else {\n if (channelId === undefined) {\n this.logger.warn('No channelId provided for navigation message');\n } else {\n try {\n this.messageService.send(messageV10, { to: [channelId] });\n } catch (error) {\n this.logger.error('Error sending navigation message', error);\n }\n }\n }\n });\n }\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n ActivatedRoute,\n} from '@angular/router';\nimport {\n RouteMemorizeService,\n} from './route-memorize/route-memorize.service';\n\n/**\n * Options for restoring a route with optional query parameters and memory channel ID.\n */\nexport interface RestoreRouteOptions {\n /**\n * Whether to propagate query parameters from the top window to the module URL.\n */\n propagateQueryParams?: boolean;\n\n /**\n * Whether to override existing query parameters in the module URL with those from the top window.\n */\n overrideQueryParams?: boolean;\n\n /**\n * The memory channel ID used to retrieve the memorized route.\n * If provided, the memorized route associated with this ID will be used.\n */\n memoryChannelId?: string;\n}\n\n/**\n * A pipe that restores a route with optional query parameters and memory channel ID.\n *\n * This pipe is used to transform a URL or SafeResourceUrl by appending query parameters\n * and adjusting the pathname based on the current active route and memorized route.\n */\n@Pipe({\n name: 'restoreRoute'\n})\nexport class RestoreRoute implements PipeTransform {\n private readonly activeRoute = inject(ActivatedRoute);\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly routeMemorizeService = inject(RouteMemorizeService, { optional: true });\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending query parameters and adjusting the pathname.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @param options - Optional parameters to control the transformation. {@see RestoreRouteOptions}\n * @returns - The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string, options?: Partial<RestoreRouteOptions>): string;\n public transform(url: SafeResourceUrl, options?: Partial<RestoreRouteOptions>): SafeResourceUrl;\n public transform(url: undefined, options?: Partial<RestoreRouteOptions>): undefined;\n public transform(url: string | SafeResourceUrl | undefined, options?: Partial<RestoreRouteOptions>): string | SafeResourceUrl | undefined {\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url || null);\n\n if (!url) {\n return undefined;\n }\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n const queryParamsModule = new URLSearchParams(moduleUrl.searchParams);\n\n const channelId = options?.memoryChannelId;\n const memorizedRoute = channelId && this.routeMemorizeService?.getRoute(channelId);\n const topWindowUrl = new URL(memorizedRoute ? window.origin + memorizedRoute : window.location.href);\n const queryParamsTopWindow = new URLSearchParams(topWindowUrl.search);\n\n if (options?.propagateQueryParams) {\n for (const [key, value] of queryParamsTopWindow) {\n if (options?.overrideQueryParams || !queryParamsModule.has(key)) {\n queryParamsModule.set(key, value);\n }\n }\n }\n moduleUrl.search = queryParamsModule.toString();\n moduleUrl.pathname += topWindowUrl.pathname.split(`/${this.activeRoute.routeConfig?.path}`).pop() || '';\n moduleUrl.pathname = moduleUrl.pathname.replace(/\\/{2,}/g, '/');\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n }\n}\n","import {\n type Logger,\n} from '@o3r/logger';\nimport {\n getHostInfo,\n} from '../host-info';\n\n/** Default suffix for an url containing a theme css file */\nexport const THEME_URL_SUFFIX = '-theme.css';\n/** Default name for the query parameter containing the theme name */\nexport const THEME_QUERY_PARAM_NAME = 'theme';\n\n/** Options and context for Style helpers */\nexport interface StyleHelperOptions {\n /**\n * Logger to reporter the logs\n */\n logger?: Logger;\n}\n\n/**\n * Fetches a CSS document and returns the content as a string.\n * @param cssPath - The path to download the CSS.\n * @param options Options and context for Style helpers\n * @returns The content of the CSS document as a string, empty string if the fetch fails.\n */\nexport async function getStyle(cssPath: string, options?: StyleHelperOptions): Promise<string> {\n try {\n const myRequest = new Request(cssPath);\n const response = await fetch(myRequest);\n const cssText = response.ok ? await response.text() : '';\n return cssText;\n } catch (error) {\n options?.logger?.warn(`Failed to download style from: ${cssPath} with error: ${error?.toString()}`);\n }\n return '';\n}\n\n/**\n * Applies the given CSS theme as a stylesheet.\n * @param themeValue - CSS as text containing a theme definition.\n * @param cleanPrevious - Whether to remove previously applied stylesheets if no themeValue provided. Default is true.\n */\nexport function applyTheme(themeValue?: string, cleanPrevious = true): void {\n if (themeValue !== undefined) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(themeValue);\n document.adoptedStyleSheets = cleanPrevious ? [sheet] : [...document.adoptedStyleSheets, sheet];\n } else if (cleanPrevious) { // remove the styles if the theme value comes undefined or empty string\n document.adoptedStyleSheets = [];\n }\n}\n\n/**\n * Download the application additional theme\n * @param theme Name of the theme to download from the current application\n * @param options Options and context for Style helpers\n */\nexport function downloadApplicationThemeCss(theme: string, options?: StyleHelperOptions) {\n const cssHref = `${theme.endsWith('.css') ? theme : theme + THEME_URL_SUFFIX}`;\n return getStyle(cssHref, options);\n}\n\n/**\n * Applies the initial theme based on the URL query parameters.\n *\n * This function fetches the CSS theme specified in the URL query parameters and applies it as a stylesheet.\n * If a referrer is present, it also attempts to fetch and apply the theme from the referrer's URL.\n * @param options Options and context for Style helpers\n */\nexport async function applyInitialTheme(options?: StyleHelperOptions): Promise<PromiseSettledResult<void>[] | undefined> {\n const searchParams = new URLSearchParams(window.location.search);\n const theme = searchParams.get(THEME_QUERY_PARAM_NAME);\n document.adoptedStyleSheets = [];\n if (theme) {\n const themeRequest: Promise<void>[] = [];\n themeRequest.push(downloadApplicationThemeCss(theme, options).then((styleToApply) => applyTheme(styleToApply, false)));\n const hostInfo = getHostInfo();\n if (hostInfo.hostURL) {\n const url = new URL(hostInfo.hostURL);\n url.pathname += `${url.pathname.endsWith('/') ? '' : '/'}${theme}`;\n themeRequest.unshift(getStyle(url.toString(), options).then((styleToApply) => applyTheme(styleToApply, false)));\n }\n\n return Promise.allSettled(themeRequest);\n }\n return undefined;\n}\n","import type {\n ThemeMessage,\n ThemeV1_0,\n} from '@ama-mfe/messages';\nimport {\n THEME_MESSAGE_TYPE,\n ThemeStructure,\n} from '@ama-mfe/messages';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n type MessageProducer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/index';\nimport {\n applyTheme,\n getStyle,\n THEME_QUERY_PARAM_NAME,\n THEME_URL_SUFFIX,\n} from './theme.helpers';\n/**\n * This service exposing the current theme signal\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeProducerService implements MessageProducer<ThemeMessage> {\n private readonly messageService = inject(MessagePeerService<ThemeMessage>);\n private readonly logger = inject(LoggerService);\n private previousTheme: ThemeStructure | undefined;\n\n private readonly currentThemeSelection;\n /** Current selected theme signal */\n public readonly currentTheme;\n\n /**\n * The type of messages this service handles ('theme').\n */\n public readonly types = THEME_MESSAGE_TYPE;\n\n constructor() {\n registerProducer(this);\n\n // get the current theme name from the url (if any) and emit a first value for the current theme\n const parentUrl = new URL(window.location.toString());\n const selectedThemeName = parentUrl.searchParams.get(THEME_QUERY_PARAM_NAME);\n this.currentThemeSelection = signal<ThemeStructure | undefined>(selectedThemeName\n ? {\n name: selectedThemeName,\n css: null\n }\n : undefined);\n this.currentTheme = this.currentThemeSelection.asReadonly();\n\n if (selectedThemeName) {\n void this.changeTheme(selectedThemeName);\n }\n\n // When the current theme changes, apply it to the current application\n effect(() => {\n const themeObj = this.currentTheme();\n if (themeObj?.css !== null) {\n applyTheme(themeObj?.css);\n }\n });\n\n /**\n * This effect listens for changes in the `currentTheme` signal. If a valid theme object with CSS is present,\n * it creates a theme message and sends it via the message service.\n */\n effect(() => {\n const themeObj = this.currentTheme();\n if (themeObj && themeObj.css !== null) {\n const messageV10 = {\n type: 'theme',\n name: themeObj.name,\n css: themeObj.css,\n version: '1.0'\n } satisfies ThemeV1_0;\n // TODO: sendBest() is not yet implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n this.messageService.send(messageV10);\n }\n });\n }\n\n /**\n * Changes the current theme to the specified theme name.\n * @param themeName - The name of the theme to change to.\n */\n public async changeTheme(themeName?: string): Promise<void> {\n const cssHref = themeName && `${themeName}${THEME_URL_SUFFIX}`;\n const styleObj = cssHref ? await getStyle(cssHref) : '';\n this.currentThemeSelection.update((theme) => {\n this.previousTheme = theme;\n return themeName\n ? { name: themeName, css: styleObj }\n : undefined;\n });\n }\n\n /**\n * Reverts to the previous theme.\n */\n public revertToPreviousTheme(): void {\n this.currentThemeSelection.set(this.previousTheme);\n }\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<ThemeV1_0>): void {\n this.logger.error('Error in theme service message', message);\n this.revertToPreviousTheme();\n }\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n ThemeProducerService,\n} from './theme.producer.service';\n\n/**\n * A pipe that applies the current theme from a theme manager service, to a given URL or SafeResourceUrl, as query param\n */\n@Pipe({\n name: 'applyTheme'\n})\nexport class ApplyTheme implements PipeTransform {\n private readonly themeManagerService = inject(ThemeProducerService);\n private readonly domSanitizer = inject(DomSanitizer);\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending the current theme value as a query parameter.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @returns The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string): string;\n public transform(url: SafeResourceUrl): SafeResourceUrl;\n public transform(url: undefined): undefined;\n public transform(url: string | SafeResourceUrl | undefined): string | SafeResourceUrl | undefined {\n if (!url) {\n return undefined;\n }\n const currentTheme = this.themeManagerService.currentTheme();\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url);\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n if (currentTheme) {\n moduleUrl.searchParams.set('theme', currentTheme.name);\n }\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n\n return undefined;\n }\n}\n","import type {\n ThemeMessage,\n ThemeV1_0,\n} from '@ama-mfe/messages';\nimport {\n THEME_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n} from '@angular/platform-browser';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n ConsumerManagerService,\n MessageConsumer,\n} from '../managers/index';\nimport {\n applyTheme,\n downloadApplicationThemeCss,\n} from './theme.helpers';\n\n/**\n * A service that handles theme messages and applies the received theme.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeConsumerService implements MessageConsumer<ThemeMessage> {\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly consumerManagerService = inject(ConsumerManagerService);\n private readonly logger = inject(LoggerService);\n /**\n * The type of messages this service handles ('theme').\n */\n public readonly type = THEME_MESSAGE_TYPE;\n\n /**\n * The supported versions of theme messages and their handlers.\n */\n public readonly supportedVersions = {\n /**\n * Use the message paylod to get the theme and apply it\n * @param message message to consume\n */\n '1.0': async (message: RoutedMessage<ThemeV1_0>) => {\n const sanitizedCss = this.domSanitizer.sanitize(SecurityContext.STYLE, message.payload.css);\n if (sanitizedCss !== null) {\n applyTheme(sanitizedCss);\n }\n try {\n const css = await downloadApplicationThemeCss(message.payload.name, { logger: this.logger });\n applyTheme(css, false);\n } catch (e) {\n this.logger.warn(`No CSS variable for the theme ${message.payload.name}`, e);\n }\n }\n };\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Starts the theme handler service by registering it into the consumer manager service.\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * Stops the theme handler service by unregistering it from the consumer manager service.\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n LoggerService,\n} from '@o3r/logger';\n\n@Directive({\n selector: 'iframe[connect]',\n standalone: true\n})\nexport class ConnectDirective {\n /**\n * The connection ID required for the message peer service.\n */\n public connect = input.required<string>();\n\n /**\n * The sanitized source URL for the iframe.\n */\n public src = input<SafeResourceUrl>();\n\n /**\n * Binds the `src` attribute of the iframe to the sanitized source URL.\n */\n @HostBinding('src')\n public get srcAttr() {\n return this.src();\n }\n\n private readonly messageService = inject(MessagePeerService);\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly elRef = inject(ElementRef);\n\n private readonly clientOrigin = computed(() => {\n const src = this.src();\n const srcString = src && this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, src);\n return srcString && new URL(srcString).origin;\n });\n\n constructor() {\n const logger = inject(LoggerService);\n // When the origin url or the peer id changes it will remake the connection with the new updates. The old connection is closed\n effect(async () => {\n const clientOrigin = this.clientOrigin();\n const connectId = this.connect();\n const moduleWindow = (this.elRef.nativeElement as HTMLIFrameElement).contentWindow;\n\n this.messageService.disconnect();\n if (clientOrigin && moduleWindow) {\n try {\n await this.messageService.listen(connectId, {\n window: moduleWindow,\n origin: clientOrigin\n });\n } catch (e) {\n logger.error(`Fail to connect to client (connection ID: ${connectId})`, e);\n }\n }\n });\n // When the directive is destroyed clean up the connection too.\n inject(DestroyRef).onDestroy(() => this.messageService.disconnect());\n }\n}\n","import {\n MESSAGE_PEER_CONFIG,\n MESSAGE_PEER_CONNECT_OPTIONS,\n MessagePeerConfig,\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n makeEnvironmentProviders,\n} from '@angular/core';\nimport {\n type Logger,\n} from '@o3r/logger';\nimport {\n getHostInfo,\n persistHostInfo,\n} from '../host-info';\nimport {\n getDefaultClientEndpointStartOptions,\n KNOWN_MESSAGES,\n} from '../utils';\nimport {\n ConnectionConfig,\n ConnectionService,\n} from './connect.resources';\n\n/** Options to configure the connection inside the communication protocol */\nexport interface ConnectionConfigOptions extends Omit<ConnectionConfig, 'id'> {\n /** @inheritdoc */\n id?: string;\n /** Logger used to gather information */\n logger?: Logger;\n}\n\n/**\n * Provide the communication protocol connection configuration\n * @param connectionConfigOptions The identifier of the application in the communication protocol ecosystem plus the types of messages able to exchange and a logger object\n */\nexport function provideConnection(connectionConfigOptions?: ConnectionConfigOptions) {\n persistHostInfo();\n const connectionId = getHostInfo().moduleApplicationId || connectionConfigOptions?.id;\n if (!connectionId) {\n (connectionConfigOptions?.logger || console).error('An id (moduleId) needs to be provided for the application in order to establish a connection inside the communication protocol');\n return makeEnvironmentProviders([]);\n }\n const config: MessagePeerConfig = {\n id: connectionId,\n messageCheckStrategy: 'version',\n knownMessages: [...KNOWN_MESSAGES, ...(connectionConfigOptions?.knownMessages || [])]\n };\n return makeEnvironmentProviders([\n {\n provide: MESSAGE_PEER_CONFIG, useValue: config\n },\n {\n provide: MESSAGE_PEER_CONNECT_OPTIONS, useValue: getDefaultClientEndpointStartOptions()\n },\n {\n // in the case of the ConnectionService will extend the base service 'useExisting' should be used\n provide: MessagePeerService, useClass: ConnectionService, deps: [MESSAGE_PEER_CONFIG]\n }\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["ConnectionService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ama-mfe-ng-utils.mjs","sources":["../../src/messages/available.sender.ts","../../src/messages/error.sender.ts","../../src/managers/producer.manager.service.ts","../../src/managers/consumer.manager.service.ts","../../src/managers/utils.ts","../../src/messages/error/base.ts","../../src/resize/resize.consumer.service.ts","../../src/resize/resize.producer.service.ts","../../src/resize/resize.directive.ts","../../src/host-info/host-info.ts","../../src/host-info/host-info.pipe.ts","../../src/navigation/navigation.consumer.service.ts","../../src/navigation/route-memorize/route-memorize.service.ts","../../src/navigation/route-memorize/route-memorize.directive.ts","../../src/utils.ts","../../src/navigation/routing.service.ts","../../src/navigation/restore-route.pipe.ts","../../src/theme/theme.helpers.ts","../../src/theme/theme.producer.service.ts","../../src/theme/apply-theme.pipe.ts","../../src/theme/theme.consumer.service.ts","../../src/connect/connect.directive.ts","../../src/history/history.providers.ts","../../src/connect/connect.providers.ts","../../src/ama-mfe-ng-utils.ts"],"sourcesContent":["import type {\n DeclareMessages,\n} from '@amadeus-it-group/microfrontends';\nimport type {\n BasicMessageConsumer,\n} from '../managers/interfaces';\n\n/**\n * Gets the available consumers and formats them into a {@see DeclareMessages} object.\n * @param consumers - The list of registered message consumers.\n * @returns The formatted DeclareMessages object.\n */\nexport const getAvailableConsumers = (consumers: BasicMessageConsumer[]) => {\n return {\n type: 'declare_messages',\n version: '1.0',\n messages: consumers.flatMap(({ type, supportedVersions }) => Object.keys(supportedVersions).map((version) => ({ type, version })))\n } satisfies DeclareMessages;\n};\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport type {\n MessagePeerServiceType,\n} from '@amadeus-it-group/microfrontends-angular';\nimport type {\n ERROR_MESSAGE_TYPE,\n ErrorContent,\n ErrorMessageV1_0,\n} from './error/index';\n\n/**\n * Helper function to send an error message by the given endpoint (peer)\n * @param peer The endpoint sending the message\n * @param content the content of the error message to be sent\n */\nexport const sendError = (peer: MessagePeerServiceType<any>, content: ErrorContent) => {\n return peer.send({\n type: 'error',\n version: '1.0',\n ...content\n } satisfies ErrorMessageV1_0);\n};\n\n/**\n * Check if the given message is of type error and the error reson is present too\n * @param message the message to be checked\n */\n// eslint-disable-next-line @stylistic/max-len -- constant definition\nexport const isErrorMessage = (message: any): message is VersionedMessage & { type: typeof ERROR_MESSAGE_TYPE } & ErrorContent => (message && typeof message === 'object' && message.type === 'error' && !!message.reason);\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n Injectable,\n} from '@angular/core';\nimport type {\n ErrorContent,\n} from '../messages/index';\nimport type {\n MessageProducer,\n} from './interfaces';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ProducerManagerService {\n private readonly registeredProducers = new Set<MessageProducer>();\n\n /** Get the list of registered producers of messages. The list will contain unique elements */\n public get producers() {\n return [...this.registeredProducers];\n }\n\n /**\n * Register a producer of a message\n * @param producer The instance of the message producer\n */\n public register(producer: MessageProducer) {\n this.registeredProducers.add((producer));\n }\n\n /**\n * Unregister a producer of a message\n * @param producer The instance of the message producer\n */\n public unregister(producer: MessageProducer) {\n this.registeredProducers.delete((producer));\n }\n\n /**\n * Handles the received error message for the given message type by invoking the appropriate producer handlers.\n * @template T - The type of the message, extending from Message.\n * @param message - The error message to handle.\n * @returns - A promise that resolves to true if the error was handled by at least one handler, false otherwise.\n */\n public async dispatchError<T extends VersionedMessage = VersionedMessage>(message: ErrorContent<T>) {\n const handlers = this.producers\n .filter(({ types }) => (Array.isArray(types) ? types : [types]).includes(message.source.type));\n\n const handlersPresent = handlers.length > 0;\n if (handlersPresent) {\n await Promise.all(\n handlers.map((handler) => handler.handleError(message))\n );\n }\n return handlersPresent;\n }\n}\n","import {\n RoutedMessage,\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n getAvailableConsumers,\n} from '../messages/available.sender';\nimport {\n isErrorMessage,\n sendError,\n} from '../messages/error.sender';\nimport type {\n BasicMessageConsumer,\n} from './interfaces';\nimport {\n ProducerManagerService,\n} from './producer.manager.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConsumerManagerService {\n private readonly messageService = inject(MessagePeerService);\n private readonly producerManagerService = inject(ProducerManagerService);\n private readonly registeredConsumers = signal<BasicMessageConsumer[]>([]);\n private readonly logger = inject(LoggerService);\n\n /** The list of registered consumers */\n public readonly consumers = this.registeredConsumers.asReadonly();\n\n constructor() {\n this.messageService.messages$.pipe(takeUntilDestroyed()).subscribe((message) => this.consumeMessage(message));\n\n // Each time a consumer is registered/unregistered update the list of registered messages\n effect(() => {\n const declareMessages = getAvailableConsumers(this.consumers());\n\n // registering consumed messages locally for validation\n for (const message of declareMessages.messages) {\n this.messageService.registerMessage(message);\n }\n });\n }\n\n /**\n * Consume a received message\n * @param message the received message body\n */\n private async consumeMessage(message: RoutedMessage<VersionedMessage>) {\n if (isErrorMessage(message.payload)) {\n const isHandled = await this.producerManagerService.dispatchError(message.payload);\n if (!isHandled) {\n this.logger.warn('Error message not handled', message);\n }\n return;\n }\n\n return this.consumeAdditionalMessage(message);\n }\n\n /**\n * Call the registered message callback(s) to consume the given message\n * Handle error messages of internal communication protocol messages\n * @param message message to consume\n */\n private async consumeAdditionalMessage(message: RoutedMessage<VersionedMessage>) {\n if (!message.payload) {\n this.logger.warn('Cannot consume a messages with undefined payload.');\n return;\n }\n\n const consumers = this.consumers();\n const typeMatchingConsumers = consumers\n .filter((consumer) => consumer.type === message.payload.type);\n\n if (typeMatchingConsumers.length === 0) {\n this.logger.warn(`No consumer found for message type: ${message.payload.type}`);\n return sendError(this.messageService, { reason: 'unknown_type', source: message.payload });\n }\n\n const versionMatchingConsumers = typeMatchingConsumers\n .filter((consumer) => consumer.supportedVersions[message.payload.version])\n .flat();\n\n if (versionMatchingConsumers.length === 0) {\n this.logger.warn(`No consumer found for message version: ${message.payload.version}`);\n return sendError(this.messageService, { reason: 'version_mismatch', source: message.payload });\n }\n\n await Promise.all(\n versionMatchingConsumers\n .map(async (consumer) => {\n try {\n await consumer.supportedVersions[message.payload.version](message);\n } catch (error) {\n this.logger.error('Error while consuming message', error);\n sendError(this.messageService, { reason: 'internal_error', source: message.payload });\n }\n })\n );\n }\n\n /**\n * Register a message consumer\n * @param consumer an instance of message consumer\n */\n public register(consumer: BasicMessageConsumer) {\n this.registeredConsumers.update((consumers) => {\n return [...new Set(consumers).add(consumer)];\n });\n }\n\n /**\n * Unregister a message consumer\n * @param consumer an instance of message consumer\n */\n public unregister(consumer: BasicMessageConsumer) {\n this.registeredConsumers.update((consumers) => {\n return consumers.filter((c) => c !== consumer);\n });\n }\n}\n","import {\n DestroyRef,\n inject,\n} from '@angular/core';\nimport {\n ConsumerManagerService,\n} from './consumer.manager.service';\nimport type {\n MessageConsumer,\n MessageProducer,\n} from './interfaces';\nimport {\n ProducerManagerService,\n} from './producer.manager.service';\n\n/**\n * Method to call in the constructor of a producer\n * @note should be used in injection context\n * @param producer\n */\nexport const registerProducer = (producer: MessageProducer) => {\n const producerManagerService = inject(ProducerManagerService);\n producerManagerService.register(producer);\n\n inject(DestroyRef).onDestroy(() => {\n producerManagerService.unregister(producer);\n });\n};\n\n/**\n * Method to call in the constructor of a consumer\n * @note should be used in injection context\n * @param consumer\n */\nexport const registerConsumer = (consumer: MessageConsumer) => {\n const consumerManagerService = inject(ConsumerManagerService);\n consumerManagerService.register(consumer);\n\n inject(DestroyRef).onDestroy(() => {\n consumerManagerService.unregister(consumer);\n });\n};\n","import type {\n VersionedMessage,\n} from '@amadeus-it-group/microfrontends';\n\n/** the error message type */\nexport const ERROR_MESSAGE_TYPE = 'error';\n\n/**\n * The possible reasons for an error.\n */\nexport type ErrorReason = 'unknown_type' | 'version_mismatch' | 'internal_error';\n\n/**\n * The content of an error message.\n * @template S - The type of the source message.\n */\nexport interface ErrorContent<S extends VersionedMessage = VersionedMessage> {\n /** The reason for the error */\n reason: ErrorReason;\n /** The source message that caused the error */\n source: S;\n}\n","import type {\n ResizeMessage,\n ResizeV1_0,\n} from '@ama-mfe/messages';\nimport {\n RESIZE_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n ConsumerManagerService,\n MessageConsumer,\n} from '../managers/index';\n\n/**\n * This service listens for resize messages and updates the height of elements based on the received messages.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ResizeConsumerService implements MessageConsumer<ResizeMessage> {\n private readonly newHeight = signal<{ height: number; channelId: string } | undefined>(undefined);\n\n /**\n * A readonly signal that provides the new height information from the channel.\n */\n public readonly newHeightFromChannel = this.newHeight.asReadonly();\n\n /**\n * The type of messages this service handles ('resize').\n */\n public readonly type = RESIZE_MESSAGE_TYPE;\n\n /**\n * The supported versions of resize messages and their handlers.\n */\n public supportedVersions = {\n /**\n * Use the message paylod to compute a new height and emit it via the public signal\n * @param message message to consume\n */\n '1.0': (message: RoutedMessage<ResizeV1_0>) => this.newHeight.set({ height: message.payload.height, channelId: message.from })\n };\n\n private readonly consumerManagerService = inject(ConsumerManagerService);\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Starts the resize handler service by registering it into the consumer manager service.\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * Stops the resize handler service by unregistering it from the consumer manager service.\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import type {\n ResizeMessage,\n ResizeV1_0,\n} from '@ama-mfe/messages';\nimport {\n RESIZE_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n afterNextRender,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n type MessageProducer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/index';\n\n/**\n * This service observe changes in the document's body height.\n * When the height changes, it sends a resize message with the new height, to the connected peers\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ResizeService implements MessageProducer<ResizeMessage> {\n private actualHeight?: number;\n private readonly messageService = inject(MessagePeerService<ResizeMessage>);\n private resizeObserver?: ResizeObserver;\n\n /**\n * @inheritdoc\n */\n public readonly types = RESIZE_MESSAGE_TYPE;\n\n constructor() {\n registerProducer(this);\n }\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<ResizeMessage>): void {\n // eslint-disable-next-line no-console -- error handling placeholder\n console.error('Error in resize service message', message);\n }\n\n /**\n * This method sets up a `ResizeObserver` to observe changes in the document's body height.\n * When the height changes, it sends a resize message with the new height, to the connected peers\n */\n public startResizeObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n const newHeight = document.body.getBoundingClientRect().height;\n if (!this.actualHeight || newHeight !== this.actualHeight) {\n this.actualHeight = newHeight;\n const messageV10 = {\n type: 'resize',\n version: '1.0',\n height: this.actualHeight\n } satisfies ResizeV1_0;\n // TODO: sendBest() is not implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n this.messageService.send(messageV10);\n }\n });\n\n afterNextRender(() => this.resizeObserver?.observe(document.body));\n }\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2,\n} from '@angular/core';\nimport {\n ResizeConsumerService,\n} from './resize.consumer.service';\n\n/**\n * A directive that adjusts the height of an element based on resize messages from a specified channel.\n */\n@Directive({\n selector: '[scalable]',\n standalone: true\n})\nexport class ScalableDirective {\n /**\n * The connection ID for the element, used as channel id backup\n */\n public connect = input<string>();\n\n /**\n * The channel id\n */\n public scalable = input<string>();\n\n private readonly resizeHandler = inject(ResizeConsumerService);\n\n /**\n * This signal checks if the current channel requesting the resize matches the channel ID from the resize handler.\n * If they match, it returns the new height information; otherwise, it returns undefined.\n */\n private readonly newHeightFromChannel = computed(() => {\n const channelAskingResize = this.scalable() || this.connect();\n const newHeightFromChannel = this.resizeHandler.newHeightFromChannel();\n if (channelAskingResize && newHeightFromChannel?.channelId === channelAskingResize) {\n return newHeightFromChannel;\n }\n return undefined;\n });\n\n constructor() {\n const elem = inject(ElementRef);\n const renderer = inject(Renderer2);\n\n this.resizeHandler.start();\n\n /** When a new height value is received set the height of the host element (in pixels) */\n effect(() => {\n const newHeightFromChannel = this.newHeightFromChannel();\n if (newHeightFromChannel) {\n renderer.setStyle(elem.nativeElement, 'height', `${newHeightFromChannel.height}px`);\n }\n });\n }\n}\n","const SESSION_STORAGE_KEY = 'ama-mfe-host-info';\n\n/**\n * Search parameter to add to the URL when embedding an iframe containing the URL of the host.\n * This is needed to support Firefox (on which {@link https://developer.mozilla.org/docs/Web/API/Location/ancestorOrigins | location.ancestorOrigins} is not currently supported)\n * in case of redirection inside the iframe.\n */\nexport const MFE_HOST_URL_PARAM = 'ama-mfe-host-url';\n\n/**\n * Search parameter to add to the URL to let a module know on which application it's embedded\n */\nexport const MFE_HOST_APPLICATION_ID_PARAM = 'ama-mfe-host-app-id';\n\n/**\n * Search parameter to add to the URL to identify the application in the network of peers in the communication protocol\n */\nexport const MFE_MODULE_APPLICATION_ID_PARAM = 'ama-mfe-module-app-id';\n\n/** The list of query parameters which can be set by the host */\nexport const hostQueryParams = [MFE_HOST_URL_PARAM, MFE_HOST_APPLICATION_ID_PARAM, MFE_MODULE_APPLICATION_ID_PARAM];\n\n/**\n * Information set up at host level to use in embedded context\n */\nexport interface MFEHostInformation {\n /**\n * URL of the host application\n */\n hostURL?: string;\n /**\n * ID of the host application\n */\n hostApplicationId?: string;\n\n /**\n * ID of the module to embed defined at host level\n */\n moduleApplicationId?: string;\n}\n\n/**\n * Gather the host information from the url parameters\n * The host url will use the first found among:\n * - look for the search parameter {@link MFE_HOST_URL_PARAM} in the URL of the iframe\n * - use the first item in `location.ancestorOrigins` (currently not supported on Firefox)\n * - use `document.referrer` (will only work if called before any redirection in the iframe)\n * The host application ID is taken from the search parameter {@link MFE_HOST_APPLICATION_ID_PARAM} in the URL of the iframe\n * The module application ID is taken from the search parameter {@link MFE_APPLICATION_ID_PARAM} in the URL of the iframe\n */\nexport function getHostInfo(): MFEHostInformation {\n const searchParams = new URLSearchParams(location.search);\n const storedHostInfo = JSON.parse(sessionStorage.getItem(SESSION_STORAGE_KEY) || '{}') as MFEHostInformation;\n return {\n hostURL: searchParams.get(MFE_HOST_URL_PARAM) || storedHostInfo.hostURL || location.ancestorOrigins?.[0] || document.referrer,\n hostApplicationId: searchParams.get(MFE_HOST_APPLICATION_ID_PARAM) || storedHostInfo.hostApplicationId,\n moduleApplicationId: searchParams.get(MFE_MODULE_APPLICATION_ID_PARAM) || storedHostInfo.moduleApplicationId\n };\n}\n\n/**\n * Gather the host information from the url parameters and handle the persistence in session storage.\n */\nexport function persistHostInfo() {\n const hostInfo = getHostInfo();\n sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(hostInfo));\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n MFE_HOST_APPLICATION_ID_PARAM,\n MFE_HOST_URL_PARAM,\n MFE_MODULE_APPLICATION_ID_PARAM,\n} from './host-info';\n\n/**\n * A pipe that adds the host information in the URL of an iframe,\n */\n@Pipe({\n name: 'hostInfo'\n})\nexport class HostInfoPipe implements PipeTransform {\n private readonly domSanitizer = inject(DomSanitizer);\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending query parameters.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @param options - hostId and moduleId\n * @returns - The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string, options: { hostId: string; moduleId?: string }): string;\n public transform(url: SafeResourceUrl, options: { hostId: string; moduleId?: string }): SafeResourceUrl;\n public transform(url: undefined, options: { hostId: string; moduleId?: string }): undefined;\n public transform(url: string | SafeResourceUrl | undefined, options: { hostId: string; moduleId?: string }): string | SafeResourceUrl | undefined {\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url || null);\n\n if (!url) {\n return undefined;\n }\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n moduleUrl.searchParams.set(MFE_HOST_URL_PARAM, window.location.origin);\n moduleUrl.searchParams.set(MFE_HOST_APPLICATION_ID_PARAM, options.hostId);\n if (options.moduleId) {\n moduleUrl.searchParams.set(MFE_MODULE_APPLICATION_ID_PARAM, options.moduleId);\n }\n\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n }\n}\n","import {\n NAVIGATION_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n NavigationMessage,\n NavigationV1_0,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n Router,\n} from '@angular/router';\nimport {\n Subject,\n} from 'rxjs';\nimport {\n hostQueryParams,\n} from '../host-info';\nimport {\n ConsumerManagerService,\n type MessageConsumer,\n} from '../managers/index';\n\n/**\n * A service that handles navigation messages and routing.\n *\n * This service listens for navigation messages and updates the router state accordingly.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NavigationConsumerService implements MessageConsumer<NavigationMessage> {\n private readonly router = inject(Router);\n private readonly activeRoute = inject(ActivatedRoute);\n private readonly requestedUrl = new Subject<{ url: string; channelId?: string }>();\n\n /**\n * An observable that emits the requested URL and optional channel ID.\n */\n public readonly requestedUrl$ = this.requestedUrl.asObservable();\n\n /**\n * The type of messages this service handles.\n */\n public readonly type = NAVIGATION_MESSAGE_TYPE;\n\n /**\n * @inheritdoc\n */\n public readonly supportedVersions = {\n /**\n * Use the message paylod to compute a new url and emit it via the public subject\n * Additionally navigate to the new url\n * @param message message to consume\n */\n '1.0': (message: RoutedMessage<NavigationV1_0>) => {\n const channelId = message.from || undefined;\n this.requestedUrl.next({ url: message.payload.url, channelId });\n this.navigate(message.payload.url);\n }\n };\n\n private readonly consumerManagerService = inject(ConsumerManagerService);\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Parses a URL and returns an object containing the paths and query parameters.\n * @param url - The URL to parse.\n * @returns An object containing the paths and query parameters.\n */\n private parseUrl(url: string): { paths: string[]; queryParams: { [key: string]: string } } {\n const urlObject = new URL(window.origin + url);\n const paths = urlObject.pathname.split('/').filter((segment) => !!segment);\n const queryParams = Object.fromEntries(urlObject.searchParams.entries());\n return { paths, queryParams };\n }\n\n /**\n * Navigates to the specified URL.\n * @param url - The URL to navigate to.\n */\n private navigate(url: string) {\n const { paths, queryParams } = this.parseUrl(url);\n // No need to keep these in the URL\n hostQueryParams.forEach((key) => delete queryParams[key]);\n void this.router.navigate(paths, { relativeTo: this.activeRoute.children.at(-1), queryParams });\n }\n\n /**\n * @inheritdoc\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * @inheritdoc\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import {\n Injectable,\n} from '@angular/core';\n\n/**\n * This service allows routes to be memorized with an optional lifetime and provides methods to retrieve and manage these routes.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RouteMemorizeService {\n private readonly routeTimers: { [x: string]: ReturnType<typeof setTimeout> } = {};\n /** All memorized routes */\n public readonly routeStack: { [x: string]: string } = {};\n\n /**\n * Memorizes a route for a given channel ID with an optional lifetime.\n * @param channelId - The ID of the channel to memorize the route for.\n * @param url - The URL of the route to memorize.\n * @param liveTime - The optional lifetime of the memorized route in milliseconds. If provided, the route will be removed after this time.\n */\n public memorizeRoute(channelId: string, url: string, liveTime?: number): void {\n this.routeStack[channelId] = url;\n\n const timerRef = this.routeTimers[channelId];\n if (timerRef) {\n clearTimeout(timerRef);\n }\n if (liveTime && liveTime > 0) {\n this.routeTimers[channelId] = setTimeout(() => {\n delete this.routeStack[channelId];\n delete this.routeTimers[channelId];\n }, liveTime);\n }\n }\n\n /**\n * Retrieves the memorized route for a given channel ID.\n * @param channelId - The ID of the channel to retrieve the memorized route for.\n * @returns The memorized route URL or undefined if no route is memorized for the given channel ID.\n */\n public getRoute(channelId: string): string | undefined {\n return this.routeStack[channelId];\n }\n}\n","import {\n computed,\n Directive,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport {\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport {\n NavigationConsumerService,\n} from '../navigation.consumer.service';\nimport {\n RouteMemorizeService,\n} from './route-memorize.service';\n\n@Directive({\n selector: 'iframe[memorizeRoute]',\n standalone: true\n})\nexport class RouteMemorizeDirective {\n /**\n * Whether to memorize the route.\n * Default is true.\n */\n public memorizeRoute = input<boolean | undefined | ''>(true);\n\n /**\n * The ID used to memorize the route.\n */\n public memorizeRouteId = input<string>();\n\n /**\n * The maximum age for memorizing the route.\n * Default is 0.\n */\n public memorizeMaxAge = input<number>(0);\n\n /**\n * The maximum age for memorizing the route, used as a fallback.\n * Default is 0.\n */\n public memorizeRouteMaxAge = input<number>(0);\n\n /**\n * The connection ID for the iframe where the actual directive is applied.\n */\n public connect = input<string>();\n\n private readonly maxAge = computed(() => {\n return this.memorizeMaxAge() || this.memorizeRouteMaxAge();\n });\n\n constructor() {\n const memory = inject(RouteMemorizeService);\n const requestedUrlSignal = toSignal(inject(NavigationConsumerService).requestedUrl$);\n\n /**\n * This effect listens for changes in the `memorizeRoute`, `requestedUrlSignal`, and `memorizeRouteId` or `connect` inputs.\n * If `memorizeRoute` is not false and a requested URL with a matching channel ID is found, it memorizes the route using the route memory service.\n */\n effect(() => {\n const memorizeRoute = this.memorizeRoute();\n if (memorizeRoute === false) {\n return;\n }\n const requested = requestedUrlSignal();\n const id = this.memorizeRouteId() || this.connect();\n if (requested && id && requested.channelId === id) {\n memory.memorizeRoute(id, requested.url, untracked(this.maxAge));\n }\n });\n }\n}\n","import type {\n Message,\n PeerConnectionOptions,\n} from '@amadeus-it-group/microfrontends';\nimport {\n getHostInfo,\n} from './host-info';\nimport {\n ERROR_MESSAGE_TYPE,\n} from './messages';\n\n/**\n * A constant array of known message types and their versions.\n */\nexport const KNOWN_MESSAGES = [\n {\n type: ERROR_MESSAGE_TYPE,\n version: '1.0'\n }\n] as const satisfies Message[];\n\n/**\n * Returns the default options for starting a client endpoint peer connection.\n * As `origin`, it will take the hostURL from {@link getHostInfo} and the `window` will be the parent window.\n */\nexport function getDefaultClientEndpointStartOptions(): PeerConnectionOptions {\n const hostInfo = getHostInfo();\n if (hostInfo.hostURL) {\n return {\n origin: new URL(hostInfo.hostURL).origin,\n window: window.parent\n };\n }\n return {};\n}\n\n/**\n * Return `true` if embedded inside an iframe, `false` otherwise\n */\nexport function isEmbedded() {\n return window.top !== window.self;\n}\n","import type {\n NavigationMessage,\n NavigationV1_0,\n} from '@ama-mfe/messages';\nimport {\n NAVIGATION_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n} from '@angular/router';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n filter,\n map,\n} from 'rxjs';\nimport {\n type MessageConsumer,\n type MessageProducer,\n registerConsumer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/error';\nimport {\n isEmbedded,\n} from '../utils';\n\n/** Options for the routing handling in case of navigation producer message */\nexport interface RoutingServiceOptions {\n /**\n * Whether to handle only sub-routes.\n * If true, the routing service will handle only sub-routes.\n * Default is false.\n */\n subRouteOnly?: boolean;\n}\n\n/**\n * A service that keeps in sync Router navigation and navigation messages.\n *\n * - listens to Router events and sends navigation messages\n * - handles incoming navigation messages and triggers Router navigation\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RoutingService implements MessageProducer<NavigationMessage>, MessageConsumer<NavigationMessage> {\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly messageService = inject(MessagePeerService<NavigationMessage>);\n private readonly logger = inject(LoggerService);\n\n /**\n * @inheritdoc\n */\n public readonly types = NAVIGATION_MESSAGE_TYPE;\n\n /**\n * @inheritdoc\n */\n public readonly type = 'navigation';\n\n /**\n * Use the message payload to navigate to the specified URL.\n * @param message message to consume\n */\n public readonly supportedVersions = {\n '1.0': async (message: RoutedMessage<any>) => {\n await this.router.navigateByUrl(message.payload.url);\n }\n };\n\n constructor() {\n registerProducer(this);\n registerConsumer(this);\n }\n\n /**\n * @inheritdoc\n */\n public start(): void {}\n\n /**\n * @inheritdoc\n */\n public stop(): void {}\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<NavigationV1_0>): void {\n this.logger.error('Error in navigation service message', message);\n }\n\n /**\n * Handles embedded routing by listening to router events and sending navigation messages to the connected endpoints.\n * It can be a parent window or another iframe\n * @note - This method has to be called in an injection context\n * @param options - Optional parameters to control the routing behavior {@see RoutingServiceOptions}.\n */\n public handleEmbeddedRouting(options?: RoutingServiceOptions): void {\n const subRouteOnly = options?.subRouteOnly ?? false;\n this.router.events.pipe(\n takeUntilDestroyed(),\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(({ urlAfterRedirects }) => {\n const channelId = this.router.getCurrentNavigation()?.extras?.state?.channelId;\n const currentRouteRegExp = subRouteOnly && this.activatedRoute.routeConfig?.path && new RegExp('^' + this.activatedRoute.routeConfig.path.replace(/(?=\\W)/g, '\\\\'), 'i');\n return ({ url: currentRouteRegExp ? urlAfterRedirects.replace(currentRouteRegExp, '') : urlAfterRedirects, channelId });\n })\n ).subscribe(({ url, channelId }) => {\n const messageV10 = {\n type: 'navigation',\n version: '1.0',\n url\n } satisfies NavigationV1_0;\n // TODO: sendBest() is not implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n if (isEmbedded()) {\n this.messageService.send(messageV10);\n } else {\n if (channelId === undefined) {\n this.logger.warn('No channelId provided for navigation message');\n } else {\n try {\n this.messageService.send(messageV10, { to: [channelId] });\n } catch (error) {\n this.logger.error('Error sending navigation message', error);\n }\n }\n }\n });\n }\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n ActivatedRoute,\n} from '@angular/router';\nimport {\n RouteMemorizeService,\n} from './route-memorize/route-memorize.service';\n\n/**\n * Options for restoring a route with optional query parameters and memory channel ID.\n */\nexport interface RestoreRouteOptions {\n /**\n * Whether to propagate query parameters from the top window to the module URL.\n */\n propagateQueryParams?: boolean;\n\n /**\n * Whether to override existing query parameters in the module URL with those from the top window.\n */\n overrideQueryParams?: boolean;\n\n /**\n * The memory channel ID used to retrieve the memorized route.\n * If provided, the memorized route associated with this ID will be used.\n */\n memoryChannelId?: string;\n}\n\n/**\n * A pipe that restores a route with optional query parameters and memory channel ID.\n *\n * This pipe is used to transform a URL or SafeResourceUrl by appending query parameters\n * and adjusting the pathname based on the current active route and memorized route.\n */\n@Pipe({\n name: 'restoreRoute'\n})\nexport class RestoreRoute implements PipeTransform {\n private readonly activeRoute = inject(ActivatedRoute);\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly routeMemorizeService = inject(RouteMemorizeService, { optional: true });\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending query parameters and adjusting the pathname.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @param options - Optional parameters to control the transformation. {@see RestoreRouteOptions}\n * @returns - The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string, options?: Partial<RestoreRouteOptions>): string;\n public transform(url: SafeResourceUrl, options?: Partial<RestoreRouteOptions>): SafeResourceUrl;\n public transform(url: undefined, options?: Partial<RestoreRouteOptions>): undefined;\n public transform(url: string | SafeResourceUrl | undefined, options?: Partial<RestoreRouteOptions>): string | SafeResourceUrl | undefined {\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url || null);\n\n if (!url) {\n return undefined;\n }\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n const queryParamsModule = new URLSearchParams(moduleUrl.searchParams);\n\n const channelId = options?.memoryChannelId;\n const memorizedRoute = channelId && this.routeMemorizeService?.getRoute(channelId);\n const topWindowUrl = new URL(memorizedRoute ? window.origin + memorizedRoute : window.location.href);\n const queryParamsTopWindow = new URLSearchParams(topWindowUrl.search);\n\n if (options?.propagateQueryParams) {\n for (const [key, value] of queryParamsTopWindow) {\n if (options?.overrideQueryParams || !queryParamsModule.has(key)) {\n queryParamsModule.set(key, value);\n }\n }\n }\n moduleUrl.search = queryParamsModule.toString();\n moduleUrl.pathname += topWindowUrl.pathname.split(`/${this.activeRoute.routeConfig?.path}`).pop() || '';\n moduleUrl.pathname = moduleUrl.pathname.replace(/\\/{2,}/g, '/');\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n }\n}\n","import {\n type Logger,\n} from '@o3r/logger';\nimport {\n getHostInfo,\n} from '../host-info';\n\n/** Default suffix for an url containing a theme css file */\nexport const THEME_URL_SUFFIX = '-theme.css';\n/** Default name for the query parameter containing the theme name */\nexport const THEME_QUERY_PARAM_NAME = 'theme';\n\n/** Options and context for Style helpers */\nexport interface StyleHelperOptions {\n /**\n * Logger to reporter the logs\n */\n logger?: Logger;\n}\n\n/**\n * Fetches a CSS document and returns the content as a string.\n * @param cssPath - The path to download the CSS.\n * @param options Options and context for Style helpers\n * @returns The content of the CSS document as a string, empty string if the fetch fails.\n */\nexport async function getStyle(cssPath: string, options?: StyleHelperOptions): Promise<string> {\n try {\n const myRequest = new Request(cssPath);\n const response = await fetch(myRequest);\n const cssText = response.ok ? await response.text() : '';\n return cssText;\n } catch (error) {\n options?.logger?.warn(`Failed to download style from: ${cssPath} with error: ${error?.toString()}`);\n }\n return '';\n}\n\n/**\n * Applies the given CSS theme as a stylesheet.\n * @param themeValue - CSS as text containing a theme definition.\n * @param cleanPrevious - Whether to remove previously applied stylesheets if no themeValue provided. Default is true.\n */\nexport function applyTheme(themeValue?: string, cleanPrevious = true): void {\n if (themeValue !== undefined) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(themeValue);\n document.adoptedStyleSheets = cleanPrevious ? [sheet] : [...document.adoptedStyleSheets, sheet];\n } else if (cleanPrevious) { // remove the styles if the theme value comes undefined or empty string\n document.adoptedStyleSheets = [];\n }\n}\n\n/**\n * Download the application additional theme\n * @param theme Name of the theme to download from the current application\n * @param options Options and context for Style helpers\n */\nexport function downloadApplicationThemeCss(theme: string, options?: StyleHelperOptions) {\n const cssHref = `${theme.endsWith('.css') ? theme : theme + THEME_URL_SUFFIX}`;\n return getStyle(cssHref, options);\n}\n\n/**\n * Applies the initial theme based on the URL query parameters.\n *\n * This function fetches the CSS theme specified in the URL query parameters and applies it as a stylesheet.\n * If a referrer is present, it also attempts to fetch and apply the theme from the referrer's URL.\n * @param options Options and context for Style helpers\n */\nexport async function applyInitialTheme(options?: StyleHelperOptions): Promise<PromiseSettledResult<void>[] | undefined> {\n const searchParams = new URLSearchParams(window.location.search);\n const theme = searchParams.get(THEME_QUERY_PARAM_NAME);\n document.adoptedStyleSheets = [];\n if (theme) {\n const themeRequest: Promise<void>[] = [];\n themeRequest.push(downloadApplicationThemeCss(theme, options).then((styleToApply) => applyTheme(styleToApply, false)));\n const hostInfo = getHostInfo();\n if (hostInfo.hostURL) {\n const url = new URL(hostInfo.hostURL);\n url.pathname += `${url.pathname.endsWith('/') ? '' : '/'}${theme}`;\n themeRequest.unshift(getStyle(url.toString(), options).then((styleToApply) => applyTheme(styleToApply, false)));\n }\n\n return Promise.allSettled(themeRequest);\n }\n return undefined;\n}\n","import type {\n ThemeMessage,\n ThemeV1_0,\n} from '@ama-mfe/messages';\nimport {\n THEME_MESSAGE_TYPE,\n ThemeStructure,\n} from '@ama-mfe/messages';\nimport {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n type MessageProducer,\n registerProducer,\n} from '../managers/index';\nimport {\n type ErrorContent,\n} from '../messages/index';\nimport {\n applyTheme,\n getStyle,\n THEME_QUERY_PARAM_NAME,\n THEME_URL_SUFFIX,\n} from './theme.helpers';\n/**\n * This service exposing the current theme signal\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeProducerService implements MessageProducer<ThemeMessage> {\n private readonly messageService = inject(MessagePeerService<ThemeMessage>);\n private readonly logger = inject(LoggerService);\n private previousTheme: ThemeStructure | undefined;\n\n private readonly currentThemeSelection;\n /** Current selected theme signal */\n public readonly currentTheme;\n\n /**\n * The type of messages this service handles ('theme').\n */\n public readonly types = THEME_MESSAGE_TYPE;\n\n constructor() {\n registerProducer(this);\n\n // get the current theme name from the url (if any) and emit a first value for the current theme\n const parentUrl = new URL(window.location.toString());\n const selectedThemeName = parentUrl.searchParams.get(THEME_QUERY_PARAM_NAME);\n this.currentThemeSelection = signal<ThemeStructure | undefined>(selectedThemeName\n ? {\n name: selectedThemeName,\n css: null\n }\n : undefined);\n this.currentTheme = this.currentThemeSelection.asReadonly();\n\n if (selectedThemeName) {\n void this.changeTheme(selectedThemeName);\n }\n\n // When the current theme changes, apply it to the current application\n effect(() => {\n const themeObj = this.currentTheme();\n if (themeObj?.css !== null) {\n applyTheme(themeObj?.css);\n }\n });\n\n /**\n * This effect listens for changes in the `currentTheme` signal. If a valid theme object with CSS is present,\n * it creates a theme message and sends it via the message service.\n */\n effect(() => {\n const themeObj = this.currentTheme();\n if (themeObj && themeObj.css !== null) {\n const messageV10 = {\n type: 'theme',\n name: themeObj.name,\n css: themeObj.css,\n version: '1.0'\n } satisfies ThemeV1_0;\n // TODO: sendBest() is not yet implemented -- https://github.com/AmadeusITGroup/microfrontends/issues/11\n this.messageService.send(messageV10);\n }\n });\n }\n\n /**\n * Changes the current theme to the specified theme name.\n * @param themeName - The name of the theme to change to.\n */\n public async changeTheme(themeName?: string): Promise<void> {\n const cssHref = themeName && `${themeName}${THEME_URL_SUFFIX}`;\n const styleObj = cssHref ? await getStyle(cssHref) : '';\n this.currentThemeSelection.update((theme) => {\n this.previousTheme = theme;\n return themeName\n ? { name: themeName, css: styleObj }\n : undefined;\n });\n }\n\n /**\n * Reverts to the previous theme.\n */\n public revertToPreviousTheme(): void {\n this.currentThemeSelection.set(this.previousTheme);\n }\n\n /**\n * @inheritdoc\n */\n public handleError(message: ErrorContent<ThemeV1_0>): void {\n this.logger.error('Error in theme service message', message);\n this.revertToPreviousTheme();\n }\n}\n","import {\n inject,\n Pipe,\n PipeTransform,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n type SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n ThemeProducerService,\n} from './theme.producer.service';\n\n/**\n * A pipe that applies the current theme from a theme manager service, to a given URL or SafeResourceUrl, as query param\n */\n@Pipe({\n name: 'applyTheme'\n})\nexport class ApplyTheme implements PipeTransform {\n private readonly themeManagerService = inject(ThemeProducerService);\n private readonly domSanitizer = inject(DomSanitizer);\n\n /**\n * Transforms the given URL or SafeResourceUrl by appending the current theme value as a query parameter.\n * @param url - The URL or SafeResourceUrl to be transformed.\n * @returns The transformed SafeResourceUrl or undefined if the input URL is invalid.\n */\n public transform(url: string): string;\n public transform(url: SafeResourceUrl): SafeResourceUrl;\n public transform(url: undefined): undefined;\n public transform(url: string | SafeResourceUrl | undefined): string | SafeResourceUrl | undefined {\n if (!url) {\n return undefined;\n }\n const currentTheme = this.themeManagerService.currentTheme();\n const urlString = typeof url === 'string'\n ? url\n : this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, url);\n\n if (urlString) {\n const moduleUrl = new URL(urlString);\n if (currentTheme) {\n moduleUrl.searchParams.set('theme', currentTheme.name);\n }\n const moduleUrlStringyfied = moduleUrl.toString();\n return typeof url === 'string' ? moduleUrlStringyfied : this.domSanitizer.bypassSecurityTrustResourceUrl(moduleUrlStringyfied);\n }\n\n return undefined;\n }\n}\n","import type {\n ThemeMessage,\n ThemeV1_0,\n} from '@ama-mfe/messages';\nimport {\n THEME_MESSAGE_TYPE,\n} from '@ama-mfe/messages';\nimport type {\n RoutedMessage,\n} from '@amadeus-it-group/microfrontends';\nimport {\n DestroyRef,\n inject,\n Injectable,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n} from '@angular/platform-browser';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n ConsumerManagerService,\n MessageConsumer,\n} from '../managers/index';\nimport {\n applyTheme,\n downloadApplicationThemeCss,\n} from './theme.helpers';\n\n/**\n * A service that handles theme messages and applies the received theme.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeConsumerService implements MessageConsumer<ThemeMessage> {\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly consumerManagerService = inject(ConsumerManagerService);\n private readonly logger = inject(LoggerService);\n /**\n * The type of messages this service handles ('theme').\n */\n public readonly type = THEME_MESSAGE_TYPE;\n\n /**\n * The supported versions of theme messages and their handlers.\n */\n public readonly supportedVersions = {\n /**\n * Use the message paylod to get the theme and apply it\n * @param message message to consume\n */\n '1.0': async (message: RoutedMessage<ThemeV1_0>) => {\n const sanitizedCss = this.domSanitizer.sanitize(SecurityContext.STYLE, message.payload.css);\n if (sanitizedCss !== null) {\n applyTheme(sanitizedCss);\n }\n try {\n const css = await downloadApplicationThemeCss(message.payload.name, { logger: this.logger });\n applyTheme(css, false);\n } catch (e) {\n this.logger.warn(`No CSS variable for the theme ${message.payload.name}`, e);\n }\n }\n };\n\n constructor() {\n this.start();\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /**\n * Starts the theme handler service by registering it into the consumer manager service.\n */\n public start() {\n this.consumerManagerService.register(this);\n }\n\n /**\n * Stops the theme handler service by unregistering it from the consumer manager service.\n */\n public stop() {\n this.consumerManagerService.unregister(this);\n }\n}\n","import {\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n SecurityContext,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n LoggerService,\n} from '@o3r/logger';\n\n@Directive({\n selector: 'iframe[connect]',\n standalone: true\n})\nexport class ConnectDirective {\n /**\n * The connection ID required for the message peer service.\n */\n public connect = input.required<string>();\n\n /**\n * The sanitized source URL for the iframe.\n */\n public src = input<SafeResourceUrl>();\n\n /**\n * Binds the `src` attribute of the iframe to the sanitized source URL.\n */\n @HostBinding('src')\n public get srcAttr() {\n return this.src();\n }\n\n private readonly messageService = inject(MessagePeerService);\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly elRef = inject(ElementRef);\n\n private readonly clientOrigin = computed(() => {\n const src = this.src();\n const srcString = src && this.domSanitizer.sanitize(SecurityContext.RESOURCE_URL, src);\n return srcString && new URL(srcString).origin;\n });\n\n constructor() {\n const logger = inject(LoggerService);\n // When the origin url or the peer id changes it will remake the connection with the new updates. The old connection is closed\n effect(async () => {\n const clientOrigin = this.clientOrigin();\n const connectId = this.connect();\n const moduleWindow = (this.elRef.nativeElement as HTMLIFrameElement).contentWindow;\n\n this.messageService.disconnect();\n if (clientOrigin && moduleWindow) {\n try {\n await this.messageService.listen(connectId, {\n window: moduleWindow,\n origin: clientOrigin\n });\n } catch (e) {\n logger.error(`Fail to connect to client (connection ID: ${connectId})`, e);\n }\n }\n });\n // When the directive is destroyed clean up the connection too.\n inject(DestroyRef).onDestroy(() => this.messageService.disconnect());\n }\n}\n","import {\n provideAppInitializer,\n} from '@angular/core';\n\n/**\n * No operation function used to override the history API methods.\n */\nexport function noop() {}\n\n/**\n * If an iframe is not sandboxed or is of the same origin, navigation inside it will mess up the main window history.\n * This disables writing to and overriding history API from inside the iframe to prevent this.\n * Theoretically, this might break applications that rely on reading history API from inside the iframe.\n *\n * This should also allow having `CustomPathLocationStrategy` in the iframe if necessary.\n */\nexport function provideDisableHistoryWrites() {\n return provideAppInitializer(() => {\n Object.defineProperty(history, 'pushState', { value: noop, writable: false, configurable: false });\n Object.defineProperty(history, 'replaceState', { value: noop, writable: false, configurable: false });\n });\n}\n","import {\n MESSAGE_PEER_CONFIG,\n MESSAGE_PEER_CONNECT_OPTIONS,\n MessagePeerConfig,\n MessagePeerService,\n} from '@amadeus-it-group/microfrontends-angular';\nimport {\n makeEnvironmentProviders,\n} from '@angular/core';\nimport {\n type Logger,\n} from '@o3r/logger';\nimport {\n provideDisableHistoryWrites,\n} from '../history';\nimport {\n getHostInfo,\n persistHostInfo,\n} from '../host-info';\nimport {\n getDefaultClientEndpointStartOptions,\n isEmbedded,\n KNOWN_MESSAGES,\n} from '../utils';\nimport {\n ConnectionConfig,\n ConnectionService,\n} from './connect.resources';\n\n/** Options to configure the connection inside the communication protocol */\nexport interface ConnectionConfigOptions extends Omit<ConnectionConfig, 'id'> {\n /** @inheritdoc */\n id?: string;\n /** Logger used to gather information */\n logger?: Logger;\n}\n\n/**\n * Provide the communication protocol connection configuration\n * @param connectionConfigOptions The identifier of the application in the communication protocol ecosystem plus the types of messages able to exchange and a logger object\n */\nexport function provideConnection(connectionConfigOptions?: ConnectionConfigOptions) {\n persistHostInfo();\n const connectionId = getHostInfo().moduleApplicationId || connectionConfigOptions?.id;\n if (!connectionId) {\n (connectionConfigOptions?.logger || console).error('An id (moduleId) needs to be provided for the application in order to establish a connection inside the communication protocol');\n return makeEnvironmentProviders([]);\n }\n const config: MessagePeerConfig = {\n id: connectionId,\n messageCheckStrategy: 'version',\n knownMessages: [...KNOWN_MESSAGES, ...(connectionConfigOptions?.knownMessages || [])]\n };\n return makeEnvironmentProviders([\n {\n provide: MESSAGE_PEER_CONFIG, useValue: config\n },\n {\n provide: MESSAGE_PEER_CONNECT_OPTIONS, useValue: getDefaultClientEndpointStartOptions()\n },\n {\n // in the case of the ConnectionService will extend the base service 'useExisting' should be used\n provide: MessagePeerService, useClass: ConnectionService, deps: [MESSAGE_PEER_CONFIG]\n },\n // deactivate history writes to avoid embedded app writing to the host history\n ...isEmbedded() ? [provideDisableHistoryWrites()] : []\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["ConnectionService"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No operation function used to override the history API methods.
|
|
3
|
+
*/
|
|
4
|
+
export declare function noop(): void;
|
|
5
|
+
/**
|
|
6
|
+
* If an iframe is not sandboxed or is of the same origin, navigation inside it will mess up the main window history.
|
|
7
|
+
* This disables writing to and overriding history API from inside the iframe to prevent this.
|
|
8
|
+
* Theoretically, this might break applications that rely on reading history API from inside the iframe.
|
|
9
|
+
*
|
|
10
|
+
* This should also allow having `CustomPathLocationStrategy` in the iframe if necessary.
|
|
11
|
+
*/
|
|
12
|
+
export declare function provideDisableHistoryWrites(): import("@angular/core").EnvironmentProviders;
|
|
13
|
+
//# sourceMappingURL=history.providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.providers.d.ts","sourceRoot":"","sources":["../../src/history/history.providers.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,IAAI,SAAK;AAEzB;;;;;;GAMG;AACH,wBAAgB,2BAA2B,iDAK1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC"}
|
package/managers/interfaces.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface BasicMessageConsumer<T extends VersionedMessage = VersionedMess
|
|
|
20
20
|
supportedVersions: Record<string, MessageCallback<any>>;
|
|
21
21
|
}
|
|
22
22
|
/** The consumer of a given message type */
|
|
23
|
-
export interface MessageConsumer<T extends VersionedMessage> extends BasicMessageConsumer {
|
|
23
|
+
export interface MessageConsumer<T extends VersionedMessage = VersionedMessage> extends BasicMessageConsumer {
|
|
24
24
|
/** The message type which will be handled */
|
|
25
25
|
type: T['type'];
|
|
26
26
|
/** The map of functions which will be executed for each supported version */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/managers/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACV,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9G;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB;IACzD,uDAAuD;IACvD,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;CACvC;AAED,gDAAgD;AAChD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IACjF,gCAAgC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAChB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;CACzD;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB,CAAE,SAAQ,oBAAoB;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/managers/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACV,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9G;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB;IACzD,uDAAuD;IACvD,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;CACvC;AAED,gDAAgD;AAChD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IACjF,gCAAgC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAChB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;CACzD;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,oBAAoB;IAE1G,6CAA6C;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAChB,6EAA6E;IAC7E,iBAAiB,EAAE;SAIhB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC,CAAA;SAAE,CAAC;KACzD,CAAC;IAEF,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAAC;IACd,8BAA8B;IAC9B,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IAC5E,wCAAwC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAE/B;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D"}
|
package/managers/utils.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type { MessageProducer } from './interfaces';
|
|
1
|
+
import type { MessageConsumer, MessageProducer } from './interfaces';
|
|
2
2
|
/**
|
|
3
3
|
* Method to call in the constructor of a producer
|
|
4
4
|
* @note should be used in injection context
|
|
5
5
|
* @param producer
|
|
6
6
|
*/
|
|
7
7
|
export declare const registerProducer: (producer: MessageProducer) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Method to call in the constructor of a consumer
|
|
10
|
+
* @note should be used in injection context
|
|
11
|
+
* @param consumer
|
|
12
|
+
*/
|
|
13
|
+
export declare const registerConsumer: (consumer: MessageConsumer) => void;
|
|
8
14
|
//# sourceMappingURL=utils.d.ts.map
|
package/managers/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/managers/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/managers/utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAChB,MAAM,cAAc,CAAC;AAKtB;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,eAAe,SAOzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,eAAe,SAOzD,CAAC"}
|
package/navigation/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
|
|
@@ -42,9 +42,8 @@ export declare class NavigationConsumerService implements MessageConsumer<Naviga
|
|
|
42
42
|
*/
|
|
43
43
|
private parseUrl;
|
|
44
44
|
/**
|
|
45
|
-
* Navigates to the specified URL
|
|
45
|
+
* Navigates to the specified URL.
|
|
46
46
|
* @param url - The URL to navigate to.
|
|
47
|
-
* @param channelId - The optional channel ID for the navigation state. This is the endpoint from where the message is received
|
|
48
47
|
*/
|
|
49
48
|
private navigate;
|
|
50
49
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.consumer.service.d.ts","sourceRoot":"","sources":["../../src/navigation/navigation.consumer.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,aAAa,EACd,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;;AAE3B;;;;GAIG;AACH,qBAGa,yBAA0B,YAAW,eAAe,CAAC,iBAAiB,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAEnF;;OAEG;IACH,SAAgB,aAAa;aALsB,MAAM;oBAAc,MAAM;OAKZ;IAEjE;;OAEG;IACH,SAAgB,IAAI,gBAA2B;IAE/C;;OAEG;IACH,SAAgB,iBAAiB;QAC/B;;;;WAIG;yBACc,aAAa,CAAC,cAAc,CAAC;MAK9C;IAEF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;;IAOzE;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAOhB
|
|
1
|
+
{"version":3,"file":"navigation.consumer.service.d.ts","sourceRoot":"","sources":["../../src/navigation/navigation.consumer.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,aAAa,EACd,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;;AAE3B;;;;GAIG;AACH,qBAGa,yBAA0B,YAAW,eAAe,CAAC,iBAAiB,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAEnF;;OAEG;IACH,SAAgB,aAAa;aALsB,MAAM;oBAAc,MAAM;OAKZ;IAEjE;;OAEG;IACH,SAAgB,IAAI,gBAA2B;IAE/C;;OAEG;IACH,SAAgB,iBAAiB;QAC/B;;;;WAIG;yBACc,aAAa,CAAC,cAAc,CAAC;MAK9C;IAEF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;;IAOzE;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACI,KAAK;IAIZ;;OAEG;IACI,IAAI;yCAvEA,yBAAyB;6CAAzB,yBAAyB;CA0ErC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { NavigationMessage, NavigationV1_0 } from '@ama-mfe/messages';
|
|
2
|
-
import {
|
|
2
|
+
import type { RoutedMessage } from '@amadeus-it-group/microfrontends';
|
|
3
|
+
import { type MessageConsumer, type MessageProducer } from '../managers/index';
|
|
3
4
|
import { type ErrorContent } from '../messages/error';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
/** Options for the routing handling in case of navigation producer message */
|
|
@@ -12,12 +13,12 @@ export interface RoutingServiceOptions {
|
|
|
12
13
|
subRouteOnly?: boolean;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
|
-
* A service that
|
|
16
|
+
* A service that keeps in sync Router navigation and navigation messages.
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* - listens to Router events and sends navigation messages
|
|
19
|
+
* - handles incoming navigation messages and triggers Router navigation
|
|
19
20
|
*/
|
|
20
|
-
export declare class RoutingService implements MessageProducer<NavigationMessage> {
|
|
21
|
+
export declare class RoutingService implements MessageProducer<NavigationMessage>, MessageConsumer<NavigationMessage> {
|
|
21
22
|
private readonly router;
|
|
22
23
|
private readonly activatedRoute;
|
|
23
24
|
private readonly messageService;
|
|
@@ -26,7 +27,26 @@ export declare class RoutingService implements MessageProducer<NavigationMessage
|
|
|
26
27
|
* @inheritdoc
|
|
27
28
|
*/
|
|
28
29
|
readonly types = "navigation";
|
|
30
|
+
/**
|
|
31
|
+
* @inheritdoc
|
|
32
|
+
*/
|
|
33
|
+
readonly type = "navigation";
|
|
34
|
+
/**
|
|
35
|
+
* Use the message payload to navigate to the specified URL.
|
|
36
|
+
* @param message message to consume
|
|
37
|
+
*/
|
|
38
|
+
readonly supportedVersions: {
|
|
39
|
+
'1.0': (message: RoutedMessage<any>) => Promise<void>;
|
|
40
|
+
};
|
|
29
41
|
constructor();
|
|
42
|
+
/**
|
|
43
|
+
* @inheritdoc
|
|
44
|
+
*/
|
|
45
|
+
start(): void;
|
|
46
|
+
/**
|
|
47
|
+
* @inheritdoc
|
|
48
|
+
*/
|
|
49
|
+
stop(): void;
|
|
30
50
|
/**
|
|
31
51
|
* @inheritdoc
|
|
32
52
|
*/
|
|
@@ -41,4 +61,4 @@ export declare class RoutingService implements MessageProducer<NavigationMessage
|
|
|
41
61
|
static ɵfac: i0.ɵɵFactoryDeclaration<RoutingService, never>;
|
|
42
62
|
static ɵprov: i0.ɵɵInjectableDeclaration<RoutingService>;
|
|
43
63
|
}
|
|
44
|
-
//# sourceMappingURL=
|
|
64
|
+
//# sourceMappingURL=routing.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.service.d.ts","sourceRoot":"","sources":["../../src/navigation/routing.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EACV,aAAa,EACd,MAAM,kCAAkC,CAAC;AAuB1C,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;;AAK3B,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAGa,cAAe,YAAW,eAAe,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC;IAC3G,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAChF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD;;OAEG;IACH,SAAgB,KAAK,gBAA2B;IAEhD;;OAEG;IACH,SAAgB,IAAI,gBAAgB;IAEpC;;;OAGG;IACH,SAAgB,iBAAiB;yBACR,aAAa,CAAC,GAAG,CAAC;MAGzC;;IAOF;;OAEG;IACI,KAAK,IAAI,IAAI;IAEpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAEnB;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,IAAI;IAI/D;;;;;OAKG;IACI,qBAAqB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;yCAtDxD,cAAc;6CAAd,cAAc;CAsF1B"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ama-mfe/ng-utils",
|
|
3
|
-
"version": "12.4.0-prerelease.
|
|
3
|
+
"version": "12.4.0-prerelease.40",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"peerDependencies": {
|
|
8
|
-
"@ama-mfe/messages": "^12.4.0-prerelease.
|
|
8
|
+
"@ama-mfe/messages": "^12.4.0-prerelease.40",
|
|
9
9
|
"@amadeus-it-group/microfrontends": "0.0.7",
|
|
10
10
|
"@amadeus-it-group/microfrontends-angular": "0.0.7",
|
|
11
11
|
"@angular-devkit/core": "~19.2.0",
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"@angular/core": "^19.0.0",
|
|
15
15
|
"@angular/platform-browser": "~19.2.0",
|
|
16
16
|
"@angular/router": "~19.2.0",
|
|
17
|
-
"@o3r/logger": "^12.4.0-prerelease.
|
|
18
|
-
"@o3r/schematics": "^12.4.0-prerelease.
|
|
17
|
+
"@o3r/logger": "^12.4.0-prerelease.40",
|
|
18
|
+
"@o3r/schematics": "^12.4.0-prerelease.40",
|
|
19
19
|
"rxjs": "^7.8.1"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@amadeus-it-group/microfrontends": "0.0.7",
|
|
23
23
|
"@amadeus-it-group/microfrontends-angular": "0.0.7",
|
|
24
|
-
"@o3r/logger": "^12.4.0-prerelease.
|
|
25
|
-
"@o3r/schematics": "^12.4.0-prerelease.
|
|
24
|
+
"@o3r/logger": "^12.4.0-prerelease.40",
|
|
25
|
+
"@o3r/schematics": "^12.4.0-prerelease.40",
|
|
26
26
|
"tslib": "^2.6.2"
|
|
27
27
|
},
|
|
28
28
|
"sideEffects": false,
|
|
@@ -2,13 +2,6 @@ import type { ResizeMessage } from '@ama-mfe/messages';
|
|
|
2
2
|
import { type MessageProducer } from '../managers/index';
|
|
3
3
|
import { type ErrorContent } from '../messages/index';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* `scrollHeight` is a rounded number (cf https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight)
|
|
7
|
-
*
|
|
8
|
-
* So we have to add a delta to ensure no scrollbar will appear on the host,
|
|
9
|
-
* in case the `scrollHeight` is rounded down
|
|
10
|
-
*/
|
|
11
|
-
export declare const DELTA_RESIZE = 1;
|
|
12
5
|
/**
|
|
13
6
|
* This service observe changes in the document's body height.
|
|
14
7
|
* When the height changes, it sends a resize message with the new height, to the connected peers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resize.producer.service.d.ts","sourceRoot":"","sources":["../../src/resize/resize.producer.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;;AAE3B
|
|
1
|
+
{"version":3,"file":"resize.producer.service.d.ts","sourceRoot":"","sources":["../../src/resize/resize.producer.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;;AAE3B;;;GAGG;AACH,qBAGa,aAAc,YAAW,eAAe,CAAC,aAAa,CAAC;IAClE,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,cAAc,CAAC,CAAiB;IAExC;;OAEG;IACH,SAAgB,KAAK,YAAuB;;IAM5C;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI;IAK9D;;;OAGG;IACI,mBAAmB;yCA1Bf,aAAa;6CAAb,aAAa;CA2CzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.producer.service.d.ts","sourceRoot":"","sources":["../../src/navigation/navigation.producer.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AA0B3B,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;;AAK3B,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAGa,cAAe,YAAW,eAAe,CAAC,iBAAiB,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAChF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD;;OAEG;IACH,SAAgB,KAAK,gBAA2B;;IAMhD;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,IAAI;IAI/D;;;;;OAKG;IACI,qBAAqB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;yCA5BxD,cAAc;6CAAd,cAAc;CA4D1B"}
|