aril 2.0.1-dev.2 → 2.0.1-dev.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/boot/bridge/src/mfe-bridge.d.ts +33 -0
- package/esm2022/boot/bridge/src/mfe-bridge.mjs +18 -1
- package/esm2022/boot/mfe/src/bootstrap.mjs +49 -5
- package/esm2022/theme/layout/service/breadcrumb-publisher.service.mjs +12 -4
- package/esm2022/theme/layout/service/interfaces/interfaces.mjs +1 -1
- package/esm2022/theme/layout/service/selection-group.service.mjs +151 -21
- package/fesm2022/aril-boot-bridge.mjs +17 -0
- package/fesm2022/aril-boot-bridge.mjs.map +1 -1
- package/fesm2022/{aril-boot-mfe-app.component-a34GeuUv.mjs → aril-boot-mfe-app.component-oxzMhRXe.mjs} +2 -2
- package/fesm2022/{aril-boot-mfe-app.component-a34GeuUv.mjs.map → aril-boot-mfe-app.component-oxzMhRXe.mjs.map} +1 -1
- package/fesm2022/{aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs → aril-boot-mfe-aril-boot-mfe-CKOM61xb.mjs} +50 -6
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-CKOM61xb.mjs.map +1 -0
- package/fesm2022/aril-boot-mfe.mjs +1 -1
- package/fesm2022/aril-theme-layout.mjs +158 -21
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/fesm2022/aril.mjs +48 -4
- package/fesm2022/aril.mjs.map +1 -1
- package/package.json +212 -212
- package/scripts/mf-shared.js +47 -0
- package/theme/layout/service/breadcrumb-publisher.service.ts +18 -8
- package/theme/layout/service/interfaces/interfaces.d.ts +3 -17
- package/theme/layout/service/interfaces/interfaces.ts +6 -18
- package/theme/layout/service/selection-group.service.d.ts +8 -4
- package/theme/layout/service/selection-group.service.ts +161 -25
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thor MFE app'lerinin (host + tüm remote'lar) ORTAK Module Federation sharing politikası.
|
|
3
|
+
* Tek sahip: politika değişiklikleri (skip listesi, strictVersion vb.) yalnızca burada yapılır;
|
|
4
|
+
* tüm repoların webpack config'leri bu preset'i require eder — repo başına kopya/drift olmaz.
|
|
5
|
+
* (Drift'in maliyeti: tek bir remote farklı sharing rejimiyle kalırsa o remote'ta ikinci bir
|
|
6
|
+
* @angular/core yaşar → bridge signal reactivity'si ve DI class-identity sessizce kırılır.)
|
|
7
|
+
*
|
|
8
|
+
* Politika:
|
|
9
|
+
* - @angular/* (+ rxjs, transloco vb. tüm DİREKT package.json dep'leri) singleton shared →
|
|
10
|
+
* cross-MFE TEK @angular/core → bridge signal/effect reactivity'si MFE'ler arası çalışır.
|
|
11
|
+
* - `aril` SKIP (per-app): shared edilseydi entrypoint'leri farklı container'lardan çözülürdü
|
|
12
|
+
* (host önce `aril/provider`'ı yükler → host'un KeycloakService class'ı; remote `aril/boot/mfe`'yi
|
|
13
|
+
* yükler → remote'unki). keycloak-angular/primeng aril üzerinden TRANSITIVE geldiği için shareAll
|
|
14
|
+
* onları paylaşamaz (yalnızca direkt dep'leri okur) → iki ayrı class → DI uyuşmaz ("No provider
|
|
15
|
+
* for KeycloakService"). aril per-app olunca her app kendi tam aril'ini taşır → DI tutarlı;
|
|
16
|
+
* cross-MFE state globalThis bridge ile köprülenir (bkz. aril/boot/bridge).
|
|
17
|
+
* - Kütüphane default skip listeleri spread ile KORUNUR (custom array vermek ikisini de ezerdi):
|
|
18
|
+
* DEFAULT_SKIP_LIST = @softarc/* + @angular-architects/* (MF orkestrasyon runtime'ı MF üzerinden
|
|
19
|
+
* paylaşılmaz) + tslib + zone.js (eager polyfill → MF lazy shared ile "eager consumption" + NG0908).
|
|
20
|
+
* DEFAULT_SECONARIES_SKIP_LIST = @angular/*\/upgrade secondaries (@angular/upgrade kurulu değil).
|
|
21
|
+
* - `@angular-architects/module-federation-tools` SKIP: app'lerde direkt dep olduğundan shareAll
|
|
22
|
+
* onu paylaşırdı; kardeşleri default listede zaten skip. aril'in boot kodu import ettiğinden,
|
|
23
|
+
* singleton paylaşımda host'un versiyonu tüm remote'lara sessizce dayatılırdı — MF runtime
|
|
24
|
+
* ailesinin tamamı aril ile aynı mantıkla per-app kalır.
|
|
25
|
+
*
|
|
26
|
+
* Kullanım (webpack.config.js, app root'unda):
|
|
27
|
+
* const { arilMfShared } = require('./node_modules/aril/scripts/mf-shared.js');
|
|
28
|
+
* ...
|
|
29
|
+
* shared: arilMfShared()
|
|
30
|
+
*
|
|
31
|
+
* NOT: relative require ŞART — aril'in package.json `exports` haritası `./scripts/*` subpath'ini
|
|
32
|
+
* içermediğinden bare `require('aril/scripts/...')` ERR_PACKAGE_PATH_NOT_EXPORTED fırlatır.
|
|
33
|
+
*/
|
|
34
|
+
const { shareAll, DEFAULT_SKIP_LIST, DEFAULT_SECONARIES_SKIP_LIST } = require('@angular-architects/module-federation/webpack');
|
|
35
|
+
|
|
36
|
+
function arilMfShared() {
|
|
37
|
+
return shareAll(
|
|
38
|
+
{
|
|
39
|
+
singleton: true,
|
|
40
|
+
strictVersion: false,
|
|
41
|
+
requiredVersion: 'auto'
|
|
42
|
+
},
|
|
43
|
+
[...DEFAULT_SKIP_LIST, ...DEFAULT_SECONARIES_SKIP_LIST, '@angular-architects/module-federation-tools', 'aril']
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = { arilMfShared };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable, OnDestroy, effect, inject } from '@angular/core';
|
|
1
|
+
import { Injectable, OnDestroy, effect, inject, untracked } from '@angular/core';
|
|
2
2
|
import { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';
|
|
3
3
|
|
|
4
4
|
import { Subscription, filter } from 'rxjs';
|
|
@@ -30,12 +30,19 @@ export class BreadcrumbPublisherService implements OnDestroy {
|
|
|
30
30
|
.pipe(filter((event) => event instanceof NavigationEnd))
|
|
31
31
|
.subscribe(() => this.publishFromCurrentRoute());
|
|
32
32
|
|
|
33
|
-
effect(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
effect(
|
|
34
|
+
() => {
|
|
35
|
+
// keyValues sinyalini dinle; dinamik breadcrumb (örn. "{customerId}")
|
|
36
|
+
// değerleri sonradan geldikçe listeyi yeniden yayınla.
|
|
37
|
+
this.breadcrumbService.keyValues();
|
|
38
|
+
this.publishFromCurrentRoute();
|
|
39
|
+
},
|
|
40
|
+
// `publishFromCurrentRoute` → `publish` içinde `bridge.breadcrumbs.set` / `bridge.pageTitle.set`
|
|
41
|
+
// signal write yapar; effect içinden signal write default'ta NG0600 fırlatır. aril genelindeki
|
|
42
|
+
// effect'lerle aynı şekilde `allowSignalWrites` ile izin veriyoruz. (MF shared core öncesi
|
|
43
|
+
// cross-core split bu guard'ı maskeliyordu; tek core olunca yüzeye çıktı — davranış aynı.)
|
|
44
|
+
{ allowSignalWrites: true }
|
|
45
|
+
);
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
ngOnDestroy(): void {
|
|
@@ -77,7 +84,10 @@ export class BreadcrumbPublisherService implements OnDestroy {
|
|
|
77
84
|
bridge.breadcrumbs.set(breadcrumbs);
|
|
78
85
|
|
|
79
86
|
const lastLabel = breadcrumbs[breadcrumbs.length - 1]?.label ?? '';
|
|
80
|
-
|
|
87
|
+
// untracked ZORUNLU: publish, constructor'daki effect'in çağrı grafiğinde çalışır. Tracked
|
|
88
|
+
// okuma effect'i kendi yazdığı pageTitle'a abone eder; tab başına bir publisher instance
|
|
89
|
+
// olduğundan iki tab farklı title yazarak birbirini sonsuz döngüde tetiklerdi.
|
|
90
|
+
if (untracked(bridge.pageTitle) || lastLabel) {
|
|
81
91
|
bridge.pageTitle.set(lastLabel);
|
|
82
92
|
}
|
|
83
93
|
|
|
@@ -13,24 +13,10 @@ export interface Parameters {
|
|
|
13
13
|
}
|
|
14
14
|
export interface AdditionalProp {
|
|
15
15
|
}
|
|
16
|
-
export
|
|
17
|
-
|
|
16
|
+
export type { SelectionGroupDTO, SelectionItem } from 'aril/boot/bridge';
|
|
17
|
+
export interface SelectionGroupVersionDTO {
|
|
18
18
|
groupName: string;
|
|
19
|
-
|
|
20
|
-
groupComment: string;
|
|
21
|
-
loadStrategy: string;
|
|
22
|
-
dynamicQuery: string;
|
|
23
|
-
parentGroupId: number;
|
|
24
|
-
selectionItems: SelectionItem[];
|
|
25
|
-
}
|
|
26
|
-
export interface SelectionItem {
|
|
27
|
-
id: number;
|
|
28
|
-
groupId: number;
|
|
29
|
-
selectionKey: string;
|
|
30
|
-
selectionDisplay: string;
|
|
31
|
-
showOrder: number;
|
|
32
|
-
parentSelectionKey: string;
|
|
33
|
-
selectionMultiLanguageDisplays?: Record<string, string>;
|
|
19
|
+
version: number;
|
|
34
20
|
}
|
|
35
21
|
export interface Language {
|
|
36
22
|
name: string;
|
|
@@ -22,25 +22,13 @@ export interface Parameters {
|
|
|
22
22
|
|
|
23
23
|
export interface AdditionalProp {}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
groupDescription: string;
|
|
29
|
-
groupComment: string;
|
|
30
|
-
loadStrategy: string;
|
|
31
|
-
dynamicQuery: string;
|
|
32
|
-
parentGroupId: number;
|
|
33
|
-
selectionItems: SelectionItem[];
|
|
34
|
-
}
|
|
25
|
+
// SelectionGroupDTO + SelectionItem bridge'de tanımlı (cache state orada yaşıyor); circular'ı önlemek
|
|
26
|
+
// için buradan re-export edilir — mevcut tüketiciler `aril/theme/layout`'tan import etmeye devam eder.
|
|
27
|
+
export type { SelectionGroupDTO, SelectionItem } from 'aril/boot/bridge';
|
|
35
28
|
|
|
36
|
-
export interface
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
selectionKey: string;
|
|
40
|
-
selectionDisplay: string;
|
|
41
|
-
showOrder: number;
|
|
42
|
-
parentSelectionKey: string;
|
|
43
|
-
selectionMultiLanguageDisplays?: Record<string, string>;
|
|
29
|
+
export interface SelectionGroupVersionDTO {
|
|
30
|
+
groupName: string;
|
|
31
|
+
version: number;
|
|
44
32
|
}
|
|
45
33
|
|
|
46
34
|
export interface Language {
|
|
@@ -2,16 +2,20 @@ import { HttpClient } from '@angular/common/http';
|
|
|
2
2
|
import { SelectionGroupDTO } from './interfaces/interfaces';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class SelectionGroupService {
|
|
5
|
-
private http;
|
|
5
|
+
private readonly http;
|
|
6
6
|
selectionGroups: import("@angular/core").WritableSignal<{
|
|
7
7
|
[key: string]: SelectionGroupDTO | null;
|
|
8
8
|
}>;
|
|
9
|
-
private loading;
|
|
10
|
-
private loaded;
|
|
9
|
+
private readonly loading;
|
|
10
|
+
private readonly loaded;
|
|
11
|
+
private readonly failures;
|
|
11
12
|
constructor(http: HttpClient);
|
|
13
|
+
private persistToLocalStorage;
|
|
12
14
|
private loadStatesFromLocalStorage;
|
|
15
|
+
private slimForStorage;
|
|
16
|
+
private invalidateStaleGroups;
|
|
13
17
|
fetchEnum(groupName: string, parentSelectionKey?: string): void;
|
|
14
|
-
isLoading(
|
|
18
|
+
isLoading(key: string): boolean;
|
|
15
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<SelectionGroupService, never>;
|
|
16
20
|
static ɵprov: i0.ɵɵInjectableDeclaration<SelectionGroupService>;
|
|
17
21
|
}
|
|
@@ -1,47 +1,167 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Injectable
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
import { take } from 'rxjs';
|
|
5
5
|
|
|
6
|
+
import { bridge } from 'aril/boot/bridge';
|
|
6
7
|
import { API_CONFIGS } from 'aril/boot/config/api';
|
|
7
8
|
|
|
8
|
-
import { SelectionGroupDTO, SelectionRequestDTO } from './interfaces/interfaces';
|
|
9
|
+
import { SelectionGroupDTO, SelectionGroupVersionDTO, SelectionRequestDTO } from './interfaces/interfaces';
|
|
10
|
+
|
|
11
|
+
// Key başına maksimum ardışık fetch hatası: limit aşılınca o key oturum boyu yeniden denenmez.
|
|
12
|
+
// Sınırsız retry'da kalıcı hata veren bir grup (örn. silinmiş grup → 404), diğer grupların her
|
|
13
|
+
// başarılı yüklemesinde (map güncellemesi tüm enum computed'larını yeniden çalıştırır) yeniden
|
|
14
|
+
// POST edilirdi → istek/console fırtınası.
|
|
15
|
+
const MAX_FETCH_FAILURES = 3;
|
|
9
16
|
|
|
10
17
|
@Injectable({
|
|
11
18
|
providedIn: 'root'
|
|
12
19
|
})
|
|
13
20
|
export class SelectionGroupService {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
// State cross-MFE paylaşımlı: bridge globalThis-singleton'ında yaşar (bkz. mfe-bridge.ts).
|
|
22
|
+
// Servis instance'ı MFE/tab başına çoğalsa da tüm okuma/yazma tek bridge state'ine gider.
|
|
23
|
+
selectionGroups = bridge.selectionGroups;
|
|
24
|
+
|
|
25
|
+
private readonly loading = bridge.selectionLoading;
|
|
26
|
+
private readonly loaded = bridge.selectionLoaded;
|
|
27
|
+
private readonly failures = bridge.selectionFailures;
|
|
28
|
+
|
|
29
|
+
constructor(private readonly http: HttpClient) {
|
|
30
|
+
// loadStates + invalidate yalnızca ilk instance'ta (cross-MFE bir kez): tek localStorage
|
|
31
|
+
// yüklemesi, tek `/versions` çağrısı. effect her instance'ta kurulur ama hepsi aynı paylaşılan
|
|
32
|
+
// state'i yazdığından ezme olmaz.
|
|
33
|
+
if (!bridge.selectionInitialized) {
|
|
34
|
+
bridge.selectionInitialized = true;
|
|
35
|
+
this.loadStatesFromLocalStorage();
|
|
36
|
+
this.invalidateStaleGroups();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
21
39
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
// localStorage'a slim cache yazar. `effect` YERİNE bilinçli olarak doğrudan çağrılır: signal'i
|
|
41
|
+
// değiştiren her yer (fetchEnum, invalidateStaleGroups) persist'i açıkça tetikler. NOT: webpack MF
|
|
42
|
+
// config'iyle `@angular/core` artık singleton shared olduğundan effect-tabanlı persist de çalışırdı;
|
|
43
|
+
// yine de açık/öngörülebilir olması (effect içinde gizli signal-write + NG0600 riski olmaması) için
|
|
44
|
+
// doğrudan çağrı tercih edildi.
|
|
45
|
+
private persistToLocalStorage() {
|
|
46
|
+
try {
|
|
47
|
+
const slim = this.slimForStorage(this.selectionGroups());
|
|
48
|
+
localStorage.setItem('selection-groups', btoa(encodeURI(JSON.stringify(slim))));
|
|
49
|
+
} catch {
|
|
50
|
+
// QuotaExceededError vb. → eski cache'i koru, yeni yazımı sessizce atla.
|
|
51
|
+
}
|
|
26
52
|
}
|
|
27
53
|
|
|
28
|
-
private
|
|
54
|
+
private loadStatesFromLocalStorage() {
|
|
29
55
|
const selectionGroups = localStorage.getItem('selection-groups');
|
|
30
56
|
|
|
31
57
|
if (selectionGroups) {
|
|
32
58
|
try {
|
|
33
59
|
const decodedData = decodeURI(atob(selectionGroups));
|
|
34
|
-
|
|
60
|
+
// Dynamic gruplar zaten persist edilmiyor (slimForStorage onları atlar) → ekstra
|
|
61
|
+
// filtre gerekmez; localStorage içeriği yalnızca Fixed gruplardır.
|
|
62
|
+
const restored: { [key: string]: SelectionGroupDTO | null } = JSON.parse(decodedData);
|
|
63
|
+
this.selectionGroups.set(restored);
|
|
64
|
+
|
|
65
|
+
// Restore edilen gruplar loaded sayılır: aksi halde koşulsuz fetchEnum çağıran
|
|
66
|
+
// consumer'lar guard'ı geçip her oturum yeniden çeker (cache faydası kaybolur).
|
|
67
|
+
// Stale'lik kontrolü invalidateStaleGroups'un işi. null entry'ler (legacy) loaded
|
|
68
|
+
// işaretlenmez — işaretlenirse o grup bir daha hiç yüklenemezdi.
|
|
69
|
+
Object.entries(restored).forEach(([key, group]) => {
|
|
70
|
+
if (group) this.loaded.set(key, true);
|
|
71
|
+
});
|
|
35
72
|
} catch (e) {
|
|
36
73
|
console.error(e);
|
|
37
74
|
}
|
|
38
75
|
}
|
|
39
76
|
}
|
|
40
77
|
|
|
78
|
+
// Dynamic grupları atlar + Fixed grupları yalnızca render (value/table/picker/export) ve invalidate
|
|
79
|
+
// için gerekli alanlara indirger. localStorage'da audit/id/açıklama gibi kullanılmayan alanları tutmaz.
|
|
80
|
+
private slimForStorage(groups: { [key: string]: SelectionGroupDTO | null }): { [key: string]: unknown } {
|
|
81
|
+
const out: { [key: string]: unknown } = {};
|
|
82
|
+
for (const [key, group] of Object.entries(groups)) {
|
|
83
|
+
if (!group || group.loadStrategy === 'Dynamic') continue;
|
|
84
|
+
out[key] = {
|
|
85
|
+
version: group.version,
|
|
86
|
+
selectionItems: (group.selectionItems ?? []).map((it) => ({
|
|
87
|
+
selectionKey: it.selectionKey,
|
|
88
|
+
selectionDisplay: it.selectionDisplay,
|
|
89
|
+
selectionMultiLanguageDisplays: it.selectionMultiLanguageDisplays,
|
|
90
|
+
showOrder: it.showOrder,
|
|
91
|
+
parentSelectionKey: it.parentSelectionKey
|
|
92
|
+
}))
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// App init'te enum version'larını çekip localStorage'daki stale grupları temizler.
|
|
99
|
+
// Silinen grup, tüketici component'lerin `if (!selectionGroup) fetchEnum()` guard'ıyla yeniden yüklenir.
|
|
100
|
+
private invalidateStaleGroups() {
|
|
101
|
+
// App-init snapshot: yalnızca localStorage'dan yüklenen gruplar kontrol edilir. Yanıt gelene
|
|
102
|
+
// kadar consumer'ların fetchEnum ile yüklediği taze gruplar taranmaz/silinmez (aksi halde
|
|
103
|
+
// taze grup silinir ve kalıcı per-component fetch guard'ları onu bir daha çekmeyebilir).
|
|
104
|
+
const keysToCheck = Object.keys(this.selectionGroups());
|
|
105
|
+
if (keysToCheck.length === 0) return;
|
|
106
|
+
|
|
107
|
+
const hostApi = API_CONFIGS.api.replace(/\/[^\/]+\/v1$/, `/host/v1`);
|
|
108
|
+
|
|
109
|
+
this.http
|
|
110
|
+
.get<SelectionGroupVersionDTO[]>(hostApi + '/selection-group/versions')
|
|
111
|
+
.pipe(take(1))
|
|
112
|
+
.subscribe({
|
|
113
|
+
next: (versions) => {
|
|
114
|
+
// Boş/bozuk yanıt güvenlik şeridi: aşağıdaki "listede olmayanı sil" kuralı
|
|
115
|
+
// boş listeyle tüm cache'i yanlışlıkla boşaltmasın.
|
|
116
|
+
if (!versions?.length) return;
|
|
117
|
+
|
|
118
|
+
const latest = new Map(versions.map((v) => [v.groupName, v.version] as [string, number]));
|
|
119
|
+
|
|
120
|
+
let changed = false;
|
|
121
|
+
const next = { ...this.selectionGroups() };
|
|
122
|
+
|
|
123
|
+
keysToCheck.forEach((key) => {
|
|
124
|
+
const group = next[key];
|
|
125
|
+
if (!group) return;
|
|
126
|
+
|
|
127
|
+
const separatorIndex = key.indexOf('~');
|
|
128
|
+
if (separatorIndex === -1) return;
|
|
129
|
+
|
|
130
|
+
const serverVersion = latest.get(key.substring(0, separatorIndex));
|
|
131
|
+
|
|
132
|
+
// serverVersion == null: grup /versions listesinde yok → sunucudan silinmiş /
|
|
133
|
+
// yeniden adlandırılmış demektir (endpoint Fixed grupların tam listesini döner)
|
|
134
|
+
// → o da evict edilir; kalırsa kaldırılmış enum değerleri süresiz render edilir.
|
|
135
|
+
if (serverVersion == null || serverVersion !== group.version) {
|
|
136
|
+
delete next[key];
|
|
137
|
+
this.loaded.delete(key);
|
|
138
|
+
this.failures.delete(key);
|
|
139
|
+
// Uçuştaki fetch'in flag'i korunur: silinirse ikinci bir consumer guard'ı
|
|
140
|
+
// geçip duplicate /load atar ve export-overlay'in isLoading poll'ü grubu
|
|
141
|
+
// beklemeden erken geçer. Yanıt geldiğinde flag'i fetchEnum kendisi yönetir.
|
|
142
|
+
if (!this.loading.get(key)) {
|
|
143
|
+
this.loading.delete(key);
|
|
144
|
+
}
|
|
145
|
+
changed = true;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
if (changed) {
|
|
150
|
+
this.selectionGroups.set(next);
|
|
151
|
+
this.persistToLocalStorage();
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
error: () => {
|
|
155
|
+
// versions endpoint yok/erişilemez: sessizce mevcut cache ile devam.
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
41
160
|
fetchEnum(groupName: string, parentSelectionKey: string = 'ALL') {
|
|
42
161
|
const key = groupName + '~' + parentSelectionKey;
|
|
43
162
|
|
|
44
163
|
if (this.loaded.get(key) || this.loading.get(key)) return;
|
|
164
|
+
if ((this.failures.get(key) ?? 0) >= MAX_FETCH_FAILURES) return;
|
|
45
165
|
|
|
46
166
|
const payload: SelectionRequestDTO = {
|
|
47
167
|
groupName,
|
|
@@ -56,18 +176,34 @@ export class SelectionGroupService {
|
|
|
56
176
|
this.http
|
|
57
177
|
.post<SelectionGroupDTO>(hostApi + '/selection-group/load', payload)
|
|
58
178
|
.pipe(take(1))
|
|
59
|
-
.subscribe(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
179
|
+
.subscribe({
|
|
180
|
+
next: (selectionGroup) => {
|
|
181
|
+
this.loading.set(key, false);
|
|
182
|
+
this.loaded.set(key, true);
|
|
183
|
+
this.failures.delete(key);
|
|
184
|
+
|
|
185
|
+
this.selectionGroups.update((groups) => ({
|
|
186
|
+
...groups,
|
|
187
|
+
[key]: selectionGroup
|
|
188
|
+
}));
|
|
189
|
+
|
|
190
|
+
this.persistToLocalStorage();
|
|
191
|
+
},
|
|
192
|
+
// HTTP hatasında loading'i sıfırla: aksi halde guard (loaded/loading) bu enum'u
|
|
193
|
+
// kilitler. loading/loaded bridge'de cross-MFE SHARED olduğundan, tek bir anlık hata
|
|
194
|
+
// bu enum'u TÜM remote'larda hard-reload'a kadar bir daha çekilemez yapardı. loading=false
|
|
195
|
+
// → sonraki fetchEnum (component init/retry) yeniden deneyebilir. loaded zaten false kalır.
|
|
196
|
+
// Deneme sayısı MAX_FETCH_FAILURES ile sınırlı: kalıcı hatada sonsuz retry önlenir.
|
|
197
|
+
error: () => {
|
|
198
|
+
this.loading.set(key, false);
|
|
199
|
+
this.failures.set(key, (this.failures.get(key) ?? 0) + 1);
|
|
200
|
+
}
|
|
67
201
|
});
|
|
68
202
|
}
|
|
69
203
|
|
|
70
|
-
|
|
71
|
-
|
|
204
|
+
// key formatı: `groupName~parentSelectionKey` (fetchEnum'daki composite key ile aynı).
|
|
205
|
+
// Direkt olarak groupName geçilirse Map'te eşleşme olmaz ve her zaman false döner.
|
|
206
|
+
isLoading(key: string): boolean {
|
|
207
|
+
return this.loading.get(key) ?? false;
|
|
72
208
|
}
|
|
73
209
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs","sources":["../../projects/aril/boot/mfe/src/appComponentLoader.ts","../../projects/aril/boot/mfe/src/isolated-location-strategy.ts","../../projects/aril/boot/mfe/src/monaco.config.ts","../../projects/aril/boot/mfe/src/bootstrap.ts","../../projects/aril/boot/mfe/aril-boot-mfe.ts"],"sourcesContent":["export const appComponentLoader = async () => {\r\n\tconst { AppComponent } = await import('./app.component');\r\n\treturn AppComponent;\r\n};","import { LocationStrategy } from '@angular/common';\r\nimport { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Host modda her MFE Application'ı için kullanılan custom `LocationStrategy`. Browser\r\n * URL'ine (`window.location.hash`) HİÇ YAZMAZ; tüm path/state internal alanlarda tutulur.\r\n *\r\n * Neden? Host modda host Router yegane URL kontrolcüsüdür. Eğer MFE Router da\r\n * `HashLocationStrategy` kullansaydı, MFE içindeki bir `routerLink` tıklaması browser hash'ını\r\n * değiştirir → `HashLocationStrategy` host Router'ı OTOMATİK tetikler → host Router'a\r\n * tabsız (state'siz) navigation gelir → Strategy yanlış componentRef yaratır, tab\r\n * izolasyonu bozulur. Bu otomatik sync'i kırmak için MFE Router'ın LocationStrategy'sini\r\n * isolate ediyoruz: MFE içi navigation MFE Router'ın internal state'inde kalır, browser'a\r\n * sızmaz, host'a istemsiz event göndermez.\r\n *\r\n * ## Tab içi history stack\r\n * Browser back/forward butonu yerine MFE içinde **tab-içi history stack** çalışır:\r\n * `pushState` her yeni navigation'da `backStack`'e mevcut konumu iter, `forwardStack`'i\r\n * temizler; `back()` ve `forward()` stack'ler arasında değiş tokuş yapıp `popstate` event'i\r\n * emit eder — Angular `Location` service bunu Router'a iletir, Router popstate-driven\r\n * navigation cycle başlatır. Sonuçta kullanıcı **detay → liste** gibi MFE içi geri dönüşleri\r\n * browser back butonuyla yapabilir, ama bu navigation **host Router'a yansımaz** → tab\r\n * izolasyonu korunur, \"geri\" başka tab'a atlatmaz.\r\n */\r\n@Injectable()\r\nexport class IsolatedLocationStrategy extends LocationStrategy {\r\n\t/**\r\n\t * Stack boyutu üst limiti — browser default'una (50 entry) yakın. Aşırı uzun\r\n\t * session'larda memory'i sınırlı tutar; sınır aşıldığında en eski entry düşürülür.\r\n\t */\r\n\tprivate static readonly MAX_STACK_SIZE = 50;\r\n\r\n\tprivate internalPath = '/';\r\n\tprivate internalState: unknown = null;\r\n\t/** Geri gidilebilecek path/state çiftleri (LIFO). */\r\n\tprivate backStack: { path: string; state: unknown }[] = [];\r\n\t/** İleri gidilebilecek path/state çiftleri (`back()` ile pop edilen entry'ler). */\r\n\tprivate forwardStack: { path: string; state: unknown }[] = [];\r\n\tprivate popStateHandlers: ((event: PopStateEvent) => void)[] = [];\r\n\t/**\r\n\t * `back/forward` sonrası Router'ın navigation cycle'ı sırasında çağrılabilen\r\n\t * `pushState`'i `backStack`'e tekrar itmemek için flag. `replaceState` zaten stack'i\r\n\t * değiştirmiyor — bu flag yalnızca pushState yolunu koruyor.\r\n\t */\r\n\tprivate isNavigatingViaHistory = false;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tconsole.log('[IsolatedLocationStrategy] CONSTRUCTED — host modda MFE Router için aktif');\r\n\t}\r\n\r\n\toverride path(_includeHash?: boolean): string {\r\n\t\treturn this.internalPath;\r\n\t}\r\n\r\n\toverride prepareExternalUrl(internal: string): string {\r\n\t\t// Host `HashLocationStrategy` (withHashLocation) kullanıyor → MFE routerLink'lerinin\r\n\t\t// ürettiği `<a href>` (hover/kopyalama/orta-tık/yeni sekme) host ile uyumlu `#/...`\r\n\t\t// formatında olmalı. Sol-tık navigation'ı zaten host Router proxy üzerinden gider\r\n\t\t// (href kullanılmaz); bu override yalnız görünen/kopyalanan URL'i düzeltir.\r\n\t\treturn internal.length > 0 ? '#' + internal : internal;\r\n\t}\r\n\r\n\toverride pushState(state: unknown, _title: string, url: string, queryParams: string): void {\r\n\t\tconst fullPath = url + (queryParams ? `?${queryParams}` : '');\r\n\t\tconsole.log(`[IsolatedLocationStrategy] pushState url=\"${url}\" qs=\"${queryParams}\" viaHistory=${this.isNavigatingViaHistory}`);\r\n\t\tif (!this.isNavigatingViaHistory) {\r\n\t\t\t// Yeni navigation → mevcut konumu backStack'e it, forwardStack'i temizle\r\n\t\t\t// (browser semantiği: yeni sayfaya gidince forward history düşer).\r\n\t\t\tif (this.internalPath !== fullPath) {\r\n\t\t\t\tthis.backStack.push({ path: this.internalPath, state: this.internalState });\r\n\t\t\t\tif (this.backStack.length > IsolatedLocationStrategy.MAX_STACK_SIZE) {\r\n\t\t\t\t\tthis.backStack.shift();\r\n\t\t\t\t}\r\n\t\t\t\tthis.forwardStack = [];\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.internalPath = fullPath;\r\n\t\tthis.internalState = state;\r\n\t}\r\n\r\n\toverride replaceState(state: unknown, _title: string, url: string, queryParams: string): void {\r\n\t\tconsole.log(`[IsolatedLocationStrategy] replaceState url=\"${url}\" qs=\"${queryParams}\"`);\r\n\t\tthis.internalPath = url + (queryParams ? `?${queryParams}` : '');\r\n\t\tthis.internalState = state;\r\n\t}\r\n\r\n\toverride back(): void {\r\n\t\tconst prev = this.backStack.pop();\r\n\t\tif (!prev) return;\r\n\t\tthis.forwardStack.push({ path: this.internalPath, state: this.internalState });\r\n\t\tthis.internalPath = prev.path;\r\n\t\tthis.internalState = prev.state;\r\n\t\tthis.emitPopState();\r\n\t}\r\n\r\n\toverride forward(): void {\r\n\t\tconst next = this.forwardStack.pop();\r\n\t\tif (!next) return;\r\n\t\tthis.backStack.push({ path: this.internalPath, state: this.internalState });\r\n\t\tthis.internalPath = next.path;\r\n\t\tthis.internalState = next.state;\r\n\t\tthis.emitPopState();\r\n\t}\r\n\r\n\toverride historyGo(relativePosition: number): void {\r\n\t\tif (relativePosition < 0) {\r\n\t\t\tconst steps = -relativePosition;\r\n\t\t\tfor (let i = 0; i < steps && this.backStack.length; i++) this.back();\r\n\t\t} else if (relativePosition > 0) {\r\n\t\t\tfor (let i = 0; i < relativePosition && this.forwardStack.length; i++) this.forward();\r\n\t\t}\r\n\t}\r\n\r\n\toverride onPopState(fn: (event: PopStateEvent) => void): void {\r\n\t\tthis.popStateHandlers.push(fn);\r\n\t}\r\n\r\n\tprivate emitPopState(): void {\r\n\t\tthis.isNavigatingViaHistory = true;\r\n\t\ttry {\r\n\t\t\tconst event = new PopStateEvent('popstate', { state: this.internalState });\r\n\t\t\tfor (const fn of this.popStateHandlers) fn(event);\r\n\t\t} finally {\r\n\t\t\t// Router'ın navigation cycle'ı async — popstate handler'ı navigation tetikledikten\r\n\t\t\t// sonra cycle bittiğinde pushState/replaceState çağrılabilir. Microtask sınırı\r\n\t\t\t// sync cycle'ı kapsar; daha güvenli istersek `queueMicrotask` yerine `setTimeout(0)`\r\n\t\t\t// tercih edilebilir ama bu durumda araya gerçek user navigation girebilir. Microtask\r\n\t\t\t// pratikte yeterli: Router popstate cycle'ında pushState değil replaceState çağırır.\r\n\t\t\tqueueMicrotask(() => {\r\n\t\t\t\tthis.isNavigatingViaHistory = false;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\toverride getBaseHref(): string {\r\n\t\treturn '/';\r\n\t}\r\n\r\n\toverride getState(): unknown {\r\n\t\treturn this.internalState;\r\n\t}\r\n}\r\n","declare const monaco: any;\r\n\r\nexport const monacoConfig = {\r\n\tbaseUrl: 'assets',\r\n\tdefaultOptions: { scrollBeyondLastLine: false },\r\n\tonMonacoLoad: () => {\r\n\t\t// JSON düzenleyici ayarları\r\n\t\tif (monaco && monaco.languages && monaco.languages.json) {\r\n\t\t\tmonaco.languages.json.jsonDefaults.setDiagnosticsOptions({\r\n\t\t\t\tvalidate: true,\r\n\t\t\t\tallowComments: false,\r\n\t\t\t\tschemas: []\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// JavaScript/TypeScript düzenleyici ayarları\r\n\t\tif (monaco && monaco.languages && monaco.languages.typescript) {\r\n\t\t\tmonaco.languages.typescript.javascriptDefaults.setCompilerOptions({\r\n\t\t\t\ttarget: monaco.languages.typescript.ScriptTarget.ES2016,\r\n\t\t\t\tallowNonTsExtensions: true,\r\n\t\t\t\tmoduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,\r\n\t\t\t\tmodule: monaco.languages.typescript.ModuleKind.CommonJS,\r\n\t\t\t\tnoEmit: true,\r\n\t\t\t\ttypeRoots: ['node_modules/@types']\r\n\t\t\t});\r\n\r\n\t\t\t// TypeScript düzenleyici ayarları\r\n\t\t\tmonaco.languages.typescript.typescriptDefaults.setCompilerOptions({\r\n\t\t\t\ttarget: monaco.languages.typescript.ScriptTarget.ES2016,\r\n\t\t\t\tallowNonTsExtensions: true,\r\n\t\t\t\tmoduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,\r\n\t\t\t\tmodule: monaco.languages.typescript.ModuleKind.CommonJS,\r\n\t\t\t\tnoEmit: true,\r\n\t\t\t\ttypeRoots: ['node_modules/@types']\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// HTML, XML ve diğer markup dilleri için ayarlar\r\n\t\tif (monaco && monaco.languages && monaco.languages.html) {\r\n\t\t\tmonaco.languages.html.htmlDefaults.setOptions({\r\n\t\t\t\tformat: {\r\n\t\t\t\t\ttabSize: 2,\r\n\t\t\t\t\tinsertSpaces: true\r\n\t\t\t\t},\r\n\t\t\t\tsuggest: {\r\n\t\t\t\t\thtml5: true\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Python için syntax highlighting ve özel formatlamalar\r\n\t\tif (monaco && monaco.languages) {\r\n\t\t\tmonaco.languages.registerDocumentFormattingEditProvider('python', {\r\n\t\t\t\tprovideDocumentFormattingEdits: function (model: any) {\r\n\t\t\t\t\tconst text = model.getValue();\r\n\t\t\t\t\treturn [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\trange: model.getFullModelRange(),\r\n\t\t\t\t\t\t\ttext: text\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Python için özel linting kuralları\r\n\t\t\tmonaco.languages.registerCompletionItemProvider('python', {\r\n\t\t\t\tprovideCompletionItems: function (model: any, position: any) {\r\n\t\t\t\t\tconst suggestions = [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'def',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'def ${1:function_name}(${2:parameters}):\\n\\t${3:pass}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Fonksiyon tanımlama'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'class',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'class ${1:ClassName}:\\n\\tdef __init__(self, ${2:parameters}):\\n\\t\\t${3:pass}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Sınıf tanımlama'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'if',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'if ${1:condition}:\\n\\t${2:pass}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'If bloğu'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'for',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'for ${1:item} in ${2:iterable}:\\n\\t${3:pass}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'For döngüsü'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\treturn { suggestions: suggestions };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Lua için özel ayarlar\r\n\t\tif (monaco && monaco.languages) {\r\n\t\t\tmonaco.languages.registerDocumentFormattingEditProvider('lua', {\r\n\t\t\t\tprovideDocumentFormattingEdits: function (model: any) {\r\n\t\t\t\t\tconst text = model.getValue();\r\n\t\t\t\t\treturn [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\trange: model.getFullModelRange(),\r\n\t\t\t\t\t\t\ttext: text\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tmonaco.languages.registerCompletionItemProvider('lua', {\r\n\t\t\t\tprovideCompletionItems: function (model: any, position: any) {\r\n\t\t\t\t\tconst suggestions = [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'function',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'function ${1:name}(${2:params})\\n\\t${3:-- body}\\nend',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Fonksiyon tanımlama'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'if',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'if ${1:condition} then\\n\\t${2:-- body}\\nend',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'If bloğu'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'for',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'for ${1:i}=${2:1},${3:10} do\\n\\t${4:-- body}\\nend',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'For döngüsü'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\treturn { suggestions: suggestions };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Java için özel ayarlar\r\n\t\tif (monaco && monaco.languages) {\r\n\t\t\tmonaco.languages.registerDocumentFormattingEditProvider('java', {\r\n\t\t\t\tprovideDocumentFormattingEdits: function (model: any) {\r\n\t\t\t\t\tconst text = model.getValue();\r\n\t\t\t\t\t// Java formatlaması\r\n\t\t\t\t\treturn [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\trange: model.getFullModelRange(),\r\n\t\t\t\t\t\t\ttext: text // Formatlanmış metin\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Java için özel öneriler\r\n\t\t\tmonaco.languages.registerCompletionItemProvider('java', {\r\n\t\t\t\tprovideCompletionItems: function (model: any, position: any) {\r\n\t\t\t\t\tconst suggestions = [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'class',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Keyword,\r\n\t\t\t\t\t\t\tinsertText: 'public class ${1:ClassName} {\\n\\t${2}\\n}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Sınıf tanımlama'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'main',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Snippet,\r\n\t\t\t\t\t\t\tinsertText: 'public static void main(String[] args) {\\n\\t${1}\\n}',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Main metodu'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'sout',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Snippet,\r\n\t\t\t\t\t\t\tinsertText: 'System.out.println(${1});',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Konsola yazdırma'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\treturn { suggestions: suggestions };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// HTML için özel ayarlar\r\n\t\tif (monaco && monaco.languages) {\r\n\t\t\tmonaco.languages.registerCompletionItemProvider('html', {\r\n\t\t\t\tprovideCompletionItems: function (model: any, position: any) {\r\n\t\t\t\t\tconst suggestions = [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'html5',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Snippet,\r\n\t\t\t\t\t\t\tinsertText:\r\n\t\t\t\t\t\t\t\t'<!DOCTYPE html>\\n<html lang=\"en\">\\n<head>\\n\\t<meta charset=\"UTF-8\">\\n\\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n\\t<title>${1:Document}</title>\\n</head>\\n<body>\\n\\t${2}\\n</body>\\n</html>',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'HTML5 taslağı'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'div',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Snippet,\r\n\t\t\t\t\t\t\tinsertText: '<div class=\"${1:className}\">\\n\\t${2}\\n</div>',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'Div elementi'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\treturn { suggestions: suggestions };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// XML için özel ayarlar\r\n\t\tif (monaco && monaco.languages) {\r\n\t\t\tmonaco.languages.registerCompletionItemProvider('xml', {\r\n\t\t\t\tprovideCompletionItems: function (model: any, position: any) {\r\n\t\t\t\t\tconst suggestions = [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlabel: 'xml',\r\n\t\t\t\t\t\t\tkind: monaco.languages.CompletionItemKind.Snippet,\r\n\t\t\t\t\t\t\tinsertText: '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<${1:root}>\\n\\t${2}\\n</${1:root}>',\r\n\t\t\t\t\t\t\tinsertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\r\n\t\t\t\t\t\t\tdocumentation: 'XML taslağı'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t];\r\n\r\n\t\t\t\t\treturn { suggestions: suggestions };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// JSON için özel ayarlar ve şema doğrulama\r\n\t\tif (monaco && monaco.languages && monaco.languages.json) {\r\n\t\t\tmonaco.languages.json.jsonDefaults.setDiagnosticsOptions({\r\n\t\t\t\tvalidate: true,\r\n\t\t\t\tallowComments: false,\r\n\t\t\t\tschemas: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\turi: 'http://myserver/schema/package.schema.json',\r\n\t\t\t\t\t\tfileMatch: ['package.json'],\r\n\t\t\t\t\t\tschema: {\r\n\t\t\t\t\t\t\ttype: 'object',\r\n\t\t\t\t\t\t\tproperties: {\r\n\t\t\t\t\t\t\t\tname: { type: 'string' },\r\n\t\t\t\t\t\t\t\tversion: { type: 'string' },\r\n\t\t\t\t\t\t\t\tdependencies: {\r\n\t\t\t\t\t\t\t\t\ttype: 'object'\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]\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n","import { Location, LocationStrategy } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n\tAPP_INITIALIZER,\r\n\tApplicationConfig,\r\n\tApplicationRef,\r\n\tComponentRef,\r\n\tEnvironmentInjector,\r\n\tEnvironmentProviders,\r\n\tProvider,\r\n\tcreateComponent,\r\n\tcreateEnvironmentInjector,\r\n\timportProvidersFrom,\r\n\tisDevMode,\r\n\tɵINJECTOR_SCOPE\r\n} from '@angular/core';\r\nimport { createApplication } from '@angular/platform-browser';\r\nimport {\r\n\tChildrenOutletContexts,\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tUrlSerializer,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithRouterConfig\r\n} from '@angular/router';\r\n\r\nimport { ConfirmationService, MessageService, PrimeNGConfig } from 'primeng/api';\r\n\r\nimport { TranslocoService } from '@ngneat/transloco';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\nimport { MonacoEditorModule, NGX_MONACO_EDITOR_CONFIG } from 'ngx-monaco-editor-v2';\r\n\r\nimport { createBaseAppConfig } from 'aril/boot/base';\r\nimport { setApiConfigOnMFEMode } from 'aril/boot/config/api';\r\nimport { Apps, CustomRouteReuseStrategy, PluginMenuItem, TabAwareUrlSerializer } from 'aril/boot/config/apps';\r\nimport { getNgZone, loadPlugins } from 'aril/boot/config/plugins';\r\nimport { i18nFolderName } from 'aril/i18n';\r\nimport { provideHost } from 'aril/provider';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appComponentLoader } from './appComponentLoader';\r\nimport { IsolatedLocationStrategy } from './isolated-location-strategy';\r\nimport { monacoConfig } from './monaco.config';\r\n\r\nexport var appName: Apps;\r\nexport var menuItems: PluginMenuItem[] = [];\r\n\r\n/**\r\n * `boot` çağrılarının idempotent kalmasını sağlayan sync guard. Aynı remote için\r\n * birden fazla paralel `boot('wdm', ...)` çağrısı geldiğinde, ilk `customElements.define`\r\n * tamamlanmadan ikinci çağrı `customElements.get` guard'ını geçiyordu → her ikisi de\r\n * define etmeye çalışıp `NotSupportedError: the name \"app-wdm\" has already been used`\r\n * hatası fırlatılıyordu. Set ile sync mark ederek tek bir define cycle'ı garanti ediyoruz.\r\n */\r\nconst bootedApps = new Set<string>();\r\n\r\nexport const boot = (_appName: Apps, _routes: Routes, _menuItems: PluginMenuItem[]) => {\r\n\tif (bootedApps.has(_appName) || customElements.get(`app-${_appName}`)) return;\r\n\tbootedApps.add(_appName);\r\n\r\n\tappName = _appName;\r\n\tmenuItems = _menuItems;\r\n\r\n\t/**\r\n\t * **Paylaşılan base config** — remote başına TEK `createApplication`. Ağır servisler\r\n\t * (HttpClient + interceptor chain, Keycloak, i18n/Transloco, Monaco, animations) burada\r\n\t * yaşar; `providedIn` taşımayan explicit provider oldukları için tüm tab'ların child\r\n\t * injector'larından parent olarak paylaşılır → RAM lineer büyümez. Router/Location/\r\n\t * ReuseStrategy/UrlSerializer burada YOK; onlar tab başına izole child injector'da verilir.\r\n\t */\r\n\tconst sharedBaseConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: _appName }),\r\n\t\t\tprovideHost(_appName),\r\n\t\t\tgetNgZone(),\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (httpClient: HttpClient, keycloak: KeycloakService, folderName: typeof i18nFolderName) => {\r\n\t\t\t\t\tconst runApiInit = setApiConfigOnMFEMode(httpClient, keycloak, folderName as unknown as Apps);\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 runApiInit();\r\n\t\t\t\t\t\trunLoadPlugins();\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: [HttpClient, KeycloakService, i18nFolderName]\r\n\t\t\t},\r\n\t\t\timportProvidersFrom(MonacoEditorModule.forRoot()),\r\n\t\t\t{ provide: NGX_MONACO_EDITOR_CONFIG, useValue: monacoConfig }\r\n\t\t]\r\n\t};\r\n\r\n\t/**\r\n\t * Remote başına TEK paylaşılan `ApplicationRef` — closure-scope. İlk `<app-${appName}>`\r\n\t * element'i `createApplication(sharedBaseConfig)` çağırır, sonraki tüm element'ler aynı\r\n\t * promise'ı bekler (duplicate Application yaratımı imkânsız). Her element kendi child\r\n\t * injector + `createComponent` ile kendi `AppComponent` view'ını yaratıp shared app'e\r\n\t * `attachView` ile bağlar. Shared app uzun ömürlüdür (tab'lar kapansa da destroy edilmez).\r\n\t *\r\n\t * `childProviders`'taki `TranslocoService` factory'si bu referansı kullandığı için\r\n\t * `childProviders`'tan ÖNCE tanımlanır (forward TDZ'yi önler).\r\n\t */\r\n\tlet sharedAppRef: ApplicationRef | null = null;\r\n\tlet sharedAppPromise: Promise<ApplicationRef> | null = null;\r\n\r\n\t/**\r\n\t * **Tab başına izole Router stack** — her `<app-${appName}>` kendi child\r\n\t * `EnvironmentInjector`'ında bunları alır. `ɵINJECTOR_SCOPE: 'root'` child'ı 'root'\r\n\t * scope yapar (Angular `R3Injector` ctor: `scopes.add('root')`); böylece `provideRouter`'ın\r\n\t * inject ettiği `providedIn:'root'` Router servisleri — `Router`, `ChildrenOutletContexts`,\r\n\t * `Location`, `NavigationTransitions` vb. — child-LOCAL üretilir. Sonuç: her tab kendi\r\n\t * Router + kendi `RouterOutlet` context'ine sahip olur → **1 Router : 1 outlet**.\r\n\t *\r\n\t * Neden gerekli: paylaşılan tek Application'da N `<router-outlet>` aynı tek\r\n\t * `ChildrenOutletContexts`'e \"primary\" diye kaydolup birbirini eziyordu (`contexts.set`\r\n\t * overwrite) → tab geçişi sonrası aynı tab içi navigasyon (list→detail) yanlış outlet'e\r\n\t * render oluyordu. Child-injector izolasyonu bunu kökten çözer.\r\n\t *\r\n\t * **TranslocoService istisnası**: `'root'` scope onu da child-local yapardı; ama global\r\n\t * (scope'suz) çeviriler shared app'in init akışında yüklendiğinden — `createComponent`\r\n\t * `APP_INITIALIZER` çalıştırmaz — child-local service'in global cache'i boş kalıp ham key\r\n\t * gösteriyordu. Tab başına ayrı dil senaryosu yok; service'i shared app'ten paylaştırıyoruz\r\n\t * (global çeviri tek yerde yüklenir, tek translation cache → ek RAM kazancı). Scope çevirileri\r\n\t * (`providei18nScope`) component-level sağlandığı için paylaşılan service'le de çalışır.\r\n\t *\r\n\t * NOT: `ɵINJECTOR_SCOPE` Angular private API'sidir; minor sürüm yükseltmelerinde davranışı\r\n\t * doğrulanmalı (aşağıdaki POC izolasyon log'u bunun için bırakıldı).\r\n\t */\r\n\tconst childProviders: Array<Provider | EnvironmentProviders> = [\r\n\t\t{ provide: ɵINJECTOR_SCOPE, useValue: 'root' },\r\n\t\tprovideRouter(\r\n\t\t\t_routes,\r\n\t\t\twithComponentInputBinding(),\r\n\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t),\r\n\t\t{ provide: LocationStrategy, useClass: IsolatedLocationStrategy },\r\n\t\t{ provide: Location, useClass: Location },\r\n\t\t{ provide: RouteReuseStrategy, useExisting: CustomRouteReuseStrategy },\r\n\t\t{ provide: UrlSerializer, useExisting: TabAwareUrlSerializer },\r\n\t\t{ provide: TranslocoService, useFactory: () => sharedAppRef!.injector.get(TranslocoService) },\r\n\t\t// `ɵINJECTOR_SCOPE:'root'` yan etkisi: `ApplicationRef` de `providedIn:'root'` olduğu için\r\n\t\t// child injector'da child-LOKAL (sahte) bir instance üretilirdi — bu instance NgZone'un\r\n\t\t// tick döngüsüne bağlı DEĞİLDİR. Sonuç: bu appRef'e `attachView` edilen view'lar hiç change\r\n\t\t// detection almaz. AppComponent'i biz açıkça `sharedAppRef.attachView` ile bağladığımız için\r\n\t\t// çalışır; ama `inject(ApplicationRef)` yapan üçüncü taraf kod (PrimeNG `DialogService` →\r\n\t\t// `this.appRef.attachView`) child-local sahte appRef'i alıp dialog'u ona bağlıyordu → dialog\r\n\t\t// yaratılıyor ama `*ngIf=\"visible\"` hiç render edilmiyordu (boş açılıyordu). Gerçek (tek,\r\n\t\t// tick alan) `sharedAppRef`'e sabitliyoruz.\r\n\t\t{ provide: ApplicationRef, useFactory: () => sharedAppRef! },\r\n\t\t// Tarama (log15) ile saptanan, child-local olunca bozulan ek `providedIn:'root'` servisleri:\r\n\t\t// • PubSubService — MFE'nin `breadcrumbUpdated` event'i host `history.service`'e ulaşmalı;\r\n\t\t// child-local olunca MFE↔host event köprüsü kopuyordu.\r\n\t\t// • PrimeNGConfig — dinamik dialog'lar shared root context'inde yaratıldığı için PrimeNG\r\n\t\t// çevirileri (calendar/paginator vb.) ve `setTranslation` shared instance'tan okunmalı.\r\n\t\t// (BreadcrumbService bilinçli olarak child-local bırakıldı: her tab kendi breadcrumb'ı.)\r\n\t\t{ provide: PubSubService, useFactory: () => sharedAppRef!.injector.get(PubSubService) },\r\n\t\t{ provide: PrimeNGConfig, useFactory: () => sharedAppRef!.injector.get(PrimeNGConfig) },\r\n\t\t// Toast/confirm GLOBAL: tek shared MessageService/ConfirmationService. Aksi halde her tab\r\n\t\t// kendi instance'ına sahip olur → host'tan tetiklenen toast MFE tab'ında (ya da tersi)\r\n\t\t// görünmez. Shared instance ile tüm `<p-toast key=\"toast-root\">` container'ları aynı kuyruğu dinler.\r\n\t\t{ provide: MessageService, useFactory: () => sharedAppRef!.injector.get(MessageService) },\r\n\t\t{ provide: ConfirmationService, useFactory: () => sharedAppRef!.injector.get(ConfirmationService) }\r\n\t];\r\n\r\n\tconst appComponentPromise = appComponentLoader();\r\n\r\n\tclass MFEAppElement extends HTMLElement {\r\n\t\tprivate childInjector: EnvironmentInjector | null = null;\r\n\t\tprivate compRef: ComponentRef<unknown> | null = null;\r\n\t\tprivate isBootstrapping = false;\r\n\t\tprivate destroyTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n\t\tasync connectedCallback(): Promise<void> {\r\n\t\t\t// Strategy hidden container ↔ view arası taşımalarda re-bootstrap'ı önle —\r\n\t\t\t// view zaten yaratıldıysa skip. destroyTimer pending ise iptal et.\r\n\t\t\tif (this.compRef || this.isBootstrapping) {\r\n\t\t\t\tif (this.destroyTimer) {\r\n\t\t\t\t\tclearTimeout(this.destroyTimer);\r\n\t\t\t\t\tthis.destroyTimer = null;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.isBootstrapping = true;\r\n\t\t\ttry {\r\n\t\t\t\t// Paylaşılan Application — ilk çağıran yaratır, diğerleri aynı promise'ı bekler.\r\n\t\t\t\tif (!sharedAppPromise) {\r\n\t\t\t\t\tsharedAppPromise = createApplication(sharedBaseConfig);\r\n\t\t\t\t}\r\n\t\t\t\tconst [appRef, AppComponent] = await Promise.all([sharedAppPromise, appComponentPromise]);\r\n\t\t\t\tsharedAppRef = appRef;\r\n\r\n\t\t\t\t// Bu tab için izole Router stack'i barındıran child injector.\r\n\t\t\t\tconst tabId = this.getAttribute('aril-tab-id') ?? '';\r\n\t\t\t\tthis.childInjector = createEnvironmentInjector(\r\n\t\t\t\t\tchildProviders,\r\n\t\t\t\t\tappRef.injector,\r\n\t\t\t\t\t`mfe:${_appName}:${tabId || 'pending'}`\r\n\t\t\t\t);\r\n\r\n\t\t\t\t// [Hibrit izolasyon guard — kalıcı] `ɵINJECTOR_SCOPE:'root'` ile child injector'ın\r\n\t\t\t\t// KENDİ Router + ChildrenOutletContexts'i olması, tab izolasyonunun temelidir\r\n\t\t\t\t// (\"1 Router : 1 outlet\"). Bu private API Angular upgrade'inde davranış değiştirirse\r\n\t\t\t\t// burada erken yakalanır; aksi halde \"1 Router : N outlet\" bug'ı sessizce geri döner.\r\n\t\t\t\tif (isDevMode() && this.childInjector.get(Router) === appRef.injector.get(Router)) {\r\n\t\t\t\t\tconsole.error(\r\n\t\t\t\t\t\t`[boot:${_appName}] HİBRİT İZOLASYON BOZULDU: child Router shared root ile aynı instance! ` +\r\n\t\t\t\t\t\t\t`ɵINJECTOR_SCOPE davranışı değişmiş olabilir (Angular upgrade?) — tab izolasyonu çalışmaz.`\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// AppComponent'i child injector context'inde yarat → inject(Router)/LocationStrategy\r\n\t\t\t\t// child-local; inject(MfeBridge)/HttpClient/Keycloak/TranslocoService vb. parent'tan\r\n\t\t\t\t// paylaşımlı. `attachView` shared app'in change detection döngüsüne bağlar. (`bootstrap`\r\n\t\t\t\t// değil: APP_BOOTSTRAP_LISTENER çalışmaz, child Router'ın initial navigation'ını\r\n\t\t\t\t// AppComponent host-Router sync'i `safeNavigate` ile yapıyor.)\r\n\t\t\t\tthis.compRef = createComponent(AppComponent as never, {\r\n\t\t\t\t\tenvironmentInjector: this.childInjector,\r\n\t\t\t\t\thostElement: this\r\n\t\t\t\t});\r\n\t\t\t\tappRef.attachView(this.compRef.hostView);\r\n\t\t\t\t// Başarılı boot: guard artık `compRef` üzerinden çalışır → `isBootstrapping`'i bırak.\r\n\t\t\t\t// (await sırasında disconnect olup hata oluşmazsa flag takılı kalmasın; aksi halde\r\n\t\t\t\t// reconnect'te guard erken return edip tab'ı kalıcı boş bırakır.)\r\n\t\t\t\tthis.isBootstrapping = false;\r\n\t\t\t} catch (err) {\r\n\t\t\t\tconsole.error(`[boot:${_appName}] application bootstrap hatası:`, err);\r\n\t\t\t\tthis.isBootstrapping = false;\r\n\t\t\t\t// sharedApp henüz set edilmediyse (createApplication başarısız) promise'ı sıfırla ki\r\n\t\t\t\t// sonraki tab retry edebilsin — aksi halde rejected promise closure'da kalıcı kalır ve\r\n\t\t\t\t// remote sayfa yenilemeden bir daha boot edilemez. (createComponent hatasında\r\n\t\t\t\t// sharedAppRef zaten set'tir; o durumda promise korunur, app yeniden yaratılmaz.)\r\n\t\t\t\tif (!sharedAppRef) sharedAppPromise = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdisconnectedCallback(): void {\r\n\t\t\t// Strategy hidden container ↔ view arası taşımalarda `removeChild` + `appendChild`\r\n\t\t\t// ardışık olduğu için disconnectedCallback parent değişimiyle tetiklenir — element\r\n\t\t\t// gerçekten destroy edilmiyor. `preserveWebComponentElement` öncesinde Strategy\r\n\t\t\t// `__arilPreserveDuringDetach` flag'i set ediyor; o flag varsa view korunur.\r\n\t\t\tconst preserveFlag = (this as HTMLElement & { __arilPreserveDuringDetach?: boolean }).__arilPreserveDuringDetach;\r\n\t\t\tif (preserveFlag) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// Flag yok → gerçek destroy. Async re-connect ihtimaline karşı microtask sınırlı\r\n\t\t\t// defansif gecikme; bir sonraki tick'te hâlâ disconnected mı diye son kontrol.\r\n\t\t\tif (this.destroyTimer) clearTimeout(this.destroyTimer);\r\n\t\t\tthis.destroyTimer = setTimeout(() => {\r\n\t\t\t\tif (!this.isConnected && this.compRef) {\r\n\t\t\t\t\tconsole.log(`[boot:${_appName}] gerçek destroy → view + child injector destroy`);\r\n\t\t\t\t\t// Shared app'e ASLA dokunma; sadece bu tab'ın view'ını ve child injector'ını yık.\r\n\t\t\t\t\tif (sharedAppRef) sharedAppRef.detachView(this.compRef.hostView);\r\n\t\t\t\t\tthis.compRef.destroy();\r\n\t\t\t\t\tthis.childInjector?.destroy();\r\n\t\t\t\t\tthis.compRef = null;\r\n\t\t\t\t\tthis.childInjector = null;\r\n\t\t\t\t\tthis.isBootstrapping = false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.destroyTimer = null;\r\n\t\t\t}, 0);\r\n\t\t}\r\n\t}\r\n\r\n\ttry {\r\n\t\tcustomElements.define(`app-${appName}`, MFEAppElement);\r\n\t} catch (e) {\r\n\t\tif (e instanceof DOMException && e.name === 'NotSupportedError') {\r\n\t\t\tconsole.warn(`[boot:${appName}] custom element zaten tanımlı, define atlandı`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthrow e;\r\n\t}\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵINJECTOR_SCOPE"],"mappings":"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"}
|