ng-wsl-library 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/services/public-api.mjs +2 -1
- package/esm2020/lib/services/wsl-microfrontend.service.mjs +61 -0
- package/fesm2015/ng-wsl-library.mjs +58 -1
- package/fesm2015/ng-wsl-library.mjs.map +1 -1
- package/fesm2020/ng-wsl-library.mjs +62 -1
- package/fesm2020/ng-wsl-library.mjs.map +1 -1
- package/lib/services/public-api.d.ts +1 -0
- package/lib/services/wsl-microfrontend.service.d.ts +22 -0
- package/package.json +4 -2
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export * from './wsl-cms.service';
|
|
5
5
|
export * from './wsl-config.service';
|
|
6
|
-
|
|
6
|
+
export * from './wsl-microfrontend.service';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvc2VydmljZXMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5nLXdzbC1saWJyYXJ5XHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi93c2wtY21zLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3dzbC1jb25maWcuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vd3NsLW1pY3JvZnJvbnRlbmQuc2VydmljZSdcclxuIl19
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { registerApplication, start } from 'single-spa';
|
|
2
|
+
class WslMicroFrontendService {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.sharedData = {};
|
|
5
|
+
this.eventBus = {};
|
|
6
|
+
}
|
|
7
|
+
// Configurar aplicación principal y micro frontends hijos
|
|
8
|
+
configure(config) {
|
|
9
|
+
this.sharedData = config.sharedData || {};
|
|
10
|
+
// Registrar todas las aplicaciones
|
|
11
|
+
config.applications.forEach(appConfig => {
|
|
12
|
+
registerApplication({
|
|
13
|
+
name: appConfig.name,
|
|
14
|
+
app: appConfig.app,
|
|
15
|
+
activeWhen: appConfig.activeWhen,
|
|
16
|
+
customProps: {
|
|
17
|
+
...appConfig.customProps,
|
|
18
|
+
eventBus: {
|
|
19
|
+
emit: this.emit.bind(this),
|
|
20
|
+
on: this.on.bind(this)
|
|
21
|
+
},
|
|
22
|
+
sharedData: {
|
|
23
|
+
get: this.getSharedData.bind(this),
|
|
24
|
+
set: this.setSharedData.bind(this)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// Iniciar single-spa
|
|
30
|
+
start();
|
|
31
|
+
}
|
|
32
|
+
// Sistema de eventos
|
|
33
|
+
emit(eventName, data) {
|
|
34
|
+
if (!this.eventBus[eventName]) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this.eventBus[eventName].forEach(callback => {
|
|
38
|
+
callback(data);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
on(eventName, callback) {
|
|
42
|
+
if (!this.eventBus[eventName]) {
|
|
43
|
+
this.eventBus[eventName] = [];
|
|
44
|
+
}
|
|
45
|
+
this.eventBus[eventName].push(callback);
|
|
46
|
+
// Retornar función para eliminar el oyente
|
|
47
|
+
return () => {
|
|
48
|
+
this.eventBus[eventName] = this.eventBus[eventName].filter(cb => cb !== callback);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Gestión de datos compartidos
|
|
52
|
+
getSharedData(key) {
|
|
53
|
+
return this.sharedData[key];
|
|
54
|
+
}
|
|
55
|
+
setSharedData(key, value) {
|
|
56
|
+
this.sharedData[key] = value;
|
|
57
|
+
this.emit('sharedData:changed', { key, value });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export const wslMicroFrontendService = new WslMicroFrontendService();
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLW1pY3JvZnJvbnRlbmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvc2VydmljZXMvd3NsLW1pY3JvZnJvbnRlbmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBZXhELE1BQU0sdUJBQXVCO0lBQTdCO1FBQ1UsZUFBVSxHQUF3QixFQUFFLENBQUM7UUFDckMsYUFBUSxHQUErQixFQUFFLENBQUM7SUErRHBELENBQUM7SUE3REMsMERBQTBEO0lBQzFELFNBQVMsQ0FBQyxNQUFxQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBRTFDLG1DQUFtQztRQUNuQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0QyxtQkFBbUIsQ0FBQztnQkFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2dCQUNwQixHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7Z0JBQ2xCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtnQkFDaEMsV0FBVyxFQUFFO29CQUNYLEdBQUcsU0FBUyxDQUFDLFdBQVc7b0JBQ3hCLFFBQVEsRUFBRTt3QkFDUixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUMxQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUN2QjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDbEMsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDbkM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQixLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxDQUFDLFNBQWlCLEVBQUUsSUFBVTtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsRUFBRSxDQUFDLFNBQWlCLEVBQUUsUUFBa0I7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDL0I7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4QywyQ0FBMkM7UUFDM0MsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsYUFBYSxDQUFDLEdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVyxFQUFFLEtBQVU7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlZ2lzdGVyQXBwbGljYXRpb24sIHN0YXJ0IH0gZnJvbSAnc2luZ2xlLXNwYSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1pY3JvRnJvbnRDb25maWcge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBhcHA6ICgpID0+IFByb21pc2U8YW55PjtcclxuICBhY3RpdmVXaGVuOiBzdHJpbmcgfCAoKGxvY2F0aW9uOiBMb2NhdGlvbikgPT4gYm9vbGVhbik7XHJcbiAgY3VzdG9tUHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1haW5BcHBDb25maWcge1xyXG4gIGRvbUVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIGFwcGxpY2F0aW9uczogTWljcm9Gcm9udENvbmZpZ1tdO1xyXG4gIHNoYXJlZERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG59XHJcblxyXG5jbGFzcyBXc2xNaWNyb0Zyb250ZW5kU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBzaGFyZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgcHJpdmF0ZSBldmVudEJ1czogUmVjb3JkPHN0cmluZywgRnVuY3Rpb25bXT4gPSB7fTtcclxuICBcclxuICAvLyBDb25maWd1cmFyIGFwbGljYWNpw7NuIHByaW5jaXBhbCB5IG1pY3JvIGZyb250ZW5kcyBoaWpvc1xyXG4gIGNvbmZpZ3VyZShjb25maWc6IE1haW5BcHBDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hhcmVkRGF0YSA9IGNvbmZpZy5zaGFyZWREYXRhIHx8IHt9O1xyXG4gICAgXHJcbiAgICAvLyBSZWdpc3RyYXIgdG9kYXMgbGFzIGFwbGljYWNpb25lc1xyXG4gICAgY29uZmlnLmFwcGxpY2F0aW9ucy5mb3JFYWNoKGFwcENvbmZpZyA9PiB7XHJcbiAgICAgIHJlZ2lzdGVyQXBwbGljYXRpb24oe1xyXG4gICAgICAgIG5hbWU6IGFwcENvbmZpZy5uYW1lLFxyXG4gICAgICAgIGFwcDogYXBwQ29uZmlnLmFwcCxcclxuICAgICAgICBhY3RpdmVXaGVuOiBhcHBDb25maWcuYWN0aXZlV2hlbixcclxuICAgICAgICBjdXN0b21Qcm9wczoge1xyXG4gICAgICAgICAgLi4uYXBwQ29uZmlnLmN1c3RvbVByb3BzLFxyXG4gICAgICAgICAgZXZlbnRCdXM6IHtcclxuICAgICAgICAgICAgZW1pdDogdGhpcy5lbWl0LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIG9uOiB0aGlzLm9uLmJpbmQodGhpcylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzaGFyZWREYXRhOiB7XHJcbiAgICAgICAgICAgIGdldDogdGhpcy5nZXRTaGFyZWREYXRhLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIHNldDogdGhpcy5zZXRTaGFyZWREYXRhLmJpbmQodGhpcylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIEluaWNpYXIgc2luZ2xlLXNwYVxyXG4gICAgc3RhcnQoKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gU2lzdGVtYSBkZSBldmVudG9zXHJcbiAgZW1pdChldmVudE5hbWU6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50QnVzW2V2ZW50TmFtZV0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmV2ZW50QnVzW2V2ZW50TmFtZV0uZm9yRWFjaChjYWxsYmFjayA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiAoKSA9PiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ldmVudEJ1c1tldmVudE5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRCdXNbZXZlbnROYW1lXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmV2ZW50QnVzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XHJcbiAgICBcclxuICAgIC8vIFJldG9ybmFyIGZ1bmNpw7NuIHBhcmEgZWxpbWluYXIgZWwgb3llbnRlXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB0aGlzLmV2ZW50QnVzW2V2ZW50TmFtZV0gPSB0aGlzLmV2ZW50QnVzW2V2ZW50TmFtZV0uZmlsdGVyKGNiID0+IGNiICE9PSBjYWxsYmFjayk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvLyBHZXN0acOzbiBkZSBkYXRvcyBjb21wYXJ0aWRvc1xyXG4gIGdldFNoYXJlZERhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YVtrZXldO1xyXG4gIH1cclxuICBcclxuICBzZXRTaGFyZWREYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNoYXJlZERhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgdGhpcy5lbWl0KCdzaGFyZWREYXRhOmNoYW5nZWQnLCB7IGtleSwgdmFsdWUgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgd3NsTWljcm9Gcm9udGVuZFNlcnZpY2UgPSBuZXcgV3NsTWljcm9Gcm9udGVuZFNlcnZpY2UoKTsgIl19
|
|
@@ -6,6 +6,7 @@ import { CommonModule } from '@angular/common';
|
|
|
6
6
|
import * as i2$1 from 'ngx-slick-carousel';
|
|
7
7
|
import { SlickCarouselModule } from 'ngx-slick-carousel';
|
|
8
8
|
import { cloneDeep } from 'lodash';
|
|
9
|
+
import { registerApplication, start } from 'single-spa';
|
|
9
10
|
import * as i4 from '@angular/cdk/drag-drop';
|
|
10
11
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
11
12
|
import * as i2$2 from '@angular/material/form-field';
|
|
@@ -469,6 +470,62 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
469
470
|
}]
|
|
470
471
|
}], ctorParameters: function () { return []; } });
|
|
471
472
|
|
|
473
|
+
class WslMicroFrontendService {
|
|
474
|
+
constructor() {
|
|
475
|
+
this.sharedData = {};
|
|
476
|
+
this.eventBus = {};
|
|
477
|
+
}
|
|
478
|
+
// Configurar aplicación principal y micro frontends hijos
|
|
479
|
+
configure(config) {
|
|
480
|
+
this.sharedData = config.sharedData || {};
|
|
481
|
+
// Registrar todas las aplicaciones
|
|
482
|
+
config.applications.forEach(appConfig => {
|
|
483
|
+
registerApplication({
|
|
484
|
+
name: appConfig.name,
|
|
485
|
+
app: appConfig.app,
|
|
486
|
+
activeWhen: appConfig.activeWhen,
|
|
487
|
+
customProps: Object.assign(Object.assign({}, appConfig.customProps), { eventBus: {
|
|
488
|
+
emit: this.emit.bind(this),
|
|
489
|
+
on: this.on.bind(this)
|
|
490
|
+
}, sharedData: {
|
|
491
|
+
get: this.getSharedData.bind(this),
|
|
492
|
+
set: this.setSharedData.bind(this)
|
|
493
|
+
} })
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
// Iniciar single-spa
|
|
497
|
+
start();
|
|
498
|
+
}
|
|
499
|
+
// Sistema de eventos
|
|
500
|
+
emit(eventName, data) {
|
|
501
|
+
if (!this.eventBus[eventName]) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
this.eventBus[eventName].forEach(callback => {
|
|
505
|
+
callback(data);
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
on(eventName, callback) {
|
|
509
|
+
if (!this.eventBus[eventName]) {
|
|
510
|
+
this.eventBus[eventName] = [];
|
|
511
|
+
}
|
|
512
|
+
this.eventBus[eventName].push(callback);
|
|
513
|
+
// Retornar función para eliminar el oyente
|
|
514
|
+
return () => {
|
|
515
|
+
this.eventBus[eventName] = this.eventBus[eventName].filter(cb => cb !== callback);
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
// Gestión de datos compartidos
|
|
519
|
+
getSharedData(key) {
|
|
520
|
+
return this.sharedData[key];
|
|
521
|
+
}
|
|
522
|
+
setSharedData(key, value) {
|
|
523
|
+
this.sharedData[key] = value;
|
|
524
|
+
this.emit('sharedData:changed', { key, value });
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
const wslMicroFrontendService = new WslMicroFrontendService();
|
|
528
|
+
|
|
472
529
|
/*
|
|
473
530
|
* Public API Surface of ng-wsl-library
|
|
474
531
|
*/
|
|
@@ -1261,5 +1318,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1261
1318
|
* Generated bundle index. Do not edit.
|
|
1262
1319
|
*/
|
|
1263
1320
|
|
|
1264
|
-
export { CLASS_OPTIONS, CMS_COMPONENTS, CmsEditorComponent, CmsEditorMainMenuComponent, CmsEditorSliderComponent, CmsItemComponent, CmsItemOptionsComponent, DEFAULT_DATA, DEFAULT_MAIN_MENU, DEFAULT_SLIDER, DIRECTION_OPEN, MOCK_CMS, RelativePosition, TYPE_COMPONENTS, WslButtonComponent, WslCmsAddComponentsComponent, WslCmsComponent, WslCmsEditorModule, WslCmsModule, WslCmsService, WslComponentsModule, WslConfigService, WslCurrencyPipe, WslDirectivesModule, WslDynamicComponentDirective, WslHeaderComponent, WslPipesModule, WslSliderComponent };
|
|
1321
|
+
export { CLASS_OPTIONS, CMS_COMPONENTS, CmsEditorComponent, CmsEditorMainMenuComponent, CmsEditorSliderComponent, CmsItemComponent, CmsItemOptionsComponent, DEFAULT_DATA, DEFAULT_MAIN_MENU, DEFAULT_SLIDER, DIRECTION_OPEN, MOCK_CMS, RelativePosition, TYPE_COMPONENTS, WslButtonComponent, WslCmsAddComponentsComponent, WslCmsComponent, WslCmsEditorModule, WslCmsModule, WslCmsService, WslComponentsModule, WslConfigService, WslCurrencyPipe, WslDirectivesModule, WslDynamicComponentDirective, WslHeaderComponent, WslPipesModule, WslSliderComponent, wslMicroFrontendService };
|
|
1265
1322
|
//# sourceMappingURL=ng-wsl-library.mjs.map
|