@hai3/framework 0.2.0-alpha.4 → 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/dist/index.cjs CHANGED
@@ -25,13 +25,27 @@ __export(src_exports, {
25
25
  ApiPluginBase: () => import_api3.ApiPluginBase,
26
26
  ApiProtocol: () => import_api3.ApiProtocol,
27
27
  BaseApiService: () => import_api3.BaseApiService,
28
+ ContainerProvider: () => import_screensets11.ContainerProvider,
29
+ HAI3_ACTION_LOAD_EXT: () => import_screensets9.HAI3_ACTION_LOAD_EXT,
30
+ HAI3_ACTION_MOUNT_EXT: () => import_screensets9.HAI3_ACTION_MOUNT_EXT,
31
+ HAI3_ACTION_UNMOUNT_EXT: () => import_screensets9.HAI3_ACTION_UNMOUNT_EXT,
32
+ HAI3_OVERLAY_DOMAIN: () => HAI3_OVERLAY_DOMAIN,
33
+ HAI3_POPUP_DOMAIN: () => HAI3_POPUP_DOMAIN,
34
+ HAI3_SCREEN_DOMAIN: () => HAI3_SCREEN_DOMAIN,
35
+ HAI3_SCREEN_EXTENSION_TYPE: () => import_screensets8.HAI3_SCREEN_EXTENSION_TYPE,
36
+ HAI3_SHARED_PROPERTY_LANGUAGE: () => import_screensets10.HAI3_SHARED_PROPERTY_LANGUAGE,
37
+ HAI3_SHARED_PROPERTY_THEME: () => import_screensets10.HAI3_SHARED_PROPERTY_THEME,
38
+ HAI3_SIDEBAR_DOMAIN: () => HAI3_SIDEBAR_DOMAIN,
28
39
  I18nRegistry: () => import_i18n6.I18nRegistryImpl,
29
- I18nRegistryImpl: () => import_i18n5.I18nRegistryImpl,
40
+ I18nRegistryImpl: () => import_i18n4.I18nRegistryImpl,
30
41
  LAYOUT_SLICE_NAME: () => LAYOUT_SLICE_NAME,
31
- Language: () => import_i18n5.Language,
32
- LanguageDisplayMode: () => import_i18n5.LanguageDisplayMode,
33
- LayoutDomain: () => import_screensets6.LayoutDomain,
42
+ Language: () => import_i18n4.Language,
43
+ LanguageDisplayMode: () => import_i18n4.LanguageDisplayMode,
44
+ LayoutDomain: () => import_screensets13.LayoutDomain,
34
45
  MOCK_PLUGIN: () => import_api3.MOCK_PLUGIN,
46
+ MfeBridgeFactory: () => import_screensets11.MfeBridgeFactory,
47
+ MfeHandler: () => import_screensets11.MfeHandler,
48
+ MfeHandlerMF: () => import_handler.MfeHandlerMF,
35
49
  MockEventSource: () => import_api3.MockEventSource,
36
50
  MockEvents: () => MockEvents,
37
51
  RestMockPlugin: () => import_api3.RestMockPlugin,
@@ -39,15 +53,16 @@ __export(src_exports, {
39
53
  RestPluginWithConfig: () => import_api3.RestPluginWithConfig,
40
54
  RestProtocol: () => import_api3.RestProtocol,
41
55
  STATE_PATH_MAPPING: () => STATE_PATH_MAPPING,
42
- SUPPORTED_LANGUAGES: () => import_i18n5.SUPPORTED_LANGUAGES,
43
- ScreensetCategory: () => import_screensets6.ScreensetCategory,
56
+ SUPPORTED_LANGUAGES: () => import_i18n4.SUPPORTED_LANGUAGES,
57
+ ScreensetsRegistry: () => import_screensets11.ScreensetsRegistry,
58
+ ScreensetsRegistryFactory: () => import_screensets11.ScreensetsRegistryFactory,
44
59
  SseMockPlugin: () => import_api3.SseMockPlugin,
45
60
  SsePlugin: () => import_api3.SsePlugin,
46
61
  SsePluginWithConfig: () => import_api3.SsePluginWithConfig,
47
62
  SseProtocol: () => import_api3.SseProtocol,
48
63
  TENANT_SLICE_NAME: () => TENANT_SLICE_NAME,
49
64
  TenantEvents: () => TenantEvents,
50
- TextDirection: () => import_i18n5.TextDirection,
65
+ TextDirection: () => import_i18n4.TextDirection,
51
66
  apiRegistry: () => import_api3.apiRegistry,
52
67
  changeTenant: () => changeTenant,
53
68
  clearActiveScreen: () => clearActiveScreen,
@@ -57,34 +72,46 @@ __export(src_exports, {
57
72
  closeAllPopups: () => closeAllPopups,
58
73
  closePopup: () => closePopup,
59
74
  closeTopPopup: () => closeTopPopup,
75
+ compareStrings: () => import_i18n5.compareStrings,
76
+ createCollator: () => import_i18n5.createCollator,
60
77
  createHAI3: () => createHAI3,
61
78
  createHAI3App: () => createHAI3App,
62
- createI18nRegistry: () => import_i18n5.createI18nRegistry,
79
+ createI18nRegistry: () => import_i18n4.createI18nRegistry,
63
80
  createLegacySelector: () => createLegacySelector,
64
- createRouteRegistry: () => createRouteRegistry,
65
- createScreensetRegistry: () => import_screensets4.createScreensetRegistry,
66
- createSlice: () => import_state17.createSlice,
67
- createStore: () => import_state17.createStore,
81
+ createShadowRoot: () => import_screensets12.createShadowRoot,
82
+ createSlice: () => import_state21.createSlice,
83
+ createStore: () => import_state21.createStore,
68
84
  createThemeRegistry: () => createThemeRegistry,
69
85
  effects: () => effects,
70
- eventBus: () => import_state17.eventBus,
86
+ eventBus: () => import_state21.eventBus,
87
+ extractGtsPackage: () => import_screensets12.extractGtsPackage,
71
88
  footerActions: () => footerActions,
72
89
  footerSlice: () => footerSlice,
90
+ formatCompact: () => import_i18n5.formatCompact,
91
+ formatCurrency: () => import_i18n5.formatCurrency,
92
+ formatDate: () => import_i18n5.formatDate,
93
+ formatDateTime: () => import_i18n5.formatDateTime,
94
+ formatNumber: () => import_i18n5.formatNumber,
95
+ formatPercent: () => import_i18n5.formatPercent,
96
+ formatRelative: () => import_i18n5.formatRelative,
97
+ formatTime: () => import_i18n5.formatTime,
73
98
  full: () => full,
74
- getLanguageMetadata: () => import_i18n5.getLanguageMetadata,
99
+ getLanguageMetadata: () => import_i18n4.getLanguageMetadata,
75
100
  getLayoutDomainState: () => getLayoutDomainState,
76
- getStore: () => import_state17.getStore,
101
+ getStore: () => import_state21.getStore,
102
+ gtsPlugin: () => import_gts2.gtsPlugin,
77
103
  hasLegacyUicoreState: () => hasLegacyUicoreState,
78
104
  hasNewLayoutState: () => hasNewLayoutState,
79
- hasSlice: () => import_state17.hasSlice,
105
+ hasSlice: () => import_state21.hasSlice,
80
106
  headerActions: () => headerActions,
81
107
  headerSlice: () => headerSlice,
82
108
  headless: () => headless,
83
109
  hideOverlay: () => hideOverlay,
84
110
  i18n: () => i18n,
85
- i18nRegistry: () => import_i18n5.i18nRegistry,
111
+ i18nRegistry: () => import_i18n4.i18nRegistry,
86
112
  initMockEffects: () => initMockEffects,
87
113
  initTenantEffects: () => initTenantEffects,
114
+ injectCssVariables: () => import_screensets12.injectCssVariables,
88
115
  isDeprecationWarningsEnabled: () => isDeprecationWarningsEnabled,
89
116
  isMockPlugin: () => import_api3.isMockPlugin,
90
117
  isRestShortCircuit: () => import_api3.isRestShortCircuit,
@@ -93,26 +120,34 @@ __export(src_exports, {
93
120
  layout: () => layout,
94
121
  layoutDomainReducers: () => layoutDomainReducers,
95
122
  layoutReducer: () => layoutReducer,
123
+ loadExtension: () => loadExtension,
96
124
  menuActions: () => menuActions,
97
125
  menuSlice: () => menuSlice,
126
+ microfrontends: () => microfrontends,
98
127
  minimal: () => minimal,
99
128
  mock: () => mock,
100
129
  mockActions: () => mockActions,
101
130
  mockSlice: () => mockSlice,
131
+ mountExtension: () => mountExtension,
102
132
  navigateTo: () => navigateTo,
103
- navigation: () => navigation,
104
133
  openPopup: () => openPopup,
105
134
  overlayActions: () => overlayActions,
135
+ overlayDomain: () => overlayDomain,
106
136
  overlaySlice: () => overlaySlice,
107
137
  popupActions: () => popupActions,
138
+ popupDomain: () => popupDomain,
108
139
  popupSlice: () => popupSlice,
109
140
  presets: () => presets,
110
- registerSlice: () => import_state17.registerSlice,
111
- routing: () => routing,
141
+ registerExtension: () => registerExtension,
142
+ registerSlice: () => import_state21.registerSlice,
112
143
  screenActions: () => screenActions,
144
+ screenDomain: () => screenDomain,
113
145
  screenSlice: () => screenSlice,
114
- screensetRegistry: () => import_screensets5.screensetRegistry,
115
146
  screensets: () => screensets,
147
+ screensetsRegistryFactory: () => import_screensets11.screensetsRegistryFactory,
148
+ selectExtensionError: () => selectExtensionError,
149
+ selectExtensionState: () => selectExtensionState,
150
+ selectRegisteredExtensions: () => selectRegisteredExtensions,
116
151
  setActiveScreen: () => setActiveScreen,
117
152
  setDeprecationWarnings: () => setDeprecationWarnings,
118
153
  setFooterConfig: () => setFooterConfig,
@@ -138,6 +173,7 @@ __export(src_exports, {
138
173
  setUser: () => setUser,
139
174
  showOverlay: () => showOverlay,
140
175
  sidebarActions: () => sidebarActions,
176
+ sidebarDomain: () => sidebarDomain,
141
177
  sidebarSlice: () => sidebarSlice,
142
178
  tenantActions: () => tenantActions,
143
179
  tenantReducer: () => tenantSlice_default,
@@ -145,7 +181,9 @@ __export(src_exports, {
145
181
  themes: () => themes,
146
182
  toggleMenu: () => toggleMenu,
147
183
  toggleMockMode: () => toggleMockMode,
148
- toggleSidebar: () => toggleSidebar
184
+ toggleSidebar: () => toggleSidebar,
185
+ unmountExtension: () => unmountExtension,
186
+ unregisterExtension: () => unregisterExtension
149
187
  });
150
188
  module.exports = __toCommonJS(src_exports);
151
189
 
@@ -215,11 +253,10 @@ var HAI3AppBuilderImpl = class {
215
253
  const app = {
216
254
  config: this.config,
217
255
  store,
218
- screensetRegistry: aggregated.registries.screensetRegistry,
219
256
  themeRegistry: aggregated.registries.themeRegistry,
220
- routeRegistry: aggregated.registries.routeRegistry,
221
257
  apiRegistry: import_api.apiRegistry,
222
258
  i18nRegistry: aggregated.registries.i18nRegistry,
259
+ screensetsRegistry: aggregated.registries.screensetsRegistry,
223
260
  actions: aggregated.actions,
224
261
  destroy: () => this.destroyApp(orderedPlugins, app)
225
262
  };
@@ -278,7 +315,7 @@ Add the missing plugin: .use(${depName}())`
278
315
  const registries = {};
279
316
  const slices = [];
280
317
  const effects2 = [];
281
- const actions = {};
318
+ const actions2 = {};
282
319
  plugins.forEach((plugin) => {
283
320
  if (!plugin.provides) return;
284
321
  if (plugin.provides.registries) {
@@ -291,10 +328,10 @@ Add the missing plugin: .use(${depName}())`
291
328
  effects2.push(...plugin.provides.effects);
292
329
  }
293
330
  if (plugin.provides.actions) {
294
- Object.assign(actions, plugin.provides.actions);
331
+ Object.assign(actions2, plugin.provides.actions);
295
332
  }
296
333
  });
297
- return { registries, slices, effects: effects2, actions };
334
+ return { registries, slices, effects: effects2, actions: actions2 };
298
335
  }
299
336
  /**
300
337
  * Create store with all aggregated slices.
@@ -310,8 +347,8 @@ Add the missing plugin: .use(${depName}())`
310
347
  */
311
348
  createStoreWithSlices(slices) {
312
349
  const store = (0, import_state.getStore)();
313
- slices.forEach((slice10) => {
314
- (0, import_state.registerSlice)(slice10);
350
+ slices.forEach((slice11) => {
351
+ (0, import_state.registerSlice)(slice11);
315
352
  });
316
353
  return store;
317
354
  }
@@ -330,9 +367,6 @@ function createHAI3(config) {
330
367
  return new HAI3AppBuilderImpl(config);
331
368
  }
332
369
 
333
- // src/plugins/screensets.ts
334
- var import_screensets = require("@hai3/screensets");
335
-
336
370
  // src/slices/index.ts
337
371
  var import_toolkit = require("@reduxjs/toolkit");
338
372
 
@@ -629,35 +663,26 @@ var layoutDomainReducers = {
629
663
  var layoutReducer = (0, import_toolkit.combineReducers)(layoutDomainReducers);
630
664
 
631
665
  // src/plugins/screensets.ts
632
- var screenSlice2 = screenSlice;
633
- var screenActions2 = screenActions;
634
- function screensets(config) {
635
- const screensetRegistry3 = import_screensets.screensetRegistry;
666
+ function screensets(_config) {
636
667
  return {
637
668
  name: "screensets",
638
669
  dependencies: [],
639
670
  provides: {
640
- registries: {
641
- screensetRegistry: screensetRegistry3
642
- },
643
- slices: [screenSlice2],
671
+ registries: {},
672
+ slices: [screenSlice],
644
673
  actions: {
645
- setActiveScreen: screenActions2.navigateTo,
646
- setScreenLoading: screenActions2.setScreenLoading
674
+ setActiveScreen: screenActions.navigateTo,
675
+ setScreenLoading: screenActions.setScreenLoading
647
676
  }
648
677
  },
649
678
  onInit() {
650
- if (config?.autoDiscover) {
651
- console.log(
652
- "[HAI3] Auto-discover is enabled. Screensets should be registered via screensetRegistry.register() in your app."
653
- );
654
- }
655
679
  }
656
680
  };
657
681
  }
658
682
 
659
683
  // src/plugins/themes.ts
660
684
  var import_state11 = require("@hai3/state");
685
+ var import_screensets = require("@hai3/screensets");
661
686
 
662
687
  // src/registries/themeRegistry.ts
663
688
  function createThemeRegistry(config) {
@@ -795,9 +820,14 @@ function themes(config) {
795
820
  changeTheme
796
821
  }
797
822
  },
798
- onInit(_app) {
823
+ onInit(app) {
799
824
  import_state11.eventBus.on("theme/changed", (payload) => {
800
825
  themeRegistry.apply(payload.themeId);
826
+ try {
827
+ app.screensetsRegistry?.updateSharedProperty(import_screensets.HAI3_SHARED_PROPERTY_THEME, payload.themeId);
828
+ } catch (error) {
829
+ console.error("[HAI3] Failed to propagate theme to MFE domains", error);
830
+ }
801
831
  });
802
832
  const themes2 = themeRegistry.getAll();
803
833
  if (themes2.length > 0) {
@@ -809,18 +839,6 @@ function themes(config) {
809
839
 
810
840
  // src/plugins/layout.ts
811
841
  var import_state12 = require("@hai3/state");
812
- var headerSlice2 = headerSlice;
813
- var footerSlice2 = footerSlice;
814
- var menuSlice2 = menuSlice;
815
- var sidebarSlice2 = sidebarSlice;
816
- var popupSlice2 = popupSlice;
817
- var overlaySlice2 = overlaySlice;
818
- var headerActions2 = headerActions;
819
- var footerActions2 = footerActions;
820
- var menuActions2 = menuActions;
821
- var sidebarActions2 = sidebarActions;
822
- var popupActions2 = popupActions;
823
- var overlayActions2 = overlayActions;
824
842
  function showPopup(payload) {
825
843
  import_state12.eventBus.emit("layout/popup/requested", payload);
826
844
  }
@@ -839,18 +857,20 @@ function toggleMenuCollapsed(payload) {
839
857
  function toggleSidebarCollapsed(payload) {
840
858
  import_state12.eventBus.emit("layout/sidebar/collapsed", payload);
841
859
  }
860
+ function setHeaderVisible(_visible) {
861
+ }
842
862
  function layout() {
843
863
  return {
844
864
  name: "layout",
845
865
  dependencies: ["screensets"],
846
866
  provides: {
847
867
  slices: [
848
- headerSlice2,
849
- footerSlice2,
850
- menuSlice2,
851
- sidebarSlice2,
852
- popupSlice2,
853
- overlaySlice2
868
+ headerSlice,
869
+ footerSlice,
870
+ menuSlice,
871
+ sidebarSlice,
872
+ popupSlice,
873
+ overlaySlice
854
874
  ],
855
875
  actions: {
856
876
  showPopup,
@@ -860,463 +880,71 @@ function layout() {
860
880
  toggleMenuCollapsed,
861
881
  toggleSidebarCollapsed,
862
882
  // Direct slice actions for backward compatibility
863
- setHeaderVisible: headerActions2.setVisible,
864
- setFooterVisible: footerActions2.setVisible,
865
- setMenuCollapsed: menuActions2.setCollapsed,
866
- setSidebarCollapsed: sidebarActions2.setCollapsed
883
+ setHeaderVisible,
884
+ setFooterVisible: footerActions.setFooterVisible,
885
+ setMenuCollapsed: menuActions.setMenuCollapsed,
886
+ setSidebarCollapsed: sidebarActions.setSidebarCollapsed
867
887
  }
868
888
  },
869
889
  onInit(app) {
870
890
  const dispatch = app.store.dispatch;
871
891
  import_state12.eventBus.on("layout/popup/requested", (payload) => {
872
- dispatch(popupActions2.open({
892
+ dispatch(popupActions.openPopup({
873
893
  id: payload.id,
874
- title: payload.title,
875
- content: payload.content,
876
- size: payload.size
894
+ title: payload.title ?? "",
895
+ component: ""
896
+ // Payload doesn't include component - this needs review
877
897
  }));
878
898
  });
879
899
  import_state12.eventBus.on("layout/popup/hidden", () => {
880
- dispatch(popupActions2.close());
900
+ dispatch(popupActions.closeAllPopups());
881
901
  });
882
- import_state12.eventBus.on("layout/overlay/requested", (payload) => {
883
- dispatch(overlayActions2.show({ id: payload.id }));
902
+ import_state12.eventBus.on("layout/overlay/requested", (_payload) => {
903
+ dispatch(overlayActions.showOverlay());
884
904
  });
885
905
  import_state12.eventBus.on("layout/overlay/hidden", () => {
886
- dispatch(overlayActions2.hide());
906
+ dispatch(overlayActions.hideOverlay());
887
907
  });
888
908
  import_state12.eventBus.on("layout/menu/collapsed", (payload) => {
889
- dispatch(menuActions2.setCollapsed(payload.collapsed));
909
+ dispatch(menuActions.setMenuCollapsed(payload.collapsed));
890
910
  });
891
911
  import_state12.eventBus.on("layout/sidebar/collapsed", (payload) => {
892
- dispatch(sidebarActions2.setCollapsed(payload.collapsed));
912
+ dispatch(sidebarActions.setSidebarCollapsed(payload.collapsed));
893
913
  });
894
914
  }
895
915
  };
896
916
  }
897
917
 
898
- // src/plugins/navigation.ts
918
+ // src/plugins/i18n.ts
899
919
  var import_state13 = require("@hai3/state");
900
920
  var import_i18n = require("@hai3/i18n");
901
-
902
- // src/utils/basePath.ts
903
- function normalizeBase(base) {
904
- if (!base) {
905
- return "/";
906
- }
907
- let normalized = base.startsWith("/") ? base : `/${base}`;
908
- if (normalized !== "/" && normalized.endsWith("/")) {
909
- normalized = normalized.slice(0, -1);
910
- }
911
- return normalized;
912
- }
913
- function stripBase(pathname, base) {
914
- if (base === "/") {
915
- return pathname;
916
- }
917
- if (!pathname.startsWith(base)) {
918
- return null;
919
- }
920
- const nextChar = pathname.charAt(base.length);
921
- if (nextChar && nextChar !== "/") {
922
- return null;
923
- }
924
- return pathname.slice(base.length) || "/";
925
- }
926
- function prependBase(path, base) {
927
- if (base === "/") {
928
- return path;
929
- }
930
- const cleanPath = path.startsWith("/") ? path : `/${path}`;
931
- return `${base}${cleanPath}`;
932
- }
933
- function resolveBase(pluginConfig, appConfig) {
934
- const rawBase = pluginConfig?.base ?? appConfig?.base ?? "/";
935
- return normalizeBase(rawBase);
936
- }
937
-
938
- // src/utils/routeMatcher.ts
939
- var import_path_to_regexp = require("path-to-regexp");
940
- function compileRoute(pattern, screensetId, screenId) {
941
- return {
942
- pattern,
943
- screensetId,
944
- screenId,
945
- matcher: (0, import_path_to_regexp.match)(pattern, { decode: decodeURIComponent }),
946
- toPath: (0, import_path_to_regexp.compile)(pattern, { encode: encodeURIComponent })
947
- };
948
- }
949
- function matchPath(path, routes) {
950
- for (const route of routes) {
951
- const result = route.matcher(path);
952
- if (result) {
953
- return {
954
- screensetId: route.screensetId,
955
- screenId: route.screenId,
956
- params: result.params
957
- };
958
- }
959
- }
960
- return void 0;
961
- }
962
- function generatePath(route, params) {
963
- return route.toPath(params);
964
- }
965
- function extractRequiredParams(pattern) {
966
- const params = [];
967
- const matches = pattern.match(/:([^/]+)/g);
968
- if (matches) {
969
- for (const match2 of matches) {
970
- params.push(match2.slice(1));
971
- }
972
- }
973
- return params;
974
- }
975
-
976
- // src/plugins/navigation.ts
977
- var screenActions3 = screenActions;
978
- var menuActions3 = menuActions;
979
- function navigateToScreen(payload) {
980
- import_state13.eventBus.emit("navigation/screen/navigated", payload);
981
- }
982
- function navigateToScreenset(payload) {
983
- import_state13.eventBus.emit("navigation/screenset/navigated", payload);
984
- }
985
- function navigation(config) {
986
- return {
987
- name: "navigation",
988
- dependencies: ["screensets"],
989
- provides: {
990
- actions: {
991
- navigateToScreen,
992
- navigateToScreenset
993
- }
994
- },
995
- onInit(app) {
996
- const dispatch = app.store.dispatch;
997
- const base = resolveBase(config, app.config);
998
- const routerMode = app.config.routerMode ?? "browser";
999
- let currentScreensetId = null;
1000
- const getCurrentPath = () => {
1001
- if (typeof window === "undefined") return "/";
1002
- switch (routerMode) {
1003
- case "hash":
1004
- return window.location.hash.slice(1) || "/";
1005
- case "memory":
1006
- return "/";
1007
- case "browser":
1008
- default:
1009
- return window.location.pathname;
1010
- }
1011
- };
1012
- const updateURL = (path) => {
1013
- if (typeof window === "undefined" || routerMode === "memory") {
1014
- return;
1015
- }
1016
- const url = prependBase(path, base);
1017
- switch (routerMode) {
1018
- case "hash":
1019
- if (window.location.hash !== `#${url}`) {
1020
- window.location.hash = url;
1021
- }
1022
- break;
1023
- case "browser":
1024
- default:
1025
- if (window.location.pathname !== url) {
1026
- window.history.pushState(null, "", url);
1027
- }
1028
- break;
1029
- }
1030
- };
1031
- const loadScreensetTranslations = async (screensetId, language) => {
1032
- await import_i18n.i18nRegistry.loadScreensetTranslations(
1033
- screensetId,
1034
- language
1035
- );
1036
- };
1037
- const updateScreensetMenu = (screenset) => {
1038
- const menuItems = screenset.menu.map((item) => ({
1039
- id: item.menuItem.screenId ?? item.menuItem.id,
1040
- label: item.menuItem.label,
1041
- icon: item.menuItem.icon
1042
- }));
1043
- dispatch(menuActions3.setMenuItems(menuItems));
1044
- };
1045
- const activateScreenset = (screensetId) => {
1046
- if (screensetId === currentScreensetId) {
1047
- return;
1048
- }
1049
- const screenset = app.screensetRegistry.get(screensetId);
1050
- if (!screenset) {
1051
- return;
1052
- }
1053
- currentScreensetId = screensetId;
1054
- loadScreensetTranslations(screensetId).catch((err) => {
1055
- console.warn(`[HAI3] Failed to load translations for screenset ${screensetId}:`, err);
1056
- });
1057
- updateScreensetMenu(screenset);
1058
- };
1059
- const extractInternalPath = () => {
1060
- const currentPath = getCurrentPath();
1061
- return stripBase(currentPath, base) || "/";
1062
- };
1063
- const activateFromRouteMatch = (match2) => {
1064
- activateScreenset(match2.screensetId);
1065
- dispatch(screenActions3.navigateTo(match2.screenId));
1066
- };
1067
- const matchCurrentPath = () => {
1068
- const path = extractInternalPath();
1069
- return app.routeRegistry?.matchRoute(path);
1070
- };
1071
- import_state13.eventBus.on("navigation/screen/navigated", (payload) => {
1072
- if (!app.routeRegistry?.hasScreen(payload.screensetId, payload.screenId)) {
1073
- console.warn(
1074
- `Screen "${payload.screenId}" in screenset "${payload.screensetId}" not found.`
1075
- );
1076
- return;
1077
- }
1078
- const pattern = app.routeRegistry?.getRoutePattern(payload.screenId);
1079
- if (pattern) {
1080
- const requiredParams = extractRequiredParams(pattern);
1081
- const providedParams = payload.params || {};
1082
- const missingParams = requiredParams.filter((param) => !(param in providedParams));
1083
- if (missingParams.length > 0) {
1084
- console.warn(
1085
- `Screen "${payload.screenId}" requires route params [${requiredParams.join(", ")}] but missing: [${missingParams.join(", ")}]`
1086
- );
1087
- return;
1088
- }
1089
- }
1090
- activateScreenset(payload.screensetId);
1091
- dispatch(screenActions3.navigateTo(payload.screenId));
1092
- const path = app.routeRegistry?.generatePath(payload.screenId, payload.params) ?? `/${payload.screenId}`;
1093
- updateURL(path);
1094
- });
1095
- import_state13.eventBus.on("navigation/screenset/navigated", (payload) => {
1096
- const screenset = app.screensetRegistry.get(payload.screensetId);
1097
- if (!screenset) {
1098
- console.warn(`Screenset "${payload.screensetId}" not found.`);
1099
- return;
1100
- }
1101
- navigateToScreen({
1102
- screensetId: payload.screensetId,
1103
- screenId: screenset.defaultScreen
1104
- });
1105
- });
1106
- let lastLoadedLanguage = null;
1107
- import_i18n.i18nRegistry.subscribe(() => {
1108
- const currentLanguage = import_i18n.i18nRegistry.getLanguage();
1109
- if (!currentLanguage || currentLanguage === lastLoadedLanguage) {
1110
- return;
1111
- }
1112
- if (!currentScreensetId) {
1113
- return;
1114
- }
1115
- const screenset = app.screensetRegistry.get(currentScreensetId);
1116
- if (!screenset) {
1117
- return;
1118
- }
1119
- lastLoadedLanguage = currentLanguage;
1120
- loadScreensetTranslations(currentScreensetId, currentLanguage).then(() => updateScreensetMenu(screenset)).catch((err) => {
1121
- console.warn(
1122
- `[HAI3] Failed to reload translations for screenset ${currentScreensetId}:`,
1123
- err
1124
- );
1125
- });
1126
- });
1127
- if (typeof window !== "undefined" && routerMode !== "memory") {
1128
- const handleURLChange = () => {
1129
- const match3 = matchCurrentPath();
1130
- if (match3) {
1131
- activateFromRouteMatch(match3);
1132
- }
1133
- };
1134
- if (routerMode === "hash") {
1135
- window.addEventListener("hashchange", handleURLChange);
1136
- } else {
1137
- window.addEventListener("popstate", handleURLChange);
1138
- }
1139
- const match2 = matchCurrentPath();
1140
- const autoNavigate = app.config.autoNavigate !== false;
1141
- if (match2) {
1142
- activateFromRouteMatch(match2);
1143
- } else if (autoNavigate) {
1144
- const screensets2 = app.screensetRegistry.getAll();
1145
- if (screensets2.length > 0) {
1146
- navigateToScreenset({ screensetId: screensets2[0].id });
1147
- }
1148
- }
1149
- } else if (routerMode === "memory") {
1150
- const autoNavigate = app.config.autoNavigate !== false;
1151
- if (autoNavigate) {
1152
- const screensets2 = app.screensetRegistry.getAll();
1153
- if (screensets2.length > 0) {
1154
- navigateToScreenset({ screensetId: screensets2[0].id });
1155
- }
1156
- }
1157
- }
1158
- }
1159
- };
1160
- }
1161
-
1162
- // src/registries/routeRegistry.ts
1163
- function createRouteRegistry(screensetRegistry3) {
1164
- let routes = null;
1165
- function buildRoutes() {
1166
- if (routes !== null) {
1167
- return routes;
1168
- }
1169
- routes = [];
1170
- const screensets2 = screensetRegistry3.getAll();
1171
- screensets2.forEach((screenset) => {
1172
- screenset.menu.forEach((menuScreenItem) => {
1173
- const screenId = menuScreenItem.menuItem.screenId ?? menuScreenItem.menuItem.id;
1174
- if (screenId && menuScreenItem.screen) {
1175
- const pattern = menuScreenItem.menuItem.path ?? `/${screenId}`;
1176
- const compiledRoute = compileRoute(pattern, screenset.id, screenId);
1177
- routes.push({
1178
- screensetId: screenset.id,
1179
- screenId,
1180
- loader: menuScreenItem.screen,
1181
- pattern,
1182
- compiledRoute
1183
- });
1184
- }
1185
- });
1186
- });
1187
- routes.sort((a, b) => {
1188
- const aHasParams = a.pattern.includes(":");
1189
- const bHasParams = b.pattern.includes(":");
1190
- if (!aHasParams && bHasParams) return -1;
1191
- if (aHasParams && !bHasParams) return 1;
1192
- return 0;
1193
- });
1194
- return routes;
1195
- }
1196
- return {
1197
- /**
1198
- * Check if a screen exists by screenId only (globally unique).
1199
- */
1200
- hasScreenById(screenId) {
1201
- const allRoutes = buildRoutes();
1202
- return allRoutes.some((route) => route.screenId === screenId);
1203
- },
1204
- /**
1205
- * Check if a screen exists by both screensetId and screenId (explicit lookup when screenset context is known).
1206
- */
1207
- hasScreen(screensetId, screenId) {
1208
- const allRoutes = buildRoutes();
1209
- return allRoutes.some(
1210
- (route) => route.screensetId === screensetId && route.screenId === screenId
1211
- );
1212
- },
1213
- /**
1214
- * Get screenset ID for a given screen ID (reverse lookup).
1215
- * Screen IDs are globally unique across all screensets.
1216
- */
1217
- getScreensetForScreen(screenId) {
1218
- const allRoutes = buildRoutes();
1219
- const route = allRoutes.find((r) => r.screenId === screenId);
1220
- return route?.screensetId;
1221
- },
1222
- /**
1223
- * Get screen loader by screenId only.
1224
- */
1225
- getScreenById(screenId) {
1226
- const allRoutes = buildRoutes();
1227
- const route = allRoutes.find((r) => r.screenId === screenId);
1228
- return route?.loader;
1229
- },
1230
- /**
1231
- * Get screen loader by both screensetId and screenId (explicit lookup when screenset context is known).
1232
- */
1233
- getScreen(screensetId, screenId) {
1234
- const allRoutes = buildRoutes();
1235
- const route = allRoutes.find(
1236
- (r) => r.screensetId === screensetId && r.screenId === screenId
1237
- );
1238
- return route?.loader;
1239
- },
1240
- /**
1241
- * Get all routes.
1242
- */
1243
- getAll() {
1244
- const allRoutes = buildRoutes();
1245
- return allRoutes.map(({ screensetId, screenId }) => ({
1246
- screensetId,
1247
- screenId
1248
- }));
1249
- },
1250
- /**
1251
- * Match a URL path against registered routes, extracting params.
1252
- * Returns the first matching route with extracted params, or undefined if no match.
1253
- */
1254
- matchRoute(path) {
1255
- const allRoutes = buildRoutes();
1256
- const compiledRoutes = allRoutes.map((r) => r.compiledRoute);
1257
- return matchPath(path, compiledRoutes);
1258
- },
1259
- /**
1260
- * Generate a URL path for a screen with given params.
1261
- */
1262
- generatePath(screenId, params = {}) {
1263
- const allRoutes = buildRoutes();
1264
- const route = allRoutes.find((r) => r.screenId === screenId);
1265
- if (!route) {
1266
- console.warn(`Route not found for screen: ${screenId}`);
1267
- return `/${screenId}`;
1268
- }
1269
- return generatePath(route.compiledRoute, params);
1270
- },
1271
- /**
1272
- * Get the route pattern for a screen.
1273
- */
1274
- getRoutePattern(screenId) {
1275
- const allRoutes = buildRoutes();
1276
- const route = allRoutes.find((r) => r.screenId === screenId);
1277
- return route?.pattern;
1278
- }
1279
- };
1280
- }
1281
-
1282
- // src/plugins/routing.ts
1283
- function routing() {
1284
- return {
1285
- name: "routing",
1286
- dependencies: ["screensets"],
1287
- onRegister(_app) {
1288
- },
1289
- onInit(app) {
1290
- const routeRegistry = createRouteRegistry(app.screensetRegistry);
1291
- app.routeRegistry = routeRegistry;
1292
- }
1293
- };
1294
- }
1295
-
1296
- // src/plugins/i18n.ts
1297
- var import_state14 = require("@hai3/state");
1298
- var import_i18n2 = require("@hai3/i18n");
921
+ var import_screensets2 = require("@hai3/screensets");
1299
922
  function setLanguage(payload) {
1300
- import_state14.eventBus.emit("i18n/language/changed", payload);
923
+ import_state13.eventBus.emit("i18n/language/changed", payload);
1301
924
  }
1302
925
  function i18n() {
1303
- const i18nRegistry3 = import_i18n2.i18nRegistry;
926
+ const i18nRegistry2 = import_i18n.i18nRegistry;
1304
927
  return {
1305
928
  name: "i18n",
1306
929
  dependencies: [],
1307
930
  provides: {
1308
931
  registries: {
1309
- i18nRegistry: i18nRegistry3
932
+ i18nRegistry: i18nRegistry2
1310
933
  },
1311
934
  actions: {
1312
935
  setLanguage
1313
936
  }
1314
937
  },
1315
- onInit(_app) {
1316
- import_state14.eventBus.on("i18n/language/changed", async (payload) => {
1317
- await i18nRegistry3.setLanguage(payload.language);
938
+ onInit(app) {
939
+ import_state13.eventBus.on("i18n/language/changed", async (payload) => {
940
+ await i18nRegistry2.setLanguage(payload.language);
941
+ try {
942
+ app.screensetsRegistry?.updateSharedProperty(import_screensets2.HAI3_SHARED_PROPERTY_LANGUAGE, payload.language);
943
+ } catch (error) {
944
+ console.error("[HAI3] Failed to propagate language to MFE domains", error);
945
+ }
1318
946
  });
1319
- i18nRegistry3.setLanguage(import_i18n2.Language.English).catch((err) => {
947
+ i18nRegistry2.setLanguage(import_i18n.Language.English).catch((err) => {
1320
948
  console.warn("[HAI3] Failed to load initial translations:", err);
1321
949
  });
1322
950
  }
@@ -1328,16 +956,13 @@ function effects() {
1328
956
  return {
1329
957
  name: "effects",
1330
958
  dependencies: [],
1331
- onInit(app) {
1332
- if (app.config.devMode) {
1333
- console.log("[HAI3] Effects plugin initialized");
1334
- }
959
+ onInit() {
1335
960
  }
1336
961
  };
1337
962
  }
1338
963
 
1339
964
  // src/effects/mockEffects.ts
1340
- var import_state15 = require("@hai3/state");
965
+ var import_state14 = require("@hai3/state");
1341
966
  var import_api2 = require("@hai3/api");
1342
967
  function hasPluginManagement(protocol) {
1343
968
  return "plugins" in protocol && typeof protocol.plugins === "object";
@@ -1366,8 +991,8 @@ function syncMockPlugins(enabled) {
1366
991
  }
1367
992
  }
1368
993
  function initMockEffects() {
1369
- const store = (0, import_state15.getStore)();
1370
- const unsubscribe = import_state15.eventBus.on(MockEvents.Toggle, (payload) => {
994
+ const store = (0, import_state14.getStore)();
995
+ const unsubscribe = import_state14.eventBus.on(MockEvents.Toggle, (payload) => {
1371
996
  store.dispatch(setMockEnabled(payload.enabled));
1372
997
  syncMockPlugins(payload.enabled);
1373
998
  });
@@ -1380,7 +1005,7 @@ function initMockEffects() {
1380
1005
  };
1381
1006
  }
1382
1007
  function toggleMockMode(enabled) {
1383
- import_state15.eventBus.emit(MockEvents.Toggle, { enabled });
1008
+ import_state14.eventBus.emit(MockEvents.Toggle, { enabled });
1384
1009
  }
1385
1010
 
1386
1011
  // src/plugins/mock.ts
@@ -1406,9 +1031,6 @@ function mock(config) {
1406
1031
  const enabledByDefault = config?.enabledByDefault ?? isDev;
1407
1032
  if (enabledByDefault) {
1408
1033
  toggleMockMode(true);
1409
- if (isDev) {
1410
- console.log("[HAI3] Mock mode enabled by default (dev environment detected)");
1411
- }
1412
1034
  }
1413
1035
  },
1414
1036
  onDestroy() {
@@ -1420,6 +1042,286 @@ function mock(config) {
1420
1042
  };
1421
1043
  }
1422
1044
 
1045
+ // src/plugins/microfrontends/index.ts
1046
+ var import_screensets5 = require("@hai3/screensets");
1047
+ var import_gts = require("@hai3/screensets/plugins/gts");
1048
+ var import_state18 = require("@hai3/state");
1049
+
1050
+ // src/plugins/microfrontends/slice.ts
1051
+ var import_state15 = require("@hai3/state");
1052
+ var SLICE_KEY10 = "mfe";
1053
+ var initialState10 = {
1054
+ registrationStates: {},
1055
+ errors: {},
1056
+ mountedExtensions: {}
1057
+ };
1058
+ var { slice: slice10, ...actions } = (0, import_state15.createSlice)({
1059
+ name: SLICE_KEY10,
1060
+ initialState: initialState10,
1061
+ reducers: {
1062
+ // Registration state reducers
1063
+ setExtensionRegistering: (state, action) => {
1064
+ state.registrationStates[action.payload.extensionId] = "registering";
1065
+ },
1066
+ setExtensionRegistered: (state, action) => {
1067
+ state.registrationStates[action.payload.extensionId] = "registered";
1068
+ },
1069
+ setExtensionUnregistered: (state, action) => {
1070
+ state.registrationStates[action.payload.extensionId] = "unregistered";
1071
+ },
1072
+ setExtensionError: (state, action) => {
1073
+ state.registrationStates[action.payload.extensionId] = "error";
1074
+ state.errors[action.payload.extensionId] = action.payload.error;
1075
+ },
1076
+ // Mount state reducers
1077
+ setExtensionMounted: (state, action) => {
1078
+ state.mountedExtensions[action.payload.domainId] = action.payload.extensionId;
1079
+ },
1080
+ setExtensionUnmounted: (state, action) => {
1081
+ state.mountedExtensions[action.payload.domainId] = void 0;
1082
+ }
1083
+ }
1084
+ });
1085
+ var mfeSlice = slice10;
1086
+ var {
1087
+ setExtensionRegistering,
1088
+ setExtensionRegistered,
1089
+ setExtensionUnregistered,
1090
+ setExtensionError,
1091
+ setExtensionMounted,
1092
+ setExtensionUnmounted
1093
+ } = actions;
1094
+ function selectExtensionState(state, extensionId) {
1095
+ return state.mfe.registrationStates[extensionId] ?? "unregistered";
1096
+ }
1097
+ function selectRegisteredExtensions(state) {
1098
+ return Object.entries(state.mfe.registrationStates).filter(([_, regState]) => regState === "registered").map(([extensionId]) => extensionId);
1099
+ }
1100
+ function selectExtensionError(state, extensionId) {
1101
+ return state.mfe.errors[extensionId];
1102
+ }
1103
+ var slice_default = slice10.reducer;
1104
+
1105
+ // src/plugins/microfrontends/effects.ts
1106
+ var import_state16 = require("@hai3/state");
1107
+
1108
+ // src/plugins/microfrontends/constants.ts
1109
+ var HAI3_POPUP_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.popup.v1";
1110
+ var HAI3_SIDEBAR_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1";
1111
+ var HAI3_SCREEN_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.screen.v1";
1112
+ var HAI3_OVERLAY_DOMAIN = "gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.overlay.v1";
1113
+ var MfeEvents = {
1114
+ RegisterExtensionRequested: "mfe/registerExtensionRequested",
1115
+ UnregisterExtensionRequested: "mfe/unregisterExtensionRequested"
1116
+ };
1117
+
1118
+ // src/plugins/microfrontends/effects.ts
1119
+ function initMfeEffects(screensetsRegistry2) {
1120
+ const store = (0, import_state16.getStore)();
1121
+ const unsubscribers = [];
1122
+ const unsubRegisterExtension = import_state16.eventBus.on(MfeEvents.RegisterExtensionRequested, async (payload) => {
1123
+ const { extension } = payload;
1124
+ try {
1125
+ store.dispatch(setExtensionRegistering({ extensionId: extension.id }));
1126
+ await screensetsRegistry2.registerExtension(extension);
1127
+ store.dispatch(setExtensionRegistered({ extensionId: extension.id }));
1128
+ } catch (error) {
1129
+ const errorMessage = error instanceof Error ? error.message : "Unknown registration error";
1130
+ store.dispatch(setExtensionError({ extensionId: extension.id, error: errorMessage }));
1131
+ }
1132
+ });
1133
+ unsubscribers.push(unsubRegisterExtension);
1134
+ const unsubUnregisterExtension = import_state16.eventBus.on(MfeEvents.UnregisterExtensionRequested, async (payload) => {
1135
+ const { extensionId } = payload;
1136
+ try {
1137
+ await screensetsRegistry2.unregisterExtension(extensionId);
1138
+ store.dispatch(setExtensionUnregistered({ extensionId }));
1139
+ } catch (error) {
1140
+ const errorMessage = error instanceof Error ? error.message : "Unknown unregistration error";
1141
+ store.dispatch(setExtensionError({ extensionId, error: errorMessage }));
1142
+ }
1143
+ });
1144
+ unsubscribers.push(unsubUnregisterExtension);
1145
+ return () => {
1146
+ unsubscribers.forEach((unsub) => unsub.unsubscribe());
1147
+ };
1148
+ }
1149
+
1150
+ // src/plugins/microfrontends/actions.ts
1151
+ var import_state17 = require("@hai3/state");
1152
+ var import_screensets3 = require("@hai3/screensets");
1153
+ var screensetsRegistry = null;
1154
+ function setMfeRegistry(registry) {
1155
+ screensetsRegistry = registry;
1156
+ }
1157
+ function resolveDomainId(extensionId) {
1158
+ if (!screensetsRegistry) {
1159
+ throw new Error("MFE registry not initialized. Call setMfeRegistry() before using lifecycle actions.");
1160
+ }
1161
+ const extension = screensetsRegistry.getExtension(extensionId);
1162
+ if (!extension) {
1163
+ throw new Error(`Extension '${extensionId}' is not registered. Register it before calling lifecycle actions.`);
1164
+ }
1165
+ return extension.domain;
1166
+ }
1167
+ function loadExtension(extensionId) {
1168
+ const domainId = resolveDomainId(extensionId);
1169
+ screensetsRegistry.executeActionsChain({
1170
+ action: {
1171
+ type: import_screensets3.HAI3_ACTION_LOAD_EXT,
1172
+ target: domainId,
1173
+ payload: { extensionId }
1174
+ }
1175
+ }).catch((error) => {
1176
+ console.error(`[MFE] Load failed for ${extensionId}:`, error);
1177
+ });
1178
+ }
1179
+ function mountExtension(extensionId) {
1180
+ const domainId = resolveDomainId(extensionId);
1181
+ screensetsRegistry.executeActionsChain({
1182
+ action: {
1183
+ type: import_screensets3.HAI3_ACTION_MOUNT_EXT,
1184
+ target: domainId,
1185
+ payload: { extensionId }
1186
+ }
1187
+ }).catch((error) => {
1188
+ console.error(`[MFE] Mount failed for ${extensionId}:`, error);
1189
+ });
1190
+ }
1191
+ function unmountExtension(extensionId) {
1192
+ const domainId = resolveDomainId(extensionId);
1193
+ screensetsRegistry.executeActionsChain({
1194
+ action: {
1195
+ type: import_screensets3.HAI3_ACTION_UNMOUNT_EXT,
1196
+ target: domainId,
1197
+ payload: { extensionId }
1198
+ }
1199
+ }).catch((error) => {
1200
+ console.error(`[MFE] Unmount failed for ${extensionId}:`, error);
1201
+ });
1202
+ }
1203
+ function registerExtension(extension) {
1204
+ import_state17.eventBus.emit(MfeEvents.RegisterExtensionRequested, { extension });
1205
+ }
1206
+ function unregisterExtension(extensionId) {
1207
+ import_state17.eventBus.emit(MfeEvents.UnregisterExtensionRequested, { extensionId });
1208
+ }
1209
+
1210
+ // src/plugins/microfrontends/base-domains.ts
1211
+ var import_screensets4 = require("@hai3/screensets");
1212
+ var INIT_ONLY_LIFECYCLE_STAGES = [
1213
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1"
1214
+ ];
1215
+ var DEFAULT_LIFECYCLE_STAGES = [
1216
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1",
1217
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.activated.v1",
1218
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.deactivated.v1",
1219
+ "gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.destroyed.v1"
1220
+ ];
1221
+ var screenDomain = {
1222
+ id: HAI3_SCREEN_DOMAIN,
1223
+ actions: [import_screensets4.HAI3_ACTION_LOAD_EXT, import_screensets4.HAI3_ACTION_MOUNT_EXT],
1224
+ extensionsActions: [],
1225
+ sharedProperties: [import_screensets4.HAI3_SHARED_PROPERTY_THEME, import_screensets4.HAI3_SHARED_PROPERTY_LANGUAGE],
1226
+ defaultActionTimeout: 3e4,
1227
+ lifecycleStages: [...INIT_ONLY_LIFECYCLE_STAGES],
1228
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1229
+ extensionsTypeId: import_screensets4.HAI3_SCREEN_EXTENSION_TYPE,
1230
+ lifecycle: void 0
1231
+ };
1232
+ var sidebarDomain = {
1233
+ id: HAI3_SIDEBAR_DOMAIN,
1234
+ actions: [import_screensets4.HAI3_ACTION_LOAD_EXT, import_screensets4.HAI3_ACTION_MOUNT_EXT, import_screensets4.HAI3_ACTION_UNMOUNT_EXT],
1235
+ extensionsActions: [],
1236
+ sharedProperties: [import_screensets4.HAI3_SHARED_PROPERTY_THEME, import_screensets4.HAI3_SHARED_PROPERTY_LANGUAGE],
1237
+ defaultActionTimeout: 3e4,
1238
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1239
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1240
+ lifecycle: void 0
1241
+ };
1242
+ var popupDomain = {
1243
+ id: HAI3_POPUP_DOMAIN,
1244
+ actions: [import_screensets4.HAI3_ACTION_LOAD_EXT, import_screensets4.HAI3_ACTION_MOUNT_EXT, import_screensets4.HAI3_ACTION_UNMOUNT_EXT],
1245
+ extensionsActions: [],
1246
+ sharedProperties: [import_screensets4.HAI3_SHARED_PROPERTY_THEME, import_screensets4.HAI3_SHARED_PROPERTY_LANGUAGE],
1247
+ defaultActionTimeout: 3e4,
1248
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1249
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1250
+ lifecycle: void 0
1251
+ };
1252
+ var overlayDomain = {
1253
+ id: HAI3_OVERLAY_DOMAIN,
1254
+ actions: [import_screensets4.HAI3_ACTION_LOAD_EXT, import_screensets4.HAI3_ACTION_MOUNT_EXT, import_screensets4.HAI3_ACTION_UNMOUNT_EXT],
1255
+ extensionsActions: [],
1256
+ sharedProperties: [import_screensets4.HAI3_SHARED_PROPERTY_THEME, import_screensets4.HAI3_SHARED_PROPERTY_LANGUAGE],
1257
+ defaultActionTimeout: 3e4,
1258
+ lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1259
+ extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],
1260
+ lifecycle: void 0
1261
+ };
1262
+
1263
+ // src/plugins/microfrontends/index.ts
1264
+ function microfrontends(config = {}) {
1265
+ const screensetsRegistry2 = import_screensets5.screensetsRegistryFactory.build({
1266
+ typeSystem: import_gts.gtsPlugin,
1267
+ mfeHandlers: config.mfeHandlers
1268
+ });
1269
+ const originalExecuteActionsChain = screensetsRegistry2.executeActionsChain.bind(screensetsRegistry2);
1270
+ screensetsRegistry2.executeActionsChain = async (chain) => {
1271
+ await originalExecuteActionsChain(chain);
1272
+ const actionType = chain.action?.type;
1273
+ if (actionType === import_screensets5.HAI3_ACTION_MOUNT_EXT) {
1274
+ const store = (0, import_state18.getStore)();
1275
+ const domainId = chain.action.target;
1276
+ const extensionId = chain.action.payload?.extensionId;
1277
+ if (domainId && extensionId) {
1278
+ store.dispatch(setExtensionMounted({ domainId, extensionId }));
1279
+ }
1280
+ } else if (actionType === import_screensets5.HAI3_ACTION_UNMOUNT_EXT) {
1281
+ const store = (0, import_state18.getStore)();
1282
+ const domainId = chain.action.target;
1283
+ if (domainId) {
1284
+ store.dispatch(setExtensionUnmounted({ domainId }));
1285
+ }
1286
+ }
1287
+ };
1288
+ let effectsCleanup = null;
1289
+ return {
1290
+ name: "microfrontends",
1291
+ dependencies: ["screensets"],
1292
+ // Requires screensets to be initialized
1293
+ provides: {
1294
+ registries: {
1295
+ // Expose the MFE-enabled ScreensetsRegistry
1296
+ // This registry has registerDomain(), registerExtension(), etc.
1297
+ screensetsRegistry: screensetsRegistry2
1298
+ },
1299
+ slices: [mfeSlice],
1300
+ // NOTE: Effects are NOT initialized via provides.effects.
1301
+ // They are initialized in onInit to capture cleanup references.
1302
+ // The framework calls provides.effects at build step 5, then onInit at step 7.
1303
+ // We only initialize effects in onInit to avoid duplicate event listeners.
1304
+ actions: {
1305
+ loadExtension,
1306
+ mountExtension,
1307
+ unmountExtension,
1308
+ registerExtension,
1309
+ unregisterExtension
1310
+ }
1311
+ },
1312
+ onInit() {
1313
+ setMfeRegistry(screensetsRegistry2);
1314
+ effectsCleanup = initMfeEffects(screensetsRegistry2);
1315
+ },
1316
+ onDestroy() {
1317
+ if (effectsCleanup) {
1318
+ effectsCleanup();
1319
+ effectsCleanup = null;
1320
+ }
1321
+ }
1322
+ };
1323
+ }
1324
+
1423
1325
  // src/presets/index.ts
1424
1326
  function full(config) {
1425
1327
  return [
@@ -1427,10 +1329,9 @@ function full(config) {
1427
1329
  screensets({ autoDiscover: true }),
1428
1330
  themes(config?.themes),
1429
1331
  layout(),
1430
- routing(),
1431
- navigation(),
1432
1332
  i18n(),
1433
- mock()
1333
+ mock(),
1334
+ microfrontends(config?.microfrontends)
1434
1335
  ];
1435
1336
  }
1436
1337
  function minimal() {
@@ -1452,28 +1353,35 @@ var presets = {
1452
1353
 
1453
1354
  // src/createHAI3App.ts
1454
1355
  function createHAI3App(config) {
1455
- return createHAI3(config).useAll(full({ themes: config?.themes })).build();
1356
+ return createHAI3(config).useAll(full({
1357
+ themes: config?.themes,
1358
+ microfrontends: config?.microfrontends
1359
+ })).build();
1456
1360
  }
1457
1361
 
1458
- // src/registries/index.ts
1459
- var import_screensets4 = require("@hai3/screensets");
1460
-
1461
1362
  // src/index.ts
1462
- var import_state17 = require("@hai3/state");
1463
- var import_screensets6 = require("@hai3/screensets");
1363
+ var import_screensets8 = require("@hai3/screensets");
1364
+ var import_screensets9 = require("@hai3/screensets");
1365
+ var import_screensets10 = require("@hai3/screensets");
1366
+ var import_screensets11 = require("@hai3/screensets");
1367
+ var import_handler = require("@hai3/screensets/mfe/handler");
1368
+ var import_gts2 = require("@hai3/screensets/plugins/gts");
1369
+ var import_screensets12 = require("@hai3/screensets");
1370
+ var import_state21 = require("@hai3/state");
1371
+ var import_screensets13 = require("@hai3/screensets");
1464
1372
 
1465
1373
  // src/effects/tenantEffects.ts
1466
- var import_state16 = require("@hai3/state");
1374
+ var import_state19 = require("@hai3/state");
1467
1375
  var TenantEvents = {
1468
1376
  Changed: "app/tenant/changed",
1469
1377
  Cleared: "app/tenant/cleared"
1470
1378
  };
1471
1379
  function initTenantEffects() {
1472
- const store = (0, import_state16.getStore)();
1473
- const subChanged = import_state16.eventBus.on(TenantEvents.Changed, (payload) => {
1380
+ const store = (0, import_state19.getStore)();
1381
+ const subChanged = import_state19.eventBus.on(TenantEvents.Changed, (payload) => {
1474
1382
  store.dispatch(setTenant(payload.tenant));
1475
1383
  });
1476
- const subCleared = import_state16.eventBus.on(TenantEvents.Cleared, () => {
1384
+ const subCleared = import_state19.eventBus.on(TenantEvents.Cleared, () => {
1477
1385
  store.dispatch(clearTenant());
1478
1386
  });
1479
1387
  return () => {
@@ -1481,23 +1389,26 @@ function initTenantEffects() {
1481
1389
  subCleared.unsubscribe();
1482
1390
  };
1483
1391
  }
1392
+
1393
+ // src/effects/tenantActions.ts
1394
+ var import_state20 = require("@hai3/state");
1484
1395
  function changeTenant(tenant) {
1485
- import_state16.eventBus.emit(TenantEvents.Changed, { tenant });
1396
+ import_state20.eventBus.emit(TenantEvents.Changed, { tenant });
1486
1397
  }
1487
1398
  function clearTenantAction() {
1488
- import_state16.eventBus.emit(TenantEvents.Cleared, {});
1399
+ import_state20.eventBus.emit(TenantEvents.Cleared, {});
1489
1400
  }
1490
1401
  function setTenantLoadingState(loading) {
1491
- (0, import_state16.getStore)().dispatch(setTenantLoading(loading));
1402
+ (0, import_state20.getStore)().dispatch(setTenantLoading(loading));
1492
1403
  }
1493
1404
 
1494
1405
  // src/index.ts
1495
1406
  var import_api3 = require("@hai3/api");
1407
+ var import_i18n4 = require("@hai3/i18n");
1496
1408
  var import_i18n5 = require("@hai3/i18n");
1497
1409
  var import_i18n6 = require("@hai3/i18n");
1498
1410
 
1499
1411
  // src/compat.ts
1500
- var import_screensets5 = require("@hai3/screensets");
1501
1412
  var ACCOUNTS_DOMAIN = "accounts";
1502
1413
 
1503
1414
  // src/migration.ts
@@ -1560,6 +1471,17 @@ function hasNewLayoutState(state) {
1560
1471
  ApiPluginBase,
1561
1472
  ApiProtocol,
1562
1473
  BaseApiService,
1474
+ ContainerProvider,
1475
+ HAI3_ACTION_LOAD_EXT,
1476
+ HAI3_ACTION_MOUNT_EXT,
1477
+ HAI3_ACTION_UNMOUNT_EXT,
1478
+ HAI3_OVERLAY_DOMAIN,
1479
+ HAI3_POPUP_DOMAIN,
1480
+ HAI3_SCREEN_DOMAIN,
1481
+ HAI3_SCREEN_EXTENSION_TYPE,
1482
+ HAI3_SHARED_PROPERTY_LANGUAGE,
1483
+ HAI3_SHARED_PROPERTY_THEME,
1484
+ HAI3_SIDEBAR_DOMAIN,
1563
1485
  I18nRegistry,
1564
1486
  I18nRegistryImpl,
1565
1487
  LAYOUT_SLICE_NAME,
@@ -1567,6 +1489,9 @@ function hasNewLayoutState(state) {
1567
1489
  LanguageDisplayMode,
1568
1490
  LayoutDomain,
1569
1491
  MOCK_PLUGIN,
1492
+ MfeBridgeFactory,
1493
+ MfeHandler,
1494
+ MfeHandlerMF,
1570
1495
  MockEventSource,
1571
1496
  MockEvents,
1572
1497
  RestMockPlugin,
@@ -1575,7 +1500,8 @@ function hasNewLayoutState(state) {
1575
1500
  RestProtocol,
1576
1501
  STATE_PATH_MAPPING,
1577
1502
  SUPPORTED_LANGUAGES,
1578
- ScreensetCategory,
1503
+ ScreensetsRegistry,
1504
+ ScreensetsRegistryFactory,
1579
1505
  SseMockPlugin,
1580
1506
  SsePlugin,
1581
1507
  SsePluginWithConfig,
@@ -1592,23 +1518,34 @@ function hasNewLayoutState(state) {
1592
1518
  closeAllPopups,
1593
1519
  closePopup,
1594
1520
  closeTopPopup,
1521
+ compareStrings,
1522
+ createCollator,
1595
1523
  createHAI3,
1596
1524
  createHAI3App,
1597
1525
  createI18nRegistry,
1598
1526
  createLegacySelector,
1599
- createRouteRegistry,
1600
- createScreensetRegistry,
1527
+ createShadowRoot,
1601
1528
  createSlice,
1602
1529
  createStore,
1603
1530
  createThemeRegistry,
1604
1531
  effects,
1605
1532
  eventBus,
1533
+ extractGtsPackage,
1606
1534
  footerActions,
1607
1535
  footerSlice,
1536
+ formatCompact,
1537
+ formatCurrency,
1538
+ formatDate,
1539
+ formatDateTime,
1540
+ formatNumber,
1541
+ formatPercent,
1542
+ formatRelative,
1543
+ formatTime,
1608
1544
  full,
1609
1545
  getLanguageMetadata,
1610
1546
  getLayoutDomainState,
1611
1547
  getStore,
1548
+ gtsPlugin,
1612
1549
  hasLegacyUicoreState,
1613
1550
  hasNewLayoutState,
1614
1551
  hasSlice,
@@ -1620,6 +1557,7 @@ function hasNewLayoutState(state) {
1620
1557
  i18nRegistry,
1621
1558
  initMockEffects,
1622
1559
  initTenantEffects,
1560
+ injectCssVariables,
1623
1561
  isDeprecationWarningsEnabled,
1624
1562
  isMockPlugin,
1625
1563
  isRestShortCircuit,
@@ -1628,26 +1566,34 @@ function hasNewLayoutState(state) {
1628
1566
  layout,
1629
1567
  layoutDomainReducers,
1630
1568
  layoutReducer,
1569
+ loadExtension,
1631
1570
  menuActions,
1632
1571
  menuSlice,
1572
+ microfrontends,
1633
1573
  minimal,
1634
1574
  mock,
1635
1575
  mockActions,
1636
1576
  mockSlice,
1577
+ mountExtension,
1637
1578
  navigateTo,
1638
- navigation,
1639
1579
  openPopup,
1640
1580
  overlayActions,
1581
+ overlayDomain,
1641
1582
  overlaySlice,
1642
1583
  popupActions,
1584
+ popupDomain,
1643
1585
  popupSlice,
1644
1586
  presets,
1587
+ registerExtension,
1645
1588
  registerSlice,
1646
- routing,
1647
1589
  screenActions,
1590
+ screenDomain,
1648
1591
  screenSlice,
1649
- screensetRegistry,
1650
1592
  screensets,
1593
+ screensetsRegistryFactory,
1594
+ selectExtensionError,
1595
+ selectExtensionState,
1596
+ selectRegisteredExtensions,
1651
1597
  setActiveScreen,
1652
1598
  setDeprecationWarnings,
1653
1599
  setFooterConfig,
@@ -1673,6 +1619,7 @@ function hasNewLayoutState(state) {
1673
1619
  setUser,
1674
1620
  showOverlay,
1675
1621
  sidebarActions,
1622
+ sidebarDomain,
1676
1623
  sidebarSlice,
1677
1624
  tenantActions,
1678
1625
  tenantReducer,
@@ -1680,6 +1627,8 @@ function hasNewLayoutState(state) {
1680
1627
  themes,
1681
1628
  toggleMenu,
1682
1629
  toggleMockMode,
1683
- toggleSidebar
1630
+ toggleSidebar,
1631
+ unmountExtension,
1632
+ unregisterExtension
1684
1633
  });
1685
1634
  //# sourceMappingURL=index.cjs.map