@hai3/framework 0.2.0-alpha.4 → 0.4.0-alpha.1

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/dist/index.js CHANGED
@@ -22,6 +22,8 @@ var HAI3AppBuilderImpl = class {
22
22
  * Add a plugin to the application.
23
23
  * Also accepts an array of plugins (for preset support).
24
24
  */
25
+ // @cpt-begin:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-1
26
+ // @cpt-begin:cpt-hai3-state-framework-composition-builder:p1:inst-1
25
27
  use(plugin) {
26
28
  if (Array.isArray(plugin)) {
27
29
  plugin.forEach((p) => this.use(p));
@@ -39,6 +41,8 @@ var HAI3AppBuilderImpl = class {
39
41
  this.plugins.push(resolved);
40
42
  return this;
41
43
  }
44
+ // @cpt-end:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-1
45
+ // @cpt-end:cpt-hai3-state-framework-composition-builder:p1:inst-1
42
46
  /**
43
47
  * Add multiple plugins at once.
44
48
  */
@@ -49,6 +53,8 @@ var HAI3AppBuilderImpl = class {
49
53
  /**
50
54
  * Build the application.
51
55
  */
56
+ // @cpt-begin:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-2
57
+ // @cpt-begin:cpt-hai3-state-framework-composition-builder:p1:inst-2
52
58
  build() {
53
59
  const orderedPlugins = this.resolveDependencies();
54
60
  orderedPlugins.forEach((plugin) => {
@@ -64,11 +70,10 @@ var HAI3AppBuilderImpl = class {
64
70
  const app = {
65
71
  config: this.config,
66
72
  store,
67
- screensetRegistry: aggregated.registries.screensetRegistry,
68
73
  themeRegistry: aggregated.registries.themeRegistry,
69
- routeRegistry: aggregated.registries.routeRegistry,
70
74
  apiRegistry,
71
75
  i18nRegistry: aggregated.registries.i18nRegistry,
76
+ screensetsRegistry: aggregated.registries.screensetsRegistry,
72
77
  actions: aggregated.actions,
73
78
  destroy: () => this.destroyApp(orderedPlugins, app)
74
79
  };
@@ -79,9 +84,13 @@ var HAI3AppBuilderImpl = class {
79
84
  });
80
85
  return app;
81
86
  }
87
+ // @cpt-end:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-2
88
+ // @cpt-end:cpt-hai3-state-framework-composition-builder:p1:inst-2
82
89
  /**
83
90
  * Resolve plugin dependencies using topological sort.
84
91
  */
92
+ // @cpt-begin:cpt-hai3-algo-framework-composition-dep-resolution:p1:inst-1
93
+ // @cpt-begin:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-2
85
94
  resolveDependencies() {
86
95
  const resolved = [];
87
96
  const visited = /* @__PURE__ */ new Set();
@@ -120,14 +129,17 @@ Add the missing plugin: .use(${depName}())`
120
129
  this.plugins.forEach(visit);
121
130
  return resolved;
122
131
  }
132
+ // @cpt-end:cpt-hai3-algo-framework-composition-dep-resolution:p1:inst-1
133
+ // @cpt-end:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-2
123
134
  /**
124
135
  * Aggregate all provides from plugins.
125
136
  */
137
+ // @cpt-begin:cpt-hai3-algo-framework-composition-provides-aggregation:p1:inst-1
126
138
  aggregateProvides(plugins) {
127
139
  const registries = {};
128
140
  const slices = [];
129
141
  const effects2 = [];
130
- const actions = {};
142
+ const actions2 = {};
131
143
  plugins.forEach((plugin) => {
132
144
  if (!plugin.provides) return;
133
145
  if (plugin.provides.registries) {
@@ -140,11 +152,12 @@ Add the missing plugin: .use(${depName}())`
140
152
  effects2.push(...plugin.provides.effects);
141
153
  }
142
154
  if (plugin.provides.actions) {
143
- Object.assign(actions, plugin.provides.actions);
155
+ Object.assign(actions2, plugin.provides.actions);
144
156
  }
145
157
  });
146
- return { registries, slices, effects: effects2, actions };
158
+ return { registries, slices, effects: effects2, actions: actions2 };
147
159
  }
160
+ // @cpt-end:cpt-hai3-algo-framework-composition-provides-aggregation:p1:inst-1
148
161
  /**
149
162
  * Create store with all aggregated slices.
150
163
  *
@@ -159,14 +172,15 @@ Add the missing plugin: .use(${depName}())`
159
172
  */
160
173
  createStoreWithSlices(slices) {
161
174
  const store = getStore();
162
- slices.forEach((slice10) => {
163
- registerSlice(slice10);
175
+ slices.forEach((slice11) => {
176
+ registerSlice(slice11);
164
177
  });
165
178
  return store;
166
179
  }
167
180
  /**
168
181
  * Destroy the app and cleanup resources.
169
182
  */
183
+ // @cpt-begin:cpt-hai3-flow-framework-composition-teardown:p2:inst-1
170
184
  destroyApp(plugins, app) {
171
185
  [...plugins].reverse().forEach((plugin) => {
172
186
  if (plugin.onDestroy) {
@@ -174,14 +188,12 @@ Add the missing plugin: .use(${depName}())`
174
188
  }
175
189
  });
176
190
  }
191
+ // @cpt-end:cpt-hai3-flow-framework-composition-teardown:p2:inst-1
177
192
  };
178
193
  function createHAI3(config) {
179
194
  return new HAI3AppBuilderImpl(config);
180
195
  }
181
196
 
182
- // src/plugins/screensets.ts
183
- import { screensetRegistry as sdkScreensetRegistry } from "@hai3/screensets";
184
-
185
197
  // src/slices/index.ts
186
198
  import { combineReducers } from "@reduxjs/toolkit";
187
199
 
@@ -478,35 +490,26 @@ var layoutDomainReducers = {
478
490
  var layoutReducer = combineReducers(layoutDomainReducers);
479
491
 
480
492
  // src/plugins/screensets.ts
481
- var screenSlice2 = screenSlice;
482
- var screenActions2 = screenActions;
483
- function screensets(config) {
484
- const screensetRegistry3 = sdkScreensetRegistry;
493
+ function screensets(_config) {
485
494
  return {
486
495
  name: "screensets",
487
496
  dependencies: [],
488
497
  provides: {
489
- registries: {
490
- screensetRegistry: screensetRegistry3
491
- },
492
- slices: [screenSlice2],
498
+ registries: {},
499
+ slices: [screenSlice],
493
500
  actions: {
494
- setActiveScreen: screenActions2.navigateTo,
495
- setScreenLoading: screenActions2.setScreenLoading
501
+ setActiveScreen: screenActions.navigateTo,
502
+ setScreenLoading: screenActions.setScreenLoading
496
503
  }
497
504
  },
498
505
  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
506
  }
505
507
  };
506
508
  }
507
509
 
508
510
  // src/plugins/themes.ts
509
511
  import { eventBus } from "@hai3/state";
512
+ import { HAI3_SHARED_PROPERTY_THEME } from "@hai3/screensets";
510
513
 
511
514
  // src/registries/themeRegistry.ts
512
515
  function createThemeRegistry(config) {
@@ -644,32 +647,29 @@ function themes(config) {
644
647
  changeTheme
645
648
  }
646
649
  },
647
- onInit(_app) {
650
+ // @cpt-begin:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-2
651
+ // @cpt-begin:cpt-hai3-dod-framework-composition-propagation:p1:inst-1
652
+ onInit(app) {
648
653
  eventBus.on("theme/changed", (payload) => {
649
654
  themeRegistry.apply(payload.themeId);
655
+ try {
656
+ app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_THEME, payload.themeId);
657
+ } catch (error) {
658
+ console.error("[HAI3] Failed to propagate theme to MFE domains", error);
659
+ }
650
660
  });
651
661
  const themes2 = themeRegistry.getAll();
652
662
  if (themes2.length > 0) {
653
663
  themeRegistry.apply(themes2[0].id);
654
664
  }
655
665
  }
666
+ // @cpt-end:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-2
667
+ // @cpt-end:cpt-hai3-dod-framework-composition-propagation:p1:inst-1
656
668
  };
657
669
  }
658
670
 
659
671
  // src/plugins/layout.ts
660
672
  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
673
  function showPopup(payload) {
674
674
  eventBus2.emit("layout/popup/requested", payload);
675
675
  }
@@ -688,18 +688,20 @@ function toggleMenuCollapsed(payload) {
688
688
  function toggleSidebarCollapsed(payload) {
689
689
  eventBus2.emit("layout/sidebar/collapsed", payload);
690
690
  }
691
+ function setHeaderVisible(_visible) {
692
+ }
691
693
  function layout() {
692
694
  return {
693
695
  name: "layout",
694
696
  dependencies: ["screensets"],
695
697
  provides: {
696
698
  slices: [
697
- headerSlice2,
698
- footerSlice2,
699
- menuSlice2,
700
- sidebarSlice2,
701
- popupSlice2,
702
- overlaySlice2
699
+ headerSlice,
700
+ footerSlice,
701
+ menuSlice,
702
+ sidebarSlice,
703
+ popupSlice,
704
+ overlaySlice
703
705
  ],
704
706
  actions: {
705
707
  showPopup,
@@ -709,466 +711,78 @@ function layout() {
709
711
  toggleMenuCollapsed,
710
712
  toggleSidebarCollapsed,
711
713
  // Direct slice actions for backward compatibility
712
- setHeaderVisible: headerActions2.setVisible,
713
- setFooterVisible: footerActions2.setVisible,
714
- setMenuCollapsed: menuActions2.setCollapsed,
715
- setSidebarCollapsed: sidebarActions2.setCollapsed
714
+ setHeaderVisible,
715
+ setFooterVisible: footerActions.setFooterVisible,
716
+ setMenuCollapsed: menuActions.setMenuCollapsed,
717
+ setSidebarCollapsed: sidebarActions.setSidebarCollapsed
716
718
  }
717
719
  },
718
720
  onInit(app) {
719
721
  const dispatch = app.store.dispatch;
720
722
  eventBus2.on("layout/popup/requested", (payload) => {
721
- dispatch(popupActions2.open({
723
+ dispatch(popupActions.openPopup({
722
724
  id: payload.id,
723
- title: payload.title,
724
- content: payload.content,
725
- size: payload.size
725
+ title: payload.title ?? "",
726
+ component: ""
727
+ // Payload doesn't include component - this needs review
726
728
  }));
727
729
  });
728
730
  eventBus2.on("layout/popup/hidden", () => {
729
- dispatch(popupActions2.close());
731
+ dispatch(popupActions.closeAllPopups());
730
732
  });
731
- eventBus2.on("layout/overlay/requested", (payload) => {
732
- dispatch(overlayActions2.show({ id: payload.id }));
733
+ eventBus2.on("layout/overlay/requested", (_payload) => {
734
+ dispatch(overlayActions.showOverlay());
733
735
  });
734
736
  eventBus2.on("layout/overlay/hidden", () => {
735
- dispatch(overlayActions2.hide());
737
+ dispatch(overlayActions.hideOverlay());
736
738
  });
737
739
  eventBus2.on("layout/menu/collapsed", (payload) => {
738
- dispatch(menuActions2.setCollapsed(payload.collapsed));
740
+ dispatch(menuActions.setMenuCollapsed(payload.collapsed));
739
741
  });
740
742
  eventBus2.on("layout/sidebar/collapsed", (payload) => {
741
- dispatch(sidebarActions2.setCollapsed(payload.collapsed));
742
- });
743
- }
744
- };
745
- }
746
-
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
- });
743
+ dispatch(sidebarActions.setSidebarCollapsed(payload.collapsed));
975
744
  });
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
745
  }
1142
746
  };
1143
747
  }
1144
748
 
1145
749
  // src/plugins/i18n.ts
1146
- import { eventBus as eventBus4 } from "@hai3/state";
750
+ import { eventBus as eventBus3 } from "@hai3/state";
1147
751
  import { i18nRegistry as singletonI18nRegistry, Language } from "@hai3/i18n";
752
+ import { HAI3_SHARED_PROPERTY_LANGUAGE } from "@hai3/screensets";
1148
753
  function setLanguage(payload) {
1149
- eventBus4.emit("i18n/language/changed", payload);
754
+ eventBus3.emit("i18n/language/changed", payload);
1150
755
  }
1151
756
  function i18n() {
1152
- const i18nRegistry3 = singletonI18nRegistry;
757
+ const i18nRegistry2 = singletonI18nRegistry;
1153
758
  return {
1154
759
  name: "i18n",
1155
760
  dependencies: [],
1156
761
  provides: {
1157
762
  registries: {
1158
- i18nRegistry: i18nRegistry3
763
+ i18nRegistry: i18nRegistry2
1159
764
  },
1160
765
  actions: {
1161
766
  setLanguage
1162
767
  }
1163
768
  },
1164
- onInit(_app) {
1165
- eventBus4.on("i18n/language/changed", async (payload) => {
1166
- await i18nRegistry3.setLanguage(payload.language);
769
+ // @cpt-begin:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-2
770
+ // @cpt-begin:cpt-hai3-dod-framework-composition-propagation:p1:inst-2
771
+ onInit(app) {
772
+ eventBus3.on("i18n/language/changed", async (payload) => {
773
+ await i18nRegistry2.setLanguage(payload.language);
774
+ try {
775
+ app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_LANGUAGE, payload.language);
776
+ } catch (error) {
777
+ console.error("[HAI3] Failed to propagate language to MFE domains", error);
778
+ }
1167
779
  });
1168
- i18nRegistry3.setLanguage(Language.English).catch((err) => {
780
+ i18nRegistry2.setLanguage(Language.English).catch((err) => {
1169
781
  console.warn("[HAI3] Failed to load initial translations:", err);
1170
782
  });
1171
783
  }
784
+ // @cpt-end:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-2
785
+ // @cpt-end:cpt-hai3-dod-framework-composition-propagation:p1:inst-2
1172
786
  };
1173
787
  }
1174
788
 
@@ -1177,16 +791,13 @@ function effects() {
1177
791
  return {
1178
792
  name: "effects",
1179
793
  dependencies: [],
1180
- onInit(app) {
1181
- if (app.config.devMode) {
1182
- console.log("[HAI3] Effects plugin initialized");
1183
- }
794
+ onInit() {
1184
795
  }
1185
796
  };
1186
797
  }
1187
798
 
1188
799
  // src/effects/mockEffects.ts
1189
- import { eventBus as eventBus5, getStore as getStore2 } from "@hai3/state";
800
+ import { eventBus as eventBus4, getStore as getStore2 } from "@hai3/state";
1190
801
  import { apiRegistry as apiRegistry2, isMockPlugin } from "@hai3/api";
1191
802
  function hasPluginManagement(protocol) {
1192
803
  return "plugins" in protocol && typeof protocol.plugins === "object";
@@ -1216,7 +827,7 @@ function syncMockPlugins(enabled) {
1216
827
  }
1217
828
  function initMockEffects() {
1218
829
  const store = getStore2();
1219
- const unsubscribe = eventBus5.on(MockEvents.Toggle, (payload) => {
830
+ const unsubscribe = eventBus4.on(MockEvents.Toggle, (payload) => {
1220
831
  store.dispatch(setMockEnabled(payload.enabled));
1221
832
  syncMockPlugins(payload.enabled);
1222
833
  });
@@ -1229,7 +840,7 @@ function initMockEffects() {
1229
840
  };
1230
841
  }
1231
842
  function toggleMockMode(enabled) {
1232
- eventBus5.emit(MockEvents.Toggle, { enabled });
843
+ eventBus4.emit(MockEvents.Toggle, { enabled });
1233
844
  }
1234
845
 
1235
846
  // src/plugins/mock.ts
@@ -1255,9 +866,6 @@ function mock(config) {
1255
866
  const enabledByDefault = config?.enabledByDefault ?? isDev;
1256
867
  if (enabledByDefault) {
1257
868
  toggleMockMode(true);
1258
- if (isDev) {
1259
- console.log("[HAI3] Mock mode enabled by default (dev environment detected)");
1260
- }
1261
869
  }
1262
870
  },
1263
871
  onDestroy() {
@@ -1269,18 +877,314 @@ function mock(config) {
1269
877
  };
1270
878
  }
1271
879
 
880
+ // src/plugins/microfrontends/index.ts
881
+ import {
882
+ screensetsRegistryFactory,
883
+ HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT3,
884
+ HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT3
885
+ } from "@hai3/screensets";
886
+ import { getStore as getStore4 } from "@hai3/state";
887
+
888
+ // src/plugins/microfrontends/slice.ts
889
+ import { createSlice as createSlice10 } from "@hai3/state";
890
+ var SLICE_KEY10 = "mfe";
891
+ var initialState10 = {
892
+ registrationStates: {},
893
+ errors: {},
894
+ mountedExtensions: {}
895
+ };
896
+ var { slice: slice10, ...actions } = createSlice10({
897
+ name: SLICE_KEY10,
898
+ initialState: initialState10,
899
+ reducers: {
900
+ // Registration state reducers
901
+ setExtensionRegistering: (state, action) => {
902
+ state.registrationStates[action.payload.extensionId] = "registering";
903
+ },
904
+ setExtensionRegistered: (state, action) => {
905
+ state.registrationStates[action.payload.extensionId] = "registered";
906
+ },
907
+ setExtensionUnregistered: (state, action) => {
908
+ state.registrationStates[action.payload.extensionId] = "unregistered";
909
+ },
910
+ setExtensionError: (state, action) => {
911
+ state.registrationStates[action.payload.extensionId] = "error";
912
+ state.errors[action.payload.extensionId] = action.payload.error;
913
+ },
914
+ // Mount state reducers
915
+ setExtensionMounted: (state, action) => {
916
+ state.mountedExtensions[action.payload.domainId] = action.payload.extensionId;
917
+ },
918
+ setExtensionUnmounted: (state, action) => {
919
+ state.mountedExtensions[action.payload.domainId] = void 0;
920
+ }
921
+ }
922
+ });
923
+ var mfeSlice = slice10;
924
+ var {
925
+ setExtensionRegistering,
926
+ setExtensionRegistered,
927
+ setExtensionUnregistered,
928
+ setExtensionError,
929
+ setExtensionMounted,
930
+ setExtensionUnmounted
931
+ } = actions;
932
+ function selectExtensionState(state, extensionId) {
933
+ return state.mfe.registrationStates[extensionId] ?? "unregistered";
934
+ }
935
+ function selectRegisteredExtensions(state) {
936
+ return Object.entries(state.mfe.registrationStates).filter(([_, regState]) => regState === "registered").map(([extensionId]) => extensionId);
937
+ }
938
+ function selectExtensionError(state, extensionId) {
939
+ return state.mfe.errors[extensionId];
940
+ }
941
+ var slice_default = slice10.reducer;
942
+
943
+ // src/plugins/microfrontends/effects.ts
944
+ import { eventBus as eventBus5, getStore as getStore3 } from "@hai3/state";
945
+
946
+ // src/plugins/microfrontends/constants.ts
947
+ var HAI3_POPUP_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.popup.v1";
948
+ var HAI3_SIDEBAR_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1";
949
+ var HAI3_SCREEN_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.screen.v1";
950
+ var HAI3_OVERLAY_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.overlay.v1";
951
+ var MfeEvents = {
952
+ RegisterExtensionRequested: "mfe/registerExtensionRequested",
953
+ UnregisterExtensionRequested: "mfe/unregisterExtensionRequested"
954
+ };
955
+
956
+ // src/plugins/microfrontends/effects.ts
957
+ function initMfeEffects(screensetsRegistry2) {
958
+ const store = getStore3();
959
+ const unsubscribers = [];
960
+ const unsubRegisterExtension = eventBus5.on(MfeEvents.RegisterExtensionRequested, async (payload) => {
961
+ const { extension } = payload;
962
+ try {
963
+ store.dispatch(setExtensionRegistering({ extensionId: extension.id }));
964
+ await screensetsRegistry2.registerExtension(extension);
965
+ store.dispatch(setExtensionRegistered({ extensionId: extension.id }));
966
+ } catch (error) {
967
+ const errorMessage = error instanceof Error ? error.message : "Unknown registration error";
968
+ store.dispatch(setExtensionError({ extensionId: extension.id, error: errorMessage }));
969
+ }
970
+ });
971
+ unsubscribers.push(unsubRegisterExtension);
972
+ const unsubUnregisterExtension = eventBus5.on(MfeEvents.UnregisterExtensionRequested, async (payload) => {
973
+ const { extensionId } = payload;
974
+ try {
975
+ await screensetsRegistry2.unregisterExtension(extensionId);
976
+ store.dispatch(setExtensionUnregistered({ extensionId }));
977
+ } catch (error) {
978
+ const errorMessage = error instanceof Error ? error.message : "Unknown unregistration error";
979
+ store.dispatch(setExtensionError({ extensionId, error: errorMessage }));
980
+ }
981
+ });
982
+ unsubscribers.push(unsubUnregisterExtension);
983
+ return () => {
984
+ unsubscribers.forEach((unsub) => unsub.unsubscribe());
985
+ };
986
+ }
987
+
988
+ // src/plugins/microfrontends/actions.ts
989
+ import { eventBus as eventBus6 } from "@hai3/state";
990
+ import {
991
+ HAI3_ACTION_LOAD_EXT,
992
+ HAI3_ACTION_MOUNT_EXT,
993
+ HAI3_ACTION_UNMOUNT_EXT
994
+ } from "@hai3/screensets";
995
+ var screensetsRegistry = null;
996
+ function setMfeRegistry(registry) {
997
+ screensetsRegistry = registry;
998
+ }
999
+ function resolveDomainId(extensionId) {
1000
+ if (!screensetsRegistry) {
1001
+ throw new Error("MFE registry not initialized. Call setMfeRegistry() before using lifecycle actions.");
1002
+ }
1003
+ const extension = screensetsRegistry.getExtension(extensionId);
1004
+ if (!extension) {
1005
+ throw new Error(`Extension '${extensionId}' is not registered. Register it before calling lifecycle actions.`);
1006
+ }
1007
+ return extension.domain;
1008
+ }
1009
+ function loadExtension(extensionId) {
1010
+ const domainId = resolveDomainId(extensionId);
1011
+ screensetsRegistry.executeActionsChain({
1012
+ action: {
1013
+ type: HAI3_ACTION_LOAD_EXT,
1014
+ target: domainId,
1015
+ payload: { extensionId }
1016
+ }
1017
+ }).catch((error) => {
1018
+ console.error(`[MFE] Load failed for ${extensionId}:`, error);
1019
+ });
1020
+ }
1021
+ function mountExtension(extensionId) {
1022
+ const domainId = resolveDomainId(extensionId);
1023
+ screensetsRegistry.executeActionsChain({
1024
+ action: {
1025
+ type: HAI3_ACTION_MOUNT_EXT,
1026
+ target: domainId,
1027
+ payload: { extensionId }
1028
+ }
1029
+ }).catch((error) => {
1030
+ console.error(`[MFE] Mount failed for ${extensionId}:`, error);
1031
+ });
1032
+ }
1033
+ function unmountExtension(extensionId) {
1034
+ const domainId = resolveDomainId(extensionId);
1035
+ screensetsRegistry.executeActionsChain({
1036
+ action: {
1037
+ type: HAI3_ACTION_UNMOUNT_EXT,
1038
+ target: domainId,
1039
+ payload: { extensionId }
1040
+ }
1041
+ }).catch((error) => {
1042
+ console.error(`[MFE] Unmount failed for ${extensionId}:`, error);
1043
+ });
1044
+ }
1045
+ function registerExtension(extension) {
1046
+ eventBus6.emit(MfeEvents.RegisterExtensionRequested, { extension });
1047
+ }
1048
+ function unregisterExtension(extensionId) {
1049
+ eventBus6.emit(MfeEvents.UnregisterExtensionRequested, { extensionId });
1050
+ }
1051
+
1052
+ // src/plugins/microfrontends/base-domains.ts
1053
+ import {
1054
+ HAI3_ACTION_LOAD_EXT as HAI3_ACTION_LOAD_EXT2,
1055
+ HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT2,
1056
+ HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT2,
1057
+ HAI3_SHARED_PROPERTY_THEME as HAI3_SHARED_PROPERTY_THEME2,
1058
+ HAI3_SHARED_PROPERTY_LANGUAGE as HAI3_SHARED_PROPERTY_LANGUAGE2,
1059
+ HAI3_SCREEN_EXTENSION_TYPE
1060
+ } from "@hai3/screensets";
1061
+ var INIT_ONLY_LIFECYCLE_STAGES = [
1062
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1"
1063
+ ];
1064
+ var DEFAULT_LIFECYCLE_STAGES = [
1065
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1",
1066
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.activated.v1",
1067
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.deactivated.v1",
1068
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.destroyed.v1"
1069
+ ];
1070
+ var screenDomain = {
1071
+ id: HAI3_SCREEN_DOMAIN,
1072
+ actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2],
1073
+ extensionsActions: [],
1074
+ sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
1075
+ defaultActionTimeout: 3e4,
1076
+ lifecycleStages: [...INIT_ONLY_LIFECYCLE_STAGES],
1077
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1078
+ extensionsTypeId: HAI3_SCREEN_EXTENSION_TYPE,
1079
+ lifecycle: void 0
1080
+ };
1081
+ var sidebarDomain = {
1082
+ id: HAI3_SIDEBAR_DOMAIN,
1083
+ actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
1084
+ extensionsActions: [],
1085
+ sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
1086
+ defaultActionTimeout: 3e4,
1087
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1088
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1089
+ lifecycle: void 0
1090
+ };
1091
+ var popupDomain = {
1092
+ id: HAI3_POPUP_DOMAIN,
1093
+ actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
1094
+ extensionsActions: [],
1095
+ sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
1096
+ defaultActionTimeout: 3e4,
1097
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1098
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1099
+ lifecycle: void 0
1100
+ };
1101
+ var overlayDomain = {
1102
+ id: HAI3_OVERLAY_DOMAIN,
1103
+ actions: [HAI3_ACTION_LOAD_EXT2, HAI3_ACTION_MOUNT_EXT2, HAI3_ACTION_UNMOUNT_EXT2],
1104
+ extensionsActions: [],
1105
+ sharedProperties: [HAI3_SHARED_PROPERTY_THEME2, HAI3_SHARED_PROPERTY_LANGUAGE2],
1106
+ defaultActionTimeout: 3e4,
1107
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1108
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1109
+ lifecycle: void 0
1110
+ };
1111
+
1112
+ // src/plugins/microfrontends/index.ts
1113
+ function microfrontends(config) {
1114
+ const screensetsRegistry2 = screensetsRegistryFactory.build({
1115
+ typeSystem: config.typeSystem,
1116
+ mfeHandlers: config.mfeHandlers
1117
+ });
1118
+ const originalExecuteActionsChain = screensetsRegistry2.executeActionsChain.bind(screensetsRegistry2);
1119
+ screensetsRegistry2.executeActionsChain = async (chain) => {
1120
+ await originalExecuteActionsChain(chain);
1121
+ const actionType = chain.action?.type;
1122
+ if (actionType === HAI3_ACTION_MOUNT_EXT3) {
1123
+ const store = getStore4();
1124
+ const domainId = chain.action.target;
1125
+ const extensionId = chain.action.payload?.extensionId;
1126
+ if (domainId && extensionId) {
1127
+ store.dispatch(setExtensionMounted({ domainId, extensionId }));
1128
+ }
1129
+ } else if (actionType === HAI3_ACTION_UNMOUNT_EXT3) {
1130
+ const store = getStore4();
1131
+ const domainId = chain.action.target;
1132
+ if (domainId) {
1133
+ store.dispatch(setExtensionUnmounted({ domainId }));
1134
+ }
1135
+ }
1136
+ };
1137
+ let effectsCleanup = null;
1138
+ return {
1139
+ name: "microfrontends",
1140
+ dependencies: ["screensets"],
1141
+ // Requires screensets to be initialized
1142
+ provides: {
1143
+ registries: {
1144
+ // Expose the MFE-enabled ScreensetsRegistry
1145
+ // This registry has registerDomain(), registerExtension(), etc.
1146
+ screensetsRegistry: screensetsRegistry2
1147
+ },
1148
+ slices: [mfeSlice],
1149
+ // NOTE: Effects are NOT initialized via provides.effects.
1150
+ // They are initialized in onInit to capture cleanup references.
1151
+ // The framework calls provides.effects at build step 5, then onInit at step 7.
1152
+ // We only initialize effects in onInit to avoid duplicate event listeners.
1153
+ actions: {
1154
+ loadExtension,
1155
+ mountExtension,
1156
+ unmountExtension,
1157
+ registerExtension,
1158
+ unregisterExtension
1159
+ }
1160
+ },
1161
+ onInit() {
1162
+ setMfeRegistry(screensetsRegistry2);
1163
+ effectsCleanup = initMfeEffects(screensetsRegistry2);
1164
+ },
1165
+ onDestroy() {
1166
+ if (effectsCleanup) {
1167
+ effectsCleanup();
1168
+ effectsCleanup = null;
1169
+ }
1170
+ }
1171
+ };
1172
+ }
1173
+
1272
1174
  // src/presets/index.ts
1273
1175
  function full(config) {
1274
- return [
1176
+ const plugins = [
1275
1177
  effects(),
1276
1178
  screensets({ autoDiscover: true }),
1277
1179
  themes(config?.themes),
1278
1180
  layout(),
1279
- routing(),
1280
- navigation(),
1281
1181
  i18n(),
1282
1182
  mock()
1283
1183
  ];
1184
+ if (config?.microfrontends) {
1185
+ plugins.push(microfrontends(config.microfrontends));
1186
+ }
1187
+ return plugins;
1284
1188
  }
1285
1189
  function minimal() {
1286
1190
  return [
@@ -1301,31 +1205,56 @@ var presets = {
1301
1205
 
1302
1206
  // src/createHAI3App.ts
1303
1207
  function createHAI3App(config) {
1304
- return createHAI3(config).useAll(full({ themes: config?.themes })).build();
1208
+ return createHAI3(config).useAll(full({
1209
+ themes: config?.themes,
1210
+ microfrontends: config?.microfrontends
1211
+ })).build();
1305
1212
  }
1306
1213
 
1307
- // src/registries/index.ts
1308
- import { createScreensetRegistry, screensetRegistry } from "@hai3/screensets";
1309
-
1310
1214
  // src/index.ts
1311
- import { eventBus as eventBus7, createStore, getStore as getStore4, registerSlice as registerSlice2, hasSlice, createSlice as createSlice10 } from "@hai3/state";
1312
1215
  import {
1313
- LayoutDomain,
1314
- ScreensetCategory
1216
+ HAI3_SCREEN_EXTENSION_TYPE as HAI3_SCREEN_EXTENSION_TYPE2,
1217
+ HAI3_MFE_ENTRY_MF
1218
+ } from "@hai3/screensets";
1219
+ import {
1220
+ HAI3_ACTION_LOAD_EXT as HAI3_ACTION_LOAD_EXT3,
1221
+ HAI3_ACTION_MOUNT_EXT as HAI3_ACTION_MOUNT_EXT4,
1222
+ HAI3_ACTION_UNMOUNT_EXT as HAI3_ACTION_UNMOUNT_EXT4
1223
+ } from "@hai3/screensets";
1224
+ import {
1225
+ HAI3_SHARED_PROPERTY_THEME as HAI3_SHARED_PROPERTY_THEME3,
1226
+ HAI3_SHARED_PROPERTY_LANGUAGE as HAI3_SHARED_PROPERTY_LANGUAGE3
1227
+ } from "@hai3/screensets";
1228
+ import {
1229
+ MfeHandler,
1230
+ MfeBridgeFactory,
1231
+ ScreensetsRegistry,
1232
+ ScreensetsRegistryFactory,
1233
+ screensetsRegistryFactory as screensetsRegistryFactory2,
1234
+ ContainerProvider
1235
+ } from "@hai3/screensets";
1236
+ import { MfeHandlerMF } from "@hai3/screensets/mfe/handler";
1237
+ import { gtsPlugin } from "@hai3/screensets/plugins/gts";
1238
+ import {
1239
+ createShadowRoot,
1240
+ injectCssVariables,
1241
+ extractGtsPackage
1315
1242
  } from "@hai3/screensets";
1243
+ import { eventBus as eventBus9, createStore, getStore as getStore7, registerSlice as registerSlice2, hasSlice, createSlice as createSlice11 } from "@hai3/state";
1244
+ import { LayoutDomain } from "@hai3/screensets";
1316
1245
 
1317
1246
  // src/effects/tenantEffects.ts
1318
- import { eventBus as eventBus6, getStore as getStore3 } from "@hai3/state";
1247
+ import { eventBus as eventBus7, getStore as getStore5 } from "@hai3/state";
1319
1248
  var TenantEvents = {
1320
1249
  Changed: "app/tenant/changed",
1321
1250
  Cleared: "app/tenant/cleared"
1322
1251
  };
1323
1252
  function initTenantEffects() {
1324
- const store = getStore3();
1325
- const subChanged = eventBus6.on(TenantEvents.Changed, (payload) => {
1253
+ const store = getStore5();
1254
+ const subChanged = eventBus7.on(TenantEvents.Changed, (payload) => {
1326
1255
  store.dispatch(setTenant(payload.tenant));
1327
1256
  });
1328
- const subCleared = eventBus6.on(TenantEvents.Cleared, () => {
1257
+ const subCleared = eventBus7.on(TenantEvents.Cleared, () => {
1329
1258
  store.dispatch(clearTenant());
1330
1259
  });
1331
1260
  return () => {
@@ -1333,14 +1262,17 @@ function initTenantEffects() {
1333
1262
  subCleared.unsubscribe();
1334
1263
  };
1335
1264
  }
1265
+
1266
+ // src/effects/tenantActions.ts
1267
+ import { eventBus as eventBus8, getStore as getStore6 } from "@hai3/state";
1336
1268
  function changeTenant(tenant) {
1337
- eventBus6.emit(TenantEvents.Changed, { tenant });
1269
+ eventBus8.emit(TenantEvents.Changed, { tenant });
1338
1270
  }
1339
1271
  function clearTenantAction() {
1340
- eventBus6.emit(TenantEvents.Cleared, {});
1272
+ eventBus8.emit(TenantEvents.Cleared, {});
1341
1273
  }
1342
1274
  function setTenantLoadingState(loading) {
1343
- getStore3().dispatch(setTenantLoading(loading));
1275
+ getStore6().dispatch(setTenantLoading(loading));
1344
1276
  }
1345
1277
 
1346
1278
  // src/index.ts
@@ -1365,11 +1297,22 @@ import {
1365
1297
  MOCK_PLUGIN,
1366
1298
  isMockPlugin as isMockPlugin2
1367
1299
  } from "@hai3/api";
1368
- import { i18nRegistry as i18nRegistry2, I18nRegistryImpl, createI18nRegistry, Language as Language2, SUPPORTED_LANGUAGES, getLanguageMetadata, TextDirection, LanguageDisplayMode } from "@hai3/i18n";
1300
+ import { i18nRegistry, I18nRegistryImpl, createI18nRegistry, Language as Language2, SUPPORTED_LANGUAGES, getLanguageMetadata, TextDirection, LanguageDisplayMode } from "@hai3/i18n";
1301
+ import {
1302
+ formatDate,
1303
+ formatTime,
1304
+ formatDateTime,
1305
+ formatRelative,
1306
+ formatNumber,
1307
+ formatPercent,
1308
+ formatCompact,
1309
+ formatCurrency,
1310
+ compareStrings,
1311
+ createCollator
1312
+ } from "@hai3/i18n";
1369
1313
  import { I18nRegistryImpl as I18nRegistryImpl2 } from "@hai3/i18n";
1370
1314
 
1371
1315
  // src/compat.ts
1372
- import { screensetRegistry as screensetRegistry2 } from "@hai3/screensets";
1373
1316
  var ACCOUNTS_DOMAIN = "accounts";
1374
1317
 
1375
1318
  // src/migration.ts
@@ -1431,6 +1374,18 @@ export {
1431
1374
  ApiPluginBase,
1432
1375
  ApiProtocol,
1433
1376
  BaseApiService,
1377
+ ContainerProvider,
1378
+ HAI3_ACTION_LOAD_EXT3 as HAI3_ACTION_LOAD_EXT,
1379
+ HAI3_ACTION_MOUNT_EXT4 as HAI3_ACTION_MOUNT_EXT,
1380
+ HAI3_ACTION_UNMOUNT_EXT4 as HAI3_ACTION_UNMOUNT_EXT,
1381
+ HAI3_MFE_ENTRY_MF,
1382
+ HAI3_OVERLAY_DOMAIN,
1383
+ HAI3_POPUP_DOMAIN,
1384
+ HAI3_SCREEN_DOMAIN,
1385
+ HAI3_SCREEN_EXTENSION_TYPE2 as HAI3_SCREEN_EXTENSION_TYPE,
1386
+ HAI3_SHARED_PROPERTY_LANGUAGE3 as HAI3_SHARED_PROPERTY_LANGUAGE,
1387
+ HAI3_SHARED_PROPERTY_THEME3 as HAI3_SHARED_PROPERTY_THEME,
1388
+ HAI3_SIDEBAR_DOMAIN,
1434
1389
  I18nRegistryImpl2 as I18nRegistry,
1435
1390
  I18nRegistryImpl,
1436
1391
  LAYOUT_SLICE_NAME,
@@ -1438,6 +1393,9 @@ export {
1438
1393
  LanguageDisplayMode,
1439
1394
  LayoutDomain,
1440
1395
  MOCK_PLUGIN,
1396
+ MfeBridgeFactory,
1397
+ MfeHandler,
1398
+ MfeHandlerMF,
1441
1399
  MockEventSource,
1442
1400
  MockEvents,
1443
1401
  RestMockPlugin,
@@ -1446,7 +1404,8 @@ export {
1446
1404
  RestProtocol,
1447
1405
  STATE_PATH_MAPPING,
1448
1406
  SUPPORTED_LANGUAGES,
1449
- ScreensetCategory,
1407
+ ScreensetsRegistry,
1408
+ ScreensetsRegistryFactory,
1450
1409
  SseMockPlugin,
1451
1410
  SsePlugin,
1452
1411
  SsePluginWithConfig,
@@ -1463,23 +1422,34 @@ export {
1463
1422
  closeAllPopups,
1464
1423
  closePopup,
1465
1424
  closeTopPopup,
1425
+ compareStrings,
1426
+ createCollator,
1466
1427
  createHAI3,
1467
1428
  createHAI3App,
1468
1429
  createI18nRegistry,
1469
1430
  createLegacySelector,
1470
- createRouteRegistry,
1471
- createScreensetRegistry,
1472
- createSlice10 as createSlice,
1431
+ createShadowRoot,
1432
+ createSlice11 as createSlice,
1473
1433
  createStore,
1474
1434
  createThemeRegistry,
1475
1435
  effects,
1476
- eventBus7 as eventBus,
1436
+ eventBus9 as eventBus,
1437
+ extractGtsPackage,
1477
1438
  footerActions,
1478
1439
  footerSlice,
1440
+ formatCompact,
1441
+ formatCurrency,
1442
+ formatDate,
1443
+ formatDateTime,
1444
+ formatNumber,
1445
+ formatPercent,
1446
+ formatRelative,
1447
+ formatTime,
1479
1448
  full,
1480
1449
  getLanguageMetadata,
1481
1450
  getLayoutDomainState,
1482
- getStore4 as getStore,
1451
+ getStore7 as getStore,
1452
+ gtsPlugin,
1483
1453
  hasLegacyUicoreState,
1484
1454
  hasNewLayoutState,
1485
1455
  hasSlice,
@@ -1488,9 +1458,10 @@ export {
1488
1458
  headless,
1489
1459
  hideOverlay,
1490
1460
  i18n,
1491
- i18nRegistry2 as i18nRegistry,
1461
+ i18nRegistry,
1492
1462
  initMockEffects,
1493
1463
  initTenantEffects,
1464
+ injectCssVariables,
1494
1465
  isDeprecationWarningsEnabled,
1495
1466
  isMockPlugin2 as isMockPlugin,
1496
1467
  isRestShortCircuit,
@@ -1499,26 +1470,34 @@ export {
1499
1470
  layout,
1500
1471
  layoutDomainReducers,
1501
1472
  layoutReducer,
1473
+ loadExtension,
1502
1474
  menuActions,
1503
1475
  menuSlice,
1476
+ microfrontends,
1504
1477
  minimal,
1505
1478
  mock,
1506
1479
  mockActions,
1507
1480
  mockSlice,
1481
+ mountExtension,
1508
1482
  navigateTo,
1509
- navigation,
1510
1483
  openPopup,
1511
1484
  overlayActions,
1485
+ overlayDomain,
1512
1486
  overlaySlice,
1513
1487
  popupActions,
1488
+ popupDomain,
1514
1489
  popupSlice,
1515
1490
  presets,
1491
+ registerExtension,
1516
1492
  registerSlice2 as registerSlice,
1517
- routing,
1518
1493
  screenActions,
1494
+ screenDomain,
1519
1495
  screenSlice,
1520
- screensetRegistry2 as screensetRegistry,
1521
1496
  screensets,
1497
+ screensetsRegistryFactory2 as screensetsRegistryFactory,
1498
+ selectExtensionError,
1499
+ selectExtensionState,
1500
+ selectRegisteredExtensions,
1522
1501
  setActiveScreen,
1523
1502
  setDeprecationWarnings,
1524
1503
  setFooterConfig,
@@ -1544,6 +1523,7 @@ export {
1544
1523
  setUser,
1545
1524
  showOverlay,
1546
1525
  sidebarActions,
1526
+ sidebarDomain,
1547
1527
  sidebarSlice,
1548
1528
  tenantActions,
1549
1529
  tenantSlice_default as tenantReducer,
@@ -1551,6 +1531,8 @@ export {
1551
1531
  themes,
1552
1532
  toggleMenu,
1553
1533
  toggleMockMode,
1554
- toggleSidebar
1534
+ toggleSidebar,
1535
+ unmountExtension,
1536
+ unregisterExtension
1555
1537
  };
1556
1538
  //# sourceMappingURL=index.js.map