aril 1.2.36 → 1.2.38
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/boot/config/api/src/api.service.d.ts +2 -1
- package/esm2022/boot/config/api/src/api.service.mjs +24 -7
- package/esm2022/boot/host/src/bootstrap.mjs +13 -4
- package/esm2022/permission/aril-permission.mjs +5 -0
- package/esm2022/permission/index.mjs +4 -0
- package/esm2022/permission/src/constants.mjs +4 -0
- package/esm2022/permission/src/has-permission.directive.mjs +49 -0
- package/esm2022/permission/src/permission.service.mjs +57 -0
- package/esm2022/provider/src/index.mjs +2 -1
- package/esm2022/provider/src/prodiveHost.mjs +3 -2
- package/esm2022/provider/src/provideHostPermissions.mjs +43 -0
- package/esm2022/theme/layout/app/notifications/notifications-sidebar.component.mjs +146 -49
- package/esm2022/theme/layout/service/interfaces/interfaces.mjs +1 -1
- package/esm2022/theme/layout/service/notifications.service.mjs +8 -2
- package/fesm2022/{aril-app.component-W3wwVSp1.mjs → aril-app.component-BUjucZ0J.mjs} +2 -1
- package/fesm2022/{aril-app.component-W3wwVSp1.mjs.map → aril-app.component-BUjucZ0J.mjs.map} +1 -1
- package/fesm2022/aril-boot-config-api.mjs +23 -6
- package/fesm2022/aril-boot-config-api.mjs.map +1 -1
- package/fesm2022/aril-boot-host.mjs +12 -3
- package/fesm2022/aril-boot-host.mjs.map +1 -1
- package/fesm2022/aril-permission.mjs +114 -0
- package/fesm2022/aril-permission.mjs.map +1 -0
- package/fesm2022/aril-provider.mjs +44 -2
- package/fesm2022/aril-provider.mjs.map +1 -1
- package/fesm2022/aril-theme-layout.mjs +145 -39
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/fesm2022/aril.mjs +13 -4
- package/fesm2022/aril.mjs.map +1 -1
- package/package.json +87 -81
- package/permission/index.d.ts +3 -0
- package/permission/src/constants.d.ts +1 -0
- package/permission/src/has-permission.directive.d.ts +16 -0
- package/permission/src/permission.service.d.ts +15 -0
- package/provider/src/index.d.ts +1 -0
- package/provider/src/provideHostPermissions.d.ts +6 -0
- package/theme/layout/app/notifications/notifications-sidebar.component.d.ts +2288 -2267
- package/theme/layout/app/notifications/notifications-sidebar.component.html +66 -68
- package/theme/layout/app/notifications/notifications-sidebar.component.scss +234 -120
- package/theme/layout/app/notifications/notifications-sidebar.component.ts +182 -56
- package/theme/layout/service/interfaces/interfaces.d.ts +5 -1
- package/theme/layout/service/interfaces/interfaces.ts +6 -1
- package/theme/layout/service/notifications.service.d.ts +1 -0
- package/theme/layout/service/notifications.service.ts +5 -0
|
@@ -17,6 +17,7 @@ import 'aril/boot/config/api';
|
|
|
17
17
|
import 'aril/boot/config/apps';
|
|
18
18
|
import 'aril/boot/config/plugins';
|
|
19
19
|
import 'aril/i18n';
|
|
20
|
+
import 'aril/permission';
|
|
20
21
|
import 'aril/util/activity';
|
|
21
22
|
import 'aril/util/pub-sub';
|
|
22
23
|
import '@angular/elements';
|
|
@@ -79,4 +80,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
79
80
|
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.TranslocoService }, { type: i1$1.AppMenuService }, { type: i4.PrimeNGConfig }, { type: i3.MfeBridge }] });
|
|
80
81
|
|
|
81
82
|
export { AppComponent };
|
|
82
|
-
//# sourceMappingURL=aril-app.component-
|
|
83
|
+
//# sourceMappingURL=aril-app.component-BUjucZ0J.mjs.map
|
package/fesm2022/{aril-app.component-W3wwVSp1.mjs.map → aril-app.component-BUjucZ0J.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-app.component-
|
|
1
|
+
{"version":3,"file":"aril-app.component-BUjucZ0J.mjs","sources":["../../projects/aril/boot/mfe/src/app.component.ts"],"sourcesContent":["import { Component, NgZone, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { PrimeNGConfig } from 'primeng/api';\r\n\r\nimport { ModuleFederationToolsModule, connectRouter } from '@angular-architects/module-federation-tools';\r\nimport { TranslocoService } from '@ngneat/transloco';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';\r\nimport { AppMenuService, MFELayoutComponent } from 'aril/theme/layout';\r\n\r\nimport { appName, menuItems } from './bootstrap';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\ttemplate: `\r\n\t\t@if (isHostMode()) {\r\n\t\t\t<mfe-layout></mfe-layout>\r\n\t\t} @else {\r\n\t\t\tBu uygulama yalnızca host app içinden açılabilir\r\n\t\t}\r\n\t`,\r\n\timports: [ModuleFederationToolsModule, MFELayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate readonly router: Router,\r\n\t\tprivate readonly translocoService: TranslocoService,\r\n\t\tprivate readonly appMenuService: AppMenuService,\r\n\t\tprivate readonly primeNgConfig: PrimeNGConfig,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\tif (!this.bridgeSvc.isHostMode() && !this.bridgeSvc.hostNgZone) {\r\n\t\t\tthis.bridgeSvc.hostNgZone = inject(NgZone);\r\n\t\t}\r\n\r\n\t\tconnectRouter(this.router, true);\r\n\r\n\t\tthis.bridgeSvc.activeMF.set(appName);\r\n\t\tconst lang: LanguageCode = (localStorage.getItem('lang') as LanguageCode) ?? LanguageCode.TR;\r\n\r\n\t\tthis.translocoService.setActiveLang(lang);\r\n\r\n\t\tthis.setLocale(lang);\r\n\r\n\t\tif (!this.bridgeSvc.isHostMode()) {\r\n\t\t\tthis.appMenuService.menuConfig.set({ items: structuredClone(menuItems), prefix: appName });\r\n\t\t}\r\n\t}\r\n\r\n\tget isHostMode() {\r\n\t\treturn this.bridgeSvc.isHostMode;\r\n\t}\r\n\r\n\tsetLocale(lang: LanguageCode) {\r\n\t\tif (!lang?.length) {\r\n\t\t\tconsole.warn('No language selected');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (lang === LanguageCode.TR) {\r\n\t\t\tthis.primeNgConfig.setTranslation(TR_TRANSLATIONS);\r\n\t\t}\r\n\t}\r\n}\r\n"],"names":["i3","i5"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { KeycloakEventType } from 'keycloak-angular';
|
|
|
3
3
|
import { switchMap, from, finalize, takeUntil, fromEvent, tap, EMPTY, firstValueFrom } from 'rxjs';
|
|
4
4
|
import { bridge } from 'aril/boot/bridge';
|
|
5
5
|
import { Apps } from 'aril/boot/config/apps';
|
|
6
|
+
import { ELEMENT_AUTHZ_AUDIENCE } from 'aril/permission';
|
|
6
7
|
|
|
7
8
|
var AppsRoutes;
|
|
8
9
|
(function (AppsRoutes) {
|
|
@@ -48,7 +49,7 @@ class ApiConfigsFactory {
|
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
const API_CONFIGS = new ApiConfigsFactory();
|
|
51
|
-
const loadApiConfigs = (httpClient, keycloak, appName, microAppService) => () => new Promise((resolve) => httpClient
|
|
52
|
+
const loadApiConfigs = (httpClient, keycloak, appName, microAppService, permissionService) => () => new Promise((resolve) => httpClient
|
|
52
53
|
.get(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')
|
|
53
54
|
.pipe(switchMap((configs) => {
|
|
54
55
|
bridge.hostMenuItems.set([]);
|
|
@@ -59,15 +60,31 @@ const loadApiConfigs = (httpClient, keycloak, appName, microAppService) => () =>
|
|
|
59
60
|
loadUserProfileAtStartUp: true,
|
|
60
61
|
initOptions: { onLoad: 'login-required', checkLoginIframe: false },
|
|
61
62
|
bearerExcludedUrls: ['/assets']
|
|
62
|
-
})).pipe(finalize(() =>
|
|
63
|
-
const
|
|
64
|
-
|
|
63
|
+
})).pipe(finalize(() => {
|
|
64
|
+
const permissionsReady = permissionService
|
|
65
|
+
.fetchFromKeycloak(keycloak, ELEMENT_AUTHZ_AUDIENCE)
|
|
66
|
+
.then((keys) => permissionService.hydrate(keys));
|
|
67
|
+
const readyApps = new Set();
|
|
68
|
+
addEventListener('module-ready', (event) => {
|
|
69
|
+
const app = event.detail;
|
|
70
|
+
readyApps.add(app);
|
|
71
|
+
dispatchEvent(new CustomEvent(`${app}:init-keycloak`, { detail: keycloak }));
|
|
72
|
+
permissionsReady.then(() => dispatchEvent(new CustomEvent(`${app}:init-permissions`, { detail: permissionService.keys() })));
|
|
73
|
+
keycloak.keycloakEvents$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).subscribe((e) => {
|
|
74
|
+
if (e.type === KeycloakEventType.OnAuthRefreshSuccess) {
|
|
75
|
+
dispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
65
79
|
keycloak.keycloakEvents$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).subscribe((e) => {
|
|
66
80
|
if (e.type === KeycloakEventType.OnAuthRefreshSuccess) {
|
|
67
|
-
|
|
81
|
+
permissionService.fetchFromKeycloak(keycloak, ELEMENT_AUTHZ_AUDIENCE).then((keys) => {
|
|
82
|
+
permissionService.hydrate(keys);
|
|
83
|
+
readyApps.forEach((app) => dispatchEvent(new CustomEvent(`${app}:update-permissions`, { detail: permissionService.keys() })));
|
|
84
|
+
});
|
|
68
85
|
}
|
|
69
86
|
});
|
|
70
|
-
}))
|
|
87
|
+
}));
|
|
71
88
|
}), switchMap(() => microAppService?.init(httpClient, API_CONFIGS.api).pipe(tap((result) => {
|
|
72
89
|
bridge.hostMenuItems.set(result.menuItems);
|
|
73
90
|
bridge.pluginJson.set(result.plugins);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-config-api.mjs","sources":["../../projects/aril/boot/config/api/src/interfaces.ts","../../projects/aril/boot/config/api/src/api.service.ts","../../projects/aril/boot/config/api/aril-boot-config-api.ts"],"sourcesContent":["import { Apps } from 'aril/boot/config/apps';\r\n\r\nexport enum AppsRoutes {\r\n\tMNG_BASE_URL = 'mngBaseUrl',\r\n}\r\n\r\nexport interface KeycloakConfig {\r\n\turl: string;\r\n\trealm: string;\r\n\tclientId: string;\r\n}\r\n\r\nexport class ApiConfigsFactory {\r\n\tapi: string = '';\r\n\tfromMail: string = '';\r\n\tmwApi: string = '';\r\n\taiApi: string = '';\r\n\tstatusApi: string = '';\r\n\tenvironment: string = '';\r\n\tenvLabel: string = '';\r\n\tkeycloak!: Keycloak.KeycloakConfig;\r\n\troutes: Record<AppsRoutes, string> = {\r\n\t\tmngBaseUrl: '',\r\n\t};\r\n\tprefixMap: Record<Apps, string> = {\r\n\t\t[Apps.THOR]: '',\r\n\t\t[Apps.CRM]: '',\r\n\t\t[Apps.WDM]: '',\r\n\t\t[Apps.BILLING]: '',\r\n\t\t[Apps.PAYMENT]: '',\r\n\t\t[Apps.YEAP]: '',\r\n\t\t[Apps.MW]: '',\r\n\t\t[Apps.LENA]: '',\r\n\t\t[Apps.HES]: '',\r\n\t\t[Apps.CTS]: '',\r\n\t\t[Apps.SIS]: '',\r\n\t\t[Apps.MNG]: '',\r\n\t\t[Apps.STATE_MACHINE]: '',\r\n\t\t[Apps.MDM]:'',\r\n\t\t[Apps.REPORT]: '',\r\n\t\t[Apps.LGC]: '',\r\n\t\t[Apps.DMS]: '',\r\n\t\t[Apps.EVENT_GATEWAY]: ''\r\n\t};\r\n\tgetExternalAppEndpoint(appName: Apps): string {\r\n\t\tconst prefix = this.prefixMap[appName] || this.prefixMap[Apps.MNG];\r\n\t\treturn `${new URL(this.api).origin}/${prefix}`;\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { isDevMode } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';\r\n\r\nimport { RouteConfig, bridge } from 'aril/boot/bridge';\r\nimport { Apps, MicroAppService } from 'aril/boot/config/apps';\r\n\r\nimport { ApiConfigsFactory } from './interfaces';\r\n\r\nexport const API_CONFIGS = new ApiConfigsFactory();\r\n\r\nexport const loadApiConfigs =\r\n\t(httpClient: HttpClient, keycloak: KeycloakService, appName: string, microAppService?: MicroAppService) => () =>\r\n\t\tnew Promise<void>((resolve) =>\r\n\t\t\thttpClient\r\n\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tswitchMap((configs) => {\r\n\t\t\t\t\t\tbridge.hostMenuItems.set([]);\r\n\t\t\t\t\t\tbridge.pluginJson.set({});\r\n\r\n\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\r\n\t\t\t\t\t\treturn from(\r\n\t\t\t\t\t\t\tkeycloak.init({\r\n\t\t\t\t\t\t\t\tconfig: API_CONFIGS.keycloak,\r\n\t\t\t\t\t\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\t\t\t\t\t\tinitOptions: { onLoad: 'login-required', checkLoginIframe: false },\r\n\t\t\t\t\t\t\t\tbearerExcludedUrls: ['/assets']\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\tfinalize(() =>\r\n\t\t\t\t\t\t\t\taddEventListener('module-ready', (event) => {\r\n\t\t\t\t\t\t\t\t\tconst app = (event as CustomEvent).detail;\r\n\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:init-keycloak`, { detail: keycloak }));\r\n\r\n\t\t\t\t\t\t\t\t\tkeycloak.keycloakEvents$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).subscribe((e) => {\r\n\t\t\t\t\t\t\t\t\t\tif (e.type === KeycloakEventType.OnAuthRefreshSuccess) {\r\n\t\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tswitchMap(\r\n\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\tmicroAppService?.init(httpClient, API_CONFIGS.api).pipe(\r\n\t\t\t\t\t\t\t\ttap((result) => {\r\n\t\t\t\t\t\t\t\t\tbridge.hostMenuItems.set(result.menuItems);\r\n\t\t\t\t\t\t\t\t\tbridge.pluginJson.set(result.plugins);\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t) ?? EMPTY\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t\t\t.subscribe()\r\n\t\t\t\t.add(resolve)\r\n\t\t);\r\n\r\n/**\r\n * only works when isHostMode is true\r\n * micro-app access its own api.json file when opened in host\r\n */\r\nexport function setApiConfigOnMFEMode(\r\n\thttpClient: HttpClient,\r\n\tkeycloak: KeycloakService,\r\n\tappName: Apps\r\n): () => Promise<any> {\r\n\treturn () => {\r\n\t\tconst observable$ = httpClient\r\n\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t.pipe(\r\n\t\t\t\ttap((configs) => {\r\n\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\t\t\t\t\tif (appName !== Apps.THOR && appName !== Apps.YEAP) {\r\n\t\t\t\t\t\tAPI_CONFIGS.api = API_CONFIGS.getExternalAppEndpoint(appName);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t);\r\n\r\n\t\treturn firstValueFrom(observable$);\r\n\t};\r\n}\r\n\r\nexport const loadInitData = (httpClient: HttpClient) => () =>\r\n\tnew Promise<void>((resolve, _reject) => {\r\n\t\tconst endpoint = API_CONFIGS.api + '/ui-route-content-configs/all';\r\n\t\thttpClient.get<RouteConfig[]>(endpoint).subscribe({\r\n\t\t\tnext: (data) => {\r\n\t\t\t\tbridge.routeConfigs.set(data);\r\n\t\t\t\tresolve();\r\n\t\t\t},\r\n\t\t\terror: (err) => {\r\n\t\t\t\tconsole.error(`Failed to load init data from ${endpoint}:`, err);\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aril-boot-config-api.mjs","sources":["../../projects/aril/boot/config/api/src/interfaces.ts","../../projects/aril/boot/config/api/src/api.service.ts","../../projects/aril/boot/config/api/aril-boot-config-api.ts"],"sourcesContent":["import { Apps } from 'aril/boot/config/apps';\r\n\r\nexport enum AppsRoutes {\r\n\tMNG_BASE_URL = 'mngBaseUrl',\r\n}\r\n\r\nexport interface KeycloakConfig {\r\n\turl: string;\r\n\trealm: string;\r\n\tclientId: string;\r\n}\r\n\r\nexport class ApiConfigsFactory {\r\n\tapi: string = '';\r\n\tfromMail: string = '';\r\n\tmwApi: string = '';\r\n\taiApi: string = '';\r\n\tstatusApi: string = '';\r\n\tenvironment: string = '';\r\n\tenvLabel: string = '';\r\n\tkeycloak!: Keycloak.KeycloakConfig;\r\n\troutes: Record<AppsRoutes, string> = {\r\n\t\tmngBaseUrl: '',\r\n\t};\r\n\tprefixMap: Record<Apps, string> = {\r\n\t\t[Apps.THOR]: '',\r\n\t\t[Apps.CRM]: '',\r\n\t\t[Apps.WDM]: '',\r\n\t\t[Apps.BILLING]: '',\r\n\t\t[Apps.PAYMENT]: '',\r\n\t\t[Apps.YEAP]: '',\r\n\t\t[Apps.MW]: '',\r\n\t\t[Apps.LENA]: '',\r\n\t\t[Apps.HES]: '',\r\n\t\t[Apps.CTS]: '',\r\n\t\t[Apps.SIS]: '',\r\n\t\t[Apps.MNG]: '',\r\n\t\t[Apps.STATE_MACHINE]: '',\r\n\t\t[Apps.MDM]:'',\r\n\t\t[Apps.REPORT]: '',\r\n\t\t[Apps.LGC]: '',\r\n\t\t[Apps.DMS]: '',\r\n\t\t[Apps.EVENT_GATEWAY]: ''\r\n\t};\r\n\tgetExternalAppEndpoint(appName: Apps): string {\r\n\t\tconst prefix = this.prefixMap[appName] || this.prefixMap[Apps.MNG];\r\n\t\treturn `${new URL(this.api).origin}/${prefix}`;\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { isDevMode } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';\r\n\r\nimport { RouteConfig, bridge } from 'aril/boot/bridge';\r\nimport { Apps, MicroAppService } from 'aril/boot/config/apps';\r\nimport { ELEMENT_AUTHZ_AUDIENCE, PermissionService } from 'aril/permission';\r\n\r\nimport { ApiConfigsFactory } from './interfaces';\r\n\r\nexport const API_CONFIGS = new ApiConfigsFactory();\r\n\r\nexport const loadApiConfigs =\r\n\t(\r\n\t\thttpClient: HttpClient,\r\n\t\tkeycloak: KeycloakService,\r\n\t\tappName: string,\r\n\t\tmicroAppService: MicroAppService,\r\n\t\tpermissionService: PermissionService\r\n\t) =>\r\n\t() =>\r\n\t\tnew Promise<void>((resolve) =>\r\n\t\t\thttpClient\r\n\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tswitchMap((configs) => {\r\n\t\t\t\t\t\tbridge.hostMenuItems.set([]);\r\n\t\t\t\t\t\tbridge.pluginJson.set({});\r\n\r\n\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\r\n\t\t\t\t\t\treturn from(\r\n\t\t\t\t\t\t\tkeycloak.init({\r\n\t\t\t\t\t\t\t\tconfig: API_CONFIGS.keycloak,\r\n\t\t\t\t\t\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\t\t\t\t\t\tinitOptions: { onLoad: 'login-required', checkLoginIframe: false },\r\n\t\t\t\t\t\t\t\tbearerExcludedUrls: ['/assets']\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\tfinalize(() => {\r\n\t\t\t\t\t\t\t\tconst permissionsReady = permissionService\r\n\t\t\t\t\t\t\t\t\t.fetchFromKeycloak(keycloak, ELEMENT_AUTHZ_AUDIENCE)\r\n\t\t\t\t\t\t\t\t\t.then((keys) => permissionService.hydrate(keys));\r\n\t\t\t\t\t\t\t\tconst readyApps = new Set<string>();\r\n\r\n\t\t\t\t\t\t\t\taddEventListener('module-ready', (event) => {\r\n\t\t\t\t\t\t\t\t\tconst app = (event as CustomEvent).detail;\r\n\t\t\t\t\t\t\t\t\treadyApps.add(app);\r\n\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:init-keycloak`, { detail: keycloak }));\r\n\t\t\t\t\t\t\t\t\tpermissionsReady.then(() =>\r\n\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:init-permissions`, { detail: permissionService.keys() }))\r\n\t\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\t\tkeycloak.keycloakEvents$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).subscribe((e) => {\r\n\t\t\t\t\t\t\t\t\t\tif (e.type === KeycloakEventType.OnAuthRefreshSuccess) {\r\n\t\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\tkeycloak.keycloakEvents$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).subscribe((e) => {\r\n\t\t\t\t\t\t\t\t\tif (e.type === KeycloakEventType.OnAuthRefreshSuccess) {\r\n\t\t\t\t\t\t\t\t\t\tpermissionService.fetchFromKeycloak(keycloak, ELEMENT_AUTHZ_AUDIENCE).then((keys) => {\r\n\t\t\t\t\t\t\t\t\t\t\tpermissionService.hydrate(keys);\r\n\t\t\t\t\t\t\t\t\t\t\treadyApps.forEach((app) =>\r\n\t\t\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:update-permissions`, { detail: permissionService.keys() }))\r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tswitchMap(\r\n\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\tmicroAppService?.init(httpClient, API_CONFIGS.api).pipe(\r\n\t\t\t\t\t\t\t\ttap((result) => {\r\n\t\t\t\t\t\t\t\t\tbridge.hostMenuItems.set(result.menuItems);\r\n\t\t\t\t\t\t\t\t\tbridge.pluginJson.set(result.plugins);\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t) ?? EMPTY\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t\t\t.subscribe()\r\n\t\t\t\t.add(resolve)\r\n\t\t);\r\n\r\n/**\r\n * only works when isHostMode is true\r\n * micro-app access its own api.json file when opened in host\r\n */\r\nexport function setApiConfigOnMFEMode(\r\n\thttpClient: HttpClient,\r\n\tkeycloak: KeycloakService,\r\n\tappName: Apps\r\n): () => Promise<any> {\r\n\treturn () => {\r\n\t\tconst observable$ = httpClient\r\n\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t.pipe(\r\n\t\t\t\ttap((configs) => {\r\n\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\t\t\t\t\tif (appName !== Apps.THOR && appName !== Apps.YEAP) {\r\n\t\t\t\t\t\tAPI_CONFIGS.api = API_CONFIGS.getExternalAppEndpoint(appName);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t);\r\n\r\n\t\treturn firstValueFrom(observable$);\r\n\t};\r\n}\r\n\r\nexport const loadInitData = (httpClient: HttpClient) => () =>\r\n\tnew Promise<void>((resolve, _reject) => {\r\n\t\tconst endpoint = API_CONFIGS.api + '/ui-route-content-configs/all';\r\n\t\thttpClient.get<RouteConfig[]>(endpoint).subscribe({\r\n\t\t\tnext: (data) => {\r\n\t\t\t\tbridge.routeConfigs.set(data);\r\n\t\t\t\tresolve();\r\n\t\t\t},\r\n\t\t\terror: (err) => {\r\n\t\t\t\tconsole.error(`Failed to load init data from ${endpoint}:`, err);\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { loadApiConfigs, loadInitData } from 'aril/boot/config/api';
|
|
|
11
11
|
import { ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';
|
|
12
12
|
import { loadPlugins } from 'aril/boot/config/plugins';
|
|
13
13
|
import { i18nFolderName } from 'aril/i18n';
|
|
14
|
+
import { PermissionService } from 'aril/permission';
|
|
14
15
|
import { ActivityService } from 'aril/util/activity';
|
|
15
16
|
import * as i1 from 'aril/theme/layout';
|
|
16
17
|
import { AppLayoutComponent } from 'aril/theme/layout';
|
|
@@ -69,10 +70,10 @@ const boot = (_appName, routes) => {
|
|
|
69
70
|
{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },
|
|
70
71
|
{
|
|
71
72
|
provide: APP_INITIALIZER,
|
|
72
|
-
useFactory: (httpClient, keycloak, router, folderName, microAppService, activityService) => {
|
|
73
|
+
useFactory: (httpClient, keycloak, router, folderName, microAppService, activityService, permissionService) => {
|
|
73
74
|
if (router)
|
|
74
75
|
bridge.hostRouter = router;
|
|
75
|
-
const runLoadApiConfigs = loadApiConfigs(httpClient, keycloak, folderName, microAppService);
|
|
76
|
+
const runLoadApiConfigs = loadApiConfigs(httpClient, keycloak, folderName, microAppService, permissionService);
|
|
76
77
|
const runLoadInitData = loadInitData(httpClient);
|
|
77
78
|
const runLoadPlugins = loadPlugins();
|
|
78
79
|
return async () => {
|
|
@@ -83,7 +84,15 @@ const boot = (_appName, routes) => {
|
|
|
83
84
|
};
|
|
84
85
|
},
|
|
85
86
|
multi: true,
|
|
86
|
-
deps: [
|
|
87
|
+
deps: [
|
|
88
|
+
HttpClient,
|
|
89
|
+
KeycloakService,
|
|
90
|
+
Router,
|
|
91
|
+
i18nFolderName,
|
|
92
|
+
MicroAppService,
|
|
93
|
+
ActivityService,
|
|
94
|
+
PermissionService
|
|
95
|
+
]
|
|
87
96
|
}
|
|
88
97
|
]
|
|
89
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["import { Component, NgZone, inject } from '@angular/core';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate readonly layoutService: LayoutService,\r\n\t\tprivate readonly pubSubService: PubSubService,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\tthis.bridgeSvc.mirrorToWindow();\r\n\t\tthis.bridgeSvc.activeHost.set(appName);\r\n\t\tthis.bridgeSvc.isHostMode.set(true);\r\n\t\tthis.bridgeSvc.hostNgZone = inject(NgZone);\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { loadApiConfigs, loadInitData } from 'aril/boot/config/api';\r\nimport { Apps, ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { i18nFolderName } from 'aril/i18n';\r\nimport { ActivityService } from 'aril/util/activity';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithViewTransitions(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService,\r\n\t\t\t\t\tactivityService: ActivityService\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) bridge.hostRouter = router;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadInitData = loadInitData(httpClient);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\tawait runLoadInitData();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t\tactivityService.start({ shellMode: true });\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [
|
|
1
|
+
{"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["import { Component, NgZone, inject } from '@angular/core';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate readonly layoutService: LayoutService,\r\n\t\tprivate readonly pubSubService: PubSubService,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\tthis.bridgeSvc.mirrorToWindow();\r\n\t\tthis.bridgeSvc.activeHost.set(appName);\r\n\t\tthis.bridgeSvc.isHostMode.set(true);\r\n\t\tthis.bridgeSvc.hostNgZone = inject(NgZone);\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { loadApiConfigs, loadInitData } from 'aril/boot/config/api';\r\nimport { Apps, ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { i18nFolderName } from 'aril/i18n';\r\nimport { PermissionService } from 'aril/permission';\r\nimport { ActivityService } from 'aril/util/activity';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithViewTransitions(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService,\r\n\t\t\t\t\tactivityService: ActivityService,\r\n\t\t\t\t\tpermissionService: PermissionService\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) bridge.hostRouter = router;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService,\r\n\t\t\t\t\t\tpermissionService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadInitData = loadInitData(httpClient);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\tawait runLoadInitData();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t\tactivityService.start({ shellMode: true });\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [\r\n\t\t\t\t\tHttpClient,\r\n\t\t\t\t\tKeycloakService,\r\n\t\t\t\t\tRouter,\r\n\t\t\t\t\ti18nFolderName,\r\n\t\t\t\t\tMicroAppService,\r\n\t\t\t\t\tActivityService,\r\n\t\t\t\t\tPermissionService\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tbootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, Injectable, inject, TemplateRef, ViewContainerRef, effect, Directive, Input } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
class PermissionService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.permissionKeys = signal(new Set(), {
|
|
7
|
+
equal: (a, b) => a.size === b.size && [...b].every((k) => a.has(k))
|
|
8
|
+
});
|
|
9
|
+
this.readySignal = signal(false);
|
|
10
|
+
this.ready = this.readySignal.asReadonly();
|
|
11
|
+
}
|
|
12
|
+
hydrate(keys) {
|
|
13
|
+
this.permissionKeys.set(new Set(keys));
|
|
14
|
+
this.readySignal.set(true);
|
|
15
|
+
}
|
|
16
|
+
has(key) {
|
|
17
|
+
return this.permissionKeys().has(key);
|
|
18
|
+
}
|
|
19
|
+
hasAny(keys) {
|
|
20
|
+
return keys.some((k) => this.has(k));
|
|
21
|
+
}
|
|
22
|
+
hasAll(keys) {
|
|
23
|
+
return keys.every((k) => this.has(k));
|
|
24
|
+
}
|
|
25
|
+
keys() {
|
|
26
|
+
return [...this.permissionKeys()];
|
|
27
|
+
}
|
|
28
|
+
async fetchFromKeycloak(keycloak, audience) {
|
|
29
|
+
try {
|
|
30
|
+
const kc = keycloak.getKeycloakInstance();
|
|
31
|
+
const url = `${kc.authServerUrl}/realms/${kc.realm}/protocol/openid-connect/token`;
|
|
32
|
+
const body = new URLSearchParams({
|
|
33
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:uma-ticket',
|
|
34
|
+
audience,
|
|
35
|
+
response_mode: 'permissions'
|
|
36
|
+
});
|
|
37
|
+
const res = await fetch(url, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded', Authorization: `Bearer ${kc.token}` },
|
|
40
|
+
body
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok)
|
|
43
|
+
return []; // izin yoksa Keycloak 403 döner → boş set (fail-closed)
|
|
44
|
+
const permissions = (await res.json());
|
|
45
|
+
return permissions.map((p) => p.rsname);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return []; // any exception → fail-closed, no console.log
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PermissionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
52
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PermissionService, providedIn: 'root' }); }
|
|
53
|
+
}
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PermissionService, decorators: [{
|
|
55
|
+
type: Injectable,
|
|
56
|
+
args: [{ providedIn: 'root' }]
|
|
57
|
+
}] });
|
|
58
|
+
|
|
59
|
+
// Backend `aril.element-authz.client-id` property'sinin default değerinin FE karşılığı.
|
|
60
|
+
// UMA ticket sorgusunun audience'ı budur — SPA client'ı (ui-thor) DEĞİL, resource-sahibi client.
|
|
61
|
+
const ELEMENT_AUTHZ_AUDIENCE = 'thor';
|
|
62
|
+
|
|
63
|
+
class HasPermissionDirective {
|
|
64
|
+
set arilHasPermission(value) {
|
|
65
|
+
this.keys.set(Array.isArray(value) ? value : [value]);
|
|
66
|
+
}
|
|
67
|
+
set arilHasPermissionMode(value) {
|
|
68
|
+
this.mode.set(value);
|
|
69
|
+
}
|
|
70
|
+
set arilHasPermissionElse(value) {
|
|
71
|
+
this.elseTemplate.set(value);
|
|
72
|
+
}
|
|
73
|
+
constructor() {
|
|
74
|
+
this.templateRef = inject((TemplateRef));
|
|
75
|
+
this.viewContainer = inject(ViewContainerRef);
|
|
76
|
+
this.permissionService = inject(PermissionService);
|
|
77
|
+
this.keys = signal([]);
|
|
78
|
+
this.mode = signal('any');
|
|
79
|
+
this.elseTemplate = signal(null);
|
|
80
|
+
effect(() => {
|
|
81
|
+
this.viewContainer.clear();
|
|
82
|
+
if (!this.permissionService.ready())
|
|
83
|
+
return;
|
|
84
|
+
const granted = this.mode() === 'all' ? this.permissionService.hasAll(this.keys()) : this.permissionService.hasAny(this.keys());
|
|
85
|
+
if (granted) {
|
|
86
|
+
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
87
|
+
}
|
|
88
|
+
else if (this.elseTemplate()) {
|
|
89
|
+
// Intentionally read only on the denied path — granted renders must not track elseTemplate changes; reordering branches would reintroduce re-render churn.
|
|
90
|
+
this.viewContainer.createEmbeddedView(this.elseTemplate());
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HasPermissionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
95
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.2", type: HasPermissionDirective, isStandalone: true, selector: "[arilHasPermission]", inputs: { arilHasPermission: "arilHasPermission", arilHasPermissionMode: "arilHasPermissionMode", arilHasPermissionElse: "arilHasPermissionElse" }, ngImport: i0 }); }
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HasPermissionDirective, decorators: [{
|
|
98
|
+
type: Directive,
|
|
99
|
+
args: [{ selector: '[arilHasPermission]', standalone: true }]
|
|
100
|
+
}], ctorParameters: () => [], propDecorators: { arilHasPermission: [{
|
|
101
|
+
type: Input,
|
|
102
|
+
args: [{ required: true }]
|
|
103
|
+
}], arilHasPermissionMode: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], arilHasPermissionElse: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}] } });
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Generated bundle index. Do not edit.
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
export { ELEMENT_AUTHZ_AUDIENCE, HasPermissionDirective, PermissionService };
|
|
114
|
+
//# sourceMappingURL=aril-permission.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aril-permission.mjs","sources":["../../projects/aril/permission/src/permission.service.ts","../../projects/aril/permission/src/constants.ts","../../projects/aril/permission/src/has-permission.directive.ts","../../projects/aril/permission/aril-permission.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\ninterface UmaPermission {\r\n\trsname: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PermissionService {\r\n\tprivate permissionKeys = signal<ReadonlySet<string>>(new Set(), {\r\n\t\tequal: (a, b) => a.size === b.size && [...b].every((k) => a.has(k))\r\n\t});\r\n\tprivate readySignal = signal(false);\r\n\treadonly ready = this.readySignal.asReadonly();\r\n\r\n\thydrate(keys: string[]): void {\r\n\t\tthis.permissionKeys.set(new Set(keys));\r\n\t\tthis.readySignal.set(true);\r\n\t}\r\n\thas(key: string): boolean {\r\n\t\treturn this.permissionKeys().has(key);\r\n\t}\r\n\thasAny(keys: string[]): boolean {\r\n\t\treturn keys.some((k) => this.has(k));\r\n\t}\r\n\thasAll(keys: string[]): boolean {\r\n\t\treturn keys.every((k) => this.has(k));\r\n\t}\r\n\tkeys(): string[] {\r\n\t\treturn [...this.permissionKeys()];\r\n\t}\r\n\r\n\tasync fetchFromKeycloak(keycloak: KeycloakService, audience: string): Promise<string[]> {\r\n\t\ttry {\r\n\t\t\tconst kc = keycloak.getKeycloakInstance();\r\n\t\t\tconst url = `${kc.authServerUrl}/realms/${kc.realm}/protocol/openid-connect/token`;\r\n\t\t\tconst body = new URLSearchParams({\r\n\t\t\t\tgrant_type: 'urn:ietf:params:oauth:grant-type:uma-ticket',\r\n\t\t\t\taudience,\r\n\t\t\t\tresponse_mode: 'permissions'\r\n\t\t\t});\r\n\t\t\tconst res = await fetch(url, {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded', Authorization: `Bearer ${kc.token}` },\r\n\t\t\t\tbody\r\n\t\t\t});\r\n\t\t\tif (!res.ok) return []; // izin yoksa Keycloak 403 döner → boş set (fail-closed)\r\n\t\t\tconst permissions = (await res.json()) as UmaPermission[];\r\n\t\t\treturn permissions.map((p) => p.rsname);\r\n\t\t} catch {\r\n\t\t\treturn []; // any exception → fail-closed, no console.log\r\n\t\t}\r\n\t}\r\n}\r\n","// Backend `aril.element-authz.client-id` property'sinin default değerinin FE karşılığı.\r\n// UMA ticket sorgusunun audience'ı budur — SPA client'ı (ui-thor) DEĞİL, resource-sahibi client.\r\nexport const ELEMENT_AUTHZ_AUDIENCE = 'thor';\r\n","import { Directive, Input, TemplateRef, ViewContainerRef, effect, inject, signal } from '@angular/core';\r\n\r\nimport { PermissionService } from './permission.service';\r\n\r\n@Directive({ selector: '[arilHasPermission]', standalone: true })\r\nexport class HasPermissionDirective {\r\n\tprivate templateRef = inject(TemplateRef<unknown>);\r\n\tprivate viewContainer = inject(ViewContainerRef);\r\n\tprivate permissionService = inject(PermissionService);\r\n\r\n\tprivate keys = signal<string[]>([]);\r\n\tprivate mode = signal<'any' | 'all'>('any');\r\n\tprivate elseTemplate = signal<TemplateRef<unknown> | null>(null);\r\n\r\n\t@Input({ required: true }) set arilHasPermission(value: string | string[]) {\r\n\t\tthis.keys.set(Array.isArray(value) ? value : [value]);\r\n\t}\r\n\t@Input() set arilHasPermissionMode(value: 'any' | 'all') {\r\n\t\tthis.mode.set(value);\r\n\t}\r\n\t@Input() set arilHasPermissionElse(value: TemplateRef<unknown> | null) {\r\n\t\tthis.elseTemplate.set(value);\r\n\t}\r\n\r\n\tconstructor() {\r\n\t\teffect(() => {\r\n\t\t\tthis.viewContainer.clear();\r\n\t\t\tif (!this.permissionService.ready()) return;\r\n\t\t\tconst granted =\r\n\t\t\t\tthis.mode() === 'all' ? this.permissionService.hasAll(this.keys()) : this.permissionService.hasAny(this.keys());\r\n\t\t\tif (granted) {\r\n\t\t\t\tthis.viewContainer.createEmbeddedView(this.templateRef);\r\n\t\t\t} else if (this.elseTemplate()) {\r\n\t\t\t\t// Intentionally read only on the denied path — granted renders must not track elseTemplate changes; reordering branches would reintroduce re-render churn.\r\n\t\t\t\tthis.viewContainer.createEmbeddedView(this.elseTemplate()!);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { bridge } from 'aril/boot/bridge';
|
|
2
2
|
import { APP_INITIALIZER, LOCALE_ID } from '@angular/core';
|
|
3
3
|
import { KeycloakService } from 'keycloak-angular';
|
|
4
|
+
import { PermissionService } from 'aril/permission';
|
|
4
5
|
import { provideRouter, withComponentInputBinding, withHashLocation, withViewTransitions, Router } from '@angular/router';
|
|
5
6
|
import { registerLocaleData } from '@angular/common';
|
|
6
7
|
import localeEn from '@angular/common/locales/en';
|
|
@@ -40,9 +41,50 @@ const hostKeycloakInitializer = (keycloakService, app) => () => new Promise((res
|
|
|
40
41
|
dispatchEvent(new CustomEvent('module-ready', { detail: app }));
|
|
41
42
|
});
|
|
42
43
|
|
|
44
|
+
// Mirrors provideHostKeycloak's host-bootstrap/login/network budget, but on timeout we resolve
|
|
45
|
+
// (never reject) — an un-hydrated PermissionService just stays ready()=false, so permission checks
|
|
46
|
+
// fail-closed instead of blocking app bootstrap.
|
|
47
|
+
const HOST_PERMISSIONS_INIT_TIMEOUT_MS = 30000;
|
|
48
|
+
const provideHostPermissions = (app) => {
|
|
49
|
+
return [
|
|
50
|
+
PermissionService,
|
|
51
|
+
{
|
|
52
|
+
provide: APP_INITIALIZER,
|
|
53
|
+
useFactory: (permissionService) => hostPermissionsInitializer(permissionService, app),
|
|
54
|
+
deps: [PermissionService],
|
|
55
|
+
multi: true
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
};
|
|
59
|
+
const hostPermissionsInitializer = (permissionService, app) => () => new Promise((resolve) => {
|
|
60
|
+
let timeoutHandle;
|
|
61
|
+
hostPermissionListener(app, permissionService);
|
|
62
|
+
const resolveOnInit = () => {
|
|
63
|
+
removeEventListener(`${app}:init-permissions`, resolveOnInit);
|
|
64
|
+
clearTimeout(timeoutHandle);
|
|
65
|
+
resolve();
|
|
66
|
+
};
|
|
67
|
+
timeoutHandle = setTimeout(() => {
|
|
68
|
+
removeEventListener(`${app}:init-permissions`, resolveOnInit);
|
|
69
|
+
resolve();
|
|
70
|
+
}, HOST_PERMISSIONS_INIT_TIMEOUT_MS);
|
|
71
|
+
addEventListener(`${app}:init-permissions`, resolveOnInit);
|
|
72
|
+
});
|
|
73
|
+
// Pure listener wiring: hydrates PermissionService on both init and update. Used by
|
|
74
|
+
// hostPermissionsInitializer above; the update listener is never removed, so it keeps hydrating
|
|
75
|
+
// across token refreshes even after the APP_INITIALIZER promise above has resolved.
|
|
76
|
+
function hostPermissionListener(app, permissionService) {
|
|
77
|
+
addEventListener(`${app}:init-permissions`, (event) => {
|
|
78
|
+
permissionService.hydrate(event.detail);
|
|
79
|
+
});
|
|
80
|
+
addEventListener(`${app}:update-permissions`, (event) => {
|
|
81
|
+
permissionService.hydrate(event.detail);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
43
85
|
// Host altında çağrıldığında shared keycloak ekler; MFE standalone'da
|
|
44
86
|
// (bridge.hostNgZone null) bu path zaten boot olmuyor, güvenli fallback.
|
|
45
|
-
const provideHost = (app) => bridge.hostNgZone ? [provideHostKeycloak(app)] : [];
|
|
87
|
+
const provideHost = (app) => bridge.hostNgZone ? [provideHostKeycloak(app), provideHostPermissions(app)] : [];
|
|
46
88
|
|
|
47
89
|
const provideHostRouter = () => {
|
|
48
90
|
const providers = [];
|
|
@@ -75,5 +117,5 @@ const provideLocaleId = () => ({
|
|
|
75
117
|
* Generated bundle index. Do not edit.
|
|
76
118
|
*/
|
|
77
119
|
|
|
78
|
-
export { hostKeycloakInitializer, provideHost, provideHostKeycloak, provideHostRouter, provideLocaleId };
|
|
120
|
+
export { hostKeycloakInitializer, hostPermissionListener, hostPermissionsInitializer, provideHost, provideHostKeycloak, provideHostPermissions, provideHostRouter, provideLocaleId };
|
|
79
121
|
//# sourceMappingURL=aril-provider.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-provider.mjs","sources":["../../projects/aril/provider/src/provideHostKeycloak.ts","../../projects/aril/provider/src/prodiveHost.ts","../../projects/aril/provider/src/prodiveHostRouter.ts","../../projects/aril/provider/src/provideLocaleId.ts","../../projects/aril/provider/aril-provider.ts"],"sourcesContent":["import { APP_INITIALIZER, Provider } from '@angular/core';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { Apps } from 'aril/boot/config/apps';\r\n\r\n// Covers host bootstrap + Keycloak login redirect + token exchange + slow network buffer.\r\nconst HOST_KEYCLOAK_INIT_TIMEOUT_MS = 30_000;\r\n\r\nexport const provideHostKeycloak = (app: Apps): Provider => {\r\n\treturn [\r\n\t\tKeycloakService,\r\n\t\t{\r\n\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\tuseFactory: (keycloak: KeycloakService) => hostKeycloakInitializer(keycloak, app),\r\n\t\t\tdeps: [KeycloakService],\r\n\t\t\tmulti: true\r\n\t\t}\r\n\t];\r\n};\r\n\r\nexport const hostKeycloakInitializer = (keycloakService: KeycloakService, app: Apps) => () =>\r\n\tnew Promise<void>((resolve, reject) => {\r\n\t\tlet timeoutHandle: ReturnType<typeof setTimeout>;\r\n\r\n\t\tconst eventListener = (event: Event) => {\r\n\t\t\tremoveEventListener(`${app}:init-keycloak`, eventListener);\r\n\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\ttry {\r\n\t\t\t\tObject.assign(keycloakService, (event as CustomEvent).detail as KeycloakService);\r\n\t\t\t\tresolve();\r\n\t\t\t} catch (error) {\r\n\t\t\t\treject(error);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\ttimeoutHandle = setTimeout(() => {\r\n\t\t\tremoveEventListener(`${app}:init-keycloak`, eventListener);\r\n\t\t\treject(\r\n\t\t\t\tnew Error(\r\n\t\t\t\t\t`Host keycloak init for \"${app}\" did not complete within ${HOST_KEYCLOAK_INIT_TIMEOUT_MS}ms — host may not be mounted or the module-ready bridge is broken`\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t}, HOST_KEYCLOAK_INIT_TIMEOUT_MS);\r\n\r\n\t\taddEventListener(`${app}:init-keycloak`, eventListener);\r\n\r\n\t\tdispatchEvent(new CustomEvent('module-ready', { detail: app }));\r\n\t});\r\n","import { EnvironmentProviders, Provider } from '@angular/core';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { Apps } from 'aril/boot/config/apps';\r\n\r\nimport { provideHostKeycloak } from './provideHostKeycloak';\r\n\r\n// Host altında çağrıldığında shared keycloak ekler; MFE standalone'da\r\n// (bridge.hostNgZone null) bu path zaten boot olmuyor, güvenli fallback.\r\nexport const provideHost = (app: Apps): Array<Provider | EnvironmentProviders> =>\r\n\tbridge.hostNgZone ? [provideHostKeycloak(app)] : [];\r\n","import { EnvironmentProviders, Provider } from '@angular/core';\r\nimport {\r\n\tRouter,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\n\r\nexport const provideHostRouter = (): Provider => {\r\n\tconst providers: Array<Provider | EnvironmentProviders> = [];\r\n\r\n\tif (bridge.hostRouter) {\r\n\t\treturn [\r\n\t\t\tprovideRouter([], withComponentInputBinding(), withHashLocation(), withViewTransitions()),\r\n\t\t\t{ provide: Router, useValue: bridge.hostRouter }\r\n\t\t];\r\n\t}\r\n\r\n\treturn providers;\r\n};\r\n","import { registerLocaleData } from '@angular/common';\r\nimport localeEn from '@angular/common/locales/en';\r\nimport localeTr from '@angular/common/locales/tr';\r\nimport { LOCALE_ID, Provider } from '@angular/core';\r\n\r\nregisterLocaleData(localeTr, 'tr');\r\nregisterLocaleData(localeEn, 'en');\r\n\r\nexport const provideLocaleId = (): Provider => ({\r\n\tprovide: LOCALE_ID,\r\n\tuseFactory: () => {\r\n\t\tconst userLang = localStorage.getItem('lang');\r\n\t\tif (userLang) return userLang;\r\n\r\n\t\tconst browserLang = navigator.language?.split('-')[0];\r\n\t\tif (browserLang && ['tr', 'en'].includes(browserLang)) {\r\n\t\t\treturn browserLang;\r\n\t\t}\r\n\r\n\t\treturn 'tr';\r\n\t}\r\n}); ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aril-provider.mjs","sources":["../../projects/aril/provider/src/provideHostKeycloak.ts","../../projects/aril/provider/src/provideHostPermissions.ts","../../projects/aril/provider/src/prodiveHost.ts","../../projects/aril/provider/src/prodiveHostRouter.ts","../../projects/aril/provider/src/provideLocaleId.ts","../../projects/aril/provider/aril-provider.ts"],"sourcesContent":["import { APP_INITIALIZER, Provider } from '@angular/core';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { Apps } from 'aril/boot/config/apps';\r\n\r\n// Covers host bootstrap + Keycloak login redirect + token exchange + slow network buffer.\r\nconst HOST_KEYCLOAK_INIT_TIMEOUT_MS = 30_000;\r\n\r\nexport const provideHostKeycloak = (app: Apps): Provider => {\r\n\treturn [\r\n\t\tKeycloakService,\r\n\t\t{\r\n\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\tuseFactory: (keycloak: KeycloakService) => hostKeycloakInitializer(keycloak, app),\r\n\t\t\tdeps: [KeycloakService],\r\n\t\t\tmulti: true\r\n\t\t}\r\n\t];\r\n};\r\n\r\nexport const hostKeycloakInitializer = (keycloakService: KeycloakService, app: Apps) => () =>\r\n\tnew Promise<void>((resolve, reject) => {\r\n\t\tlet timeoutHandle: ReturnType<typeof setTimeout>;\r\n\r\n\t\tconst eventListener = (event: Event) => {\r\n\t\t\tremoveEventListener(`${app}:init-keycloak`, eventListener);\r\n\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\ttry {\r\n\t\t\t\tObject.assign(keycloakService, (event as CustomEvent).detail as KeycloakService);\r\n\t\t\t\tresolve();\r\n\t\t\t} catch (error) {\r\n\t\t\t\treject(error);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\ttimeoutHandle = setTimeout(() => {\r\n\t\t\tremoveEventListener(`${app}:init-keycloak`, eventListener);\r\n\t\t\treject(\r\n\t\t\t\tnew Error(\r\n\t\t\t\t\t`Host keycloak init for \"${app}\" did not complete within ${HOST_KEYCLOAK_INIT_TIMEOUT_MS}ms — host may not be mounted or the module-ready bridge is broken`\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t}, HOST_KEYCLOAK_INIT_TIMEOUT_MS);\r\n\r\n\t\taddEventListener(`${app}:init-keycloak`, eventListener);\r\n\r\n\t\tdispatchEvent(new CustomEvent('module-ready', { detail: app }));\r\n\t});\r\n","import { APP_INITIALIZER, Provider } from '@angular/core';\r\n\r\nimport { Apps } from 'aril/boot/config/apps';\r\nimport { PermissionService } from 'aril/permission';\r\n\r\n// Mirrors provideHostKeycloak's host-bootstrap/login/network budget, but on timeout we resolve\r\n// (never reject) — an un-hydrated PermissionService just stays ready()=false, so permission checks\r\n// fail-closed instead of blocking app bootstrap.\r\nconst HOST_PERMISSIONS_INIT_TIMEOUT_MS = 30_000;\r\n\r\nexport const provideHostPermissions = (app: Apps): Provider => {\r\n\treturn [\r\n\t\tPermissionService,\r\n\t\t{\r\n\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\tuseFactory: (permissionService: PermissionService) => hostPermissionsInitializer(permissionService, app),\r\n\t\t\tdeps: [PermissionService],\r\n\t\t\tmulti: true\r\n\t\t}\r\n\t];\r\n};\r\n\r\nexport const hostPermissionsInitializer = (permissionService: PermissionService, app: Apps) => () =>\r\n\tnew Promise<void>((resolve) => {\r\n\t\tlet timeoutHandle: ReturnType<typeof setTimeout>;\r\n\r\n\t\thostPermissionListener(app, permissionService);\r\n\r\n\t\tconst resolveOnInit = () => {\r\n\t\t\tremoveEventListener(`${app}:init-permissions`, resolveOnInit);\r\n\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\tresolve();\r\n\t\t};\r\n\r\n\t\ttimeoutHandle = setTimeout(() => {\r\n\t\t\tremoveEventListener(`${app}:init-permissions`, resolveOnInit);\r\n\t\t\tresolve();\r\n\t\t}, HOST_PERMISSIONS_INIT_TIMEOUT_MS);\r\n\r\n\t\taddEventListener(`${app}:init-permissions`, resolveOnInit);\r\n\t});\r\n\r\n// Pure listener wiring: hydrates PermissionService on both init and update. Used by\r\n// hostPermissionsInitializer above; the update listener is never removed, so it keeps hydrating\r\n// across token refreshes even after the APP_INITIALIZER promise above has resolved.\r\nexport function hostPermissionListener(app: string, permissionService: PermissionService): void {\r\n\taddEventListener(`${app}:init-permissions`, (event) => {\r\n\t\tpermissionService.hydrate((event as CustomEvent<string[]>).detail);\r\n\t});\r\n\taddEventListener(`${app}:update-permissions`, (event) => {\r\n\t\tpermissionService.hydrate((event as CustomEvent<string[]>).detail);\r\n\t});\r\n}\r\n","import { EnvironmentProviders, Provider } from '@angular/core';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { Apps } from 'aril/boot/config/apps';\r\n\r\nimport { provideHostKeycloak } from './provideHostKeycloak';\r\nimport { provideHostPermissions } from './provideHostPermissions';\r\n\r\n// Host altında çağrıldığında shared keycloak ekler; MFE standalone'da\r\n// (bridge.hostNgZone null) bu path zaten boot olmuyor, güvenli fallback.\r\nexport const provideHost = (app: Apps): Array<Provider | EnvironmentProviders> =>\r\n\tbridge.hostNgZone ? [provideHostKeycloak(app), provideHostPermissions(app)] : [];\r\n","import { EnvironmentProviders, Provider } from '@angular/core';\r\nimport {\r\n\tRouter,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\n\r\nexport const provideHostRouter = (): Provider => {\r\n\tconst providers: Array<Provider | EnvironmentProviders> = [];\r\n\r\n\tif (bridge.hostRouter) {\r\n\t\treturn [\r\n\t\t\tprovideRouter([], withComponentInputBinding(), withHashLocation(), withViewTransitions()),\r\n\t\t\t{ provide: Router, useValue: bridge.hostRouter }\r\n\t\t];\r\n\t}\r\n\r\n\treturn providers;\r\n};\r\n","import { registerLocaleData } from '@angular/common';\r\nimport localeEn from '@angular/common/locales/en';\r\nimport localeTr from '@angular/common/locales/tr';\r\nimport { LOCALE_ID, Provider } from '@angular/core';\r\n\r\nregisterLocaleData(localeTr, 'tr');\r\nregisterLocaleData(localeEn, 'en');\r\n\r\nexport const provideLocaleId = (): Provider => ({\r\n\tprovide: LOCALE_ID,\r\n\tuseFactory: () => {\r\n\t\tconst userLang = localStorage.getItem('lang');\r\n\t\tif (userLang) return userLang;\r\n\r\n\t\tconst browserLang = navigator.language?.split('-')[0];\r\n\t\tif (browserLang && ['tr', 'en'].includes(browserLang)) {\r\n\t\t\treturn browserLang;\r\n\t\t}\r\n\r\n\t\treturn 'tr';\r\n\t}\r\n}); ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|