@hai3/framework 0.2.0-alpha.3 → 0.4.0-alpha.0
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/CLAUDE.md +194 -19
- package/dist/index.cjs +470 -521
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +308 -81
- package/dist/index.d.ts +308 -81
- package/dist/index.js +458 -504
- package/dist/index.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +30 -117
- package/dist/types.d.ts +30 -117
- package/llms.txt +122 -13
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -64,11 +64,10 @@ var HAI3AppBuilderImpl = class {
|
|
|
64
64
|
const app = {
|
|
65
65
|
config: this.config,
|
|
66
66
|
store,
|
|
67
|
-
screensetRegistry: aggregated.registries.screensetRegistry,
|
|
68
67
|
themeRegistry: aggregated.registries.themeRegistry,
|
|
69
|
-
routeRegistry: aggregated.registries.routeRegistry,
|
|
70
68
|
apiRegistry,
|
|
71
69
|
i18nRegistry: aggregated.registries.i18nRegistry,
|
|
70
|
+
screensetsRegistry: aggregated.registries.screensetsRegistry,
|
|
72
71
|
actions: aggregated.actions,
|
|
73
72
|
destroy: () => this.destroyApp(orderedPlugins, app)
|
|
74
73
|
};
|
|
@@ -127,7 +126,7 @@ Add the missing plugin: .use(${depName}())`
|
|
|
127
126
|
const registries = {};
|
|
128
127
|
const slices = [];
|
|
129
128
|
const effects2 = [];
|
|
130
|
-
const
|
|
129
|
+
const actions2 = {};
|
|
131
130
|
plugins.forEach((plugin) => {
|
|
132
131
|
if (!plugin.provides) return;
|
|
133
132
|
if (plugin.provides.registries) {
|
|
@@ -140,10 +139,10 @@ Add the missing plugin: .use(${depName}())`
|
|
|
140
139
|
effects2.push(...plugin.provides.effects);
|
|
141
140
|
}
|
|
142
141
|
if (plugin.provides.actions) {
|
|
143
|
-
Object.assign(
|
|
142
|
+
Object.assign(actions2, plugin.provides.actions);
|
|
144
143
|
}
|
|
145
144
|
});
|
|
146
|
-
return { registries, slices, effects: effects2, actions };
|
|
145
|
+
return { registries, slices, effects: effects2, actions: actions2 };
|
|
147
146
|
}
|
|
148
147
|
/**
|
|
149
148
|
* Create store with all aggregated slices.
|
|
@@ -159,8 +158,8 @@ Add the missing plugin: .use(${depName}())`
|
|
|
159
158
|
*/
|
|
160
159
|
createStoreWithSlices(slices) {
|
|
161
160
|
const store = getStore();
|
|
162
|
-
slices.forEach((
|
|
163
|
-
registerSlice(
|
|
161
|
+
slices.forEach((slice11) => {
|
|
162
|
+
registerSlice(slice11);
|
|
164
163
|
});
|
|
165
164
|
return store;
|
|
166
165
|
}
|
|
@@ -179,9 +178,6 @@ function createHAI3(config) {
|
|
|
179
178
|
return new HAI3AppBuilderImpl(config);
|
|
180
179
|
}
|
|
181
180
|
|
|
182
|
-
// src/plugins/screensets.ts
|
|
183
|
-
import { screensetRegistry as sdkScreensetRegistry } from "@hai3/screensets";
|
|
184
|
-
|
|
185
181
|
// src/slices/index.ts
|
|
186
182
|
import { combineReducers } from "@reduxjs/toolkit";
|
|
187
183
|
|
|
@@ -478,35 +474,26 @@ var layoutDomainReducers = {
|
|
|
478
474
|
var layoutReducer = combineReducers(layoutDomainReducers);
|
|
479
475
|
|
|
480
476
|
// src/plugins/screensets.ts
|
|
481
|
-
|
|
482
|
-
var screenActions2 = screenActions;
|
|
483
|
-
function screensets(config) {
|
|
484
|
-
const screensetRegistry3 = sdkScreensetRegistry;
|
|
477
|
+
function screensets(_config) {
|
|
485
478
|
return {
|
|
486
479
|
name: "screensets",
|
|
487
480
|
dependencies: [],
|
|
488
481
|
provides: {
|
|
489
|
-
registries: {
|
|
490
|
-
|
|
491
|
-
},
|
|
492
|
-
slices: [screenSlice2],
|
|
482
|
+
registries: {},
|
|
483
|
+
slices: [screenSlice],
|
|
493
484
|
actions: {
|
|
494
|
-
setActiveScreen:
|
|
495
|
-
setScreenLoading:
|
|
485
|
+
setActiveScreen: screenActions.navigateTo,
|
|
486
|
+
setScreenLoading: screenActions.setScreenLoading
|
|
496
487
|
}
|
|
497
488
|
},
|
|
498
489
|
onInit() {
|
|
499
|
-
if (config?.autoDiscover) {
|
|
500
|
-
console.log(
|
|
501
|
-
"[HAI3] Auto-discover is enabled. Screensets should be registered via screensetRegistry.register() in your app."
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
490
|
}
|
|
505
491
|
};
|
|
506
492
|
}
|
|
507
493
|
|
|
508
494
|
// src/plugins/themes.ts
|
|
509
495
|
import { eventBus } from "@hai3/state";
|
|
496
|
+
import { HAI3_SHARED_PROPERTY_THEME } from "@hai3/screensets";
|
|
510
497
|
|
|
511
498
|
// src/registries/themeRegistry.ts
|
|
512
499
|
function createThemeRegistry(config) {
|
|
@@ -644,9 +631,14 @@ function themes(config) {
|
|
|
644
631
|
changeTheme
|
|
645
632
|
}
|
|
646
633
|
},
|
|
647
|
-
onInit(
|
|
634
|
+
onInit(app) {
|
|
648
635
|
eventBus.on("theme/changed", (payload) => {
|
|
649
636
|
themeRegistry.apply(payload.themeId);
|
|
637
|
+
try {
|
|
638
|
+
app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_THEME, payload.themeId);
|
|
639
|
+
} catch (error) {
|
|
640
|
+
console.error("[HAI3] Failed to propagate theme to MFE domains", error);
|
|
641
|
+
}
|
|
650
642
|
});
|
|
651
643
|
const themes2 = themeRegistry.getAll();
|
|
652
644
|
if (themes2.length > 0) {
|
|
@@ -658,18 +650,6 @@ function themes(config) {
|
|
|
658
650
|
|
|
659
651
|
// src/plugins/layout.ts
|
|
660
652
|
import { eventBus as eventBus2 } from "@hai3/state";
|
|
661
|
-
var headerSlice2 = headerSlice;
|
|
662
|
-
var footerSlice2 = footerSlice;
|
|
663
|
-
var menuSlice2 = menuSlice;
|
|
664
|
-
var sidebarSlice2 = sidebarSlice;
|
|
665
|
-
var popupSlice2 = popupSlice;
|
|
666
|
-
var overlaySlice2 = overlaySlice;
|
|
667
|
-
var headerActions2 = headerActions;
|
|
668
|
-
var footerActions2 = footerActions;
|
|
669
|
-
var menuActions2 = menuActions;
|
|
670
|
-
var sidebarActions2 = sidebarActions;
|
|
671
|
-
var popupActions2 = popupActions;
|
|
672
|
-
var overlayActions2 = overlayActions;
|
|
673
653
|
function showPopup(payload) {
|
|
674
654
|
eventBus2.emit("layout/popup/requested", payload);
|
|
675
655
|
}
|
|
@@ -688,18 +668,20 @@ function toggleMenuCollapsed(payload) {
|
|
|
688
668
|
function toggleSidebarCollapsed(payload) {
|
|
689
669
|
eventBus2.emit("layout/sidebar/collapsed", payload);
|
|
690
670
|
}
|
|
671
|
+
function setHeaderVisible(_visible) {
|
|
672
|
+
}
|
|
691
673
|
function layout() {
|
|
692
674
|
return {
|
|
693
675
|
name: "layout",
|
|
694
676
|
dependencies: ["screensets"],
|
|
695
677
|
provides: {
|
|
696
678
|
slices: [
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
679
|
+
headerSlice,
|
|
680
|
+
footerSlice,
|
|
681
|
+
menuSlice,
|
|
682
|
+
sidebarSlice,
|
|
683
|
+
popupSlice,
|
|
684
|
+
overlaySlice
|
|
703
685
|
],
|
|
704
686
|
actions: {
|
|
705
687
|
showPopup,
|
|
@@ -709,463 +691,71 @@ function layout() {
|
|
|
709
691
|
toggleMenuCollapsed,
|
|
710
692
|
toggleSidebarCollapsed,
|
|
711
693
|
// Direct slice actions for backward compatibility
|
|
712
|
-
setHeaderVisible
|
|
713
|
-
setFooterVisible:
|
|
714
|
-
setMenuCollapsed:
|
|
715
|
-
setSidebarCollapsed:
|
|
694
|
+
setHeaderVisible,
|
|
695
|
+
setFooterVisible: footerActions.setFooterVisible,
|
|
696
|
+
setMenuCollapsed: menuActions.setMenuCollapsed,
|
|
697
|
+
setSidebarCollapsed: sidebarActions.setSidebarCollapsed
|
|
716
698
|
}
|
|
717
699
|
},
|
|
718
700
|
onInit(app) {
|
|
719
701
|
const dispatch = app.store.dispatch;
|
|
720
702
|
eventBus2.on("layout/popup/requested", (payload) => {
|
|
721
|
-
dispatch(
|
|
703
|
+
dispatch(popupActions.openPopup({
|
|
722
704
|
id: payload.id,
|
|
723
|
-
title: payload.title,
|
|
724
|
-
|
|
725
|
-
|
|
705
|
+
title: payload.title ?? "",
|
|
706
|
+
component: ""
|
|
707
|
+
// Payload doesn't include component - this needs review
|
|
726
708
|
}));
|
|
727
709
|
});
|
|
728
710
|
eventBus2.on("layout/popup/hidden", () => {
|
|
729
|
-
dispatch(
|
|
711
|
+
dispatch(popupActions.closeAllPopups());
|
|
730
712
|
});
|
|
731
|
-
eventBus2.on("layout/overlay/requested", (
|
|
732
|
-
dispatch(
|
|
713
|
+
eventBus2.on("layout/overlay/requested", (_payload) => {
|
|
714
|
+
dispatch(overlayActions.showOverlay());
|
|
733
715
|
});
|
|
734
716
|
eventBus2.on("layout/overlay/hidden", () => {
|
|
735
|
-
dispatch(
|
|
717
|
+
dispatch(overlayActions.hideOverlay());
|
|
736
718
|
});
|
|
737
719
|
eventBus2.on("layout/menu/collapsed", (payload) => {
|
|
738
|
-
dispatch(
|
|
720
|
+
dispatch(menuActions.setMenuCollapsed(payload.collapsed));
|
|
739
721
|
});
|
|
740
722
|
eventBus2.on("layout/sidebar/collapsed", (payload) => {
|
|
741
|
-
dispatch(
|
|
723
|
+
dispatch(sidebarActions.setSidebarCollapsed(payload.collapsed));
|
|
742
724
|
});
|
|
743
725
|
}
|
|
744
726
|
};
|
|
745
727
|
}
|
|
746
728
|
|
|
747
|
-
// src/plugins/navigation.ts
|
|
748
|
-
import { eventBus as eventBus3 } from "@hai3/state";
|
|
749
|
-
import { i18nRegistry } from "@hai3/i18n";
|
|
750
|
-
|
|
751
|
-
// src/utils/basePath.ts
|
|
752
|
-
function normalizeBase(base) {
|
|
753
|
-
if (!base) {
|
|
754
|
-
return "/";
|
|
755
|
-
}
|
|
756
|
-
let normalized = base.startsWith("/") ? base : `/${base}`;
|
|
757
|
-
if (normalized !== "/" && normalized.endsWith("/")) {
|
|
758
|
-
normalized = normalized.slice(0, -1);
|
|
759
|
-
}
|
|
760
|
-
return normalized;
|
|
761
|
-
}
|
|
762
|
-
function stripBase(pathname, base) {
|
|
763
|
-
if (base === "/") {
|
|
764
|
-
return pathname;
|
|
765
|
-
}
|
|
766
|
-
if (!pathname.startsWith(base)) {
|
|
767
|
-
return null;
|
|
768
|
-
}
|
|
769
|
-
const nextChar = pathname.charAt(base.length);
|
|
770
|
-
if (nextChar && nextChar !== "/") {
|
|
771
|
-
return null;
|
|
772
|
-
}
|
|
773
|
-
return pathname.slice(base.length) || "/";
|
|
774
|
-
}
|
|
775
|
-
function prependBase(path, base) {
|
|
776
|
-
if (base === "/") {
|
|
777
|
-
return path;
|
|
778
|
-
}
|
|
779
|
-
const cleanPath = path.startsWith("/") ? path : `/${path}`;
|
|
780
|
-
return `${base}${cleanPath}`;
|
|
781
|
-
}
|
|
782
|
-
function resolveBase(pluginConfig, appConfig) {
|
|
783
|
-
const rawBase = pluginConfig?.base ?? appConfig?.base ?? "/";
|
|
784
|
-
return normalizeBase(rawBase);
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
// src/utils/routeMatcher.ts
|
|
788
|
-
import { match, compile } from "path-to-regexp";
|
|
789
|
-
function compileRoute(pattern, screensetId, screenId) {
|
|
790
|
-
return {
|
|
791
|
-
pattern,
|
|
792
|
-
screensetId,
|
|
793
|
-
screenId,
|
|
794
|
-
matcher: match(pattern, { decode: decodeURIComponent }),
|
|
795
|
-
toPath: compile(pattern, { encode: encodeURIComponent })
|
|
796
|
-
};
|
|
797
|
-
}
|
|
798
|
-
function matchPath(path, routes) {
|
|
799
|
-
for (const route of routes) {
|
|
800
|
-
const result = route.matcher(path);
|
|
801
|
-
if (result) {
|
|
802
|
-
return {
|
|
803
|
-
screensetId: route.screensetId,
|
|
804
|
-
screenId: route.screenId,
|
|
805
|
-
params: result.params
|
|
806
|
-
};
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
return void 0;
|
|
810
|
-
}
|
|
811
|
-
function generatePath(route, params) {
|
|
812
|
-
return route.toPath(params);
|
|
813
|
-
}
|
|
814
|
-
function extractRequiredParams(pattern) {
|
|
815
|
-
const params = [];
|
|
816
|
-
const matches = pattern.match(/:([^/]+)/g);
|
|
817
|
-
if (matches) {
|
|
818
|
-
for (const match2 of matches) {
|
|
819
|
-
params.push(match2.slice(1));
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
return params;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
// src/plugins/navigation.ts
|
|
826
|
-
var screenActions3 = screenActions;
|
|
827
|
-
var menuActions3 = menuActions;
|
|
828
|
-
function navigateToScreen(payload) {
|
|
829
|
-
eventBus3.emit("navigation/screen/navigated", payload);
|
|
830
|
-
}
|
|
831
|
-
function navigateToScreenset(payload) {
|
|
832
|
-
eventBus3.emit("navigation/screenset/navigated", payload);
|
|
833
|
-
}
|
|
834
|
-
function navigation(config) {
|
|
835
|
-
return {
|
|
836
|
-
name: "navigation",
|
|
837
|
-
dependencies: ["screensets"],
|
|
838
|
-
provides: {
|
|
839
|
-
actions: {
|
|
840
|
-
navigateToScreen,
|
|
841
|
-
navigateToScreenset
|
|
842
|
-
}
|
|
843
|
-
},
|
|
844
|
-
onInit(app) {
|
|
845
|
-
const dispatch = app.store.dispatch;
|
|
846
|
-
const base = resolveBase(config, app.config);
|
|
847
|
-
const routerMode = app.config.routerMode ?? "browser";
|
|
848
|
-
let currentScreensetId = null;
|
|
849
|
-
const getCurrentPath = () => {
|
|
850
|
-
if (typeof window === "undefined") return "/";
|
|
851
|
-
switch (routerMode) {
|
|
852
|
-
case "hash":
|
|
853
|
-
return window.location.hash.slice(1) || "/";
|
|
854
|
-
case "memory":
|
|
855
|
-
return "/";
|
|
856
|
-
case "browser":
|
|
857
|
-
default:
|
|
858
|
-
return window.location.pathname;
|
|
859
|
-
}
|
|
860
|
-
};
|
|
861
|
-
const updateURL = (path) => {
|
|
862
|
-
if (typeof window === "undefined" || routerMode === "memory") {
|
|
863
|
-
return;
|
|
864
|
-
}
|
|
865
|
-
const url = prependBase(path, base);
|
|
866
|
-
switch (routerMode) {
|
|
867
|
-
case "hash":
|
|
868
|
-
if (window.location.hash !== `#${url}`) {
|
|
869
|
-
window.location.hash = url;
|
|
870
|
-
}
|
|
871
|
-
break;
|
|
872
|
-
case "browser":
|
|
873
|
-
default:
|
|
874
|
-
if (window.location.pathname !== url) {
|
|
875
|
-
window.history.pushState(null, "", url);
|
|
876
|
-
}
|
|
877
|
-
break;
|
|
878
|
-
}
|
|
879
|
-
};
|
|
880
|
-
const loadScreensetTranslations = async (screensetId, language) => {
|
|
881
|
-
await i18nRegistry.loadScreensetTranslations(
|
|
882
|
-
screensetId,
|
|
883
|
-
language
|
|
884
|
-
);
|
|
885
|
-
};
|
|
886
|
-
const updateScreensetMenu = (screenset) => {
|
|
887
|
-
const menuItems = screenset.menu.map((item) => ({
|
|
888
|
-
id: item.menuItem.screenId ?? item.menuItem.id,
|
|
889
|
-
label: item.menuItem.label,
|
|
890
|
-
icon: item.menuItem.icon
|
|
891
|
-
}));
|
|
892
|
-
dispatch(menuActions3.setMenuItems(menuItems));
|
|
893
|
-
};
|
|
894
|
-
const activateScreenset = (screensetId) => {
|
|
895
|
-
if (screensetId === currentScreensetId) {
|
|
896
|
-
return;
|
|
897
|
-
}
|
|
898
|
-
const screenset = app.screensetRegistry.get(screensetId);
|
|
899
|
-
if (!screenset) {
|
|
900
|
-
return;
|
|
901
|
-
}
|
|
902
|
-
currentScreensetId = screensetId;
|
|
903
|
-
loadScreensetTranslations(screensetId).catch((err) => {
|
|
904
|
-
console.warn(`[HAI3] Failed to load translations for screenset ${screensetId}:`, err);
|
|
905
|
-
});
|
|
906
|
-
updateScreensetMenu(screenset);
|
|
907
|
-
};
|
|
908
|
-
const extractInternalPath = () => {
|
|
909
|
-
const currentPath = getCurrentPath();
|
|
910
|
-
return stripBase(currentPath, base) || "/";
|
|
911
|
-
};
|
|
912
|
-
const activateFromRouteMatch = (match2) => {
|
|
913
|
-
activateScreenset(match2.screensetId);
|
|
914
|
-
dispatch(screenActions3.navigateTo(match2.screenId));
|
|
915
|
-
};
|
|
916
|
-
const matchCurrentPath = () => {
|
|
917
|
-
const path = extractInternalPath();
|
|
918
|
-
return app.routeRegistry?.matchRoute(path);
|
|
919
|
-
};
|
|
920
|
-
eventBus3.on("navigation/screen/navigated", (payload) => {
|
|
921
|
-
if (!app.routeRegistry?.hasScreen(payload.screensetId, payload.screenId)) {
|
|
922
|
-
console.warn(
|
|
923
|
-
`Screen "${payload.screenId}" in screenset "${payload.screensetId}" not found.`
|
|
924
|
-
);
|
|
925
|
-
return;
|
|
926
|
-
}
|
|
927
|
-
const pattern = app.routeRegistry?.getRoutePattern(payload.screenId);
|
|
928
|
-
if (pattern) {
|
|
929
|
-
const requiredParams = extractRequiredParams(pattern);
|
|
930
|
-
const providedParams = payload.params || {};
|
|
931
|
-
const missingParams = requiredParams.filter((param) => !(param in providedParams));
|
|
932
|
-
if (missingParams.length > 0) {
|
|
933
|
-
console.warn(
|
|
934
|
-
`Screen "${payload.screenId}" requires route params [${requiredParams.join(", ")}] but missing: [${missingParams.join(", ")}]`
|
|
935
|
-
);
|
|
936
|
-
return;
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
activateScreenset(payload.screensetId);
|
|
940
|
-
dispatch(screenActions3.navigateTo(payload.screenId));
|
|
941
|
-
const path = app.routeRegistry?.generatePath(payload.screenId, payload.params) ?? `/${payload.screenId}`;
|
|
942
|
-
updateURL(path);
|
|
943
|
-
});
|
|
944
|
-
eventBus3.on("navigation/screenset/navigated", (payload) => {
|
|
945
|
-
const screenset = app.screensetRegistry.get(payload.screensetId);
|
|
946
|
-
if (!screenset) {
|
|
947
|
-
console.warn(`Screenset "${payload.screensetId}" not found.`);
|
|
948
|
-
return;
|
|
949
|
-
}
|
|
950
|
-
navigateToScreen({
|
|
951
|
-
screensetId: payload.screensetId,
|
|
952
|
-
screenId: screenset.defaultScreen
|
|
953
|
-
});
|
|
954
|
-
});
|
|
955
|
-
let lastLoadedLanguage = null;
|
|
956
|
-
i18nRegistry.subscribe(() => {
|
|
957
|
-
const currentLanguage = i18nRegistry.getLanguage();
|
|
958
|
-
if (!currentLanguage || currentLanguage === lastLoadedLanguage) {
|
|
959
|
-
return;
|
|
960
|
-
}
|
|
961
|
-
if (!currentScreensetId) {
|
|
962
|
-
return;
|
|
963
|
-
}
|
|
964
|
-
const screenset = app.screensetRegistry.get(currentScreensetId);
|
|
965
|
-
if (!screenset) {
|
|
966
|
-
return;
|
|
967
|
-
}
|
|
968
|
-
lastLoadedLanguage = currentLanguage;
|
|
969
|
-
loadScreensetTranslations(currentScreensetId, currentLanguage).then(() => updateScreensetMenu(screenset)).catch((err) => {
|
|
970
|
-
console.warn(
|
|
971
|
-
`[HAI3] Failed to reload translations for screenset ${currentScreensetId}:`,
|
|
972
|
-
err
|
|
973
|
-
);
|
|
974
|
-
});
|
|
975
|
-
});
|
|
976
|
-
if (typeof window !== "undefined" && routerMode !== "memory") {
|
|
977
|
-
const handleURLChange = () => {
|
|
978
|
-
const match3 = matchCurrentPath();
|
|
979
|
-
if (match3) {
|
|
980
|
-
activateFromRouteMatch(match3);
|
|
981
|
-
}
|
|
982
|
-
};
|
|
983
|
-
if (routerMode === "hash") {
|
|
984
|
-
window.addEventListener("hashchange", handleURLChange);
|
|
985
|
-
} else {
|
|
986
|
-
window.addEventListener("popstate", handleURLChange);
|
|
987
|
-
}
|
|
988
|
-
const match2 = matchCurrentPath();
|
|
989
|
-
const autoNavigate = app.config.autoNavigate !== false;
|
|
990
|
-
if (match2) {
|
|
991
|
-
activateFromRouteMatch(match2);
|
|
992
|
-
} else if (autoNavigate) {
|
|
993
|
-
const screensets2 = app.screensetRegistry.getAll();
|
|
994
|
-
if (screensets2.length > 0) {
|
|
995
|
-
navigateToScreenset({ screensetId: screensets2[0].id });
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
} else if (routerMode === "memory") {
|
|
999
|
-
const autoNavigate = app.config.autoNavigate !== false;
|
|
1000
|
-
if (autoNavigate) {
|
|
1001
|
-
const screensets2 = app.screensetRegistry.getAll();
|
|
1002
|
-
if (screensets2.length > 0) {
|
|
1003
|
-
navigateToScreenset({ screensetId: screensets2[0].id });
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
}
|
|
1007
|
-
}
|
|
1008
|
-
};
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
// src/registries/routeRegistry.ts
|
|
1012
|
-
function createRouteRegistry(screensetRegistry3) {
|
|
1013
|
-
let routes = null;
|
|
1014
|
-
function buildRoutes() {
|
|
1015
|
-
if (routes !== null) {
|
|
1016
|
-
return routes;
|
|
1017
|
-
}
|
|
1018
|
-
routes = [];
|
|
1019
|
-
const screensets2 = screensetRegistry3.getAll();
|
|
1020
|
-
screensets2.forEach((screenset) => {
|
|
1021
|
-
screenset.menu.forEach((menuScreenItem) => {
|
|
1022
|
-
const screenId = menuScreenItem.menuItem.screenId ?? menuScreenItem.menuItem.id;
|
|
1023
|
-
if (screenId && menuScreenItem.screen) {
|
|
1024
|
-
const pattern = menuScreenItem.menuItem.path ?? `/${screenId}`;
|
|
1025
|
-
const compiledRoute = compileRoute(pattern, screenset.id, screenId);
|
|
1026
|
-
routes.push({
|
|
1027
|
-
screensetId: screenset.id,
|
|
1028
|
-
screenId,
|
|
1029
|
-
loader: menuScreenItem.screen,
|
|
1030
|
-
pattern,
|
|
1031
|
-
compiledRoute
|
|
1032
|
-
});
|
|
1033
|
-
}
|
|
1034
|
-
});
|
|
1035
|
-
});
|
|
1036
|
-
routes.sort((a, b) => {
|
|
1037
|
-
const aHasParams = a.pattern.includes(":");
|
|
1038
|
-
const bHasParams = b.pattern.includes(":");
|
|
1039
|
-
if (!aHasParams && bHasParams) return -1;
|
|
1040
|
-
if (aHasParams && !bHasParams) return 1;
|
|
1041
|
-
return 0;
|
|
1042
|
-
});
|
|
1043
|
-
return routes;
|
|
1044
|
-
}
|
|
1045
|
-
return {
|
|
1046
|
-
/**
|
|
1047
|
-
* Check if a screen exists by screenId only (globally unique).
|
|
1048
|
-
*/
|
|
1049
|
-
hasScreenById(screenId) {
|
|
1050
|
-
const allRoutes = buildRoutes();
|
|
1051
|
-
return allRoutes.some((route) => route.screenId === screenId);
|
|
1052
|
-
},
|
|
1053
|
-
/**
|
|
1054
|
-
* Check if a screen exists by both screensetId and screenId (explicit lookup when screenset context is known).
|
|
1055
|
-
*/
|
|
1056
|
-
hasScreen(screensetId, screenId) {
|
|
1057
|
-
const allRoutes = buildRoutes();
|
|
1058
|
-
return allRoutes.some(
|
|
1059
|
-
(route) => route.screensetId === screensetId && route.screenId === screenId
|
|
1060
|
-
);
|
|
1061
|
-
},
|
|
1062
|
-
/**
|
|
1063
|
-
* Get screenset ID for a given screen ID (reverse lookup).
|
|
1064
|
-
* Screen IDs are globally unique across all screensets.
|
|
1065
|
-
*/
|
|
1066
|
-
getScreensetForScreen(screenId) {
|
|
1067
|
-
const allRoutes = buildRoutes();
|
|
1068
|
-
const route = allRoutes.find((r) => r.screenId === screenId);
|
|
1069
|
-
return route?.screensetId;
|
|
1070
|
-
},
|
|
1071
|
-
/**
|
|
1072
|
-
* Get screen loader by screenId only.
|
|
1073
|
-
*/
|
|
1074
|
-
getScreenById(screenId) {
|
|
1075
|
-
const allRoutes = buildRoutes();
|
|
1076
|
-
const route = allRoutes.find((r) => r.screenId === screenId);
|
|
1077
|
-
return route?.loader;
|
|
1078
|
-
},
|
|
1079
|
-
/**
|
|
1080
|
-
* Get screen loader by both screensetId and screenId (explicit lookup when screenset context is known).
|
|
1081
|
-
*/
|
|
1082
|
-
getScreen(screensetId, screenId) {
|
|
1083
|
-
const allRoutes = buildRoutes();
|
|
1084
|
-
const route = allRoutes.find(
|
|
1085
|
-
(r) => r.screensetId === screensetId && r.screenId === screenId
|
|
1086
|
-
);
|
|
1087
|
-
return route?.loader;
|
|
1088
|
-
},
|
|
1089
|
-
/**
|
|
1090
|
-
* Get all routes.
|
|
1091
|
-
*/
|
|
1092
|
-
getAll() {
|
|
1093
|
-
const allRoutes = buildRoutes();
|
|
1094
|
-
return allRoutes.map(({ screensetId, screenId }) => ({
|
|
1095
|
-
screensetId,
|
|
1096
|
-
screenId
|
|
1097
|
-
}));
|
|
1098
|
-
},
|
|
1099
|
-
/**
|
|
1100
|
-
* Match a URL path against registered routes, extracting params.
|
|
1101
|
-
* Returns the first matching route with extracted params, or undefined if no match.
|
|
1102
|
-
*/
|
|
1103
|
-
matchRoute(path) {
|
|
1104
|
-
const allRoutes = buildRoutes();
|
|
1105
|
-
const compiledRoutes = allRoutes.map((r) => r.compiledRoute);
|
|
1106
|
-
return matchPath(path, compiledRoutes);
|
|
1107
|
-
},
|
|
1108
|
-
/**
|
|
1109
|
-
* Generate a URL path for a screen with given params.
|
|
1110
|
-
*/
|
|
1111
|
-
generatePath(screenId, params = {}) {
|
|
1112
|
-
const allRoutes = buildRoutes();
|
|
1113
|
-
const route = allRoutes.find((r) => r.screenId === screenId);
|
|
1114
|
-
if (!route) {
|
|
1115
|
-
console.warn(`Route not found for screen: ${screenId}`);
|
|
1116
|
-
return `/${screenId}`;
|
|
1117
|
-
}
|
|
1118
|
-
return generatePath(route.compiledRoute, params);
|
|
1119
|
-
},
|
|
1120
|
-
/**
|
|
1121
|
-
* Get the route pattern for a screen.
|
|
1122
|
-
*/
|
|
1123
|
-
getRoutePattern(screenId) {
|
|
1124
|
-
const allRoutes = buildRoutes();
|
|
1125
|
-
const route = allRoutes.find((r) => r.screenId === screenId);
|
|
1126
|
-
return route?.pattern;
|
|
1127
|
-
}
|
|
1128
|
-
};
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
// src/plugins/routing.ts
|
|
1132
|
-
function routing() {
|
|
1133
|
-
return {
|
|
1134
|
-
name: "routing",
|
|
1135
|
-
dependencies: ["screensets"],
|
|
1136
|
-
onRegister(_app) {
|
|
1137
|
-
},
|
|
1138
|
-
onInit(app) {
|
|
1139
|
-
const routeRegistry = createRouteRegistry(app.screensetRegistry);
|
|
1140
|
-
app.routeRegistry = routeRegistry;
|
|
1141
|
-
}
|
|
1142
|
-
};
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
729
|
// src/plugins/i18n.ts
|
|
1146
|
-
import { eventBus as
|
|
730
|
+
import { eventBus as eventBus3 } from "@hai3/state";
|
|
1147
731
|
import { i18nRegistry as singletonI18nRegistry, Language } from "@hai3/i18n";
|
|
732
|
+
import { HAI3_SHARED_PROPERTY_LANGUAGE } from "@hai3/screensets";
|
|
1148
733
|
function setLanguage(payload) {
|
|
1149
|
-
|
|
734
|
+
eventBus3.emit("i18n/language/changed", payload);
|
|
1150
735
|
}
|
|
1151
736
|
function i18n() {
|
|
1152
|
-
const
|
|
737
|
+
const i18nRegistry2 = singletonI18nRegistry;
|
|
1153
738
|
return {
|
|
1154
739
|
name: "i18n",
|
|
1155
740
|
dependencies: [],
|
|
1156
741
|
provides: {
|
|
1157
742
|
registries: {
|
|
1158
|
-
i18nRegistry:
|
|
743
|
+
i18nRegistry: i18nRegistry2
|
|
1159
744
|
},
|
|
1160
745
|
actions: {
|
|
1161
746
|
setLanguage
|
|
1162
747
|
}
|
|
1163
748
|
},
|
|
1164
|
-
onInit(
|
|
1165
|
-
|
|
1166
|
-
await
|
|
749
|
+
onInit(app) {
|
|
750
|
+
eventBus3.on("i18n/language/changed", async (payload) => {
|
|
751
|
+
await i18nRegistry2.setLanguage(payload.language);
|
|
752
|
+
try {
|
|
753
|
+
app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_LANGUAGE, payload.language);
|
|
754
|
+
} catch (error) {
|
|
755
|
+
console.error("[HAI3] Failed to propagate language to MFE domains", error);
|
|
756
|
+
}
|
|
1167
757
|
});
|
|
1168
|
-
|
|
758
|
+
i18nRegistry2.setLanguage(Language.English).catch((err) => {
|
|
1169
759
|
console.warn("[HAI3] Failed to load initial translations:", err);
|
|
1170
760
|
});
|
|
1171
761
|
}
|
|
@@ -1177,16 +767,13 @@ function effects() {
|
|
|
1177
767
|
return {
|
|
1178
768
|
name: "effects",
|
|
1179
769
|
dependencies: [],
|
|
1180
|
-
onInit(
|
|
1181
|
-
if (app.config.devMode) {
|
|
1182
|
-
console.log("[HAI3] Effects plugin initialized");
|
|
1183
|
-
}
|
|
770
|
+
onInit() {
|
|
1184
771
|
}
|
|
1185
772
|
};
|
|
1186
773
|
}
|
|
1187
774
|
|
|
1188
775
|
// src/effects/mockEffects.ts
|
|
1189
|
-
import { eventBus as
|
|
776
|
+
import { eventBus as eventBus4, getStore as getStore2 } from "@hai3/state";
|
|
1190
777
|
import { apiRegistry as apiRegistry2, isMockPlugin } from "@hai3/api";
|
|
1191
778
|
function hasPluginManagement(protocol) {
|
|
1192
779
|
return "plugins" in protocol && typeof protocol.plugins === "object";
|
|
@@ -1216,7 +803,7 @@ function syncMockPlugins(enabled) {
|
|
|
1216
803
|
}
|
|
1217
804
|
function initMockEffects() {
|
|
1218
805
|
const store = getStore2();
|
|
1219
|
-
const unsubscribe =
|
|
806
|
+
const unsubscribe = eventBus4.on(MockEvents.Toggle, (payload) => {
|
|
1220
807
|
store.dispatch(setMockEnabled(payload.enabled));
|
|
1221
808
|
syncMockPlugins(payload.enabled);
|
|
1222
809
|
});
|
|
@@ -1229,7 +816,7 @@ function initMockEffects() {
|
|
|
1229
816
|
};
|
|
1230
817
|
}
|
|
1231
818
|
function toggleMockMode(enabled) {
|
|
1232
|
-
|
|
819
|
+
eventBus4.emit(MockEvents.Toggle, { enabled });
|
|
1233
820
|
}
|
|
1234
821
|
|
|
1235
822
|
// src/plugins/mock.ts
|
|
@@ -1255,9 +842,6 @@ function mock(config) {
|
|
|
1255
842
|
const enabledByDefault = config?.enabledByDefault ?? isDev;
|
|
1256
843
|
if (enabledByDefault) {
|
|
1257
844
|
toggleMockMode(true);
|
|
1258
|
-
if (isDev) {
|
|
1259
|
-
console.log("[HAI3] Mock mode enabled by default (dev environment detected)");
|
|
1260
|
-
}
|
|
1261
845
|
}
|
|
1262
846
|
},
|
|
1263
847
|
onDestroy() {
|
|
@@ -1269,6 +853,301 @@ function mock(config) {
|
|
|
1269
853
|
};
|
|
1270
854
|
}
|
|
1271
855
|
|
|
856
|
+
// src/plugins/microfrontends/index.ts
|
|
857
|
+
import {
|
|
858
|
+
screensetsRegistryFactory,
|
|
859
|
+
HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT3,
|
|
860
|
+
HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT3
|
|
861
|
+
} from "@hai3/screensets";
|
|
862
|
+
import { gtsPlugin } from "@hai3/screensets/plugins/gts";
|
|
863
|
+
import { getStore as getStore4 } from "@hai3/state";
|
|
864
|
+
|
|
865
|
+
// src/plugins/microfrontends/slice.ts
|
|
866
|
+
import { createSlice as createSlice10 } from "@hai3/state";
|
|
867
|
+
var SLICE_KEY10 = "mfe";
|
|
868
|
+
var initialState10 = {
|
|
869
|
+
registrationStates: {},
|
|
870
|
+
errors: {},
|
|
871
|
+
mountedExtensions: {}
|
|
872
|
+
};
|
|
873
|
+
var { slice: slice10, ...actions } = createSlice10({
|
|
874
|
+
name: SLICE_KEY10,
|
|
875
|
+
initialState: initialState10,
|
|
876
|
+
reducers: {
|
|
877
|
+
// Registration state reducers
|
|
878
|
+
setExtensionRegistering: (state, action) => {
|
|
879
|
+
state.registrationStates[action.payload.extensionId] = "registering";
|
|
880
|
+
},
|
|
881
|
+
setExtensionRegistered: (state, action) => {
|
|
882
|
+
state.registrationStates[action.payload.extensionId] = "registered";
|
|
883
|
+
},
|
|
884
|
+
setExtensionUnregistered: (state, action) => {
|
|
885
|
+
state.registrationStates[action.payload.extensionId] = "unregistered";
|
|
886
|
+
},
|
|
887
|
+
setExtensionError: (state, action) => {
|
|
888
|
+
state.registrationStates[action.payload.extensionId] = "error";
|
|
889
|
+
state.errors[action.payload.extensionId] = action.payload.error;
|
|
890
|
+
},
|
|
891
|
+
// Mount state reducers
|
|
892
|
+
setExtensionMounted: (state, action) => {
|
|
893
|
+
state.mountedExtensions[action.payload.domainId] = action.payload.extensionId;
|
|
894
|
+
},
|
|
895
|
+
setExtensionUnmounted: (state, action) => {
|
|
896
|
+
state.mountedExtensions[action.payload.domainId] = void 0;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
});
|
|
900
|
+
var mfeSlice = slice10;
|
|
901
|
+
var {
|
|
902
|
+
setExtensionRegistering,
|
|
903
|
+
setExtensionRegistered,
|
|
904
|
+
setExtensionUnregistered,
|
|
905
|
+
setExtensionError,
|
|
906
|
+
setExtensionMounted,
|
|
907
|
+
setExtensionUnmounted
|
|
908
|
+
} = actions;
|
|
909
|
+
function selectExtensionState(state, extensionId) {
|
|
910
|
+
return state.mfe.registrationStates[extensionId] ?? "unregistered";
|
|
911
|
+
}
|
|
912
|
+
function selectRegisteredExtensions(state) {
|
|
913
|
+
return Object.entries(state.mfe.registrationStates).filter(([_, regState]) => regState === "registered").map(([extensionId]) => extensionId);
|
|
914
|
+
}
|
|
915
|
+
function selectExtensionError(state, extensionId) {
|
|
916
|
+
return state.mfe.errors[extensionId];
|
|
917
|
+
}
|
|
918
|
+
var slice_default = slice10.reducer;
|
|
919
|
+
|
|
920
|
+
// src/plugins/microfrontends/effects.ts
|
|
921
|
+
import { eventBus as eventBus5, getStore as getStore3 } from "@hai3/state";
|
|
922
|
+
|
|
923
|
+
// src/plugins/microfrontends/constants.ts
|
|
924
|
+
var HAI3_POPUP_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.popup.v1";
|
|
925
|
+
var HAI3_SIDEBAR_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1";
|
|
926
|
+
var HAI3_SCREEN_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.screen.v1";
|
|
927
|
+
var HAI3_OVERLAY_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.overlay.v1";
|
|
928
|
+
var MfeEvents = {
|
|
929
|
+
RegisterExtensionRequested: "mfe/registerExtensionRequested",
|
|
930
|
+
UnregisterExtensionRequested: "mfe/unregisterExtensionRequested"
|
|
931
|
+
};
|
|
932
|
+
|
|
933
|
+
// src/plugins/microfrontends/effects.ts
|
|
934
|
+
function initMfeEffects(screensetsRegistry2) {
|
|
935
|
+
const store = getStore3();
|
|
936
|
+
const unsubscribers = [];
|
|
937
|
+
const unsubRegisterExtension = eventBus5.on(MfeEvents.RegisterExtensionRequested, async (payload) => {
|
|
938
|
+
const { extension } = payload;
|
|
939
|
+
try {
|
|
940
|
+
store.dispatch(setExtensionRegistering({ extensionId: extension.id }));
|
|
941
|
+
await screensetsRegistry2.registerExtension(extension);
|
|
942
|
+
store.dispatch(setExtensionRegistered({ extensionId: extension.id }));
|
|
943
|
+
} catch (error) {
|
|
944
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown registration error";
|
|
945
|
+
store.dispatch(setExtensionError({ extensionId: extension.id, error: errorMessage }));
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
unsubscribers.push(unsubRegisterExtension);
|
|
949
|
+
const unsubUnregisterExtension = eventBus5.on(MfeEvents.UnregisterExtensionRequested, async (payload) => {
|
|
950
|
+
const { extensionId } = payload;
|
|
951
|
+
try {
|
|
952
|
+
await screensetsRegistry2.unregisterExtension(extensionId);
|
|
953
|
+
store.dispatch(setExtensionUnregistered({ extensionId }));
|
|
954
|
+
} catch (error) {
|
|
955
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown unregistration error";
|
|
956
|
+
store.dispatch(setExtensionError({ extensionId, error: errorMessage }));
|
|
957
|
+
}
|
|
958
|
+
});
|
|
959
|
+
unsubscribers.push(unsubUnregisterExtension);
|
|
960
|
+
return () => {
|
|
961
|
+
unsubscribers.forEach((unsub) => unsub.unsubscribe());
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
// src/plugins/microfrontends/actions.ts
|
|
966
|
+
import { eventBus as eventBus6 } from "@hai3/state";
|
|
967
|
+
import {
|
|
968
|
+
HAI3_ACTION_LOAD_EXT,
|
|
969
|
+
HAI3_ACTION_MOUNT_EXT,
|
|
970
|
+
HAI3_ACTION_UNMOUNT_EXT
|
|
971
|
+
} from "@hai3/screensets";
|
|
972
|
+
var screensetsRegistry = null;
|
|
973
|
+
function setMfeRegistry(registry) {
|
|
974
|
+
screensetsRegistry = registry;
|
|
975
|
+
}
|
|
976
|
+
function resolveDomainId(extensionId) {
|
|
977
|
+
if (!screensetsRegistry) {
|
|
978
|
+
throw new Error("MFE registry not initialized. Call setMfeRegistry() before using lifecycle actions.");
|
|
979
|
+
}
|
|
980
|
+
const extension = screensetsRegistry.getExtension(extensionId);
|
|
981
|
+
if (!extension) {
|
|
982
|
+
throw new Error(`Extension '${extensionId}' is not registered. Register it before calling lifecycle actions.`);
|
|
983
|
+
}
|
|
984
|
+
return extension.domain;
|
|
985
|
+
}
|
|
986
|
+
function loadExtension(extensionId) {
|
|
987
|
+
const domainId = resolveDomainId(extensionId);
|
|
988
|
+
screensetsRegistry.executeActionsChain({
|
|
989
|
+
action: {
|
|
990
|
+
type: HAI3_ACTION_LOAD_EXT,
|
|
991
|
+
target: domainId,
|
|
992
|
+
payload: { extensionId }
|
|
993
|
+
}
|
|
994
|
+
}).catch((error) => {
|
|
995
|
+
console.error(`[MFE] Load failed for ${extensionId}:`, error);
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
function mountExtension(extensionId) {
|
|
999
|
+
const domainId = resolveDomainId(extensionId);
|
|
1000
|
+
screensetsRegistry.executeActionsChain({
|
|
1001
|
+
action: {
|
|
1002
|
+
type: HAI3_ACTION_MOUNT_EXT,
|
|
1003
|
+
target: domainId,
|
|
1004
|
+
payload: { extensionId }
|
|
1005
|
+
}
|
|
1006
|
+
}).catch((error) => {
|
|
1007
|
+
console.error(`[MFE] Mount failed for ${extensionId}:`, error);
|
|
1008
|
+
});
|
|
1009
|
+
}
|
|
1010
|
+
function unmountExtension(extensionId) {
|
|
1011
|
+
const domainId = resolveDomainId(extensionId);
|
|
1012
|
+
screensetsRegistry.executeActionsChain({
|
|
1013
|
+
action: {
|
|
1014
|
+
type: HAI3_ACTION_UNMOUNT_EXT,
|
|
1015
|
+
target: domainId,
|
|
1016
|
+
payload: { extensionId }
|
|
1017
|
+
}
|
|
1018
|
+
}).catch((error) => {
|
|
1019
|
+
console.error(`[MFE] Unmount failed for ${extensionId}:`, error);
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
function registerExtension(extension) {
|
|
1023
|
+
eventBus6.emit(MfeEvents.RegisterExtensionRequested, { extension });
|
|
1024
|
+
}
|
|
1025
|
+
function unregisterExtension(extensionId) {
|
|
1026
|
+
eventBus6.emit(MfeEvents.UnregisterExtensionRequested, { extensionId });
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
// src/plugins/microfrontends/base-domains.ts
|
|
1030
|
+
import {
|
|
1031
|
+
HAI3_ACTION_LOAD_EXT as HAI3_ACTION_LOAD_EXT2,
|
|
1032
|
+
HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT2,
|
|
1033
|
+
HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT2,
|
|
1034
|
+
HAI3_SHARED_PROPERTY_THEME as HAI3_SHARED_PROPERTY_THEME2,
|
|
1035
|
+
HAI3_SHARED_PROPERTY_LANGUAGE as HAI3_SHARED_PROPERTY_LANGUAGE2,
|
|
1036
|
+
HAI3_SCREEN_EXTENSION_TYPE
|
|
1037
|
+
} from "@hai3/screensets";
|
|
1038
|
+
var INIT_ONLY_LIFECYCLE_STAGES = [
|
|
1039
|
+
"gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1"
|
|
1040
|
+
];
|
|
1041
|
+
var DEFAULT_LIFECYCLE_STAGES = [
|
|
1042
|
+
"gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1",
|
|
1043
|
+
"gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.activated.v1",
|
|
1044
|
+
"gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.deactivated.v1",
|
|
1045
|
+
"gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.destroyed.v1"
|
|
1046
|
+
];
|
|
1047
|
+
var screenDomain = {
|
|
1048
|
+
id: HAI3_SCREEN_DOMAIN,
|
|
1049
|
+
actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2],
|
|
1050
|
+
extensionsActions: [],
|
|
1051
|
+
sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
|
|
1052
|
+
defaultActionTimeout: 3e4,
|
|
1053
|
+
lifecycleStages: [...INIT_ONLY_LIFECYCLE_STAGES],
|
|
1054
|
+
extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1055
|
+
extensionsTypeId: HAI3_SCREEN_EXTENSION_TYPE,
|
|
1056
|
+
lifecycle: void 0
|
|
1057
|
+
};
|
|
1058
|
+
var sidebarDomain = {
|
|
1059
|
+
id: HAI3_SIDEBAR_DOMAIN,
|
|
1060
|
+
actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
|
|
1061
|
+
extensionsActions: [],
|
|
1062
|
+
sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
|
|
1063
|
+
defaultActionTimeout: 3e4,
|
|
1064
|
+
lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1065
|
+
extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1066
|
+
lifecycle: void 0
|
|
1067
|
+
};
|
|
1068
|
+
var popupDomain = {
|
|
1069
|
+
id: HAI3_POPUP_DOMAIN,
|
|
1070
|
+
actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
|
|
1071
|
+
extensionsActions: [],
|
|
1072
|
+
sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
|
|
1073
|
+
defaultActionTimeout: 3e4,
|
|
1074
|
+
lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1075
|
+
extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1076
|
+
lifecycle: void 0
|
|
1077
|
+
};
|
|
1078
|
+
var overlayDomain = {
|
|
1079
|
+
id: HAI3_OVERLAY_DOMAIN,
|
|
1080
|
+
actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
|
|
1081
|
+
extensionsActions: [],
|
|
1082
|
+
sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
|
|
1083
|
+
defaultActionTimeout: 3e4,
|
|
1084
|
+
lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1085
|
+
extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
|
|
1086
|
+
lifecycle: void 0
|
|
1087
|
+
};
|
|
1088
|
+
|
|
1089
|
+
// src/plugins/microfrontends/index.ts
|
|
1090
|
+
function microfrontends(config = {}) {
|
|
1091
|
+
const screensetsRegistry2 = screensetsRegistryFactory.build({
|
|
1092
|
+
typeSystem: gtsPlugin,
|
|
1093
|
+
mfeHandlers: config.mfeHandlers
|
|
1094
|
+
});
|
|
1095
|
+
const originalExecuteActionsChain = screensetsRegistry2.executeActionsChain.bind(screensetsRegistry2);
|
|
1096
|
+
screensetsRegistry2.executeActionsChain = async (chain) => {
|
|
1097
|
+
await originalExecuteActionsChain(chain);
|
|
1098
|
+
const actionType = chain.action?.type;
|
|
1099
|
+
if (actionType === HAI3_ACTION_MOUNT_EXT3) {
|
|
1100
|
+
const store = getStore4();
|
|
1101
|
+
const domainId = chain.action.target;
|
|
1102
|
+
const extensionId = chain.action.payload?.extensionId;
|
|
1103
|
+
if (domainId && extensionId) {
|
|
1104
|
+
store.dispatch(setExtensionMounted({ domainId, extensionId }));
|
|
1105
|
+
}
|
|
1106
|
+
} else if (actionType === HAI3_ACTION_UNMOUNT_EXT3) {
|
|
1107
|
+
const store = getStore4();
|
|
1108
|
+
const domainId = chain.action.target;
|
|
1109
|
+
if (domainId) {
|
|
1110
|
+
store.dispatch(setExtensionUnmounted({ domainId }));
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
};
|
|
1114
|
+
let effectsCleanup = null;
|
|
1115
|
+
return {
|
|
1116
|
+
name: "microfrontends",
|
|
1117
|
+
dependencies: ["screensets"],
|
|
1118
|
+
// Requires screensets to be initialized
|
|
1119
|
+
provides: {
|
|
1120
|
+
registries: {
|
|
1121
|
+
// Expose the MFE-enabled ScreensetsRegistry
|
|
1122
|
+
// This registry has registerDomain(), registerExtension(), etc.
|
|
1123
|
+
screensetsRegistry: screensetsRegistry2
|
|
1124
|
+
},
|
|
1125
|
+
slices: [mfeSlice],
|
|
1126
|
+
// NOTE: Effects are NOT initialized via provides.effects.
|
|
1127
|
+
// They are initialized in onInit to capture cleanup references.
|
|
1128
|
+
// The framework calls provides.effects at build step 5, then onInit at step 7.
|
|
1129
|
+
// We only initialize effects in onInit to avoid duplicate event listeners.
|
|
1130
|
+
actions: {
|
|
1131
|
+
loadExtension,
|
|
1132
|
+
mountExtension,
|
|
1133
|
+
unmountExtension,
|
|
1134
|
+
registerExtension,
|
|
1135
|
+
unregisterExtension
|
|
1136
|
+
}
|
|
1137
|
+
},
|
|
1138
|
+
onInit() {
|
|
1139
|
+
setMfeRegistry(screensetsRegistry2);
|
|
1140
|
+
effectsCleanup = initMfeEffects(screensetsRegistry2);
|
|
1141
|
+
},
|
|
1142
|
+
onDestroy() {
|
|
1143
|
+
if (effectsCleanup) {
|
|
1144
|
+
effectsCleanup();
|
|
1145
|
+
effectsCleanup = null;
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1272
1151
|
// src/presets/index.ts
|
|
1273
1152
|
function full(config) {
|
|
1274
1153
|
return [
|
|
@@ -1276,10 +1155,9 @@ function full(config) {
|
|
|
1276
1155
|
screensets({ autoDiscover: true }),
|
|
1277
1156
|
themes(config?.themes),
|
|
1278
1157
|
layout(),
|
|
1279
|
-
routing(),
|
|
1280
|
-
navigation(),
|
|
1281
1158
|
i18n(),
|
|
1282
|
-
mock()
|
|
1159
|
+
mock(),
|
|
1160
|
+
microfrontends(config?.microfrontends)
|
|
1283
1161
|
];
|
|
1284
1162
|
}
|
|
1285
1163
|
function minimal() {
|
|
@@ -1301,31 +1179,55 @@ var presets = {
|
|
|
1301
1179
|
|
|
1302
1180
|
// src/createHAI3App.ts
|
|
1303
1181
|
function createHAI3App(config) {
|
|
1304
|
-
return createHAI3(config).useAll(full({
|
|
1182
|
+
return createHAI3(config).useAll(full({
|
|
1183
|
+
themes: config?.themes,
|
|
1184
|
+
microfrontends: config?.microfrontends
|
|
1185
|
+
})).build();
|
|
1305
1186
|
}
|
|
1306
1187
|
|
|
1307
|
-
// src/registries/index.ts
|
|
1308
|
-
import { createScreensetRegistry, screensetRegistry } from "@hai3/screensets";
|
|
1309
|
-
|
|
1310
1188
|
// src/index.ts
|
|
1311
|
-
import { eventBus as eventBus7, createStore, getStore as getStore4, registerSlice as registerSlice2, hasSlice, createSlice as createSlice10 } from "@hai3/state";
|
|
1312
1189
|
import {
|
|
1313
|
-
|
|
1314
|
-
|
|
1190
|
+
HAI3_SCREEN_EXTENSION_TYPE as HAI3_SCREEN_EXTENSION_TYPE2
|
|
1191
|
+
} from "@hai3/screensets";
|
|
1192
|
+
import {
|
|
1193
|
+
HAI3_ACTION_LOAD_EXT as HAI3_ACTION_LOAD_EXT3,
|
|
1194
|
+
HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT4,
|
|
1195
|
+
HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT4
|
|
1196
|
+
} from "@hai3/screensets";
|
|
1197
|
+
import {
|
|
1198
|
+
HAI3_SHARED_PROPERTY_THEME as HAI3_SHARED_PROPERTY_THEME3,
|
|
1199
|
+
HAI3_SHARED_PROPERTY_LANGUAGE as HAI3_SHARED_PROPERTY_LANGUAGE3
|
|
1200
|
+
} from "@hai3/screensets";
|
|
1201
|
+
import {
|
|
1202
|
+
MfeHandler,
|
|
1203
|
+
MfeBridgeFactory,
|
|
1204
|
+
ScreensetsRegistry,
|
|
1205
|
+
ScreensetsRegistryFactory,
|
|
1206
|
+
screensetsRegistryFactory as screensetsRegistryFactory2,
|
|
1207
|
+
ContainerProvider
|
|
1208
|
+
} from "@hai3/screensets";
|
|
1209
|
+
import { MfeHandlerMF } from "@hai3/screensets/mfe/handler";
|
|
1210
|
+
import { gtsPlugin as gtsPlugin2 } from "@hai3/screensets/plugins/gts";
|
|
1211
|
+
import {
|
|
1212
|
+
createShadowRoot,
|
|
1213
|
+
injectCssVariables,
|
|
1214
|
+
extractGtsPackage
|
|
1315
1215
|
} from "@hai3/screensets";
|
|
1216
|
+
import { eventBus as eventBus9, createStore, getStore as getStore7, registerSlice as registerSlice2, hasSlice, createSlice as createSlice11 } from "@hai3/state";
|
|
1217
|
+
import { LayoutDomain } from "@hai3/screensets";
|
|
1316
1218
|
|
|
1317
1219
|
// src/effects/tenantEffects.ts
|
|
1318
|
-
import { eventBus as
|
|
1220
|
+
import { eventBus as eventBus7, getStore as getStore5 } from "@hai3/state";
|
|
1319
1221
|
var TenantEvents = {
|
|
1320
1222
|
Changed: "app/tenant/changed",
|
|
1321
1223
|
Cleared: "app/tenant/cleared"
|
|
1322
1224
|
};
|
|
1323
1225
|
function initTenantEffects() {
|
|
1324
|
-
const store =
|
|
1325
|
-
const subChanged =
|
|
1226
|
+
const store = getStore5();
|
|
1227
|
+
const subChanged = eventBus7.on(TenantEvents.Changed, (payload) => {
|
|
1326
1228
|
store.dispatch(setTenant(payload.tenant));
|
|
1327
1229
|
});
|
|
1328
|
-
const subCleared =
|
|
1230
|
+
const subCleared = eventBus7.on(TenantEvents.Cleared, () => {
|
|
1329
1231
|
store.dispatch(clearTenant());
|
|
1330
1232
|
});
|
|
1331
1233
|
return () => {
|
|
@@ -1333,14 +1235,17 @@ function initTenantEffects() {
|
|
|
1333
1235
|
subCleared.unsubscribe();
|
|
1334
1236
|
};
|
|
1335
1237
|
}
|
|
1238
|
+
|
|
1239
|
+
// src/effects/tenantActions.ts
|
|
1240
|
+
import { eventBus as eventBus8, getStore as getStore6 } from "@hai3/state";
|
|
1336
1241
|
function changeTenant(tenant) {
|
|
1337
|
-
|
|
1242
|
+
eventBus8.emit(TenantEvents.Changed, { tenant });
|
|
1338
1243
|
}
|
|
1339
1244
|
function clearTenantAction() {
|
|
1340
|
-
|
|
1245
|
+
eventBus8.emit(TenantEvents.Cleared, {});
|
|
1341
1246
|
}
|
|
1342
1247
|
function setTenantLoadingState(loading) {
|
|
1343
|
-
|
|
1248
|
+
getStore6().dispatch(setTenantLoading(loading));
|
|
1344
1249
|
}
|
|
1345
1250
|
|
|
1346
1251
|
// src/index.ts
|
|
@@ -1365,11 +1270,22 @@ import {
|
|
|
1365
1270
|
MOCK_PLUGIN,
|
|
1366
1271
|
isMockPlugin as isMockPlugin2
|
|
1367
1272
|
} from "@hai3/api";
|
|
1368
|
-
import { i18nRegistry
|
|
1273
|
+
import { i18nRegistry, I18nRegistryImpl, createI18nRegistry, Language as Language2, SUPPORTED_LANGUAGES, getLanguageMetadata, TextDirection, LanguageDisplayMode } from "@hai3/i18n";
|
|
1274
|
+
import {
|
|
1275
|
+
formatDate,
|
|
1276
|
+
formatTime,
|
|
1277
|
+
formatDateTime,
|
|
1278
|
+
formatRelative,
|
|
1279
|
+
formatNumber,
|
|
1280
|
+
formatPercent,
|
|
1281
|
+
formatCompact,
|
|
1282
|
+
formatCurrency,
|
|
1283
|
+
compareStrings,
|
|
1284
|
+
createCollator
|
|
1285
|
+
} from "@hai3/i18n";
|
|
1369
1286
|
import { I18nRegistryImpl as I18nRegistryImpl2 } from "@hai3/i18n";
|
|
1370
1287
|
|
|
1371
1288
|
// src/compat.ts
|
|
1372
|
-
import { screensetRegistry as screensetRegistry2 } from "@hai3/screensets";
|
|
1373
1289
|
var ACCOUNTS_DOMAIN = "accounts";
|
|
1374
1290
|
|
|
1375
1291
|
// src/migration.ts
|
|
@@ -1431,6 +1347,17 @@ export {
|
|
|
1431
1347
|
ApiPluginBase,
|
|
1432
1348
|
ApiProtocol,
|
|
1433
1349
|
BaseApiService,
|
|
1350
|
+
ContainerProvider,
|
|
1351
|
+
HAI3_ACTION_LOAD_EXT3 as HAI3_ACTION_LOAD_EXT,
|
|
1352
|
+
HAI3_ACTION_MOUNT_EXT4 as HAI3_ACTION_MOUNT_EXT,
|
|
1353
|
+
HAI3_ACTION_UNMOUNT_EXT4 as HAI3_ACTION_UNMOUNT_EXT,
|
|
1354
|
+
HAI3_OVERLAY_DOMAIN,
|
|
1355
|
+
HAI3_POPUP_DOMAIN,
|
|
1356
|
+
HAI3_SCREEN_DOMAIN,
|
|
1357
|
+
HAI3_SCREEN_EXTENSION_TYPE2 as HAI3_SCREEN_EXTENSION_TYPE,
|
|
1358
|
+
HAI3_SHARED_PROPERTY_LANGUAGE3 as HAI3_SHARED_PROPERTY_LANGUAGE,
|
|
1359
|
+
HAI3_SHARED_PROPERTY_THEME3 as HAI3_SHARED_PROPERTY_THEME,
|
|
1360
|
+
HAI3_SIDEBAR_DOMAIN,
|
|
1434
1361
|
I18nRegistryImpl2 as I18nRegistry,
|
|
1435
1362
|
I18nRegistryImpl,
|
|
1436
1363
|
LAYOUT_SLICE_NAME,
|
|
@@ -1438,6 +1365,9 @@ export {
|
|
|
1438
1365
|
LanguageDisplayMode,
|
|
1439
1366
|
LayoutDomain,
|
|
1440
1367
|
MOCK_PLUGIN,
|
|
1368
|
+
MfeBridgeFactory,
|
|
1369
|
+
MfeHandler,
|
|
1370
|
+
MfeHandlerMF,
|
|
1441
1371
|
MockEventSource,
|
|
1442
1372
|
MockEvents,
|
|
1443
1373
|
RestMockPlugin,
|
|
@@ -1446,7 +1376,8 @@ export {
|
|
|
1446
1376
|
RestProtocol,
|
|
1447
1377
|
STATE_PATH_MAPPING,
|
|
1448
1378
|
SUPPORTED_LANGUAGES,
|
|
1449
|
-
|
|
1379
|
+
ScreensetsRegistry,
|
|
1380
|
+
ScreensetsRegistryFactory,
|
|
1450
1381
|
SseMockPlugin,
|
|
1451
1382
|
SsePlugin,
|
|
1452
1383
|
SsePluginWithConfig,
|
|
@@ -1463,23 +1394,34 @@ export {
|
|
|
1463
1394
|
closeAllPopups,
|
|
1464
1395
|
closePopup,
|
|
1465
1396
|
closeTopPopup,
|
|
1397
|
+
compareStrings,
|
|
1398
|
+
createCollator,
|
|
1466
1399
|
createHAI3,
|
|
1467
1400
|
createHAI3App,
|
|
1468
1401
|
createI18nRegistry,
|
|
1469
1402
|
createLegacySelector,
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
createSlice10 as createSlice,
|
|
1403
|
+
createShadowRoot,
|
|
1404
|
+
createSlice11 as createSlice,
|
|
1473
1405
|
createStore,
|
|
1474
1406
|
createThemeRegistry,
|
|
1475
1407
|
effects,
|
|
1476
|
-
|
|
1408
|
+
eventBus9 as eventBus,
|
|
1409
|
+
extractGtsPackage,
|
|
1477
1410
|
footerActions,
|
|
1478
1411
|
footerSlice,
|
|
1412
|
+
formatCompact,
|
|
1413
|
+
formatCurrency,
|
|
1414
|
+
formatDate,
|
|
1415
|
+
formatDateTime,
|
|
1416
|
+
formatNumber,
|
|
1417
|
+
formatPercent,
|
|
1418
|
+
formatRelative,
|
|
1419
|
+
formatTime,
|
|
1479
1420
|
full,
|
|
1480
1421
|
getLanguageMetadata,
|
|
1481
1422
|
getLayoutDomainState,
|
|
1482
|
-
|
|
1423
|
+
getStore7 as getStore,
|
|
1424
|
+
gtsPlugin2 as gtsPlugin,
|
|
1483
1425
|
hasLegacyUicoreState,
|
|
1484
1426
|
hasNewLayoutState,
|
|
1485
1427
|
hasSlice,
|
|
@@ -1488,9 +1430,10 @@ export {
|
|
|
1488
1430
|
headless,
|
|
1489
1431
|
hideOverlay,
|
|
1490
1432
|
i18n,
|
|
1491
|
-
|
|
1433
|
+
i18nRegistry,
|
|
1492
1434
|
initMockEffects,
|
|
1493
1435
|
initTenantEffects,
|
|
1436
|
+
injectCssVariables,
|
|
1494
1437
|
isDeprecationWarningsEnabled,
|
|
1495
1438
|
isMockPlugin2 as isMockPlugin,
|
|
1496
1439
|
isRestShortCircuit,
|
|
@@ -1499,26 +1442,34 @@ export {
|
|
|
1499
1442
|
layout,
|
|
1500
1443
|
layoutDomainReducers,
|
|
1501
1444
|
layoutReducer,
|
|
1445
|
+
loadExtension,
|
|
1502
1446
|
menuActions,
|
|
1503
1447
|
menuSlice,
|
|
1448
|
+
microfrontends,
|
|
1504
1449
|
minimal,
|
|
1505
1450
|
mock,
|
|
1506
1451
|
mockActions,
|
|
1507
1452
|
mockSlice,
|
|
1453
|
+
mountExtension,
|
|
1508
1454
|
navigateTo,
|
|
1509
|
-
navigation,
|
|
1510
1455
|
openPopup,
|
|
1511
1456
|
overlayActions,
|
|
1457
|
+
overlayDomain,
|
|
1512
1458
|
overlaySlice,
|
|
1513
1459
|
popupActions,
|
|
1460
|
+
popupDomain,
|
|
1514
1461
|
popupSlice,
|
|
1515
1462
|
presets,
|
|
1463
|
+
registerExtension,
|
|
1516
1464
|
registerSlice2 as registerSlice,
|
|
1517
|
-
routing,
|
|
1518
1465
|
screenActions,
|
|
1466
|
+
screenDomain,
|
|
1519
1467
|
screenSlice,
|
|
1520
|
-
screensetRegistry2 as screensetRegistry,
|
|
1521
1468
|
screensets,
|
|
1469
|
+
screensetsRegistryFactory2 as screensetsRegistryFactory,
|
|
1470
|
+
selectExtensionError,
|
|
1471
|
+
selectExtensionState,
|
|
1472
|
+
selectRegisteredExtensions,
|
|
1522
1473
|
setActiveScreen,
|
|
1523
1474
|
setDeprecationWarnings,
|
|
1524
1475
|
setFooterConfig,
|
|
@@ -1544,6 +1495,7 @@ export {
|
|
|
1544
1495
|
setUser,
|
|
1545
1496
|
showOverlay,
|
|
1546
1497
|
sidebarActions,
|
|
1498
|
+
sidebarDomain,
|
|
1547
1499
|
sidebarSlice,
|
|
1548
1500
|
tenantActions,
|
|
1549
1501
|
tenantSlice_default as tenantReducer,
|
|
@@ -1551,6 +1503,8 @@ export {
|
|
|
1551
1503
|
themes,
|
|
1552
1504
|
toggleMenu,
|
|
1553
1505
|
toggleMockMode,
|
|
1554
|
-
toggleSidebar
|
|
1506
|
+
toggleSidebar,
|
|
1507
|
+
unmountExtension,
|
|
1508
|
+
unregisterExtension
|
|
1555
1509
|
};
|
|
1556
1510
|
//# sourceMappingURL=index.js.map
|