dinocollab-core 2.0.11 → 2.0.12

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.
@@ -1,2 +1,2 @@
1
- export{mfeBridge}from"./mfe-bridge.js";export{MfeAuthProvider,useMfeAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{useMfeCartActions,useMfeCartData,useMfeCartStore}from"./cart.js";export{CART_CHANNELS}from"./cart.types.js";export{CART_STORAGE_KEY,MfeCartStorage as MfeCartLocalStorage,createMfeCartStorage}from"./cart.local-storage.js";export{SsrCartProvider}from"./cart.ssr.js";export{MfeLink,MfeNavigateProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard,useHydration}from"./hydration-helper.js";export{MfeAuthDebugPanel}from"./auth.debug.js";export{MfeCartDebugPanel}from"./cart.debug.js";export{MfeNavigateDebugPanel}from"./navigation.debug.js";
1
+ export{mfeBridge}from"./mfe-bridge.js";export{MfeAuthProvider,useMfeAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{MfeLink,MfeNavigateProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard,useHydration}from"./hydration-helper.js";export{MfeAuthDebugPanel}from"./auth.debug.js";export{MfeNavigateDebugPanel}from"./navigation.debug.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -11,10 +11,6 @@ export { useMfeAuth } from './auth';
11
11
  export type { IAuthState, IUser } from './auth.types';
12
12
  export { AUTH_CHANNELS } from './auth.types';
13
13
  export { SsrAuthProvider } from './auth.ssr';
14
- export { useMfeCartStore, useMfeCartActions, useMfeCartData } from './cart';
15
- export { CART_CHANNELS } from './cart.types';
16
- export { MfeCartStorage as MfeCartLocalStorage, createMfeCartStorage, CART_STORAGE_KEY } from './cart.local-storage';
17
- export { SsrCartProvider } from './cart.ssr';
18
14
  export { useMfeNavigate, MfeLink, MfeNavigateProvider } from './navigation';
19
15
  export type { IMfeNavigate, IMfeLinkProps, NavigateFunction, AppSite, IMfeNavigateProviderProps } from './navigation';
20
16
  export { NAVIGATION_CHANNELS } from './navigation';
@@ -22,5 +18,4 @@ export { isBrowser } from './environment';
22
18
  export { HydrationGuard, useHydration } from './hydration-helper';
23
19
  export type { IHydrationState } from './hydration-helper';
24
20
  export { MfeAuthDebugPanel } from './auth.debug';
25
- export { MfeCartDebugPanel } from './cart.debug';
26
21
  export { MfeNavigateDebugPanel } from './navigation.debug';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.0.11",
3
+ "version": "2.0.12",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -1,2 +0,0 @@
1
- import{slicedToArray as e,objectSpread2 as t,defineProperty as r,toConsumableArray as n}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as i,jsx as a}from"react/jsx-runtime";import{useState as o,useEffect as l}from"react";var d=function(d){var c,s,u=o({}),f=e(u,2),m=f[0],p=f[1],v=d.channelPrefix||"mfe:cart:";return l((function(){var e=["mfe:cart:add","mfe:cart:remove","mfe:cart:clear","mfe:cart:init_request","mfe:cart:init_response","mfe:cart:update"],i=function(e){var i=e,a=i.type;i.detail&&a.startsWith(v)&&p((function(e){var o,l,d=(null===(o=e[a])||void 0===o?void 0:o.history)||[];return t(t({},e),{},r({},a,{channel:a,history:[].concat(n(d),[{channel:a,payload:(null===(l=i.detail)||void 0===l?void 0:l.payload)||i.detail,timestamp:Date.now()}]).slice(-20)}))}))};return e.forEach((function(e){window.addEventListener(e,i)})),function(){e.forEach((function(e){window.removeEventListener(e,i)}))}}),[v]),i("div",{style:t({position:"fixed",width:400,maxHeight:400,overflow:"auto",background:"#222",color:"#fff",zIndex:9999,fontSize:12,padding:8,borderRadius:8},null!==(c=d.style)&&void 0!==c?c:{bottom:0,right:0}),children:[a("strong",{children:null!==(s=d.title)&&void 0!==s?s:"MFE Event Bridge Debug Panel"}),0===Object.values(m).length&&a("div",{children:"No event activity yet."}),Object.values(m).map((function(e){return i("div",{style:{marginTop:8,borderTop:"1px solid #444",paddingTop:4},children:[i("div",{children:[a("b",{children:"Channel:"})," ",e.channel]}),a("div",{style:{maxHeight:120,overflow:"auto",background:"#333",padding:4,borderRadius:4},children:e.history.map((function(e,t){return i("div",{style:{marginBottom:2},children:[i("span",{style:{color:"#aaa"},children:[new Date(e.timestamp).toLocaleTimeString(),":"]}),a("pre",{style:{display:"inline",margin:0,color:"#0f0"},children:JSON.stringify(e.payload,null,2)})]},t)}))})]},e.channel)}))]})};export{d as MfeCartDebugPanel,d as default};
2
- //# sourceMappingURL=cart.debug.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cart.debug.js","sources":["../../src/mfe-shared/cart.debug.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\n\r\ninterface IEventHistoryEntry {\r\n channel: string\r\n payload: any\r\n timestamp: number\r\n}\r\n\r\ninterface IEventDebugData {\r\n channel: string\r\n history: IEventHistoryEntry[]\r\n}\r\n\r\ninterface IDebugPanelProps {\r\n title?: string\r\n style?: React.CSSProperties\r\n channelPrefix?: string\r\n}\r\n\r\nexport const MfeCartDebugPanel: React.FC<IDebugPanelProps> = (props) => {\r\n const [events, setEvents] = useState<Record<string, IEventDebugData>>({})\r\n const channelPrefix = props.channelPrefix || 'mfe:cart:'\r\n\r\n useEffect(() => {\r\n const cartChannels = ['mfe:cart:add', 'mfe:cart:remove', 'mfe:cart:clear', 'mfe:cart:init_request', 'mfe:cart:init_response', 'mfe:cart:update']\r\n\r\n const handleEvent = (e: Event) => {\r\n const customEvent = e as CustomEvent\r\n const channel = customEvent.type\r\n\r\n if (customEvent.detail && channel.startsWith(channelPrefix)) {\r\n setEvents((prev) => {\r\n const prevHistory = prev[channel]?.history || []\r\n return {\r\n ...prev,\r\n [channel]: {\r\n channel,\r\n history: [\r\n ...prevHistory,\r\n {\r\n channel,\r\n payload: customEvent.detail?.payload || customEvent.detail,\r\n timestamp: Date.now()\r\n }\r\n ].slice(-20) // keep last 20\r\n }\r\n }\r\n })\r\n }\r\n }\r\n\r\n // Listen to cart events\r\n cartChannels.forEach((channel) => {\r\n window.addEventListener(channel, handleEvent)\r\n })\r\n\r\n // Clean up\r\n return () => {\r\n cartChannels.forEach((channel) => {\r\n window.removeEventListener(channel, handleEvent)\r\n })\r\n }\r\n }, [channelPrefix])\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n width: 400,\r\n maxHeight: 400,\r\n overflow: 'auto',\r\n background: '#222',\r\n color: '#fff',\r\n zIndex: 9999,\r\n fontSize: 12,\r\n padding: 8,\r\n borderRadius: 8,\r\n ...(props.style ?? { bottom: 0, right: 0 })\r\n }}\r\n >\r\n <strong>{props.title ?? 'MFE Event Bridge Debug Panel'}</strong>\r\n {Object.values(events).length === 0 && <div>No event activity yet.</div>}\r\n {Object.values(events).map((eventData) => (\r\n <div key={eventData.channel} style={{ marginTop: 8, borderTop: '1px solid #444', paddingTop: 4 }}>\r\n <div>\r\n <b>Channel:</b> {eventData.channel}\r\n </div>\r\n <div style={{ maxHeight: 120, overflow: 'auto', background: '#333', padding: 4, borderRadius: 4 }}>\r\n {eventData.history.map((entry, idx) => (\r\n <div key={idx} style={{ marginBottom: 2 }}>\r\n <span style={{ color: '#aaa' }}>{new Date(entry.timestamp).toLocaleTimeString()}:</span>\r\n <pre style={{ display: 'inline', margin: 0, color: '#0f0' }}>{JSON.stringify(entry.payload, null, 2)}</pre>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport default MfeCartDebugPanel\r\n"],"names":["MfeCartDebugPanel","props","_props$style","_props$title","_useState","useState","_useState2","_slicedToArray","events","setEvents","channelPrefix","useEffect","cartChannels","handleEvent","e","customEvent","channel","type","detail","startsWith","prev","_prev$channel","_customEvent$detail","prevHistory","history","_objectSpread","_defineProperty","concat","_toConsumableArray","payload","timestamp","Date","now","slice","forEach","window","addEventListener","removeEventListener","_jsxs","style","position","width","maxHeight","overflow","background","color","zIndex","fontSize","padding","borderRadius","bottom","right","children","_jsx","title","Object","values","length","map","eventData","marginTop","borderTop","paddingTop","entry","idx","marginBottom","toLocaleTimeString","display","margin","JSON","stringify"],"mappings":"6OAmBaA,EAAgD,SAACC,GAAS,IAAAC,EAAAC,EACrEC,EAA4BC,EAA0C,IAAGC,EAAAC,EAAAH,EAAA,GAAlEI,EAAMF,EAAA,GAAEG,EAASH,EAAA,GAClBI,EAAgBT,EAAMS,eAAiB,YA2C7C,OAzCAC,GAAU,WACR,IAAMC,EAAe,CAAC,eAAgB,kBAAmB,iBAAkB,wBAAyB,yBAA0B,mBAExHC,EAAc,SAACC,GACnB,IAAMC,EAAcD,EACdE,EAAUD,EAAYE,KAExBF,EAAYG,QAAUF,EAAQG,WAAWT,IAC3CD,GAAU,SAACW,GAAQ,IAAAC,EAAAC,EACXC,GAA2B,QAAbF,EAAAD,EAAKJ,UAALK,IAAaA,OAAbA,EAAAA,EAAeG,UAAW,GAC9C,OAAAC,EAAAA,EAAA,GACKL,GAAIM,GAAAA,EACNV,CAAAA,EAAAA,EAAU,CACTA,QAAAA,EACAQ,QAAS,GAAAG,OAAAC,EACJL,GACH,CAAA,CACEP,QAAAA,EACAa,SAA2B,QAAlBP,EAAAP,EAAYG,cAAM,IAAAI,OAAA,EAAlBA,EAAoBO,UAAWd,EAAYG,OACpDY,UAAWC,KAAKC,SAElBC,aAGR,GAEH,EAQD,OALArB,EAAasB,SAAQ,SAAClB,GACpBmB,OAAOC,iBAAiBpB,EAASH,EACnC,IAGO,WACLD,EAAasB,SAAQ,SAAClB,GACpBmB,OAAOE,oBAAoBrB,EAASH,EACtC,GACD,CACH,GAAG,CAACH,IAGF4B,EACE,MAAA,CAAAC,MAAKd,EAAA,CACHe,SAAU,QACVC,MAAO,IACPC,UAAW,IACXC,SAAU,OACVC,WAAY,OACZC,MAAO,OACPC,OAAQ,KACRC,SAAU,GACVC,QAAS,EACTC,aAAc,GACC/C,QADAA,EACXD,EAAMsC,aAAKrC,IAAAA,EAAAA,EAAI,CAAEgD,OAAQ,EAAGC,MAAO,IACxCC,SAAA,CAEDC,qBAAoBlD,UAAXF,EAAMqD,aAAKnD,IAAAA,EAAAA,EAAI,iCACU,IAAjCoD,OAAOC,OAAOhD,GAAQiD,QAAgBJ,EAAA,MAAA,CAAAD,SAAA,2BACtCG,OAAOC,OAAOhD,GAAQkD,KAAI,SAACC,GAAS,OACnCrB,SAA6BC,MAAO,CAAEqB,UAAW,EAAGC,UAAW,iBAAkBC,WAAY,GAAGV,SAAA,CAC9Fd,EACE,MAAA,CAAAc,SAAA,CAAAC,EAAA,IAAA,CAAAD,SAAA,iBAAiBO,EAAU3C,WAE7BqC,SAAKd,MAAO,CAAEG,UAAW,IAAKC,SAAU,OAAQC,WAAY,OAAQI,QAAS,EAAGC,aAAc,GAC3FG,SAAAO,EAAUnC,QAAQkC,KAAI,SAACK,EAAOC,GAAG,OAChC1B,SAAeC,MAAO,CAAE0B,aAAc,GAAGb,SAAA,CACvCd,EAAM,OAAA,CAAAC,MAAO,CAAEM,MAAO,kBAAW,IAAId,KAAKgC,EAAMjC,WAAWoC,qBAAoB,OAC/Eb,EAAK,MAAA,CAAAd,MAAO,CAAE4B,QAAS,SAAUC,OAAQ,EAAGvB,MAAO,QAAWO,SAAAiB,KAAKC,UAAUP,EAAMlC,QAAS,KAAM,OAF1FmC,EAIX,QAVKL,EAAU3C,QAYd,MAId"}
@@ -1,2 +0,0 @@
1
- import{slicedToArray as t,toConsumableArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as n,useState as i,useRef as e,useCallback as u,useEffect as f}from"react";import{mfeBridge as s}from"./mfe-bridge.js";import{isBrowser as o}from"./environment.js";import{CART_CHANNELS as a}from"./cart.types.js";import{CART_STORAGE_KEY as c,MfeCartStorage as l}from"./cart.local-storage.js";function g(g){var E=(null==g?void 0:g.storageKey)||c,b=n((function(){return new l(E)}),[E]),N=n((function(){return g.idGetter}),[null==g?void 0:g.idGetter]),S=i([]),p=t(S,2),v=p[0],m=p[1],y=e(!1),O=e(!1),D=u((function(t){O.current&&s.publish(a.STATE_CHANGE,t)}),[]);return f((function(){if(o()){var t=b.getData();t&&t.length>0&&(m(t),y.current=!0,O.current=!0);var n=s.subscribe(a.ADD,(function(t){m((function(n){var i,e=N(t),u=n.findIndex((function(t){return N(t)===e}));if(u>=0?(i=r(n))[u]=t:i=[].concat(r(n),[t]),JSON.stringify(i)!==JSON.stringify(n)){if(o()){var f=b.getData();JSON.stringify(i)!==JSON.stringify(f)&&b.setData(i,{skipEvent:!0})}return D(i),i}return n}))})),i=s.subscribe(a.REMOVE,(function(t){m((function(r){var n=r.filter((function(r){return N(r)!==t.id}));if(JSON.stringify(n)!==JSON.stringify(r)){if(o()){var i=b.getData();JSON.stringify(n)!==JSON.stringify(i)&&b.setData(n,{skipEvent:!0})}return D(n),n}return r}))})),e=s.subscribe(a.CLEAR,(function(){m([]),o()&&b.removeAll({skipEvent:!0}),D([])})),u=s.subscribe(a.UPDATE,(function(t){m((function(r){if(JSON.stringify(t)!==JSON.stringify(r)){if(o()){var n=b.getData();JSON.stringify(t)!==JSON.stringify(n)&&b.setData(t,{skipEvent:!0})}return D(t),t}return r}))})),f=s.subscribe(a.INIT_REQUEST,(function(){m((function(t){return t.length>0&&s.publish(a.INIT_RESPONSE,t),t}))})),c=s.subscribe(a.INIT_RESPONSE,(function(t){!y.current&&t&&t.length>0&&m((function(r){if(JSON.stringify(t)!==JSON.stringify(r)){if(o()){var n=b.getData();JSON.stringify(t)!==JSON.stringify(n)&&b.setData(t,{skipEvent:!0})}return y.current=!0,O.current=!0,D(t),t}return r}))}));return y.current?O.current=!0:s.publish(a.INIT_REQUEST,null),function(){n(),i(),e(),u(),f(),c()}}}),[E,N,D,b]),{items:v,totalItems:v.length}}function E(r){var e=i([]),u=t(e,2),g=u[0],E=u[1],b=r||c,N=n((function(){return new l(b)}),[b]);return f((function(){if(o()){var t=N.getData();t&&t.length>0&&E(t);var r=s.subscribe(a.STATE_CHANGE,(function(t){E(t||[])}));return function(){r()}}}),[b,N]),{items:g,totalItems:g.length}}function b(){return{addToCart:u((function(t){s.publish(a.ADD,t)}),[]),removeFromCart:u((function(t){s.publish(a.REMOVE,{id:t})}),[]),clearCart:u((function(){s.publish(a.CLEAR,null)}),[]),updateCart:u((function(t){s.publish(a.UPDATE,t)}),[])}}export{b as useMfeCartActions,E as useMfeCartData,g as useMfeCartStore};
2
- //# sourceMappingURL=cart.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cart.js","sources":["../../src/mfe-shared/cart.tsx"],"sourcesContent":["/**\r\n * cart.tsx - Shared shopping cart system for micro-frontends\r\n *\r\n * This module provides hooks for managing a shared shopping cart across\r\n * multiple micro-frontends. The cart state is synchronized using the\r\n * mfeBridge communication system and persisted in localStorage.\r\n */\r\n\r\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { isBrowser } from './environment'\r\nimport { CART_CHANNELS } from './cart.types'\r\nimport { MfeCartStorage, CART_STORAGE_KEY } from './cart.local-storage'\r\n\r\nexport interface IMfeCartStoreConfigs<T = any> {\r\n storageKey?: string\r\n idGetter: (item: T) => string\r\n}\r\n\r\n/**\r\n * Hook to manage cart state across microFE\r\n * This hook will:\r\n * - Initialize cart from localStorage\r\n * - Listen for cart events (add, remove, clear, update)\r\n * - Provide current cart state\r\n */\r\nexport function useMfeCartStore<T = any>(configs: IMfeCartStoreConfigs<T>) {\r\n // Use provided storage key or default to CART_STORAGE_KEY\r\n const cartStorageKey = configs?.storageKey || CART_STORAGE_KEY\r\n\r\n // Create CartLocalStorage instance for this storage key\r\n const cartStorage = useMemo(() => new MfeCartStorage<T>(cartStorageKey), [cartStorageKey])\r\n\r\n // Default idGetter uses ProductId, but can be customized\r\n const getItemId = useMemo(() => configs.idGetter, [configs?.idGetter])\r\n\r\n // State to hold cart items\r\n const [items, setItems] = useState<T[]>([])\r\n\r\n // Mark as initialized\r\n const initialized = useRef(false)\r\n\r\n // Ref to track if we're the primary store (to avoid multiple STATE_CHANGE emissions)\r\n const isPrimaryStore = useRef(false)\r\n\r\n // Helper to emit state change only from primary store\r\n const emitStateChange = useCallback((newItems: T[]) => {\r\n if (isPrimaryStore.current) {\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, newItems)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Restore from localStorage if available\r\n const storedItems = cartStorage.getData()\r\n if (storedItems && storedItems.length > 0) {\r\n setItems(storedItems)\r\n initialized.current = true\r\n isPrimaryStore.current = true // Mark as primary if we have data\r\n }\r\n\r\n // Subscribe to cart events\r\n const unsubAdd = mfeBridge.subscribe(CART_CHANNELS.ADD, (payload: T) => {\r\n setItems((prev) => {\r\n const itemId = getItemId(payload)\r\n const existingIndex = prev.findIndex((item) => getItemId(item) === itemId)\r\n\r\n let newItems: T[]\r\n if (existingIndex >= 0) {\r\n // Update existing item\r\n newItems = [...prev]\r\n newItems[existingIndex] = payload\r\n } else {\r\n // Add new item\r\n newItems = [...prev, payload]\r\n }\r\n\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = cartStorage.getData()\r\n if (JSON.stringify(newItems) !== JSON.stringify(current)) {\r\n // Skip event because we will emit it ourselves\r\n cartStorage.setData(newItems, { skipEvent: true })\r\n }\r\n }\r\n // Emit state change only from primary store\r\n emitStateChange(newItems)\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubRemove = mfeBridge.subscribe(CART_CHANNELS.REMOVE, (payload: { id: string }) => {\r\n setItems((prev) => {\r\n const newItems = prev.filter((item) => getItemId(item) !== payload.id)\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = cartStorage.getData()\r\n if (JSON.stringify(newItems) !== JSON.stringify(current)) {\r\n // Skip event because we will emit it ourselves\r\n cartStorage.setData(newItems, { skipEvent: true })\r\n }\r\n }\r\n // Emit state change only from primary store\r\n emitStateChange(newItems)\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubClear = mfeBridge.subscribe(CART_CHANNELS.CLEAR, () => {\r\n setItems([])\r\n if (isBrowser()) {\r\n cartStorage.removeAll({ skipEvent: true })\r\n }\r\n // Emit state change only from primary store\r\n emitStateChange([])\r\n })\r\n\r\n const unsubUpdate = mfeBridge.subscribe(CART_CHANNELS.UPDATE, (payload: T[]) => {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = cartStorage.getData()\r\n if (JSON.stringify(payload) !== JSON.stringify(current)) {\r\n cartStorage.setData(payload, { skipEvent: true })\r\n }\r\n }\r\n // Emit state change only from primary store\r\n emitStateChange(payload)\r\n return payload\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n // Subscribe to init requests from other microFEs\r\n const unsubInitReq = mfeBridge.subscribe(CART_CHANNELS.INIT_REQUEST, () => {\r\n // Use callback to get current state to avoid stale closure\r\n setItems((currentItems) => {\r\n if (currentItems.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, currentItems)\r\n }\r\n return currentItems // No change to state\r\n })\r\n })\r\n\r\n // Subscribe to init responses if state is not available\r\n const unsubInitRes = mfeBridge.subscribe(CART_CHANNELS.INIT_RESPONSE, (payload: T[]) => {\r\n if (!initialized.current && payload && payload.length > 0) {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = cartStorage.getData()\r\n if (JSON.stringify(payload) !== JSON.stringify(current)) {\r\n cartStorage.setData(payload, { skipEvent: true })\r\n }\r\n }\r\n initialized.current = true\r\n isPrimaryStore.current = true // Become primary when receiving init data\r\n // Emit state change only from primary store\r\n emitStateChange(payload)\r\n return payload\r\n }\r\n return prev\r\n })\r\n }\r\n })\r\n\r\n // When mounted, send init request (only if no state from localStorage)\r\n if (!initialized.current) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_REQUEST, null)\r\n } else {\r\n // If we have data, we become the primary store\r\n isPrimaryStore.current = true\r\n }\r\n\r\n return () => {\r\n unsubAdd()\r\n unsubRemove()\r\n unsubClear()\r\n unsubUpdate()\r\n unsubInitReq()\r\n unsubInitRes()\r\n }\r\n }, [cartStorageKey, getItemId, emitStateChange, cartStorage])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Simple hook to read cart data without configuration\r\n * Use this when you only need to display cart data and don't need to manage state\r\n * This hook synchronizes with the main cart store through STATE_CHANGE events\r\n */\r\nexport function useMfeCartData<T = any>(storageKey?: string) {\r\n const [items, setItems] = useState<T[]>([])\r\n const cartStorageKey = storageKey || CART_STORAGE_KEY\r\n\r\n // Create CartLocalStorage instance for this storage key\r\n const cartStorage = useMemo(() => new MfeCartStorage<T>(cartStorageKey), [cartStorageKey])\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Load initial data from localStorage\r\n const storedItems = cartStorage.getData()\r\n if (storedItems && storedItems.length > 0) {\r\n setItems(storedItems)\r\n }\r\n\r\n // Simply listen to STATE_CHANGE events from the main store\r\n const unsubStateChange = mfeBridge.subscribe(CART_CHANNELS.STATE_CHANGE, (payload: T[]) => {\r\n setItems(payload || [])\r\n })\r\n\r\n return () => {\r\n unsubStateChange()\r\n }\r\n }, [cartStorageKey, cartStorage])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Hook to provide cart actions\r\n * This hook will:\r\n * - Only perform actions, not manage state\r\n * - Use mfeEventBridge to communicate with other microFEs\r\n * - Provide add, remove, clear, and update actions\r\n */\r\nexport function useMfeCartActions<T = any>() {\r\n // Add item to cart\r\n const addToCart = useCallback((item: T) => {\r\n mfeBridge.publish(CART_CHANNELS.ADD, item)\r\n }, [])\r\n\r\n // Remove item from cart\r\n const removeFromCart = useCallback((id: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id })\r\n }, [])\r\n\r\n // Clear cart\r\n const clearCart = useCallback(() => {\r\n mfeBridge.publish(CART_CHANNELS.CLEAR, null)\r\n }, [])\r\n\r\n // Update entire cart\r\n const updateCart = useCallback((items: T[]) => {\r\n mfeBridge.publish(CART_CHANNELS.UPDATE, items)\r\n }, [])\r\n\r\n return {\r\n addToCart,\r\n removeFromCart,\r\n clearCart,\r\n updateCart\r\n }\r\n}\r\n"],"names":["useMfeCartStore","configs","cartStorageKey","storageKey","CART_STORAGE_KEY","cartStorage","useMemo","MfeCartStorage","getItemId","idGetter","_useState","useState","_useState2","_slicedToArray","items","setItems","initialized","useRef","isPrimaryStore","emitStateChange","useCallback","newItems","current","mfeBridge","publish","CART_CHANNELS","STATE_CHANGE","useEffect","isBrowser","storedItems","getData","length","unsubAdd","subscribe","ADD","payload","prev","itemId","existingIndex","findIndex","item","_toConsumableArray","concat","JSON","stringify","setData","skipEvent","unsubRemove","REMOVE","filter","id","unsubClear","CLEAR","removeAll","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","currentItems","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartData","_useState3","_useState4","unsubStateChange","useMfeCartActions","addToCart","removeFromCart","clearCart","updateCart"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{createClass as t,classCallCheck as e,defineProperty as r,asyncToGenerator as a,regenerator as i}from"../_virtual/_rollupPluginBabelHelpers.js";import{fetchDelay as n}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{mfeBridge as o}from"./mfe-bridge.js";import{CART_CHANNELS as s}from"./cart.types.js";var l="mfe_cart_items",u=t((function t(){var u=this,c=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l;e(this,t),r(this,"getDataAsync",(function(){return n(a(i().m((function t(){return i().w((function(t){for(;;)if(0===t.n)return t.a(2,u.getData())}),t)}))),500)})),r(this,"getData",(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.key;try{var e;return JSON.parse(null!==(e=localStorage.getItem(t))&&void 0!==e?e:"[]")}catch(t){return[]}})),r(this,"setData",(function(t,e){var r=(null==e?void 0:e.key)||u.key,a=(null==e?void 0:e.skipEvent)||!1;localStorage.setItem(r,JSON.stringify(t)),a||o.publish(s.STATE_CHANGE,t)})),r(this,"removeAll",(function(t){var e=(null==t?void 0:t.key)||u.key,r=(null==t?void 0:t.skipEvent)||!1;localStorage.removeItem(e),r||o.publish(s.STATE_CHANGE,[])})),this.key=c}));function c(t){return new u(t||l)}export{l as CART_STORAGE_KEY,u as MfeCartStorage,c as createMfeCartStorage,u as default};
2
- //# sourceMappingURL=cart.local-storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cart.local-storage.js","sources":["../../src/mfe-shared/cart.local-storage.ts"],"sourcesContent":["import { fetchDelay } from '../utils'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { CART_CHANNELS } from './cart.types'\r\n\r\n/** LocalStorage key for persisting cart items */\r\nexport const CART_STORAGE_KEY = 'mfe_cart_items'\r\n\r\nexport interface ICartStorageOptions {\r\n key?: string\r\n skipEvent?: boolean\r\n}\r\n\r\nexport class MfeCartStorage<T = any> {\r\n private key: string\r\n\r\n constructor(key: string = CART_STORAGE_KEY) {\r\n this.key = key\r\n }\r\n\r\n getDataAsync = (): Promise<T[]> => {\r\n return fetchDelay(async () => this.getData(), 500)\r\n }\r\n\r\n getData = (key: string = this.key): T[] => {\r\n try {\r\n return JSON.parse(localStorage.getItem(key) ?? '[]')\r\n } catch (error) {\r\n return []\r\n }\r\n }\r\n\r\n setData = (value: T[], options?: ICartStorageOptions) => {\r\n const key = options?.key || this.key\r\n const skipEvent = options?.skipEvent || false\r\n\r\n // Set new data\r\n localStorage.setItem(key, JSON.stringify(value))\r\n\r\n // Publish STATE_CHANGE event to synchronize with hooks (unless skipped)\r\n if (!skipEvent) {\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, value)\r\n }\r\n }\r\n\r\n removeAll = (options?: ICartStorageOptions) => {\r\n const key = options?.key || this.key\r\n const skipEvent = options?.skipEvent || false\r\n\r\n // Remove data\r\n localStorage.removeItem(key)\r\n\r\n // Publish STATE_CHANGE event to synchronize with hooks (unless skipped)\r\n if (!skipEvent) {\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, [])\r\n }\r\n }\r\n}\r\n\r\nexport default MfeCartStorage\r\n\r\nexport function createMfeCartStorage<T>(key?: string) {\r\n return new MfeCartStorage<T>(key || CART_STORAGE_KEY)\r\n}\r\n"],"names":["CART_STORAGE_KEY","MfeCartStorage","_createClass","_this","this","key","_classCallCheck","_defineProperty","fetchDelay","_asyncToGenerator","_regenerator","m","_callee","w","_context","n","a","getData","arguments","length","undefined","_localStorage$getItem","JSON","parse","localStorage","getItem","error","value","options","skipEvent","setItem","stringify","mfeBridge","publish","CART_CHANNELS","STATE_CHANGE","removeItem","createMfeCartStorage"],"mappings":"oWAKO,IAAMA,EAAmB,iBAOnBC,EAAcC,GAGzB,SAAAD,IAA0C,IAAAE,EAAAC,KAA9BC,yDAAcL,EAAgBM,OAAAL,GAAAM,uBAI3B,WACb,OAAOC,EAAUC,EAAAC,IAAAC,GAAC,SAAAC,IAAA,OAAAF,IAAAG,GAAA,SAAAC,GAAA,UAAA,IAAAA,EAAAC,EAAA,OAAAD,EAAAE,EAAA,EAAYb,EAAKc,UAAS,GAAAL,EAAA,KAAE,QAC/CL,kBAES,WAAgC,IAA/BF,EAAAa,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAcf,GAAAA,EAAKE,IAC5B,IAAI,IAAAgB,EACF,OAAOC,KAAKC,MAA+BF,QAA1BA,EAACG,aAAaC,QAAQpB,cAAIgB,EAAAA,EAAI,KAChD,CAAC,MAAOK,GACP,MAAO,EACR,KACFnB,EAESH,KAAA,WAAA,SAACuB,EAAYC,GACrB,IAAMvB,GAAMuB,aAAAA,EAAAA,EAASvB,MAAOF,EAAKE,IAC3BwB,GAAYD,aAAO,EAAPA,EAASC,aAAa,EAGxCL,aAAaM,QAAQzB,EAAKiB,KAAKS,UAAUJ,IAGpCE,GACHG,EAAUC,QAAQC,EAAcC,aAAcR,MAEjDpB,EAAAH,KAAA,aAEW,SAACwB,GACX,IAAMvB,GAAMuB,aAAAA,EAAAA,EAASvB,MAAOF,EAAKE,IAC3BwB,GAAYD,aAAO,EAAPA,EAASC,aAAa,EAGxCL,aAAaY,WAAW/B,GAGnBwB,GACHG,EAAUC,QAAQC,EAAcC,aAAc,OArChD/B,KAAKC,IAAMA,CACb,IA2CI,SAAUgC,EAAwBhC,GACtC,OAAO,IAAIJ,EAAkBI,GAAOL,EACtC"}
@@ -1,2 +0,0 @@
1
- import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as i}from"react/jsx-runtime";import{useState as e,useEffect as a}from"react";import{useMfeCartStore as o,useMfeCartActions as l}from"./cart.js";import{HydrationGuard as n}from"./hydration-helper.js";function m(m){var c=m.children,p=m.initialCartItems,s=void 0===p?[]:p,d=m.cartConfig;o(d).items;var f=l().updateCart,u=e(!1),h=r(u,2),v=h[0],j=h[1];return a((function(){!v&&s.length>0&&(f(s),j(!0))}),[v,s,f]),t(n,{serverFallback:t(i,{children:c}),hydrationDelay:100,children:c})}export{m as SsrCartProvider};
2
- //# sourceMappingURL=cart.ssr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cart.ssr.js","sources":["../../src/mfe-shared/cart.ssr.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\r\nimport { useMfeCartActions, useMfeCartStore, IMfeCartStoreConfigs } from './cart'\r\nimport { HydrationGuard } from './hydration-helper'\r\n\r\n/**\r\n * Props for the SSR-compatible cart provider\r\n */\r\ninterface ISsrCartProviderProps<T = any> {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: T[]\r\n /** Should hydrate cart from browser storage after rendering */\r\n hydrateFromStorage?: boolean\r\n /** Cart store configuration */\r\n cartConfig: IMfeCartStoreConfigs<T>\r\n}\r\n\r\n/**\r\n * Factory function to create SSR Cart Provider with specific type and config\r\n */\r\nexport function createSsrCartProvider<T = any>(cartConfig: IMfeCartStoreConfigs<T>) {\r\n return ({ children, initialCartItems = [], hydrateFromStorage = true }: Omit<ISsrCartProviderProps<T>, 'cartConfig'>) => {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n const { updateCart } = useMfeCartActions<T>()\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n // Initialize cart with provided items on first render\r\n useEffect(() => {\r\n if (!isInitialized && initialCartItems.length > 0) {\r\n updateCart(initialCartItems)\r\n setIsInitialized(true)\r\n }\r\n }, [isInitialized, initialCartItems, updateCart])\r\n\r\n return (\r\n <HydrationGuard serverFallback={<>{children}</>} hydrationDelay={100}>\r\n {children}\r\n </HydrationGuard>\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Generic SSR Cart Provider (requires cartConfig prop)\r\n */\r\nexport function SsrCartProvider<T = any>({ children, initialCartItems = [], cartConfig }: ISsrCartProviderProps<T>) {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n const { updateCart } = useMfeCartActions<T>()\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n // Initialize cart with provided items on first render\r\n useEffect(() => {\r\n if (!isInitialized && initialCartItems.length > 0) {\r\n updateCart(initialCartItems)\r\n setIsInitialized(true)\r\n }\r\n }, [isInitialized, initialCartItems, updateCart])\r\n\r\n return (\r\n <HydrationGuard serverFallback={<>{children}</>} hydrationDelay={100}>\r\n {children}\r\n </HydrationGuard>\r\n )\r\n}\r\n\r\n/**\r\n * CartItemsComponent - SSR-aware cart items display component\r\n */\r\ninterface ICartItemsComponentProps<T = any> {\r\n /** Function to render each cart item */\r\n renderItem: (item: T) => React.ReactNode\r\n /** Optional empty cart placeholder */\r\n emptyCart?: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: T[]\r\n /** Cart store configuration */\r\n cartConfig: IMfeCartStoreConfigs<T>\r\n}\r\n\r\n/**\r\n * Factory function to create CartItemsComponent with specific type and config\r\n */\r\nexport function createCartItemsComponent<T = any>(cartConfig: IMfeCartStoreConfigs<T>) {\r\n return ({ renderItem, emptyCart, initialCartItems = [] }: Omit<ICartItemsComponentProps<T>, 'cartConfig'>) => {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n\r\n return (\r\n <HydrationGuard\r\n serverFallback={\r\n <>\r\n {initialCartItems.length === 0 && emptyCart}\r\n {initialCartItems.map(renderItem)}\r\n </>\r\n }\r\n >\r\n {items.length === 0 && emptyCart}\r\n {items.map(renderItem)}\r\n </HydrationGuard>\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Generic CartItemsComponent (requires cartConfig prop)\r\n */\r\nexport function CartItemsComponent<T = any>({ renderItem, emptyCart, initialCartItems = [], cartConfig }: ICartItemsComponentProps<T>) {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n\r\n return (\r\n <HydrationGuard\r\n serverFallback={\r\n <>\r\n {initialCartItems.length === 0 && emptyCart}\r\n {initialCartItems.map(renderItem)}\r\n </>\r\n }\r\n >\r\n {items.length === 0 && emptyCart}\r\n {items.map(renderItem)}\r\n </HydrationGuard>\r\n )\r\n}\r\n"],"names":["SsrCartProvider","_ref2","children","_ref2$initialCartItem","initialCartItems","cartConfig","useMfeCartStore","items","updateCart","useMfeCartActions","_useState3","useState","_useState4","_slicedToArray","isInitialized","setIsInitialized","useEffect","length","_jsx","HydrationGuard","serverFallback","_Fragment","hydrationDelay"],"mappings":"ySA8CM,SAAUA,EAAeC,GAAmF,IAAvEC,EAAQD,EAARC,SAAQC,EAAAF,EAAEG,iBAAAA,OAAmB,IAAHD,EAAG,GAAEA,EAAEE,EAAUJ,EAAVI,WACxDC,EAAmBD,GAA7BE,MACR,IAAQC,EAAeC,IAAfD,WACRE,EAA0CC,GAAS,GAAMC,EAAAC,EAAAH,EAAA,GAAlDI,EAAaF,EAAA,GAAEG,EAAgBH,EAAA,GAUtC,OAPAI,GAAU,YACHF,GAAiBV,EAAiBa,OAAS,IAC9CT,EAAWJ,GACXW,GAAiB,GAEpB,GAAE,CAACD,EAAeV,EAAkBI,IAGnCU,EAACC,EAAe,CAAAC,eAAgBF,EAAGG,EAAA,CAAAnB,SAAAA,IAAcoB,eAAgB,aAC9DpB,GAGP"}
@@ -1,2 +0,0 @@
1
- var e={ADD:"mfe:cart:add",REMOVE:"mfe:cart:remove",CLEAR:"mfe:cart:clear",INIT_REQUEST:"mfe:cart:init_request",INIT_RESPONSE:"mfe:cart:init_response",UPDATE:"mfe:cart:update",STATE_CHANGE:"mfe:cart:state_change"};export{e as CART_CHANNELS};
2
- //# sourceMappingURL=cart.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cart.types.js","sources":["../../src/mfe-shared/cart.types.ts"],"sourcesContent":["/** Communication channels for cart operations */\r\nexport const CART_CHANNELS = {\r\n /** Add an item to the cart */\r\n ADD: 'mfe:cart:add',\r\n /** Remove an item from the cart */\r\n REMOVE: 'mfe:cart:remove',\r\n /** Clear all items from the cart */\r\n CLEAR: 'mfe:cart:clear',\r\n /** Request initial cart data (when a new MFE loads) */\r\n INIT_REQUEST: 'mfe:cart:init_request',\r\n /** Response with cart data (to initialize a new MFE) */\r\n INIT_RESPONSE: 'mfe:cart:init_response',\r\n /** Update the entire cart at once */\r\n UPDATE: 'mfe:cart:update',\r\n /** Notify all subscribers when cart state changes */\r\n STATE_CHANGE: 'mfe:cart:state_change'\r\n} as const\r\n"],"names":["CART_CHANNELS","ADD","REMOVE","CLEAR","INIT_REQUEST","INIT_RESPONSE","UPDATE","STATE_CHANGE"],"mappings":"AACO,IAAMA,EAAgB,CAE3BC,IAAK,eAELC,OAAQ,kBAERC,MAAO,iBAEPC,aAAc,wBAEdC,cAAe,yBAEfC,OAAQ,kBAERC,aAAc"}
@@ -1,44 +0,0 @@
1
- /**
2
- * cart.tsx - Shared shopping cart system for micro-frontends
3
- *
4
- * This module provides hooks for managing a shared shopping cart across
5
- * multiple micro-frontends. The cart state is synchronized using the
6
- * mfeBridge communication system and persisted in localStorage.
7
- */
8
- export interface IMfeCartStoreConfigs<T = any> {
9
- storageKey?: string;
10
- idGetter: (item: T) => string;
11
- }
12
- /**
13
- * Hook to manage cart state across microFE
14
- * This hook will:
15
- * - Initialize cart from localStorage
16
- * - Listen for cart events (add, remove, clear, update)
17
- * - Provide current cart state
18
- */
19
- export declare function useMfeCartStore<T = any>(configs: IMfeCartStoreConfigs<T>): {
20
- items: T[];
21
- totalItems: number;
22
- };
23
- /**
24
- * Simple hook to read cart data without configuration
25
- * Use this when you only need to display cart data and don't need to manage state
26
- * This hook synchronizes with the main cart store through STATE_CHANGE events
27
- */
28
- export declare function useMfeCartData<T = any>(storageKey?: string): {
29
- items: T[];
30
- totalItems: number;
31
- };
32
- /**
33
- * Hook to provide cart actions
34
- * This hook will:
35
- * - Only perform actions, not manage state
36
- * - Use mfeEventBridge to communicate with other microFEs
37
- * - Provide add, remove, clear, and update actions
38
- */
39
- export declare function useMfeCartActions<T = any>(): {
40
- addToCart: (item: T) => void;
41
- removeFromCart: (id: string) => void;
42
- clearCart: () => void;
43
- updateCart: (items: T[]) => void;
44
- };
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- interface IDebugPanelProps {
3
- title?: string;
4
- style?: React.CSSProperties;
5
- channelPrefix?: string;
6
- }
7
- export declare const MfeCartDebugPanel: React.FC<IDebugPanelProps>;
8
- export default MfeCartDebugPanel;
@@ -1,16 +0,0 @@
1
- /** LocalStorage key for persisting cart items */
2
- export declare const CART_STORAGE_KEY = "mfe_cart_items";
3
- export interface ICartStorageOptions {
4
- key?: string;
5
- skipEvent?: boolean;
6
- }
7
- export declare class MfeCartStorage<T = any> {
8
- private key;
9
- constructor(key?: string);
10
- getDataAsync: () => Promise<T[]>;
11
- getData: (key?: string) => T[];
12
- setData: (value: T[], options?: ICartStorageOptions) => void;
13
- removeAll: (options?: ICartStorageOptions) => void;
14
- }
15
- export default MfeCartStorage;
16
- export declare function createMfeCartStorage<T>(key?: string): MfeCartStorage<T>;
@@ -1,45 +0,0 @@
1
- import React from 'react';
2
- import { IMfeCartStoreConfigs } from './cart';
3
- /**
4
- * Props for the SSR-compatible cart provider
5
- */
6
- interface ISsrCartProviderProps<T = any> {
7
- /** Content to render */
8
- children: React.ReactNode;
9
- /** Initial cart items for SSR */
10
- initialCartItems?: T[];
11
- /** Should hydrate cart from browser storage after rendering */
12
- hydrateFromStorage?: boolean;
13
- /** Cart store configuration */
14
- cartConfig: IMfeCartStoreConfigs<T>;
15
- }
16
- /**
17
- * Factory function to create SSR Cart Provider with specific type and config
18
- */
19
- export declare function createSsrCartProvider<T = any>(cartConfig: IMfeCartStoreConfigs<T>): ({ children, initialCartItems, hydrateFromStorage }: Omit<ISsrCartProviderProps<T>, 'cartConfig'>) => import("react/jsx-runtime").JSX.Element;
20
- /**
21
- * Generic SSR Cart Provider (requires cartConfig prop)
22
- */
23
- export declare function SsrCartProvider<T = any>({ children, initialCartItems, cartConfig }: ISsrCartProviderProps<T>): import("react/jsx-runtime").JSX.Element;
24
- /**
25
- * CartItemsComponent - SSR-aware cart items display component
26
- */
27
- interface ICartItemsComponentProps<T = any> {
28
- /** Function to render each cart item */
29
- renderItem: (item: T) => React.ReactNode;
30
- /** Optional empty cart placeholder */
31
- emptyCart?: React.ReactNode;
32
- /** Initial cart items for SSR */
33
- initialCartItems?: T[];
34
- /** Cart store configuration */
35
- cartConfig: IMfeCartStoreConfigs<T>;
36
- }
37
- /**
38
- * Factory function to create CartItemsComponent with specific type and config
39
- */
40
- export declare function createCartItemsComponent<T = any>(cartConfig: IMfeCartStoreConfigs<T>): ({ renderItem, emptyCart, initialCartItems }: Omit<ICartItemsComponentProps<T>, 'cartConfig'>) => import("react/jsx-runtime").JSX.Element;
41
- /**
42
- * Generic CartItemsComponent (requires cartConfig prop)
43
- */
44
- export declare function CartItemsComponent<T = any>({ renderItem, emptyCart, initialCartItems, cartConfig }: ICartItemsComponentProps<T>): import("react/jsx-runtime").JSX.Element;
45
- export {};
@@ -1,17 +0,0 @@
1
- /** Communication channels for cart operations */
2
- export declare const CART_CHANNELS: {
3
- /** Add an item to the cart */
4
- readonly ADD: "mfe:cart:add";
5
- /** Remove an item from the cart */
6
- readonly REMOVE: "mfe:cart:remove";
7
- /** Clear all items from the cart */
8
- readonly CLEAR: "mfe:cart:clear";
9
- /** Request initial cart data (when a new MFE loads) */
10
- readonly INIT_REQUEST: "mfe:cart:init_request";
11
- /** Response with cart data (to initialize a new MFE) */
12
- readonly INIT_RESPONSE: "mfe:cart:init_response";
13
- /** Update the entire cart at once */
14
- readonly UPDATE: "mfe:cart:update";
15
- /** Notify all subscribers when cart state changes */
16
- readonly STATE_CHANGE: "mfe:cart:state_change";
17
- };