dinocollab-core 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/api-context.d.ts +2 -0
  2. package/dist/api-context.js +2 -0
  3. package/dist/api-context.mjs +2 -0
  4. package/dist/components.d.ts +2 -0
  5. package/dist/components.js +2 -0
  6. package/dist/components.mjs +2 -0
  7. package/dist/data-view.d.ts +2 -0
  8. package/dist/data-view.js +2 -0
  9. package/dist/data-view.mjs +2 -0
  10. package/dist/form.d.ts +2 -0
  11. package/dist/form.js +2 -0
  12. package/dist/form.mjs +2 -0
  13. package/dist/hooks.d.ts +2 -0
  14. package/dist/hooks.js +2 -0
  15. package/dist/hooks.mjs +2 -0
  16. package/dist/http-service.d.ts +2 -0
  17. package/dist/http-service.js +2 -0
  18. package/dist/http-service.mjs +2 -0
  19. package/dist/mfe-shared/auth.js.map +1 -1
  20. package/dist/mfe-shared/auth.ssr.js.map +1 -1
  21. package/dist/mfe-shared/auth.types.js.map +1 -1
  22. package/dist/mfe-shared/hydration-helper.js +1 -1
  23. package/dist/mfe-shared/hydration-helper.js.map +1 -1
  24. package/dist/mfe-shared/index.js +1 -1
  25. package/dist/mfe-shared/mfe-bridge.js.map +1 -1
  26. package/dist/mfe-shared.d.ts +2 -0
  27. package/dist/mfe-shared.js +2 -0
  28. package/dist/mfe-shared.mjs +2 -0
  29. package/dist/redux.d.ts +2 -0
  30. package/dist/redux.js +2 -0
  31. package/dist/redux.mjs +2 -0
  32. package/dist/table-grid.d.ts +2 -0
  33. package/dist/table-grid.js +2 -0
  34. package/dist/table-grid.mjs +2 -0
  35. package/dist/table.d.ts +2 -0
  36. package/dist/table.js +2 -0
  37. package/dist/table.mjs +2 -0
  38. package/dist/types/mfe-shared/auth.d.ts +13 -8
  39. package/dist/types/mfe-shared/auth.ssr.d.ts +3 -3
  40. package/dist/types/mfe-shared/auth.types.d.ts +4 -4
  41. package/dist/types/mfe-shared/cart.debug.d.ts +2 -2
  42. package/dist/types/mfe-shared/hydration-helper.d.ts +4 -4
  43. package/dist/types/mfe-shared/index.d.ts +6 -4
  44. package/dist/types/mfe-shared/mfe-bridge.d.ts +4 -4
  45. package/dist/types/mfe-shared/types.d.ts +4 -4
  46. package/dist/utils.d.ts +2 -0
  47. package/dist/utils.js +2 -0
  48. package/dist/utils.mjs +2 -0
  49. package/package.json +90 -8
  50. package/dist/mfe-auth/auth-enums.js +0 -2
  51. package/dist/mfe-auth/auth-enums.js.map +0 -1
  52. package/dist/mfe-auth/auth-mfe-manager.js +0 -2
  53. package/dist/mfe-auth/auth-mfe-manager.js.map +0 -1
  54. package/dist/mfe-auth/auth-mfe-provider.js +0 -2
  55. package/dist/mfe-auth/auth-mfe-provider.js.map +0 -1
  56. package/dist/mfe-auth/auth-types.js +0 -2
  57. package/dist/mfe-auth/auth-types.js.map +0 -1
  58. package/dist/mfe-auth/index.js +0 -2
  59. package/dist/mfe-auth/index.js.map +0 -1
  60. package/dist/mfe-auth/micro-frontend-auth-hooks.js +0 -2
  61. package/dist/mfe-auth/micro-frontend-auth-hooks.js.map +0 -1
  62. package/dist/types/mfe-auth/auth-enums.d.ts +0 -40
  63. package/dist/types/mfe-auth/auth-mfe-manager.d.ts +0 -68
  64. package/dist/types/mfe-auth/auth-mfe-provider.d.ts +0 -19
  65. package/dist/types/mfe-auth/auth-types.d.ts +0 -33
  66. package/dist/types/mfe-auth/index.d.ts +0 -6
  67. package/dist/types/mfe-auth/micro-frontend-auth-hooks.d.ts +0 -164
  68. package/dist/types/mfe-navigate/index.d.ts +0 -2
  69. package/dist/types/mfe-navigate/mfe-navigate.debug.d.ts +0 -4
  70. package/dist/types/mfe-navigate/mfe-navigate.remote.d.ts +0 -11
  71. package/dist/types/mfe-navigate/nextjs/index.d.ts +0 -1
  72. package/dist/types/mfe-navigate/nextjs/provider.d.ts +0 -2
  73. package/dist/types/mfe-navigate/react/index.d.ts +0 -1
  74. package/dist/types/mfe-navigate/react/provider.d.ts +0 -3
  75. package/dist/types/mfe-navigate/types.d.ts +0 -13
@@ -0,0 +1,2 @@
1
+ // Re-export types from api-context submodule
2
+ export * from './types/api-context/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from api-context submodule
2
+ module.exports = require('./api-context/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from api-context submodule (ESM)
2
+ export * from './api-context/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from components submodule
2
+ export * from './types/components/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from components submodule
2
+ module.exports = require('./components/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from components submodule (ESM)
2
+ export * from './components/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from data-view submodule
2
+ export * from './types/data-view/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from data-view submodule
2
+ module.exports = require('./data-view/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from data-view submodule (ESM)
2
+ export * from './data-view/index.js';
package/dist/form.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export types from form submodule
2
+ export * from './types/form/index';
package/dist/form.js ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from form submodule
2
+ module.exports = require('./form/index.js');
package/dist/form.mjs ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from form submodule (ESM)
2
+ export * from './form/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from hooks submodule
2
+ export * from './types/hooks/index';
package/dist/hooks.js ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from hooks submodule
2
+ module.exports = require('./hooks/index.js');
package/dist/hooks.mjs ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from hooks submodule (ESM)
2
+ export * from './hooks/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from http-service submodule
2
+ export * from './types/http-service/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from http-service submodule
2
+ module.exports = require('./http-service/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from http-service submodule (ESM)
2
+ export * from './http-service/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["../../src/mfe-shared/auth.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { AUTH_CHANNELS, AuthState, INITIAL_AUTH_STATE, User } from './auth.types'\r\nimport { isBrowser } from './environment'\r\n\r\ninterface ILoginParams {\r\n username: string\r\n password: string\r\n}\r\n\r\ninterface ILoginResponse {\r\n isAuthenticated: boolean\r\n user?: User\r\n error?: string\r\n}\r\n\r\nexport interface IAuthProviderProps {\r\n children?: React.ReactNode\r\n\r\n // Custom handlers for manual authentication\r\n // onLogin can simply trigger authentication (like opening a login modal) without returning immediate data\r\n onLogin?: (params: ILoginParams) => Promise<ILoginResponse | void>\r\n onLogout?: () => Promise<boolean | void>\r\n\r\n // Initial state\r\n initialState?: AuthState\r\n\r\n // Direct auth data - allows updating state directly from external sources\r\n // Main approach for real-world applications with their own authentication services\r\n authData?: {\r\n id?: string\r\n displayName?: string\r\n email?: string\r\n avatar?: string\r\n roles?: string[]\r\n [key: string]: any // Allow custom fields\r\n }\r\n\r\n // Auth state subscription\r\n // Allows registering callbacks to receive notifications when auth state changes from external services\r\n onAuthChange?: (callback: (newState: AuthState) => void) => () => void\r\n}\r\n\r\n/**\r\n * AuthProvider - Component for Host application\r\n *\r\n * Manages authentication state and broadcasts events to MFEs.\r\n * Place this component anywhere in your application, no need to wrap other components.\r\n *\r\n * Host can customize login/logout behavior by providing custom handlers.\r\n */\r\nexport const AuthProvider: React.FC<IAuthProviderProps> = ({\r\n children,\r\n onLogin,\r\n onLogout,\r\n initialState = INITIAL_AUTH_STATE,\r\n authData,\r\n onAuthChange\r\n}) => {\r\n // Authentication state\r\n const [authState, setAuthState] = useState<AuthState>(initialState)\r\n\r\n // Handle when authData is provided directly and changes\r\n useEffect(() => {\r\n if (authData) {\r\n // Convert from authData to AuthState\r\n\r\n let user: User | null = null\r\n if (authData.id || authData.displayName) {\r\n user = {\r\n id: authData.id || 'unknown',\r\n displayName: authData.displayName || 'Unknown User',\r\n email: authData.email || '',\r\n roles: authData.roles || [],\r\n avatar: authData.avatar\r\n }\r\n }\r\n const isAuthenticated = !!authData.id || !!authData.displayName\r\n const newState: AuthState = { \r\n isAuthenticated, \r\n isLoading: false, \r\n user, \r\n error: null,\r\n // Mark if running in SSR environment\r\n serverRendered: !isBrowser()\r\n }\r\n // Update state and notify MFEs\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n }\r\n }, [authData]) // Re-run when authData changes\r\n\r\n // Register with onAuthChange if provided\r\n useEffect(() => {\r\n if (onAuthChange) {\r\n // Register callback to receive notifications when auth changes from external service\r\n const unsubscribe = onAuthChange((newState) => {\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n })\r\n\r\n return unsubscribe\r\n }\r\n }, [onAuthChange])\r\n\r\n useEffect(() => {\r\n // Listen for requests from MFEs\r\n const unsubscribeRequestState = mfeBridge.subscribe(AUTH_CHANNELS.REQUEST_STATE, () => {\r\n // Send current state when requested by an MFE\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, authState)\r\n })\r\n\r\n const unsubscribeLogin = mfeBridge.subscribe(AUTH_CHANNELS.LOGIN, (credentials) => {\r\n handleLogin(credentials.username, credentials.password)\r\n })\r\n\r\n const unsubscribeLogout = mfeBridge.subscribe(AUTH_CHANNELS.LOGOUT, () => {\r\n handleLogout()\r\n })\r\n\r\n return () => {\r\n unsubscribeRequestState()\r\n unsubscribeLogin()\r\n unsubscribeLogout()\r\n }\r\n }, [authState])\r\n\r\n // Login handler - uses onLogin from props if provided\r\n const handleLogin = async (username: string, password: string) => {\r\n setAuthState((prev) => ({ ...prev, isLoading: true, error: null }))\r\n\r\n try {\r\n // Use provided login handler if available\r\n if (onLogin) {\r\n const result = await onLogin({ username, password })\r\n \r\n // If onLogin returns login response data, use it to update state\r\n if (result) {\r\n const newState: AuthState = {\r\n isAuthenticated: result.isAuthenticated,\r\n isLoading: false,\r\n user: result.user || null,\r\n error: result.error || null,\r\n serverRendered: !isBrowser()\r\n }\r\n \r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n } else {\r\n // If onLogin doesn't return data, just set loading to false\r\n // This allows the host app to handle the auth flow completely\r\n setAuthState(prev => ({ ...prev, isLoading: false }))\r\n }\r\n } else {\r\n // No default handling in library mode\r\n throw new Error('No login handler provided. Please provide an onLogin handler to AuthProvider.')\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Login failed'\r\n const errorState: AuthState = { \r\n isAuthenticated: false, \r\n isLoading: false, \r\n user: null, \r\n error: message,\r\n serverRendered: !isBrowser()\r\n }\r\n setAuthState(errorState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, errorState)\r\n }\r\n }\r\n\r\n // Logout handler - uses onLogout from props if provided\r\n const handleLogout = async () => {\r\n setAuthState((prev) => ({ ...prev, isLoading: true }))\r\n\r\n try {\r\n // Use provided logout handler if available\r\n if (onLogout) {\r\n const result = await onLogout()\r\n \r\n // If onLogout returns a boolean, use it to determine success\r\n // If it returns nothing (void), assume success\r\n if (result !== false) {\r\n const newState: AuthState = { \r\n isAuthenticated: false, \r\n isLoading: false, \r\n user: null, \r\n error: null,\r\n serverRendered: !isBrowser()\r\n }\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n } else {\r\n throw new Error('Logout failed')\r\n }\r\n } else {\r\n // No default handling in library mode\r\n throw new Error('No logout handler provided. Please provide an onLogout handler to AuthProvider.')\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Logout failed'\r\n setAuthState((prev) => ({ ...prev, isLoading: false, error: message }))\r\n }\r\n }\r\n\r\n // Simply return children\r\n return <>{children}</>\r\n}\r\n\r\n// Hook for using Auth in both host and MFE\r\nexport function useAuth() {\r\n const [authState, setAuthState] = useState<AuthState>(INITIAL_AUTH_STATE)\r\n\r\n useEffect(() => {\r\n // Subscribe to authentication state changes from provider\r\n const unsubscribe = mfeBridge.subscribe<AuthState>(AUTH_CHANNELS.STATE_CHANGE, (newState) => {\r\n setAuthState(newState)\r\n })\r\n\r\n // Request current state\r\n mfeBridge.publish(AUTH_CHANNELS.REQUEST_STATE, null)\r\n\r\n return unsubscribe\r\n }, [])\r\n\r\n // Functions always use mfeBridge for communication\r\n const login = (username: string, password: string) => {\r\n mfeBridge.publish(AUTH_CHANNELS.LOGIN, { username, password })\r\n }\r\n\r\n const logout = () => {\r\n mfeBridge.publish(AUTH_CHANNELS.LOGOUT, null)\r\n }\r\n\r\n return { ...authState, login, logout }\r\n}\r\n"],"names":["AuthProvider","_ref","children","onLogin","onLogout","_ref$initialState","initialState","INITIAL_AUTH_STATE","authData","onAuthChange","_useState","useState","_useState2","_slicedToArray","authState","setAuthState","useEffect","user","id","displayName","email","roles","avatar","newState","isAuthenticated","isLoading","error","serverRendered","isBrowser","mfeBridge","publish","AUTH_CHANNELS","STATE_CHANGE","unsubscribeRequestState","subscribe","REQUEST_STATE","unsubscribeLogin","LOGIN","credentials","handleLogin","username","password","unsubscribeLogout","LOGOUT","handleLogout","_ref2","_asyncToGenerator","_regenerator","m","_callee","result","message","errorState","_t","w","_context","n","prev","_objectSpread","p","v","Error","a","_x","_x2","apply","this","arguments","_ref3","_callee2","_t2","_context2","_jsx","_Fragment","useAuth","_useState3","_useState4","unsubscribe","login","logout"],"mappings":"8YAmDaA,EAA6C,SAAjCC,GAOpB,IANHC,EAAQD,EAARC,SACAC,EAAOF,EAAPE,QACAC,EAAQH,EAARG,SAAQC,EAAAJ,EACRK,aAAAA,OAAeC,IAAHF,EAAGE,EAAkBF,EACjCG,EAAQP,EAARO,SACAC,EAAYR,EAAZQ,aAGAC,EAAkCC,EAAoBL,GAAaM,EAAAC,EAAAH,EAAA,GAA5DI,EAASF,EAAA,GAAEG,EAAYH,EAAA,GAG9BI,GAAU,WACR,GAAIR,EAAU,CAGZ,IAAIS,EAAoB,MACpBT,EAASU,IAAMV,EAASW,eAC1BF,EAAO,CACLC,GAAIV,EAASU,IAAM,UACnBC,YAAaX,EAASW,aAAe,eACrCC,MAAOZ,EAASY,OAAS,GACzBC,MAAOb,EAASa,OAAS,GACzBC,OAAQd,EAASc,SAGrB,IACMC,EAAsB,CAC1BC,kBAFwBhB,EAASU,MAAQV,EAASW,YAGlDM,WAAW,EACXR,KAAAA,EACAS,MAAO,KAEPC,gBAAiBC,KAGnBb,EAAaQ,GACbM,EAAUC,QAAQC,EAAcC,aAAcT,EAC/C,CACH,GAAG,CAACf,IAGJQ,GAAU,WACR,GAAIP,EAOF,OALoBA,GAAa,SAACc,GAChCR,EAAaQ,GACbM,EAAUC,QAAQC,EAAcC,aAAcT,EAChD,GAIJ,GAAG,CAACd,IAEJO,GAAU,WAER,IAAMiB,EAA0BJ,EAAUK,UAAUH,EAAcI,eAAe,WAE/EN,EAAUC,QAAQC,EAAcC,aAAclB,EAChD,IAEMsB,EAAmBP,EAAUK,UAAUH,EAAcM,OAAO,SAACC,GACjEC,EAAYD,EAAYE,SAAUF,EAAYG,SAChD,IAEMC,EAAoBb,EAAUK,UAAUH,EAAcY,QAAQ,WAClEC,GACF,IAEA,OAAO,WACLX,IACAG,IACAM,GACD,CACH,GAAG,CAAC5B,IAGJ,IAAMyB,EAAW,WAAA,IAAAM,EAAAC,EAAAC,IAAAC,GAAG,SAAAC,EAAOT,EAAkBC,GAAgB,IAAAS,EAAA3B,EAAA4B,EAAAC,EAAAC,EAAA,OAAAN,IAAAO,GAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EACQ,GAAnEzC,GAAa,SAAC0C,GAAI,OAAAC,EAAAA,EAAA,CAAA,EAAWD,GAAI,CAAA,EAAA,CAAEhC,WAAW,EAAMC,MAAO,MAAI,IAAI6B,EAAAI,EAAA,GAI7DxD,EAAO,CAAAoD,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAC,EAAA,EACYrD,EAAQ,CAAEqC,SAAAA,EAAUC,SAAAA,IAAW,KAAA,GAA9CS,EAAMK,EAAAK,IAIJrC,EAAsB,CAC1BC,gBAAiB0B,EAAO1B,gBACxBC,WAAW,EACXR,KAAMiC,EAAOjC,MAAQ,KACrBS,MAAOwB,EAAOxB,OAAS,KACvBC,gBAAiBC,KAGnBb,EAAaQ,GACbM,EAAUC,QAAQC,EAAcC,aAAcT,IAI9CR,GAAa,SAAA0C,GAAI,OAAAC,EAAAA,EAAA,CAAA,EAAUD,GAAI,CAAA,EAAA,CAAEhC,WAAW,GAAK,IAClD8B,EAAAC,EAAA,EAAA,MAAA,KAAA,EAAA,MAGK,IAAIK,MAAM,iFAAgF,KAAA,EAAAN,EAAAC,EAAA,EAAA,MAAA,KAAA,EAAAD,EAAAI,EAAA,EAAAN,EAAAE,EAAAK,EAG5FT,EAAUE,aAAiBQ,MAAQR,EAAMF,QAAU,eACnDC,EAAwB,CAC5B5B,iBAAiB,EACjBC,WAAW,EACXR,KAAM,KACNS,MAAOyB,EACPxB,gBAAiBC,KAEnBb,EAAaqC,GACbvB,EAAUC,QAAQC,EAAcC,aAAcoB,GAAW,KAAA,EAAA,OAAAG,EAAAO,EAAA,GAAA,GAAAb,EAAA,KAAA,CAAA,CAAA,EAAA,SAE5D,OAAA,SAzCgBc,EAAAC,GAAA,OAAAnB,EAAAoB,MAAAC,KAAAC,UAAA,EAAA,GA4CXvB,EAAY,WAAA,IAAAwB,EAAAtB,EAAAC,IAAAC,GAAG,SAAAqB,IAAA,IAAA9C,EAAA4B,EAAAmB,EAAA,OAAAvB,IAAAO,GAAA,SAAAiB,GAAA,cAAAA,EAAAf,GAAA,KAAA,EACmC,GAAtDzC,GAAa,SAAC0C,GAAI,OAAAC,EAAAA,EAAA,CAAA,EAAWD,GAAI,CAAA,EAAA,CAAEhC,WAAW,GAAI,IAAI8C,EAAAZ,EAAA,GAIhDvD,EAAQ,CAAAmE,EAAAf,EAAA,EAAA,KAAA,CAAA,OAAAe,EAAAf,EAAA,EACWpD,IAAU,KAAA,EAAnB,IAIG,IAJHmE,EAAAX,EAIQ,CAAAW,EAAAf,EAAA,EAAA,KAAA,CACZjC,EAAsB,CAC1BC,iBAAiB,EACjBC,WAAW,EACXR,KAAM,KACNS,MAAO,KACPC,gBAAiBC,KAEnBb,EAAaQ,GACbM,EAAUC,QAAQC,EAAcC,aAAcT,GAASgD,EAAAf,EAAA,EAAA,MAAA,KAAA,EAAA,MAEjD,IAAIK,MAAM,iBAAgB,KAAA,EAAAU,EAAAf,EAAA,EAAA,MAAA,KAAA,EAAA,MAI5B,IAAIK,MAAM,mFAAkF,KAAA,EAAAU,EAAAf,EAAA,EAAA,MAAA,KAAA,EAAAe,EAAAZ,EAAA,EAAAW,EAAAC,EAAAX,EAG9FT,EAAUmB,aAAiBT,MAAQS,EAAMnB,QAAU,gBACzDpC,GAAa,SAAC0C,GAAI,OAAAC,EAAAA,EAAA,CAAA,EAAWD,GAAI,CAAA,EAAA,CAAEhC,WAAW,EAAOC,MAAOyB,GAAO,IAAI,KAAA,EAAA,OAAAoB,EAAAT,EAAA,GAAA,GAAAO,EAAA,KAAA,CAAA,CAAA,EAAA,SAE1E,OAAA,WA/BiB,OAAAD,EAAAH,MAAAC,KAAAC,UAAA,EAAA,GAkClB,OAAOK,EAAAC,EAAA,CAAAvE,SAAGA,GACZ,WAGgBwE,IACd,IAAAC,EAAkChE,EAAoBJ,GAAmBqE,EAAA/D,EAAA8D,EAAA,GAAlE7D,EAAS8D,EAAA,GAAE7D,EAAY6D,EAAA,GAE9B5D,GAAU,WAER,IAAM6D,EAAchD,EAAUK,UAAqBH,EAAcC,cAAc,SAACT,GAC9ER,EAAaQ,EACf,IAKA,OAFAM,EAAUC,QAAQC,EAAcI,cAAe,MAExC0C,CACR,GAAE,IAWH,OAAAnB,EAAAA,EAAA,CAAA,EAAY5C,GAAS,CAAA,EAAA,CAAEgE,MART,SAACtC,EAAkBC,GAC/BZ,EAAUC,QAAQC,EAAcM,MAAO,CAAEG,SAAAA,EAAUC,SAAAA,GACpD,EAM6BsC,OAJf,WACblD,EAAUC,QAAQC,EAAcY,OAAQ,KACzC,GAGH"}
1
+ {"version":3,"file":"auth.js","sources":["../../src/mfe-shared/auth.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { AUTH_CHANNELS, IAuthState, INITIAL_AUTH_STATE, IUser } from './auth.types'\r\nimport { isBrowser } from './environment'\r\n\r\n/**\r\n * Login parameters structure\r\n */\r\nexport interface ILoginParams {\r\n username: string\r\n password: string\r\n}\r\n\r\n/**\r\n * Login response structure\r\n */\r\nexport interface ILoginResponse {\r\n isAuthenticated: boolean\r\n user?: IUser\r\n error?: string\r\n}\r\n\r\nexport interface IAuthProviderProps {\r\n children?: React.ReactNode\r\n\r\n // Custom handlers for manual authentication\r\n // onLogin can simply trigger authentication (like opening a login modal) without returning immediate data\r\n onLogin?: (params: ILoginParams) => Promise<ILoginResponse | void>\r\n onLogout?: () => Promise<boolean | void>\r\n\r\n // Initial state\r\n initialState?: IAuthState\r\n\r\n // Direct auth data - allows updating state directly from external sources\r\n // Main approach for real-world applications with their own authentication services\r\n authData?: {\r\n id?: string\r\n displayName?: string\r\n email?: string\r\n avatar?: string\r\n roles?: string[]\r\n [key: string]: any // Allow custom fields\r\n }\r\n\r\n // Auth state subscription\r\n // Allows registering callbacks to receive notifications when auth state changes from external services\r\n onAuthChange?: (callback: (newState: IAuthState) => void) => () => void\r\n}\r\n\r\n/**\r\n * AuthProvider - Component for Host application\r\n *\r\n * Manages authentication state and broadcasts events to MFEs.\r\n * Place this component anywhere in your application, no need to wrap other components.\r\n *\r\n * Host can customize login/logout behavior by providing custom handlers.\r\n */\r\nexport const AuthProvider: React.FC<IAuthProviderProps> = ({\r\n children,\r\n onLogin,\r\n onLogout,\r\n initialState = INITIAL_AUTH_STATE,\r\n authData,\r\n onAuthChange\r\n}) => {\r\n // Authentication state\r\n const [authState, setAuthState] = useState<IAuthState>(initialState)\r\n\r\n // Handle when authData is provided directly and changes\r\n useEffect(() => {\r\n if (authData) {\r\n // Convert from authData to AuthState\r\n\r\n let user: IUser | null = null\r\n if (authData.id || authData.displayName) {\r\n user = {\r\n id: authData.id || 'unknown',\r\n displayName: authData.displayName || 'Unknown User',\r\n email: authData.email || '',\r\n roles: authData.roles || [],\r\n avatar: authData.avatar\r\n }\r\n }\r\n const isAuthenticated = !!authData.id || !!authData.displayName\r\n const newState: IAuthState = { \r\n isAuthenticated, \r\n isLoading: false, \r\n user, \r\n error: null,\r\n // Mark if running in SSR environment\r\n serverRendered: !isBrowser()\r\n }\r\n // Update state and notify MFEs\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n }\r\n }, [authData]) // Re-run when authData changes\r\n\r\n // Register with onAuthChange if provided\r\n useEffect(() => {\r\n if (onAuthChange) {\r\n // Register callback to receive notifications when auth changes from external service\r\n const unsubscribe = onAuthChange((newState) => {\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n })\r\n\r\n return unsubscribe\r\n }\r\n }, [onAuthChange])\r\n\r\n useEffect(() => {\r\n // Listen for requests from MFEs\r\n const unsubscribeRequestState = mfeBridge.subscribe(AUTH_CHANNELS.REQUEST_STATE, () => {\r\n // Send current state when requested by an MFE\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, authState)\r\n })\r\n\r\n const unsubscribeLogin = mfeBridge.subscribe(AUTH_CHANNELS.LOGIN, (credentials) => {\r\n handleLogin(credentials.username, credentials.password)\r\n })\r\n\r\n const unsubscribeLogout = mfeBridge.subscribe(AUTH_CHANNELS.LOGOUT, () => {\r\n handleLogout()\r\n })\r\n\r\n return () => {\r\n unsubscribeRequestState()\r\n unsubscribeLogin()\r\n unsubscribeLogout()\r\n }\r\n }, [authState])\r\n\r\n // Login handler - uses onLogin from props if provided\r\n const handleLogin = async (username: string, password: string) => {\r\n setAuthState((prev) => ({ ...prev, isLoading: true, error: null }))\r\n\r\n try {\r\n // Use provided login handler if available\r\n if (onLogin) {\r\n const result = await onLogin({ username, password })\r\n \r\n // If onLogin returns login response data, use it to update state\r\n if (result) {\r\n const newState: IAuthState = {\r\n isAuthenticated: result.isAuthenticated,\r\n isLoading: false,\r\n user: result.user || null,\r\n error: result.error || null,\r\n serverRendered: !isBrowser()\r\n }\r\n \r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n } else {\r\n // If onLogin doesn't return data, just set loading to false\r\n // This allows the host app to handle the auth flow completely\r\n setAuthState(prev => ({ ...prev, isLoading: false }))\r\n }\r\n } else {\r\n // No default handling in library mode\r\n throw new Error('No login handler provided. Please provide an onLogin handler to AuthProvider.')\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Login failed'\r\n const errorState: IAuthState = { \r\n isAuthenticated: false, \r\n isLoading: false, \r\n user: null, \r\n error: message,\r\n serverRendered: !isBrowser()\r\n }\r\n setAuthState(errorState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, errorState)\r\n }\r\n }\r\n\r\n // Logout handler - uses onLogout from props if provided\r\n const handleLogout = async () => {\r\n setAuthState((prev) => ({ ...prev, isLoading: true }))\r\n\r\n try {\r\n // Use provided logout handler if available\r\n if (onLogout) {\r\n const result = await onLogout()\r\n \r\n // If onLogout returns a boolean, use it to determine success\r\n // If it returns nothing (void), assume success\r\n if (result !== false) {\r\n const newState: IAuthState = { \r\n isAuthenticated: false, \r\n isLoading: false, \r\n user: null, \r\n error: null,\r\n serverRendered: !isBrowser()\r\n }\r\n setAuthState(newState)\r\n mfeBridge.publish(AUTH_CHANNELS.STATE_CHANGE, newState)\r\n } else {\r\n throw new Error('Logout failed')\r\n }\r\n } else {\r\n // No default handling in library mode\r\n throw new Error('No logout handler provided. Please provide an onLogout handler to AuthProvider.')\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Logout failed'\r\n setAuthState((prev) => ({ ...prev, isLoading: false, error: message }))\r\n }\r\n }\r\n\r\n // Simply return children\r\n return <>{children}</>\r\n}\r\n\r\n// Hook for using Auth in both host and MFE\r\nexport function useAuth() {\r\n const [authState, setAuthState] = useState<IAuthState>(INITIAL_AUTH_STATE)\r\n\r\n useEffect(() => {\r\n // Subscribe to authentication state changes from provider\r\n const unsubscribe = mfeBridge.subscribe<IAuthState>(AUTH_CHANNELS.STATE_CHANGE, (newState) => {\r\n setAuthState(newState)\r\n })\r\n\r\n // Request current state\r\n mfeBridge.publish(AUTH_CHANNELS.REQUEST_STATE, null)\r\n\r\n return unsubscribe\r\n }, [])\r\n\r\n // Functions always use mfeBridge for communication\r\n const login = (username: string, password: string) => {\r\n mfeBridge.publish(AUTH_CHANNELS.LOGIN, { username, password })\r\n }\r\n\r\n const logout = () => {\r\n mfeBridge.publish(AUTH_CHANNELS.LOGOUT, null)\r\n }\r\n\r\n return { ...authState, login, logout }\r\n}\r\n"],"names":["AuthProvider","_ref","children","onLogin","onLogout","_ref$initialState","initialState","INITIAL_AUTH_STATE","authData","onAuthChange","_useState","useState","_useState2","_slicedToArray","authState","setAuthState","useEffect","user","id","displayName","email","roles","avatar","newState","isAuthenticated","isLoading","error","serverRendered","isBrowser","mfeBridge","publish","AUTH_CHANNELS","STATE_CHANGE","unsubscribeRequestState","subscribe","REQUEST_STATE","unsubscribeLogin","LOGIN","credentials","handleLogin","username","password","unsubscribeLogout","LOGOUT","handleLogout","_ref2","_asyncToGenerator","_regenerator","m","_callee","result","message","errorState","_t","w","_context","n","prev","_objectSpread","p","v","Error","a","_x","_x2","apply","this","arguments","_ref3","_callee2","_t2","_context2","_jsx","_Fragment","useAuth","_useState3","_useState4","unsubscribe","login","logout"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.ssr.js","sources":["../../src/mfe-shared/auth.ssr.tsx"],"sourcesContent":["import React from 'react'\r\nimport { AuthState, INITIAL_AUTH_STATE, User } from './auth.types'\r\nimport { AuthProvider, type IAuthProviderProps } from './auth'\r\nimport { HydrationGuard } from './hydration-helper'\r\n\r\n/**\r\n * Props for the SSR-compatible auth provider\r\n */\r\ninterface ISsrAuthProviderProps {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Initial auth state for SSR */\r\n initialAuthState?: AuthState\r\n /** User data for initial state */\r\n userData?: User\r\n /** Custom auth data to be passed to AuthProvider */\r\n authData?: {\r\n id?: string\r\n displayName?: string\r\n email?: string\r\n avatar?: string\r\n roles?: string[]\r\n [key: string]: any\r\n }\r\n /** Custom login handler */\r\n onLogin?: IAuthProviderProps['onLogin']\r\n /** Custom logout handler */\r\n onLogout?: IAuthProviderProps['onLogout']\r\n /** Auth state change subscription */\r\n onAuthChange?: IAuthProviderProps['onAuthChange']\r\n}\r\n\r\n/**\r\n * Auth provider component that supports SSR\r\n * \r\n * This component allows providing initial auth data during server-side rendering\r\n * and then hydrating from API or other sources once client-side.\r\n */\r\nexport const SsrAuthProvider: React.FC<ISsrAuthProviderProps> = ({\r\n children,\r\n initialAuthState,\r\n userData,\r\n authData,\r\n onLogin,\r\n onLogout,\r\n onAuthChange\r\n}) => {\r\n // Prepare auth state for SSR\r\n let ssrAuthState = initialAuthState\r\n \r\n // If userData is provided but not initialAuthState, create auth state from userData\r\n if (!ssrAuthState && userData) {\r\n ssrAuthState = {\r\n isAuthenticated: true,\r\n isLoading: false,\r\n user: userData,\r\n error: null,\r\n serverRendered: true\r\n }\r\n }\r\n\r\n return (\r\n <AuthProvider\r\n initialState={ssrAuthState || { ...INITIAL_AUTH_STATE, serverRendered: true }}\r\n authData={authData}\r\n onLogin={onLogin}\r\n onLogout={onLogout}\r\n onAuthChange={onAuthChange}\r\n >\r\n <HydrationGuard>\r\n {children}\r\n </HydrationGuard>\r\n </AuthProvider>\r\n )\r\n}\r\n\r\n/**\r\n * Props for the SSR-compatible authenticated content component\r\n */\r\ninterface IAuthenticatedContentProps {\r\n /** Content to show when authenticated */\r\n children: React.ReactNode\r\n /** Content to show when not authenticated */\r\n fallback?: React.ReactNode\r\n /** Initial authentication state for SSR */\r\n initiallyAuthenticated?: boolean\r\n}\r\n\r\n/**\r\n * Component that conditionally renders content based on authentication state\r\n * with SSR support\r\n */\r\nexport const AuthenticatedContent: React.FC<IAuthenticatedContentProps> = ({\r\n children,\r\n fallback,\r\n initiallyAuthenticated = false\r\n}) => {\r\n // Let the AuthProvider handle hydration - we just need to render the right content\r\n return (\r\n <HydrationGuard\r\n serverFallback={initiallyAuthenticated ? <>{children}</> : <>{fallback}</>}\r\n >\r\n {/* Regular content will be rendered during hydration and after */}\r\n {children}\r\n </HydrationGuard>\r\n )\r\n}\r\n"],"names":["SsrAuthProvider","_ref","children","initialAuthState","userData","authData","onLogin","onLogout","onAuthChange","ssrAuthState","isAuthenticated","isLoading","user","error","serverRendered","_jsx","AuthProvider","initialState","_objectSpread","INITIAL_AUTH_STATE","HydrationGuard"],"mappings":"0QAsCaA,EAAmD,SAApCC,GAQvB,IAPHC,EAAQD,EAARC,SACAC,EAAgBF,EAAhBE,iBACAC,EAAQH,EAARG,SACAC,EAAQJ,EAARI,SACAC,EAAOL,EAAPK,QACAC,EAAQN,EAARM,SACAC,EAAYP,EAAZO,aAGIC,EAAeN,EAanB,OAVKM,GAAgBL,IACnBK,EAAe,CACbC,iBAAiB,EACjBC,WAAW,EACXC,KAAMR,EACNS,MAAO,KACPC,gBAAgB,IAKlBC,EAACC,GACCC,aAAcR,GAAYS,EAAAA,KAASC,GAAkB,GAAA,CAAEL,gBAAgB,IACvET,SAAUA,EACVC,QAASA,EACTC,SAAUA,EACVC,aAAcA,EAAYN,SAE1Ba,EAACK,EAAc,CAAAlB,SACZA,KAIT"}
1
+ {"version":3,"file":"auth.ssr.js","sources":["../../src/mfe-shared/auth.ssr.tsx"],"sourcesContent":["import React from 'react'\r\nimport { IAuthState, INITIAL_AUTH_STATE, IUser } from './auth.types'\r\nimport { AuthProvider, type IAuthProviderProps } from './auth'\r\nimport { HydrationGuard } from './hydration-helper'\r\n\r\n/**\r\n * Props for the SSR-compatible auth provider\r\n */\r\ninterface ISsrAuthProviderProps {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Initial auth state for SSR */\r\n initialAuthState?: IAuthState\r\n /** User data for initial state */\r\n userData?: IUser\r\n /** Custom auth data to be passed to AuthProvider */\r\n authData?: {\r\n id?: string\r\n displayName?: string\r\n email?: string\r\n avatar?: string\r\n roles?: string[]\r\n [key: string]: any\r\n }\r\n /** Custom login handler */\r\n onLogin?: IAuthProviderProps['onLogin']\r\n /** Custom logout handler */\r\n onLogout?: IAuthProviderProps['onLogout']\r\n /** Auth state change subscription */\r\n onAuthChange?: IAuthProviderProps['onAuthChange']\r\n}\r\n\r\n/**\r\n * Auth provider component that supports SSR\r\n * \r\n * This component allows providing initial auth data during server-side rendering\r\n * and then hydrating from API or other sources once client-side.\r\n */\r\nexport const SsrAuthProvider: React.FC<ISsrAuthProviderProps> = ({\r\n children,\r\n initialAuthState,\r\n userData,\r\n authData,\r\n onLogin,\r\n onLogout,\r\n onAuthChange\r\n}) => {\r\n // Prepare auth state for SSR\r\n let ssrAuthState = initialAuthState\r\n \r\n // If userData is provided but not initialAuthState, create auth state from userData\r\n if (!ssrAuthState && userData) {\r\n ssrAuthState = {\r\n isAuthenticated: true,\r\n isLoading: false,\r\n user: userData,\r\n error: null,\r\n serverRendered: true\r\n }\r\n }\r\n\r\n return (\r\n <AuthProvider\r\n initialState={ssrAuthState || { ...INITIAL_AUTH_STATE, serverRendered: true }}\r\n authData={authData}\r\n onLogin={onLogin}\r\n onLogout={onLogout}\r\n onAuthChange={onAuthChange}\r\n >\r\n <HydrationGuard>\r\n {children}\r\n </HydrationGuard>\r\n </AuthProvider>\r\n )\r\n}\r\n\r\n/**\r\n * Props for the SSR-compatible authenticated content component\r\n */\r\ninterface IAuthenticatedContentProps {\r\n /** Content to show when authenticated */\r\n children: React.ReactNode\r\n /** Content to show when not authenticated */\r\n fallback?: React.ReactNode\r\n /** Initial authentication state for SSR */\r\n initiallyAuthenticated?: boolean\r\n}\r\n\r\n/**\r\n * Component that conditionally renders content based on authentication state\r\n * with SSR support\r\n */\r\nexport const AuthenticatedContent: React.FC<IAuthenticatedContentProps> = ({\r\n children,\r\n fallback,\r\n initiallyAuthenticated = false\r\n}) => {\r\n // Let the AuthProvider handle hydration - we just need to render the right content\r\n return (\r\n <HydrationGuard\r\n serverFallback={initiallyAuthenticated ? <>{children}</> : <>{fallback}</>}\r\n >\r\n {/* Regular content will be rendered during hydration and after */}\r\n {children}\r\n </HydrationGuard>\r\n )\r\n}\r\n"],"names":["SsrAuthProvider","_ref","children","initialAuthState","userData","authData","onLogin","onLogout","onAuthChange","ssrAuthState","isAuthenticated","isLoading","user","error","serverRendered","_jsx","AuthProvider","initialState","_objectSpread","INITIAL_AUTH_STATE","HydrationGuard"],"mappings":"0QAsCaA,EAAmD,SAApCC,GAQvB,IAPHC,EAAQD,EAARC,SACAC,EAAgBF,EAAhBE,iBACAC,EAAQH,EAARG,SACAC,EAAQJ,EAARI,SACAC,EAAOL,EAAPK,QACAC,EAAQN,EAARM,SACAC,EAAYP,EAAZO,aAGIC,EAAeN,EAanB,OAVKM,GAAgBL,IACnBK,EAAe,CACbC,iBAAiB,EACjBC,WAAW,EACXC,KAAMR,EACNS,MAAO,KACPC,gBAAgB,IAKlBC,EAACC,GACCC,aAAcR,GAAYS,EAAAA,KAASC,GAAkB,GAAA,CAAEL,gBAAgB,IACvET,SAAUA,EACVC,QAASA,EACTC,SAAUA,EACVC,aAAcA,EAAYN,SAE1Ba,EAACK,EAAc,CAAAlB,SACZA,KAIT"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.types.js","sources":["../../src/mfe-shared/auth.types.ts"],"sourcesContent":["/**\r\n * auth.types.ts - Type definitions for Authentication System\r\n * \r\n * This file defines the data structures and communication channels\r\n * for the micro-frontend authentication system.\r\n */\r\n\r\n/**\r\n * User data structure\r\n */\r\nexport type User = {\r\n /** Unique identifier for the user */\r\n id: string;\r\n /** User's display name */\r\n displayName: string;\r\n /** User's email address */\r\n email: string;\r\n /** Optional URL to user's avatar image */\r\n avatar?: string;\r\n /** List of roles/permissions assigned to the user */\r\n roles: string[];\r\n}\r\n\r\n/**\r\n * Authentication state structure\r\n */\r\nexport type AuthState = {\r\n /** Whether the user is currently authenticated */\r\n isAuthenticated: boolean;\r\n /** Whether an authentication operation is in progress */\r\n isLoading: boolean;\r\n /** The authenticated user, or null if not authenticated */\r\n user: User | null;\r\n /** Error message if authentication failed, or null */\r\n error: string | null;\r\n /** Whether the auth state was rendered on the server */\r\n serverRendered?: boolean;\r\n}\r\n\r\n/**\r\n * Communication channels between auth provider and consumers\r\n */\r\nexport const AUTH_CHANNELS = {\r\n /** Provider → Consumer: Notify when auth state changes */\r\n STATE_CHANGE: 'mfe:auth:state_change',\r\n /** Consumer → Provider: Request the current auth state */\r\n REQUEST_STATE: 'mfe:auth:request_state',\r\n /** Consumer → Provider: Request to log in */\r\n LOGIN: 'mfe:auth:login',\r\n /** Consumer → Provider: Request to log out */\r\n LOGOUT: 'mfe:auth:logout'\r\n}\r\n\r\n/**\r\n * Default authentication state - unauthenticated, not loading, no user, no error\r\n */\r\nexport const INITIAL_AUTH_STATE: AuthState = {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n error: null,\r\n serverRendered: false\r\n}\r\n"],"names":["AUTH_CHANNELS","STATE_CHANGE","REQUEST_STATE","LOGIN","LOGOUT","INITIAL_AUTH_STATE","isAuthenticated","isLoading","user","error","serverRendered"],"mappings":"AA0CO,IAAMA,EAAgB,CAE3BC,aAAc,wBAEdC,cAAe,yBAEfC,MAAO,iBAEPC,OAAQ,mBAMGC,EAAgC,CAC3CC,iBAAiB,EACjBC,WAAW,EACXC,KAAM,KACNC,MAAO,KACPC,gBAAgB"}
1
+ {"version":3,"file":"auth.types.js","sources":["../../src/mfe-shared/auth.types.ts"],"sourcesContent":["/**\r\n * auth.types.ts - Type definitions for Authentication System\r\n *\r\n * This file defines the data structures and communication channels\r\n * for the micro-frontend authentication system.\r\n */\r\n\r\n/**\r\n * User data structure\r\n */\r\nexport type IUser = {\r\n /** Unique identifier for the user */\r\n id: string\r\n /** User's display name */\r\n displayName: string\r\n /** User's email address */\r\n email: string\r\n /** Optional URL to user's avatar image */\r\n avatar?: string\r\n /** List of roles/permissions assigned to the user */\r\n roles: string[]\r\n}\r\n\r\n/**\r\n * Authentication state structure\r\n */\r\nexport type IAuthState = {\r\n /** Whether the user is currently authenticated */\r\n isAuthenticated: boolean\r\n /** Whether an authentication operation is in progress */\r\n isLoading: boolean\r\n /** The authenticated user, or null if not authenticated */\r\n user: IUser | null\r\n /** Error message if authentication failed, or null */\r\n error: string | null\r\n /** Whether the auth state was rendered on the server */\r\n serverRendered?: boolean\r\n}\r\n\r\n/**\r\n * Communication channels between auth provider and consumers\r\n */\r\nexport const AUTH_CHANNELS = {\r\n /** Provider → Consumer: Notify when auth state changes */\r\n STATE_CHANGE: 'mfe:auth:state_change',\r\n /** Consumer → Provider: Request the current auth state */\r\n REQUEST_STATE: 'mfe:auth:request_state',\r\n /** Consumer → Provider: Request to log in */\r\n LOGIN: 'mfe:auth:login',\r\n /** Consumer → Provider: Request to log out */\r\n LOGOUT: 'mfe:auth:logout'\r\n}\r\n\r\n/**\r\n * Default authentication state - unauthenticated, not loading, no user, no error\r\n */\r\nexport const INITIAL_AUTH_STATE: IAuthState = {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n error: null,\r\n serverRendered: false\r\n}\r\n"],"names":["AUTH_CHANNELS","STATE_CHANGE","REQUEST_STATE","LOGIN","LOGOUT","INITIAL_AUTH_STATE","isAuthenticated","isLoading","user","error","serverRendered"],"mappings":"AA0CO,IAAMA,EAAgB,CAE3BC,aAAc,wBAEdC,cAAe,yBAEfC,MAAO,iBAEPC,OAAQ,mBAMGC,EAAiC,CAC5CC,iBAAiB,EACjBC,WAAW,EACXC,KAAM,KACNC,MAAO,KACPC,gBAAgB"}
@@ -1,2 +1,2 @@
1
- import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as e,Fragment as n}from"react/jsx-runtime";import{useState as i,useEffect as t}from"react";import{isBrowser as o}from"./environment.js";var l;!function(r){r.SERVER="server",r.HYDRATING="hydrating",r.HYDRATED="hydrated"}(l||(l={}));var a=function(a){var u=a.children,c=a.serverFallback,R=a.hydrationFallback,m=a.hydrationDelay,d=void 0===m?0:m,f=o()?l.HYDRATING:l.SERVER,D=i(f),E=r(D,2),T=E[0],s=E[1];return t((function(){if(T===l.SERVER&&s(l.HYDRATING),T===l.HYDRATING){var r=setTimeout((function(){s(l.HYDRATED)}),d);return function(){return clearTimeout(r)}}}),[T,d]),T===l.SERVER?e(n,{children:null!=c?c:u}):T===l.HYDRATING?e(n,{children:null!=R?R:u}):e(n,{children:u})};export{a as HydrationGuard,l as HydrationState};
1
+ import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,Fragment as t}from"react/jsx-runtime";import{useState as e,useEffect as i}from"react";import{isBrowser as o}from"./environment.js";var u;!function(r){r.SERVER="server",r.HYDRATING="hydrating",r.HYDRATED="hydrated"}(u||(u={}));var a=function(a){var l=a.children,R=a.serverFallback,c=a.hydrationFallback,T=a.hydrationDelay,f=void 0===T?0:T,D=o()?u.HYDRATING:u.SERVER,E=e(D),m=r(E,2),d=m[0],v=m[1];return i((function(){if(d===u.SERVER&&v(u.HYDRATING),d===u.HYDRATING){var r=setTimeout((function(){v(u.HYDRATED)}),f);return function(){return clearTimeout(r)}}}),[d,f]),d===u.SERVER?n(t,{children:null!=R?R:l}):d===u.HYDRATING?n(t,{children:null!=c?c:l}):n(t,{children:l})},l=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=o()?u.HYDRATING:u.SERVER,a=e(t),l=r(a,2),R=l[0],c=l[1];return i((function(){if(R===u.SERVER&&c(u.HYDRATING),R===u.HYDRATING){var r=setTimeout((function(){c(u.HYDRATED)}),n);return function(){return clearTimeout(r)}}}),[R,n]),R};export{a as HydrationGuard,u as IHydrationState,l as useHydration};
2
2
  //# sourceMappingURL=hydration-helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hydration-helper.js","sources":["../../src/mfe-shared/hydration-helper.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\nimport { isBrowser } from './environment'\r\n\r\n/**\r\n * Hydration state for components\r\n */\r\nexport enum HydrationState {\r\n /** Component is rendering on the server */\r\n SERVER = 'server',\r\n /** Component is in the process of hydrating on the client */\r\n HYDRATING = 'hydrating',\r\n /** Component is fully hydrated on the client */\r\n HYDRATED = 'hydrated'\r\n}\r\n\r\n/**\r\n * Props for the HydrationGuard component\r\n */\r\nexport interface HydrationGuardProps {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Optional fallback content to show during server rendering */\r\n serverFallback?: React.ReactNode\r\n /** Optional fallback content to show during hydration */\r\n hydrationFallback?: React.ReactNode\r\n /**\r\n * Optional delay in milliseconds before considering the component hydrated\r\n * This can help with \"flash of content\" issues\r\n */\r\n hydrationDelay?: number\r\n}\r\n\r\n/**\r\n * HydrationGuard - Component to handle SSR hydration\r\n * \r\n * This component helps manage the transition between server-rendered content\r\n * and client-side hydration, allowing different content to be shown during\r\n * different stages of the hydration process.\r\n */\r\nexport const HydrationGuard: React.FC<HydrationGuardProps> = ({\r\n children,\r\n serverFallback,\r\n hydrationFallback,\r\n hydrationDelay = 0\r\n}) => {\r\n // Determine initial hydration state\r\n const initialState = !isBrowser() \r\n ? HydrationState.SERVER \r\n : HydrationState.HYDRATING\r\n \r\n const [hydrationState, setHydrationState] = useState<HydrationState>(initialState)\r\n\r\n useEffect(() => {\r\n // We're now client-side, so at minimum we're hydrating\r\n if (hydrationState === HydrationState.SERVER) {\r\n setHydrationState(HydrationState.HYDRATING)\r\n }\r\n\r\n // If we're hydrating, set a timer to transition to fully hydrated\r\n if (hydrationState === HydrationState.HYDRATING) {\r\n const timer = setTimeout(() => {\r\n setHydrationState(HydrationState.HYDRATED)\r\n }, hydrationDelay)\r\n \r\n return () => clearTimeout(timer)\r\n }\r\n }, [hydrationState, hydrationDelay])\r\n\r\n // Render appropriate content based on hydration state\r\n if (hydrationState === HydrationState.SERVER) {\r\n return <>{serverFallback ?? children}</>\r\n }\r\n\r\n if (hydrationState === HydrationState.HYDRATING) {\r\n return <>{hydrationFallback ?? children}</>\r\n }\r\n\r\n return <>{children}</>\r\n}\r\n\r\n/**\r\n * Hook to get the current hydration state\r\n * \r\n * Use this hook to conditionally run code based on whether the component\r\n * is being rendered on the server or has been hydrated on the client.\r\n * \r\n * @param hydrationDelay Optional delay before considering the component hydrated\r\n * @returns Current hydration state\r\n */\r\nexport const useHydration = (hydrationDelay = 0): HydrationState => {\r\n const initialState = !isBrowser() \r\n ? HydrationState.SERVER \r\n : HydrationState.HYDRATING\r\n \r\n const [hydrationState, setHydrationState] = useState<HydrationState>(initialState)\r\n\r\n useEffect(() => {\r\n // We're now client-side, so at minimum we're hydrating\r\n if (hydrationState === HydrationState.SERVER) {\r\n setHydrationState(HydrationState.HYDRATING)\r\n }\r\n\r\n // If we're hydrating, set a timer to transition to fully hydrated\r\n if (hydrationState === HydrationState.HYDRATING) {\r\n const timer = setTimeout(() => {\r\n setHydrationState(HydrationState.HYDRATED)\r\n }, hydrationDelay)\r\n \r\n return () => clearTimeout(timer)\r\n }\r\n }, [hydrationState, hydrationDelay])\r\n\r\n return hydrationState\r\n}\r\n"],"names":["HydrationState","HydrationGuard","_ref","children","serverFallback","hydrationFallback","_ref$hydrationDelay","hydrationDelay","initialState","isBrowser","HYDRATING","SERVER","_useState","useState","_useState2","_slicedToArray","hydrationState","setHydrationState","useEffect","timer","setTimeout","HYDRATED","clearTimeout","_jsx","_Fragment"],"mappings":"gOAMYA,GAAZ,SAAYA,GAEVA,EAAA,OAAA,SAEAA,EAAA,UAAA,YAEAA,EAAA,SAAA,UACD,CAPD,CAAYA,IAAAA,EAOX,CAAA,QA0BYC,EAAgD,SAAlCC,GAKtB,IAJHC,EAAQD,EAARC,SACAC,EAAcF,EAAdE,eACAC,EAAiBH,EAAjBG,kBAAiBC,EAAAJ,EACjBK,eAAAA,OAAiB,IAAHD,EAAG,EAACA,EAGZE,EAAgBC,IAElBT,EAAeU,UADfV,EAAeW,OAGnBC,EAA4CC,EAAyBL,GAAaM,EAAAC,EAAAH,EAAA,GAA3EI,EAAcF,EAAA,GAAEG,EAAiBH,EAAA,GAmBxC,OAjBAI,GAAU,WAOR,GALIF,IAAmBhB,EAAeW,QACpCM,EAAkBjB,EAAeU,WAI/BM,IAAmBhB,EAAeU,UAAW,CAC/C,IAAMS,EAAQC,YAAW,WACvBH,EAAkBjB,EAAeqB,SAClC,GAAEd,GAEH,OAAO,WAAA,OAAMe,aAAaH,EAAM,CACjC,CACH,GAAG,CAACH,EAAgBT,IAGhBS,IAAmBhB,EAAeW,OAC7BY,EAAGC,EAAA,CAAArB,SAAAC,QAAAA,EAAkBD,IAG1Ba,IAAmBhB,EAAeU,UAC7Ba,EAAGC,EAAA,CAAArB,SAAAE,QAAAA,EAAqBF,IAG1BoB,EAAAC,EAAA,CAAArB,SAAGA,GACZ"}
1
+ {"version":3,"file":"hydration-helper.js","sources":["../../src/mfe-shared/hydration-helper.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\nimport { isBrowser } from './environment'\r\n\r\n/**\r\n * Hydration state for components\r\n */\r\nexport enum IHydrationState {\r\n /** Component is rendering on the server */\r\n SERVER = 'server',\r\n /** Component is in the process of hydrating on the client */\r\n HYDRATING = 'hydrating',\r\n /** Component is fully hydrated on the client */\r\n HYDRATED = 'hydrated'\r\n}\r\n\r\n/**\r\n * Props for the HydrationGuard component\r\n */\r\nexport interface IHydrationGuardProps {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Optional fallback content to show during server rendering */\r\n serverFallback?: React.ReactNode\r\n /** Optional fallback content to show during hydration */\r\n hydrationFallback?: React.ReactNode\r\n /**\r\n * Optional delay in milliseconds before considering the component hydrated\r\n * This can help with \"flash of content\" issues\r\n */\r\n hydrationDelay?: number\r\n}\r\n\r\n/**\r\n * HydrationGuard - Component to handle SSR hydration\r\n *\r\n * This component helps manage the transition between server-rendered content\r\n * and client-side hydration, allowing different content to be shown during\r\n * different stages of the hydration process.\r\n */\r\nexport const HydrationGuard: React.FC<IHydrationGuardProps> = ({ children, serverFallback, hydrationFallback, hydrationDelay = 0 }) => {\r\n // Determine initial hydration state\r\n const initialState = !isBrowser() ? IHydrationState.SERVER : IHydrationState.HYDRATING\r\n\r\n const [hydrationState, setHydrationState] = useState<IHydrationState>(initialState)\r\n\r\n useEffect(() => {\r\n // We're now client-side, so at minimum we're hydrating\r\n if (hydrationState === IHydrationState.SERVER) {\r\n setHydrationState(IHydrationState.HYDRATING)\r\n }\r\n\r\n // If we're hydrating, set a timer to transition to fully hydrated\r\n if (hydrationState === IHydrationState.HYDRATING) {\r\n const timer = setTimeout(() => {\r\n setHydrationState(IHydrationState.HYDRATED)\r\n }, hydrationDelay)\r\n\r\n return () => clearTimeout(timer)\r\n }\r\n }, [hydrationState, hydrationDelay])\r\n\r\n // Render appropriate content based on hydration state\r\n if (hydrationState === IHydrationState.SERVER) {\r\n return <>{serverFallback ?? children}</>\r\n }\r\n\r\n if (hydrationState === IHydrationState.HYDRATING) {\r\n return <>{hydrationFallback ?? children}</>\r\n }\r\n\r\n return <>{children}</>\r\n}\r\n\r\n/**\r\n * Hook to get the current hydration state\r\n *\r\n * Use this hook to conditionally run code based on whether the component\r\n * is being rendered on the server or has been hydrated on the client.\r\n *\r\n * @param hydrationDelay Optional delay before considering the component hydrated\r\n * @returns Current hydration state\r\n */\r\nexport const useHydration = (hydrationDelay = 0): IHydrationState => {\r\n const initialState = !isBrowser() ? IHydrationState.SERVER : IHydrationState.HYDRATING\r\n\r\n const [hydrationState, setHydrationState] = useState<IHydrationState>(initialState)\r\n\r\n useEffect(() => {\r\n // We're now client-side, so at minimum we're hydrating\r\n if (hydrationState === IHydrationState.SERVER) {\r\n setHydrationState(IHydrationState.HYDRATING)\r\n }\r\n\r\n // If we're hydrating, set a timer to transition to fully hydrated\r\n if (hydrationState === IHydrationState.HYDRATING) {\r\n const timer = setTimeout(() => {\r\n setHydrationState(IHydrationState.HYDRATED)\r\n }, hydrationDelay)\r\n\r\n return () => clearTimeout(timer)\r\n }\r\n }, [hydrationState, hydrationDelay])\r\n\r\n return hydrationState\r\n}\r\n"],"names":["IHydrationState","HydrationGuard","_ref","children","serverFallback","hydrationFallback","_ref$hydrationDelay","hydrationDelay","initialState","isBrowser","HYDRATING","SERVER","_useState","useState","_useState2","_slicedToArray","hydrationState","setHydrationState","useEffect","timer","setTimeout","HYDRATED","clearTimeout","_jsx","_Fragment","useHydration","arguments","length","undefined","_useState3","_useState4"],"mappings":"gOAMYA,GAAZ,SAAYA,GAEVA,EAAA,OAAA,SAEAA,EAAA,UAAA,YAEAA,EAAA,SAAA,UACD,CAPD,CAAYA,IAAAA,EAOX,CAAA,QA0BYC,EAAiD,SAAnCC,GAA2G,IAArEC,EAAQD,EAARC,SAAUC,EAAcF,EAAdE,eAAgBC,EAAiBH,EAAjBG,kBAAiBC,EAAAJ,EAAEK,eAAAA,OAAiB,IAAHD,EAAG,EAACA,EAExHE,EAAgBC,IAAuCT,EAAgBU,UAAzCV,EAAgBW,OAEpDC,EAA4CC,EAA0BL,GAAaM,EAAAC,EAAAH,EAAA,GAA5EI,EAAcF,EAAA,GAAEG,EAAiBH,EAAA,GAmBxC,OAjBAI,GAAU,WAOR,GALIF,IAAmBhB,EAAgBW,QACrCM,EAAkBjB,EAAgBU,WAIhCM,IAAmBhB,EAAgBU,UAAW,CAChD,IAAMS,EAAQC,YAAW,WACvBH,EAAkBjB,EAAgBqB,SACnC,GAAEd,GAEH,OAAO,WAAA,OAAMe,aAAaH,EAAM,CACjC,CACH,GAAG,CAACH,EAAgBT,IAGhBS,IAAmBhB,EAAgBW,OAC9BY,EAAGC,EAAA,CAAArB,SAAAC,QAAAA,EAAkBD,IAG1Ba,IAAmBhB,EAAgBU,UAC9Ba,EAAGC,EAAA,CAAArB,SAAAE,QAAAA,EAAqBF,IAG1BoB,EAAAC,EAAA,CAAArB,SAAGA,GACZ,EAWasB,EAAe,WAAwC,IAAvClB,EAAcmB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EACtClB,EAAgBC,IAAuCT,EAAgBU,UAAzCV,EAAgBW,OAEpDkB,EAA4ChB,EAA0BL,GAAasB,EAAAf,EAAAc,EAAA,GAA5Eb,EAAcc,EAAA,GAAEb,EAAiBa,EAAA,GAkBxC,OAhBAZ,GAAU,WAOR,GALIF,IAAmBhB,EAAgBW,QACrCM,EAAkBjB,EAAgBU,WAIhCM,IAAmBhB,EAAgBU,UAAW,CAChD,IAAMS,EAAQC,YAAW,WACvBH,EAAkBjB,EAAgBqB,SACnC,GAAEd,GAEH,OAAO,WAAA,OAAMe,aAAaH,EAAM,CACjC,CACH,GAAG,CAACH,EAAgBT,IAEbS,CACT"}
@@ -1,2 +1,2 @@
1
- export{mfeBridge}from"./mfe-bridge.js";export{AuthProvider,useAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{CART_CHANNELS,useCartActions,useCartStore}from"./cart.js";export{SsrCartProvider}from"./cart.ssr.js";export{MfeLink,MfeNavigateReactProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard}from"./hydration-helper.js";
1
+ export{mfeBridge}from"./mfe-bridge.js";export{AuthProvider,useAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{CART_CHANNELS,useCartActions,useCartStore}from"./cart.js";export{SsrCartProvider}from"./cart.ssr.js";export{MfeLink,MfeNavigateReactProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard,useHydration}from"./hydration-helper.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mfe-bridge.js","sources":["../../src/mfe-shared/mfe-bridge.tsx"],"sourcesContent":["import { isBrowser } from './environment'\r\n\r\n/**\r\n * Callback function type for event subscribers\r\n * @template T Type of payload data\r\n */\r\ntype Callback<T = any> = (payload: T) => void\r\n\r\n/**\r\n * Middleware function type for intercepting events\r\n * @returns boolean|void Return false to cancel event propagation\r\n */\r\ntype Middleware = (channel: string, payload: any) => boolean | void\r\n\r\n/**\r\n * MfeBridge - Event-based communication system for micro-frontends\r\n * \r\n * This class provides a way for different micro-frontends to communicate\r\n * with each other via a publish/subscribe pattern using CustomEvents.\r\n * Includes SSR compatibility checks.\r\n */\r\nclass MfeBridge {\r\n private middlewares: Middleware[] = []\r\n\r\n /**\r\n * Subscribe to events on a specific channel\r\n * @template T Type of payload data\r\n * @param channel The channel to subscribe to\r\n * @param callback Function to call when an event occurs on this channel\r\n * @returns Unsubscribe function to remove the event listener\r\n */\r\n subscribe<T = any>(channel: string, callback: Callback<T>) {\r\n // No-op function for SSR environment\r\n const noop = () => {}\r\n \r\n // If not in browser environment, return no-op\r\n if (!isBrowser()) {\r\n return noop\r\n }\r\n\r\n const handler = (e: Event) => {\r\n const customEvent = e as CustomEvent\r\n if (customEvent.detail?.__channel === channel) {\r\n callback(customEvent.detail.payload)\r\n }\r\n }\r\n\r\n window.addEventListener(channel, handler)\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n if (isBrowser()) {\r\n window.removeEventListener(channel, handler)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Publish an event to a specific channel\r\n * @template T Type of payload data\r\n * @param channel The channel to publish to\r\n * @param payload Data to send with the event\r\n */\r\n publish<T = any>(channel: string, payload: T) {\r\n // Skip in SSR environment\r\n if (!isBrowser()) {\r\n return\r\n }\r\n \r\n // Run through middleware stack\r\n for (const mw of this.middlewares) {\r\n const result = mw(channel, payload)\r\n if (result === false) return // middleware can cancel\r\n }\r\n\r\n const event = new CustomEvent(channel, { detail: { __channel: channel, payload } })\r\n window.dispatchEvent(event)\r\n }\r\n\r\n /**\r\n * Add middleware to intercept events before they're published\r\n * @param middleware Function that can inspect or modify events\r\n */\r\n use(middleware: Middleware) {\r\n this.middlewares.push(middleware)\r\n }\r\n\r\n /**\r\n * Remove all middleware\r\n */\r\n clearMiddlewares() {\r\n this.middlewares = []\r\n }\r\n}\r\n\r\n// Export a singleton instance to be used throughout the application\r\nexport const mfeBridge = new MfeBridge()\r\n"],"names":["mfeBridge","_createClass","MfeBridge","_classCallCheck","_defineProperty","key","value","channel","callback","isBrowser","handler","e","_customEvent$detail","customEvent","detail","__channel","payload","window","addEventListener","removeEventListener","_step","_iterator","_createForOfIteratorHelper","this","middlewares","s","n","done","mw","err","f","event","CustomEvent","dispatchEvent","middleware","push"],"mappings":"2LAcA,IAkFaA,EAAY,IA3EV,WACyB,OAAAC,GADzB,SAAAC,IAAAC,OAAAD,GAAAE,qBACuB,GAAE,GAAA,CAAA,CAAAC,IAAA,YAAAC,MAStC,SAAmBC,EAAiBC,GAKlC,IAAKC,IACH,OAJW,WAAQ,EAOrB,IAAMC,EAAU,SAACC,GAAY,IAAAC,EACrBC,EAAcF,GACE,QAAlBC,EAAAC,EAAYC,cAAM,IAAAF,OAAA,EAAlBA,EAAoBG,aAAcR,GACpCC,EAASK,EAAYC,OAAOE,QAE/B,EAKD,OAHAC,OAAOC,iBAAiBX,EAASG,GAG1B,WACDD,KACFQ,OAAOE,oBAAoBZ,EAASG,EAEvC,CACH,GAEA,CAAAL,IAAA,UAAAC,MAMA,SAAiBC,EAAiBS,GAEhC,GAAKP,IAAL,CAIA,IACiCW,EADjCC,EAAAC,EACiBC,KAAKC,aAAW,IAAjC,IAAAH,EAAAI,MAAAL,EAAAC,EAAAK,KAAAC,MAAmC,CAEjC,IAAe,KADAC,EADJR,EAAAd,OACOC,EAASS,GACL,MACvB,CAAA,CAAA,MAAAa,GAAAR,EAAAV,EAAAkB,EAAA,CAAA,QAAAR,EAAAS,GAAA,CAED,IAAMC,EAAQ,IAAIC,YAAYzB,EAAS,CAAEO,OAAQ,CAAEC,UAAWR,EAASS,QAAAA,KACvEC,OAAOgB,cAAcF,EATpB,CAUH,GAEA,CAAA1B,IAAA,MAAAC,MAIA,SAAI4B,GACFX,KAAKC,YAAYW,KAAKD,EACxB,GAEA,CAAA7B,IAAA,mBAAAC,MAGA,WACEiB,KAAKC,YAAc,EACrB,IAAC,CAvEY"}
1
+ {"version":3,"file":"mfe-bridge.js","sources":["../../src/mfe-shared/mfe-bridge.tsx"],"sourcesContent":["import { isBrowser } from './environment'\r\n\r\n/**\r\n * Callback function type for event subscribers\r\n * @template T Type of payload data\r\n */\r\ntype ICallback<T = any> = (payload: T) => void\r\n\r\n/**\r\n * Middleware function type for intercepting events\r\n * @returns boolean|void Return false to cancel event propagation\r\n */\r\ntype IMiddleware = (channel: string, payload: any) => boolean | void\r\n\r\n/**\r\n * MfeBridge - Event-based communication system for micro-frontends\r\n *\r\n * This class provides a way for different micro-frontends to communicate\r\n * with each other via a publish/subscribe pattern using CustomEvents.\r\n * Includes SSR compatibility checks.\r\n */\r\nclass MfeBridge {\r\n private middlewares: IMiddleware[] = []\r\n\r\n /**\r\n * Subscribe to events on a specific channel\r\n * @template T Type of payload data\r\n * @param channel The channel to subscribe to\r\n * @param callback Function to call when an event occurs on this channel\r\n * @returns Unsubscribe function to remove the event listener\r\n */\r\n subscribe<T = any>(channel: string, callback: ICallback<T>) {\r\n // No-op function for SSR environment\r\n const noop = () => {}\r\n\r\n // If not in browser environment, return no-op\r\n if (!isBrowser()) {\r\n return noop\r\n }\r\n\r\n const handler = (e: Event) => {\r\n const customEvent = e as CustomEvent\r\n if (customEvent.detail?.__channel === channel) {\r\n callback(customEvent.detail.payload)\r\n }\r\n }\r\n\r\n window.addEventListener(channel, handler)\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n if (isBrowser()) {\r\n window.removeEventListener(channel, handler)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Publish an event to a specific channel\r\n * @template T Type of payload data\r\n * @param channel The channel to publish to\r\n * @param payload Data to send with the event\r\n */\r\n publish<T = any>(channel: string, payload: T) {\r\n // Skip in SSR environment\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Run through middleware stack\r\n for (const mw of this.middlewares) {\r\n const result = mw(channel, payload)\r\n if (result === false) return // middleware can cancel\r\n }\r\n\r\n const event = new CustomEvent(channel, { detail: { __channel: channel, payload } })\r\n window.dispatchEvent(event)\r\n }\r\n\r\n /**\r\n * Add middleware to intercept events before they're published\r\n * @param middleware Function that can inspect or modify events\r\n */\r\n use(middleware: IMiddleware) {\r\n this.middlewares.push(middleware)\r\n }\r\n\r\n /**\r\n * Remove all middleware\r\n */\r\n clearMiddlewares() {\r\n this.middlewares = []\r\n }\r\n}\r\n\r\n// Export a singleton instance to be used throughout the application\r\nexport const mfeBridge = new MfeBridge()\r\n"],"names":["mfeBridge","_createClass","MfeBridge","_classCallCheck","_defineProperty","key","value","channel","callback","isBrowser","handler","e","_customEvent$detail","customEvent","detail","__channel","payload","window","addEventListener","removeEventListener","_step","_iterator","_createForOfIteratorHelper","this","middlewares","s","n","done","mw","err","f","event","CustomEvent","dispatchEvent","middleware","push"],"mappings":"2LAcA,IAkFaA,EAAY,IA3EV,WAC0B,OAAAC,GAD1B,SAAAC,IAAAC,OAAAD,GAAAE,qBACwB,GAAE,GAAA,CAAA,CAAAC,IAAA,YAAAC,MASvC,SAAmBC,EAAiBC,GAKlC,IAAKC,IACH,OAJW,WAAQ,EAOrB,IAAMC,EAAU,SAACC,GAAY,IAAAC,EACrBC,EAAcF,GACE,QAAlBC,EAAAC,EAAYC,cAAM,IAAAF,OAAA,EAAlBA,EAAoBG,aAAcR,GACpCC,EAASK,EAAYC,OAAOE,QAE/B,EAKD,OAHAC,OAAOC,iBAAiBX,EAASG,GAG1B,WACDD,KACFQ,OAAOE,oBAAoBZ,EAASG,EAEvC,CACH,GAEA,CAAAL,IAAA,UAAAC,MAMA,SAAiBC,EAAiBS,GAEhC,GAAKP,IAAL,CAIA,IACiCW,EADjCC,EAAAC,EACiBC,KAAKC,aAAW,IAAjC,IAAAH,EAAAI,MAAAL,EAAAC,EAAAK,KAAAC,MAAmC,CAEjC,IAAe,KADAC,EADJR,EAAAd,OACOC,EAASS,GACL,MACvB,CAAA,CAAA,MAAAa,GAAAR,EAAAV,EAAAkB,EAAA,CAAA,QAAAR,EAAAS,GAAA,CAED,IAAMC,EAAQ,IAAIC,YAAYzB,EAAS,CAAEO,OAAQ,CAAEC,UAAWR,EAASS,QAAAA,KACvEC,OAAOgB,cAAcF,EATpB,CAUH,GAEA,CAAA1B,IAAA,MAAAC,MAIA,SAAI4B,GACFX,KAAKC,YAAYW,KAAKD,EACxB,GAEA,CAAA7B,IAAA,mBAAAC,MAGA,WACEiB,KAAKC,YAAc,EACrB,IAAC,CAvEY"}
@@ -0,0 +1,2 @@
1
+ // Re-export types from mfe-shared submodule
2
+ export * from './types/mfe-shared/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from mfe-shared submodule
2
+ module.exports = require('./mfe-shared/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from mfe-shared submodule (ESM)
2
+ export * from './mfe-shared/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from redux submodule
2
+ export * from './types/redux/index';
package/dist/redux.js ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from redux submodule
2
+ module.exports = require('./redux/index.js');
package/dist/redux.mjs ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from redux submodule (ESM)
2
+ export * from './redux/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from table-grid submodule
2
+ export * from './types/table-grid/index';
@@ -0,0 +1,2 @@
1
+ // Re-export from table-grid submodule
2
+ module.exports = require('./table-grid/index.js');
@@ -0,0 +1,2 @@
1
+ // Re-export from table-grid submodule (ESM)
2
+ export * from './table-grid/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export types from table submodule
2
+ export * from './types/table/index';
package/dist/table.js ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from table submodule
2
+ module.exports = require('./table/index.js');
package/dist/table.mjs ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from table submodule (ESM)
2
+ export * from './table/index.js';
@@ -1,19 +1,25 @@
1
1
  import React from 'react';
2
- import { AuthState, User } from './auth.types';
3
- interface ILoginParams {
2
+ import { IAuthState, IUser } from './auth.types';
3
+ /**
4
+ * Login parameters structure
5
+ */
6
+ export interface ILoginParams {
4
7
  username: string;
5
8
  password: string;
6
9
  }
7
- interface ILoginResponse {
10
+ /**
11
+ * Login response structure
12
+ */
13
+ export interface ILoginResponse {
8
14
  isAuthenticated: boolean;
9
- user?: User;
15
+ user?: IUser;
10
16
  error?: string;
11
17
  }
12
18
  export interface IAuthProviderProps {
13
19
  children?: React.ReactNode;
14
20
  onLogin?: (params: ILoginParams) => Promise<ILoginResponse | void>;
15
21
  onLogout?: () => Promise<boolean | void>;
16
- initialState?: AuthState;
22
+ initialState?: IAuthState;
17
23
  authData?: {
18
24
  id?: string;
19
25
  displayName?: string;
@@ -22,7 +28,7 @@ export interface IAuthProviderProps {
22
28
  roles?: string[];
23
29
  [key: string]: any;
24
30
  };
25
- onAuthChange?: (callback: (newState: AuthState) => void) => () => void;
31
+ onAuthChange?: (callback: (newState: IAuthState) => void) => () => void;
26
32
  }
27
33
  /**
28
34
  * AuthProvider - Component for Host application
@@ -38,8 +44,7 @@ export declare function useAuth(): {
38
44
  logout: () => void;
39
45
  isAuthenticated: boolean;
40
46
  isLoading: boolean;
41
- user: User | null;
47
+ user: IUser | null;
42
48
  error: string | null;
43
49
  serverRendered?: boolean | undefined;
44
50
  };
45
- export {};
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { AuthState, User } from './auth.types';
2
+ import { IAuthState, IUser } from './auth.types';
3
3
  import { type IAuthProviderProps } from './auth';
4
4
  /**
5
5
  * Props for the SSR-compatible auth provider
@@ -8,9 +8,9 @@ interface ISsrAuthProviderProps {
8
8
  /** Content to render */
9
9
  children: React.ReactNode;
10
10
  /** Initial auth state for SSR */
11
- initialAuthState?: AuthState;
11
+ initialAuthState?: IAuthState;
12
12
  /** User data for initial state */
13
- userData?: User;
13
+ userData?: IUser;
14
14
  /** Custom auth data to be passed to AuthProvider */
15
15
  authData?: {
16
16
  id?: string;
@@ -7,7 +7,7 @@
7
7
  /**
8
8
  * User data structure
9
9
  */
10
- export type User = {
10
+ export type IUser = {
11
11
  /** Unique identifier for the user */
12
12
  id: string;
13
13
  /** User's display name */
@@ -22,13 +22,13 @@ export type User = {
22
22
  /**
23
23
  * Authentication state structure
24
24
  */
25
- export type AuthState = {
25
+ export type IAuthState = {
26
26
  /** Whether the user is currently authenticated */
27
27
  isAuthenticated: boolean;
28
28
  /** Whether an authentication operation is in progress */
29
29
  isLoading: boolean;
30
30
  /** The authenticated user, or null if not authenticated */
31
- user: User | null;
31
+ user: IUser | null;
32
32
  /** Error message if authentication failed, or null */
33
33
  error: string | null;
34
34
  /** Whether the auth state was rendered on the server */
@@ -50,4 +50,4 @@ export declare const AUTH_CHANNELS: {
50
50
  /**
51
51
  * Default authentication state - unauthenticated, not loading, no user, no error
52
52
  */
53
- export declare const INITIAL_AUTH_STATE: AuthState;
53
+ export declare const INITIAL_AUTH_STATE: IAuthState;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- interface DebugPanelProps {
2
+ interface IDebugPanelProps {
3
3
  title?: string;
4
4
  style?: React.CSSProperties;
5
5
  channelPrefix?: string;
6
6
  }
7
- export declare const MfeCartDebugPanel: React.FC<DebugPanelProps>;
7
+ export declare const MfeCartDebugPanel: React.FC<IDebugPanelProps>;
8
8
  export default MfeCartDebugPanel;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  /**
3
3
  * Hydration state for components
4
4
  */
5
- export declare enum HydrationState {
5
+ export declare enum IHydrationState {
6
6
  /** Component is rendering on the server */
7
7
  SERVER = "server",
8
8
  /** Component is in the process of hydrating on the client */
@@ -13,7 +13,7 @@ export declare enum HydrationState {
13
13
  /**
14
14
  * Props for the HydrationGuard component
15
15
  */
16
- export interface HydrationGuardProps {
16
+ export interface IHydrationGuardProps {
17
17
  /** Content to render */
18
18
  children: React.ReactNode;
19
19
  /** Optional fallback content to show during server rendering */
@@ -33,7 +33,7 @@ export interface HydrationGuardProps {
33
33
  * and client-side hydration, allowing different content to be shown during
34
34
  * different stages of the hydration process.
35
35
  */
36
- export declare const HydrationGuard: React.FC<HydrationGuardProps>;
36
+ export declare const HydrationGuard: React.FC<IHydrationGuardProps>;
37
37
  /**
38
38
  * Hook to get the current hydration state
39
39
  *
@@ -43,4 +43,4 @@ export declare const HydrationGuard: React.FC<HydrationGuardProps>;
43
43
  * @param hydrationDelay Optional delay before considering the component hydrated
44
44
  * @returns Current hydration state
45
45
  */
46
- export declare const useHydration: (hydrationDelay?: number) => HydrationState;
46
+ export declare const useHydration: (hydrationDelay?: number) => IHydrationState;
@@ -5,9 +5,10 @@
5
5
  * Only the public API is exported here, internal implementation details are hidden.
6
6
  */
7
7
  export { mfeBridge } from './mfe-bridge';
8
- export { AuthProvider, type IAuthProviderProps } from './auth';
8
+ export { AuthProvider } from './auth';
9
+ export type { IAuthProviderProps, ILoginParams, ILoginResponse } from './auth';
9
10
  export { useAuth } from './auth';
10
- export { type AuthState, type User } from './auth.types';
11
+ export type { IAuthState, IUser } from './auth.types';
11
12
  export { AUTH_CHANNELS } from './auth.types';
12
13
  export { SsrAuthProvider } from './auth.ssr';
13
14
  export { useCartStore, useCartActions } from './cart';
@@ -15,7 +16,8 @@ export type { ICartItem } from './cart';
15
16
  export { CART_CHANNELS } from './cart';
16
17
  export { SsrCartProvider } from './cart.ssr';
17
18
  export { useMfeNavigate, MfeLink, MfeNavigateReactProvider } from './navigation';
18
- export type { IMfeNavigate, IMfeLinkProps } from './navigation';
19
+ export type { IMfeNavigate, IMfeLinkProps, NavigateFunction, AppSite, IMfeNavigateReactProviderProps } from './navigation';
19
20
  export { NAVIGATION_CHANNELS } from './navigation';
20
21
  export { isBrowser } from './environment';
21
- export { HydrationGuard } from './hydration-helper';
22
+ export { HydrationGuard, useHydration } from './hydration-helper';
23
+ export type { IHydrationState } from './hydration-helper';
@@ -2,12 +2,12 @@
2
2
  * Callback function type for event subscribers
3
3
  * @template T Type of payload data
4
4
  */
5
- type Callback<T = any> = (payload: T) => void;
5
+ type ICallback<T = any> = (payload: T) => void;
6
6
  /**
7
7
  * Middleware function type for intercepting events
8
8
  * @returns boolean|void Return false to cancel event propagation
9
9
  */
10
- type Middleware = (channel: string, payload: any) => boolean | void;
10
+ type IMiddleware = (channel: string, payload: any) => boolean | void;
11
11
  /**
12
12
  * MfeBridge - Event-based communication system for micro-frontends
13
13
  *
@@ -24,7 +24,7 @@ declare class MfeBridge {
24
24
  * @param callback Function to call when an event occurs on this channel
25
25
  * @returns Unsubscribe function to remove the event listener
26
26
  */
27
- subscribe<T = any>(channel: string, callback: Callback<T>): () => void;
27
+ subscribe<T = any>(channel: string, callback: ICallback<T>): () => void;
28
28
  /**
29
29
  * Publish an event to a specific channel
30
30
  * @template T Type of payload data
@@ -36,7 +36,7 @@ declare class MfeBridge {
36
36
  * Add middleware to intercept events before they're published
37
37
  * @param middleware Function that can inspect or modify events
38
38
  */
39
- use(middleware: Middleware): void;
39
+ use(middleware: IMiddleware): void;
40
40
  /**
41
41
  * Remove all middleware
42
42
  */
@@ -4,8 +4,8 @@
4
4
  * This file is used to re-export all types from the library
5
5
  * to ensure they're available to consumers.
6
6
  */
7
- export * from './auth.types';
8
- export type { IAuthProviderProps } from './auth';
9
- export type { HydrationState } from './hydration-helper';
10
- export type { AppSite, IMfeNavigate, IMfeNavigateHref, IMfeLinkProps, NavigateFunction, IMfeNavigateReactProviderProps } from './navigation';
7
+ export type { IAuthState, IUser } from './auth.types';
8
+ export type { IAuthProviderProps, ILoginParams, ILoginResponse } from './auth';
11
9
  export type { ICartItem } from './cart';
10
+ export type { AppSite, IMfeNavigate, IMfeNavigateHref, IMfeLinkProps, NavigateFunction, IMfeNavigateReactProviderProps } from './navigation';
11
+ export type { IHydrationState } from './hydration-helper';
@@ -0,0 +1,2 @@
1
+ // Re-export types from utils submodule
2
+ export * from './types/utils/index';
package/dist/utils.js ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from utils submodule
2
+ module.exports = require('./utils/index.js');
package/dist/utils.mjs ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from utils submodule (ESM)
2
+ export * from './utils/index.js';